没有银弹

《没有银弹：软体工程的本质性与附属性工作》（No Silver Bullet—Essence and Accidents of Software Engineering）是IBM大型电脑之父佛瑞德·布鲁克斯所发表一篇关于软体工程的论文，原先是在1986年都柏林IFIP研讨会的一篇受邀论文，隔年电机电子工程师学会《Computer》也转载了这篇文章，他们用了几张《Werewolf of London》之类的电影剧照来当作说明，还加上了一段〈终结狼人〉的附注，用来引出非银弹则不能成功的（现代）传说。该论述中强调由于软体的复杂性本质，而使真正的银弹NoteTag|欧美古老传说中使用银子弹（silver bullet）可以杀死吸血鬼、狼人或怪兽；银子弹引申为解决问题的有效方法。并不存在；所谓的没有银弹是指没有任何一项技术或方法可使软体工程的生产力在十年内提高十倍。

**摘要**
所有软体创作都包括了本质性工作（essential task）和附属性工作（accidental task）。前者是去创造出一种由抽象的软体实体所组成的复杂概念结构，后者则是用程式语言来表现这些抽象的实体，并在某些空间和速度的限制之下，将程式对应至机器语言。这篇标题为〈没有银弹〉的文章出自于Information Processing 1986, the Proceedings of the IFIP Tenth World Computing Conference, pp.1069-76.由H. J. Kugler所编辑。
现在，若跟本质性的工作相比，软体工程人员所做的事，还有多少算是花在附属性的工作上呢？除非附属性工作要耗费的心力超过全部工作的9/10，否则就算是将所有的附属性工作降至零，也无法将整个开发工作的轻松程度提升一个数量级。以往，软体生产力的重要进展绝大部分是来自于人为障碍的排除，像是严苛的硬体限制、难用的程式语言、上机时间（machine time）的不足等等，这些都是造成附属性工作益发困难的原因。

**问题之所在－银弹与软体专案**
佛瑞德·布鲁克斯在《没有银弹》编者钱一一译注：传说在月圆之夜，狼人就会从普通人兽化成狼，变成可怕的怪兽，对付狼人得用银制的子弹贯穿牠的心脏。为什么要用银弹？因为银被视为与月亮同体，具有法力，所以银弹是杀死狼人的「必杀技」。中提到：
《没有银弹》主张并断言在未来的十年之内（从1986年文章发表后开始计算），不会有任何单一的软体工程上的突破，能够让程式设计的生产力得到一个数量级的提升。不过，作者认为这个假设现在已不再成立。
假设软体开发的总工作量为10，其中，本质性工作占掉1，附属性工作占掉9，那么改善附属性工作，将之消除，就可以把软体工作量减轻到1（因为附属性工作变成0），此时我们可以说，软体工作开发的轻松程度提升了一个数量级（因为由10进步到1，差10倍）。

**软体开发的困难**
布鲁克斯将软体开发的困难分为两类，这篇经典论文的核心论述通常被解释为复杂的软体工程问题无法靠简单的答案来解决。布鲁克斯相信软体开发真正的困难，是在于这种概念构造的规格制定、设计和测试，而并非在孜孜矻矻于它的呈现方式，以及测试该呈现方式的精确程度。- 本质性（essence）：软体本身在概念（conceptual）建构上存先天的困难；亦即如何从抽象性问题，发展出具体概念上的解决方案。- 附属性（accident）：将概念上的构思施行于电脑上，所遭遇到的困难。
布鲁克斯提到，有某些地方已经被附属性（accident）和附属的（accidental）这些字眼给混淆了，这个字眼是出自于亚里斯多德的古老用法NoteTag|『根据亚里斯多德（Aristotle）和士林哲学（scholastic philosophy）的说法，附属性是一种不属于事物根本或必要的性质，而是其他原因造成的影响才产生出来的性质。』。就accidental的这个字眼而言，他所指的并不是偶然发生的意思，也不是意外不幸的意思，而是比较接近伴随的或次要的意思。

**造成本质性困难的原因**
布鲁克斯认为，附加性的困难会随着工具的改善而逐渐淡化，反而是本质性的困难最难以解决，因为大部分的活动是发生在人们的脑海里，缺乏有效的辅助工具。依照布鲁克斯的说法有下列几项：- 复杂性（complexity）：软体要解决的问题，通常牵扯到计算步骤，这是一种人为、抽象化的智能活动，多半是复杂的。- 隐匿性（invisibility）：尚未完成的软体是看不见的，即使利用图示说明，也常无法充分呈现其结构，使得人们在沟通上面临极大的困难。IEEE Trans. on SE,5,2 (March, 1979), pp. 128-138.- 配合性（conformity）：在大型软体环境中，各子系统的介面必须协同一致。由于时间和环境的演变，要维持这样的一致性通常十分困难。- 易变性（changeability）：软体所应用的环境常是由人群、法规、硬体设备、应用领域等，各因素所汇集而成，而这些因素皆会快速变化。

**过去的突破解决了附属性的困难**

**高阶语言**
高阶语言达成了什么样的使命呢？它使程式不再陷入许多原来附属在程式里的复杂性。一支抽象的程式所包含的是一些概念的构造：函式、资料型别、先后顺序的关系，以及讯息传递的方式，然而实际上，与机器码攸关的其实是位元、暂存器、条件、分支、通道、磁碟等等。高阶语言可以将抽象程式里所必要的构造予以具体化，并且避免掉所有更低阶的东西，在这种情形下，它把跟程式内涵一点关系都没有的那一整层复杂性给去除了。

