71
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIに「いい感じに作って」と言うのをやめたら、開発が回り出した — Spec-Driven Development 実践ガイド

71
Posted at

はじめに — AIに雑に頼むと「速く間違う」だけ

AIに「いい感じに作って」と言って、本当に「いい感じ」のものが返ってきたこと、ありますか...?

ちょっと考えてみましょう。こんなプロンプトを書いたことはないでしょうか。

ユーザー登録機能を作って

で、返ってくるコードは、たしかに「動く」。

でも、メールアドレスのバリデーションがない。パスワードの強度チェックもない。重複登録の処理もない。エラーメッセージが英語。確認画面もない。

動くけど、期待とは違う。

なんでこうなるかというと、理由はシンプルです。 人間の頭の中にある「こうあるべき」が、AIに伝わっていない だけなんです。

これ、AIが悪いんじゃないんですよね。情報が足りないんです。

料理に例えるとわかりやすい。「美味しいもの作って」と言われたシェフは困る。和食なのか洋食なのか、何人分なのか、アレルギーはあるのか、予算はいくらなのか。 レシピ(=仕様書)なしに、期待通りの料理は出てこない。 当たり前ですよね。

ところが開発の現場では、この「当たり前」を飛ばして、いきなりAIにコードを書かせている人がめちゃくちゃ多い。

2026年3月現在、AIコーディングツールはものすごく進化しています。Claude Code、Cursor、Gemini CLI...どれも本当にすごい。でも、 「速く正しいものを作る」のと「速く間違ったものを作る」のは、紙一重 なんです。

その差を分けるのが、今回紹介する Spec-Driven Development(SDD) という考え方です。


Spec-Driven Development(SDD)とは何か

SDD(Spec-Driven Development)を一言で言うと、こうです。

「コードを書く前に、仕様書を書く。その仕様書を Single Source of Truth(唯一の正解=全てのベースになる1枚の設計図)として、コード・テスト・ドキュメントを全て生成する」

...と書くと難しそうに聞こえるかもしれないですが、やっていることはシンプルです。

さっきの料理の例を続けるなら、 レシピを先に書いて、そのレシピ通りにAIシェフに作ってもらう というだけの話。レシピがあれば、何度作っても同じ味になる。レシピがなければ、毎回「なんか違う」が起きる。

「AIへの設計図を先に作ってから、AIに作らせる」 ただそれだけ。

なぜ今SDDなのか

2026年のAI開発ツールには、ある矛盾があります。

  • AIのコード生成速度は爆速になった(数秒で数百行のコードが出てくる)
  • でも「何を作るか」の定義は、まだ人間がやるしかない

つまり、 AIがどれだけ速くなっても、指示が曖昧なら「速く間違う」だけ なんです。

SDDは、この問題を「仕様書」という中間成果物で解決します。

従来: 人間の頭の中 → (曖昧なプロンプト) → AIが実装 → 「なんか違う...」
SDD:  人間の頭の中 → 仕様書 → AIが実装 → 仕様書通りのものが出てくる

仕様書が間に入ることで、 人間の意図が構造化されて、AIが正確に理解できる形になる わけです。

「仕様書」と聞いてビビらなくていい

ここで「仕様書」と聞いて「うわ、めんどくさそう」と思った方。

大丈夫です。ここで言う仕様書は、 SIerが書くような100ページの設計書じゃない です。Markdownで書く、1〜2ページの「AIへの設計図」です。

しかも、この仕様書自体もAIに書かせることができる。自分で全部書く必要はないんです。


AI時代の仕様書テンプレート — 5つの必須要素

じゃあ、その「設計図」には何を書けばいいのか。

僕が実務で使っているテンプレートを共有します。仕様書に必要な要素は、 たった5つ です。

# 機能仕様書: {機能名}

## 1. 目的と背景(Why)
- なぜこの機能が必要なのか
- どんな課題を解決するのか
- 誰のための機能なのか

## 2. 機能要件(What)
- この機能は何をするのか(箇条書きで具体的に)
- 正常系の動作フロー
- 画面やAPIのエンドポイント

