20 ポイント 投稿者 GN⁺ 2025-11-17 | 1件のコメント | WhatsAppで共有
  • Spec-Driven Development(SDD) は、コーディング前に膨大な文書を作成するウォーターフォール型アプローチを復活させた手法で、AIコーディング支援ツール向けの構造化を目的とする一方、俊敏性を損なうおそれがある
  • オープンソースコミュニティでは、初期プロンプトと指示に基づいて仕様書・実装計画・作業リストを自動生成するツールが開発されており、代表例としてSpec-Kit、Kiro、Tessl、BMad Methodがある
  • しかし実際に使うと、コンテキスト認識不足、過剰な文書化、二重コードレビュー、虚偽の安心感など、さまざまな限界が明らかになり、大規模コードベースでは効率が急激に低下する
  • この記事は、SDDが開発者を置き換えようとする試みとしてウォーターフォールモデルの失敗を繰り返していると指摘し、代わりに自然言語ベースの反復的な開発手法を提案する
  • AgileとLean Startupの原則を組み合わせたアプローチのほうが、コーディングエージェントを活用する現代の開発により適しており、視覚的インタラクションツールの発展が次の課題だ

スペック主導開発(SDD)の登場

  • Spec-Driven Development(SDD) は、AIコーディング支援ツール向けに構造的な開発方式を提供するため、コーディング前に仕様文書を作成する手順を導入する
    • 初期プロンプトと指示をもとに、LLMが製品仕様書、実装計画、作業リストを生成する
    • 各文書は前段階に依存しており、ユーザーが修正して仕様を洗練させる
  • 完成した文書はClaude Code、Cursor、Copilotなどのコーディングエージェントに渡され、コード作成に活用される
  • 代表的なツールとして**GitHubのSpec-Kit、AWSのKiro、Tessl、BMad Method(BMM)**などがある
  • 関連する比較分析として、Birgitta BöckelerのUnderstanding Spec-Driven-Development: Kiro, spec-kit, and Tesslに言及している

Markdown文書化の問題

  • SDDの仕様は大半がMarkdownファイル形式で構成されており、例としてGitHub Spec-Kitで単純な機能を実装した場合でも8ファイル、1,300行に達する
  • Kiroを使ってAtomic CRMに「referred by」フィールドを追加した事例でも、多数の文書に分割されている
  • 実際の利用では、次のような欠点が表れる
    • コンテキスト認識不足(Context Blindness):既存の関数やコードの文脈を取りこぼし、依然として専門家のレビューが必要
    • 過剰な文書化(Markdown Madness):長大な文書のため、単純なエラー探索にも多くの時間を消費する
    • 体系的官僚主義(Systematic Bureaucracy):不要な反復と過度な詳細化によって非効率が生じる
    • 見せかけのアジャイル(Faux Agile):「User Story」の概念を誤用し、散漫さを招く
    • 二重コードレビュー(Double Code Review):仕様内のコードと実際の実装をそれぞれレビューしなければならない
    • 虚偽の安心感(False Sense of Security):エージェントが仕様に完全には従わない
    • 逓減する効用(Diminishing Returns):初期プロジェクトでは有用でも、規模が大きくなるほど速度が低下する
  • ほとんどのコーディングエージェントはすでにplan modetask list機能を備えているため、SDDの追加的な利点は限定的で、むしろ開発コストを増やす可能性がある

プロジェクトマネージャーの逆襲

  • SDDの限界はツールの未成熟さによるものかもしれないが、根本的には誤った問題設定に由来する
    • 「開発者をソフトウェア開発から排除する方法」という目標を前提にしている
    • 開発者をコーディングエージェントに置き換え、それを緻密な計画で統制しようとする構造だ
  • これはウォーターフォールモデルに似ており、膨大な文書化によって開発者を単なる翻訳者の役割にしてしまうやり方だ
  • しかしソフトウェア開発は非決定的(non-deterministic)な過程であり、計画だけで不確実性を取り除くことはできない(No Silver Bullet論文を引用)
  • SDDでは要件定義段階でビジネスアナリスト、設計段階で開発者の専門性がいずれも必要になるため、実際には両方の役割を担える少数の人しか使えない
  • 結果として、No Codeツールと同様に「開発者なしの開発」を約束しながら、結局は開発者を必要とする

新たな代替案:自然言語ベースの反復開発

  • Agile手法は、予測可能性ではなく適応性を選ぶことで、非決定的な開発問題に対処する
  • 複雑な要件を複数の単純な問題に分割することが、コーディングエージェント活用の核心だ
  • Lean Startupの原則を適用したシンプルな反復手順を提示する
    1. 製品における最もリスクの高い仮説を特定する
    2. それを検証するための最小限の実験を設計する
    3. 実験を開発し、結果に応じて反復する
  • 例として、Claude Codeを用いて約10時間で**3D彫刻ツール(sculpt-3D)**を開発した
    • 仕様書なしで短い指示文だけを使い、機能を段階的に追加した
    • 誤った実装は即座に修正し、高速な反復を行った
  • この方式ならウォーターフォール型の文書化がなくても素早く収束でき、Agileとコーディングエージェントの組み合わせによってリアルタイムのプロダクト構築が可能になる
  • ただしコーディングエージェントはテキスト中心のため視覚的インタラクションが不足しており、今後は視覚的インターフェースを強化するツールの開発が必要だ

