再论《没有银弹》 (“No Silver Bullet”Refired)---经典中的经典,听听大师教诲吧

来源:互联网 发布:汽车人工智能系统 编辑:程序博客网 时间:2024/04/30 13:36

         再论《没有银弹》 (“No Silver Bullet”Refired)


生死有命,富贵在天
- 威廉三世,奥伦治王子


那些想看到完美方案的人,其实在心底里就认为它们以前不存在,以后也不可能出现。
- 亚历山大·波普,批判散文


Every bullet has its billet.
- WILLIAM III OF ENGLAND, PRINCE OF ORANGE
Whoever thinks a faultless piece to see, thinks what ne’er was, nor e’er shall be.
- ALEXANDER POPE, AN ESSAY ON CRITISIM
人狼和其他恐怖传说
《没有银弹-软件工程中的根本和次要问题》(第16章)最初是在IFIP’86年都柏林大会的约稿,接着在一系列的刊物上发表1。《计算机》杂志上翻印了该文章,封面是一副类似于《伦敦人狼》2影片的恐怖剧照。同时,还有一栏补充报道《杀死人狼》,描述了银弹将要完成的(现代)神话。在出版以前,我并未注意到补充报道和文字,也没有料到一篇严肃的技术性文字会被这样润色。
Computer杂志的编辑们是取得他们想要的效果的专家,不过,似乎有很多人阅读了那篇文章。因此,我为那一章选择了另一幅人狼插图,一幅对这种近乎滑稽物种的古老素描。我希望这副并不刺眼的图案有相同的正面效果。 - 120 -
存在着银弹-就在这里!
《没有银弹》中声称和断定,在近十年内,没有任何单独的软件工程进展可以使软件生产率有数量级的提高(引自1986年的版本)。现在已经是第九个年头,因此也该看看是否这些预言得到了应验。
《人月神话》一文被大量地引用,很少存在异议;相比之下,《没有银弹》却引发了众多的辩论,编辑收到了很多文章和信件,至今还在延续3。他们中的大多数攻击其核心论点和我的观点——没有神话般的解决方案,以及将来也不会有。他们大都同意《没有银弹》一文中的多数观点,但接着断定实际存在着杀死软件怪兽的银弹——由他们所发明的银弹。今天,当我重新阅读一些早期的反馈,我不禁发现在1986年~1987年期间,曾被强烈推崇的秘方并没有出现所声称的戏剧性效果。
在购买计算机软件和硬件时,我喜欢听取那些真正使用过产品并感到满意的用户的推荐。类似的,我很乐意接受银弹已经出现的观点,例如,某个名副其实的中立客户走到面前,并声称,“我使用了这种方法、工具或者产品,它使我的软件生产率提高了十倍。”
很多书信作者进行了若干正确的修订和澄清,其中一些还提供了很有针对性的分析和辩驳,对此我非常感激。本章中,我将同大家分享这些改进,以及对反面意见进行讨论。
含糊的表达将会导致误解
某些作者指出我没有将一些观点表达清楚。
次要(Accident)。在第16章的摘要中,我已经尽我所能地清晰表达了《没有银弹》一文的主要观点。然而,仍有些观点由于术语“accident(偶然)”和“accidental(次要)”而被混淆,这些术语来自亚里斯多德的古老用法4。术语“accidental”,我不是指“偶然发生”,也不是指“不幸的”,而是更接近于“附带的”或者“从属的”。
我并不是贬低软件构建中的次要部分,相反,我认同英国剧作家、侦探小说作者和神学家桃乐丝·赛尔丝看待创造性活动的观点,创造性活动包括(1)概念性结构的形式规格化,(2)使用现实的介质来实现,(3)在实际的使用中,与用户交互5。在软件开发中,我称为“必要(essence)”的部分是构思这些概念上的结构;我称为“次要(accident)”的部分指它的实现过程。 - 121 -
现实问题。对我而言(尽管不是所有人),关键论点的正确与否归结为一个现实问题:整个软件开发工作中的哪些部分与概念性结构的精确和有序表达相关,哪些部分是创造那些结构的思维活动?根据缺陷是概念性的(例如未能识别某些异常),或者是表达上的问题(例如指针错误或者内存分配错误)等,可以将这些缺陷的寻找和修复工作进行相应的划分。
在我看来,开发的次要或者表达部分现在已经下降到整个工作的一半或一半以下。由于这部分是现实的问题,所以原则上可以应用测量技术来研究6。这样,我的观点也可以通过来更科学和更新的估计来纠正。值得注意的是,还没有人公开发表或者写信告诉我,次要部分的任务占据了工作的9/10。
《没有银弹》无可争辩地指出,如果开发的次要部分少于整个工作的9/10,那么即使不占用任何时间(除非出现奇迹),也不会给生产率带来数量级的提高。因此,必须着手解决开发的根本问题。
由于《没有银弹》,Bruce Blum把我的注意力引向Herzberg、Mausner和Sayderman7等人在1959年的研究。他们发现动机因素可以提高生产率。另一方面,环境和次要因素,无论起到多么积极的作用,仍无法提高生产率。但是在产生负面影响时,它们会使生产率降低。《没有银弹》认为很多软件开发过程已经消除了以下负面因素:十分笨拙的机器语言、漫长的批处理周转时间以及无法忍受的内存限制。
因为是根本困难所以没有希望?1990年Brad Cox的一篇非常出色的论文《这就是银弹》(There Is a Silver Bullet),有说服力地指出重用和交互的构件开发是解决软件根本困难的一种方法8。我由衷地表示赞同。
不过,Cox在两点上误解了《没有银弹》。首先,他断定软件困难来自“编程人员缺乏构建当今软件的技术”。而我认为根本困难是固有的概念复杂性,无论是任何时间,使用任何方法设计和实现软件的功能,它都存在。其次,他(以及其他人)阅读《没有银弹》,并认定文中的观点是没有任何处理软件开发中根本困难的希望——这不是我的本意。作为本质上的困难,构思软件概念性的结构本身就有复杂性、一致性、可变性及不可见性的特点。不过实际上,每一种困难产生的麻烦都是可以改善的。
复杂性是层次化的。例如,复杂性是最严重的内在困难,并不是所有的复杂性都是不可避免的。我们的很多软件,但不是全部,来自应用本身随意的复杂特性。来自一家国际管理咨询公司,MYSIGMA Lars Sodahl的Lars Sodahl和合作伙伴曾写道:就我的经验而言,在系统工作中所遇到的大多数困难是组织结构上的一些失误征兆。试图为这些现实建模,建立同等复杂的程序,实际上是隐藏,而不是解决这些杂乱无章的情况。
Northrop的Steve Lukasik认为即使是组织机构上的复杂性也不是任意的,可能容易受到策略调整的影响。
我曾作为物理学家接受过培训,因此倾向于用更简单的概念来描述“复杂”事物。现在你可能是正确的,我无法断定所有的复杂事物都容易用有序的规律表达⋯⋯同样的道理,你不能断定它们不能。
⋯⋯昨天的复杂性是今天的规律。分子的无序性启迪了气体动力学理论和热力学的三大定律。现在,软件没有揭示类似的规律性原理,但是解释为什么没有的重担在你的身上。我不是迟钝和好辩的。我相信有一天软件的“复杂性”将以某种更高级的规律性概念来表达(就像物理学家的不变式)。
我并没有着手于Lukasik提倡的更深层次的分析。作为一个学科,我们需要更广泛的信息理论,它能够量化静态结构的信息内容,就像针对交互流的香农信息论一样。这已经超越了我的能力。作为对Lukasik的简单回应,我认为系统复杂性是无数细节的函数,这些细节必须精确而且详细地说明——或者是借助某种通用规则,或者是逐一阐述,但决不仅仅是统计说明。仅靠若干人不相干的工作,是不大可能产生足够的一致性,能用通用规律进行精确描述。
不过,很多复杂性并不完全是因为和外部世界保持一致,而是因为实现的本身,例如数据结构、算法、互联性等。而在更高的级别开发(发展)软件,使用其他人的成果,或者重用自己的程序——都能避免面对整个层次的复杂性。《没有银弹》提出了全力解决复杂性问题的方法,这种方法可以在现实中取得十分乐观的进展。它倡导向软件系统增加必要的复杂性: