惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
A
About on SuperTechFans
量子位
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
Google DeepMind News
Google DeepMind News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog
U
Unit 42
D
DataBreaches.Net
博客园 - Franky
D
Docker
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Hugging Face - Blog
Hugging Face - Blog

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 读:AI Agent 生产化——一份从原型到上线的速查清单 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日
反驳本质复杂性——Dan Luu 论为什么《没有银弹》错了 - 暗无天日
lujun9972 · 2026-04-16 · via 暗无天日

目录

  • Brooks 预见了什么,又错过了什么
    • 高级语言远未到头
    • 版本控制与 CI/CD
    • 测试工具与实践
    • 硬件速度
  • 本质复杂性?在实践中毫无意义
  • 为什么这类论证总是失败
  • 2022 年补充

1986 年,Fred Brooks 发表了经典论文 No Silver Bullet(《没有银弹》),论证程序员生产力的提升空间极其有限。他的核心逻辑是:编程任务中包含一层"本质复杂性"(essential complexity),这层复杂性不可能被任何技术进步所消除。然后用 Amdahl 定律推导——如果 1/X 的复杂性是本质的,那么技术改进最多只能带来 X 倍的生产力提升。

Brooks 在论文中明确断言:至少一半的编程复杂性是本质的,因此所有技术创新加在一起,最多也只能带来 2 倍的生产力提升。

Dan Luu 在 Against essential and accidental complexity 一文中对此提出了有力反驳。

Brooks 预见了什么,又错过了什么

Brooks 的论证策略是对当时的各类工具逐一评估,声称它们要么无效,要么已经发挥了全部潜力。这个策略的问题在于:他低估了尚未出现的工具类别,也低估了已有工具的改进空间。

高级语言远未到头

Brooks 把高级语言当作一个已经"开发完毕"的类别。事实是,论文发表后不久,脚本语言(Perl、Python)崛起,带 GC 的语言全面取代了手动内存管理。如今没人会为了写一个 Web 应用而选择 C——现代语言带来的生产力提升远超 2 倍。

版本控制与 CI/CD

Brooks 在 1995 年的补充文章中提到 Microsoft 每天构建一次,还质疑这是否有必要,因为 Bell Northern Research 当时是每周构建一次。

而现实是:90 年代 Microsoft 开发 Windows 2000(3000 万行代码、5000 人团队)时,连支持分支的版本控制系统都没有。他们通过复制整个源代码树来模拟分支,手动合并。5000 人的团队,好日子一天只能合并 100 个变更。

仅仅版本控制和 CI/CD 这两项工具的进步,对大型项目而言就远超 2 倍的生产力提升。

测试工具与实践

Brooks 提到测试的重要性,但唯一想到的改进方向是"让初学者更容易测试的专家系统"。他没能预见到现代测试框架、模糊测试(fuzzing)、静态分析工具、valgrind 等工具的出现。

Ken Thompson 曾声称语言安全特性没用,Jamie Zawinski 则认为在紧迫的截止日期下自动化测试是浪费时间。如果用这种旧式实践去构建现代规模的软件项目——比如一个分布式数据库——大多数团队根本产不出可用的产品。

硬件速度

Brooks 写道:"一个工作站能有效地利用多少 MIPS 呢?"他认为硬件速度不会再显著提升开发效率。

事实恰恰相反:更快的硬件消除了大量偶然复杂性。ggplot 这样的工具之所以能存在,正是因为计算机足够快,开发者不需要榨干每一分性能。如果机器慢几个数量级,大多数现代工具根本不会出现。

Dan Luu 用自己的工作举例:写一个 Presto SQL 查询扫描 100TB 数据,几分钟完成。在 1986 年,光是获得足够的计算资源来完成这个任务就需要大约 10 台 Cray-2(全球总共只生产了 27 台),更不用说编写查询本身了。

本质复杂性?在实践中毫无意义

Dan Luu 指出,在他做过的所有非平凡问题中,偶然复杂性都占绝对主导地位。本质复杂性的比例低到无法估计。

以日志解析为例:从几十万台机器 scp 日志、用 Rust 脚本解析几 TB 数据。整个任务的"本质"部分——理解问题、决定查什么——只占极小比例。剩余全是偶然复杂性:连接池管理、日志格式不统一、库的选择与配置、性能优化……

以指标查询为例:写 SQL 查询扫描数百 TB 数据、用 ggplot 生成图表。这个任务在 1986 年根本不会被想象为"可解决的问题"——偶然复杂性大到超出了 Brooks 的想象力。

Dan Luu 的结论是:Brooks 所说的"本质复杂性上限",本质上是他想象力的上限,而非技术进步的真正边界。

为什么这类论证总是失败

Brooks 的论证模式并不新鲜。Cliff Stoll 1995 年在 Newsweek 上写文章嘲笑互联网的前景:

远见者们看到的是远程办公、交互式图书馆、多媒体教室……他们说电子市政厅和虚拟社区将会出现。商业将从办公室和商场转移到网络和调制解调器上。

胡说八道。你的在线数据库不会取代每天的报纸……电子出版?试着在光盘上读一本书。你也不能把笔记本电脑带到海滩上。

把 Stoll 的话做个查找替换,本质上和 Brooks 说的是同一件事:技术的改变收到我们想象力的制约。

Dan Luu 还指出了 Brooks 论文的一个结构性问题:论文中多处论述相互矛盾。Brooks 一方面声称没有单项改进能在十年内带来 10 倍提升,另一方面又声称所有改进加在一起不能超过 2 倍——原文指出这两个主张虽然没有严格矛盾,但放在同一篇论文中令人困惑。更关键的是,论文各部分的推理无法组合使用:把一段的论点与另一段的论点放在一起,很容易得出荒谬的结论甚至直接矛盾。此外 Brooks 对"本质"与"偶然"、"语言"与"库"等概念的区分并不清晰,导致整篇论文无法自洽。

2022 年补充

Dan Luu 在 2022 年补充道:很多人为 Brooks 辩护说"他真正想说的是 X",但不同人提出的 X 各不相同。这恰恰说明 Brooks 的论文像一张罗夏墨迹测试——读者各取所需。如果论文的含义如此"显而易见",人们不应该对它的含义有如此多不同的解读。