tech官小西

切斯特顿栅栏:为什么你应该先理解,再拆除

有一种改革者,走到横在路上的栅栏前,看了一眼说:"我看不出这有什么用。把它拆了。"更聪明的改革者,G.K. 切斯特顿建议道,应该这样回答:"如果你看不出它有什么用,我绝不会让你拆掉它。回去想想。等你想明白了,能回来告诉我你确实知道它有什么用了,我或许会允许你拆除它。"

这就是切斯特顿栅栏的最简形式。在搞清栅栏为什么被立在那里之前,不要轻易拆除。这不是一个要求我们保留一切的保守主义教条——它是一种要求我们在行动前先理解的思维纪律。

切斯特顿栅栏概念图:草率改革者 vs 深思熟虑的改革者

典故出处

G.K. 切斯特顿(1874–1936)是英国作家,他的悖论式写作风格让他获得了"悖论王子"的称号。他创作了侦探小说(布朗神父系列)、基督教辩护著作(《回到正统》《永恒的人》),以及大量社会评论。栅栏寓言出现在他 1929 年的著作 The Thing 中,具体在《背离家庭生活》这篇文章里。

切斯特顿写作的年代正是激进现代主义的时代——那时人们流行把承袭下来的制度当作不够开明的时代的非理性包袱加以摒弃。栅栏就是他的反击。

同样的冲动也出现在切斯特顿的其他作品中。在他的文集《异教徒》中,他举了一个路灯柱的例子:人人都想把它推倒。有人想要电灯,有人想要废铁,有人想要黑暗(因为他们行为邪恶)。灯柱倒了,然后是"黑夜中的战争,没有人知道自己打的是谁"。直到事后大家才意识到,应该先讨论"什么是光的哲学"。

原理的核心

栅栏不会凭空出现。有人花钱买了材料,挖了柱坑,花了一整个下午把它建起来。他们是有理由的。那个理由可能很糟糕。可能曾经合理但现在已经过时。但在你知道那个理由是什么之前,你就是在摸黑操作。

这个原理有三个层次:

第一,认知谦逊。 你看不出一个东西有什么用,不等于它就真的没用。在复杂系统中尤其如此,因为因果之间隔着时间、距离和多重反馈回路。

第二,二阶思维。 拆除栅栏改变的是整个系统,而不只是栅栏本身。这些变化会以难以从第一性原理预测的方式向外扩散。栅栏可能在阻止比栅栏本身更糟糕的事情。

第三,举证责任。 举证责任在改革者而非保留者身上。如果你想改变什么,最低的前提条件就是理解它。你不需要赞同当初的理由——但你需要知道它是什么。

历史学家威尔·杜兰特表达了类似的观点:"每一百个新想法中,九十九个或更多可能都比它们想要取代的传统回答差。"传统不是永远正确——但它已经经历过一个筛选过程,而新想法还没有。

软件工程中那些你想删掉的遗留代码

切斯特顿栅栏在软件工程中的体现最为生动——拆除的冲动是一种职业性危害。

想象一个开发者加入项目,遇到一个令人费解的 200 行函数,变量名晦涩难懂,没有测试,注释只写着"// 别动"。本能反应很自然:删了它,重写它,用干净现代的东西替换它。

但这个函数为什么会存在?它可能在处理一个只在特定条件下才出现的边界情况——特定的数据库版本、特定的负载模式、特定的时间节点。它可能是为了解决一个未维护依赖中的 bug 而写的 workaround。它可能实现了一条在某种监管体系下、公司只有三个客户时才合理的业务规则。

这些都不意味着这个函数必须保留。但它们意味着,不理解它就删除它是在拿生产环境赌博。更好的方法:通过 git blame 追溯函数历史,阅读提交信息,搜索相关 bug 报告,如果写它的人还在就聊一聊。然后,也只有在那之后,再做决定。

这同样适用于架构决策。那个看似多余的服务?它可能是在阻止主数据库的惊群效应。那层人人抱怨的缓存?它可能是在一次导致公司六位数损失的大促宕机后加上去的。没人喜欢的命名规范?它可能是每个季度都要运行的合规审计所必需的。

Joel Spolsky 在谈到 Netscape 那场注定失败的代码重写时写道:"一家软件公司可能犯下的最糟糕的战略错误:他们决定从头重写代码。"Netscape 团队看着他们现有的代码库,看到了一道栅栏。他们在不理解每个部分为什么存在的情况下就把它拆了。Mozilla 花了多年时间才从那个决定中恢复过来。

