00. この本の使い方

目的

  • 本書の適用範囲(小〜中規模)と前提(TypeScript)を明確化する
  • 「やらないこと」を先に固定し、設計判断の迷走を減らす
  • 以降の章で使う用語(要求/要件/仕様/設計、結合、S/D/V、テストレベル)を揃える

得られる判断能力

  • 「今の規模で必要な設計」と「過剰設計」を区別できる
  • 要件・設計・テストの判断を、同一の基準(S/D/V、非機能の最小合意)で接続できる
  • 章を読み進めるための前提(用語、進め方、題材)を揃えられる

対象読者 / 対象規模

  • 対象読者: 小〜中規模の Web アプリ開発に関わるエンジニア(TypeScript を前提)
  • 対象規模(例):
    • 1〜2 チーム程度(〜10 名規模)
    • 仕様変更が週〜月単位で発生する
    • 単一リポジトリでの開発が中心(必要に応じて分割)

非ゴール(この本では扱わない)

  • 特定フレームワーク固有の最適化・詳細実装(例: Next.js 固有の最適化)
  • 大規模前提のテンプレ(フル装備のクリーンアーキテクチャ、マイクロサービス化)
  • 外部書籍/ガイドの本文転載(リンク参照で代替する)
  • 実サンプルアプリの完成(必要なら別 Issue で扱う)

この本でやること(全体像)

本書は「良い設計パターン集」ではなく、要求から設計・テストまでを 同じ語彙と成果物 でつなぐための実務手順です。扱う対象を次の 4 つに分け、混同を避けます。

  • 要求(Needs / Goals): なぜやるか(ビジネス目的・課題・KPI)
  • 要件(Requirements / Shall): 何を満たすべきか(実装方法に依存しない約束)
  • 仕様(Specification / Behavior): どう振る舞うか(外部から観測できる振る舞いを曖昧さなく)
  • 設計(Design / Structure): どう作るか(内部構造・モジュール・アルゴリズム・DB物理など)

混同しやすいポイント:

  • 要件は「約束(Shall)」であり、実装方法を含めない
  • 仕様は「外から見える振る舞い」であり、内部構造を含めない
  • 設計は「内部の作り方」であり、仕様の言い換えにならない(仕様を満たす複数の設計があり得る)

本書の章とテンプレ(Appendix)は、次の対応で進めます。

対象 この段階で行うこと 参照テンプレ 主な章
要求 目的/課題/KPI/非ゴールを固定する Appendix B-1 01
要件 Shall を列挙し、スコープと非機能の最小合意を取る Appendix B-2 01
仕様 受け入れ条件・例外系・外部I/Fの振る舞いを曖昧さなくする Appendix B-3(任意: B-10, B-12) 01
設計 境界・依存方向・データモデル等の構造を決め、S/D/V と ADR で根拠を残す Appendix B-4〜B-7(任意: B-9/B-10) 02〜04, 07
テスト 単体/統合/E2E の配分と最小セットを決める Appendix B-8 05〜06
横断 要件→仕様→設計→テストの対応を追跡し、漏れを検知する Appendix B-11(任意) 01, 06

最小タイムライン(例: 1〜2週間の初期立ち上げ)

小〜中規模の開発で「実装を始められる最小合意」を作るための、タイムボックス例です(単一チーム/単一リポジトリ想定)。

前提:

  • すべてを網羅しない(トップ要件/主要導線から始める)
  • 迷いが出る論点だけを固定し、詳細は実装と学習に合わせて更新する
フェーズ 目安 この段階で行うこと 成果物(最小) 次に接続する
要求 0.5日 目的/課題/KPI/非ゴールを固定する B-1 要件の優先順位
要件 0.5〜1日 Shall を列挙し、スコープと非機能の最小合意を取る B-2 仕様(受け入れ条件)
仕様 1日 受け入れ条件・例外系・観測点を曖昧さなくする B-3(任意: B-10, B-12) 設計(境界/契約)
相互作用/結合 0.5日 相互作用と依存の痛みを焦点化し、介入点を決める B-9, B-4 設計アウトライン
設計 1日 最小の境界・責務・依存方向・データモデルを決める B-5(任意: B-7) テスト配分
テスト 0.5日 単体/統合/E2E の配分と最小セットを合意する B-8 実装/自動化

