「人間向けの設計書」と「AI向けの設計書」は違う。

Claude Codeを使い込む中で、AIに効く設計書の書き方が見えてきた。

人間向け vs AI向け

人間向け設計書

  • 背景・目的を重視
  • 図やダイアグラムが多い
  • 「なぜ」の説明が厚い

AI向け設計書

  • 制約・禁止事項を明確に
  • コード例が多い
  • 「何をしてはいけないか」が厚い

最初の一言が重要

Claude Codeに渡す最初のプロンプトで、プロジェクトの性格が決まる。

悪い例:

ブログシステムを作って

良い例:

以下の制約でブログシステムを実装してください:

技術スタック:
- フロントエンド: React + TanStack Router + TanStack Query
- バックエンド: Go + Chi router
- DB: PostgreSQL

制約:
- Server Componentsは使わない
- CSSフレームワークはTailwind CSSのみ
- 状態管理ライブラリは追加しない(TanStack Queryで完結)

ディレクトリ構成:
src/
  components/  # 再利用可能なUIコンポーネント
  routes/      # ページコンポーネント
  lib/         # ユーティリティ、API クライアント

実装指示書のテンプレート

# 機能名: 記事一覧API

## 目的
記事の一覧を取得するAPIエンドポイントを実装する

## エンドポイント仕様
- Method: GET
- Path: /api/articles
- Query Parameters:
  - page: number (default: 1)
  - limit: number (default: 20, max: 100)

## レスポンス形式
{
  "articles": [...],
  "total": 100,
  "page": 1,
  "limit": 20
}

## 禁止事項
- ORMは使わない(sqlcで生成したコードを使う)
- 認証チェックはこのフェーズでは不要
- キャッシュ実装は次フェーズ

## 参考実装
既存の /api/users エンドポイント(src/handlers/users.go)を参考にすること

フェーズ分けのコツ

AIは「全部一気に」が苦手。フェーズを明確に分ける。

## Phase 1: データモデル
- articlesテーブルのマイグレーション
- sqlcでのクエリ定義

## Phase 2: APIエンドポイント
- ハンドラー実装
- バリデーション

## Phase 3: フロントエンド
- 一覧ページUI
- TanStack Query連携

各フェーズ完了時に確認を求めること。
次フェーズの先取り実装は禁止。

Reasonの明文化

「なぜそうするのか」を書いておくと、AIが一貫性のある判断をしやすい。

## 設計判断とその理由

### なぜORMを使わないか
- パフォーマンスの予測可能性を重視
- sqlcで型安全性は担保できる
- 複雑なクエリを書く予定がある

### なぜServer Componentsを避けるか
- チームにNext.js経験者が少ない
- デバッグの複雑さを避けたい
- 将来的にViteへの移行を検討している

禁止事項リストの効果

「やること」より「やらないこと」を書いた方が効く。

## やらないこと(重要)
- [ ] console.logでのデバッグ出力
- [ ] any型の使用
- [ ] 新規ライブラリの追加(事前相談なしに)
- [ ] 既存のAPIレスポンス形式の変更
- [ ] テストなしのマージ

おわり

AI駆動開発の設計書は「AIへの契約書」。曖昧さを排除し、境界を明確にすることで、期待通りの出力が得られる。

人間向けの設計書より「つまらない」文書になるが、それが効く。