LESSON 30分

ストーリー

あなた
評価マトリクスではReactが最高点だったんですが、CTOから”本当に大丈夫なのか”と聞かれて…
高橋アーキテクト
机上の評価だけでは不安が残る場合、PoCで検証するんだ
あなた
PoCって、試しに作ってみるってことですか?
高橋アーキテクト
ただ作るんじゃない。“何を検証するか”を明確にして、期限を決めて、成功基準を定義してから始める。PoCは実験であって、プロトタイプ開発じゃない。目的を見失うと、いつまでも終わらない泥沼にはまる

PoCとは何か

// PoCの定義
interface ProofOfConcept {
  // 検証したい仮説
  hypothesis: string;
  // 成功基準(Go/No-Goの判断基準)
  successCriteria: SuccessCriterion[];
  // スコープ(何を作り、何を作らないか)
  scope: { include: string[]; exclude: string[] };
  // タイムボックス(必ず期限を設ける)
  timebox: { duration: string; hardDeadline: string };
  // 必要なリソース
  resources: { people: string[]; infrastructure: string[] };
  // 成果物
  deliverables: string[];
}

interface SuccessCriterion {
  metric: string;
  threshold: string;
  measurementMethod: string;
}

// PoC計画の例
const pocPlan: ProofOfConcept = {
  hypothesis: "GraphQLに移行することで、API呼び出し回数を50%削減できる",
  successCriteria: [
    {
      metric: "ダッシュボード画面のAPI呼び出し回数",
      threshold: "現在の12回 → 6回以下",
      measurementMethod: "ブラウザのネットワークタブで計測",
    },
    {
      metric: "初期表示のレスポンス時間",
      threshold: "現在の2.5秒 → 1.5秒以下",
      measurementMethod: "Lighthouse で計測",
    },
    {
      metric: "実装の複雑さ",
      threshold: "チームの80%が1週間で基本的な操作を習得",
      measurementMethod: "チームアンケート",
    },
  ],
  scope: {
    include: [
      "ダッシュボード画面のGraphQL化",
      "既存REST APIとの共存",
      "基本的なQuery/Mutationの実装",
    ],
    exclude: [
      "認証・認可の実装",
      "全画面のGraphQL化",
      "本番環境へのデプロイ",
      "パフォーマンスチューニング",
    ],
  },
  timebox: {
    duration: "2週間",
    hardDeadline: "2025-04-15",
  },
  resources: {
    people: ["バックエンド1名", "フロントエンド1名"],
    infrastructure: ["開発環境のみ"],
  },
  deliverables: [
    "動作するデモ",
    "計測結果レポート",
    "Go/No-Go の推奨判断",
    "本格導入時の見積もり",
  ],
};

PoCの進め方

フェーズ1: 計画(1-2日)

## PoC計画書テンプレート

### 背景
なぜこのPoCが必要なのか

### 仮説
「〇〇することで、△△が□□になる」

### 成功基準
| 基準 | 閾値 | 計測方法 |
|------|------|---------|
| ... | ... | ... |

### スコープ
- やること: ...
- やらないこと: ...

### スケジュール
| 日程 | 活動 |
|------|------|
| Day 1-2 | 環境構築、基本実装 |
| Day 3-5 | コア機能の検証 |
| Day 6-8 | 計測、データ収集 |
| Day 9-10 | レポート作成、発表 |

### 中止条件
以下の場合はPoCを中止する:
- 環境構築に3日以上かかる場合
- 基本的な動作が実現できない場合

フェーズ2: 実装と検証(3-8日)

// PoCの進捗管理
interface PoCProgress {
  day: number;
  activities: string[];
  findings: Finding[];
  blockers: string[];
  goNoGoSignal: "green" | "yellow" | "red";
}

interface Finding {
  category: "positive" | "negative" | "neutral";
  description: string;
  impact: "high" | "medium" | "low";
}

// 日次のチェックポイント
const dailyCheckpoints: PoCProgress[] = [
  {
    day: 1,
    activities: ["GraphQLサーバーの環境構築", "スキーマ定義"],
    findings: [
      {
        category: "positive",
        description: "Apollo Serverの初期セットアップは30分で完了",
        impact: "medium",
      },
    ],
    blockers: [],
    goNoGoSignal: "green",
  },
  {
    day: 3,
    activities: ["既存REST APIとの統合", "リゾルバ実装"],
    findings: [
      {
        category: "negative",
        description: "N+1問題が発生。DataLoaderの導入が必要",
        impact: "high",
      },
    ],
    blockers: ["DataLoaderの学習が必要"],
    goNoGoSignal: "yellow",
  },
];

フェーズ3: レポートと判断(1-2日)

## PoC結果レポート

### エグゼクティブサマリー
GraphQL移行のPoCを2週間実施した結果、
仮説は概ね検証され、Go判断を推奨する。

### 結果

| 成功基準 | 目標 | 実績 | 判定 |
|---------|------|------|------|
| API呼び出し回数 | 6回以下 | 4回 | PASS |
| レスポンス時間 | 1.5秒以下 | 1.2秒 | PASS |
| 学習容易性 | 80%が1週間で習得 | 実施予定 | - |

### 発見事項
- N+1問題はDataLoaderで解決可能(+2日の工数)
- 既存REST APIとの共存は問題なし
- TypeScriptとの型統合が非常にスムーズ

### リスク
- チーム全体の学習コスト: 推定2週間のランプアップ
- GraphQLの複雑なクエリへのレート制限が必要

### 推奨
Go判断。段階的に移行することを推奨する。

### 本格導入の見積もり
- フェーズ1(ダッシュボード): 3週間
- フェーズ2(検索機能): 4週間
- フェーズ3(全画面): 8週間

PoCの落とし穴

落とし穴説明対策
スコープクリープ検証範囲が際限なく広がるタイムボックスを厳守
サンクコスト作ったものを捨てられないPoCは使い捨てと割り切る
確証バイアス成功させたい技術に有利な評価成功基準を事前に定義
過小評価本番環境との差を軽視非機能要件も検証に含める
先送り結論を出さずに追加検証を繰り返すGo/No-Goの判断日を固定

まとめ

ポイント内容
PoCとは仮説を検証する期限付きの実験
3フェーズ計画 → 実装・検証 → レポート・判断
成功の鍵仮説と成功基準を事前に定義する
落とし穴スコープクリープ、サンクコスト、確証バイアス

チェックリスト

  • PoCとプロトタイプの違いを説明できる
  • PoC計画書の要素を把握した
  • 成功基準の定義方法を理解した
  • PoCの落とし穴と対策を学んだ

次のステップへ

次は「Technology Radarの活用」を学びます。業界全体の技術トレンドを体系的に把握する方法を学びましょう。


推定読了時間: 30分