EXERCISE 90分

ストーリー

高橋アーキテクト
さて、ここからは実践だ
高橋アーキテクト
新規プロジェクトの技術スタックを選定する演習を用意した。フレームワークを使って、論理的に技術を評価・選定してほしい
あなた
実際のプロジェクトを想定した課題ですか?
高橋アーキテクト
そうだ。6つのミッションをこなせば、技術選定の一連の流れが身につく。ヒントは用意してあるが、まずは自力で考えてみてくれ

ミッション概要

ミッションテーマ難易度
Mission 1要件の整理初級
Mission 2評価基準マトリクスの作成初級
Mission 3候補技術の評価中級
Mission 4PoC計画の策定中級
Mission 5Technology Radarの作成中級
Mission 6技術選定レポートの作成上級

シナリオ

あなたはECサイトを運営するスタートアップのテクニカルリードです。以下の要件で新規プロジェクトを立ち上げます。

## プロジェクト概要
- 既存のモノリシックRailsアプリを段階的にリプレース
- 初期ターゲット: 商品検索・カタログ機能のマイクロサービス化
- ユーザー数: 月間50万人(1年後に200万人を目標)
- チーム: バックエンド3名、フロントエンド2名
- 既存スキル: Ruby, JavaScript, PostgreSQL
- 予算: 限定的(OSS優先)
- 期限: 3ヶ月で初期リリース

Mission 1: 要件の整理(10分)

上記のシナリオから、機能要件・非機能要件・制約条件を整理してください。

要件

以下のテンプレートを埋めてください。

## 機能要件
1.
2.
3.

## 非機能要件
- パフォーマンス:
- スケーラビリティ:
- 可用性:
- セキュリティ:

## 制約条件
- 予算:
- 期限:
- チームスキル:
- 既存システム:
解答例
## 機能要件
1. 商品の全文検索(キーワード、カテゴリ、価格範囲でのフィルタ)
2. 商品カタログのCRUD操作(管理画面から)
3. 既存Railsアプリとの API 連携(段階的移行のため)
4. 商品画像の管理・配信

## 非機能要件
- パフォーマンス: 検索レスポンス200ms以内(P95)
- スケーラビリティ: 月間200万ユーザーに対応可能
- 可用性: 99.9%(月間ダウンタイム43分以内)
- セキュリティ: 管理者認証、APIレート制限

## 制約条件
- 予算: OSS優先、クラウドコストは月10万円以内
- 期限: 3ヶ月で初期リリース
- チームスキル: Ruby/JS経験あり、GoやRustの経験なし
- 既存システム: Rails + PostgreSQLとの共存が必要

Mission 2: 評価基準マトリクスの作成(15分)

バックエンドフレームワークを選定するための評価基準を設計してください。

要件

  • 最低8つの評価基準を定義する
  • 各基準に1-5の重みをつける
  • 重みの根拠を記述する
解答例
| 基準 | 重み | 根拠 |
|------|------|------|
| 学習コスト | 5 | チームのRuby/JS経験を活かしたい。3ヶ月の期限 |
| パフォーマンス | 4 | 検索API 200ms以内の要件 |
| TypeScript対応 | 4 | フロントエンドとの型共有で生産性向上 |
| エコシステム成熟度 | 4 | ORM、テストツール等が揃っているか |
| スケーラビリティ | 3 | 将来の200万ユーザー対応 |
| コミュニティサイズ | 3 | 困った時に情報が見つかるか |
| 既存システムとの統合 | 4 | Rails APIとの連携容易性 |
| 運用実績 | 3 | 本番環境での安定性 |
| ベンダーロックイン | 2 | OSSなのでリスクは低い |

Mission 3: 候補技術の評価(20分)

以下の3つのバックエンドフレームワークを評価マトリクスで比較してください。

  • 候補A: NestJS(TypeScript / Node.js)
  • 候補B: Fastify(TypeScript / Node.js)
  • 候補C: Go + Echo

要件

  • Mission 2で作った基準で各候補を1-5で評価
  • 加重スコアを計算
  • 定性的なPros/Consも記述
解答例
| 基準(重み) | NestJS | Fastify | Go + Echo |
|-------------|:------:|:-------:|:---------:|
| 学習コスト (5) | 3 | 4 | 2 |
| パフォーマンス (4) | 3 | 4 | 5 |
| TypeScript対応 (4) | 5 | 5 | 1 |
| エコシステム成熟度 (4) | 5 | 3 | 4 |
| スケーラビリティ (3) | 4 | 4 | 5 |
| コミュニティサイズ (3) | 4 | 3 | 4 |
| 既存システム統合 (4) | 4 | 4 | 3 |
| 運用実績 (3) | 4 | 3 | 5 |
| ベンダーロックイン (2) | 5 | 5 | 5 |
| **加重合計** | **133** | **131** | **115** |

### NestJS の Pros/Cons
- Pros: DI、モジュール構造がRailsに近い。エコシステム充実
- Cons: 抽象度が高く、初期学習コストがやや高い

### Fastify の Pros/Cons
- Pros: 高速。シンプル。プラグイン機構が柔軟
- Cons: NestJSほど構造化されていない。大規模開発で規律が必要

### Go + Echo の Pros/Cons
- Pros: 圧倒的なパフォーマンス。バイナリデプロイが容易
- Cons: チームにGo経験者なし。3ヶ月の期限では学習コストが高い

