# 第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)