結論

  • Agile手法はすでに仕様文書を不要なものにしており、SDDはそれを復活させようとする試みだと評価される
  • SDDは開発者を排除しようとする理論先行のアプローチであり、コーディングエージェントによる新しい開発者世代の能力強化の機会を逃している
  • コーディングエージェントを内燃機関になぞらえ、SDDがそれを機関車に縛りつける一方で、私たちは自動車・飛行機など多様な形へ拡張すべきだと述べる
  • 最後に、環境を考慮するならコーディングエージェントの節度ある利用が必要だ

1件のコメント

 
GN⁺ 2025-11-17
Hacker Newsの意見
  • 開発者として最も大きな生産性向上を得られた方法は、あらゆる作業を事前に計画する習慣を身につけたことだ
    チケットを受け取るたびに大きなTODOリストへ分解し、設計・依存関係・仕様をあらかじめ明確にする
    こうするとプログラミング時にフロー状態(flow) により頻繁に入れる
    AIコーディングエージェントにもこのアプローチが有効なのは、思考プロセスを前もって移しておけるからだ
    詳細は私の記事にまとめてある

    • ウォーターフォールは過剰に悪い評判を受けていると思う
      実際には問題を細分化して仕様を書くのは良いことだ
      ただし変更不能なスペックが問題を引き起こす。数か月後になってから実装を始めると、スペックが固定化してしまう
      一方でAgileは、戦略的な計画を先延ばしする言い訳として使われることが多い。その結果、手戻りが増える
    • 以前「concrete galoshes」という記事を書いたが、準備ばかりしすぎてプロジェクトを台無しにしてしまうこともある、という内容だ
      結局はバランスの問題であり、人生でも開発でも「It depends」が良いモットーだと思う
      LLMがスペックを管理すれば、保守負担が減る利点はありそうだ
      関連記事はこちらにある
    • 君の言っているやり方は、実質的にはAgileの説明のように思える
    • うちのチームはエピック単位で事前設計をする
      予測が難しい場合はまずスパイク(spike) を行ってコードやライブラリを調査する
      理想的な構成図と、現実的な制約を反映した構成図を両方作り、長期的にアーキテクチャ上の落とし穴を避けている
  • 数か月間vibe codingをしていたが、直近6か月はspec-driven developmentへ切り替えた
    1日2〜3時間かけて仕様を書き、その日のうちにテスト済み機能をデプロイしている
    仕様を書くからといって機敏さが落ちたわけではない。むしろ8時間単位の高速反復が可能になる
    仕様はプロンプトではなく、正確性の判定基準
    よく定義されたend-to-endテストがAIの誤りを大きく減らしてくれる

    • LLMベースのspec-driven開発は、非決定的コンパイラを導入するようなものだと思う
      実行のたびに結果が変わり、結局は人間がレビューしなければならないので非効率になりうる
    • 君が言っているのは、実際には従来のAgileのチケット単位スペックと同じだ
      1日単位の作業を「スペック」と呼ぶのは誤解を招く。結局は既存プロセスに新しい名前を付けているだけだ
    • LLMはまだ論理推論に弱い
      単純な論理式ですら誤って解釈することが多く、自然言語のスペックを理解させるのは危険だ
    • 私も似たような感じで、ベッドに横になりながらacceptance criteriaをずらっと書き出す
      それをエージェントに渡せば勝手に実装してくれて、私は途中でレビューするだけだ
      AIが働いている間、私は自分のレースカーをいじっているので完全にWin-Winだ
      結局大事なのは、コードがテストを通ることだけだ
  • この記事は、「spec-based developmentは自分には合わない」とすでに結論づけた人向けのように見える
    私はスペックをLLMのコンテキストへの入口として見ている
    プロジェクトの構造、モデル、関数、要件などを十分に与えれば、LLMは文脈を理解して拡張できる
    しかもLLM自身にスペックを更新させれば、Agileな反復も可能になる

    • ここにテスト駆動開発(TDD) を加えれば完璧だ
      テストがLLMの現実へのグラウンディング(grounding) として機能し、ハルシネーションを防ぐ
      テストはドキュメントであり品質基準にもなり、LLMはジュニア開発者のように管理すべきだ
      複数のエージェントを並列に動かしつつ、テストの階層で相互検証させれば驚くような結果が出る
    • ただ、これは結局高速なウォーターフォールに近いと思う
      LLMのおかげで安く速く全体スペックを反復できるだけで、本質は同じだ
    • 私は最初の入力を短くして、徐々に広げていくほうだ
      長すぎるスペックは、かえって探索的思考を妨げる
    • 問題の核心は方法論ではなく認知的過負荷(cognitive overload)
      LLMは決定論的システムではなく確率的システムなので、私たちは今やコードではなくスペックをデバッグしなければならない
      開発者はこれから認知システム設計者(cognitive systems architect) へ進化すべきだ
    • 「スペック」という言葉はあまりにも過積載(overloaded) されている
      上位レベルのスペックと詳細コンポーネントのスペックが共存している
  • 私はGitHubのSpec-KitでCLIツールを作ってみたが、あまりに多くの修正・分析・書き直しの工程が必要だった
    ウォーターフォールのように反復フィードバックが不足していて、もどかしかった
    結局、間違ったコードを見て原因を探るより、最初からやり直したほうがよかった
    LLMと一緒にコーディングするのは良いが、SDDは重くて非効率なワークフローに感じられた

    • 私も最初はそうしていたが、スペックはシステム全体の仕様ではなく具体的な作業説明であるべきだ
      LLMはコンテキストを好むので、繰り返し明確に指示する必要がある
      たとえばNextJSアプリを作るときは、ログイン、RBAC、テスト優先実装などを明確に記述する
    • 核心は小さいが拡張可能なスペックを作ることだ
      小さな単位から始めて徐々に機能を追加していく方式のほうが適している
    • 問題は、君がまだコード職人の精神を捨てられていないことだ。ただ流れに身を任せればいい
  • ウォーターフォールの問題は長いリードタイム高価な反復コストだった
    SDDではこの2つが解決されるので問題ないと思う

    • 実際のところ、ほとんどの人は学校でウォーターフォールを学んだだけで、実務で経験したわけではない
      数時間で書くスペックをウォーターフォールと呼ぶのは大げさだ
    • しかしウォーターフォールの本質的な問題はスペックそのもの
      複雑な解空間に早く入りすぎると、単純な問題解決が難しくなる
      Agileは小さな空間から出発し、徐々に拡張していく
    • スペックこそが問題の本質だ。遅延は副次的なものにすぎない
      スペックが十分に詳細なら反復は遅くなり、不十分ならLLMがうまく機能しない
      結局、管理者が好むウォーターフォールの矛盾をそのまま抱えている
    • だからAgileは「動くコード > 包括的なドキュメント」を強調する
      LLMは小さな単位で明確に指示したときに最もうまく機能する
    • しかし大企業は依然として官僚的ウォーターフォールを選びがちだろう
      数年分のスペックを書き、6か月ごとにLLMを回し、失敗すれば開発者のせいにするはずだ
  • 記事の筆者本人です
    いまだにウォーターフォール vs アジャイル論争が活発なのは興味深い
    SDDに価値を感じる人たちの背景を読むのも面白い
    ただ、私はすでに実装前にPlanモードを使っているので、SDDが追加の価値をもたらすわけではない
    コーディングエージェントが一発で完璧に実装したこともほとんどない
    結局は反復が必要なので、Big Design Up Frontの意味は薄れる
    それでもコーディングエージェントが新しい開発パラダイムを開きつつあるとは信じている

  • 以前見た動画を思い出した
    エンジニアとプログラマーが互いに学べることを語っていて、事前計画の重要性が印象的だった

  • アジャイルが仕様書を殺したと言われるが、実際には数千件のJiraチケットに分解しただけだ

    • むしろそれこそが核心なのかもしれない
      AIがこうした散在する意思決定と文脈をすべて記録し、過去の選択と矛盾するときに質問できる
      「Jimが5年前にこのコードをこう書いた理由は、今でも有効なのか?」のようなフィードバックを返せるはずだ
    • その通り。そしてその知識の80%はJimの頭の中にしかなかった。彼が去ったあと、誰にも分からなくなった
  • この記事は少し変に感じた
    不完全なスペックを受け取って試行錯誤で解決するのは、人間の開発者でもAIでも同じだ
    明確に分かっているなら、詳細に指示するのが当然だ
    たぶんこの記事の要点は「悪いスペック」の話なのかもしれない
    全体としてはAgile業界の自己防衛ロジックのように見える

    • ときどきHNのコメントの一部が、AI擁護ナラティブを自動で広めているように感じることがある
  • 私はいくつかのMarkdownのスペックファイルでSDDを試したが、本当に効率的だったのはbeadsだった
    エージェントが作業ツリーに沿って進み、集中できるようにしてくれる
    各作業をTDDで分割し、テストに通るまでは次の段階へ進めない
    エージェントがレビュー用コマンドまで教えてくれるので、コードレビューがしやすくなる
    Spec-Kitは重すぎて、beadsのほうがずっと実用的だ
    完全にvibeベースで作ったzmxプロジェクトも、後でエージェントのコードを参考に全面的に書き直した

    • なぜわざわざbeadsでバージョン管理システム(VCS) を新しく作ったのか分からない。GitHubで十分ではないか
    • 面白いね。エージェントにどういう形で指示文を与えているのか、具体例を見てみたい