フォルダ構成、命名規則、不変条件の文書化を標準化して、AI生成コードを人間のチームが安全に引き継ぎ変更を出せるようにします。

AI プロトタイプが早く「動く」理由ははっきりしています:素早く動く状態まで持っていけるからです。問題は「動く」状態をチームが「保守できる」状態に変える必要が出たときに始まります。プロトタイプは近道を許容できます。なぜなら同じ人(あるいは同じチャットスレッド)が全てのコンテキストを持っているからです。チームはそうはいきません。
AI が生成したコードは、人間が書いたコードよりレビューしづらく感じることがあります。意図が見えにくいからです。人間のコードは通常、一定のパターン、繰り返しの選択、なぜそれがあるかを説明するコメントといった痕跡を残します。AI の出力は正しくても、スタイルを混ぜたり、ファイル間でパターンを変えたり、レビュー担当者が予期しない場所に仮定を隠したりします。
目標は予測可能性です:予測できる場所、予測できる名前、予測できる挙動。チームメイトが何かの所在、名前、挙動を推測できれば、レビューは探偵作業ではなく短いチェックになります。
プロトタイプがチームプロジェクトになるときによく起きる問題:
userId vs userid vs user_id)で検索性が落ち、バグを見落としやすくなる。\n- 設定や "マジック値" が重複する。\n- エラーハンドリングやバリデーションが各所でずれているため、画面やエンドポイントごとにエッジケースの挙動が違う。小さな不整合が保守時間を掛け増やします。新しい画面ごとにフォルダ位置、コンポーネント名、データ取得スタイルが少しずつ違うと、レビュー担当者は安定したメンタルモデルを作れません。毎回コードを学び直さなければならなくなります。
現実的な例:非技術系の創業者が vibe-coding ツールでシンプルな CRM を立ち上げたとします。デモはうまくいきますが、小さなチームが引き継ぐと認証状態を保持する方法が三通り、React コンポーネントの命名が二通り、ビジネスルールが UI コードとバックエンドのハンドラに散らばっているのが見つかります。何も“壊れて”はいないものの、どのパターンが正しいのか誰も分からないので、変更は常にリスキーに感じられます。
選択肢を減らすと引き継ぎは楽になります。コードベースが一貫して次に何をすべきかを静かに示してくれると、チームは速く動けます。
「レビュー可能」とは、新しい開発者がリポジトリを開いて、変更すべき正しい場所を見つけ、変更を加え、他の部分を壊していないことを確認できることを指します。これが基本であり、多くの AI プロトタイプが失敗する点でもあります。
AI 生成コードをレビュー可能にするには、「賢さ」よりも「人間が安全に触れるか」を重視してください。レビュー可能性は変更のリスクを下げることです。
プルリクをレビューする人は、短時間で以下の点に答えようとしています:
小さな差分は助けになりますが、“小さい”は行数だけではありません。安定した境界も含みます:ある領域の変更が無関係なファイルに波及しないことが重要です。
完璧さは不要です。規約、少しのドキュメント、いくつかのテスト、将来の乖離を防ぐガードレールがあれば十分です。
レビュー担当者が素早く安心できる要素:
例:React フロントエンドと Go API を作ったとします。プロトタイプは動きますが、「顧客作成」フローが UI、API ハンドラ、DB 呼び出しに分散して微妙に違うフィールド名を使っています。レビュー可能にするには、名前を揃え、API の境界を明確にし、ルール(例:「email は一意」や「status は active か paused だけ」)を書き出します。
すべてを教科書通りに書き直す必要はありません。引き継ぎ準備のコードは、見やすく、一貫していて、安全に変更できれば十分です。
チームは不完全なコードなら許容します。困るのは、何がどこにあるか分からないことです。AI 生成コードをレビュー可能にしたければ、プロジェクトをスキャンしやすくしてください:トップレベルフォルダを少なく、命名を一貫させ、設定の「定位置」を一つ作ります。
トップレベルマップはアプリの成長に合わせて安定させてください。多くの引き継ぎが失敗するのは、実験ごとに新しいフォルダが増えるからです。代わりに三つの関心事を分けます:アプリ構成(画面、ルート)、コアのビジネスルール、インフラ。
以下は適応可能な実用的パターン(Web アプリ例)です:
/
/app # routes/pages and UI composition
/core # domain logic: entities, rules, use-cases
/ui # reusable components, styles, design tokens
/infra # db, api clients, queues, auth adapters
/config # env schema, feature flags, app settings
/scripts # local tooling, seed data, one-off tasks
/docs # handoff notes, invariants, decisions
最初のバージョンが素早く生成された場合でも、その分離は見えるようにしておきます。再生成するかもしれないモジュールは /generated のような場所に置き、人が編集するモジュールは /core や /app に置いてください。目的は、後で再生成する可能性のあるコードを誤って編集してしまうのを避けることです。
引き継ぎ前に、チームメイト(または将来の自分)と簡単なナビゲーションテストを行ってください。ログイン UI、認可ルール、DB アクセス定義、API ベース URL と機能フラグの設定場所、特殊スクリプトの位置を尋ねます。
どれかの答えが「場合による」や「検索して」と始まるなら、各トピックに単一の、退屈だが明確な置き場があるまで構成を調整してください。その退屈さこそが保守を速く安全にする要素です。
命名規約は約束です:レビュー担当者がファイルを開く前に、それが何か、どこにあるか、どう使われるかを想像できるはずです。
ファイル名から始めて、リポジトリ全体で一つのスタイルに固執してください。シンプルなデフォルトは、フォルダはケバブケース、React コンポーネントは PascalCase、コンポーネントでない TypeScript ファイルは camelCase です。エコシステムが期待する場合(Flutter の慣例や README のような標準ファイル)だけルールを破ってください。
名前は実装ではなく意図を示すべきです:
BillingSummaryCard.tsx(何を表すか)\n- リスク: StripeCard.tsx(ベンダー選択を埋め込んでいる)\n- リスク: RenderBilling.tsx(どのようにではなく、なぜを示していない)あいまいなバケツには厳格に対応してください。utils、helpers、common といった名前は、特にコードが一気に生成されるとすぐにジャンクドロワーになります。共有コードが必要なら、スコープと目的で命名します。例:auth/tokenStorage.ts や billing/billingCalculations.ts。
機能フォルダはユーザーの問題空間を示し、技術フォルダは横断的なインフラを示します。混ぜると境界が隠れます。
実用的な分割は、billing、onboarding、inventory のような機能と、api、db、routing、design-system のような技術領域を分けることです。複数のクライアント(web、server、mobile)がある場合、層ごとに同じ機能名を保つと変更の追跡が容易になります。
コードレビューで以下を確認する短いルールを使ってください:
早めにリネームしてください。引き継ぎ中のリネームは安く、チームが上に構築してからのリネームは高くつきます。
不変条件とは、機能が変わってもアプリの正しさのために常に守られるべきルールです。AI 生成コードはしばしば「動く」のは、生成時に想定されたルールがあるからですが、それらのルールはプロンプトや誰かの頭の中にだけ存在していることがあります。書き出しておけば、レビュー担当者は何が静かに変わってはいけないかを知ることができます。
良い不変条件は退屈で具体的、テスト可能です。「入力を検証する」といった曖昧な文は避け、何が許されるか、誰が何をできるか、ルールが破られたら何が起こるかを正確に書きます。
引き継ぎの痛みは大抵同じ領域から来ます:
文をユニットテストや API テストに変換できれば、それは適切なレベルです。
人々がレビュー時に自然と見る場所に不変条件を置いてください:
長いドキュメントに隠すのは避けてください。通常の PR レビューで目に入らなければ、忘れられます。
各不変条件はスコープ、ルール、強制箇所の順で記述してください。例:「/api/projects/:id 以下のすべてのエンドポイントについて、リクエスターはプロジェクトのメンバーであること。認可ミドルウェアで強制し、タスク更新時に再チェックする」
不変条件を変更する際は、それを明示してください。ドキュメント行を更新し、変更したコード箇所を指し示し、旧ルール下で失敗するテストを追加または更新します。さもないと、チームは古い挙動と新しい挙動が混在した状態を保ってしまいます。
もし Koder.ai のような vibe-coding プラットフォームを使っているなら、生成時に想定した不変条件の一覧を出すよう頼むのは有用です。それを少数のテスト可能なルールにしてチームでレビュー・維持してください。
引き継ぎは「自分のマシンで動く」とは違います。目標は、プロジェクトが読みやすく、変更しやすく、新しい人が開いたときに予測通りに動くことです。
まずスコープを凍結します。安定させるべき日時とコア機能の短いリストを決めます。同時に明示的にスコープ外の事項を書いて、クリーンアップ中に機能追加が続かないようにします。
その後、新しいものを追加する前にクリーンアップを行います。ここでレビュー可能性が見えてきます:コードベースがデモではなくプロダクトのように振る舞い始めます。
実用的な手順:
スモークテストは小さくても本物にしてください。React アプリ + Go API + Postgres の場合なら、サインイン、レコード作成、リフレッシュして永続化を確認、制限アクションが失敗することを確認する、といった内容です。
可読性に集中したレビューを一回だけ実施してください。チームメイトに 30 分だけ使ってもらい、「場所を見つけられるか」「名前は挙動に合っているか」「不変条件は明白か?」を答えてもらい、作業を遅らせる要因を直したら終わりにします。
引き継ぎ前に「新しい目」テストを行ってください。プロトタイプを作っていない人にリポジトリを開いてもらい、何をしているかを声に出してもらいます。開始点がすぐに見つからなければ、そのコストは今後の全ての変更で支払うことになります。
簡単なルール:新しい開発者は主要なエントリーポイントを 2 分以内に見つけられるべきです。通常は README に web アプリのエントリ、API のエントリ、設定の場所が名前付きで書かれていて、それらのファイルが埋もれていないことを意味します。
またレビューサイズをチェックしてください。主要モジュールが無限にスクロールさせるような長さだと、レビュー担当者は問題を見逃しがちです。長いファイルは分割して、それぞれが一つの仕事に集中するようにしてください。
短い引き継ぎチェックリスト:
validateUser は検証し、DB 書き込みはしない。\n- 不変条件はコード近くにある:ルールを明記した短いコメントやドキュメントブロック。\n- 変更は簡単に検証できる:コアフローが速くチェックできること。Maya は非技術系の創業者で、チャットで製品を説明して MVP を作りました:簡単な CRM(ログイン、顧客、案件、ノート、管理画面)。数週間後、彼女は二人の開発者を雇って「自分のラップトップで動く」からビジネスで信頼できるものにする道を進めます。
初日はリライトから始めません。まずコードをレビュー可能にします。最初の一手はアプリをコアモジュール(全機能が依存するもの)と機能(ユーザーが触る画面やワークフロー)に分けることでした。これで決定を置く場所と変更を置く場所が明確になります。
彼らは簡単な機能マップに合意しました:コア(認証、DB アクセス、権限、ロギング、UI コンポーネント)と機能(customers、deals、notes、admin)。
その後、フォルダをその地図に合わせて調整しました。以前はファイルが散在し、命名も CustomerPage.tsx、customer_view.tsx、custPageNew.tsx と混在していました。変更後は各機能が一つのホームを持ち、コアコードは明確に分離されています。レビューは速くなり、PR が一つの機能フォルダ内に収まることが増え、コア変更は目立つようになりました。
小さな命名ルールが大きく効き目を持ちました:「フォルダは名詞、コンポーネントは PascalCase、関数は動詞、省略しない」。その結果 custPageNew.tsx は CustomerDetailsPage.tsx に、doStuff() は saveCustomerNote() に置き換わりました。
彼らは主要なルールを一つ書いて、機能フォルダ内の短い INVARIANTS.md に置きました。
CRM の例:
Only the deal owner or an admin can edit a deal. Everyone else can view it, but can’t change status, value, or notes.
その一文がバックエンドチェック、DB クエリ、フロントエンドの UI 状態を導きます。後から「一括編集」を追加する人が出ても、レビュワーは何を壊してはいけないかを正確に知っています。
一週間後、コードは完璧ではありませんが、引き継ぎは実用的になっています:
AI は短時間で動くプロトタイプを作れますが、その「動く」は隠れた仮定に依存していることがよくあります。後でチームが触ると、小さな変更が予想外の場所で壊れます。
よくあるミスの一つは「一度に全部リファクタする」ことです。大規模なクリーンアップは爽快ですが、何が変わったのかを追いづらくします。まず境界を決めてください:どのモジュールが安定で、新しいコードはどこに入れてよいか、どの挙動は変えてはいけないかを決め、それから一箇所ずつ改善します。
別の問題は異なる名前での重複概念です。AI は同じ仕事に UserService と AccountManager を両方作ったり、plan と pricingTier を使い分けたりします。各コア概念に一つの用語を選び、UI、API、DB 全体で一貫してリネームしてください。
隠れたルールがチャット履歴にしかないことも脆弱性の大きな原因です。本当のビジネスロジックがプロンプトやチャットにあると、リポジトリは保守困難になります。ルールをコードベースに明確なコメント、テスト、あるいは短い不変条件のドキュメントとして置いてください。
shared、common、utils のような総括的フォルダはジャンクドロワーになりがちです。共有モジュールが必要なら、所有する責任(入力、出力、責務)を定義して狭く保ちます。
ビジネスルールを UI に埋め込むのも罠です。React コンポーネントの簡単な条件分岐がそのルールの唯一の実装になると、後でモバイルやバックエンドが異なる挙動を取ります。ビジネスルールは一つの層(通常はバックエンドかドメインモジュール)に置き、UI はそれを呼び出す形にしてください。
最後に、脆いコードはレビューの慣習を飛ばすことからも生まれます。チームは小さな差分、明確なコミット、意図の説明を必要とします。生成された変更でも通常の PR と同じ扱いにし、スコープを絞り、何が変わったかを説明し、検証を簡単にしてください。
引き継ぎは終点ではなく、保守の始まりとして扱ってください。目標は簡潔です:新しい人が小さな変更をしても隠れたルールを壊さないこと。
チームの好みをいくつかの書かれたデフォルトにまとめます:みんなが従うフォルダマップ一つ、命名スタイル一つ、不変条件テンプレート一つ。これらが事前に合意されていれば、レビューコメントは個人の好みではなく一貫したチェックになります。
「handoff README」を維持して、重要な場所を示してください:不変条件の所在、アプリの起動方法、機能を安全に追加する方法、議論なしに変更してはいけないこと。新しいチームメイトが 5 分以内に答えを見つけられるようにします。
ワークフローに可逆性があるなら、それを活用してください。たとえば Koder.ai はスナップショットとロールバックをサポートしており、リファクタや依存関係アップグレード前の安全網として役立ちます。所有権を移す準備ができたら、koder.ai からソースコードをエクスポートして、通常の Git ベースの作業の出発点をチームに渡すのが簡単です。
まずコードを予測可能にします。フォルダ構成、命名、境界をそろえておけば、チームメンバーは検索せずにどこに何があるか予想できます。
認証状態、データ取得、バリデーション、エラーハンドリングといった繰り返し出てくる作業ごとに一つのパターンを選び、全体に適用します。重要なのは「最良」ではなく「一貫性」です—レビュー担当者が毎回学び直さなくて済むようにします。
レビュー可能なコードベースとは、新しい開発者が正しい場所を見つけて小さな修正を行い、安全に検証できることを意味します。変更が関連のないファイルに広がったり、ルールについて推測が必要なら、それはまだレビュー可能ではありません。
小さく安定したトップレベルのフォルダセットを使い、それぞれの関心事を明確に一箇所に置きます。アプリ構成(ルート/画面)、コアビジネスルール、インフラを分けると、ナビゲーションが数秒で済むようになります。
/generated のような明示的なフォルダに再生成する可能性のあるコードを置き、人が編集するコードは /core や /app のような安定領域に置きます。これで誤って上書きしてしまうことを防ぎ、所有権を明確にできます。
一つの命名規則を選んでリポジトリ全体に適用することが最重要です。フォルダとファイルのケバブケース、コンポーネントは PascalCase、フィールド名は UI/API/DB 全体で一致させるなど、検索と整合性が保てるルールを守ってください。
不変条件とは、製品が変わっても常に成立していなければならないルールです。権限、ユニーク制約、状態遷移などが該当します。書き出すことで隠れた仮定をレビュー可能なチェックに変えられます。
README の短い「システムルール」セクションと、ルールを強制しているコードのすぐ近くに簡潔な注記を入れてください。通常の PR レビューで目に入る場所に置くことが重要です。
まずスコープを固めます。動作させておくべきコアなユーザージャーニーを少数決め、それ以外はスコープ外とします。次にフォルダと命名を正し、デッドコードを削除し、最小限のスモークテストチェックリストを作成して可読性中心のレビューを一回行います。
一度に全体を大改造するのは避けてください。catch-all なフォルダ(utils など)や UI に埋め込まれたビジネスルール、異なる名前で重複する概念(UserService と AccountManager のような)に注意します。レビュー慣行を飛ばすことも脆弱性を招きます。