テンプレの本体は Appendix B、記入例は Appendix D を参照してください。

レビュー観点(最小):

  • 要求: KPI/非ゴールで迷いが減るか(「やらないこと」が明確か)
  • 要件: Shall が実装方法に依存していないか(検証可能な約束になっているか)
  • 仕様: 例外系と観測点があるか(合否判定ができるか)
  • 設計: S/D/V の根拠があるか(変更容易性と運用が接続しているか)
  • テスト: 仕様(B-3)と契約を守る投資になっているか(E2E が増殖していないか)

共通題材(ランニング例)

本書では、章を通して同一の題材で説明を一貫させます。

ランニング例: 小規模「タスク管理」+ 期限/権限/通知

  • 主要機能:
    • タスクの CRUD
    • 状態遷移(例: todo → in_progress → done
    • 期限ルール(期限超過の扱い、期限変更の制約)
    • 通知(メール送信を外部I/F例として扱う)
    • 権限(管理者/一般ユーザー)

以降の章で「この題材なら、どこに相互作用が生まれ、どの結合を弱めるべきか」を具体化します。

学習の進め方

  • 章を読む → 演習を解く → Appendix のテンプレに記入する、の順で進めます
  • 演習結果は「判断ログ」として残すと、後から設計変更の根拠になります(ADR と親和性が高い)
  • テンプレは「成果物の型」です。粒度や項目を必要最小限にしても、用語(要求/要件/仕様/設計)を混同しないことを優先します

本書の判断原則(背骨)

  • 要求: 「なぜやるか」を KPI/課題として固定し、非ゴールで迷走を抑える
  • 要件: 要求を「Shall(約束)」に落とし、検証可能な合意にする
  • 仕様: 外部から観測できる振る舞いを曖昧さなく定義し、例外系も含める
  • 設計: 結合(知識の共有)を 統合強度×距離×変動性(S/D/V) で扱い、最小の境界と構造を選ぶ
  • テスト: 単体/統合/E2E を「価値導線」と「複雑さ」に応じて配分し、仕様と契約を守る

前提/用語

  • 要求(Needs / Goals): 利害関係者が「したいこと」。目的、課題、KPI として説明できる状態にする
  • 要件(Requirements / Shall): 実装方法に依存しない約束。「何を満たすべきか」を列挙できる
  • 仕様(Specification / Behavior): 外部から観測できる振る舞い(入力/出力、状態遷移、エラー)を曖昧さなく定義する
  • 設計(Design / Structure): 仕様を満たすための内部構造(境界、モジュール、アルゴリズム、DB物理など)
  • S/D/V: 結合を扱うための物差し(統合強度 / 距離 / 変動性)

要点

  • 小規模では「抽象化のコスト」が支配的になりやすい(過剰設計が損失)
  • 設計は「最適化」ではなく「制約の設定」として扱うと破綻しにくい
  • テストは網羅率ではなく、価値導線と変更容易性を守る投資として配分する

演習(最小1個)

  1. 自分の対象システムを 1 行で要約する(例: 「社内向けの申請・承認Web」)。
  2. 「やらないこと(非ゴール)」を 5 つ書く(例: マルチテナント化しない)。
  3. 期待するアウトカム(KPI/業務効果)を 2 つ書く。

よくある失敗

  • 「将来の拡張」を根拠に、現時点で不要な抽象化を導入する
  • 要件が曖昧なまま UI 実装に着手し、手戻りを正当化してしまう
  • テストを「あとで追加」する前提で設計し、結局追加できない

チェックリスト

  • 対象の規模(ユーザー数/チーム規模/変更頻度)を言語化できる
  • 非ゴールを合意できる(少なくともチーム内)
  • 受け入れ条件の粒度イメージを共有できる
  • S/D/V の定義をチームで共有できる