# docs-handbook 全文
開発文書の書き方に関する個人ハンドブック。要求・要件・仕様・設計の4層モデルで
開発文書を整理している。以下に全4文書の本文をそのまま連結している。
========================================================================
# 層の越境パターン集
カテゴリ: 概念
概要: 層が静かに越境する15の型。下向きの先取りと上向きの追認を、症状と直し方で整理する
URL: https://docs-handbook-9dg.pages.dev/raw/concepts/layer-crossing-patterns.md
========================================================================
# 層の越境パターン集
層を分ける理由は「なぜ工程として必要なのか」で述べた。
だが実際の文書では、層は宣言だけでは守られない。書いているうちに静かに越境する。
越境には方向がある。**下向き**(上位層の文書に下位層の判断が先回りして書かれる)と、
**上向き**(下位層で発生した都合が、検証されないまま上位層の決定として居座る)である。
方向によって症状も直し方も違うため、分けて扱う。
判定の基準はひとつ。**その記述を「正しい」と言える人が、その文書の検証者と一致しているか**。
一致していなければ越境している。
以下の例は、業種・システム種別を意図的に散らしてある。
越境は特定のドメインの癖ではなく、層を扱うかぎりどこでも起きるためである。
---
## 下向きの越境: 上位層が下位層を先取りする
### 1. 要求に解決策が書かれている
もっとも頻度が高く、もっとも損失が大きい。
| | |
|---|---|
| 症状 | 要求定義書の目的欄に、作るものの名前が書いてある |
| 例(EC) | ✗「レコメンドエンジンを導入する」
✓「カゴ落ち率を32%から20%に下げる」 |
| 例(社内) | ✗「勤怠管理システムを刷新する」
✓「月次締めの差し戻しを月40件から5件以下にする」 |
| 失われるもの | 代替案の検討余地。カゴ落ちは送料表示のタイミング変更で解ける可能性があるが、レコメンドと書いた時点で検討対象から外れる |
| 直し方 | 「それができると何が嬉しいのか」を3回問う。システムの話でなくなったところが要求 |
解決策が要求の位置に座ると、以降の全層がその解決策を前提に積み上がる。
要求が間違っていたと分かるのは運用に入ってからで、そのときには修正コストが桁で変わっている。
### 2. 要求に成功基準がない
| | |
|---|---|
| 症状 | 「業務を効率化する」「顧客満足度を向上させる」で止まっている |
| 例(サポート) | ✗「問い合わせ対応を改善する」
✓「一次回答までの中央値を8時間から2時間にする」 |
| 失われるもの | 受入テストの根拠。発注者が「それが欲しかったものか」を判定できない |
| 直し方 | 数値と期限を入れる。入れられないなら、まだ要求が言語化されていない |
V字モデルで要求に対応するのは受入テストである。
検証者が正誤を言えない要求は、対応する検証が空になる。
### 3. 要件に技術選定が入る
| | |
|---|---|
| 症状 | 実現手段が要件として合意されている |
| 例(Webサービス) | ✗「Redisでセッションを管理できること」
✓「複数サーバー構成でもログイン状態が維持されること」 |
| 例(モバイル) | ✗「Firebase Cloud Messagingで通知を配信すること」
✓「在庫が復活した商品を、登録者に30分以内に通知できること」 |
| 失われるもの | 設計の自由度。要件として合意した以上、後から別の手段に変えるのが契約上の変更になる |
| 見分け方 | 製品名・ミドルウェア名・アーキテクチャ名が出てきたら設計層 |
### 4. 要件に画面が入る
| | |
|---|---|
| 症状 | 要件定義書に画面レイアウトやボタン配置が書かれている |
| 例(予約サービス) | 要件は「予約の変更が予約者本人でできること」。
「マイページ内に変更ボタンを置く」は仕様の話 |
| なぜ起きる | 発注者に説明するとき、画面があるほうが伝わるため |
| 問題 | 説明のための画像が、いつのまにか合意事項として扱われる |
| 直し方 | 画面を出すなら「これはイメージであり仕様ではない」と明記する。合意対象は文章側 |
### 5. 要件定義書でクライアント向けと内部向けが混ざる
| | |
|---|---|
| 症状 | 発注者に説明する内容と、実装者向けの補足が同じ節に同居している |
| 問題 | 発注者は読めない箇所を読み飛ばし、実装者は合意済みと未確定の区別を失う |
| 直し方 | 章または節の単位で分離し、どちらが合意対象かを明示する |
同じ文書に2種類の読者がいるとき、層の境界より先に**読者の境界**が壊れる。
### 6. 仕様に判定不能な語が残る
| | |
|---|---|
| 症状 | 「適切に処理する」「必要に応じて考慮する」「十分な性能を確保する」 |
| 例(社内文書) | ✗「承認者が不在のときは適切に処理する」
✓「承認待ちが3営業日を超えたら代理承認者へ自動転送する。代理承認者が未設定の場合は申請者の部門長に通知し、申請は差し戻さない」 |
| 問題 | 仕様の検証者はテスター・レビュアーである。正誤を判定できない記述は、仕様の役割を果たしていない |
| 直し方 | 「これをどう試験するか」を書いてみる。書けないなら決まっていない |
### 7. 仕様が正常系しかない
| | |
|---|---|
| 症状 | 入力と出力は書かれているが、上限・0件・エラー・同時実行が書かれていない |
| 例(予約) | 「空き枠を選んで予約できる」だけが書かれ、最後の1枠を2人が同時に押した場合が書かれていない |
| 例(社内文書) | 同じ規程を2人が同時に編集して保存した場合の扱いが未定義。後勝ちか、警告を出すか、版を分けるかが決まっていない |
| 何が起きるか | 実装者が実装中に決める。決めた事実がどこにも残らない |
| 直し方 | 入力・出力・条件・例外の4点セットを埋めきるまで仕様としない |
未定義の例外系は消えるのではなく、コードの中に無記名で確定する。
### 8. 設計書が実装のコピーになっている
| | |
|---|---|
| 症状 | クラス名とメソッド名の一覧はあるが、なぜその構造にしたかがない |
| 書くべきこと | 「注文と在庫引当を同一トランザクションにせず、非同期にした。理由はピーク時のロック競合を避けるため。採らなかった案は同期+悲観ロックで、整合性は単純になるが秒間注文数の上限が読めなかった」 |
| 問題 | コードを読めば分かることしか書いておらず、コードから読み取れない判断が残っていない |
| 直し方 | 検討して**採らなかった案**とその理由を書く。設計書の価値はそこにある |
---
## 上向きの越境: 下位の都合が上位に昇格する
下向きは書き手の先走りだが、上向きは**追認**である。
起きてしまったことを事後的に正当化するため、指摘されにくく、発見が遅れる。
### 9. 実装の都合が仕様として確定する
| | |
|---|---|
| 症状 | 実装中に判明した制約が、そのまま仕様書に反映される |
| 例(外部連携) | 配送会社のAPIが1分1回までだったため、追跡情報の更新間隔を1分にした。それが「仕様」として書かれ、なぜその値かは残らない |
| なぜ問題か | 上の層へ差し戻さず、コードで解決してしまっている |
| 正しい手順 | 仕様の検証者(レビュアー)に判断を戻す。その上で仕様を変えるなら、変更として記録する |
結果として同じ仕様に落ち着くこともある。問題は結論ではなく、**誰が決めたかが残らない**ことにある。
### 10. 設計上の制約が要求の目標を書き換える
| | |
|---|---|
| 症状 | 下位層の妥協が積み重なり、要求の成功基準が未達になっているが、誰も気づかない |
| 例(社内文書) | 全文検索のインデックス更新が重いため、反映までを「1時間以内」に緩めた。要求にあった「承認された規程を関係者がすぐ参照できる」は成立しなくなっているが、仕様書上は整合している |
| なぜ起きる | 仕様の変更として処理されるため、要求層まで影響が伝わらない |
| 直し方 | 仕様を変えるとき、上位の成功基準に触れるかを必ず確認する |
これは越境の中でもっとも静かで、もっとも危険な種類である。
文書上はすべて整合しているのに、要求が達成できない状態が完成する。
### 11. 仕様変更がバグ修正として処理される
| | |
|---|---|
| 症状 | 「不具合対応」として振る舞いが変わっている。仕様書は更新されていない |
| 例(社内文書) | 規程の改定時に、旧版へのリンクが自動的に新版を指すよう変更した。仕様書に版の参照方法の記載がなかったため「バグ」として処理されたが、実際には「当時どの版を参照していたか」を監査時に追えなくする仕様変更 |
| 問題 | 仕様書と実態がズレる。次に仕様書を信じた人が誤る |
| 見分け方 | 「決めたとおりでない」がバグ、「決めたことが間違っていた」は仕様変更 |
逆方向(仕様変更をバグ修正と主張する)は、受託では費用負担の争点に直結する。
層の区別がそのまま契約の区別になる場面である。
---
## 層の運用そのものの失敗
### 12. すべての変更が最下層で処理される
| | |
|---|---|
| 症状 | どんな要望も「ではコードをこう直します」から会話が始まる |
| 例 | 「もっと使いやすくして」に対し、ボタンの色と配置の調整を繰り返す。要求層で「誰がどこで詰まっているか」を確かめていないため、何度直しても評価が変わらない |
| 直し方 | 受けた時点で「これは要求/要件/仕様/設計のどれの変更か」を先に言語化する |
層を分けた本来の効能は、変更時の影響範囲の特定にある。
これが失われると、層は文書の飾りになる。
### 13. 「設計書」という名の全部入り
| | |
|---|---|
| 症状 | 1つの文書に背景・機能一覧・画面・テーブル定義が同居している |
| 問題 | 検証者が特定できない。誰もレビューを完了できず、承認だけが形式的に行われる |
| 直し方 | 分割の基準は分量ではなく検証者。読む人が変わるところで切る |
### 14. 上の層が更新されない
| | |
|---|---|
| 症状 | 仕様書と設計書は最新だが、要件定義書が初版のまま |
| 例 | 途中で対象ユーザーが「店舗スタッフのみ」から「本部を含む」に広がったのに、要件定義書は店舗前提のまま。権限設計の議論が毎回ふりだしに戻る |
| なぜ起きる | 日々参照するのは下の層だけで、上の層は「合意済みの過去」として凍結される |
| 直し方 | 上位層は変更頻度が低いだけで、変わらないわけではない。変えたら書く |
### 15. 層をまたいで用語が揺れる
| | |
|---|---|
| 症状 | 同じ対象が層ごとに違う名前で呼ばれている |
| 例(EC) | 要求では「お客様」、要件では「会員」、仕様では「ユーザー」、設計では `customer`。未登録の購入者を含むのかどうかが誰にも分からない |
| 問題 | 同じものか別のものかが読み手に判断できず、追跡が切れる |
| 直し方 | 用語集を要求層に置き、下位層はそれを参照する |
---
## 越境を見つけるためのチェック
文書を書き終えたら、次を順に確認する。
1. この文書を「正しい」と言えるのは誰か。その人がすべての記述を判定できるか
2. 製品名・技術名が上位層に混ざっていないか
3. 「適切に」「必要に応じて」で終わっている記述はないか
4. 実装中に決めたことが、無記録で文書に反映されていないか
5. 下位層の変更が、上位層の成功基準に触れていないか
6. 前回から上位層は本当に変わっていないか
いずれも「なぜ工程として必要なのか」で挙げた問いの言い換えである。
**この判断は誰が検証するのか**。答えられない記述が、越境した記述である。
========================================================================
# 開発プロセスの全体像
カテゴリ: 概念
概要: 開発プロセス全体の見取り図。各工程が何を決め、何を残すか
URL: https://docs-handbook-9dg.pages.dev/raw/concepts/process-overview.md
========================================================================
# 開発プロセスの全体像
システム開発は「作るものを決める」工程と「作って届け、動かし続ける」工程からなる。
本ハンドブックでは前半の4つを **4層モデル** と呼び、中心的に扱う。
この分類は本ハンドブックの独自定義であり、ISO/IEC/IEEE 12207(共通フレーム)・ISO/IEC/IEEE 29148・V字モデルなどを源流に実務向けへ整理したもの(後述「標準規格との対応」を参照)。
## 定義する工程(4層モデル)
### 要求
**なぜやるか**。ビジネスと業務の話であり、唯一システムの話をしない層。
主語はユーザーや発注者。背景・目的・成功基準(数値)・制約・スコープ外を明らかにする。
- 例(設備保全):「設備の突発停止による生産ラインの停止を月20時間から5時間に減らしたい」
- 例(動画レコメンド):「初月で解約する利用者を減らし、継続率を60%から75%にしたい」
- 例(社内文書検索):「類似の社内文書を探す時間を半日から30分にしたい」
- 残す文書: 要求定義書(PRD)
### 要件
**何を実現するか**。要求を満たすためにシステムに求める機能・性質。
ここから主語が「システムは〜」になる。
- 例(設備保全):「設備の振動と温度から異常の兆候を検知し、担当者に知らせられること」
- 例(動画レコメンド):「利用者ごとに視聴傾向に沿った作品を提案できること」
- 例(社内文書検索):「全部門の社内文書をキーワードで横断検索できること」
- 残す文書: 要件定義書
### 仕様
**どう振る舞うか**。システムを外から見た振る舞いの取り決め。
入力・出力・条件・例外を定め、「正しい/間違い」を判定できる基準になる。
- 例(設備保全):「振動が基準値の1.5倍を10分超え続けたら警告、同一設備への通知は1時間に1回まで」
- 例(動画レコメンド):「トップに10件、視聴済みは除外、視聴履歴が3件未満の利用者には人気順を返す」
- 例(社内文書検索):「キーワードは100文字まで、結果は関連度順に20件表示」
- 残す文書: 画面仕様書、API仕様書、バッチ仕様書
### 設計
**どう作るか**。仕様を実現する内部構造と技術の選択。
ここで初めて実装の中身の話になる。
- 例(設備保全):「センサー値を1分間隔で時系列データベースに蓄積し、移動平均との乖離で判定」
- 例(動画レコメンド):「協調フィルタリングを日次バッチで計算し、結果を利用者ごとにキャッシュ」
- 例(社内文書検索):「Elasticsearchでkuromoji解析、match_phraseクエリ」
- 残す文書: 設計書(アーキテクチャ、DB設計、シーケンス)
## 作り、届け、動かす工程
### 実装
設計に従いコードを書く。決め事はコーディング規約・レビュー観点・ブランチ戦略として残す。
実装中に仕様や設計の矛盾が見つかったら、コードで勝手に解決せず上の層へ差し戻す。
### テスト
作ったものが**上の層の決め事どおりか**を確かめる。検証対象は層と対応する:
単体テスト↔設計、結合テスト↔仕様、システムテスト↔要件、受入テスト↔要求(V字モデル)。
- 残す文書: テスト計画、テスト観点表
### リリース
作ったものを利用者に届ける。手順の再現性と、失敗時に戻れることが要点。
- 残す文書: リリース手順書、チェックリスト、ロールバック基準
### 運用
動かし続け、問題から学ぶ。監視・障害対応・改善のサイクル。
ここで得た知見が次の要求の種になり、プロセスは一周する。
- 残す文書: 運用手順、障害対応フロー、ポストモーテム
## 標準規格との対応
本ハンドブックの分類は独自定義だが、以下の標準・モデルを源流としている。
### ISO/IEC/IEEE 12207 と共通フレーム
ソフトウェアライフサイクルプロセスの国際規格。開発だけでなく、企画・運用・保守・廃棄まで含むプロセス全体を定義する。IPAの「共通フレーム」はこれを日本向けに拡張したもので、日本のSIにおける工程分割(企画→要件定義→設計→実装→テスト→運用・保守)の事実上の出どころ。
- 共通フレームの工程との対応: 企画・要件定義プロセス ≈ 要求/要件、方式設計〜詳細設計 ≈ 仕様/設計、以降は実装〜運用にそのまま対応
- 特徴は要件定義より前の「企画(超上流)」を明示的に工程化していること。本ハンドブックの「要求」はここに相当する
### ISO/IEC/IEEE 29148(要求工学)
要求の獲得・分析・記述に関する規格。要求を段階の異なる文書として区別する:
| 文書 | 内容 | 本ハンドブックでの対応 |
|---|---|---|
| StRS (Stakeholder Requirements) | ステークホルダーが何を必要としているか | 要求 |
| SyRS (System Requirements) | システムが何を満たすべきか | 要件 |
| SRS (Software Requirements) | ソフトウェアが何を満たすべきか | 要件〜仕様 |
英語ではいずれも requirements であり、「要求/要件」の訳し分けは日本語圏の工夫。この規格の「ステークホルダーの要求とシステムの要件は別物」という区別が、4層モデルの上2層の根拠になっている。
### V字モデル
工程とテストレベルの対応関係を示すモデル。左辺(定義)と右辺(検証)が層ごとに対になる:
| 定義(左辺) | 検証(右辺) |
|---|---|
| 要求 | 受入テスト |
| 要件 | システムテスト |
| 仕様 | 結合テスト |
| 設計 | 単体テスト |
「各層はそれぞれ検証できる相手が違う」という4層モデルの根拠はこの対応にある。層を省くと、対応する検証が根拠を失う。
### 日本のSI慣行(外部設計/内部設計)
「仕様」を要件と設計の間の独立した層として立てるのは、外部設計(外から見た振る舞い)/内部設計(中身)という日本の伝統的な工程分割に由来する。海外では仕様(functional spec)を要件側に含めるか設計側に寄せるかは揺れており、独立層として扱うのはこのハンドブックの選択である。
## 全体の関係
```
なぜ 要求
何を └ 要件
振る舞い └ 仕様
作り方 └ 設計
└ 実装 → テスト → リリース → 運用 ─┐
なぜ(次) 要求 ←──────────────────────────┘
```
- 前半4層は**抽象から具体への段階的詳細化**。工程であると同時に、完成後も残る文書の階層でもある
- 変更が起きたら「どの層の変更か」を最初に見極める。要求の変更を仕様の修正だけで受けると、文書と実態がズレていく
- 確定の順序は開発形態で前後する。受託はおおむね上から下へ、自社プロダクトではプロトタイプ(仕様・実装)が先行して要求が後から明確になる逆流も起きる
========================================================================
# コードから何が読めるか
カテゴリ: 概念
概要: コードから復元できる層とできない層。要求だけが原理的に復元できない理由
URL: https://docs-handbook-9dg.pages.dev/raw/concepts/what-code-reveals.md
========================================================================
# コードから何が読めるか
引き継いだシステムに、コードしか残っていないことがある。
前任者は退職し、設計書は初版のまま、要件定義書は見つからない。動いているコードだけがある。
このとき「コードを読めば全部わかる」と言われることがある。半分は正しい。
だが**層によって復元できる度合いは決定的に違い、要求だけは原理的に復元できない**。
その線引きを明らかにするのがこの文書の目的である。
これは4層モデルを逆向きに辿る話にあたる。
他の文書が「上から下へ書く」ことを扱うのに対し、ここでは「下から上へ読む」ことを扱う。
## 復元可能性は層によって違う
| 層 | 復元可能性 | 残っているもの | 消えているもの |
|---|---|---|---|
| 設計 | ほぼ完全 | 構造・技術選択・データモデル | 検討して採らなかった案とその理由 |
| 仕様 | 高い | 入力・出力・条件・例外(分岐とバリデーションとして) | どれが意図的な決定で、どれが暗黙の既定値か |
| 要件 | 部分的 | 何ができるか | 何ができるべきか。実装されなかった要件 |
| 要求 | 復元不能 | なし | 目的・成功基準・スコープ外の判断・代替案 |
下の層ほどコードとの距離が近く、上の層ほど遠い。
これは「開発プロセスの全体像」で述べた抽象から具体への段階的詳細化を、逆から見たものである。
注意すべきは、この表の右列——**消えているもの**が、いずれも「判断」だという点である。
コードに残るのは判断の**結果**であり、判断そのものではない。
## なぜ要求だけ復元できないのか
理由は2つある。
### 写像が多対一である
上位層から下位層への対応は一対一ではない。
まったく異なる要求から、同じコードが生まれうる。
例えば「関連文書をキーワードで検索できる」という実装は、次のどの要求からも導かれる。
- 調査にかかる時間を短縮したい
- 担当者が異動しても業務が回るようにしたい
- 問い合わせに対して根拠を示せるようにしたい
コードはこの3つを区別しない。区別する必要がないからこそ、実装として成立している。
多対一の写像に逆写像は定義できない。これは情報が失われているという以前に、**構造上の帰結**である。
### 要求はシステムの話をしない層である
「開発プロセスの全体像」で述べたとおり、要求は唯一システムの話をしない層である。
主語がユーザーや発注者であり、対象がビジネスと業務である以上、
その内容はシステムの内部——すなわちコードには最初から現れない。
コードの中を探しても見つからないのは当然で、そこに書かれるべきものではなかった。
## 意図と事故は同じ形をしている
復元をさらに難しくするのは、**判断の結果と偶然の産物が、コード上で区別できない**ことである。
`LIMIT 20` という記述を見つけたとする。この値の由来は少なくとも3通りある。
1. 業務上の判断。画面で一覧できる件数として決めた
2. 性能上の妥協。件数を増やすと応答が遅くなるため下げた
3. 由来なし。最初に書いた誰かの既定値がそのまま残った
コードからはどれか判定できない。にもかかわらず、読み手は多くの場合1だと解釈する。
コードを読むという行為には、**そこに理由があったと仮定する**バイアスが伴う。
さらに厄介なのは、「層の越境パターン集」で挙げた上向きの越境が起きていた場合である。
設計上の制約が要求の目標を静かに書き換えていたとき(同 #10)、
コードには**要求が未達であるという事実まで含めて、整合した状態**が残る。
このコードから逆算すると、達成できなかった状態が「そういう要求だった」として読み取られる。
復元は失敗しない。誤ったものを、矛盾なく復元してしまう。
## 手がかりと、その限界
読み取れるものがないわけではない。ただし、どの層に届くかを意識して使う必要がある。
| 手がかり | 読めること | 届く層 |
|---|---|---|
| テストコード | 想定された入力・出力・例外。当時「正しい」とされた振る舞い | 仕様 |
| 分岐とバリデーション | 条件と制約。ただし網羅されているとは限らない | 仕様 |
| 例外処理の偏り | 特定箇所だけ手厚い防御は、過去に障害が起きた痕跡 | 仕様〜要件 |
| 権限・ロールの構造 | 誰が使うシステムか。ステークホルダーの構成 | 要件 |
| 命名の揺れ | 立場の異なる関係者の言葉が混在した跡(同 #15) | 要件 |
| コミット履歴・課題管理 | 変更の理由。**唯一、要求に届きうる情報源** | 要求 |
このうち上5つは、どれほど丁寧に読んでも要件までしか届かない。
要求に届く可能性があるのはコード外の記録——履歴や議論の場——だけである。
マジックナンバーの扱いには補足が要る。
`LIMIT 20` から読み取るべきは値の意味ではなく、**そこに判断があったという事実**である。
値の意味は推測するのではなく、確認すべき項目として記録する。
## 逆算の罠
コードから要求を推測し、それを要求定義書として書き起こすことには固有の危険がある。
書き起こした瞬間、それは**現状追認の装置**になる。
実装の都合で決まった値が、要求という最上位の権威をまとって固定される。
以降の変更は、その「要求」との整合性を基準に判断される。
これは上向きの越境(同 #9・#10)を、文書化によって恒久化する行為にあたる。
越境はもともと記録されないことが問題だったが、
逆算による文書化は、越境を**正式な決定として記録してしまう**点でより悪い。
生成AIに読ませる場合、この危険は増幅される。
コードを渡して要求を尋ねれば、必ずそれらしい要求が返ってくる。
形式は整い、文体は自信に満ち、検証の手がかりだけがない。
判断の基準はここでも同じである。
**その要求を「正しい」と検証できるのは発注者やユーザーであり、コードではない。**
コードは要求の検証者になれない。検証者のいない文書は、合意ではなく推測の固定である。
## 実務的な着地
引き継いだシステムに文書がないとき、次の方針をとる。
- **復元するのは仕様まで**。コストに見合い、テストコードという裏取りの手段もある。設計はコード自体が最新の記述なので、改めて書くのは変更の理由に限る
- **要件は列挙にとどめる**。「何ができるか」は書けるが、「何ができるべきだったか」は書けない。実装されなかった要件は観測できないため、一覧は常に不完全である
- **要求は人に聞く**。関係者が残っていれば聞き、いなければ「不明」と書く。**空欄のほうが、推測で埋めた欄より価値がある**。空欄は問いとして残るが、埋まった欄は問われなくなる
- **推測を書くなら出所を明記する**。「観測された振る舞いからの仮説」と書き、検証者を人に戻す。仮説と合意事項を同じ体裁で並べない
## まとめ
- コードに残るのは判断の**結果**であり、判断そのものではない
- 復元可能性は層に依存する。設計と仕様は高く、要件は部分的、要求は原理的に不能
- 上位から下位への写像は多対一であり、逆写像は存在しない
- 意図と事故はコード上で同じ形をしており、読み手は理由があったと仮定しやすい
- 逆算した要求の文書化は、越境を正式な決定として固定する
- 迷ったら問う。**この判断は誰が検証するのか**。コードは検証者ではない
文書は工程の副産物ではなく、判断が行われた証拠である。
コードしか残っていない状況とは、判断の結果だけが残り、証拠が失われた状況にほかならない。
========================================================================
# なぜ工程として必要なのか
カテゴリ: 概念
概要: 層は判断の分離、工程はその並べ方。なぜ分けるのか、なぜ順序があるのか
URL: https://docs-handbook-9dg.pages.dev/raw/concepts/why-process.md
========================================================================
# なぜ工程として必要なのか
要求→要件→仕様→設計という分け方は、一見「手続きのための手続き」に見える。
小さな開発なら、頭の中で全部済ませてコードを書き始めても動くものは作れる。
それでもこの分け方が必要な理由を、「層の必要性」と「工程(順序)の必要性」に分けて説明する。
この2つは別の話であり、混ぜると「アジャイルなら不要」のような誤った結論に落ちる。
## 層の必要性: 翻訳は一足飛びにできない
根っこにあるのは、**ビジネスの言葉とコードの言葉は距離が遠すぎて、一度に翻訳できない**という問題である。
「調査時間を半分にしたい」という要求から、`match_phrase` クエリという実装までの間には、
無数の判断が挟まっている。検索対象は何か、何件表示するか、0件のときどうするか、
どの検索エンジンを使うか。一気に飛ぶと、これらの判断が誰にも見えない形でコードに埋まる。
各層は、この翻訳の**中間チェックポイント**である。重要なのは、層ごとに「正しい」と言える人が違うこと:
| 層 | 「正しい」と検証できる人 |
|---|---|
| 要求 | 発注者・ユーザー(それが欲しかったものか) |
| 要件 | 発注者と開発者の双方(それで要求が満たせるか) |
| 仕様 | テスター・レビュアー(振る舞いが決めたとおりか) |
| 設計 | エンジニア(仕様を満たす作りか) |
層を省くと、**誰も検証できない飛躍**がどこかに埋まる。
「なんとなく動くが、これで良いのか誰にも判断できない」状態は、たいていここから生まれる。
V字モデルが各層にテストレベルを対応させているのは、この検証可能性の裏返しである。
もう1つの役割は**変更時の影響範囲の特定**にある。
「表示件数を30件にしたい」は仕様の変更で、要求は変わらない。
「調査時間の目標を10分にしたい」は要求の変更で、要件から下が全部揺れる。
層が分かれていれば、変更がどの高さの話かを最初に見極められる。
分かれていなければ、すべての変更が「コードをどう直すか」の話に潰れてしまい、
文書と実態が静かにズレていく。
## 工程の必要性: 順序には理由があるが、状況依存である
層の分離が普遍的な必要性なのに対して、それを**時間順に並べる(工程にする)**理由はもっと現実的な事情による。
### 手戻りコストの非対称性
要求の間違いは、下流に行くほど修正コストが膨らむ。
仕様まで降りてから「そもそも解くべき課題が違った」と分かれば、仕様も設計も書き直しになる。
運用まで行ってから分かれば、桁が変わる。
抽象度の高い判断ほど先に固めて検証したい、というのが工程順の第一の理由である。
### 合意と責任の区切り
受託開発では、「要件定義完了で合意し、次へ進む」という工程の区切りが、
そのまま契約・責任・支払いの区切りになる。
どこまでが合意済みで、どこからが未確定かを両者が共有するために、工程は区切りとして機能する。
第三者(別ベンダー、後任、監査)が入る場合も、工程ごとの成果物が引き継ぎの単位になる。
### ただし、順序は絶対ではない
手戻りコストが小さい環境では、工程順を崩せる。
自社プロダクトでプロトタイプを先に作り、触ってもらってから要求が明確になる、という逆流は健全に起こる。
アジャイル開発は工程を反復の中に畳み込んでいるのであって、判断を省いているわけではない。
見誤ってはいけないのは、**崩れているのは順序であって、判断ではない**という点である。
プロトタイプ先行でも「これは誰の何を解決するのか(要求)」
「この振る舞いで確定か(仕様)」という判断は必ずどこかで行われている。
行われていなければ、それは速い開発ではなく、検証されていない開発である。
## まとめ: 層は判断の分離、工程はその並べ方の一形態
- **層**は、遠すぎる翻訳を検証可能な単位に区切るためのもの。開発形態によらず必要
- **工程**は、その判断を手戻りコストと合意の都合で時間順に並べたもの。状況に応じて崩せる
- 何を省けるか迷ったら、「この判断は誰が検証するのか」を問う。検証者が消える省略は、していない
本ハンドブックが文書の書き方を層ごとに整理しているのは、この判断の分離を文書の形で残すためである。
文書は工程の副産物ではなく、判断が行われた証拠であり、次の変更のときに「どの層の話か」を
見極めるための基準点になる。