前置知识: 软件工程与测试

需求分析方法

7 min中级

用户故事、用例图、需求获取与需求管理。

1. 从”点外卖却收到一本书”说起

1.1 一个需求失败的经典场景

想象你在外卖 App 上点了一份”黄焖鸡米饭”,结果骑手送来了一本书。你当然会愤怒。但更糟的是,如果这是一个软件项目——你想要的和你理解的,从一开始就是两回事。

现实中这样的例子比比皆是:

  • 产品经理说”做个推荐功能”,开发做成了”按销量排序”——因为”推荐”没定义清楚
  • 用户说”登录要简单”,开发做成”手机号+验证码”——但用户想要的是”微信一键登录”
  • 需求文档写了”支持多语言”,开发做了”中英文切换”——但产品要的是”自动识别用户语言”

这些问题的共同根源:需求没有被”搞清楚、写明白、对齐验证”——这正是**需求工程(Requirement Engineering)**要解决的核心问题。

1.2 什么是需求工程

需求工程是系统地获取、分析、记录、验证需求的过程——确保”我们建造的是正确的系统”(做正确的事),而不仅仅是”正确地建造系统”(正确地做事)。

需求工程做不好,后面的设计、编码、测试都是”在错误的地基上盖楼”——返工成本成倍放大。

2. 需求层次:从”为什么”到”怎么做”

2.1 三个层次

业务需求 → 用户需求 → 系统需求
(为什么)    (做什么)    (怎么做)
层次来源示例
业务需求利益相关者提升用户留存率 20%
用户需求最终用户用户能快速找到所需商品
系统需求开发团队搜索响应时间 < 200ms

理解:

  • 业务需求回答”为什么做”——业务目标(留存率、收入、效率)
  • 用户需求回答”用户要做什么”——用户视角的功能描述
  • 系统需求回答”系统要怎么做”——技术视角的可实现描述

需求工程师的职责:把”业务需求”翻译成”用户需求”,再和开发团队一起翻译成”系统需求”。每一层翻译都可能失真,所以每层都要验证。

2.2 功能需求 vs 非功能需求

类型说明示例
功能需求系统应该做什么用户可以创建订单
非功能需求系统应该做到什么程度订单创建响应时间 < 500ms

非功能需求(FURPS+ 分类):

类别说明示例
Functionality功能性功能完整性
Usability可用性学习曲线、操作步骤
Reliability可靠性MTBF、容错能力
Performance性能响应时间、吞吐量
Supportability可支持性可维护性、可扩展性

初学者最容易忽略非功能需求。功能需求好定义(“能下单”),非功能需求(“下单要快""系统要稳定”)常常没人写——直到上线后才发现性能不达标、可用性不满足。

3. 需求获取:怎么把”想要”挖出来

3.1 六种获取技术

方法适用场景优点缺点
访谈深入了解需求信息丰富耗时
问卷调查大范围收集覆盖面广深度不够
观察了解实际工作流真实场景可能影响行为
原型需求不明确直观反馈成本较高
文档分析现有系统改造基于事实可能过时
焦点小组收集多方意见多角度组织难度大

3.2 需求获取流程

1. 识别利益相关者(谁关心这个系统?)
2. 确定获取策略(用什么方法?)
3. 执行获取活动(去问、去观察、去试)
4. 整理和记录需求(写下来)
5. 验证需求完整性(够了吗?准吗?)

关键技巧:需求获取最怕”用户说的不是心里想的”。常用追问技巧:

  • “为什么需要这个功能?“(挖业务价值,而不是直接实现)
  • “如果不做这个功能,会发生什么?“(判断真实优先级)
  • “这个功能谁会用它?什么时候用?“(明确场景)

4. 用户故事:敏捷世界的需求载体

4.1 标准格式

作为 [角色],
我希望 [功能],
以便 [业务价值]

三个要素:

  • 角色:谁在使用(用户、管理员、运营)
  • 功能:要做什么
  • 价值:为什么做(这是最容易漏掉、也最重要的)
