TRACERY Lab.(トレラボ)

TRACERY開発チームが、要件定義を中心として、システム開発で役立つ考え方や手法を紹介します。

要求の妥当性を早期に検証する〜プロトタイプ、モック、ワイヤーフレームの活用と留意点

TRACERYプロダクトマネージャーの haru です。

システム開発では、要求の妥当性を早期に検証し、関係者との認識を揃えるために、UIの構造や操作イメージを視覚的に表現し、合意形成を促進する手法が用いられます。

特に企画や要件定義フェーズでは、テキストだけでは伝わりにくい仕様の意図やユーザー体験を、ワイヤーフレームやプロトタイプなどを通じて共有し、認識のズレを減らすことが重要です。

本記事では、こうした場面で活用されるワイヤーフレーム、モック、プロトタイプの違いや、それぞれの適切な使いどころと注意点について解説します。

ワイヤーフレーム、モック、プロトタイプの違い

3つの手法の違いを下表にまとめました。

用語 概要 表現の精度 操作性 主な目的
ワイヤーフレーム (Wireframe) 画面レイアウトの構造を示す簡易図 なし 情報設計・構造の確認
モック (Mock / Mockup) デザインを反映した静的な画面の見た目見本 中〜高 なし ビジュアル確認・レビュー
プロトタイプ (Prototype) 実際に操作可能な動作付き画面 あり 操作性やユーザーフローの検証

以下にそれぞれについて説明します。

ワイヤーフレーム

ワイヤーフレームは、画面構成を簡素な線やテキストで表現した図です。色や画像、装飾などの要素は排除され、ボタンや入力欄などのUIパーツの配置や、画面遷移の流れを伝えることに特化しています。

たとえば、要件定義初期に「とりあえず画面の構成をざっくり共有したい」といった状況で有効です。細部にとらわれず、情報設計の方向性を早く確認できるのが最大の利点です。

留意点

ワイヤーフレームは見た目がシンプルなだけに、レビューが形骸化しやすい点には注意が必要です。

「あとで直せばいい」とスルーされがちですが、この時点で構造上の見落としがあると、後工程での手戻りにつながります。

モック

モックは、実際のデザインに近い静的な画面イメージです。配色、フォント、画像なども含まれ、画面がどのように見えるかを視覚的に伝えることができます。ただし、操作はできません。

特に、ビジュアルを重視する意思決定者に「完成イメージ」を伝える際に効果を発揮します。「この画面でOKですか?」という合意形成にも使われます。

留意点

モックはデザインが完成されて見えるがゆえに、「このまま動く」と誤解されるリスクもあります。設計や開発の準備が整っていない段階でモックだけが先行すると、見た目だけ進んで中身が追いつかない、という事態に陥ることもあります。

プロトタイプ

プロトタイプは、画面を実際に操作できる動作付きのモデルです。クリックで画面が遷移したり、アニメーションが動いたりと、ユーザーの操作体験を検証できる点が特徴です。

実務では、ユーザビリティテストやUXの確認に使われることが多く、動くものを通して「このUIで迷わず操作できるか」「想定した導線は機能しているか」を検証できます。

留意点

プロトタイプは動くがゆえに誤解も生まれやすく、「このまま製品として使えるだろう」と判断されることがあります。

実際には、UIだけを仮に組んだものであり、アーキテクチャやコード品質が製品基準に達していないケースがほとんどです。目的と再利用の可否を明示することが極めて重要です。

プロトタイプの取り扱いに関する事前合意の重要性

プロトタイプを開発する際は、着手前にその目的と取り扱い方について、関係者間で明確な合意を形成しておくことが不可欠です。

とくに「プロトタイプを製品コードに転用するのか」「あくまで検証用として破棄するのか」といった位置づけを曖昧にしたまま進めてしまうと、後続工程に深刻な影響を及ぼします

たとえば、開発側が短期間で仮実装を行う際、以下のような割り切りがよく見られます。

  • ビジネスロジックを本来の責務に分けず、コントローラやビューの中に直接書き込む実装*1
  • SPA構成を前提とする本番環境(例:Next.js)に対して、プロトタイプではバックエンドのテンプレート機能(例:Djangoテンプレート)のみを用い、SPAとしての分離や動的処理を省略するなど、フロントエンド技術スタックを簡略化した構成とする
  • 入力チェックやエラーハンドリングの省略

こうしたコードは「動くこと」に特化しており、品質・保守性・拡張性といった製品として求められる要件を満たしていない場合が多くあります。

それにもかかわらず、発注側が「このプロトタイプが動くなら、これをベースに製品開発できるはず」と認識してしまうと、実際の製品開発フェーズで全面的なリファクタリングやアーキテクチャの再設計が必要となり、開発コストや納期に大きな影響が出ます。

暫定コードを残したまま本番運用に突入し、技術的負債が固定化する」といったリスクも高まります。

こうした事態を防ぐためには、プロトタイプの技術的前提(再利用の可否、品質レベル、寿命など)をあらかじめ明示し、関係者と合意しておくことが重要です。

ソフトウェアエンジニアリングの名著『実践ソフトウェアエンジニアリング (第9版)』第4章では、「推奨されるプロセスモデル」として、製品化を見据えたインクリメンタルかつスパイラル型のプロトタイプ開発プロセスが解説されています。興味のある方はぜひ参照してみてください。

まとめ

ワイヤーフレーム、モック、プロトタイプは、それぞれ異なる精度・目的・操作性を持つ表現手法であり、企画や要件定義の各フェーズで使い分けることが重要です。

ワイヤーフレームは情報構造の把握に、モックは見た目の合意形成に、プロトタイプは操作感や導線の検証に向いています。

特にプロトタイプは、見た目も動きもそれらしく仕上がるため、「このまま製品に使える」と誤解されるリスクが高い点に注意が必要です。

実際には、開発スピードを優先した仮実装であることが多く、製品レベルの品質・構造を満たしていないケースも少なくありません。

近年では、AIを活用してUIコンポーネントやレイアウトを瞬時に生成できるツール(例:v0)が登場し、プロトタイプ作成は格段に容易になりました。

一方で、こうしたツールで生成されたプロトタイプは、使用されている技術スタックを共有せずに利用したり、独自デザインやビジネスロジックを組み込む際の追加コストを把握しないまま採用したりすると、完成度や開発工数に対する誤った認識を招きやすくなります。

こうした誤解を防ぐには、プロトタイプの目的、寿命、再利用の可否といった前提条件を、開発着手前に関係者間で明確に合意しておくことが不可欠です。

「何のために」「どこまで作り」「どこまで使うか」を明確にすることが、プロジェクト全体の品質と効率に直結します。

この記事を書いた人
haru

佐藤治夫。株式会社ビープラウド代表取締役社長。TRACERYのプロダクトマネージャー。エンジニアとして活動を始めて以来、モデリングを中心としたソフトウェアエンジニアリングを実践している。Xアカウント: https://x.com/haru860

*1:エンタープライズアプリケーションアーキテクチャパターンでは、トランザクションスクリプトというパターンで紹介されています。

要件定義とデータベース設計

シリーズ: 要件定義とはそもそも何か

TRACERYプロダクトマネージャーの haru です。

システムとは、ヒト・モノ・カネ・情報といった経営資源が有機的に連携し、共通の目的に向かって動く仕組みです*1

ソフトウェアはこの連携を処理の振る舞いとして実装し、システム内でのやり取りをデータとして記録します。

したがって、データモデル*2を確認すれば、そのシステムがどのような情報を扱い、どの情報同士が結びつき、何を中核として業務が構成されているのかが明確になります

構造に一貫性がなく複雑なデータベースは、開発者が仕様を把握しにくく、テーブルの選定やデータ処理の記述に迷いが生じやすくなるため、結果として開発生産性の低下につながります。

データベースの整合性が考慮されていない設計では、矛盾や欠落を含んだデータが蓄積されやすくなり、システムの誤動作や業務判断の誤りといった重大なリスクを招くおそれがあります。

そのため、システムを効率よく開発し、安定的かつ持続的に運用していくには、構造が明確で、意味や整合性に優れたデータベース設計が不可欠です。

本記事では、データベース設計の進め方と、要件定義の成果物をどのように設計へ反映するかを解説します*3

アプリケーションとデータベースで異なる設計視点

オブジェクト指向でアプリケーションを開発する場合、システムが扱うデータの構造や関係は、クラスとして設計されます*4

クラス図とデータベース設計に用いられることが多いER図は構造がよく似ているため、「クラス図(ドメインモデル)があれば、あえてデータベース設計を行う必要はないのではないか」と考えられがちです。

しかし、アプリケーションとデータベースでは、データに対する役割や設計上の関心が根本的に異なります。

アプリケーションの関心事は「データをどう処理するか」(入力検証、業務ロジック、画面反映など)です。

一方で、データベースの関心事は「データをどう保存し、矛盾なく維持するか」(永続化*5と構造的整合性)です。

アプリケーション側のバリデーションに不備があれば誤った値がそのまま永続化される恐れがあります。また、システム障害時などにSQLで直接データパッチを適用した場合、不整合なデータが登録・更新されるリスクもあります。

そのようなリスクを避けるため、データベース側でも、主キー・外部キー・一意制約・NOT NULL などを設けて整合性を保証し、データ品質を担保する必要があります

性能に関しても、アプリケーションとデータベースでは設計の視点が異なります。

アプリケーションは、ユーザー操作への応答性や画面遷移の体感速度など、処理の流れとタイミングに着目します。

一方、データベースは、大量データの検索・集計を高速化するために、インデックスの設計や正規化・非正規化のバランス、クエリの実行計画などに注目します。

データベース設計の不備は、システム全体に影響を及ぼす

データベース設計の不備は、システムのあらゆる側面に波及します。

データの整合性が崩れ、処理が正しく行えなくなるだけでなく、開発の手戻りや運用中の性能問題といった形で表面化することもあります。

こうした事態を防ぐには、アプリケーションとは異なる観点から、データ構造や制約をあらかじめ設計し、システム全体の堅牢性を確保しておくことが重要です。

以下では、データベース設計の不備が引き起こす代表的な問題とその影響について説明します。

