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

推荐订阅源

V
Vulnerabilities – Threatpost
aimingoo的专栏
aimingoo的专栏
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
IT之家
IT之家
V
Visual Studio Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
A
About on SuperTechFans
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
A
Arctic Wolf
WordPress大学
WordPress大学
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
T
Threat Research - Cisco Blogs
Latest news
Latest news
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
J
Java Code Geeks
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
I
Intezer
L
LangChain Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
GRAHAM CLULEY
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

暗无天日

读: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 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日 mktemp: Shell 脚本中临时文件的安全陷阱与最佳实践 - 暗无天日 WSL9x —— 在 Windows 9x 里跑 Linux 内核 6.19 用 ox.el 做你想做的事 —— org-export 高级编程指南 读:Hot-wiring the Lisp Machine —— 用纯 Elisp 构建零依赖的 Org 静态站点生成器 Elisp 性能优化的六个实战教训 - 暗无天日 fcitx5 下 Emacs 无法切换输入法的排查 - 暗无天日 ERT 测试交互命令的三种方式 - 暗无天日 SEM Assistant: 当 Elisp 守护进程遇上 LLM 用 dmsg 给 Elisp 加上结构化调试日志 用 org-habit 追踪非每日习惯 - 暗无天日 Clojure X-Men:当编程语言特性变成超能力 - 暗无天日 TIL: 用 diff-hl 在 fringe 中显示 git 变更 读:llm-test —— 用 LLM agent 驱动 Emacs 测试 TIL: AI 时代的橡皮鸭调试 - 暗无天日 fcitx 启动后键盘输入卡顿的排查 - 暗无天日 TIL: 早期网页的图片热区导航 - 暗无天日 读 Seeing the Whole System 用 Emacs 自动生成每周链接推荐 - 暗无天日 读:ASCII control characters in my terminal 读 What to learn - 暗无天日 Lisp 的括号之痛——一个愚人节玩笑揭开的老伤疤 - 暗无天日 一本书该"线性读"还是"并行读" - 暗无天日 读 How to Monetize a Blog:一篇伪装成变现指南的讽刺文 Python Mock 第三方依赖的四种策略 - 暗无天日 Emacs Lisp 热重载实用指南 - 暗无天日 Prot 的 Emacs 配置哲学 - 暗无天日 TIL: 从直播对谈中学到的三个 Emacs 技巧 - 暗无天日 TIL: 自动使用项目虚拟环境的 Python - 暗无天日 TIL: 让 Help buffer 自动获得焦点 一条命令让本地开发用上 HTTPS —— slim 工具介绍 用 fsck 检查和修复 Linux 文件系统 排查Linux进程"卡死"实战:从strace到gdb全流程 - 暗无天日 PostgreSQL 索引:从基础到你可能不知道的高级用法 - 暗无天日 用 .pdbrc 自定义 Python 调试器 ANSI 转义码的标准化现状 - 暗无天日 终端程序的潜规则 - 暗无天日 PARA Org-mode 测试配置 - 暗无天日 AI越强越辣鸡?控制论说这是必然的 - 暗无天日 AI 越强越需要你盯着——反馈循环实操指南 - 暗无天日 你的AI代理正在偷你的密钥——四种你没想到的泄露通道 - 暗无天日 LLM 在 DevOps 中的三种角色 - 暗无天日 写作风格的反建议 - 暗无天日 文件充满了危险——Dan Luu 谈文件系统的可靠性陷阱 - 暗无天日 AI 时代的 PARA 方法:用 Org-mode 和 AI 打造个人知识管理系统 Linux 数据去重学习笔记 - 暗无天日 创建跨平台 ZIP 文件的隐藏陷阱:Extra Field - 暗无天日 X11 Forwarding 排障指南 - 暗无天日 IP欺骗端口扫描:当别人冒充你去扫描别人 - 暗无天日 Linux 输入栈全景解析:从硬件按键到屏幕响应 - 暗无天日 Unix 系统中那些被埋没的配置开关——以 FontConfig 为例 - 暗无天日 在Linux上限制儿童使用电脑 - 暗无天日 GIF不仅仅是一种图片格式——用GIF流做些奇怪的事 - 暗无天日 Leiningen 学习笔记:Clojure 项目构建与管理从入门到实战配置 - 暗无天日 Google SRE Book 读书笔记 - 暗无天日 yes 管道 head 发生了什么 - 暗无天日 为什么 nohup 在 crontab 中不起作用 Bash中的Indirection与Nameref - 暗无天日 Linux PAM 简介 - 暗无天日 从Linux ISO文件启动计算机 - 暗无天日 用 Bash 打造一个Screen Locker 用GitHub Actions自动构建EGO博客 - 暗无天日 blocking I/O 的作用 - 暗无天日 mobileog 手机端同步提示Error:2 No such file 的解决方法 回收 WSL2 VHDX 文件占用空间 使用 org-mode columnview 生成任务列表 - 暗无天日 Emacs 作为 MPD 客户端 - 暗无天日 移动文件路径却不破坏org file link的方法 - 暗无天日 如何合理的导出help link 成HTML - 暗无天日 笑话理解之Biology - 暗无天日
反驳本质复杂性——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 的论文像一张罗夏墨迹测试——读者各取所需。如果论文的含义如此"显而易见",人们不应该对它的含义有如此多不同的解读。