# 第1章 需求工程

> **考试重要度**：★★★★  
> **核心内容**：需求的定义与层次、需求获取与分析技术、需求文档编写、需求管理

---

## 📢 开篇故事：一个失败的工资系统

A公司从300人发展到5000人，原来的手工工资管理方式完全跟不上了。总经理李云找到技术主管王奇说：

> "我们急需一个新工资系统！员工自己登记时间卡，系统自动算工资，五个月搞定，明白吗？"

王奇说："能不能再详细说说？比如有哪些角色用这个系统？每类人需要什么功能？数据怎么流转？"

李云不耐烦："我不就是用户吗？你们自己看着办不就行了？"

💬 **这个故事告诉我们什么？**

1. **老板 ≠ 用户**。老板说的是"业务需求"（高层次目标），但不是具体"用户需求"。
2. **需求不是想当然的**。开发人员不能凭空猜测用户要什么。
3. **不同角色有不同需求**。出纳、会计、财务主管、普通员工——每个人要的功能都不一样。
4. **需求需要花时间获取**。反复沟通、深入调查，急不得。

---

## 💡 一、什么是软件需求？

> **一句话定义**：需求就是用户对软件系统"应该做什么"和"应该做到什么程度"的期望。

### 三个权威定义

| 来源 | 定义 |
|------|------|
| **IEEE** | 用户解决问题所需的**条件或能力**；系统必须满足的**约束**；上述内容的**文档化表达** |
| **Davis** | 从软件外部可见的、满足用户的**特点、功能及属性**的集合 |
| **Sommerville** | 问题信息与系统**行为、特性、设计和实现约束**的描述集合 |

💬 **大白话**：需求就是三件事——**做什么功能**、**做到什么标准**、**有什么限制**。

---

## 💡 二、需求的三个层次

这是考试的重点！需求像一座三层金字塔：

```
        ┌──────────────┐
        │  业务需求     │  ← 老板视角："我们要什么"
        │  Business     │
        ├──────────────┤
        │  用户需求     │  ← 用户视角："我能用它干什么"
        │  User         │
        ├──────────────┤
        │  系统需求     │  ← 开发者视角："具体怎么实现"
        │  System       │
        └──────────────┘
```

| 层次 | 说明 | 举例（工资系统） |
|------|------|------------------|
| **业务需求** | 组织的高层次目标，回答"为什么要做这个系统" | "用计算机替代手工工资管理，五个月上线" |
| **用户需求** | 用户使用系统完成的任务，回答"用户能干什么" | "财务人员可以录入员工时间卡信息" |
| **系统需求** | 开发人员要实现的具体功能和约束，回答"系统必须做到什么" | "系统自动根据工时和销售额计算工资单" |

### 系统需求又分三类

| 类型 | 说明 | 举例 |
|------|------|------|
| **功能需求** | 系统必须提供的功能 | 录入时间卡、计算工资、生成工资单 |
| **非功能需求** | 系统的质量属性和约束 | 工资计算5秒内完成、数据不能丢失 |
| **领域需求** | 行业特有的要求 | 遵循《中国图书馆分类法》编目图书 |

---

## ✍️ 边学边练（一）

**题目**：下面哪一个是正确的需求层次顺序（从高到低）？

A. 用户需求 → 业务需求 → 系统需求  
B. 业务需求 → 用户需求 → 系统需求  
C. 用户需求 → 系统需求 → 业务需求  
D. 业务需求 → 系统需求 → 用户需求

**答案：**
**正确答案：B**

记住口诀：**"老板定方向（业务），用户说任务（用户），开发写代码（系统）"**，从抽象到具体。

---

## 💡 三、需求为什么重要？

### 数据说话

| 成功因素 | 占比 | 失败因素 | 占比 |
|----------|------|----------|------|
| 用户参与 | **15.9%** | 需求不完善 | **13.1%** |
| 管理层支持 | 13.9% | 缺乏用户参与 | 12.4% |
| 清晰的需求 | 13.0% | 资源不足 | 10.6% |

💬 **一句话**：需求的锅是最大的锅。需求搞错了，后面全白做。

### 五个常见需求败因

1. **需求不完整** — 只问了领导，没问实际操作的人
2. **缺乏用户参与** — 用户觉得"我不懂技术，你们自己弄"
3. **不切实际的期望** — "10年内每天24小时100%可用"（技术上做不到）
4. **需求变更频繁** — 今天加一个，明天改一个，后天不要了
5. **做了没人用的功能** — 开发了很多功能，实际使用率极低

---

## 💡 四、需求工程的核心流程

> **需求工程** = 所有跟需求有关的活动，分成"开发"和"管理"两大类。

```
需求开发（做对需求）：  获取 → 分析 → 定义（写文档）
需求管理（管好需求）：  验证 → 跟踪 → 变更控制
```

### ① 需求获取 — 怎么收集需求？

💬 **打个比方**：需求获取就像医生问诊——你不会直接让病人给自己开药，而是通过望闻问切来了解病情。

**六大获取技术**：

| 技术 | 怎么做 | 适用场景 |
|------|--------|----------|
| **联合分析小组** | 用户 + 领域专家 + 分析员坐在一起 | 大型复杂项目 |
| **用户访谈** | 一对一或小组面谈 | 深入了解具体业务 |
| **问卷调查** | 发放问卷收集大量反馈 | 用户分散、人数多 |
| **观察工作流程** | 到现场看用户怎么干活 | 发现"隐形的需求" |
| **原型法** | 做个简单的界面模型给用户试用 | 用户说不清楚自己要什么 |
| **文档分析** | 研究现有的规章制度、报表等 | 理解业务规则 |

⚠️ **关键认知**：很多需求是**隐形的**——用户觉得"这还用说吗"，但实际上不说就不会被实现。所以要主动挖掘。

