# 要件定義

## **要件定義とは**

### **要件定義の基本概念**

要件定義とは、システムやソフトウェアの開発を行う際の要求や条件を明確にして文書化する作業のことを指します。これにより、何を実現すべきか、どのような機能や性能が必要かが明確になります。

具体例: オンライン書店のシステムを作成する場合、以下のような要件を明確にします。

* ユーザー登録・ログイン機能
* 書籍の検索・購入機能
* カート追加・購入機能
* レビュー投稿・閲覧機能

### **要件定義の重要性と目的**

要件定義が不足していると、システム開発の途中で何を実装すべきかが曖昧になる、またはお客様の期待と異なるものが出来上がるリスクが高まります。

目的:

1. **明確な方向性:** 開発チームにクリアな指示を与える。
2. **期待の合致:** ステークホルダーや利用者の期待に応えるシステムを開発する。
3. **コスト・時間の効率化:** 予期しない変更や修正の回避により、予算や時間をオーバーするリスクを低減する。

具体例: オンライン書店のシステムで「レビュー投稿機能」を盛り込む場合、その要件を明確にしておかないと、例えば「画像を添付できるか」「評価は星5つ制か」などの詳細が決まらず、後々の開発で手戻りが発生する可能性があります。

### **要件定義のフェーズとソフトウェア開発プロセスとの関係**

ソフトウェア開発プロセスには、大きく分けて以下のフェーズがあります。

1. **計画フェーズ:** プロジェクトの目的やスコープ、リソースの確認。
2. **要件定義フェーズ:** 開発すべき機能や性能の詳細を定義。
3. **設計フェーズ:** システムのアーキテクチャやデータベース設計などを行う。
4. **実装フェーズ:** コードの実写やユニットテストを行う。
5. **テストフェーズ:** システム全体のテストを実施。
6. **運用・保守フェーズ:** システムのリリース後の運用やバグ修正、アップデートを行う。

要件定義はソフトウェア開発プロセスの初期段階に位置し、その後の設計、実装、テストの基盤となる非常に重要なステップです。正確な要件定義により、後のフェーズでの変更や手戻りを大幅に減少させることができます。

## **要件収集の方法**

### **ステークホルダーの特定と関与**

ステークホルダーとは、プロジェクトの影響を受ける、または影響を与えるすべての人々や組織を指します。

例えばオンライン書店のシステム開発の場合、ステークホルダーには、エンドユーザー、開発チーム、マーケティングチーム、営業部門、サプライヤーなどが含まれるでしょう。

ステークホルダーの関与は要件の正確性と完全性を保証するために不可欠です。

### **インタビューとヒアリングの技術**

インタビューやヒアリングは、ステークホルダーから直接情報を収集する一般的な方法です。

### **ドキュメント分析と既存資料の活用**

既存の文書や資料から要件を抽出する方法です。これは、特に既存システムの改善やアップデートが必要な場合に有効です。

具体例: 以前のバージョンのオンライン書店システムのユーザーマニュアルやトラブルシューティングガイドを調査し、どの部分が改善されるべきかを特定する。

### **ユーザーストーリーの作成**

ユーザーストーリーは、エンドユーザーの視点でシステムの機能を記述する方法です。形式は "\[ユーザータイプ]として、\[アクション]を実行したい。なぜなら、\[利益/価値]を得るためだ。" という記載が一般的です。

具体的なユーザーストーリーの例を日本語で表現すると「読者として、ジャンル別に書籍を検索したい。なぜなら、自分の興味に合った書籍を見つけるためだ。」などと記述できるでしょう。

## **要件の分類と整理**

### **機能要件と非機能要件の違い**

* **機能要件:** システムが提供すべき「機能」に関する要件。ユーザーがシステムを通じて達成したい目的やタスクに関連するもの。

  **具体例:**

  * オンライン書店での「書籍の検索機能」
  * ショッピングカートに商品を追加する機能
* **非機能要件:** システムの「品質」に関する要件。パフォーマンス、セキュリティ、利便性など、具体的な機能ではなく、システム全体として満たすべき条件や基準。

  **具体例:**

  * ページのロード時間は3秒以内にする
  * データベースのバックアップは毎日自動で行う

