第二章 需求文档撰写:用户故事编写技巧、功能需求与非功能需求的区分、需求优先级标注方法

需求文档这东西,说难不难,说简单也不简单。我见过太多项目,代码写得漂漂亮亮,最后却因为需求没对齐而翻车。说白了,需求文档就是整个信号系统的「宪法」——它决定了后续所有工作的边界和方向。

今天咱们就聊聊需求文档撰写的三个核心技能:用户故事怎么写才接地气、功能需求和非功能需求到底怎么分、以及优先级怎么标才不打架。

2.1 用户故事编写技巧

用户故事不是写作文,更不是列清单。我刚开始带项目时,也犯过「把用户故事写成功能说明书」的毛病。后来踩了几次坑才明白,用户故事的核心是「沟通的桥梁」,而不是「需求的枷锁」。

2.1.1 标准模板:As a... I want... So that...

这个模板大家应该都见过:

作为【用户角色】
我想要【功能目标】
以便于【业务价值】

举个例子,咱们做雷达信号处理系统:

作为【雷达操作员】
我想要【实时查看目标回波信号的频谱图】
以便于【快速判断目标类型和运动状态】

你看,这个描述里没有写「用FFT算法计算频谱」,也没有写「采样率设为10MHz」。为什么?因为用户故事关注的是「用户要什么」,而不是「系统怎么做」。

我的个人习惯:写用户故事时,我会先问自己三个问题——谁在用?要干嘛?为什么?如果这三个问题回答不清楚,那这个故事大概率是废的。

2.1.2 编写技巧:INVEST原则

我在项目中用过一套很实用的检查标准,叫INVEST。每个字母代表一个维度:

字母 含义 说明
I Independent(独立的) 故事之间尽量不依赖,可以独立开发和测试
N Negotiable(可协商的) 不是铁律,团队可以讨论细节
V Valuable(有价值的) 对用户或业务有明确价值
E Estimable(可估算的) 团队能大致评估工作量
S Small(小粒度的) 能在一次迭代内完成
T Testable(可测试的) 有明确的验收标准

嗯,这里要注意——很多新手容易把用户故事写得太「大」。比如「作为用户,我想要一个完整的信号分析平台」,这故事大到没法估算了。我建议拆成多个小故事,比如「查看时域波形」、「查看频谱」、「导出数据」等等。

2.1.3 验收条件:别让故事变成空话

光有故事还不够,还得有验收条件。我曾经吃过这个亏——故事写完了,开发也做完了,结果测试说「这不对啊,用户要的是实时显示,你这延迟了2秒」。你看,问题出在验收条件没写清楚。

验收条件一般用「Given... When... Then...」格式:

Given(给定):雷达处于正常工作状态,目标在探测范围内
When(当):操作员点击「开始频谱分析」按钮
Then(那么):系统应在1秒内显示目标回波的频谱图,频率分辨率不低于1kHz
避坑指南:我曾经遇到过一个项目,验收条件里写「系统响应要快」。结果开发觉得1秒就算快,测试觉得200毫秒才算快。后来我学乖了——所有「快」、「好」、「稳定」这类模糊词,必须量化成具体指标。

2.2 功能需求与非功能需求的区分

这个区分,说实话,很多做了两三年的工程师都搞不太清楚。我见过有人把「系统要稳定运行」写在功能需求里,也有人把「支持WiFi连接」写在非功能需求里。咱们今天把它理清楚。

2.2.1 功能需求:系统「做什么」

功能需求描述的是系统应该提供的具体行为或功能。说白了,就是用户能用系统「干哪些事」。

信号系统里常见的功能需求:

  • 系统应支持采集ADC数据,采样率可配置为1MHz、10MHz、100MHz
  • 系统应提供FIR滤波器,截止频率可调
  • 系统应支持将处理后的数据导出为CSV格式
  • 系统应显示实时波形,支持缩放和平移

你看,这些都是「做什么」——采集、滤波、导出、显示。每个功能需求都对应一个具体的操作或输出。

2.2.2 非功能需求:系统「做得怎么样」

非功能需求描述的是系统的质量属性或约束条件。它不关心「做什么」,而是关心「做得好不好」或者「在什么条件下做」。

常见的非功能需求分类:

