暗无天日

=============>DarkSun的个人博客

反驳本质复杂性——Dan Luu 论为什么《没有银弹》错了

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 的论文像一张罗夏墨迹测试——读者各取所需。如果论文的含义如此"显而易见",人们不应该对它的含义有如此多不同的解读。

软件工程 : 本质复杂性 : 偶然复杂性 : NoSilverBullet : DanLuu