**分时技术**
分时（time-sharing）技术所挑战的是另一个截然不同的难题，因为分时，确保了即时性，使我们得以持续保住脑子里对复杂的概观。分时技术所能贡献的底限也可以直接推算出来，由于其主要的效用就是缩短系统的反应时间，当这项时间趋近于零，并在某一点上跨越了人类所能够察觉到有系统反应时间存在的临界点，大约是十分之一秒，低于这个值，就不会再有任何效益了。

**统一的开发环境**
Unix和Interlisp是第一个得到广泛使用的整合软体开发环境，并且也被公认已将生产力提升了好几倍。这方面所挑战的附属性难题，就是借由完整的程式库、统一的档案格式、管道（pipe）和过滤器（filter），以促成软体的共用，于是，任何概念的构造在理论上都可以呼叫、传递和运用在另一个对象，而实务上，这点也很容易就可以办得到。这方面的突破随后也带动了整个工具软体的发展，因为每一个新工具只要用的是标准规格，就可以适用于任何程式。

**寻找银弹**
 Ada和其他高阶语言的进展
程式语言Ada是1980年代的一个通用型高阶语言。事实上，Ada不只是反映了在语言概念上的演进，同时也具体实现了一些助长现代设计与模组化概念的特征；也许，Ada的理念才是比Ada语言本身更先进的地方，这理念就是：模组化（modularity）、抽象资料型别（abstract data type）、阶层式结构（hierarchical structure）。
 物件导向程式设计
相对于当今流行的各种技术，物件导向程式设计（object-oriented programming）已被许多软体工程的学生寄予了更多的希望Menlo Park, Calif.: Benjamin/Cummings, 1983.，达特茅斯学院的Mark Sherman指出，有两个不同的概念我们必须小心地加以分辨，从名称上就可以看出这两个概念的不同：抽象资料型别和阶层式型别。后者也被称为类别（class）。所谓抽象资料型别，其概念就是一个物件的型别应该由一个名称、一组适当的值和一组适当的操作方式来定义，而不是以它储存的结构来定义，这部分应该是要被隐藏起来的，例如Ada的包裹（package，使用私有型别）或Modula的模组（module）。
*人工智慧
*专家系统
*自动化程式设计
*视觉化或图形化程式设计
*软体的验证
*环境与工具
*工作站

**评价回响**
虽然《人月神话》引发了许多论述，但争议很少，倒是《没有银弹》引发了不少持相反意见的文章，包括寄给期刊主编的一些信件，以及到今天都还在持续出现的一些书函和短评，这其中有大部分是对『不会有任何特效药的主张』提出反驳。有些来信与回应刊登在1987年7月份的IEEE《Computer》。虽然没有银弹并未得奖，但Bruce M. Skwiersky对它的评论获选为1988年《Computer Reviews》的最佳评论，这份奖项以及该评论被公布并转载于E. A. Weiss, "Editrial", Computing Reviews(Jun, 1989), pp. 283-284. 评论中得有重大错误：「6倍」应该为「10^6」
1990年，Brad CoxBrad Cox也是软体工程学的大师级人物，「软体IC」一词就是他提出来的。发表一篇《银弹存在》（"There Is a Silver Bullet"），指出采取可再利用（reusable）、可替换组件的方式来对付属于概念本质性部分的问题。Glass、Vessey和Conger在他们1992年的一篇论文中就指出，有充分的证据显示，对银弹这种没有意义的研究仍尚未停止。

**Harel的分析**
David Harel在1992年的一篇文献《紧咬银弹》（"Biting the Silver Bullet"
）中，对已经发表的《没有银弹》进行非常仔细的分析。Harel认为《没有银弹》和1984年Parnas《战略防御系统软体面面观》这两篇都写得太过于绝望了，于是他针对这一点来阐述较为光明的一面，他的文章还用了个副标题是「让系统开发走向一个光明的未来」。
就Harel的认知，他认为造成《没有银弹》悲观的原因有三点：- 本质性和附属性的二分法。- 对每一个可能的银弹采取个别单独评论的方式。- 只预测10年，这对「预期任何重大的突破」而言，并没有足够长的时间。
Harel更提出了一项假想实验，他假定《没有银弹》的主张不变，只是发表的时间换做是在1952年，而非1986年。他这时用的是归谬法（reducto ad absurdum）编者钱一一译注：「归谬法」：由q出发，推导出逻辑结果r，如果r是矛盾的，那么q就被否定掉。，用来反驳自附属性中切分出本质性的作法。

**Jones的观点**
Caper Jones曾提出一个敏锐的见解，这个见解最初是写在一连串非正式的纪录中，后来出现在书上，几个与布鲁克斯通信的朋友也提到过。《没有银弹》就如同大部分的论文一般，都把焦点集中在生产力，也就是软体每单位的输入成本能得到多少输出效果。Jones则表示：「把重点放在品质上，生产力将随之而来」。他认为，只要是成本过高和时程落后的专案，都耗费了非常多的额外时间和工作在寻找并修正规格、设计、实作中的错误。Jones并提出资料佐证，缺乏有系统的品质控制与发生时程落后的灾难，这两者之间有强烈的相关性。
Caper Jones相信，两份同等的Cobol程式分别花10年编写，但其中一份使用结构化的方法，另一份则否，那么所得到的效果将相差3倍。

**注释**

**参考文献**

**引用**

**来源**
 期刊文章
 书籍- dead-url = yes 

**外部连结**
  No Silver Bullet: Essence and Accidents of Software Engineering, by Frederick P. Brooks, Jr.-  No hay balas de plata: Lo esencial y lo accidental en la Ingeniería del Software, by Frederick P. Brooks, Jr.-  论银弹的存在 date=20121110184414 

**参见**
 佛瑞德·布鲁克斯- 《人月神话》- 软体危机- 银色子弹 → 狼人