Mission 4: PoC計画の策定(20分)

Mission 3の結果を踏まえて、上位2候補のPoCを計画してください。

要件

  • 仮説を1つ定義
  • 成功基準を3つ以上定義
  • スコープ(やること/やらないこと)
  • 2週間のスケジュール
解答例
## PoC計画: NestJS vs Fastify

### 仮説
NestJSのモジュール構造により、大規模化した際の保守性がFastifyより優れる。
一方、Fastifyの方がシンプルで、初期開発速度は高い。

### 成功基準
| 基準 | 閾値 | 計測方法 |
|------|------|---------|
| 商品検索APIの実装速度 | 両者の工数差が20%以内 | 実装時間を記録 |
| 検索APIのレスポンス時間 | 200ms以内(1000商品) | k6で負荷テスト |
| コードの可読性 | チーム評価で4/5以上 | アンケート |
| テストの書きやすさ | カバレッジ80%を1日で達成 | テストカバレッジ計測 |

### スコープ
- やること:
  - 商品検索API(GET /products?q=xxx)の実装
  - PostgreSQLとの接続(Prisma使用)
  - 基本的なバリデーション
  - ユニットテスト
- やらないこと:
  - 認証・認可
  - 管理画面
  - Dockerコンテナ化
  - CI/CD

### スケジュール
| 日程 | NestJS担当 | Fastify担当 |
|------|-----------|------------|
| Day 1-2 | プロジェクト初期設定 | プロジェクト初期設定 |
| Day 3-5 | 商品検索API実装 | 商品検索API実装 |
| Day 6-7 | テスト実装 | テスト実装 |
| Day 8-9 | パフォーマンス計測 | パフォーマンス計測 |
| Day 10 | レポート作成・比較 | レポート作成・比較 |

Mission 5: Technology Radarの作成(15分)

チームのTechnology Radarを作成してください。最低12項目を配置してください。

解答例
## プロダクト開発チーム Technology Radar(2025 Q2)

### Adopt(採用)
| 技術 | 象限 | 説明 |
|------|------|------|
| TypeScript | Languages & Frameworks | 全プロジェクトの標準言語 |
| PostgreSQL | Platforms | メインデータベース |
| Docker | Platforms | 開発・本番環境の標準 |
| GitHub Actions | Tools | CI/CDパイプライン |

### Trial(試用)
| 技術 | 象限 | 説明 |
|------|------|------|
| NestJS | Languages & Frameworks | マイクロサービス候補 |
| Prisma | Tools | 型安全ORM |
| Elasticsearch | Platforms | 全文検索エンジン |

### Assess(評価)
| 技術 | 象限 | 説明 |
|------|------|------|
| Hono | Languages & Frameworks | 軽量Webフレームワーク |
| Meilisearch | Platforms | Elasticsearchの代替 |
| OpenTelemetry | Tools | 分散トレーシング |

### Hold(保留)
| 技術 | 象限 | 説明 |
|------|------|------|
| jQuery | Languages & Frameworks | 新規採用禁止 |
| Heroku | Platforms | コスト面でAWSに移行 |

Mission 6: 技術選定レポートの作成(10分)

Mission 1-5の結果をまとめた技術選定レポートを作成してください。

解答例
# 技術選定レポート: 商品検索マイクロサービス

## エグゼクティブサマリー
商品検索マイクロサービスのバックエンドフレームワークとして、
NestJS(TypeScript)を推奨する。

## 選定プロセス
1. 要件分析: 機能要件4項目、非機能要件4項目を定義
2. 候補評価: NestJS、Fastify、Go+Echo の3候補を9基準で評価
3. PoC実施: NestJS と Fastify の2週間PoCを計画

## 推奨: NestJS
### 理由
- 加重スコアで最高評価(133点)
- DI・モジュール構造がRailsに近く、チームの学習コストが低い
- TypeScript対応でフロントエンドとの型共有が可能
- エコシステムが成熟しており、Prisma等との統合が容易

### リスクと軽減策
| リスク | 軽減策 |
|--------|--------|
| パフォーマンスがFastifyに劣る | キャッシュ戦略で補完 |
| 抽象度の高さが学習障壁に | 社内勉強会で基本パターンを共有 |

## 次のアクション
1. 2週間のPoC実施(NestJS vs Fastify)
2. PoC結果を踏まえた最終判断
3. 本格開発開始

達成度チェック

ミッションテーマ完了
Mission 1要件の整理[ ]
Mission 2評価基準マトリクスの作成[ ]
Mission 3候補技術の評価[ ]
Mission 4PoC計画の策定[ ]
Mission 5Technology Radarの作成[ ]
Mission 6技術選定レポートの作成[ ]

まとめ

ポイント内容
要件整理機能・非機能・制約の3つの軸で整理
評価基準重みつきマトリクスで客観的に比較
PoC仮説と成功基準を定義してから検証
レポート選定プロセスと理由を記録して共有

チェックリスト

  • 要件を体系的に整理できた
  • 評価基準マトリクスを設計できた
  • 複数候補を定量的に比較できた
  • PoC計画を策定できた
  • Technology Radarを作成できた
  • 技術選定レポートをまとめられた

次のステップへ

お疲れさまでした。技術選定の一連のプロセスを実践しました。次はチェックポイントで理解度を確認しましょう。


推定所要時間: 90分