4、无歧义性的核心概念:什么是有歧义的需求、歧义的代价、如何定义无歧义
好,咱们今天聊一个特别实在的话题——歧义。
我做了这么多年需求分析,踩过最大的坑,几乎都跟「歧义」有关。说白了,一句话没说清楚,后面开发、测试、验收全在猜。猜对了是运气,猜错了……嗯,那就是事故。
4.1 什么是有歧义的需求
先给个定义:有歧义的需求,就是不同的人读到同一句话,脑子里浮现出不同的画面。
你想想看,需求文档里写「系统要支持批量导入」,张三理解是一次选10个文件,李四理解是一次选1000个,王五觉得应该是用Excel模板一次性导入。三个人都觉得自己理解对了,但做出来的东西完全不一样。
我归纳了几种常见的歧义类型,你在实际工作中肯定也遇到过:
| 歧义类型 | 典型例子 | 问题在哪 |
|---|---|---|
| 词汇歧义 | 「用户」指的是谁?普通用户?管理员?还是游客? | 同一个词,不同人有不同理解 |
| 指代歧义 | 「点击按钮后,它会变成灰色」——它指的是按钮还是页面? | 代词指代不明确 |
| 范围歧义 | 「数据保留30天」——是从创建日算起?还是从最后访问日算起? | 边界条件没说清楚 |
| 逻辑歧义 | 「如果用户未登录且订单金额大于100,则显示优惠券」——未登录怎么知道订单金额? | 条件之间逻辑矛盾 |
| 省略歧义 | 「系统自动发送通知」——什么通知?发给谁?什么时机发? | 关键信息被省略 |
核心判断标准:如果两个不同的开发人员,基于同一段需求描述,写出了两套不同的代码,且都认为自己是对的——那这段需求就是有歧义的。
4.2 歧义的代价
说实话,很多人觉得「有点歧义没关系,到时候沟通一下就行了」。我以前也这么想,直到被现实狠狠教育了一次。
我曾经参与过一个电商后台项目。需求里写了一句:「订单超过30分钟未支付,自动取消。」
开发觉得:从订单创建时间开始算30分钟。
产品觉得:从用户进入支付页面开始算30分钟。
测试觉得:两种都测一下,但不知道哪个是标准。
结果呢?上线第一天,大量订单被误取消,用户投诉电话打爆了。最后查下来,就因为这10个字没写清楚。修复、补偿、道歉,前后折腾了两周。
你看,一句歧义,代价有多大?我总结了一下,歧义带来的损失通常集中在三个方面:
- 返工成本——做完了发现不对,重来。这是最直接的损失。
- 沟通成本——反复确认、开会、对需求。时间就这么耗掉了。
- 信任成本——开发不信需求文档,产品不信开发能理解。团队内耗开始。
注意:歧义还有一个隐藏代价——它会让测试用例写不全。测试人员只能靠猜去覆盖场景,漏掉的边界条件就成了线上bug的温床。
4.3 如何定义无歧义
那什么样的需求才算「无歧义」?我个人的标准很简单,就三条:
- 唯一解释——任何一个人读这段需求,得出的理解是一致的。
- 可验证——能写出明确的测试用例来证明「做对了」或「做错了」。
- 无二义性词汇——避免使用「大概」「可能」「适当」「尽快」这类模糊词。
举个例子。有歧义的写法是:
「系统应在适当时候对用户进行提醒。」
无歧义的写法是:
「当用户连续输入错误密码3次后,系统应在1分钟内弹出提示框,
内容为'密码错误已达上限,请30分钟后再试',提示框不可关闭。」
看出区别了吗?后者把触发条件、执行动作、时间约束、内容格式、交互行为全写死了。没有任何猜测空间。
一个小技巧:写完一段需求后,试着用「如果我是开发,我会怎么做」来读一遍。如果发现有两种以上的实现方式,那就说明有歧义,需要改。
另外,我建议你在需求文档里建立一个术语表。把项目里所有关键术语的定义统一写清楚。比如:
| 术语 | 定义 |
|---|---|
| 用户 | 已注册并登录的普通用户,不含管理员 |
| 订单状态 | 待支付、已支付、已取消、已完成,四种状态互斥 |
| 批量导入 | 一次选择1个Excel文件,文件内最多包含1000条记录 |
有了这个表,很多歧义在源头就被掐死了。
最后说一句:无歧义不是追求绝对的完美,而是追求「所有人都能达成一致的理解」。你不需要把文档写成法律条文,但至少要保证每个关键点都经得起追问。
嗯,这一节就到这。下一节咱们聊聊怎么用结构化方法写出无歧义的需求,那是我个人最常用的套路,保证实用。