- SDD(仕様駆動開発)では「要件定義書」を中心にしない
- なぜ文章の仕様は必ず壊れるのか
- 実行可能な仕様とは何か
- 要件定義書と何が違うのか
- 実際のプロジェクトで起きる変化
- ありがちな誤解
- 注意点とリスク
- 導入のコツ
- 最後に
SDD(仕様駆動開発)では「要件定義書」を中心にしない
SDD(仕様駆動開発)を理解する上で最初につまずくのがここです。
SDDは要件定義を軽視しているわけではありません。むしろ逆です。
要件を最も厳密に扱うために、要件定義書を中心にしないという考え方です。
一般的な開発では、要件定義書は「合意の証拠」として扱われます。
署名・承認があり、レビューを通り、開発はそれを元に進みます。
しかし実務では、次の現象が頻繁に起きます。
- 要件定義書は正しい
- 実装も仕様通り
- それでもシステムが期待通り動かない
この時、原因は実装のミスではありません。
仕様の解釈のズレです。
文章の要件定義は、読む人の前提知識に依存します。
そしてソフトウェアは、前提知識を理解しません。
ここにSDDが登場します。
なぜ文章の仕様は必ず壊れるのか
例を一つ考えてみます。
「ユーザーが退会した場合、アカウントを無効化する」
この文章は一見明確です。しかし実装に入ると必ず議論が始まります。
- 退会直後のログインは可能か
- APIトークンは即時失効か
- サブスクリプションはどうなるか
- 管理画面からは閲覧できるのか
文章は仕様を説明できますが、振る舞いを確定できません。
つまり、文章仕様は「説明」であって「制約」ではありません。
ソフトウェアが必要とするのは制約です。
実行可能な仕様とは何か
SDDでは仕様をプログラムとして記述します。
これは単なるテストコードとは少し違います。
ポイントは、実装より先に存在し、実装の正しさを定義することです。
例として、ユーザー退会を仕様として表現します。
Feature: ユーザー退会 Scenario: 退会したユーザーはログインできない Given 有効なユーザーが存在する When ユーザーが退会する Then そのユーザーはログインに失敗する Scenario: 退会後はAPIトークンが無効になる Given 有効なAPIトークンを持つユーザー When ユーザーが退会する Then API認証は401を返す
これがSDDでいう仕様です。
文章ではありません。実行されます。
もし開発者がログインを許してしまえば、CIで失敗します。
つまりこの仕様は説明ではなく、強制力を持つ契約です。
要件定義書と何が違うのか
要件定義書と実行可能な仕様の違いは、読み手ではなく責任にあります。
| 種類 | 読む主体 | 責任 |
| 要件定義書 | 人間 | 理解する責任 |
| 実行可能な仕様 | コンピュータ | 違反を検出する責任 |
要件定義書は「理解してくれる前提」です。
実行可能な仕様は「間違いを検出する前提」です。
ここが決定的な差です。
実際のプロジェクトで起きる変化
SDDを導入すると、要件定義フェーズの会話が変わります。
従来の会話:
「仕様書に書いてあります」
SDD導入後:
「そのケースのシナリオを書いてください」
つまり文章のレビューではなく、振る舞いのレビューになります。
レビューの対象が文書からケースへ移動します。
結果として、次の現象が起きます。
- 実装後の手戻りが減る
- QA工程での仕様バグが激減する
- 開発者と業務側の認識が揃う
特に大きいのは、QAが「確認作業」から「仕様策定」に参加できるようになる点です。
ありがちな誤解
SDDは「ドキュメントを書かない開発」だと誤解されがちです。
実際は逆です。
ドキュメントは減りません。
曖昧なドキュメントが減ります。
文章の仕様書は、背景説明や業務フローの理解には必要です。
しかし正しさの保証には使いません。
保証は実行可能な仕様が担当します。
注意点とリスク
SDDには明確なリスクがあります。
- シナリオが増えすぎる
- すべてを仕様化しようとする
- UI挙動まで固定する
最も危険なのは「画面の動作」を仕様に入れることです。
ボタン配置や画面遷移を仕様にすると、リファクタリング不能になります。
SDDの対象はUIではありません。
業務ルールの振る舞いです。
導入のコツ
最初から全面的に置き換える必要はありません。
効果が出やすい部分から始めます。
- 課金処理
- 在庫管理
- 権限制御
これらは「間違えると事故になる」領域です。
ここに実行可能な仕様を置くと、チームの理解が一気に進みます。
最後に
SDD(仕様駆動開発)が目指しているのは、ドキュメントの削減ではありません。
仕様の誤解を構造的に不可能にすることです。
要件定義書は人間のための知識です。
実行可能な仕様はシステムのためのルールです。
ソフトウェアは文章を理解しません。
しかし、実行される仕様は裏切りません。