软件工程有自己的政治轴,从保守到自由。每个程序员都落在上面的某个位置,不管他们是否意识到。这条轴无关现实政治,它关乎风险管理和一个根本问题:你应该把多少注意力放在安全上?

保守派的驱动力是对不确定性和恐惧的心理管理。自由派的驱动力是最大化开发速度和系统灵活性的渴望。两边都相信自己在优化同一件事,能用的软件,但他们的优先级不可调和,价值体系在设计时、实现时、诊断时和恢复时都发生冲突。

简单的画面

Fred(保守派)想在任何人搬进去之前把每扇门锁好、每扇窗封住、画好详细平面图。Shaggy(自由派)想立刻搬进去,住着摸清布局,坏了再修。Fred觉得Shaggy鲁莽。Shaggy觉得Fred永远不会真正搬进去。两个人对对方的失败模式都说对了。

保守派的观点

安全永远高于其他考量。性能排名很高。保守派工程师相信:

  • 软件应该在发布前没有bug,调试是失败,不是过程
  • 程序员应该被保护起来免于犯错,危险的语言特性应该被禁止
  • 生产代码必须被静态检查,编译器推理不了的东西应该避免
  • 数据存储需要严格的模式,结构应该先于代码
  • 公共接口应该被严格建模,没有字符串,没有无类型集合
  • 如果对一个组件的安全有任何疑问,它不能上生产

这是范式锁定作为工程哲学:一直有效的框架变成了不能改变的框架。保守派工程师被混乱烧过,建造系统来防止它再次发生。专家型初学者是保守派的病理:当安全变成身份,任何朝灵活性的推力都被读作攻击。

自由派的观点

速度和灵活性高于安全。自由派工程师相信:

  • Bug不是大事,反正都会发生,好的调试能力比预防更有用,那个圣诞夜宕机的场景从来没真发生过
  • 程序员只有很短的时间是新手,稳态是有经验的和足智多谋的;为瞬态情况(新入职)而非稳态(能干的工程师)优化是一个根本的类别错误
  • 简洁就是力量,如果你的静态检查工具推理不了代码,让工具变聪明而不是让代码变笨
  • 模式应该跟随代码而非先于代码,严格的模式是对接口如何演化的猜测
  • 公司必须冒险否则就死,你需要好的灾难恢复技术,但即使不冒险你也需要这些,所以去冒险
  • 过早优化是万恶之源先让它跑起来,再做性能分析

自由派工程师被官僚体系烧过,被锁得太死以至于什么都发不出去的系统,被阻止了灾难但也阻止了产品的安全措施。破坏手册读起来像一本保守派工程手册:坚持遵循每一个程序,把所有决策提交委员会,永不允许走捷径。

为什么他们无法达成一致

分歧不可调和因为各自的创伤经历验证了各自的世界观:

  • 保守派曾在一个牛仔程序员发了个bug亏了几百万的团队→安全不可谈判
  • 自由派曾在一个安全官僚体系让产品两年发不出来的团队→速度就是生存

两边都在从真实的创伤中推广。对于自己经历过的失败模式两边都没错。他们错在自己没经历过的那个失败模式上,而那恰恰是对方阵营试图防止的。

这映射到三种姿态:保守派是体面的,他们把安全视为内在的善并否认其成本。自由派是反叛者,他们以对立于保守派的约束来定义自己。两者都没有达到第三种姿态:自由,在那里你把安全和灵活性视为情境性部署的资源而非需要捍卫的身份。

卡斯的框架使这更清晰:保守派玩有限游戏,有规则,必须遵守,惊奇是敌人。自由派玩看起来像无限游戏的东西,灵活性、适应性、拥抱惊奇,但往往只是另一种有限游戏(快速发布、快速增长、被收购)。真正的无限游戏工程师把安全和速度都当作工具而非价值观,根据情境实际需要在两者之间切换。

中间派的优势

同时迎合两个阵营的语言和系统在商业上最成功。C++、Java和C#都允许你在同一个生态系统中写保守的代码(静态类型、严格接口)或自由的代码(动态分派、反射、模板)。它们靠拒绝强迫选择而成功。

最有效的工程团队以同样的方式运作:一个快速移动的自由派核心,被保守派护栏包围(监控、日志、自动回滚),让风险变得可承受。护栏不是官僚体系,它们是恢复基础设施,让冒险变得理性而非鲁莽。纸杯蛋糕问题命名了相变:自由派研究员展示可能性(2600美元的纸杯蛋糕),但保守派生产工程师必须大规模交付可靠性(10美元,每天35000个),而第二个问题更难、更少被庆祝、更有价值。

常见误读

低水平理解:“自由派更好因为安全拖你后腿。”

中等水平理解:“保守派更好因为生产环境的bug不可接受。”

更好的理解:这条轴描述的是风险偏好,最优的风险偏好是语境的函数,不是哲学的函数。心脏起搏器应该保守。创业MVP应该自由。成熟平台应该在核心保守、在边缘自由。错误在于把你在这条轴上的位置变成身份而非工具。 当你说”我是保守派/自由派程序员”而不是”这个系统需要保守/自由的处理”,你就把设计决策转换成了部落效忠,而随之而来的互相蔑视就不可避免了。

核心收获

这个框架的力量在于诊断:当两个工程师在争论架构而且都无法理解对方为什么”这么不讲理”,很可能他们站在这条轴的两侧,各自把自己的位置当作不言自明的正确。认识到这一点不能解决分歧,不能,因为底层的价值观确实冲突。但它允许更快地从说服转向谈判,而真正的工程决策实际上就是在那里做出的。

参考: