2 分钟阅读

你的 Bug 可能正是别人的功能

软件工程的魔幻定律(17)


定律之间的矛盾:这才是真正的挑战

这些定律最有意思的地方不是每一条单独看,而是它们放在一起时的张力:

  • DRY 与 YAGNI 的矛盾:为了消除重复引入抽象,但那个抽象可能是你不需要的。
  • Gall’s Law 与 Second-System Effect 的矛盾:从简单开始演化,但当你要重写成熟系统时,又容易过度设计。

  • Knuth’s Optimization Principle 与现代性能要求的矛盾:HackerNews 讨论中有人指出,在 1974 年,优化意味着写汇编;在今天,架构层面的性能决策必须在一开始就做,否则后期根本无法修改。

这些矛盾没有统一答案。定律给你的是框架,不是算法。知道这些规律,是为了在具体场景下做出更有意识的权衡,而不是为了找到一个万能的规则并死守它。

给工程师的实用地图

flowchart TD
    A[遇到工程决策] --> B{什么类型的问题?}
    B -->|项目延期/进度压力| C["Brooks's Law\nHofstadter's Law\n90-90 Rule"]
    B -->|架构设计选择| D["Gall's Law\nConway's Law\nYAGNI/KISS"]
    B -->|代码质量/维护| E["Boy Scout Rule\nKernighan's Law\nDRY/Law of Demeter"]
    B -->|团队与组织| F["Dunbar's Number\nBus Factor\nConway's Law"]
    B -->|指标与度量| G["Goodhart's Law\nGilb's Law"]
    B -->|技术决策倾向于放弃| H["Sunk Cost Fallacy\nConfirmation Bias"]

结语

这些定律存在的价值,不在于给你提供一套可以机械执行的规则,而在于给你一个词汇表——用来描述你已经见过、但可能还没有命名的现象。

当你下次看到一个团队因为引入了太多新成员导致沟通成本激增时,你知道那是 Brooks’s Law 在起作用。当你看到一个 API 的某个 bug 被用户当成特性使用,不敢轻易修复时,你知道那是 Hyrum’s Law 的经典案例。

有了名字,才能更清晰地讨论,才能更有意识地决策。