データの不整合が発生し、安定したサービスの提供が難しくなる

データの整合性はシステムが健全に動作するための土台です。データの整合性が崩れると、システム全体が論理的に破綻してしまいます。

たとえば、データの重複想定外の値関連性の欠如といった不整合があると、処理の前提が崩れ、意図通りに機能しなくなります。

その結果、各所で不具合が発生し、安定したサービスの提供が難しくなります。

ソフトウェア開発の生産性と品質が低下する

データの意味や関係があいまいなままだと、開発者は実装のたびに「どのテーブルを参照すべきか」「この項目の用途は何か」を毎回調べて判断する必要があります。

設計の意図が共有されていないことで、開発者ごとに異なる解釈で実装が進み、その結果、統一感のないコード設計方針とずれた構造が生まれやすくなります。

こうした状態では、保守や機能追加のたびに意図の確認や修正に時間がかかり、手戻りによって開発スピードと品質が損なわれます。

運用後に性能劣化が表面化し、改修コストが増大する

正規化の不備やインデックスの不足は、当初は見過ごされがちですが、運用が始まるとレスポンスの悪化バッチ処理の遅延といった深刻な性能問題として顕在化します。

運用後にインデックスを追加する場合は、本番環境への影響を避けるために、リリースのタイミングや適用手順を慎重に調整する必要があります。

インデックスの追加だけでは対応しきれないケースでは、テーブル構造そのものの見直しが必要になることもあります。

その変更はアプリケーション全体に波及し、大規模な修正コストとリスクを伴います。

要件定義の成果物とデータベース設計の連携

では、こうした観点を踏まえて、実際にどのようにデータベース設計を進めていけばよいのでしょうか。

機能要件とデータベース設計の連携

要件定義とクラス設計 - TRACERY Lab.(トレラボ)で説明したように、要件定義で作成された機能要件に関する成果物(概念モデル、機能要件の記述、状態遷移図)は、クラス設計に反映されます。そして、そのクラス設計をもとにデータベースの構造が設計されていきます(下図)。

要件定義で作成された機能要件の成果物は、クラス設計を通じてデータベース設計へと反映される

このように、機能要件はデータベース設計に直接現れるわけではありませんが、クラス設計を介して間接的に関係しています。そのため、機能要件の意図が正しくデータベースにまで反映されているかを確認することが重要です。

とくに、テーブル構造や属性の有無、リレーションの設計が、業務のルールと整合しているかどうかは、データベース設計で丁寧に見直す必要があります。

クラス図からテーブル構造への変換と設計上の注意点

クラス設計をもとにテーブルを設計する場合、多くのケースでクラスとテーブルは1対1で対応し、クラスの属性はテーブルのカラム、クラス間の関連はテーブル間のリレーション(外部キー)としてマッピングされます。

以下は、要件定義とクラス設計 - TRACERY Lab.(トレラボ)で取り上げたクラス図をもとに、データベース設計へとマッピングした例です。

クラス図からテーブルへのマッピング(一部)

クラスからテーブルへのマッピング(全体)

このように、クラス図は一見、そのままテーブル定義に変換できるように見えます。

しかし、クラス図の構造をそのまま写し取っただけでは、パフォーマンスを確保するための適切な永続化が行えない場合があります。

その背景には、クラスでは柔軟に扱える複雑な構造も、表形式のリレーショナルデータベースではそのままでは表現できず、構造を分割したり関係を明示したりする設計上の工夫が必要になる点があります。

以下の表に、クラス設計とデータベース設計における永続化の観点での主な違いをまとめました。

観点 クラス設計 データベース設計
多対多の関係の表現 コレクション型(ListSetなど)で自然に表現可能 中間テーブルを明示的に設計・管理する必要がある
柔軟な構造の表現(配列・Map・ネストなど) 言語機能で柔軟に表現可能 表形式に合わせた分割、正規化、またはJSON列などの対応が必要
ネストの参照・参照チェイン*6 オブジェクト参照でスムーズにアクセスできる 複数テーブルのJOINやネストされたクエリが必要になり、性能や可読性が低下しない設計が必要
継承構造の表現 クラスの継承関係を言語機能で直接定義・再利用できる 単一テーブル継承、クラスごとのテーブル分割、親子テーブルの結合型など複数の方式があり、選択と実装に工夫が必要

このミスマッチを理解せずにクラス設計をそのままデータベースに反映すると、正規化されていないテーブル、複雑なJOINの乱用、整合性を欠いた設計などが生じ、データ構造の破綻や保守性の低下、性能劣化、データ品質の不安定化といった深刻な問題を引き起こします

リリース初期は問題なく動作していても、後から構造的な欠陥が表面化するリスクは高くなります。

したがって、クラス設計とデータベース設計の役割や前提の違いを正しく理解し、それぞれの責務に応じて設計を調整・補強する必要があります。

コラム:データベース設計からアプリケーション設計を進めるアプローチ

前の節では、クラス設計を起点にデータベース設計へ展開する方法を解説しました。

これとは逆に、データベースを先に設計し、その後でアプリケーションを組み立てる手法もあります。これは DOA(Data Oriented Approach:データ中心アプローチ) と呼ばれ、設計上の有力な選択肢です。

一方、クラス(オブジェクト)を出発点に設計を進める手法は OOA(Object‑Oriented Approach:オブジェクト指向アプローチ) と呼ばれます。

DOA と OOA の詳細な比較は一記事では扱いきれないため、別の記事で説明します。

非機能要件とデータベース設計の連携

非機能要件は下図*7に示す要素で構成されます。

データベース設計では、これらの非機能要件のうち、データ品質性能効率セキュリティ保守性に着目します。

非機能要件の一覧

データ品質とデータベース設計

データ品質は ISO/IEC 25012:2008 *8において、「妥当性」「一貫性」「信頼性」「正確性」など12のサブ特性に分類されています。概要を次の表に示します。

特性名 説明
正確性(Accuracy) データが事実と一致しているか
完全性(Completeness) 必要なデータが欠けていないか
一貫性(Consistency) データ間に矛盾がないか
信憑性(Credibility) データの出所が正当か。改ざんされていないか
最新性(Currentness) データが最新か
アクセシビリティ(Accessibility) データが誰でも使用できるものになっているか
標準適合性(Compliance) データの書式は標準に準拠しているか。使用している文字セットは正しいか。選択項目に、指定された選択肢以外のデータが入っていないか。
機密性(Confidentiality) データが許可された人だけに開示されているか
効率性(Efficiency) データが冗長でなく、必要な処理に適したフォーマットになっているか
精度(Precision) データが必要な精度(桁数や単位)で記録されているか
追跡可能性(Traceability) データの由来や変更履歴をたどることができるか
理解性(Understandability) データの意味や構造がユーザーにとって分かりやすいか
可用性(Availability) 必要なときにデータが利用可能な状態にあるか
移植性(Portability) データが他の環境やシステムに移行しやすいか
回復性(Recoverability) データ損失や障害発生時に迅速に復旧できるか

以下の表は、各サブ特性をデータベース設計に落とし込む際の具体策をまとめたものです。

これらの観点はクラス図(ドメインモデル)には表れにくく、設計段階で見落とされやすいポイントです。システムの特性や運用条件を踏まえ、必要な制約と構造を確実に組み込む必要があります。

これらの観点を設計段階で取り入れることで、データの正確性と安全性を高め、将来の機能追加や分析業務にも柔軟に対応できるデータ基盤を構築できます。

サブ特性 データベース設計での反映例
正確性(Accuracy) 入力値に対する制約(例:CHECK制約)、正規化による意味の明確化
完全性(Completeness) NOT NULL制約、外部キーによるリレーションの存在保証
一貫性(Consistency) 外部キー制約、トランザクション制御(ACID特性)
信憑性(Credibility) データ出所を格納するカラムの用意、改ざん検知用のハッシュ値をデータに保持する。
最新性(Currentness) データの更新時刻を記録するカラムを設け、最新データのみを識別・抽出できるように設計する
アクセシビリティ(Accessibility) 多様な利用者や支援技術に配慮し、文字コードの統一や、わかりやすく機械可読な項目設計を行う
標準適合性(Compliance) 形式や値が標準ルールに従うよう、文字コード・日付・コード体系を統一して設計する
機密性(Confidentiality) アクセス制御(GRANT/REVOKE)、テーブル単位の権限設定
効率性(Efficiency) データが無駄に重複せず、必要以上に肥大化せず、用途に応じて処理しやすい構造や粒度で格納されるように設計する
精度(Precision) 数値や日時の桁数指定、FLOAT vs DECIMALの使い分け
追跡可能性(Traceability) ログテーブルの設計、履歴テーブル(*_history)の導入
理解性(Understandability) 命名規則の統一、コメント定義の活用、ER図の作成
可用性(Availability) 冗長構成(レプリケーション)、バックアップポリシーの設計
移植性(Portability) データ形式や値の表現が特定システムに依存せず、他環境でも意味や構造が保たれるように設計する
回復性(Recoverability) バックアップ設計、トランザクションログの活用、障害復旧シナリオの準備
性能効率とデータベース設計

非機能要件(性能効率)

性能効率に関する性能要件には、たとえば「検索結果を3秒以内に返す」「1秒あたり100件の書き込みを処理する」といった具体的な数値指標が設定されるのが一般的です。これらの要件を満たすためには、アプリケーションコードの最適化に加え、データベースの構造自体にも十分な配慮が求められます。

まず重要なのは、アクセス頻度の高いデータをどのように配置し、どのようにインデックスを設計するかという点です。

たとえば、検索条件に頻繁に使われるカラムに対して適切なインデックスが設定されていなければ、どれだけアプリケーション側の処理が高速であっても、レスポンス全体は遅くなってしまいます。

また、データの正規化と非正規化のバランスも性能に大きく影響します。

正規化によって冗長なデータを排除することはデータの整合性を保つうえで有効ですが、過度な正規化は結合処理の増加を招き、パフォーマンスを劣化させる要因にもなります。

性能要件が厳しいケースでは、非正規化を取り入れて冗長性を許容しつつ、読み取りの高速化を優先する判断も必要です。