### **優先度と重要度の設定**

* **優先度:** システム開発の進行において、どの要件を先に実装するかの順序を決めるための指標。
* **重要度:** その要件がプロジェクトやビジネスの成功にどれだけ寄与するかの指標。

**具体例:** オンライン書店では、書籍の検索機能は「高い重要度」を持ち、同時に「高い優先度」を持つ。一方、書籍のおすすめ機能は「中程度の重要度」を持つが、基本的なショッピング機能が完成するまでは「低い優先度」を持つ。

### **要件の分解と階層化**

要件は大きなものから小さなものまで様々な粒度で存在します。これを適切に分解し、階層化することで、より詳細な要件を明確にすることができます。

**具体例:** 「書籍の検索機能」を分解すると:

* ジャンル別検索
* 著者別検索
* キーワード検索 といったサブ要件に階層化できます。

## **要件記述の技術**

### **要件文書の基本構造**

要件文書は、システムの要求を明確に伝えるための文書であり、以下のような基本的な構造を持っています。

1. **はじめに:** プロジェクトの背景、目的、範囲などの概要情報。
2. **機能要件:** システムが持つべき機能に関する詳細な記述。
3. **非機能要件:** システム全体の品質に関する要件。
4. **用語集:** 文書内で使用される専門用語や略語の定義。
5. **参考文献:** 要件を理解するための補足情報や関連文献。

**具体例:** オンライン書店の要件文書では、機能要件に「書籍の検索機能」、非機能要件に「ページのロード時間は3秒以内にする」などが記述される。

### **SMART原則に基づいた要件の記述**

SMART原則とは、要件が以下の5つの特性を持つべきであるという原則です。

* **S (Specific):** 明確である
* **M (Measurable):** 測定可能である
* **A (Achievable):** 実現可能である
* **R (Relevant):** 関連性がある
* **T (Time-bound):** 時間制限がある

**具体例:** 「ユーザーは書籍を検索できる」ではなく、「ユーザーはタイトル、著者、ジャンルをキーワードとして、3秒以内に書籍を検索できる」という要件がSMART原則に基づいている。

### **ユースケースとシナリオの活用**

ユースケースは、システムの外部からの利用者（アクター）とシステムとの間の相互作用を記述するものです。シナリオは、特定の目的を達成するためのユースケースの一連のステップを詳細に説明するものです。

**具体例:**

* **ユースケース:** 「書籍購入」
  * **アクター:** オンライン書店のユーザー
  * **シナリオ:**
    1. ユーザーは書籍を検索する。
    2. ユーザーは検索結果から書籍を選択する。
    3. ユーザーは書籍をカートに追加する。
    4. ユーザーはカートに進み、購入手続きを行う。

## **要件の確認と承認**

### **ステークホルダーとの要件レビューの重要性**

要件レビューはプロジェクトの成功を確実にするためのキーアクティビティです。以下の利点があります：

1. **認識のズレの防止:** ステークホルダーとのコミュニケーションを通じて要件に関する認識のズレを早期に発見し、対応することができます。
2. **高品質の製品:** レビューを通じて品質の高い要件を確定でき、それに基づき高品質な製品やサービスを提供することが可能になります。

**具体例:** オンライン書店の要件として「ユーザーは書籍を検索できる」という項目があった場合、ステークホルダーとのレビューを通じて「ジャンル別や著者別に絞り込んで検索する機能も必要」という具体的な要件に改善される可能性があります。

### **レビューのプロセスとベストプラクティス**

1. **事前準備:** 参加者には事前に要件文書を配布し、事前に読んでおくように依頼します。
2. **レビューミーティング:** 指定された日時にステークホルダーとともにレビューミーティングを実施します。
3. **フィードバックの整理:** レビューミーティングで得られたフィードバックを整理し、要件文書に反映します。
4. **再レビュー:** 必要に応じて再度レビューミーティングを実施します。

#### **ベストプラクティス**

* **アジェンダの明確化:** レビューミーティングの前にアジェンダを明確にし、参加者に共有します。
* **時間の管理:** レビューミーティングの時間は適切に管理し、全ての要件をカバーするようにします。
* **意見の収集:** ミーティング中、積極的に参加者の意見やフィードバックを収集します。

