程序为什么会「依赖 Bug 运行」

修一个底层 bug,整栋楼塌了——用积木塔亲手体验 Hyrum's Law

选一个场景

每个场景是一个真实软件栈的简化版。点击卡片开始体验。

为什么会这样

Hyrum's Law(海勒姆定律)

"当一个 API 的用户数量足够多时,你在契约中承诺了什么已经不重要——系统的所有可观察行为都会被某人依赖。" ——Hyrum Wright, Google 软件工程师

翻译成人话:只要有人在用,bug 就是 feature。用的人越多、用的时间越长,修复它的代价越大。

真实案例

Linux 内核:系统调用 stat() 在某些文件系统上返回的 st_ino 字段有截断 bug, 但修复后会破坏 glibc 的内部缓存机制。内核维护者 Linus Torvalds 的原则是: "We don't break userspace"——即使内核有错,也不能通过修正内核来破坏上层应用。

IE Quirks Mode:早期 IE 对 CSS 盒模型的实现是错误的(width 包含 padding), 但数以百万计的网站基于这个错误来布局。所有现代浏览器至今仍保留「怪异模式」来兼容。

Python 2 的 print:print 作为语句而非函数是设计失误,但迁移到 Python 3 花了 10+ 年, 至今仍有项目无法升级。

生物学类比

镰刀型红细胞是基因层面的「bug」——红细胞形状异常,携氧能力下降。 但在疟疾高发区,这个「bug」恰好让疟原虫无法正常寄生,成了生存优势。 修复这个「bug」(比如基因治疗),反而会让人失去疟疾抵抗力。

软件世界的逻辑一模一样:一个 bug 如果提供了被依赖的副作用,它就进化成了生态的一部分。