### ② 需求分析 — 怎么理清需求？

两种基本方法：

| 方法 | 核心思想 | 使用的图 |
|------|----------|----------|
| **结构化分析 (SA)** | 把大问题分解成小问题，逐层细化 | DFD数据流图、ER图、状态转换图 |
| **面向对象分析 (OOA)** | 基于用例，用对象来组织系统 | 用例图、类图、顺序图等UML图 |

💬 **SA像切蛋糕**：一层层切，直到每一块都能一口吃掉。  
💬 **OOA像拼乐高**：先找到有哪些"积木块"（类），再定义他们怎么拼在一起（关系）。

### ③ 需求定义 — 写需求文档

**两份核心文档**：

| 文档 | 谁看 | 用什么语言 | 什么程度 |
|------|------|------------|----------|
| **用户需求说明书** | 用户审核 | 自然语言+业务术语 | 比较粗略 |
| **软件需求规格说明书(SRS)** | 开发团队 | 技术语言+图形模型 | 非常详细 |

💬 **区别**：用户需求说明书像"装修意向书"（我要北欧风、三室两厅），SRS像"施工图"（客厅长5米宽4米，插座位置距地30cm）。

### 🔑 优秀需求的七个标准

| 标准 | 含义 |
|------|------|
| **完整性** | 所有功能都说清楚了，不缺项 |
| **正确性** | 描述的功能确实是用户要的 |
| **无歧义** | 所有人读出来是同一个意思（别用"可能""差不多"） |
| **可行性** | 技术上能做、预算内能做 |
| **有优先级** | 分清楚哪些先做、哪些后做 |
| **必要性** | 每个需求都有存在的理由 |
| **可验证性** | 能通过测试来确认是否实现了 |

### ④ 需求验证 — 怎么确认需求是对的？

**验证什么**：
- ✅ 有效性：写的功能是不是用户真实需要的
- ✅ 一致性：有没有前后矛盾的描述
- ✅ 完备性：有没有漏掉的需求
- ✅ 可检验性：能不能设计测试来验证

**主要方法**：**需求评审** — 开发方和客户方一起逐条审查，签字确认后形成"需求基线"。

### ⑤ 需求跟踪

**双向跟踪**：
- **正向跟踪**：需求 → 设计 → 代码 → 测试，确保每个需求都有实现
- **逆向跟踪**：代码 → 设计 → 需求，确保每一行代码都有需求来源

### ⑥ 需求变更控制

💬 **需求变更像改装修方案**——墙都砌好了你说要拆？不是不行，但要评估影响、调整预算、重新排期。

**变更控制流程**：`提出变更 → 评审影响 → 审批 → 修改 → 重新确认`

---

## ✍️ 边学边练（二）

**题目**：图书馆系统有以下描述，请区分功能需求、非功能需求和领域需求。

1. 系统要能实现图书借阅和归还的登记
2. 每次借书登记必须在1秒内完成
3. 图书编目要遵循《中国图书馆分类法》
4. 借书登记出错率不超过万分之一
5. 某些文献只能在阅览室阅读，不能外借

**答案：**
- ① **功能需求** — 描述系统要做什么（借阅登记、归还登记）
- ② **非功能需求（性能）** — 描述系统要做到什么程度（1秒内）
- ③ **领域需求** — 行业特有的规则约束
- ④ **非功能需求（可靠性）** — 错误率的量化指标
- ⑤ **领域需求** — 版权法对图书馆业务的特殊约束

⚠️ **易错点**：区分功能需求和非功能需求的关键在于——**功能需求说"做什么"，非功能需求说"做多好"**。

---

## 📝 章末自测

**1. 填空题**
- 需求的三个层次从高到低依次是：（  ___  ）、（  ____  ）、（  ___  ）
- 优秀需求的七个特性中，"所有人读出来是同一个意思"指的是（  ___  ）（ ___ ）性
- 结构化分析的三个模型是：功能模型（DFD）、（  ___  ）、（  ___  ）

**2. 简答题**
- 简述"用户需求说明书"和"软件需求规格说明书(SRS)"的区别。
- 结构化分析(SA)和面向对象分析(OOA)的核心区别是什么？

**3. 应用题**
- 某在线购物系统，请分别写出一条：业务需求、用户需求、功能需求、非功能需求。

**答案：**
**填空题答案**：
- 业务需求、用户需求、系统需求
- 无歧义性
- 数据模型（ER图）、行为模型（状态转换图）

**简答题答案**：
- 用户需求说明书用自然语言+业务术语描述，内容粗略，给用户审核用；SRS用技术语言+图形描述，内容精细，是开发的直接依据。
- SA把系统按功能层层分解，用DFD、ER图等；OOA基于用例识别对象，用UML图来描述，是目前的主流方法。

**应用题参考答案**：
- 业务需求："建立一个在线购物平台，提升销售额30%"
- 用户需求："注册用户可以浏览商品、加入购物车、下单支付"
- 功能需求："系统应提供商品搜索功能，支持按名称、类别、价格范围筛选"
- 非功能需求："页面加载时间不超过3秒，支持1000人同时在线"

---

## 📘 真题演练

**题目**（教材课后习题）：下列哪些是需求获取的技术？（多选）

A. 用户访谈  
B. 代码走查  
C. 问卷调查  
D. 原型法  
E. 观察用户工作流程  
F. 单元测试

**答案：**
**正确答案：A、C、D、E**

B（代码走查）和F（单元测试）属于开发/测试阶段的活动，不是需求获取技术。

需求获取的六大技术：联合分析小组、用户访谈、问卷调查、观察工作流程、原型法、文档分析。

---
> 🔗 下一篇：[第3章 用例图](第03章-用例图.md)