さらに、データのライフサイクルを考慮した設計も欠かせません。古いデータをアーカイブする、あるいはアクセス頻度の低いデータを別テーブルに分離することで、実運用時のパフォーマンスを維持しやすくなります。

このように、性能要件を満たすためには、単にデータベースを「正しく」設計するだけでなく、「現実の使われ方」を想定したうえで最適化する視点が求められます。

セキュリティとデータベース設計

非機能要件(セキュリティ)

データベースはもっとも攻撃対象となりやすい部分のひとつです。

とくに、個人情報や認証情報といった機密性の高いデータを扱う場合、その漏えいが事業に与えるダメージは計り知れません。

こうしたリスクに備えるには、アプリケーションレイヤーの対策だけでなく、データベース設計そのものにセキュリティの視点を織り込むことが欠かせません。

まず代表的な対策として、ユーザーのパスワードをハッシュ化して保存する方法があります。

また、単なるハッシュ関数だけでなく、ソルトやストレッチング(PBKDF2、bcrypt、Argon2 など)を組み合わせることで、辞書攻撃や総当たり攻撃への耐性を高めることができます。

一方で、パスワード以外の機密情報、たとえばクレジットカード番号やマイナンバーといった「復号が必要なデータ」については、暗号化処理が求められます。

暗号鍵の管理や鍵のローテーションも含めた設計が重要であり、アプリケーション側の責務とデータベース側の責務を明確に切り分ける必要があります。

さらに、データベース全体を対象とした「透過的暗号化(TDE)」は、物理媒体の盗難やディスクイメージの不正取得といった低レイヤの攻撃に備える有効な手段です。

ファイルシステムレベルで暗号化されるため、アプリケーションには変更を加えずにセキュリティを強化できます。

このように、セキュリティとデータベース設計は切っても切り離せない関係にあります。

「暗号化していれば安全」という単純な話ではなく、何を守るべきか・誰から守るべきかを明確にした上で、設計・実装の段階からセキュリティを組み込む姿勢が求められます。

保守性とデータベース設計

非機能要件(保守性)

テーブル名やカラム名の意味が不明瞭だったり、似たような情報が複数の場所に散らばっていたりすると、改修や運用のたびに設計の意図を探る作業が必要になり、保守にかかる負荷が増していきます。

こうした状況の多くは、設計時の命名や構造に対する配慮が不足していることに起因しています。

特に命名は、設計の意図を他の開発者に伝えるための基本的なインターフェースです。たとえば、uidref_no のような略称が使われていると、その意味や用途を都度確認する必要が生じます。

一方で、user_idreference_number のように明確で一貫性のある名前であれば、スキーマ全体の理解が容易になり、保守作業のスピードと正確性が向上します。

構造面でも、用途の異なるデータをひとつのテーブルに詰め込んでいたり、結合関係が過剰に複雑化していたりすると、影響範囲の見通しが立ちにくくなります。

こうした構造は、変更のたびに予期しない不具合を引き起こしやすく、結果として改修コストを高めてしまいます。

このように、命名と構造のわかりやすさは、初期実装の効率だけでなく、長期的な運用・改修における安定性や生産性を大きく左右します

まとめ

下図に、要件定義の成果物とデータベース設計の関係をまとめました。

要件定義の成果物とデータベース設計の関係

本記事では、クラス設計とデータベース設計の関係を踏まえ、信頼性の高いデータベースを構築するための基本的な考え方を解説しました。

アプリケーションと同様に、データベースにも独立した責務と視点が求められます。

クラス設計をそのままテーブル定義へ写し取るだけでは、パフォーマンスを確保するための適切な永続化が行えない場合があります。

さらに、データベース設計は構造だけでなく、非機能要件を満たす必要があります。

設計段階で「データをどう扱い、どう守るか」を意識することで、運用後の改修コストを抑え、システムの保守性と信頼性を高められます。

データは企業の重要な資産です。この資産を最大限に活用し、事業の成長を支えるシステムを実現するためにも、アプリケーション設計と並行してデータベース設計にも十分な時間と工夫を注ぎましょう。

次回は、要件定義と画面設計の関係について説明します。

tracery.jp

この記事を書いた人
haru

佐藤治夫。株式会社ビープラウド代表取締役社長。TRACERYのプロダクトマネージャー。エンジニアとして活動を始めて以来、モデリングを中心としたソフトウェアエンジニアリングを実践している。Xアカウント: https://x.com/haru860

*1: システム開発におけるシステムとは何か - TRACERY Lab.(トレラボ)を参照のこと。

*2:システムで扱う情報(データ)の種類や構造、およびデータ同士の関係性を整理・定義した設計図のこと。たとえば「顧客」「注文」「商品」といった情報が、どのような属性を持ち、どのように関連し合うかを表現する。

*3:システム開発で最も一般的に使用されているリレーショナルデータベースを前提に説明する。

*4: シリーズ前回の記事、要件定義とクラス設計 - TRACERY Lab.(トレラボ)を参照のこと。

*5:アプリケーションが扱うオブジェクトの状態は実行中だけでなく、最終的にデータベースへ保存される。この保存処理を「永続化」と呼ぶ。

*6:オブジェクトやテーブルなどが複数の中間要素を介して間接的に参照し合っている状態