### **要件の承認プロセスと変更管理**

1. **承認のリクエスト:** 要件が最終的に決定された後、ステークホルダーに承認を求めます。
2. **変更リクエスト:** プロジェクト進行中、新しい要件や変更の必要が生じた場合、変更リクエストを作成します。
3. **変更の評価:** 変更リクエストを受けた後、その影響や必要性を評価します。
4. **変更の実施:** 評価の結果、変更が必要と判断された場合、変更を実施します。

**具体例:** オンライン書店で進行中のプロジェクトで、「書籍のレビュー機能」の追加が提案された場合、この変更リクエストを評価し、影響やコストを考慮して変更を承認または却下します。

## **要件変更の管理**

### **変更要求の受け入れと評価**

変更要求はプロジェクト中にしばしば生じるものであり、適切に管理することはプロジェクトの成功に直結します。

1. **変更要求の受け入れ:** ステークホルダーやプロジェクトチームからの変更要求をフォーマルに受け入れるプロセスを設定します。変更要求フォームや専用のツールを用意することで、要求内容を明確にします。

**具体例:** 新たに「ゲストユーザーとしての購入機能」を追加したいという要求がオンライン書店の開発プロジェクトで提案された場合、これをフォーマルに受け入れる手続きをとります。

2. **変更の評価:** 受け入れた変更要求を評価します。これには変更の必要性、緊急性、影響範囲、コストなどが考慮されます。

**具体例:** ゲストユーザー機能の追加にはどれくらいの開発時間がかかるのか、他の機能にどんな影響が出るのか、を評価します。

### **変更の影響評価とリスク管理**

1. **影響評価:** 変更が他の要件やシステム全体にどのような影響を与えるかを評価します。

**具体例:** ゲストユーザー機能の追加によって、データベースや認証システムに変更が必要になるかもしれません。

2. **リスク管理:** 新しい要求がもたらすリスクを特定し、そのリスクを軽減または回避するための対策を考えます。

**具体例:** ゲストユーザーとしての購入が増えると、不正利用のリスクが高まる可能性がある。そのため、不正利用の検出機能の強化を検討する。

### **変更の文書化と追跡**

1. **文書化:** 受け入れられた変更要求は文書化され、プロジェクトの文書に統合されます。
2. **追跡:** 変更の進行状況や影響を追跡し、必要に応じてステークホルダーに報告します。変更ログや専用のツールを用いることで、変更の状況を一元的に把握することができます。

**具体例:** ゲストユーザー機能の追加の変更要求は、変更ログに日付、要求者、変更内容、影響範囲などとともに記録されます。その後、この変更の実装進行状況やテストの結果なども同じログに更新して追加されます。

## **チームでの協力**

### **開発チームとの連携とコミュニケーション**

開発チームとの連携は、プロジェクトの成功にとって不可欠です。明確なコミュニケーションを持つことで、要件の誤解や後での修正が必要となるリスクを最小限に抑えます。

**具体例:**\
新しいログイン機能を導入する際、開発チームとセキュリティ面での要件やUI/UXに関する要件を定期的に確認・議論することで、実装時の誤解や後からの変更要求を防ぎます。

### **プロジェクトマネージャーとの協力**

プロジェクトマネージャーは、プロジェクトの進行状況やリソースの最適な割り当てを管理する役割を持っています。要件を定義する際、彼らとの連携はプロジェクトの効率的な進行のために重要です。

**具体例:**\
新しい機能のリリース日が迫っている時、プロジェクトマネージャーはどの要件が優先的に開発されるべきか、またどの要件を後回しにするかを決定するための情報をエンジニアや要件定義者から収集します。

### **レビューとフィードバックのプロセス**

開発が完了した後、実装された機能やシステムをレビューし、必要なフィードバックを提供することで、品質を確保します。

**具体例:**\
eコマースサイトの新しいチェックアウト機能が実装された後、チーム全体でレビューを行います。このレビューで、ユーザビリティの問題やバグが発見された場合、そのフィードバックをもとに修正や改善を行います。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://engineer.toggle.co.jp/chapter-1-toggle-holdings-engineer-101/ji-chu-yan-xiu/yao-jian-ding-yi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