## 3. 非機能要件(How well)
- パフォーマンス要件(レスポンスタイム等)
- セキュリティ要件
- エラーハンドリング方針

## 4. 入出力の具体例(Examples)
- 正常な入力と期待される出力
- 異常な入力と期待されるエラー
- エッジケース

## 5. 制約条件・禁止事項(Constraints)
- 使用する技術スタック
- やってはいけないこと
- 既存コードとの整合性ルール

なぜこの5つなのか

1つずつ説明しましょう。

① 目的と背景(Why) — これがないと、AIは「なぜ」がわからないまま実装します。「ユーザー登録機能」と言われても、BtoBなのかBtoCなのか、セキュリティ重視なのかUX重視なのかで、設計が全然変わる。 Whyを伝えることで、AIの判断の方向性が定まる んです。

② 機能要件(What) — 何をするのかの具体的な記述。ここが曖昧だと「動くけど違う」が起きます。 箇条書きで、1つずつ具体的に 書くのがコツです。

③ 非機能要件(How well) — 「動けばいい」だけじゃなく、どのくらいの品質で動くべきかを定義します。これを書かないと、パフォーマンスやセキュリティが後回しになる。

④ 入出力の具体例(Examples) — これが実は 一番重要 かもしれない。AIは具体例があると、精度が劇的に上がります。「正常な入力→期待する出力」のペアを3つ書くだけで、AIの理解度が全然違う。

⑤ 制約条件・禁止事項(Constraints) — 「TypeScriptで書いて」「外部APIは使わないで」「既存のUserモデルを使って」みたいな制約。これがないとAIが自由に設計しすぎて、既存コードと噛み合わなくなる。

実例: ユーザー登録機能の仕様書

さっきの「ユーザー登録機能を作って」を、このテンプレで書くとこうなります。

# 機能仕様書: ユーザー登録機能

## 1. 目的と背景(Why)
- BtoC向けWebアプリケーションの新規ユーザー登録機能
- ユーザーが自分でアカウントを作成し、サービスを利用開始できるようにする
- 不正アカウント作成を防ぎつつ、登録のハードルは低く保つ

## 2. 機能要件(What)
- メールアドレスとパスワードでの登録
- メールアドレスの重複チェック
- パスワード強度の検証(8文字以上、英数字記号混在)
- メール認証フロー(確認メール送信→リンククリックで有効化)
- 登録完了後、ダッシュボードへリダイレクト

## 3. 非機能要件(How well)
- レスポンスタイム: 登録API 500ms以内
- パスワードはbcryptでハッシュ化(ソルトラウンド10)
- レート制限: 同一IPから5回/分
- エラーメッセージは日本語で返す

## 4. 入出力の具体例(Examples)
### 正常系
- 入力: { email: "test@example.com", password: "Passw0rd!" }
- 出力: { status: 201, message: "確認メールを送信しました" }

### 異常系(重複)
- 入力: { email: "existing@example.com", password: "Passw0rd!" }
- 出力: { status: 409, error: "このメールアドレスは既に登録されています" }

### 異常系(パスワード弱)
- 入力: { email: "test@example.com", password: "1234" }
- 出力: { status: 400, error: "パスワードは8文字以上で英数字記号を含めてください" }

## 5. 制約条件・禁止事項(Constraints)
- TypeScript + Next.js App Router
- データベース: MongoDB(Mongoose)
- 外部認証サービス(Auth0等)は使わない
- 既存の /lib/db.ts の接続を使用する
- テストは Jest + supertest で書く

どうでしょうか。最初の「ユーザー登録機能を作って」と比べて、AIに渡す情報量が全く違いますよね。

これが「設計図」の力 です。


AIに仕様書を書かせる3つのプロンプトパターン

「テンプレはわかった。でも、これを毎回手で書くのはめんどくさい」

めっちゃわかります。

なので、 仕様書自体もAIに書かせましょう 。ここでは3つのパターンを紹介します。

パターンA: ゼロからアイデアベースで仕様書を生成

まだ何も決まっていない段階で、アイデアから仕様書を生成するパターンです。

あなたは経験豊富なシニアエンジニアです。
以下のアイデアから、実装可能な機能仕様書を作成してください。