组织与社会系统

2013 年,一家中国科技公司试验了一种"扁平化"组织架构——没有头衔,没有经理,每个人向每个人汇报。六个月之内,一套隐形层级已经形成。它比它取代的正式层级更加残酷,因为它通过社会胁迫而非透明规则运作。公司悄悄恢复了管理层级。

这是一个典型的切斯特顿栅栏案例。层级存在的理由是那些只看到其功能障碍的人不会立刻想到的:它们在危机时提供清晰的升级路径,为决策分配责任,防止最擅长社交的人通过默认方式控制一切。在理解这些功能之前,取消层级并不能消除对这些功能的需求——只是让它们转入地下。

同样的模式出现在很多领域:

  • 公司流程。 那个繁琐的审批流程之所以存在,可能是因为曾经有人在周五下午部署到生产环境,毁了四十个人的周末。
  • 代码审查规则。 合并前需要两人审批的要求可能让人感觉官僚,直到你听说那次单个审批的 PR 把客户数据库给删了。
  • 会议结构。 人人讨厌的周一例会,可能是三个关键团队真正同步的唯一时间。

当切斯特顿栅栏变成切斯特顿闸门

没有一个思维模型是绝对的。切斯特顿栅栏有一个黑暗面:它可以变成反对任何变化的话术武器。每一道栅栏,无论多么毫无意义,都可以用"但你不理解它为什么在那儿"来辩护。这不是切斯特顿栅栏——这是切斯特顿闸门,一种用智慧的言辞包装起来的阻挠主义。

这种区分很重要。切斯特顿栅栏要求在行动之前理解。切斯特顿闸门要求无论如何都别动。前者是思维工具;后者是阻挠行为。

切斯特顿栅栏 vs 切斯特顿闸门对比

有正当理由快速拆除栅栏:

  • 房子着火了,栅栏挡住了消防车。
  • 你已经理解了栅栏,并得出结论它就是个错误(建它的人当时喝醉了,路已经被改道了,栅栏原本要挡的狼已经灭绝了)。
  • 理解的成本超过了拆除并在必要时重建的成本——这在可以轻松回滚的快速迭代软件项目中很少见但确实存在。

关键检验:你真的做了理解的工作吗?还是你在用栅栏比喻来逃避做这项工作?切斯特顿本人很清楚:一旦你理解了栅栏为什么存在,如果理由不再成立,你完全可以拆除它。他不是保守主义者。他是知情行动的倡导者。

切斯特顿栅栏不是什么

有必要澄清这个原理不代表什么。

它不代表旧的东西更好。年代本身不是论据。栅栏可能是为了一个糟糕的理由而建的。也可能是为了一个已不再适用的好理由而建的。关键在于,不调查你就不知道你面对的是哪种情况。

它不代表变化是危险的。切斯特顿自己就是一个改革者——他只是相信知情的改革。理解栅栏是建造更好东西的前提,而不是反对建造任何东西的永久论据。

它不代表你需要完美的知识。你不需要把栅栏上的每一颗钉子追溯到地质起源。你需要理解的是功能——栅栏在解决什么问题,为谁解决。这通常可以通过几个小时的 git 考古或与在场者的几次对话来发现。

一个实用的框架

当你遇到一道想拆除的栅栏时,问自己三个问题:

切斯特顿栅栏框架:三问决策流程图

  1. 这东西为什么存在? 追溯历史。找到那个人、那次提交、那份事故报告、那条法规。如果你找不到原因,说明你找得还不够。

  2. 当初的理由现在还适用吗? 狼可能已经消失了。公司可能已经超越了那个流程。那个依赖中的 bug 可能已经被修复了。如果理由已经过时,栅栏可以拆。

  3. 还有什么依赖这道栅栏? 系统会围绕约束条件自我适应。人们围绕那个烦人的审批流程建立了工作流。其他服务可能依赖于那个"冗余"的服务。拆除栅栏,那些适应性就会变成破损的假设。

如果你能清楚地回答这三个问题,你就不再是在黑暗中行动了。栅栏是留是拆,此时是一个经过深思熟虑的决定,而非一时的冲动。这就是切斯特顿所要的全部。


路中间的那道栅栏还在。有人正看着它,想知道为什么。那个人做对了。