TRACERY Lab.(トレラボ)

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

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

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

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

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

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

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

まとめ

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

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

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

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

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

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

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

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

この記事を書いた人
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.(トレラボ))の「コンポーネント構成の設計」を参照してください。

まとめ

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

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

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

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

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

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

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

この記事を書いた人
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

業務フロー図で見える化する業務プロセスからシステム要件への道筋

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

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

事業・業務・システムの3階層で要件を捉える - TRACERY Lab.(トレラボ)では、要件を事業要件、業務要件、システム要件へと階層化して捉える考え方を説明しました。

階層化した要件

上図には、事業の成功に向けて必要な要件がリストアップされています。しかし、これらの要件は現場の『業務プロセス』で具体的に実行されて初めて価値を生み出します*1

業務プロセスとは、事業の価値を実現するために行われる一連の作業や手続きの流れを指します。例えば、ECサイトで商品を購入する場合、顧客が注文を行う段階から、在庫確認、商品梱包、配送手配、そして商品を顧客に届けるまでの流れが業務プロセスに該当します。このプロセスでは、ヒト、モノ、カネ、情報が緊密に連携*2することで、顧客に価値が届けられます。

業務プロセスを構想し、整理する手段として、業務フロー図の作成が有効です。

本記事では、業務フロー図を作成する効果と、業務フロー図によって業務プロセスを具体化する方法を説明します。

ヒト、モノ、カネ、情報が連携して価値が生まれる

業務フロー図を作成する効果

業務フロー図を作成することで、以下のような効果が得られます。

5W2Hの視点で業務の必要事項を漏れなく詳細化できる

「誰が(Who)」「何を(What)」「どのように(How)」「なぜ(Why)」「いつ(When)」「どこで(Where)」「どれくらい(How much)」といった5W2Hの視点を活用することで、業務プロセスを具体的に整理することができます。

業務フローの5W2H

業務フロー図に表現する5W2Hの内容は以下のとおりです。

  • Why(なぜ) 実現したい事業要件、業務要件や価値。業務フローには直接記述しないが、業務フローで運用されることで事業要件や業務要件が実現されることを念頭に置きながら、業務フロー図を作成する必要がある。
  • When(いつ) 業務フロー図の縦軸で時間の流れをあらわす
  • Who(誰が)Where(どこで) 業務フロー図の横の並びの枠(スイムレーン)でステークホルダーや場所をあらわす。例:Who: 部署や担当者、ユーザーなど。Where:オフィス、倉庫、自宅
  • What(何を)How(どのように)How Much(どれくらい) What:具体的な活動やタスク、How:実行方法、How Much:回数、量、金額など

業務の課題点発見とステークホルダー間の共通理解の促進

業務全体の流れや関連タスク間の関係を視覚的に整理し、俯瞰することができます。特に、複数の部門や多くの工程が関与する業務においては効果的で、改善点の発見につながります。

また、専門知識が異なるステークホルダー間で共通言語として機能します。例えば、システム開発者、業務担当者、経営陣などが同じ図を共有して議論することで、要件認識のずれを防ぐことができます。

テスト設計や運用設計の基盤構築

テスト設計や運用設計の基盤としても活用できます。例えば、業務フロー図を基にシナリオテストを設計したり、業務フローを活用して運用マニュアルを作成したりすることが可能です。

業務フロー図の作成手順

次に、業務フロー図の作成手順を説明します。

ステップ1 名前をつける

業務を識別するために名前をつけます。ここでは「商品の販促施策検討」とします。

ステップ2 業務に関係するステークホルダーを配置する

業務に携わるステークホルダーを業務フロー図に配置します。

業務に関係するステークホルダーをリストアップする

ステップ3 フローを作成する

各ステークホルダーが実施するアクションをリストアップし、それらを時間軸に沿って前後関係で関連付けることで、業務プロセスの流れを体系的に整理できます。この際、開始ノードと終了ノードを明示的に設けることで、プロセスの開始点と終了点が一目で分かるようになり、曖昧なプロセス設計を防ぐ効果があります。

フローを作成する

ステップ4 システムを利用するアクションを特定する

業務フローを分析し、システムを使用する具体的なアクションを特定します。この作業により、システムがどの業務プロセスに関与しているかを明確にし、業務全体の効率化や自動化の可能性を評価することができます。例えば、受注処理における在庫管理システムへのデータ入力や更新作業といったアクションを洗い出すことで、システム活用を最適化するための方針を検討しやすくなります。

システムを利用するアクションを特定する

ステップ5 システムを利用するアクションからユースケースを抽出する

システムを使用するアクションから、具体的なユースケースを抽出します*3。ユースケースとは、ユーザーが特定の目的を達成するためにシステムをどのように利用するかを示す具体的な場面です。ユーザーとシステムのやり取りを可視化し、システムが提供すべき機能や操作の流れを明確にするのに役立ちます。

例えば、ECサイトでは、「商品を検索する」「商品を購入する」「注文状況を確認する」などのユースケースが考えられます。

抽出したユースケースを詳細化することで、システム要件定義を体系的に進めることが可能です。例えば、「商品を購入する」ユースケースでは、購入手続きの各ステップやシステムの挙動(例:在庫確認、決済処理、エラー対応)を明確にすることで、システムの振る舞いに関する要件の曖昧さを排除できます。システム要件定義の詳細については、別記事で説明します。

システムを利用するアクションからユースケースを抽出する

最後に

業務フロー図は、システム開発の現場で頻繁に使用される重要なモデルです。その目的は、業務全体の流れを可視化して問題点や改善点を具体的に洗い出すとともに、ユースケースを抽出することでシステムの利用場面を明確にし、システム要件定義に役立てることです。

例えば、5W2Hの視点で業務プロセスを分解することで、曖昧な業務手順や非効率な作業を明確化できます。このような分析は、業務全体を俯瞰することで初めて実現します。

特に、DX(デジタルトランスフォーメーション)の推進や、大規模なシステム開発プロジェクトのように、多様なステークホルダーが関わる場面では、業務フロー図の価値は一層高まります。例えば、現場担当者、システム開発者、経営層など、それぞれの視点から業務の全体像を共有しやすくなるためです。

さらに、業務フロー図を活用することで、開発チームが「何を」「なぜ」作るべきかをより明確に定義できるようになります。これにより、システム開発の初期段階で要件の認識のズレを防ぎ、プロジェクト全体の成功率を向上させる効果が期待できます。

業務フロー図は単なる作業手順にとどまらず、組織全体の課題解決や価値創出の基盤となります。その重要性を理解し、システム開発の現場で活用していきましょう。

次回は、抽出したユースケースを基にシステム要件を定義する方法を説明します。

tracery.jp

この記事を書いた人
haru

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

*1:実行されなければ絵に描いた餅ということです。

*2:詳しい説明はシステム開発におけるシステムとは何かを参照のこと。

*3:業務フローからユースケースを抽出する手法は、要件定義手法RDRAで提唱されています。