进阶 #software-eng#requirements

需求获取与分析

需求分析(Requirements Analysis)是确定"系统应该做什么"的过程——功能需求描述行为,非功能需求描述质量属性(性能、安全、可用性)

🏠 “我要一个学生选课系统”——但这不够

客户说:“我要一个学生选课系统。”

这就像你去装修公司说”我要装修”——然后甩手走了。装修师傅没法开工——因为”装修”太模糊了:铺什么地板?刷什么颜色?要不要拆墙?预算多少?

同样,“学生选课系统”也远远不够。需求分析就是把这种模糊的”我想要”变成精确的、可执行的规格说明的过程。

📐 需求分析(Requirements Analysis):确定”系统应该做什么”的过程。不是”怎么实现”,而是”到底要做什么”。

最著名的需求失败案例:丹佛国际机场的行李处理系统——需求定义不足导致系统延期 16 个月交付,超支 32 亿美元。


📋 需求的两种类型

① 功能需求——“系统能做什么”

描述系统应该提供的具体功能:

学生选课系统的功能需求:
✅ 学生能登录系统
✅ 学生能浏览课程列表
✅ 学生能选择课程(选课)
✅ 学生能查看已选课程
✅ 学生能退选课程
✅ 教师能发布课程信息
✅ 管理员能管理用户账号

功能需求应该是可验证的——“选课功能正常”不够精确,应该写”学生在选课开放期间可以点击’选课’按钮,系统在 1 秒内返回’选课成功’或失败原因”。

② 非功能需求——“系统有多好”

描述系统的质量属性——不关乎”做什么”,而关乎”做得怎么样”:

常见非功能需求维度:

性能:    系统能支持 5000 人同时选课,页面加载 < 2 秒
安全性:  密码必须加密存储,所有通信使用 HTTPS
可用性:  系统 99.9% 时间可用(每年停机 < 8.76 小时)
可维护性:代码必须有单元测试覆盖 > 80%
兼容性:  支持 Chrome、Firefox、Safari 最新版本

🚗 类比:买车

功能需求:能坐 5 个人、有空调、有天窗、后备箱能放两个行李箱。

非功能需求:百公里加速 < 10 秒、油耗 < 8L/100km、安全评级 5 星、质保 5 年。

功能需求决定了”这辆车能做什么”,非功能需求决定了”这辆车好不好用”。


🔍 需求获取方法

方法怎么做适用场景
访谈和用户/客户一对一交流探索性需求、高层目标
问卷大规模收集意见用户基数大、需求相对明确
观察看用户实际怎么工作用户”说不清自己要什么”
原型做一个低保真 Demo 让用户试用验证对需求的理解是否一致
文档分析研究现有系统的文档替换旧系统时

一个经典问题:用户根本说不清自己要什么。

“如果我问人们想要什么,他们会说’更快的马’。“——亨利·福特

需求的挑战不是”记录用户说的”,而是理解用户真正需要什么。用户说”要更快的马”——实际需要的是”更快地到达目的地”——所以汽车才是对的。


📝 用户故事(User Story)——敏捷中的需求表达

在敏捷开发中,需求通常写成用户故事——一种简洁的”角色-功能-价值”格式:

作为 <角色>
我希望 <功能>
以便 <价值>

示例:
作为 学生
我希望 在线退选已选的课程
以便 在课程时间冲突时可以调整选课方案

好的用户故事遵循 INVEST 原则

字母含义说明
IIndependent(独立)故事之间不互相依赖
NNegotiable(可协商)不必太细致,细节可以讨论
VValuable(有价值)对用户有明确的价值
EEstimable(可估算)团队能估算工作量
SSmall(小型)一个 Sprint 内能完成
RTestable(可测试)有明确的验收条件

验收条件(Acceptance Criteria)

用户故事不能只有一句话——必须有明确的验收条件才能说”做完了”:

作为 学生
我希望 用学号和密码登录系统
以便 查看我的选课信息

验收条件:
1. 输入正确的学号和密码 → 登录成功,跳转到主页
2. 输入错误的密码 → 显示"密码错误"
3. 学号不存在 → 显示"学号未注册"
4. 连续 5 次输入错误 → 账号锁定 30 分钟

📄 需求文档

传统项目中,需求被写成详细的需求规格说明(SRS, Software Requirements Specification)

1. 引言
  1.1 目的
  1.2 范围
  1.3 定义
2. 总体描述
  2.1 产品视角
  2.2 用户特征
  2.3 假设和依赖
3. 具体需求
  3.1 功能需求
    3.1.1 用户登录
    3.1.2 课程浏览
    ...
  3.2 非功能需求
    3.2.1 性能需求
    3.2.2 安全需求
    ...

💡 在敏捷中,文档可以”薄”很多——用户故事卡片 + 验收条件通常就够了。但不管用什么形式,“需求对齐”这件事本身不能跳过。


📝 小结

概念一句话
功能需求系统”做什么”——功能、行为
非功能需求系统”做得多好”——性能、安全、可用性
用户故事”作为X,我希望Y,以便Z”——敏捷的需求表达方式
INVEST 原则好用户故事的 6 个标准
验收条件”怎么才算做完了”的具体标准
需求陷阱用户说不清自己要什么——需要主动挖掘

🎯 小练习:为”图书馆借书系统”写 5 个用户故事和对应的验收条件。包括:借书、还书、查询、预约、逾期处理。

为什么先学这个? 需求明确了,才能谈”怎么设计”——软件架构与设计模式