*7:図は(REBOK(Requirements Engineering Body Of Knowledge:要求工学知識体系)の「1.3 機能要求と非機能要求」をもとに筆者が作成。

*8:ISO/IEC 25000シリーズの1企画。ISO/IEC 25000シリーズは、ソフトウェア製品の品質を評価・管理するための国際規格群であり、品質要求や評価手法に関する一連の基準を体系的に定めたもの。ISO/IEC 25012は、データ品質を評価・管理するための国際規格。JISではJIS X 25012:2013として規格化されている。データ品質のチェックポイントの参考資料:デジタル庁が作成したデータ品質管理ガイドブック

要件定義とクラス設計

シリーズ: 要件定義とはそもそも何か

TRACERYプロダクトマネージャーの haru です。

ソフトウェア開発では、異なる役割を持つ処理を組み合わせてアプリケーションを構築します。

たとえば「金額の計算」「データの保存」「画面への表示」「入力チェック」「ログの記録」「セキュリティチェック」などです。

これらの処理を行うプログラムがすべて一つのソースコードに詰め込まれていたら、どうなるでしょうか。ある機能を修正しただけで、まったく関係のない機能に不具合が発生したり、テストに想定外の工数がかかったりするなど、不安定な状態に陥ってしまいます。

このような状態を解消するための設計原則が、「関心事の分離」と「高凝集」です。

どちらも、複雑なシステムを理解しやすく、変更しやすいものにするための重要な指針です。

本記事ではまず、なぜこれらの概念が重要なのか、解説します。

そのうえで、「関心事の分離」と「高凝集」を実現する具体的な設計手法として「オブジェクト指向設計」を取り上げ、とくにその中核をなす「クラス設計」の考え方を紹介します。

クラス設計をクラス図として表現することで、ソフトウェア全体の構造と責務の関係性を俯瞰しやすくなり、設計上の抜けや重複を早期に発見しやすくなります

さらに、クラス設計が要件定義の成果物とどのように連携し、設計に落とし込まれていくのか、という視点についても具体的に解説します。

関心事の分離と高凝集

ソフトウェアにおいて、「関心事」とは、ソフトウェアを設計・開発・運用する際に、それぞれの関係者が注目し、配慮すべき対象や視点のことです。

たとえば、「保存」「表示」「入力チェック」は、それぞれ独立した関心事です。本来は別々に扱うべきものが同じコード上に混在していると、コードの見通しが悪くなり、変更もテストも困難になります。

この問題を解決するための設計原則が「関心事の分離」です。関心事ごとにコードを分けておけば、ある処理を変更しても他の処理には影響が及びにくくなります。

高凝集」は、密接に関連する処理やデータを、ひとつのまとまりとして構成する設計方針です。

たとえば、ユーザー情報の管理に関する処理(登録、更新、バリデーションなど)を分散させず、同じ場所に集約することで、「責務」が明確になり、コード全体の一貫性が保たれます。

このように、関心事の分離と高凝集を両立させることで、コードの整合性が保ちやすくなり、理解・修正・再利用のしやすさが飛躍的に高まります。

ソフトウェアの関心事には何があるか

ソフトウェア*1の関心事は以下のように、大きくわけて、機能的な関心事と非機能的な関心事に分かれます。

機能的な関心事

ソフトウェアの本来の目的振る舞いに関することがらです。主に「機能要件」に対応します。

関心事 説明
振る舞い 処理ロジック、処理フロー、アルゴリズムなど
データ 入出力データ、永続化データ、スキーマ、整合性ルールなど
状態 アプリケーションやコンポーネントの一時的な状態。UIの現在位置、ステータス値など
ユーザーとのやりとり 入力フォーム、画面表示、ユーザーフィードバック、操作フローなど、利用者とのインターフェースに関わる要素
エラー・例外処理 想定外入力の処理、リカバリ処理など

非機能的な関心事

機能そのものではなく、「どのように機能するか」に関することがらです。主に「非機能要件」に対応します。

実行時・関心事

どう動作させるか、どれくらい良く動くかという非機能要件や運用時の制約に関わる関心事です。ユーザー体験やシステムの信頼性に影響します。

関心事 説明
タイミング イベント駆動、スケジューリング、非同期処理、リアルタイム性など
パフォーマンス 応答速度、処理量、並列処理、キャッシュなど
可用性・スケーラビリティ 障害時の回復、負荷対応、冗長化など
横断的関心事

ソフトウェア全体の機能や構造にまたがって現れる共通的・非局所的な関心事です。

関心事 説明
ロギング 各所で必要になるがロジックと混ざりがち。AOPやミドルウェアで分離可能。
セキュリティ 認証・認可、暗号化、データ保護など。複数レイヤにまたがる。
トランザクション DBや他サービスとの一貫性確保のための仕組み。
設定・構成 実行環境による振る舞いの切替(configファイル、環境変数など)

非機能的な関心事の多くは、フレームワークやライブラリ、ミドルウェアなどの仕組みを活用することで効果的に対応できます。

一方で、ビジネスロジックをはじめとする機能的な関心事は、アプリケーション開発者が自らの手でコードとして具体的に実装していく必要があります。

関心事の分離と高凝集を実現するオブジェクト指向設計

関心事を分け、責務ごとにまとめる」という考え方を、特に機能的な関心事の整理において効果的に実現できる手法が「オブジェクト指向設計」です。

オブジェクト指向設計では「クラス」や「属性」「メソッド」という構成要素を使って、処理やデータ、状態などの関心事を整理・分離します。

たとえば、顧客に関する情報を扱う場合、データ(名前、住所など)とそれに関する処理(登録、更新など)を「顧客」クラスとしてひとつにまとめます。

「顧客に関するロジックはこのクラスに書く」といった構造が明確になり、保守性や再利用性が格段に高まります。

このように、関心事ごとにコードを構造化できる点が、オブジェクト指向設計の大きな強みです。

下表では、ソフトウェアにおける主要な機能的な関心事と、それに対応するオブジェクト指向設計の構造を対応づけて示しています。

機能的な関心事 説明 オブジェクト指向設計との対応
振る舞い 処理ロジック、処理フロー、アルゴリズムなど メソッドとして定義し、責務を持った処理単位として表現
データ 入出力データ、永続化データ、スキーマ、整合性ルールなど 属性としてクラスに内包し、データ構造と整合性のルールを保持
状態 アプリケーションやコンポーネントの一時的な状態。UIの現在位置、ステータス値など オブジェクトの内部状態として管理し、状態遷移も含めて設計対象とする
ユーザーとのやりとり 入力フォーム、画面表示、ユーザーフィードバック、操作フローなど、利用者とのインターフェースに関わる要素 UI部品をオブジェクト化し、ユーザー操作に応じてメソッドを呼び出す。UIと業務ロジックを分離するためにMVC等のパターンを活用
エラー・例外処理 想定外入力の処理、リカバリ処理など 例外クラスによりエラーの種類を明示し、ポリモーフィズムで柔軟に対応。共通のインターフェースを通じて例外処理を統一的に扱う

このように、オブジェクト指向設計は「関心事の整理」に非常に有効な設計手法です。

「どこに何を書くか迷わない」「変更の影響範囲が小さい」「再利用しやすい」といった保守性の高いソフトウェアの背後には、ほぼ例外なく、関心事を適切に分離した設計が存在します。

オブジェクト指向設計は、こうした設計を実現するための重要な指針となります。

要件定義の成果物とオブジェクト指向設計の連携

概念モデルからクラスと属性を抽出する

クラスを設計する際のベースとなるのは、要件定義の成果物である「概念モデル」です(下図)*2

概念モデル

概念モデルは、クラスやその関連を用いて構造化されているため、その構造をそのままクラス図に展開できます。

概念モデルに、既に属性が定義されている場合は、クラスの属性として抽出します。

このとき、クラス同士の関連*3も含めて、どのクラスがどのように他のクラスと関係しているかを明確に定義します。

概念モデルから作成したクラス図

クラス図は、ソースコードと構造的に一致するため、クラス名や属性名は英語で記述するのが適切です。実際のコードは英語で書かれることが多く、図とコードの表記が一致していると実装しやすくなります。

また、クラス図とコードは相互に変換可能な関係にあるため、コードを先に書いてツールで図を生成する方法も一般的です。どちらを先に作るかは、設計の進め方やチームの慣習に応じて選んでください。

機能要件からクラスと属性を抽出する

要件定義の成果物である「機能要件」に含まれる名詞を分析することで、クラスや属性を抽出できます。

たとえば下図の例では、顧客クラスに対応する属性として、氏名、メールアドレス、パスワード、配送先住所などが挙げられます。

配送先住所は、1人の顧客が複数登録する可能性があるため、顧客クラスとは別に「配送先住所クラス(ShippingAddress)」として切り出すのが適切です。

機能要件の名詞に着目して、クラスと属性を抽出する

ロバストネス図からメソッドを抽出する

要件定義の成果物である「ロバストネス図*4」のコントロールオブジェクト名をもとにクラスのメソッドを抽出できます。

DailySalesSummaryクラスのメソッドとして以下のように定義します(下図の赤字)。

コントロールオブジェクト クラス メソッド
売上データ集計 DailySalesSummary aggregate
売上データ抽出 DailySalesSummary get
売上レポートPDF出力 DailySalesSummary generate_sales_report

ロバストネス図からメソッドを抽出する

状態遷移図から属性とメソッドを抽出する

オブジェクトの状態遷移からも、クラスの属性とメソッドを抽出できます。

例えば「注文」の場合、「申込済」「入金済」「キャンセル」「発送済」の状態が考えられます。

このように、状態遷移があるようなソフトウェアを開発する際は、要件定義の段階で「状態遷移図」を作成しておくとよいでしょう。

状態遷移図とは、オブジェクトが取り得る状態と、それらの間を移動する条件やイベントを整理した図です。

下図は注文の状態遷移を示した状態遷移図です。

状態遷移図

以下のように、状態遷移図で整理した内容をもとに、状態を属性として保持し、状態を変更するためのイベントをメソッドとしてクラスに定義します。

状態遷移図の要素 クラス 属性 / メソッド
注文状態 Order status属性
入金を確認する Order confirm_paymentメソッド
配送する Order ship_orderメソッド
注文をキャンセルする Order cancel_orderメソッド

状態遷移図からクラスの属性とメソッドを抽出する

オブジェクトの状態は、そのインスタンスが持つ属性を、専用のメソッドで更新することで管理します。これにより、状態の変更を制御しやすくなり、不正な遷移や処理の漏れを防ぐことができます。

たとえば「注文クラス(Order)」の場合、注文の状態は「status」属性で表現され、これを変更するためのメソッドとして、以下のような設計が考えられます。

  • confirm_payment() メソッド:支払いの確認を行い、状態を 「申込済」から 「入金済」へ遷移させる
  • ship_order() メソッド:商品の発送処理を行い、状態を 「入金済」から「発送済」へ遷移させる

このように、状態の遷移を明示的なメソッドに集約することで、業務ルールとコードの整合性が保たれ、設計の意図が明確になります。

クラス設計のさらなる洗練

ここまで設計してきたクラス図を下図に示します。

設計したクラス図

設計は一度して終わりではありません。

ここまでの説明では、メソッドや属性をある程度機械的にマッピングしましたが、それは設計の出発点にすぎません。設計を深めていく中で、業務の本質をより的確にとらえた構造を見出し、モデルを洗練させていくことが重要です。

そのためのヒントとして、ドメイン駆動設計(DDD:Domain Driven Design)の考え方が有効です。DDDでは、業務の意味をコードで正確に表現することに価値を置きます。

たとえば、金額をただの「int」で扱うのではなく、通貨単位や計算処理、範囲チェックなどを内包した 「Money」 クラスとして定義したりします。

このような「値オブジェクト(Value Object)」を使うことで、コードは業務の意図を自然に表現できるようになります。

型そのものがビジネスルールを語るようになり、バリデーションやロジックの重複も防げます。

同様に、注文のステータスを単なる 「Enum(列挙型)」 で済ませるのではなく、「OrderStatus」という専用クラスにして、状態遷移のルールや表示文言の管理を一元化する設計も考えられます。

このように、プリミティブ型のままでは埋もれてしまう業務知識を「型」として定義することで、業務の用語やビジネスルールがモデルの構造に明示的に表れるようになります。

その結果、クラス図は単なる技術的な構造図ではなく、業務のしくみや判断基準が読み取れる「業務理解の地図」として機能するようになります。

画面やDBの処理はドメインモデルから切り離す

ここまで説明してきたクラス群は、事業や業務の構造やルール、振る舞い(たとえば業務処理における判断やアクション)をソフトウェア上で表現したものであり、これをドメインモデルと呼びます。

ドメインモデルは、業務の意味を反映したクラス(エンティティや値)やその振る舞いを明示的に設計することで、ソフトウェアが業務と整合したかたちで動作する基盤をつくります。

一方で、画面表示やデータベースへの保存といった入出力処理に関わる要素は、ドメインモデルとは異なる関心を持つため、ドメインモデルから切り離して設計することが重要です。

たとえば、画面表示用の構造や、DBとの直接やり取りを担う処理をドメインのクラスに含めてしまうと、業務ロジックと技術的な詳細が混在し、コードの見通しが悪くなります。

責務を明確に分離し、ドメインモデルを業務に特化した純粋なモデルとして保つことで、構造が整理され、変更への追従や再利用も容易になります。

レイヤーの分離方針については、DDDのアーキテクチャなどを参考にしながら、どこまでレイヤーを分割するか、また各レイヤーにどのような責務を持たせるかを、プロジェクトの規模や複雑性、将来的な拡張要件などに応じて適切に判断するとよいでしょう。

レイヤーについては、前回の記事( 要件定義とソフトウェアアーキテクチャ設計 - TRACERY Lab.(トレラボ))の「コンポーネント構成の設計」を参照してください。

まとめ

下図に、要件定義の成果物とクラス設計の関係をまとめました。

要件定義の成果物とクラス設計の関係

ソフトウェア設計の根本にあるのは、「関心事を見極め、密接に関連する処理やデータを、ひとつのまとまりとして構成する」というシンプルな考え方です。

関心事の分離と高凝集は、設計の基盤となる原則であり、複雑さを制御し、理解しやすく壊れにくい構造を実現します。

この設計の思想は、要件定義の段階から始まっています。

要件を洗い出す際に、設計に必要な情報を見据え、関心事を意識して構造化しておくことで、後工程の設計作業をスムーズに進めることができます。

次回は、データベース設計について解説します。

tracery.jp

この記事を書いた人
haru

佐藤治夫。株式会社ビープラウド代表取締役社長。TRACERYのプロダクトマネージャー。エンジニアとして活動を始めて以来、モデリングを中心としたソフトウェアエンジニアリングを実践している。Xアカウント: https://x.com/haru860

*1:ソフトウェアには、OSなどの基本ソフトウェア,ミドルウェア、アプリケーションソフトウェアなどの種類があるが、ここではアプリケーションソフトウェアのことを指す

*2: システム要件定義の成果物〜設計へのインプットを作成する - TRACERY Lab.(トレラボ)の「概念モデル」を参照のこと

*3:1対1、1対多、多対多など

*4: ユースケースとロバストネス図によるシステム要件定義 - TRACERY Lab.(トレラボ)の「ロバストネス図によるシステムを構成する要素の抽出」を参照のこと

要件定義とソフトウェアアーキテクチャ設計

シリーズ: 要件定義とはそもそも何か

TRACERYプロダクトマネージャーの haru です。

設計プロセスでは、要件定義で作成された成果物をもとに、各種の設計が進められます。

そのため、設計プロセスの流れや観点を理解しておくことで、「どのような情報を、どの粒度で要件としてまとめるべきか」が明確になり、要件定義の成果物の実用性や完成度が大きく向上します

設計プロセスについて、たとえば、以下のような観点を押さえておくことが重要です。

  • どのような成果物を作るのか
  • 要件定義で作成した情報をどのように活用するのか

システム開発における設計プロセスは、主に次の6つの設計項目に分類できます。

  • ソフトウェアアーキテクチャ設計:ソフトウェアの構造を決定する
  • クラス設計・データベース設計:プログラム内部の構造やデータの持ち方を定義する
  • 画面設計:ユーザーが操作する画面の構成や遷移を設計する
  • API設計:システムやソフトウェア同士がやり取りするインターフェースを定義する
  • バッチ処理設計:定期的または大量に行う処理の流れや仕様を設計する
  • 運用設計:システム稼働後の監視や障害対応、保守作業見据えて設計する

本記事から数回に分けて、上記の設計項目の内容と要件定義の成果物との関係性を解説します。今回は、ソフトウェアアーキテクチャ設計を取り上げ、説明します。

システムアーキテクチャとソフトウェアアーキテクチャの関係

システム開発におけるアーキテクチャ設計は、後工程の設計方針や実装、さらには運用や保守の効率性にまで大きな影響を与える、極めて重要な工程です。

本題のソフトウェアアーキテクチャの説明に入る前に、システムアーキテクチャ*1とソフトウェアアーキテクチャの違いを明確にしておきます。

  • システムアーキテクチャ
     使用するプラットフォーム*2、サーバーやネットワーク機器などのハードウェア構成、WebサーバーやDBサーバーなどのミドルウェアやアプリケーションソフトウェアの配置構成、外部システムとの接続などを含めた、システム全体の仕組みを設計する。たとえば、どの機能をどのサーバーに配置するか、ネットワークはどう分離するかといった判断が該当する。

  • ソフトウェアアーキテクチャ
     アプリケーション単位での構造を設計する。コンポーネント間の連携方法、モジュールの分割など、ソフトウェア内部の設計が中心。

システム・アーキテクチャとソフトウェア・アーキテクチャの関係

システムアーキテクチャは「全体をどう構成するか」を決める視点であり、ソフトウェアアーキテクチャは「各アプリケーションをどう作るか」に焦点を当てた設計です。

クライアント側とサーバー側でそれぞれ異なるアプリケーションを開発する場合、それぞれソフトウェアアーキテクチャを設計します。

ソフトウェアアーキテクチャの設計内容

ソフトウェアアーキテクチャの設計は、主に以下の2つの観点から設計を進めます。

  • コンポーネント構成の設計 :アプリケーションをどのような層や機能単位に分け、どう連携させるか
  • モジュール構成の設計 :コードレベルでの機能分割やファイル構成をどう設計するか

コンポーネント構成の設計

アプリケーション全体をどのような層(レイヤー)に分割し、各コンポーネントがどのように依存・連携するかを設計します。

将来の変更の容易性を高め、テストしやすい構造をつくるうえで重要です。

代表的なアーキテクチャパターンには以下があります。

  • MVC(Model-View-Controller)
     UI、ビジネスロジック、データ処理を分離し、役割を明確にする。小規模〜中規模のWebアプリでよく使われる。

  • レイヤードアーキテクチャ
     プレゼンテーション層、アプリケーション層、ドメイン層、インフラ層などに分け、機能を階層構造で整理する。企業システムや業務系アプリで広く採用される。

  • ヘキサゴナルアーキテクチャ(Ports and Adapters)
     アプリケーションの中核を外部(DB、UI、APIなど)から切り離し、疎結合な接続を実現する。再利用性が高く、テストにも強い構造。

  • オニオンアーキテクチャ
     ドメインモデルを中心に配置し、その外側にアプリケーション層やインフラ層を重ねた同心円状の構造を持つ。内側ほど抽象度が高く、外側ほど具体的な技術に依存する。変更や拡張に強く、柔軟な構造。

  • クリーンアーキテクチャ
     ビジネスロジックを中心に据え、外部の技術に依存しない構造を実現する。大規模開発や長期運用を見据えた設計に有効。

下図は、レイヤードアーキテクチャ*3の例です(引用元: 新卒にも伝わるドメイン駆動設計のアーキテクチャ説明(オニオンアーキテクチャ)[DDD] - little hands' lab)。

レイヤードアーキテクチャの例

参考書籍

ソフトウェアアーキテクチャにおけるコンポーネント構成の設計についてさらに深く理解したい方は、以下の書籍を参考にするとよいでしょう。

モジュール構成の設計

モジュール構成では、各機能をどのようにコード単位で分割するかを検討します。単にファイルを分類するのではなく、「関心事の分離」「変更に強い構造」を意識することが重要です。

主な検討項目は次のとおりです。

  • モジュールの分割方針
     たとえば、ユーザー管理、注文処理、認証など、機能やドメインごとに分けるか*4、あるいはレイヤー単位で分けるか*5(例: controller/service/repository)を決めます。

  • ディレクトリ構成
     実際のソースコードの配置をどう整理するか。命名ルールや配置ルールを明確にしておくことが、保守性と開発効率の向上に直結します。

ソフトウェアアーキテクチャ設計で参照する要件定義の成果物

ソフトウェアアーキテクチャ設計に必要な要件定義の成果物は、「非機能要件」と「システム構成図」です(下図)。

ソフトウェア・アーキテクチャ設計のための要件定義からのインプット

非機能要件からのインプット

ソフトウェアアーキテクチャの設計は、アプリケーションの内部構造を整理し、主に非機能要件(保守性・性能効率性・使用性、セキュリティなど)を満たすために行います

保守性とソフトウェアアーキテクチャ設計

ソフトウェアアーキテクチャ設計においては、非機能要件*6の「保守性」は特に重要な要素です。

ソフトウェアアーキテクチャ設計では、システムの将来的な変更・拡張に対応できる構造やモジュール分割、インターフェースの明確さ、障害発生時の影響範囲の局所化などを検討します。

これらの設計判断に直接的に影響を及ぼすのが「保守性」です。他の非機能要件(性能効率性*7や信頼性*8など)が比較的局所的な対応で改善できるのに対し、保守性はアーキテクチャ全体の構造に深く関わるためです。

保守性のサブ特性とソフトウェアアーキテクチャ設計

保守性は、「モジュール性」「再利用性」「解析性」「変更性」「試験性」というサブ特性から構成されます(ISO/IEC 25010:2023*9の定義より)。下表に、保守性の各サブ特性の内容をまとめました。

サブ特性名 内容
モジュール性 (Modularity) ソフトウェアが明確な構造単位(モジュール)に分割されている度合い。責任が分かれ、修正や再利用の影響を局所化しやすくなる。
再利用性 (Reusability) ソフトウェアの一部が他の機能やシステムでも使い回しやすい度合い。再利用可能な構造と抽象化が求められる。
解析性 (Analyzability) 障害や仕様変更時に、原因や影響範囲を把握・分析しやすい度合い。構造の明瞭さやログ設計が重要となる。
変更性 (Modifiability) 要件変更や修正に対して、影響範囲を抑えて変更を加えやすい度合い。構造の安定性と拡張性が関係する。
試験性 (Testability) 単体テストや自動テストなどを実施しやすい度合い。構造的な分離と依存の制御が必要となる。

保守性のサブ特性とソフトウェアアーキテクチャにおける設計との対応例を以下に示します。

サブ特性名 ソフトウェアアーキテクチャでの設計対応例
モジュール性 (Modularity) ・責務ごとのレイヤー分割
・機能単位のモジュール構成
・疎結合な依存関係設計(DI*10、インターフェース)
再利用性 (Reusability) ・共通サービスの抽出
・ライブラリ化、マイクロサービス化
・契約ベース設計(インターフェース分離)
解析性 (Analyzability) ・責務の集中化
・命名規則や設計ルールの統一
・ログやエラーハンドリングの標準化、ログ出力の構造化
変更性 (Modifiability) ・依存関係の最小化
・拡張ポイントの設計
・レイヤーやドメインによる構造化
試験性 (Testability) ・単一責任の徹底
・依存注入によるモック化
・ユニットごとの分離設計

保守性に求める品質レベルは、以下のような観点から総合的に判断します。

  • 対象システムの複雑さ・規模
    システムが複雑であったり大規模なほど、変更性解析性を高めた設計が必要になります。一方、システムが単純な場合や小規模な場合、過度な設計は工数の浪費につながるため避けましょう。

  • 保守期間の長さ
    長期間運用されるシステムは、初期段階から保守性を高めておくことが効果的です。逆に、短期間の検証や使い捨てを前提としたシステムでは、保守性への過度な投資は不要です。

  • 市場投入までの時間 市場での競争を優位に進めるため、少しでも早くリリースしたい場合には、機能要件を優先し、保守性を犠牲にすることがあります。

  • 変更頻度
    頻繁に仕様変更や機能拡張が見込まれる場合は、特に変更性を重視した構造を設計に反映する必要があります。

  • 保守体制や保守担当者のスキルレベル
    保守担当者のスキルや経験が不足している場合、理解しやすく単純な設計にすることで保守作業の負担を軽減します。逆に十分なスキルがある場合、保守性を高めるための一定の複雑さは許容可能です。

  • 他システムへの依存性
    他システムとの依存度が高いシステムでは、変更時の影響を最小限に抑えるため、システム間の明確なインターフェース設計が求められます。また、自システム内部のモジュール分割を高度化しておくことで、連携先のシステムが変更された場合でも、その影響を受ける箇所を最小限に抑え、柔軟に対応できるようになります。

  • 障害発生時の影響度
    障害発生時に業務やユーザーに深刻な影響を与えるシステムは、解析性試験性を高め、迅速な障害特定や修正が可能な設計を採用する必要があります。

以上の観点を相互に関連付けて考慮し、システムの特性と状況に応じた具体的かつ適切な保守性の設計指針を決定してください。

保守性以外の非機能要件とソフトウェアアーキテクチャ設計

ソフトウェアアーキテクチャを設計する際は、保守性だけでなく、他の非機能要件にも目を向ける必要があります。特に以下の3つは、設計初期から構造に織り込んでおくべき重要な観点です。

  • 性能効率性:システムが応答性や処理速度の要件を満たせる構造になっているか
  • 使用性:ユーザーが迷わず操作できる一貫した体験を支える構造になっているか
  • セキュリティ:アクセス制御やデータ保護を構造レベルで担保できているか

これらは、実装だけでカバーするのではなく、アーキテクチャとしてどう設計するかが問われます。

性能効率性が求められる場面では、処理の応答時間やスループットをどの層でどう支えるかが重要になります。たとえば、商品検索を多用するECサイトでは、検索結果の表示速度がユーザー体験に直結します。そこで、検索用のキャッシュやリードレプリカを導入し、読み込み専用の高速な経路を構成するなど、性能を構造的に確保する工夫が必要です。これはチューニングではなく、「構造で性能を実現する」設計です。

使用性は見た目やUIコンポーネントの話にとどまらず、業務ロジックとユーザー操作の一貫性をどう保つかという視点が求められます。たとえば、SPA(Single Page Application)を採用する場合、フロントとバックエンドの明確な責務分離が必要です。バックエンドではユースケース単位でAPIを定義し、状態管理を整理することで、見た目の滑らかさだけでなく、操作に対する応答の整合性を担保します。

セキュリティは、設計段階で構造に組み込むべき要件の代表格です。たとえば、複数の入出力チャネル(Web、API、バッチ)を持つアプリケーションで、認可処理を業務ロジック層に集約すれば、どのチャネル経由でも一貫したアクセス制御が可能になります。また、ヘキサゴナルアーキテクチャのように、外部との接点をアダプター層に閉じ込める設計を取れば、信頼できない入力の流入経路を構造的に制限することができます。

このように、性能、使用性、セキュリティといった非機能要件は、実装の工夫だけでは不十分です。アーキテクチャ設計の段階でどう構造化するかを検討することで、品質を継続的に支える土台を築くことができます。

システム構成図からのインプット

要件定義で作成されたシステム構成図に示される主な技術要素には、次のようなものがあります。

  • プログラミング言語(Python、Java、C#、JavaScript、Ruby、PHP、Go、TypeScript など)
  • フレームワーク(Django、Spring、Ruby on Rails、ASP.NET Core、Next.js、Nuxt.jsなど)
  • ミドルウェア(データベース管理システム(DBMS)、Webサーバー、アプリケーションサーバー、キャッシュサーバー(Redis、Memcachedなど))

システム構成図の例

ソフトウェアアーキテクチャ設計では、システム構成図に示された技術要素をインプットとして、ソフトウェアのコンポーネントやモジュールの構成を決定します。

たとえば、選定されたプログラミング言語やフレームワークに応じて、コンポーネントの責務の分け方や層構造、通信方式が変わることがあります。

また、使用するミドルウェアの特性を踏まえて、データアクセスの方式やセッション管理、パフォーマンス対策などもアーキテクチャ設計段階で考慮する必要があります。

最後に

本記事では、ソフトウェアアーキテクチャ設計の内容と、要件定義の成果物との連携について解説しました。

ソフトウェアアーキテクチャ設計は、後続工程の設計方針や開発効率、さらには運用・保守の容易さにまで影響するため、要件定義の段階から考慮する必要があります。

要件定義においてアーキテクチャの視点を取り入れることで、実装時の技術的課題や運用時の制約を早期に明確化でき、現実的で実効性のある要件を定義できるからです。

要件定義とアーキテクチャ設計を初期段階から連携させ、技術的な課題や将来の変更を見据えた要件を定義することで、開発現場の手戻りを防ぎ、長期的に安定して価値を生み出せるシステムを実現しましょう。

次回は、要件定義とクラス設計の連携について説明します。

tracery.jp

この記事を書いた人
haru

佐藤治夫。株式会社ビープラウド代表取締役社長。TRACERYのプロダクトマネージャー。エンジニアとして活動を始めて以来、モデリングを中心としたソフトウェアエンジニアリングを実践している。Xアカウント: https://x.com/haru860

*1:本メディアでは、システムアーキテクチャの設計を要件定義のプロセス内で実施することを想定しています。その成果物として「システム構成図」を作成します。システム要件定義の成果物〜設計へのインプットを作成するを参照のこと

*2:AWSやGoogle Cloud、Microsoft Azureなどのクラウドプラットフォームか、オンプレ(オンプレミス)のサーバーかなどを選択する。

*3:オニオンアーキテクチャの概念をレイヤードアーキテクチャ風に表現した図

*4:垂直分割ともいう。メリットとして、(1)各機能が独立していて変更の影響範囲が明確になる、(2)ドメインごとの担当者やチームに分けやすく大規模開発に向いている、(3)マイクロサービスへの分割とも親和性が高い、などがある。

*5:水平分割ともいう。メリットとして各レイヤーの責任が明確で、役割ごとにコードが整理される、同一レイヤー間で共通処理や共通インターフェースを持たせやすい、初期フェーズの小規模開発においては取り回しやすい、などがある。

*6:機能要件以外の要件。非機能要件とは、主に品質要件であり、利用品質(有効性、効率性、満足性、リスク緩和、コンテキストカバレージ)、プロダクト品質(性能効率、互換性、ユーザビリティ、信頼性、セキュリティ、保守性、移植性)、データ品質に分類できる。品質要件以外には、法令遵守、アーキテクチャ制約(分散、配備)、開発制約(コスト、納期、可変性、保守性)がある。参考:要求工学知識体系(REBOK)の1.3「機能要求と非機能要求」。非機能要件の詳細については別記事で説明します。

*7:時間効率性、資源効率性、容量のサブ特性がISO/IEC 25010で定義されている。

*8:成熟性、可用性、障害許容性、回復性のサブ特性がISO/IEC 25010で定義されている。

*9:ISO/IEC 25000シリーズの1企画。ISO/IEC 25000シリーズは、ソフトウェア製品の品質を評価・管理するための国際規格群であり、品質要求や評価手法に関する一連の基準を体系的に定めたもの。ISO/IEC 25010は、ソフトウェアやシステムの品質を「どのような観点で捉えるか」を示す品質モデルを提供している。具体的には、開発中や納品時の製品そのものの品質を示す「プロダクト品質」と、実際に利用された際の使い勝手や有効性を示す「利用時の品質」の2つの観点に分類され、それぞれ複数の品質特性が定義されている。これにより、開発者や設計者は品質に関する要件を明確にし、過不足のない形でソフトウェアの品質を設計・評価することができる。

*10:Dependency Injection(依存性注入)。必要な機能(依存先)を自分で作らず、外から渡してもらう仕組み。たとえば、クラスの中で使う部品を、コンストラクタなどで注入して使用する。

ROUTE06社による要件定義のインタビュー記事が掲載されました

TRACERYプロダクトマネージャーの haru です。

ビジネスモデル変革を支援するDX事業を展開するROUTE06(ルートシックス)様に、要件定義の重要性と実践のポイントをテーマにインタビューしていただきました。その内容が記事として公開されています。

service.route06.com

ROUTE06社では、クライアント企業との対話を通じて、システム開発の上流工程における課題が多くのプロジェクトの障壁になっているという認識を持っていました。そこで、適切な要件定義の進め方について意見を伺いたいとご連絡いただき、今回のインタビューが実現しました。

インタビューの主な内容

本インタビューでは、要件定義を中心に以下のテーマについてお話ししました。

要件定義を進める上で、特に重要な要素は何か
要求分析を進める上で、重要なポイントは何か
システム開発の経験があまりないお客様とのコミュニケーションで、工夫していること
要件定義を進める上で、どのような役割分担が必要か
要件定義の考え方や進め方は、昔と比べてどのように変化してきたか
今後のシステム開発において、生成AIはどのような役割を果たすか

特に要件定義の初期段階や、それ以前の企画・要求分析段階における考え方について掘り下げています。

トレラボでは、今後も要件定義やシステム開発のノウハウを発信していきます。

この記事を書いた人
haru

佐藤治夫。株式会社ビープラウド代表取締役社長。TRACERYのプロダクトマネージャー。エンジニアとして活動を始めて以来、モデリングを中心としたソフトウェアエンジニアリングを実践している。Xアカウント: https://x.com/haru860

ユースケースとロバストネス図によるシステム要件定義

シリーズ: 要件定義とはそもそも何か

TRACERYプロダクトマネージャーの haru です。

前記事の業務フロー図で見える化する業務プロセスからシステム要件への道筋では、業務フロー図からユースケースを抽出しました。

システムの要件定義では、ユースケースを起点にロバストネス図を活用することで、システムを構成する要素を抽出でき、設計にスムーズにつなげることができます

本記事では、ユースケースとロバストネス図を用いて、システムの要件を具体化する方法を説明します。

ユースケースの記述

ユースケース(use case)とは、利用者の視点でシステムの振る舞いを整理したものです。

ユースケースには、システムの動作やユーザーの操作の流れを具体的に記述し、どのように機能が利用されるかを明確に表現します。

ユースケースは、以下の要素で構成されます。

要素 説明
アクター(Actor) システムを利用する主体(ユーザー、外部システムなど)
ユースケース(Use Case) アクターとシステムのやり取りを表す具体的なシナリオ
事前条件(Preconditions) ユースケース実行前に満たすべき条件
事後条件(Postconditions) ユースケース完了後に満たすべき状態
基本フロー(Main Flow) 通常の操作フロー(成功パターン)
代替フロー(Alternative Flow) 基本フローとは異なる分岐(例:異なる操作の選択肢)
例外フロー(Exception Flow) エラーや異常時の振る舞い

ユースケース「売上ダッシュボードを参照する」の記述

前記事で抽出したユースケース「売上ダッシュボードを参照する」の記述例を以下に示します。

項目 内容
ユースケース名 売上ダッシュボードを参照する
アクター 管理者、営業担当者
事前条件 ユーザーがログイン済みで、ダッシュボード閲覧権限を持っている
事後条件 システムはユーザーに対して最新の売上データを表示した状態となる。
ダッシュボードの閲覧履歴がシステムに記録される。
基本フロー 1. ユーザーは管理画面にログインする
2. メニューから「売上ダッシュボード」を選択する
3. システムは売上データを取得し、ダッシュボードを表示する
4. ユーザーは売上の推移や各種指標を確認する
代替フロー 売上レポートの出力
1. ユーザーは売上ダッシュボード上で「PDFエクスポート」ボタンをクリックする。
2. システムは現在表示されている売上データをPDF式でダウンロードして保存する。
例外フロー 1. ユーザーが閲覧権限を持っていない場合、アクセス拒否エラーメッセージを表示
2. 売上データの取得に失敗した場合、エラーメッセージを表示し、管理者に通知する

ロバストネス図によるシステムを構成する要素の抽出

ユースケースを元にシステム要件を詳細化していくには、ロバストネス図の作成が有効です。ロバストネス図によってシステムを構成する要素(UI、機能、データ等)を導き出します

ロバストネス図を構成する要素は以下の3つです。

  • バウンダリオブジェクト(Boundary Object:以下「バウンダリ」)
    • UIやAPIなど、外部とのインターフェース(境界)を担うもの(例:画面、APIエンドポイント)。
  • エンティティオブジェクト(Entity Object:以下「エンティティ」)
    • システム内部の主要なデータを表すもの(例:注文、顧客、商品)。
  • コントロールオブジェクト(Control Object:以下「コントロール」)
    • バウンダリとエンティティの間で、処理の流れを制御するもの(例:注文処理、在庫更新)。定時起動のバッチ処理もコントロールで表現する事が多い。

下図は、ユースケース「売上ダッシュボードを参照する」の記述をもとに作成したロバストネス図です。

ロバストネス図の例

ロバストネス図による開発品目の抽出

要件定義の目的とゴールとは - TRACERY Lab.(トレラボ)では、要件定義の最低限必要な要件定義の成果物について以下のように説明しました。

  • 開発品目*1(画面、API、バッチ処理など)の一覧
  • 各開発品目に対応するシステムの機能要件*2
  • セキュリティ、性能、信頼性、可用性などの非機能要件*3の定義

要件定義の成果物の一つである『開発品目の一覧』がロバストネス図で抽出できます。

開発品目をロバストネス図で抽出する

前述の「開発品目をロバストネス図で抽出する」からは、以下の開発品目が抽出されました。

  • 売上ダッシュボード画面
  • 売上データ抽出処理
  • 売上レポートPDF出力処理

さらなる要件の検討

上図のロバストネス図では、まずシステムの大まかな振る舞いを整理しました。ここから解像度を高め、機能要件や非機能要件の検討を進めます。

機能要件

検討1

売上ダッシュボードにどのような情報を表示するのか?

検討結果 → 日別の売上推移、商品別売上、地域別売上

非機能要件

検討1

ダッシュボード表示は、最大何秒で表示できれば良いか?(性能要件)

検討結果 → 3秒以内

検討2

最新の売上データの数値が反映されるまでの遅延はどこまで許容されるのか(運用要件)

検討結果 → 最大24時間。月ごとの傾向を分析することが主な目的であり、常に最新である必要はない。そのため、集計は1日1回とする。

これらを検討した結果、1回のクエリでは抽出に3秒以上の時間がかかり、ダッシュボード表示の前段階として「売上データ集計処理」が必要であることが明らかになりました。

さらに、集計や表示のためには、商品、顧客、エリアなどのデータも必要であることがわかりました。これらの詳細化した結果をロバストネス図で表すと、下図のようになります。

洗練化したロバストネス図

要件を検討した結果、開発品目は以下のようになりました。

  • 売上ダッシュボード画面
  • 売上データ抽出処理
  • 売上レポートPDF出力処理
  • 売上データ集計処理 (追加)

ここではこの程度の詳細化にとどめますが、実際の開発では、以下のような話が検討されるかもしれません。

  • データウェアハウス向けソフトウェア(Amazon Redshift*4 や BigQuery*5等)の導入
  • ダッシュボード画面を実装せずに、BIツール*6を活用する

最後に

本記事では、ユースケースを詳細化し、ロバストネス図を用いてシステムの要件を抽出する方法を具体例とともに説明しました。

ロバストネス図を活用することで、開発品目を明確にし、機能要件や非機能要件を整理できます。

ユースケースとロバストネス図は、システム要件定義を進めるうえで取り組みやすい手法です。ぜひ、実務で活用してみてください。

次の記事では、さらに踏み込んで、システム要件定義の成果物について解説します。

tracery.jp

この記事を書いた人
haru

佐藤治夫。株式会社ビープラウド代表取締役社長。TRACERYのプロダクトマネージャー。エンジニアとして活動を始めて以来、モデリングを中心としたソフトウェアエンジニアリングを実践している。Xアカウント: https://x.com/haru860

*1:品目という言葉は聞き慣れないかもしれないが、ここでは共通フレーム2013の用語に従っている

*2:システムが提供すべき具体的な機能やサービス、操作に関する要件のこと。システムが「何をするか」に関する要件であり、ユーザーやクライアントが期待する具体的な動作や結果を定義する。データ入力、データ処理、データ出力、データ検索、データ保存、ユーザー認証、通知、インターフェース(他のシステムやアプリケーションとの連携)などの機能があげられる。

*3:システムの動作や性能、品質に関する要件のこと。機能要件が「システムが何をするか」に焦点を当てるのに対して、非機能要件は「システムがどのようにそれをするか」に焦点を当てる。セキュリティ、性能、信頼性、可用性、保守性、ユーザビリティ、互換性、移植性、法令遵守などがある。

*4:https://aws.amazon.com/jp/redshift/

*5:https://cloud.google.com/bigquery?hl=ja

*6:Business Intelligenceツール。企業に蓄積されている膨大なデータを集約し、経営や業務に活用できるように分析・共有するためのツール

ユーザとベンダの想いは相反する〜 超上流から攻めるIT化の原理原則17ヶ条/ 原理原則その1

シリーズ: 超上流から攻めるIT化の原理原則17ヶ条

TRACERYプロダクトマネージャーの haru です。

システム開発では、ビジネス側と開発側が協調し、ビジネス価値の創出に向けて動くことが求められます。

特に要件定義では、この協力関係が成功の鍵を握ります。

そのためには、まず相互理解が欠かせません。ビジネス側と開発側がお互いの考えていること、背景や価値観、そして日々の業務への理解を深めることが、協力の第一歩となります。

本記事では、『超上流から攻めるIT化の原理原則17ヶ条』の第1条『ユーザ*1とベンダ*2の想いは相反する』を読み解いていきます。

ユーザとベンダの想いはなぜ相反するのか

『ユーザとベンダの想いは相反する』の原則は、システム開発において、ビジネス側(ユーザ、発注側)と開発側(ベンダ、受注側)が持つ責任の違いにより、相反する思惑が生まれ、衝突しやすい現実を示しています。

ビジネス側と開発側の責任の違いとは、それぞれの役割において、QCD(品質、コスト、期限)のどれを優先するかが異なる点です。

QCD(品質・コスト・期限)は密接に関連し、トレードオフ*3という関係にあります。たとえば、品質を向上させれば費用が増加し、期限が延びます。一方、期限を短縮したり費用を削減したりすると、品質が犠牲になります。また、費用を抑えながら品質を維持しようとすれば、結果として期限が延びます。

たとえビジネス側と開発側が「ビジネス価値の創出」という共通の目的を共有していたとしても、QCD(品質、コスト、期限)のトレードオフにより相反する思惑が生じることがあります。また、同じビジネスや開発の中でも、何を優先すべきかで意見が対立する場合があります。

下表に、要件定義における、ビジネス側と開発側の責任*4と義務*5、想いをまとめました(IPAが公開しているPDFの6ページの図を元に作成)。

ビジネス側と開発側の責任、義務、想い

下図は、上記の表における両者の想いの相反関係を示したものです。

ビジネス側と開発側の相反する想い

図に示された相反関係の一例として、要件や見積の品質(Quality)を時間をかけて高めようとすると(図の左側)、期限(Delivery)に間に合わないリスクや費用(Cost)の増大が発生すること(図の右側)が挙げられます。

これらの相反関係を理解し、調整することが、プロジェクト成功の鍵となることを『超上流から攻めるIT化の原理原則17ヶ条』の第1条『ユーザとベンダの想いは相反する』は示しています。

行動規範

『超上流から攻めるIT化の原理原則17ヶ条』の第1条には、ビジネス側と開発側の相反する想いを解決するための行動規範として、以下の3つが挙げられています。

  • 発注者・受注者は、お互いの責任、義務、想いを知る
  • 発注者は受注者との役割分担を明確にし、プロジェクトに積極的に参画する
  • 発注側業務部門も、"システム開発"を理解する

これらの行動規範を見ると、その内容は発注者側(ビジネス側)に偏りが見られます(発注者側が3つ全て、受注者側が1つに該当。超上流から攻めるIT化の原理原則17ヶ条(原理原則と行動規範の一覧)参照のこと)。

これは、過去に発注者側が要件定義段階から開発を受注者側に丸投げして問題が発生する事例が多く見られたことが背景にあります。第1条はこのような状況を改善するため、発注者側が積極的に取り組むことで、発注者と受注者が対等な関係を築くことを主に目指した原則でといえるでしょう。

ただし、この原則は発注者側だけが一方的に努力することを意味するものではありません。発注者と受注者の双方がそれぞれの役割と責任を理解し、協力して課題に取り組むことが求められます。互いに主体性を持つことで、より良い開発プロセスと成果が実現できます。

以下に、行動規範のそれぞれについて説明します。

発注者・受注者は、お互いの責任、義務、想いを知る

ビジネス側と開発側でQCD(品質・コスト・期限)の何を重視するかによって、取るべき行動や考え方がどのように変わるのかを理解することから始める必要があります。

お互いの想い(下図のAとB)を率直に話し合い、相手の立場を理解した上で、両者が共有できる価値を見出す姿勢が求められます。この共通の価値(AとBからCを生み出す)を追求することで、真の協力関係を築くことができるのです。

共通の価値を見出す

これは、単に妥協点を探ることではなく、双方の強みを活かし合い、新たな可能性を見出すことを意味します。

発注者は受注者との役割分担を明確にし、プロジェクトに積極的に参画する

この行動規範は、以下の2つの内容に分けられます。

  • 発注者は受注者との役割分担を明確にする
  • 発注者は、プロジェクトに積極的に参画する

それぞれ、以下に説明します。

発注者は受注者との役割分担を明確にする

要件定義におけるビジネス側と開発側の役割分担を曖昧にしてしまうと、タスクが宙に浮き、結果としてスケジュールの遅延やコストの増大といった深刻な問題を引き起こします。

役割分担の例を以下に示します。

  • ビジネス側の役割

    • ビジネス目標の設定
    • ユーザーのニーズを集める
    • 必要情報の提供
    • 優先順位の決定
    • ステークホルダーの調整・合意形成
    • 予算管理
  • 開発側の役割

    • 要件の文書化*6
    • コスト見積もり
    • スケジュール作成
    • 技術的リスクの評価
    • モックアップやプロトタイプの作成

役割分担を明確にすることで、責任の所在が明確になり、効率的なコミュニケーションが実現します。また、双方が主体的に取り組む姿勢を持つことで、課題の早期発見や迅速な対応が可能になり、プロジェクトの成功率が向上します。

発注者は、プロジェクトに積極的に参画する

開発プロジェクトを成功させるためには、ビジネス側が主体的に参加することが欠かせません。

よくある例としては、ビジネス側のプロジェクト担当者が多忙を極め、開発側の質問に対する回答が遅れたり、ミーティングの設定もままならないという状態です。

こうした状況が続くと、要件定義フェーズの進行が大きく停滞する恐れがあります。たとえば、ビジネス側の担当者が多忙で詳細な説明を提供できない場合、開発チームが「想定で進めざるを得ない」状況に陥りがちです。その結果、後に判明した要件のズレや仕様の抜け漏れが手戻りを引き起こし、プロジェクト全体のスケジュールが破綻する事態を招きます*7

ステークホルダー間での意思決定が遅れることも、要件定義での典型的な課題です。特に、意思決定者が明確に定義されていない場合や、承認プロセスが煩雑すぎる場合、プロジェクトが一向に前に進まない状況に陥ります。

ビジネス側に専任の担当者を置くことが理想ですが、開発側からの質問に迅速に答える仕組みを整えたり、スケジュールにミーティングを組み込み、開発側とのコミュニケーションを密にすることで、上記のような問題が発生するリスクを下げることできます。

一方で開発側は、ビジネス側がプロジェクトに積極的に関与できるよう支援する必要があります。必要な情報や技術的な内容、要件の具体的な選択肢とそれぞれのリスクを、ビジネス側が理解しやすい形で伝えることで、円滑な意思決定を促し、要件定義をスムーズに進めることができます。

発注側業務部門も、"システム開発"を理解する

ビジネス側は、システム開発には一定の時間がかかるという基本的な性質を理解することが重要です。「これくらいならすぐにできるだろう」といった誤った認識を持つと、予算や期間を見誤るだけでなく、お互いの不信感を招くことにもつながります。システム開発には、影響範囲や技術的リスクの調査、設計、実装、レビュー、テストといった多くのプロセスが含まれます。これらの内容を理解することで、現実的なスケジュールや予算を検討することができます。

また、開発側にもビジネス側の仕事を理解する姿勢が求められます。たとえば、業界や業務に関する知識、顧客ニーズ、組織の意思決定プロセスなどを把握することで、より適切で効果的なシステムを提案できるようになります。

最後に

システム開発、特に要件定義においては、ビジネス側と開発側が協力し、ビジネス価値の創出に向けて共に取り組むことが不可欠です。

そのためには、ビジネス側と開発側がそれぞれの責任や義務から生じる想いを深く理解し合うことが重要です。

この原理原則を理解し、実践することで、より良いシステム開発を実現し、プロジェクトの成功を確実なものにできるでしょう。

この記事を書いた人
haru

佐藤治夫。株式会社ビープラウド代表取締役社長。TRACERYのプロダクトマネージャー。エンジニアとして活動を始めて以来、モデリングを中心としたソフトウェアエンジニアリングを実践している。Xアカウント: https://x.com/haru860

*1:システムを使って事業を行なう会社などの組織のこと。システムの使用者や顧客の意味ではない。

*2:システムやソフトウェア、ハードウェアを提供する企業や組織のこと。顧客の要件に基づいて製品やサービスをカスタマイズしたり、導入支援を行ったりすることもある。

*3:「何かを選ぶと別の何かを諦めざるを得ない、つまり「あちらを立てればこちらが立たず」という状況。

*4:責任と義務は似た意味を持つ言葉であるが、ここでは「品質」「期限」「費用」に対して、それぞれの立場で果たすべき役割として「責任」を用いる。「要件の品質に責任を持つ」「開発費用に責任を持つ」「リリース期限に責任を持つ」など。

*5:ここでは、「責任」を実現するためのつとめ、行動を示す。

*6:業務要件はビジネス側、システム要件はシステム側という役割分担もあり得る

*7:このような状況で開発側が責任を問われると、対応が難しくなる可能性があります。それを防ぐために、『原理原則[9] 要件定義は発注者の責任である』という重要な指針が示されています。この原則に書かれている通り、要件定義はビジネス側の責任であり、開発側は支援する立場であることを、要件定義開始前に合意しておくと良いでしょう。

『超上流から攻めるIT化の原理原則17ヶ条』は、要件定義に取り組む全ての人に読んでほしい実践ガイド

シリーズ: 超上流から攻めるIT化の原理原則17ヶ条

TRACERYプロダクトマネージャーの haru です。

システム開発における要件定義の重要性は、DX(デジタルトランスフォーメーション)の推進に伴い、これまで以上に高まっています。プロジェクトの大型化、複雑化、多様化が進む中で、要件定義はプロジェクト全体の方向性を明確にし、関係者全員が共通のゴールを共有するための不可欠な基盤となっています。

要件定義を効果的に行うには、ビジネス側と開発側が協力し、互いの視点や目的を共有することが不可欠です*1。たとえば、要件を定義する際には、開発側がシステムの技術的な制約を理解しつつ、ビジネス側が求める成果を具体的に示す必要があります。このような協力体制がなければ、要件の齟齬やプロジェクトの遅延を招くリスクが高まります。

では、ビジネス側と開発側は具体的にどのように協力すればよいのでしょうか?

その指針として参考になるのが、『超上流から攻めるIT化の原理原則17ヶ条』です。

本記事では、『超上流から攻めるIT化の原理原則17ヶ条』の概要を説明します。

超上流から攻めるIT化の原理原則17ヶ条とは

『超上流から攻めるIT化の原理原則17ヶ条』は、IPA(独立行政法人情報処理推進機構)が2010年に発刊したガイドラインです。

『超上流から攻めるIT化の原理原則17ヶ条』は、IPAのサイトにPDFで公開されています。

実務に活かすIT化の原理原則17ヶ条〜プロジェクトを成功に導く超上流の勘どころ〜

発刊から15年近くが経過した現在でも、その原理原則は普遍的であり、現代のシステム開発においても十分に通用する内容となっています。

『超上流から攻めるIT化の原理原則17ヶ条』は、発注者と受注者がお互いの役割と立場を認識し、協力してプロジェクトを成功に導くための具体的な指針を提供しています。また、『発注者=ビジネス側』、『受注者=開発側』と読み替えることで、一社内のプロジェクトにも活用できます。

超上流とは

超上流とは「事業や業務検討の始まりから要件定義までの工程*2」を指します。V字モデルにおいては、企画および要件定義(業務要件定義、システム要件定義)のフェーズに相当します。

超上流とは

17条の原理原則一覧

17条の原理原則は、以下のとおりです。

  • [1] ユーザとベンダの想いは相反する
  • [2] 取り決めは合意と承認によって成り立つ
  • [3] プロジェクトの成否を左右する要件確定の先送りは厳禁である
  • [4] ステークホルダ間の合意を得ないまま、次工程に入らない
  • [5] 多段階の見積りは双方のリスクを低減する
  • [6] システム化実現の費用はソフトウェア開発だけではない
  • [7] ライフサイクルコストを重視する
  • [8] システム化方針・狙いの周知徹底が成功の鍵となる
  • [9] 要件定義は発注者の責任である
  • [10] 要件定義書はバイブルであり、事あらばここへ立ち返るもの
  • [11] 優れた要件定義書とはシステム開発を精緻にあらわしたもの
  • [12] 表現されない要件はシステムとして実現されない
  • [13] 数値化されない要件は人によって基準が異なる
  • [14] 「今と同じ」という要件定義はありえない
  • [15] 要件定義は「使える」業務システムを定義すること
  • [16] 機能要求は膨張する。コスト、納期が抑制する
  • [17] 要件定義は説明責任を伴う

この中で、私が好きな原理原則は、「表現されない要件はシステムとして実現されない」です。

最後に

要件定義を成功させるためには、ビジネス側と開発側の協力が不可欠です。その際、双方がお互いの立場や役割を正しく理解することが重要です。この相互理解を支援するうえで、『超上流から攻めるIT化の原理原則17ヶ条』は非常に有用です。

この書籍に示されている原理原則や行動規範を日々の業務に取り入れることで、要件定義をスムーズに進めることができるでしょう。

要件定義に取り組むすべての方に、ビジネス側・開発側を問わず、ぜひお読みいただきたい一冊です。

この記事を書いた人
haru

佐藤治夫。株式会社ビープラウド代表取締役社長。TRACERYのプロダクトマネージャー。エンジニアとして活動を始めて以来、モデリングを中心としたソフトウェアエンジニアリングを実践している。Xアカウント: https://x.com/haru860