作为 注册用户,
我希望 能够收藏喜欢的文章,
以便 下次可以快速找到它们

4.2 INVEST 原则

好的用户故事应该满足:

原则含义
Independent故事之间尽量独立
Negotiable故事是可协商的
Valuable对用户或业务有价值
Estimable可以估算工作量
Small足够小,一个 Sprint 内完成
Testable可以验证是否完成

4.3 用户故事拆分

大故事(史诗 Epic)需要拆成可执行的小故事:

拆分模式说明示例
按工作流步骤拆分流程中的步骤搜索 → 筛选 → 下单
按数据变体拆分不同数据类型国内支付 → 国际支付
按操作拆分 CRUD 操作创建订单 → 查看订单
按业务规则拆分不同规则普通用户 → VIP 用户
按界面拆分不同界面移动端 → 桌面端

5. 用例图:需求的图形化表达

5.1 用例图元素

用例图(Use Case Diagram)用图形描述”谁(参与者)能用系统做什么(用例)”:

元素符号说明
参与者小人与系统交互的外部实体
用例椭圆系统提供的功能
系统边界矩形系统范围
关联实线参与者与用例的关系
包含«include»必然执行的行为
扩展«extend»条件执行的行为
泛化空心箭头一般到特殊

5.2 用例描述模板

用例图只画”框架”,真正的内容在用例描述里:

用例名称: 用户登录
参与者: 注册用户
前置条件: 用户已注册
主流程:
  1. 用户输入用户名和密码
  2. 系统验证凭据
  3. 系统创建会话
  4. 系统跳转到首页
备选流程:
  2a. 凭据无效: 提示错误,允许重试
  2b. 账户锁定: 提示联系管理员
后置条件: 用户已登录

用例描述的威力:它强迫你写清楚”主流程 + 备选流程”——备选流程(异常路径)往往是被遗忘需求的重灾区。

6. 需求管理:需求是会变的

6.1 需求变更控制

需求不是”一次定死”的,但变更必须受控:

变更请求 → 影响分析 → 变更评审 → 批准/拒绝 → 实施 → 验证
步骤关键活动
变更请求记录变更内容和原因
影响分析评估对进度、成本、质量的影响
变更评审CCB(变更控制委员会)决策
实施修改需求和设计
验证确认变更正确实施

关键认知:需求变更不可怕,可怕的是**“无记录、无评估”的随意变更**。受控的变更是”管理”,不受控的变更是”灾难”。

6.2 需求追踪矩阵

需求追踪矩阵(RTM)把需求与设计、代码、测试关联起来,保证”每个需求都有落实、都有验证”:

需求ID需求描述设计文档代码模块测试用例状态
REQ-01用户登录HLD-3.1auth.pyTC-01~03完成
REQ-02密码重置HLD-3.2reset.pyTC-04~06开发中

RTM 的价值:上线前检查矩阵——有没有”设计里没有、代码里没有、测试里没有”的需求?有没有”代码里实现了、但需求里没有”的功能(过度开发)?

6.3 需求验证

方法说明
需求评审同行评审需求文档
原型验证用原型确认需求理解
验收测试用户确认需求满足
需求基线确认的需求版本冻结

7. 常见误区

误区一:需求 = 用户说的原话。 → 用户说的往往是”解决方案”,不是”真实需求”。要追问”为什么”,找到背后的业务价值。

误区二:需求文档越详细越好。 → 文档要”准确”和”可验证”,不是”厚”。一本没人读的 200 页需求文档,不如 10 页清晰的对齐文档。

误区三:需求分析是”分析阶段”的事,做完就完了。 → 需求贯穿整个生命周期(敏捷里尤其如此)。需求会变,管理好变化比”一次定死”更重要。

误区四:只定义功能需求,忽略非功能需求。 → 性能、安全、可用性这些”看不见”的需求,恰恰是上线后最容易出问题的。