表述

墨菲定律(Murphy's Law):"凡是可能出错的事,就一定会出错。"

起源:1949 年,美国空军的爱德华·墨菲(Edward Murphy)上尉在一次火箭减速实验中,发现技术人员把传感器接反了。他评论说:"如果有两种或以上的方法可以做事,其中一种会导致灾难,那么一定会有人选那一种。"

它不是一个物理定律

墨菲定律不是科学定律,而是一个经验观察 + 心理倾向的组合。

为什么它"看起来总是成立"?

一、选择性记忆

当事情顺利时,我们不会特别记住;当出错时(尤其以意想不到的方式出错),印象深刻。

二、确认偏差(前文提到过)

我们更容易注意到"出错"的证据,而忽略"没出错"的情况。

三、复杂系统的必然性

在足够复杂的系统中,有大量的组件和交互,"某个地方出错"的概率随时间趋近于 1。

当一个系统的运行次数足够多时,小概率事件几乎必然发生。

例子:一个每天运行 1000 次的操作,如果单次失败概率是 0.1%,那么一年中至少失败一次的概率接近 98%。

实际意义

墨菲定律的真正价值,不是"悲观",而是"推动我们做防御设计"。

一、防御性设计

假设所有可能失败的地方都会失败。

实践:

  • 冗余:关键组件有备份(如双电源、多副本);
  • 超时与重试:外部调用可能超时或失败;
  • 熔断器:依赖故障时不拖垮自己;
  • 输入校验:不信任任何输入(前文提到过防御性编程);
  • 优雅降级:部分功能失效时,核心功能仍可用。

二、故障演练

"如果这里挂了,会怎样?"

方法:

  • 混沌工程(Chaos Engineering):主动在生产环境中注入故障(如随机关闭服务、增加延迟),验证系统的韧性。Netflix 的 Chaos Monkey 是代表;
  • 故障树分析(FTA):自顶向下分析"什么样的组合会导致系统失效";
  • FMEA(失效模式与影响分析):自底向上列举每个组件可能的失效模式及其影响。

三、降低"出错的可能性"而非依赖运气

与其祈祷不出错,不如:

  • 减少复杂度(复杂度是出错的温床);
  • 消除易错的模式(如让错误用法无法通过编译);
  • 自动化检查(linter、类型系统、CI)。

四、为"出错后"做准备

即便做了防御,故障仍会发生。因此:

  • 监控与告警(前文提到过);
  • 快速回滚能力;
  • 应急预案与演练;
  • 事后复盘(Postmortem)——重点是改进系统,而非追责(无指责复盘,Blameless Postmortem)。

相关的"定律"

一、海恩法则(Heinrich's Law)

每一起严重事故背后,有 29 起轻微事故、300 起未遂先兆、1000 起事故隐患。

含义:重大事故是大量小问题未被处理的累积结果。重视小信号。

二、彼得原理(Peter Principle)

"在层级组织中,每个员工都会晋升到他无法胜任的职位。"

三、帕金森定律(Parkinson's Law)

"工作会膨胀,直至占满所有可用的时间。"

四、康威定律(Conway's Law)

"系统的架构,会受到产生它的组织的沟通结构的制约。"(前文提到过)

一句话

墨菲定律的工程价值在于:它提醒我们把"意外"当作"必然"来对待,从而提前设计。

这不是悲观,而是现实主义——也是可靠系统的基础。

说明:本文为工程思维的知识整理。