4、无歧义性的核心概念:什么是有歧义的需求、歧义的代价、如何定义无歧义

好,咱们今天聊一个特别实在的话题——歧义

我做了这么多年需求分析,踩过最大的坑,几乎都跟「歧义」有关。说白了,一句话没说清楚,后面开发、测试、验收全在猜。猜对了是运气,猜错了……嗯,那就是事故。

4.1 什么是有歧义的需求

先给个定义:有歧义的需求,就是不同的人读到同一句话,脑子里浮现出不同的画面。

你想想看,需求文档里写「系统要支持批量导入」,张三理解是一次选10个文件,李四理解是一次选1000个,王五觉得应该是用Excel模板一次性导入。三个人都觉得自己理解对了,但做出来的东西完全不一样。

我归纳了几种常见的歧义类型,你在实际工作中肯定也遇到过:

歧义类型 典型例子 问题在哪
词汇歧义 「用户」指的是谁?普通用户?管理员?还是游客? 同一个词,不同人有不同理解
指代歧义 「点击按钮后,它会变成灰色」——它指的是按钮还是页面? 代词指代不明确
范围歧义 「数据保留30天」——是从创建日算起?还是从最后访问日算起? 边界条件没说清楚
逻辑歧义 「如果用户未登录且订单金额大于100,则显示优惠券」——未登录怎么知道订单金额? 条件之间逻辑矛盾
省略歧义 「系统自动发送通知」——什么通知?发给谁?什么时机发? 关键信息被省略

核心判断标准:如果两个不同的开发人员,基于同一段需求描述,写出了两套不同的代码,且都认为自己是对的——那这段需求就是有歧义的。

4.2 歧义的代价

说实话,很多人觉得「有点歧义没关系,到时候沟通一下就行了」。我以前也这么想,直到被现实狠狠教育了一次。

我曾经参与过一个电商后台项目。需求里写了一句:「订单超过30分钟未支付,自动取消。」

开发觉得:从订单创建时间开始算30分钟。

产品觉得:从用户进入支付页面开始算30分钟。

测试觉得:两种都测一下,但不知道哪个是标准。

结果呢?上线第一天,大量订单被误取消,用户投诉电话打爆了。最后查下来,就因为这10个字没写清楚。修复、补偿、道歉,前后折腾了两周。

你看,一句歧义,代价有多大?我总结了一下,歧义带来的损失通常集中在三个方面:

  • 返工成本——做完了发现不对,重来。这是最直接的损失。
  • 沟通成本——反复确认、开会、对需求。时间就这么耗掉了。
  • 信任成本——开发不信需求文档,产品不信开发能理解。团队内耗开始。

注意:歧义还有一个隐藏代价——它会让测试用例写不全。测试人员只能靠猜去覆盖场景,漏掉的边界条件就成了线上bug的温床。

4.3 如何定义无歧义

那什么样的需求才算「无歧义」?我个人的标准很简单,就三条:

  1. 唯一解释——任何一个人读这段需求,得出的理解是一致的。
  2. 可验证——能写出明确的测试用例来证明「做对了」或「做错了」。
  3. 无二义性词汇——避免使用「大概」「可能」「适当」「尽快」这类模糊词。

举个例子。有歧义的写法是:

「系统应在适当时候对用户进行提醒。」

无歧义的写法是:

「当用户连续输入错误密码3次后,系统应在1分钟内弹出提示框,
内容为'密码错误已达上限,请30分钟后再试',提示框不可关闭。」

看出区别了吗?后者把触发条件、执行动作、时间约束、内容格式、交互行为全写死了。没有任何猜测空间。

一个小技巧:写完一段需求后,试着用「如果我是开发,我会怎么做」来读一遍。如果发现有两种以上的实现方式,那就说明有歧义,需要改。

另外,我建议你在需求文档里建立一个术语表。把项目里所有关键术语的定义统一写清楚。比如:

术语 定义
用户 已注册并登录的普通用户,不含管理员
订单状态 待支付、已支付、已取消、已完成,四种状态互斥
批量导入 一次选择1个Excel文件,文件内最多包含1000条记录

有了这个表,很多歧义在源头就被掐死了。

最后说一句:无歧义不是追求绝对的完美,而是追求「所有人都能达成一致的理解」。你不需要把文档写成法律条文,但至少要保证每个关键点都经得起追问。

嗯,这一节就到这。下一节咱们聊聊怎么用结构化方法写出无歧义的需求,那是我个人最常用的套路,保证实用。