人们常常会看到一些编程领域的YouTuber或讲师在表达完自己的观点后,使用“No Silver Bullet”这个惯用语。
他们在充分阐述了自己的观点之后,通过添加“No Silver Bullet”这句话,试图阻止任何后续的反驳或批评。
这种做法很快演变成一种态度,即“反正没有万能的解决方案,所以没有必要再争论,我也不需要为我的主张负责”。
这是一种责任规避策略。
那么,这个说法是从哪里来的呢?
这篇论文出自Frederick P. Brooks, Jr.,他因获得图灵奖而广为人知。
这篇论文的核心观点非常简单:
“在软件工程中,不存在万能药(Silver Bullet)。”
那么,为什么偏偏是银弹呢?
论文中提到,在民间传说(folklore)中,没有什么比狼人更可怕了。原因在于,狼人从熟悉的存在转变为陌生的恐怖,因此令人恐惧。
要消灭狼人,必须使用银弹(Silver Bullet)。
Brooks借此比喻指出,软件项目通常看似无害,但一旦进度拖延、预算超支,就可能变成一个可怕的“怪物”。
论文探讨了是否存在某种银弹,能够轻松解决软件开发的问题。
Brooks断言,在1986年之后的十年内,软件生产率不可能提高十倍以上。
他还指出,软件开发本质上无法实现如此快速的进步。
那么,我们在2025年应该如何看待这篇论文呢?
这篇论文指出了软件开发生产力难以提升十倍以上的两个主要原因:
本质性困难(Essence)和 偶然性困难(Accidents) 。
本质性困难 是由软件本身的特性引发的难题,属于根本无法消除的复杂性,具体包括以下四点:
-
复杂性(Complexity) :系统本身具有极高的复杂性,由数十万行代码组成的系统超越了人类的理解能力,导致维护困难。再加上功能之间的交互、异常处理、状态组合等因素,复杂性呈指数级增长。
-
适配性(Conformity) :软件需要满足现实世界的复杂需求和约束条件,并适应各种外部环境(如硬件、操作系统、网络等)。这些外部因素相互依赖且不断变化。
-
可变性(Changeability) :与硬件或其他工程产品相比,软件更容易修改和变更。然而,这种可变性反而带来了挑战,因为用户需求不断变化,技术发展也要求软件持续更新。
-
不可见性(Invisibility) :软件是一种抽象的存在,不像建筑或图纸那样可以通过物理模型直观理解,这导致了许多问题。
以下是论文中对本质性问题的最佳描述原文:
软件的复杂性并非次要属性,而是其本质属性。
因此,在描述软件实体时忽略复杂性,往往会导致忽略其本质。
在过去的三个世纪里,数学和物理科学通过构建复杂现象的简化模型,从中推导出属性并进行实验验证,取得了巨大的进步。
这种范式之所以成功,是因为模型中忽略的复杂性并非现象的本质属性。
然而,当复杂性本身就是本质时,这种方法就行不通了。
偶然性困难 是指由于工具、技术、方法论等不足而在软件开发过程中产生的困难。
在1986年,Brooks提出了几种可能的银弹候选方案,以减少这些偶然性困难:
- 高级语言(High-Level Language)
- 面向对象设计(OOP) ——将复杂问题分解为小的对象单元,并使对象独立运作。
- 迭代开发(Iterative Development)
他认为这些方法可以减少偶然性困难。
实际上,如今高级语言已成为主流,OOP也成为代码风格的主流,自动化工具减少了重复性工作。然而,创造性问题解决仍然需要人类完成。
迭代开发以敏捷开发(Agile)的形式回归,尽管技术有所进步,但我们依然面临复杂性问题,软件工程仍然困难重重。
偶然性复杂性可以通过技术进步解决,但本质性复杂性依然存在。
因此,软件开发的生产力无法大幅提升,这一观点在2025年的今天仍然有效。
然而,人们可能会问:
在AI时代,情况还会如此吗?
事实上,Brooks当时也将AI视为银弹的候选方案之一。
在这篇论文中,我们可以看到当时对AI的认知。Brooks对未来的银弹候选方案(AI)持批判态度。
论文引用了Parnas的定义,将AI分为两种视角:
-
AI-1(替代人类智能) :
“以前只能通过人类智能解决的问题,现在可以用计算机来解决。”
这种定义侧重于通过计算机实现人类认知能力的尝试。
例如,让计算机执行只有人类才能完成的问题解决、决策、学习等任务。 -
AI-2(启发式编程) :
“使用启发式或基于规则的编程技术集合。”
这种方法通过编码专家的知识和经验来解决问题。
典型例子是专家系统,目标是模仿特定领域专家的问题解决策略。
Brooks对这两种视角都持怀疑态度:
-
AI-1 :他认为AI-1的定义过于主观且模糊。
实际上,到2025年,我们对AGI(通用人工智能)的定义仍然因学者而异,这也是一个例证。 -
AI-2 :即使这些系统能够模仿特定领域的专家,它们仍然无法完全解决本质性复杂性。
尽管2025年的AI模型已经涵盖了AI-1和AI-2,但Brooks的预测依然有效。
AI仍然无法完全构建软件,当文本量超过一定限度时,它会产生结构性问题。
正如大多数知名开发者所言:
目前的AI可以作为提高开发者生产力的工具,但仍然无法完全取代人类开发者。
软件项目的成功仍然依赖于明确的需求定义、架构设计等人类能力。
AI目前还无法完全理解人类的需求并输出理想的结果。
此外,AI编程本身具有黑箱特性,其输出并非基于对原理的全面理解,而是通过参数调整生成的。
这种黑箱特性反而增加了输出的复杂性。
2025年,AI技术虽然取得了惊人的进步,但“No Silver Bullet”论文仍然有效。
AI是提高软件开发生产力的强大工具,但它无法成为解决软件本质复杂性的“万能药”。
“No Silver Bullet”论文教导我们要摒弃幻想,直面现实,通过不懈的努力和渐进式的改进,坚定地走在软件工程的道路上。
2025年,“No Silver Bullet”的信息更加贴近现实。
2025年,
No Silver Bullet.
依然有效!