类别 示例
性能 信号处理延迟不超过50ms
可靠性 系统连续运行72小时无故障
安全性 数据传输采用AES-256加密
可维护性 代码注释覆盖率不低于30%
兼容性 支持Windows 10/11和Ubuntu 20.04/22.04
我的经验:非功能需求往往比功能需求更难写,也更容易被忽略。我记得有个项目,功能需求写得满满当当,结果上线后发现系统在高温环境下频繁重启——因为没人写「工作温度范围:-20°C到60°C」这个非功能需求。从那以后,我要求每个项目都必须有一份独立的非功能需求清单。

2.2.3 区分技巧:问自己两个问题

如果你不确定某个需求是功能还是非功能,问自己两个问题:

  1. 这个需求描述的是「一个操作」还是「一个属性」?操作→功能需求,属性→非功能需求。
  2. 去掉这个需求,用户还能不能用系统?能用但体验差→非功能需求;不能用→功能需求。

举个例子:「系统应在5秒内完成启动」。去掉它,系统还能启动吗?能,只是慢一点。所以它是非功能需求(性能)。而「系统应支持用户登录」,去掉它,用户根本进不去系统,所以它是功能需求。

2.3 需求优先级标注方法

需求永远做不完,资源永远不够用。你想想看,哪个项目不是这样?所以优先级标注就成了需求文档里最关键的一环。

2.3.1 MoSCoW方法:最实用的优先级模型

我个人最常用的是MoSCoW方法,简单粗暴:

优先级 含义 说明
M - Must have 必须有 没有这个需求,系统无法上线或无法满足核心业务
S - Should have 应该有 很重要,但暂时没有也能接受,可以后续迭代
C - Could have 可以有 锦上添花的功能,有最好,没有也不影响核心
W - Won't have 不会有 明确本次不做,但记录下来供未来参考

举个例子,一个信号采集系统的需求优先级:

M - 支持ADC数据采集,采样率可配置
M - 实时显示采集波形
S - 支持波形回放功能
S - 导出数据为MAT文件
C - 支持多通道同时显示
C - 波形颜色可自定义
W - 支持远程控制采集
W - 集成AI自动识别功能
一个小技巧:标注优先级时,我会让业务方和开发团队一起参与。业务方负责说「哪个功能最赚钱」,开发团队负责说「哪个功能最难做」。两边一碰撞,优先级就清晰了。

2.3.2 Kano模型:从用户满意度角度思考

除了MoSCoW,我还偶尔用Kano模型来辅助判断。Kano模型把需求分为三类:

  • 基本型需求:用户觉得「理所当然」的功能。比如信号采集系统必须能采集数据。这类需求优先级最高,不做就完蛋。
  • 期望型需求:用户明确提出的功能。比如「我想要一个频谱分析功能」。这类需求做得好,用户满意度会线性提升。
  • 兴奋型需求:用户没想到的功能。比如「系统能自动识别异常信号并报警」。这类需求做出来会让用户惊喜,但优先级可以放低。

你想想看,如果基本型需求没做好,用户会直接骂娘。但如果兴奋型需求没做,用户也不会觉得少了什么。所以优先级排序应该是:基本型 > 期望型 > 兴奋型。

2.3.3 优先级标注的常见误区

我见过太多项目在优先级上翻车,这里列几个常见的坑:

  • 全是Must have:如果所有需求都是最高优先级,那等于没有优先级。我一般要求Must have不超过总需求的20%。
  • 优先级和难度混淆:「这个功能很难做,所以优先级高」——这是错的。优先级应该由业务价值决定,不是由技术难度决定。
  • 优先级一成不变:需求是会变的。我建议每个迭代开始前重新审视一次优先级,别让三个月前的优先级决定今天该做什么。
我曾经踩过的坑:有个项目,业务方把所有需求都标成了Must have,说「每个功能都重要,一个都不能少」。结果开发团队疲于奔命,每个功能都做得半生不熟。后来我强制要求业务方必须选出Top 3的Must have,其他全部降级。项目才终于走上正轨。

2.4 小结

需求文档撰写这件事,说到底就是三个字:对齐、量化、排序

用户故事帮你对齐用户和开发团队的理解,功能需求和非功能需求的区分帮你量化系统的边界和质量,优先级标注帮你排序哪些先做哪些后做。

嗯,今天就聊到这里。下一章咱们聊聊系统架构设计文档怎么写——那可是整个项目的骨架,比需求文档还要命。