## アイデア
「ブログ記事の下書きを保存して、予約投稿できる機能がほしい」

## 仕様書テンプレート(この形式で出力してください)
1. 目的と背景(Why)
2. 機能要件(What)— 箇条書きで具体的に
3. 非機能要件(How well)— パフォーマンス、セキュリティ、エラーハンドリング
4. 入出力の具体例(Examples)— 正常系2つ、異常系2つ以上
5. 制約条件(Constraints)— 技術スタック: Next.js + TypeScript + MongoDB

## 注意
- 機能要件は「何ができるか」を箇条書きで10個以上
- 入出力の具体例はJSON形式で
- エッジケースも必ず含める

パターンB: 曖昧な会話を構造化する

チャットやミーティングで出た曖昧な要望を、仕様書に変換するパターン。

以下は、プロダクトオーナーとの会話メモです。
この内容から、エンジニアが実装可能なレベルの機能仕様書を作成してください。

## 会話メモ
- 「ユーザーがお気に入りの記事をブックマークできるようにしたい」
- 「あ、あとブックマークしたやつを一覧で見れるようにして」
- 「タグとかで分類できるといいかも」
- 「他の人のブックマークは見えないようにしてね」

## 出力形式
(上記テンプレートと同じ)

## 追加指示
- 会話メモに書かれていないが、実装上必要になる要件も推測して含める
- 推測した要件には「※推測」と注記する
- 曖昧な点は「要確認」としてリストアップする

このパターンのポイントは、 「推測した要件には注記する」 と指示していること。これで、AIが勝手に決めた部分を人間が確認できる。

パターンC: 既存コードから仕様書を逆生成する

すでに動いているコードから仕様書を作るパターン。リファクタリングや引き継ぎに使えます。

以下のコードから、機能仕様書をリバースエンジニアリングしてください。

## コード
(ここに既存コードを貼る)

## 出力形式
(上記テンプレートと同じ)

## 追加指示
- コードの実際の振る舞いを正確に記述する
- バグの可能性がある箇所は「※要検証」と注記する
- テストが不足している箇所を「テスト追加推奨」として指摘する
- 暗黙的なビジネスルール(コメントにない判断ロジック)を明示する

この3つのパターンを使い分ければ、 仕様書を書くこと自体にそれほど時間はかからない です。

重要なのは、 AIが出力した仕様書を人間が必ず確認すること 。AIに仕様書を書かせて、ノーチェックでAIに実装させると、間違いが増幅される。ここは手を抜いちゃダメなポイントです。

誤解しないでほしいのは、SDDは「これで完璧に正しいものが作れる」という銀の弾丸じゃない、ということ。ただし、 「雑に頼んで手直しを繰り返す」よりは、圧倒的にマシ です。「完璧」じゃなくて「大幅に改善する」という温度感で捉えてもらえると。


仕様書 → 実装 → テストの自動化フロー

仕様書ができたら、ここからが本番です。

仕様書1枚から、 コード、テスト、APIドキュメント の3つを生成できます。しかも、それぞれ別のプロンプトで独立して生成できるので、並列で進められる。

Step 1: 仕様書 → コード生成

以下の機能仕様書に基づいて、実装コードを生成してください。

## 仕様書
(ここに仕様書をそのまま貼る)

## 実装ルール
- TypeScript の strict モードで書く
- 関数には JSDoc コメントをつける
- エラーハンドリングは仕様書の「非機能要件」に従う
- ファイル構成: controller / service / model / validator に分離
- 各ファイルの冒頭に「この仕様書のどの要件を実装しているか」をコメントで記述

最後の行がポイントです。 「仕様書のどの要件を実装しているか」をコメントで書かせる ことで、後からトレーサビリティ(追跡可能性=「この実装はどの仕様に基づいているか」を追跡できること)が確保できる。

Step 2: 仕様書 → テストケース生成

以下の機能仕様書に基づいて、テストコードを生成してください。

## 仕様書
(ここに仕様書をそのまま貼る)

