我们花了两三周调试一个不该存在的功能#
一个真实的翻车现场#
上个月,我们团队在做一个复刻经典游戏的项目。
有一天,测试报了一个 bug:「二段跳有时候会误触发」。
于是开始调。
改参数、加判断、打日志、对比帧数据……前前后后折腾了两三周。期间开了不少会,讨论 「误触发的边界条件到底是什么」「要不要加冷却时间」「阈值设成多少合适」。
直到有一天,有人突然问了一句:
「等一下,原版有二段跳吗?」
去查了原版资料。
原版没有二段跳。
我们按完整的工程流程,调试了一个根本不该存在的功能。
这不是「需求没对齐」#
你可能会说:「这不就是需求没写清楚吗?产品经理的锅。」
但问题是,我们不是在做一个新功能。我们是在「复刻」——理论上,「原版是什么样」 就是最清晰的需求。
那为什么还会出这种问题?
复盘之后,我们发现了一个更深层的原因:
这个项目一开始是个探索期的原型。
原型阶段,开发同学随手加了个二段跳——可能是为了测试手感,可能是觉得好玩。参数也 是随便填的,-15,没什么依据。
后来,方法论成熟了,我们想找个项目来验证流程。顺手就拿了这个原型。
问题就出在这个「顺手」上。
我们把原型的代码现状,当成了「既定事实」。
然后,所有后续工作——写测试、定协议、调参数——都是围绕着「让现有代码跑通」来做 的。
没有人问过:「这个代码本身是对的吗?」
我给这个现象起了个名字:公理污染#
公理污染(Axiom Contamination):
当实现先于设计意图存在时,代码的“现状”会被默认为正确,从而反向定义「什么是 对的」,导致后续工作在一个错误的前提上持续优化。
它和「技术债务」不一样。
技术债务是:我知道正确答案是什么,但为了赶进度,先写个烂的。
公理污染是:我不知道正确答案是什么,因为现有代码已经替我「定义」了正确答案。
技术债务像“欠债”。公理污染像“账本本身被写错”。
为什么这不只是「个别团队的问题」#
你可能会说:「你们团队流程不规范,大公司不会这样。」
我也这么想过。但后来看到了一个例子:
波音公司在他们的技术债务分类里,专门识别了一种债务类型,叫 Reified Prototyping:
原型被直接演进为生产系统时产生的技术债务。问题在于,这些原型最初并没有按照生产级 的严谨程度来设计和构建。
这说明它不是“某个团队不专业”的偶发问题,而是原型演进路径上的系统性风险。
再想一个问题:
如果「先想清楚再动手」真的是行业共识,为什么技术债务是整个行业的系统性难题?
我的一个猜测是:这和“原型优先、快速迭代”的工作方式有关。
敏捷的一个结构性盲区#
敏捷宣言有一句话:
「Working software over comprehensive documentation」 (可工作的软件 优于 详尽的文档)
这句话的本意是:不要为了文档而文档,能跑的代码比 PPT 更有说服力。
但它被广泛解读成了:文档不重要,边做边想,快速迭代。
于是,「原型 → 迭代 → 产品」变成了默认路径。
这个路径有一个隐含假设:
原型可以干净地演进为产品。
但这个假设在很多场景下是错的。
原型不是「产品的早期版本」。原型是「带着未声明假设的代码」。
当你在原型上迭代时,你不是在「逐步逼近正确答案」。你是在被第一版代码的隐含假设 锁死。
这就是为什么很多项目越迭代越偏,越改越难改,最后只能推倒重来。
很多时候这不是“谁不努力”,而是流程入口缺少一个明确的“真值来源”约束。
我们的解决方案:一个简单的 Gate#
复盘之后,我们加了一条规则,叫 Axiom Source Declaration(公理来源声明)。
在任何正式开发流程启动之前,必须先回答一个问题:
「这个项目的『对』是由什么定义的?」
三个选项:
| 来源类型 | 含义 | 可以进入正式开发? |
|---|---|---|
| 外部权威 | 原版、标准、论文、行业规范 | ✅ 可以 |
| 设计文档 | 团队自己写的,但必须先于代码存在 | ✅ 可以 |
| 探索假设 | 我们还在试,不知道什么是对的 | ❌ 不行,禁止进入正式流程 |
禁止的选项:「现有代码的行为」。
就这一条规则,可以在流程入口处阻断「代码反向定义需求」这条路径。
怎么落地到工程里(最小可行)#
- 在仓库里放一个
AXIOMS.md:写清楚“外部权威链接 / 设计文档路径 / 仍处于探索”。 - 在启动正式流程前做一次确认(PR 模板或评审 checklist 都行):这次迭代的“对”来自 哪里?
- 如果答案是“探索假设”:就把它当原型对待,允许试错,但不要把它直接纳入“验证全通 过/可冻结”的正式管线。
这是常识还是盲区?#
写到这里,我自己也有点不确定。
一方面,「先想清楚再动手」确实是常识。任何一个负责任的产品经理都会告诉你这个道理。
另一方面,我看到太多团队——包括我们自己——在实际操作中反复踩同一个坑。
所以我想问问大家:
-
你们团队遇到过类似的情况吗? 就是那种「后来发现一开始就错了」的项目。
-
你觉得这是执行问题,还是方法论问题? 是团队不够负责,还是敏捷本身有盲区?
-
「公理污染」这个命名有没有必要? 还是说我在造一个没必要的概念?
欢迎在评论里补充你遇到的案例,或者直接反驳我的归因。