IT 论文精读 · PAPER 48
Fred Brooks · IFIP 1986 / IEEE Computer 1987
1986 年,写过软件工程名著《人月神话》的 Fred Brooks(弗雷德·布鲁克斯)发表了一篇著名短文,题目叫《没有银弹》。他的判断只有一句:未来十年里,不会有任何单一的技术或管理方法,能让软件开发的效率、可靠性或简洁性一下提高十倍。——别指望一颗神奇子弹。四十年过去,这句话基本被应验,也一直被争论。
Brooks 说,软件项目就像民间传说里的狼人:平时看着人畜无害,一到月圆之夜(临近交付)就变成吃掉预算、拖垮工期、做出一堆毛病的怪物。人们于是拼命寻找那颗能一枪毙命的银弹——某种新语言、新工具、新方法,一用就万事大吉。Brooks 的答案是:银弹不存在,因为狼人不是被工具变出来的,是软件这东西「天生」如此。
Brooks 把软件开发的困难劈成两半。一半叫「偶然困难」——不是问题本身要命,而是我们用的工具太笨造成的麻烦(比如早年要用二进制、手工管内存)。另一半叫「本质困难」——就藏在「软件到底是什么」里头,换什么工具都躲不掉。他说:过去那些真正管用的进步,砍的全是「偶然」那一半。
想象砍难度像砍一堵墙。高级语言、分时系统这些大发明,已经把「偶然」那半堵墙砍得差不多了。于是就算你把剩下的偶然困难全部清零,省下的也不到十分之九——离「提高十倍」还差得远,因为另半堵「本质」的墙纹丝没动。而这堵墙为什么砍不动?Brooks 给了四条软件的天性:它天生复杂(每个零件都不一样,不像盖楼能重复摞砖)、必须迁就别人(得去将就一堆早已存在、乱七八糟的接口和规矩)、永远在变(软件太软,谁都想再改一点)、还看不见摸不着(它不在空间里,画不出一张能一眼看懂的图)。这四样,不是哪个工具没做好,是软件本身就长这样。
Brooks 没说躺平。他指了几条真正冲着「本质」去的慢路:能买现成的就别自己写(最便宜的代码是你根本不用写的那行);先做个原型跟客户反复确认「到底要造什么」(因为最难的从来不是写代码,是想清楚要写什么);让系统一点点长大而不是一次盖完;以及最要紧的一条——好好培养顶尖的设计者,因为顶尖程序员和普通程序员之间,效率能差整整一个数量级。诚实说一句:这些都是苦功、是慢功,没有一条是那颗一劳永逸的银弹。
软件之难,一半是工具笨造成的「偶然困难」,一半是软件天生复杂、善变、看不见、还得迁就别人造成的「本质困难」。过去的银弹只砍得动前一半,而前一半快砍完了——所以别再等一颗神奇子弹,真正的活是啃那半块啃不动的本质:买现成、做原型想清楚需求、让系统慢慢长、把顶尖设计者当宝。
想看「本质 vs 偶然」的量化图、四大本质困难、以及各路「候选银弹」为何失手? → 切到精读版
Brooks 把软件开发的困难分成本质(essence)与偶然(accident)两类:本质困难源自软件「是什么」——复杂、要迁就、善变、不可见;偶然困难只是当下工具与表达方式带来的麻烦。他据此断言:未来十年,没有任何单一的技术或管理突破,能凭一己之力把软件的生产率、可靠性或简洁性提高一个数量级(10 倍)——因为过去的重大进步(高级语言、分时、集成环境)砍的都是偶然困难,而偶然那一份已所剩无几;真正的天花板在本质。这是软件工程史上被引用最多、也最常被引来「泼冷水」的一篇文章。
作者 Fred Brooks 是 IBM System/360 大型机及其操作系统 OS/360 的项目负责人,也是软件工程经典《人月神话》(The Mythical Man-Month, 1975)的作者、1999 年图灵奖得主。本文最初是他 1986 年在 IFIP 国际信息处理大会的特邀报告,次年(1987 年 4 月)重刊于 IEEE Computer 而广为流传。它上承《人月神话》对「软件为何难管」的追问,下启此后几十年关于「某某新技术是不是银弹」的持续辩论;1995 年 Brooks 又写《没有银弹·再回首》(No Silver Bullet Refired)复盘自己的预言。
1970–80 年代,硬件性能按摩尔定律每隔一两年翻番,价格雪崩;相比之下软件的产出效率几乎原地踏步,大项目照样延期、超支、带一堆缺陷交付。整个行业弥漫着一种焦虑与期待:既然硬件能指数进步,软件是不是也该有某个「拐点技术」,一出现就让开发脱胎换骨?各路候选者被轮番寄予厚望——新语言、面向对象、人工智能、自动编程、图形化编程、验证工具、更强的工作站……
Brooks 用民间传说给这种期待起了名字:软件项目像狼人,平时温顺、到月圆(临近交付)就变身噬人怪兽;人人都在找那颗一击毙命的银弹。他要回答的真问题是:这种「一招制敌」的银弹,到底存不存在?而要回答它,必须先问一个更根本的问题——软件之难,究竟难在哪?
Brooks 借亚里士多德的一对概念下刀。任何造物的难度都可拆成两类:本质困难(essential)——源自事物本身固有的、非有不可的性质;偶然困难(accidental)——只是当前实现方式、工具、表达手段附带的麻烦,换一套就能减轻。软件的本质,是一堆相互咬合的概念构造:数据的集合、数据之间的关系、算法、函数的调用——这套「概念结构」才是软件真正的内容;把它落成某种语言的文本,只是给它换一件衣服。
这一刀的锋利之处在于它的推论:造软件里真正难的部分,是把那套概念结构想清楚、说精确;把它写成代码、调试它,反倒是次要的。如果本质困难占了大头,那么无论工具多先进,能省的都只是偶然那一小份——银弹于是无处安身。
为什么本质困难躲不掉?Brooks 列了软件区别于其他造物的四条天性。
Brooks 回看历史上真正兑现了生产率飞跃的三件大事,发现它们无一例外地攻击的是偶然困难:
关键的算术在这里:如果偶然困难如今已不到总困难的十分之九,那么哪怕把偶然困难彻底消灭,生产率也提不到十倍。未来任何一个数量级的进步,都必须从啃「本质」中来——而本质,按定义就是难啃的那部分。
Brooks 逐一点评当时的热门候选,判词大同小异:它们大多只削偶然,碰不到本质。
Brooks 并不悲观,只是拒绝速效幻觉。他给出四个攻击本质的方向,共同点是——没有一条是一劳永逸的,都得下持续的苦功:
这是一篇论说文,没有实验数据集,它的「结果」是一个可被时间检验的预言与一套支撑它的推理:十年内没有单一技术或管理方法能带来一个数量级的提升。支撑材料主要有两块:其一是上面的「本质/偶然」拆解——偶然已所剩无几,故上限被本质锁死;其二是他援引的经验事实,如个体程序员之间高达一个数量级的生产率差异,用以论证「人(设计者)比工具更决定成败」。到 1995 年他写《再回首》复盘时认为预言大体站得住:这十年里确实没有哪一项技术凭一己之力兑现了十倍飞跃;而他最看好的「买而非造」,则随货架软件与开源的兴起成了最见效的一条——这一条常被视为全文预见性最强的判断。
《没有银弹》给整个行业装上了一副「反炒作」的清醒剂。此后每当一项新技术(面向对象、UML、敏捷、云、低代码、乃至今天的 AI 编程)被吹成「终结软件危机的银弹」,人们就会把这篇文章搬出来问一句:它削的是偶然,还是本质?——这个提问框架本身,成了软件工程最持久的思维工具之一。
更深的贡献是那对本质 / 偶然的划分:它教会一代工程师把「工具带来的麻烦」与「问题固有的难」分开看,从而把精力押在真正的瓶颈——把需求想清楚、把复杂度管住、把人用好——而不是无休止地追逐下一个热门工具。文中「造软件最难的是决定造什么」「先原型再定需求」「增量生长」「顶尖设计者差一个数量级」等论断,直接滋养了后来的迭代开发、敏捷与原型法思想。
① 一句话:软件之难分「本质」与「偶然」两类;过去的进步只削偶然,而偶然已所剩无几,故十年内不会有单一技术把生产率提高一个数量级——没有银弹。
② 本质 = 软件「是什么」固有的难(一堆相互咬合的概念构造);偶然 = 当前工具 / 表达方式附带的麻烦,换一套即可减轻。
③ 四条本质困难:复杂(零件各不同,放大≠重复)、迁就(得将就一堆人为乱接口)、可变(无限可塑、越成功越常改)、不可见(画不出一眼看懂的图)。
④ 关键算术:偶然已不到总困难的 9/10,全清零也提不到十倍——上限锁死在本质。
⑤ 候选银弹(Ada、面向对象、AI、自动编程、图形化、形式化验证)大多只削偶然,碰不到本质;软件之难在「决定说什么」而非「怎么说」。
⑥ 冲着本质去的四条慢路:能买就别造、快速原型定需求、增量式生长、倾力培养顶尖设计者(个体生产率差一个数量级)。
⑦ 影响:给行业装上「反炒作」框架——每见新技术自称银弹,就问它削的是偶然还是本质;「买而非造」被后来的货架软件 / 开源强力印证。
⑧ 局限:预言限定太多近乎不可证伪;本质/偶然界线模糊、随抽象上移而流动;Harel 等反驳可视化能松动「不可见性」;托管语言 / 开源 / AI 的合力与其悲观基调有张力。