## テストルール
- Jest + supertest を使用
- describe ブロックは仕様書の「機能要件」の各項目に対応させる
- 仕様書の「入出力の具体例」を全てテストケースに変換する
- 正常系、異常系に加えて、以下のエッジケースも追加:
  - 空文字列の入力
  - 極端に長い入力(1000文字以上)
  - SQLインジェクション / XSS パターン
  - 同時リクエスト(競合状態)

ここで注目してほしいのは、 仕様書の「入出力の具体例」がそのままテストケースになる こと。だから仕様書に具体例を厚く書いておくことが大事なんです。

Step 3: 仕様書 → APIドキュメント生成

以下の機能仕様書に基づいて、OpenAPI 3.0 形式の API 仕様を生成してください。

## 仕様書
(ここに仕様書をそのまま貼る)

## 出力ルール
- YAML形式で出力
- リクエスト/レスポンスの例(examples)を必ず含める
- エラーレスポンスも全パターン記述
- description には仕様書の「目的と背景」を反映

フロントエンドとバックエンドを別のチーム(あるいは別のAIセッション)で開発している場合、このAPIドキュメントが「共通言語」になります。

# 生成されるOpenAPI仕様の例
openapi: 3.0.0
info:
  title: User Registration API
  version: 1.0.0
  description: BtoC向けWebアプリケーションの新規ユーザー登録API
paths:
  /api/auth/register:
    post:
      summary: 新規ユーザー登録
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [email, password]
              properties:
                email:
                  type: string
                  format: email
                  example: "user@example.com"
                password:
                  type: string
                  minLength: 8
                  example: "Passw0rd!"
      responses:
        '201':
          description: 登録成功
          content:
            application/json:
              example:
                status: 201
                message: "確認メールを送信しました"
        '400':
          description: バリデーションエラー
          content:
            application/json:
              example:
                status: 400
                error: "パスワードは8文字以上で英数字記号を含めてください"
        '409':
          description: メールアドレス重複
          content:
            application/json:
              example:
                status: 409
                error: "このメールアドレスは既に登録されています"

仕様書1枚から、コード・テスト・APIドキュメントの3点セットが生成される。 これがSDDの破壊力です。


「速く間違う」を防ぐ3つのバリデーションポイント

ここで1つ、大事な話をさせてください。

SDDは強力ですが、 仕様書が間違っていたら、全部間違います 。コードもテストもドキュメントも、全部「間違った仕様」に基づいて生成される。

だから、「仕様書を書いたらすぐ実装」じゃなく、 3つのチェックポイント を入れる必要があるんです。

① 仕様書自体のレビュー(AIにレビューさせる)

仕様書を書いたら(AIに書かせたら)、 別のプロンプトでレビューさせる

あなたはシニアエンジニア兼プロダクトマネージャーです。
以下の機能仕様書をレビューしてください。

## 仕様書
(ここに仕様書を貼る)

## レビュー観点
1. 機能要件に漏れはないか(ユーザーが期待する動作が全てカバーされているか)
2. 非機能要件は十分か(セキュリティ、パフォーマンス、エラーハンドリング)
3. 入出力の具体例にエッジケースは含まれているか
4. 制約条件に矛盾はないか
5. 曖昧な記述はないか(「適切に」「必要に応じて」等の曖昧表現)
6. 実装不可能な要件はないか

## 出力形式
- 問題がある箇所: [重要度: 高/中/低] + 指摘内容 + 修正案
- 問題がない箇所: 「OK」

ポイントは、 「曖昧な記述はないか」をチェック観点に入れること 。「適切に処理する」「必要に応じて」みたいな曖昧表現は、人間は読み飛ばしてもAIは困る。仕様書の曖昧さを潰すのが、品質を上げる一番のレバレッジです。

② 仕様 ↔ 実装の整合性チェック

コードが生成されたら、仕様書と突き合わせる。

以下の「仕様書」と「実装コード」を比較して、整合性をチェックしてください。

## 仕様書
(貼る)

## 実装コード
(貼る)

## チェック観点
1. 仕様書の機能要件が全て実装されているか(漏れチェック)
2. 仕様書にない機能が勝手に追加されていないか(過剰実装チェック)
3. 入出力の具体例と、コードの実際の振る舞いが一致するか
4. 非機能要件(バリデーション、エラーハンドリング等)が実装されているか
5. 制約条件が守られているか

