Excel仕様書という名の「負の遺産」を解体する
フロントエンド開発の現場で、我々エンジニアが最も疲弊する瞬間の一つが「仕様書と実装の乖離」を埋める作業です。ウォーターフォール型のプロジェクトに身を置くと、必ずと言っていいほどExcelで作成された巨大な機能一覧表と対峙することになります。このExcelは、フロントエンドとバックエンドの区分けが曖昧なまま、画面一覧と機能詳細が混在し、更新されるたびに誰が最新版を持っているのかすら分からなくなる「負の遺産」と化します。この構造的な問題は、仕様が自然言語で書かれ、実装がコードで書かれているという「言語の断絶」に起因しています。仕様書を読み解くにはドメイン知識が必要であり、実装を読み解くにはプログラミング言語の習熟が必要です。この二つの領域を繋ぐのは、常に人間の脳内で行われる翻訳作業であり、これがレビューの属人化や、網羅性の欠如、そして致命的な手戻りを引き起こす根本原因です。
筆者が提案する「仕様と実装を同じ言葉で書く」というアプローチは、単なる命名規則の統一ではありません。これは、フロントエンドの責務を「Subject(誰が)× Object(何を)× Verb(どうする)」というSOVアーキテクチャに基づき、機械的に突合可能なデータ構造へと昇華させる試みです。例えば、ユーザーが「注文をキャンセルする」という意図(Intent)を持つとき、これを「Buyer(誰が)× Order(何を)× Cancel(どうする)」という三つ組の責務として定義します。この語彙は、要件定義の段階から実装コードのコンポーネント名、さらにはテストコードのタグに至るまで一貫して使用されます。これにより、仕様書は「人間が読むための静的なドキュメント」から「CIで検証可能な実行可能な仕様」へと進化します。我々エンジニアが深夜の障害対応で「この機能はそもそも仕様に含まれていたのか?」と頭を抱えるような事態を、静的解析によって未然に防ぐための強力なガードレールがここに構築されるのです。
CIで責務を静的検証する「責務カバレッジ」の衝撃
この手法の真骨頂は、トップダウンの「シナリオ定義書」と、ボトムアップの「実装コード」をCI上で突合させる仕組みにあります。シナリオ定義書は、ユーザーの意図(Intent)ごとにYAML形式で記述され、その意図を達成するために必要な責務の集合を宣言します。一方、実装側ではReact Router v7やRemix的なスタックを前提とし、コンポーネント名にSOV命名規則を適用します。例えば、OrderCancelDialogというコンポーネントがあれば、これをts-morphを用いて解析し、{ Object: "Order", Verb: "Cancel" }という責務を抽出します。この抽出された責務の集合と、シナリオ定義書で宣言された責務の集合を比較することで、「仕様にあるのに実装されていない機能」や「実装されているのに仕様にない野良機能」を、ビルドプロセスの中で即座に検出できるのです。
このプロセスを導入することで、レビューの質は劇的に向上します。一枚岩のExcelを全員で眺めるのではなく、Intent単位でファイルを分割し、担当者が責任を持ってレビューを行う体制が自然と整います。また、sov-baseline.ymlのような例外管理ファイルを設けることで、過渡期の未実装や意図的な適用外を管理しつつ、なし崩し的な例外の増殖を抑制します。これは、ArchUnitのようなアーキテクチャテストの概念をフロントエンドの機能要件にまで拡張したものであり、開発者が「コードを書くこと」と「仕様を満たすこと」を同一の作業として捉えるための極めて実践的な処方箋です。以下に、この開発プロセスにおける責務突合の構造を整理します。
| プロセス | 役割 | 成果物 |
|---|---|---|
| トップダウン | ユーザーの意図(Intent)から責務を抽出 | シナリオ定義書 (YAML) |
| ボトムアップ | コンポーネント名から責務を抽出 | Reactコンポーネント (TSX) |
| 突合・検証 | 責務の差集合をCIで静的解析 | CIレポート (Lint/Test) |
| テスト | 責務とテストコードを紐付け | Playwrightテスト |
この仕組みが保証するのは「宣言された責務に対応する実装単位が存在する」というトレーサビリティです。もちろん、コンポーネントの中身が空であればテストは失敗しますが、少なくとも「機能の抜け漏れ」という、最も手戻りのコストが高い問題を、開発の極めて早い段階で機械的に排除できるという事実は、シニアエンジニアとして無視できない価値があります。
エンジニアが明日から向き合うべき「問い」
最後に、我々エンジニアが自らのキャリアと実務に照らして考えるべき課題を提示します。この手法は、フロントエンド開発における「仕様のブラックボックス化」を打破する強力な武器ですが、同時に「辞書の統制」という新たなコストを要求します。Subject、Object、Verbの語彙をチーム全体で合意し、育て続けることは、DDDにおけるユビキタス言語の構築と同じく、一朝一夕には成し遂げられません。もし、あなたのチームが「とりあえず動くもの」を量産することに追われ、仕様の整合性を担保するコストを「無駄」と切り捨てているのであれば、この手法を導入する前に、まずは「なぜ我々は仕様と実装を別々の言語で書くことに甘んじているのか?」という問いを立てるべきです。
明日から取るべき具体的なアクションは、まず小規模な機能から「SOV命名規則」を適用し、コンポーネント名に責務を埋め込むことから始めることです。そして、そのコンポーネントが「どのユーザーの、どの意図のために存在するのか」をドキュメントに明記する習慣をつけましょう。AIがコードを生成する時代において、人間が担うべきは「何を作るべきか」という意図の定義と、その意図が正しく実装されているかを検証する「品質ゲートの設計」です。仕様書をExcelからYAMLへ、そしてCIの静的解析へと移行させることは、単なるツール導入ではなく、エンジニアリングの質を一段階引き上げるための構造改革です。あなたは、自分の書いたコードが「仕様書と完全に同期している」と胸を張って言えるでしょうか?その問いに対する答えが「No」であるならば、今すぐこの「責務の突合」というプロセスを、あなたの開発パイプラインに組み込むことを強く推奨します。


コメント