为什么临时例外最后会变成系统规则

为什么临时例外最后会变成系统规则

软件系统里常有这样的决定:某个客户急需一个功能,某批旧数据不符合新格式,或者一次上线赶不上完整改造,于是团队先加一条特殊判断。“只是临时的”通常并非借口。在当时的时间、成本和风险约束下,让一个例外绕过标准流程,可能确实是最合理的选择。问题在于,例外一旦开始工作,它面对的环境就不再是被加入时的环境。

标准规则处理的是大量相似情况,例外处理的是少数不同情况。若要彻底消除差异,往往需要改数据、改接口,甚至同时改变几个团队的流程。相比之下,在边缘加一个条件分支,影响小、见效快,也容易撤回。因此,系统通常不是为了例外重新设计核心,而是在核心旁边开一条小路。

小路投入使用后,新的关系会围绕它形成。客服知道某类用户必须走这条路,运营报表按它的输出解释数据,其他程序开始依赖它表现出来的结果,测试也把这种结果当成正确行为。后来加入的人未必知道它为何出现,只知道删除后会有东西出错。原本只为一个具体差异准备的处理方式,逐渐变成多个环节共同依赖的条件。

这时,保留与删除的成本已经不对称。保留它的成本分散在日常维护里,常常只是多看一段代码、多跑几项测试;删除它的成本却会集中出现:要找出所有使用者,确认旧数据是否还存在,安排迁移,并承担遗漏依赖的风险。即使大家都认为设计不够整齐,也很少有人愿意仅为整齐而启动一次跨系统改造。

责任的分散又加强了这种稳定。写下例外的人可能已经离开,提出需求的客户可能不再使用系统,而现在维护它的人只对服务不中断负责。没有人明确拥有“证明它可以删除”这项工作。于是,原来的原因消失,并不等于维持它的条件也消失;新的约束已经接替了旧的理由。

例外还会改变后来的设计。新功能为了兼容它,也加入对应判断;文档把它记录成操作步骤;监控指标甚至以它为边界。此时它已经不是附着在系统上的孤立补丁,而是系统的一部分。直接删掉那几行代码,只是移除了表面形式,并没有替代它承担的关系。

这也解释了为什么“以后再清理”经常落空。时间本身不会让清理变容易,反而会让依赖继续生长。真正有效的做法,是在例外建立时同时限制它的扩张:说明适用范围,指定负责人,记录使用量,设定复查条件,并为数据或用户准备迁移路径。到期日期并不能自动删除例外,但会迫使团队重新确认,它解决的差异是否仍然存在,以及周围已经形成了哪些依赖。

临时例外并不必然是坏设计。系统需要在现实限制下继续运行,局部绕行有时正是保持整体稳定的办法。关键不是拒绝例外,而是让它始终可见、可追踪、可退出。否则,一个为适应差异而开的缺口,会因为新的关系不断附着,最终从规则的例外变成规则本身。

维成提示

例外的持久性不只来自最初需求,而来自后来围绕它形成的依赖、责任和风险分布。若要移除它,必须重新安置这些关系;仅仅撤销最初的判断,通常已经不够。


了解 Geoffrey Chen 的更多信息

订阅后即可通过电子邮件收到最新文章。