## 出力形式
| 仕様書の要件 | 実装状況 | 備考 |
|------------|---------|------|
(テーブル形式で全件チェック)

③ テストによる自動検証

最後に、生成されたテストを実行して、仕様通りに動くか検証する。

# テストを実行
npx jest --verbose --coverage

# カバレッジが不足している場合、AIに追加テストを依頼
以下のテストカバレッジレポートを見て、
仕様書の要件でテストされていない箇所を特定し、
追加テストケースを生成してください。

## カバレッジレポート
(ここにカバレッジ結果を貼る)

## 仕様書
(ここに仕様書を貼る)

この3段階のバリデーションを入れると、 「AIが速く間違う」問題はかなり抑えられる 。完璧とは言わないけど、ノーチェックで進めるのとは雲泥の差です。


人間とAIの役割分担 — 「What/Why」で勝負する開発スタイル

最後に、SDDの本質的なところを話させてください。

SDDをやっていくと、気づくことがあります。

エンジニアの仕事が「コードを書くこと」から「何を作るかを決めること」に変わる。

フェーズ 人間がやること AIがやること
要件定義 課題の発見、優先順位の判断 要件の構造化、仕様書の生成
設計 仕様書のレビュー、最終判断 設計案の提示、トレードオフの整理
実装 コードレビュー、アーキテクチャ判断 コード生成、リファクタリング
テスト テスト戦略の決定、結果の評価 テストケース生成、実行、レポート
ドキュメント 最終確認 APIドキュメント、READMEの生成

この表を見ると、 人間の仕事は全て「判断」と「評価」 であることがわかります。実装の手を動かす部分は、ほぼAIに任せられる。

これは「エンジニアの仕事がなくなる」という話じゃないです。むしろ逆で、 「何を作るか」「なぜ作るか」を深く考える時間が増える んです。

仕様書を書くことは、つまり 「自分が何を作りたいのかを、自分自身に問いかけること」 でもある。

なんとなく「こんな機能ほしい」を、5つの要素に分解して書き出す過程で、「あれ、本当にこの機能いるんだっけ」「この要件、矛盾してないか」みたいな気づきが生まれる。

仕様書は、AIへの指示書であると同時に、自分の思考を整理するツール でもあるんです。


まとめ

この記事で伝えたかったことを整理すると、こうなります。

  1. AIに雑に頼むと「速く間違う」 — 問題はAIじゃなく、渡す情報の不足
  2. SDDは「仕様書ファースト」の開発スタイル — コードの前に設計図を書く
  3. 仕様書は5要素(Why / What / How well / Examples / Constraints) で書ける
  4. 仕様書自体もAIに書かせられる — 3つのプロンプトパターンで
  5. 仕様書1枚からコード・テスト・ドキュメントが生成できる — これがSDDの破壊力
  6. 3つのバリデーションポイント で「速く間違う」を防ぐ
  7. エンジニアの仕事は「What/Why」の設計者 — Howは手放していい

「AIにいい感じに作って」と言うのをやめて、「仕様書を1枚書く」。

たったこれだけの習慣が、AIとの共同作業の質を劇的に変えてくれます。

まずは、次に作る機能を1つだけ選んで、仕様書から始めてみてください。

いきなり全部やろうとしなくていいです。テンプレートをコピーして、5つの要素を埋めるだけ。それだけで「AIへの伝わり方」が変わるのを実感できるはず。

最初は面倒に感じるかもしれないですが、仕様書を書く5分が、「期待と違うコードを手直しする30分」を消してくれる...そう考えると、なかなか悪くない投資だと思いませんか。

チーム開発での運用ヒント

個人開発だけでなく、チームでSDDを導入する場合のコツも1つだけ。

仕様書のレビューをコードレビューより先にやる。

コードレビューで「そもそもこの設計じゃなくない?」ってなった経験、ありませんか。仕様書の段階でレビューを入れると、実装前にズレを修正できるので、コードレビューが「設計の是非」じゃなく「実装の品質」に集中できるようになる。PRに仕様書を添付するだけで、レビュアーの理解スピードもグッと上がります。

71
63
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
63

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?