LESSON 30分

ストーリー

あなた
RFCを書いたんですが、レビュアーから”設計の詳細が分からない”と言われてしまいました
高橋アーキテクト
RFCは”何を・なぜ”を伝えるもの。設計ドキュメントは”どうやって”を伝えるものだ。両方が揃って初めて、チームが自信を持って実装に進める
あなた
設計ドキュメントって、どこまで詳しく書けばいいんですか?
高橋アーキテクト
コードに書けることはコードに任せる。設計ドキュメントは、コードを読むだけでは分からない”意図”と”全体像”を伝えるために書くんだ

設計ドキュメントの構造

interface DesignDocument {
  // 1. 概要
  overview: {
    purpose: string;      // このドキュメントの目的
    scope: string;        // 対象範囲
    audience: string[];   // 想定読者
    relatedDocs: string[]; // 関連ドキュメント(RFC、ADR等)
  };

  // 2. システム設計
  systemDesign: {
    architecture: string;     // アーキテクチャ概要
    components: Component[];  // コンポーネント一覧
    dataFlow: string;         // データの流れ
    apiDesign: APISpec[];     // API仕様
  };

  // 3. データ設計
  dataDesign: {
    dataModel: string;        // データモデル
    storageStrategy: string;  // 保存戦略
    migration: string;        // マイグレーション計画
  };

  // 4. 運用設計
  operationalDesign: {
    monitoring: string;       // 監視計画
    logging: string;          // ログ戦略
    alerting: string;         // アラート設定
    rollback: string;         // ロールバック手順
  };

  // 5. テスト計画
  testPlan: {
    strategy: string;
    coverage: string;
    environments: string[];
  };
}

interface Component {
  name: string;
  responsibility: string;
  technology: string;
  interfaces: string[];
}

interface APISpec {
  method: string;
  path: string;
  description: string;
  requestBody?: string;
  responseBody: string;
}

設計ドキュメントの実例

# 設計ドキュメント: 商品検索サービス

## 1. 概要

### 目的
商品検索機能をElasticsearchベースのマイクロサービスとして実装する。

### 対象範囲
- 商品の全文検索API
- ファセット検索(カテゴリ、価格帯)
- インデックス同期の仕組み
- 対象外: 管理画面UI、レコメンデーション

### 想定読者
- バックエンド開発チーム
- SREチーム
- フロントエンド開発チーム(API仕様の部分)

## 2. アーキテクチャ

### コンポーネント構成
┌──────────┐    ┌──────────────┐    ┌───────────────┐
│ Frontend │───→│ Search API   │───→│ Elasticsearch │
│          │    │ (NestJS)     │    │               │
└──────────┘    └──────────────┘    └───────────────┘

                ┌──────────────┐    ┌──────┴────────┐
                │  Admin API   │───→│  PostgreSQL   │
                │  (Rails)     │    │  (Source)     │
                └──────────────┘    └──────┬────────┘

                                    ┌──────┴────────┐
                                    │  CDC Worker   │
                                    │  (同期処理)    │
                                    └───────────────┘
### コンポーネント詳細

| コンポーネント | 責務 | 技術 |
|--------------|------|------|
| Search API | 検索クエリの処理、結果の整形 | NestJS + TypeScript |
| Elasticsearch | 全文検索インデックス | Elasticsearch 8.x |
| CDC Worker | PostgreSQL → ES のデータ同期 | Node.js + Debezium |
| PostgreSQL | 商品データのSource of Truth | PostgreSQL 16 |

## 3. API設計

### GET /api/v1/products/search
商品を検索する。

**リクエスト:**
| パラメータ | 型 | 必須 | 説明 |
|-----------|-----|------|------|
| q | string | No | 検索キーワード |
| category | string | No | カテゴリID |
| priceMin | number | No | 最低価格 |
| priceMax | number | No | 最高価格 |
| page | number | No | ページ番号(デフォルト: 1) |
| limit | number | No | 件数(デフォルト: 20, 最大: 100) |

**レスポンス:**
interface SearchResponse {
  data: Product[];
  pagination: {
    page: number;
    limit: number;
    total: number;
    totalPages: number;
  };
  facets: {
    categories: Array<{ id: string; name: string; count: number }>;
    priceRanges: Array<{ min: number; max: number; count: number }>;
  };
  meta: {
    took: number; // 検索にかかった時間(ms)
  };
}

図の描き方

設計ドキュメントでは、テキストだけでなく図も重要です。

## 推奨ツール

| ツール | 用途 | 特徴 |
|--------|------|------|
| Mermaid | シーケンス図、フロー図 | Markdown内に記述可能 |
| PlantUML | クラス図、コンポーネント図 | テキストベース |
| draw.io | 自由なダイアグラム | GUI操作 |
| Excalidraw | ラフスケッチ | 手書き風 |

## Mermaid の例(シーケンス図)
sequenceDiagram
    participant C as Client
    participant A as Search API
    participant E as Elasticsearch
    participant P as PostgreSQL

    C->>A: GET /products/search?q=laptop
    A->>E: Search query
    E-->>A: Search results
    A-->>C: Formatted response

    Note over P,E: CDC による非同期同期
    P->>E: Index update (via CDC Worker)

良い設計ドキュメントの特徴

特徴説明
読者を意識誰が読むかを考え、詳細度を調整する
図と文の併用全体像は図で、詳細は文で伝える
決定の理由「何を」だけでなく「なぜ」を書く
未解決事項分からないことは正直に書く
更新可能実装中に変更があれば更新する
適切な粒度コードに書けることはコードに任せる

まとめ

ポイント内容
設計ドキュメントの目的コードでは分からない「意図」と「全体像」を伝える
構成要素概要、システム設計、データ設計、運用設計、テスト計画
図の活用Mermaid等でアーキテクチャやシーケンスを可視化
品質のポイント読者を意識し、適切な粒度で書く

チェックリスト

  • 設計ドキュメントの構成要素を理解した
  • API設計の記述方法を学んだ
  • 図の描き方とツールを把握した
  • 良い設計ドキュメントの特徴を理解した

次のステップへ

次は「レビュープロセスの構築」を学びます。書かれたドキュメントを効果的にレビューし、品質を高める仕組みを作りましょう。


推定読了時間: 30分