初回の設計指針を「なし/素の設計/規律つき設計」の3段階で比較(Opus 4.8 / Fable 5、計126世代)
  • 設計の質は段階的に効いた:最大ファイルは 無指示 2,400〜3,500行 → 分割方針のみ 570〜587行 → 規律つき設計 434〜498行
  • 「分けろ」だけでは過分割が起きる(Fableはフィルタを8ファイルに乱造)。上限・下限つきの規律で初めて適正に収束。
  • 規律は初回指示だけで13〜16改修まで持続し、破られた後も成長を抑える「アンカー」として働いた。
  • 傾向は Opus・Fable の両モデルで一貫。

実験

読書ログアプリを作り、20回の改修(期限・優先度・履歴・サマリー・詳細画面・タグ・目標・ダッシュボード・設定…)を1つずつ足す。これを3条件で行った。

  • B(無指示):機能列挙のみ
  • A1(素の設計):ドメイン分割・インターフェース設計・UI肥大防止方針を明示
  • A2(規律つき設計):A1に加えてモジュール規律を明示 —— 1ファイル100〜300行目安/些末なウィジェット単位でファイルを乱造しない(類似責務は集約)/CSSも分割/新機能はまず既存モジュールへ/YAGNI
設計指針を渡すのは初回プロンプトの1回だけ。改修1〜20は全条件で同一文面(「前回までの実装を維持したまま改修」+機能要件のみ)。状態はエージェントのメモリではなく workspace のファイルで持ち越す。各条件を Opus 4.8 / Fable 5 の両モデルで実行(メモリ非バインド・独立workspace)。

使ったプロンプト(実際に投入したテキスト):
▶ 初期プロンプト(B・A1・A2)+改修20回 をまとめてダウンロード(.txt)

結果1:設計の質が段階的に効く

保守性の主指標=最大コードモジュール行数(1回の改修で触る“1枚のファイル”の最大サイズ。小さいほど良い)。

00.5k1k1.5k2k2.5k2,389B 無指示587A1 素の設計498A2 規律つき

Opus 4.8:最大コードモジュール行数(最終)

01k2k3k3,463B 無指示570A1 素の設計434A2 規律つき

Fable 5:最大コードモジュール行数(最終)

「分けろ」とだけ言ったA1で約1/5になり、規律を書いたA2でさらに15〜24%下がった。

結果2:「分けろ」だけでは過分割が起きる

A1のFableは、フィルタUIを8個の細切れファイルに乱造し41ファイル・CSS1枚1,424行という別種の肥大を起こしていた。A2の「類似責務は1モジュールに集約」「CSSも分割」が効き、filterBar.js 1本(234行)・計32ファイル・CSS4分割に収束。ガードレールは肥大と過分割の両側に必要だった。

結果3:規律の減衰 —— それでもアンカーは効く

01k2k3k初期改修5改修10改修15改修20規律 300行23893463498434

最大コードモジュールの推移(第2実験)。破線=初回ブリーフで課した300行規律

初回に課した「100〜300行」規律は、13〜16改修目まで無指示のまま守られた。Opusは改修14(再読管理)で495行に破ったが、その後6改修は横ばい——それ以上太らせず、新規実装を新ファイルへ逃がした。Fableは改修17まで253行以下を維持し最終434。破られた後も成長は鈍い。

01020304050初期改修5改修10改修15改修2043321

ファイル数の推移:A2は改修を新ファイルで吸収、Bは1ファイルのまま

まとめ — ソフトウェアエンジニアリングの価値

  • 最初の1回のブリーフの質が、20改修先の保守性を決める。無指示→素の設計→規律つき設計で、最大モジュールは 3,500 → 587 → 434 行と段階的に下がった。
  • 設計指針には上限と下限の両方を書く。「分割しろ」だけでは過分割という別の肥大が起きる。
  • 初期設計は減衰する。規律は13〜16改修で破られた——完全に守らせるには、レビューやリンタのような継続的な仕組みも要る。上流設計と継続ガバナンスの両方がエンジニアリング。

凡例: Opus-A2/ Fable-A2/ Opus-B/ Fable-B(=A1)。各条件1試行の小サンプル。Bは2回実行し再現(Opus 2,976→2,389 / Fable 3,330→3,463)。見た目のUIは全系列で同等に収束し、差はコード構造に現れた。最大コードモジュールはHTML/JSの最大行数(CSS除く)。