ソフトウェア開発の現場で、「要件(Requirements)」と「制約(Constraints)」の違いに悩んだことはないだろうか。
私は設計を考える際に、この2つの概念を混同してしまうことがあった。
適切な設計を行うために、これらの違いを明確に理解することが大事であると感じたので、これらの違いについてシステム工学の国際標準である ISO/IEC/IEEE 29148 の定義をベースに整理してみた。
国際標準では、この二つは以下のように区別されている。
要件 (Requirements)
制約 (Constraints)
現場の標準語彙であるため
日本の開発現場では、ステークホルダーの「生の願い」を「要求(Needs/Requests)」、それをエンジニアリングの言葉に翻訳・確定したものを「要件(Requirements)」と使い分ける慣習がある(例:要求定義ではなく要件定義)。設計の話をする場合、扱うのは確定した「要件」であるため、こちらが適切である。
「制約」との対比が鮮明になるため
上記のように、要求・要件・制約は強制力のグラデーションで並んでいる。設計を議論する際、「~してほしい」という曖昧な要求レベルではなく、「~である必要がある」という確定した要件として扱うことで、制約との対比が明確になり、トレードオフの判断がしやすくなる。
ISOの構造的意図
ISO 29148でも、"Stakeholder Needs"(利害関係者ニーズ=要求)と "System Requirements"(システム要件)は明確に区別されている。本記事の文脈は「設計」であるため、ニーズの段階ではなく、要件の段階の話となる。
要件と制約を見分けるための簡単なフレームワークとして、以下の4つの質問を使うことができる。
| 質問 | 答えが YES なら... | 理由 |
|---|---|---|
| 「それはユーザーの欲望か?」 | 要件 | システムが提供する価値そのものだからである。 |
| 「それは設計の選択肢を奪うか?」 | 制約 | エンジニアが自由に技術選定できない要因だからである。 |
| 「お金や時間を積めば変更できるか?」 | 要件 | トレードオフの対象になり得るからである。 |
| 「物理法則や法律、全社規定か?」 | 制約 | 開発チームの権限外にある「不動の壁」だからである。 |
少しややこしいのが、パフォーマンスやセキュリティなどの「非機能要件(Non-Functional Requirements: NFRs)」である。これらは形式上は要件だが、アーキテクトにとっては強力な 「制約」 として機能する。
例えば、「ページを1秒以内に表示する」というNFRがあるとする。
ソフトウェア設計とは、「制約(Constraints)の枠の中で、最大限に要件(Requirements)を満たす解を見つけるパズル」と例えることができる。
ただし、制約は「絶対に動かせない壁」とは限らない。 設計を進める中で、制約が要件の実現を著しく阻害したり、コストを爆発させたりする場合は、制約そのものを「交渉して変える」こともアーキテクトの重要な仕事である。
プロジェクト開始時にこの二つを明確に区別しておくことで、「変えられないもの」と「変えるべきもの(あるいは交渉すべきもの)」を正しく見極め、チームのエネルギーを最適なトレードオフの判断に集中させることができる。