4-1. 技術スタックの選定と理由
使用する言語・フレームワーク・DBと、それを選んだ理由を定義する。「なぜこの技術を使うか」まで記録することが重要だ。技術選定の決定理由を残さないと、数ヶ月後・数年後に「なぜこれを使っているのか」がわからなくなり、不必要な技術リプレース議論やリファクタリングが発生する。
| 層 | 選択肢例 | 選定の論点 |
|---|---|---|
| フロントエンド | Next.js / Nuxt / SvelteKit | SSRが必要か、学習コスト、チームの習熟度 |
| バックエンド | BFF一体型 / API分離型 | 規模感・チーム構成・将来のスケール |
| データベース | PostgreSQL / Supabase / Firebase | 運用コスト・スケール・リレーショナルが必要か |
| 認証 | NextAuth / Supabase Auth / 独自実装 | セキュリティ・実装コスト・MFAが必要か |
| ホスティング | Vercel / Cloudflare Pages / AWS | コスト・可用性・チームのクラウド経験 |
⚠️ 定義しないと…
メンバーが増えたときに「なぜこの技術を使っているか」が伝わらない。理由がわからないまま他の技術に乗り換えようとし、不必要なリプレース議論が起きる。
ℹ️ 選定理由の書き方
「〇〇を選んだ理由:チームの習熟度が高く学習コストを抑えられるため」など、理由を一文で添えるだけでも将来の意思決定の参考になる。
技術選定の記録は「ドキュメント」よりも軽量な形でよい。Confluence・Notion・GitHubのREADMEに次のような形式で残すだけで十分だ。
## 技術選定メモ
### フロントエンド: Next.js 14(App Router)
- 選定理由: チーム全員がReact経験あり。SSRが必要な一部ページがあるためNext.jsを選択。
- 懸念: App RouterはチームがPage Router経験しかないため学習コスト発生。
- 検討した代替: Remix(App Router移行コストと同程度のため不採用)
### データベース: PostgreSQL(Supabase経由)
- 選定理由: RDBが必要。Supabaseを使うことで認証・リアルタイム機能も統合できる。
- 懸念: 無料枠を超えた際の課金が月$25〜(要プロジェクト予算確認)
- 検討した代替: PlanetScale(MySQL系のため一部SQL構文の差異あり。Postgres寄りのため不採用)
4-2. 外部サービス依存の明示
使用するSaaS・外部APIのリストと、それが使えなくなった場合の代替方針を定義する。外部サービスへの依存は「使えて当然」と思われがちだが、料金改定・サービス終了・APIの仕様変更はビジネスの外部要因であり、事前に代替方針を持っておくことがリスク管理の基本だ。
⚠️ 定義しないと…
外部サービスが料金改定・サービス終了した際に影響範囲が把握できない。依存関係を誰も把握していないため、障害時の対応が遅れる。
| 記載項目 | 内容 | 記載例 |
|---|---|---|
| サービス名 | 利用するSaaS・API名 | SendGrid |
| 用途 | 何に使うか | トランザクションメール送信(会員登録・パスワードリセット等) |
| 代替方針 | 使えなくなった場合どうするか | AWS SES に切り替え(移行コスト: 1週間程度) |
| コスト | 無料枠の上限・有料化のトリガー | 月100通まで無料。超過時は$19.95/月〜 |
外部サービスへの依存は多くなりがちだ。メール送信・決済・地図・翻訳・認証・ファイルストレージなど、一つひとつは小さくてもまとめるとかなりの数になる。依存リストを一覧化するだけで「このサービスが止まったらどこまで影響するか」が一目でわかるようになる。
4-3. 開発・本番環境の分離方針
ローカル・ステージング・本番環境の構成と、環境変数の管理方法を定義する。環境分離が不十分なプロジェクトでは、開発者が誤って本番データを操作してしまう事故や、APIキーのGitHub流出が頻繁に発生する。これらは技術的なミスというよりも、ルールの不在が原因であることが多い。
⚠️ 定義しないと…
開発中のコードが誤って本番DBに接続し、実データを書き換えてしまう事故が起きる。APIキーや秘密鍵がコードにハードコードされ、GitHubに流出するリスクが生まれる。
✅ 最低限の分離方針
① 環境変数は .env ファイルで管理し .gitignore に追加する。② ローカル・ステージング・本番で別々のDBを使う。③ 本番DBへの直接接続は管理者のみに限定する。
環境ごとの設定管理に使えるツールとパターンを整理しておく。
| 手法 | 概要 | 向いているシーン |
|---|---|---|
| .env ファイル | 環境ごとに .env.local / .env.staging / .env.production を分けて管理 | 小規模プロジェクト |
| AWS Secrets Manager / Parameter Store | シークレットをAWSで一元管理。コードへの書き込みをゼロにできる | AWSを使うプロジェクト |
| HashiCorp Vault | オープンソースのシークレット管理ツール。クラウド非依存 | マルチクラウド・オンプレミス |
| GitHub Actions Secrets | CI/CDパイプライン内でのみ使うシークレットをGitHub側で管理 | GitHub Actionsを使うプロジェクト |
本番環境へのアクセス制限も忘れずに定義したい。「本番DBに直接アクセスできるのは誰か」「本番サーバにSSHできるのは誰か」を明文化しておかないと、本番障害時に「誰がアクセスできるか」を確認する時間が発生し、対応が遅れる。最低限、本番アクセス可能なIAMユーザー・SSH鍵の一覧と、アクセス権付与・剥奪のプロセスを定義しておくとよい。
アーキテクチャ方針でよくある失敗パターン
技術選択の決定そのものより、「決定の記録と共有」の失敗が後工程で大きなコストになる。
| 失敗パターン | 何が起きるか | 防止策 |
|---|---|---|
| 環境間で秘密情報をコードにハードコードする | 本番DBのパスワードがGitHubに混入し、セキュリティインシデントが発生する | .envファイルを.gitignoreに追加し、シークレット管理ツール(Secrets Manager等)を使う |
| 環境構成をドキュメント化しない | ローカル・ステージング・本番で設定が乖離し、「ローカルは動くのに本番で動かない」問題が頻発する | 各環境の設定差分を表形式でドキュメントに記録し、onboarding時に共有する |
| 技術選定理由を残さない | メンバーが変わるたびに「なぜこの構成なのか」が不明になり、不要な再検討が発生する | ADRで選択・却下した代替案・理由を記録し、Confluenceやリポジトリに保管する |