热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

没有银弹NoSilverBullet

《没有银弹:软件工程的本质性与附属性工作》(英语:NoSilverBullet—EssenceandAccidentsofSoftware

没有银弹:软件工程的本质性与附属性工作》(英语:No Silver Bullet — Essence and Accidents of Software Engineering)是IBM大型机之父佛瑞德·布鲁克斯所发表一篇关于软件工程的经典论文,原先是在1986年都柏林IFIP研讨会的一篇受邀论文[1][2],隔年电机电子工程师学会《Computer》也转载了这篇文章,他们用了几张《伦敦狼人(The Werewolf of London)》之类的电影剧照来当作说明,[3]还加上了一段〈终结狼人〉的附注,用来引出非银弹则不能成功的(现代)传说。该论述中强调由于软件的复杂性本质,而使真正的银弹[4]并不存在;所谓的没有银弹是指没有任何一项技术或方法可使软件工程的生产力在十年内提高十倍。

目录

[隐藏]
  • 1 摘要[5]
  • 2 问题之所在-银弹与软件专案
  • 3 软件开发的困难
    • 3.1 造成本质性困难的原因
    • 3.2 过去的突破解决了附属性的困难
      • 3.2.1 高级语言
      • 3.2.2 分时技术
      • 3.2.3 统一的开发环境
  • 4 查找银弹
  • 5 评价反响
    • 5.1 Harel的分析
    • 5.2 Jones的观点
  • 6 数据源
    • 6.1 参考文献
    • 6.2 脚注
  • 7 参见
  • 8 外部链接

[编辑] 摘要[5]

所有软件创作都包括了本质性工作(essential task)和附属性工作(accidental task)。前者是去创造出一种由抽象的软件实体所组成的复杂概念结构,后者则是用编程语言来表现这些抽象的实体,并在某些空间和速度的限制之下,将程序对应至机器语言。

现在,若跟本质性的工作相比,软件工程人员所做的事,还有多少算是花在附属性的工作上呢?除非附属性工作要耗费的心力超过全部工作的9/10,否则就算是将所有的附属性工作降至零,也无法将整个开发工作的轻松程度提升一个数量级。

以往,软件生产力的重要进展绝大部分是来自于人为障碍的排除,像是严苛的硬件限制、难用的编程语言、上机时间(machine time)的不足等等,这些都是造成附属性工作益发困难的原因。

[编辑] 问题之所在-银弹与软件专案

佛瑞德·布鲁克斯在〈没有银弹〉[6][7]中提到:

在民俗传说里,所有能让我们充满梦靥的怪物之中,没有比狼人更可怕的了,因为它们会突然地从一般人变身为恐怖的怪兽,因此人们尝试着查找能够奇迹似地将狼人一枪毙命的银弹。

我们熟悉的软件专案也有类似的特质(以一个不懂技术的管理者角度来看),平常看似单纯而率直,但很可能一转眼就变成一只时程延误、预算超支、产品充满瑕疵的怪兽,所以,我们听到了绝望的呼唤,渴望有一种银弹,能够有效降低软件开发的成本,就跟电脑硬件成本能快速下降一样。

但是,我们预见,从现在开始的十年之内,将不会看到任何银弹,无论是在技术上或管理上,都不会有任何单一的重大突破,能够保证在生产力、可靠度或简洁性上获得改善,甚至,连一个数量级的改善都不会有。

然而,怀疑并非悲观,虽然我们预见不会有任何重大的突破,而且事实上,我相信发生这种重大突破也不符软件的本质,但是,仍然有许多令人振奋的创新正在进行当中,若能按部就班、持之以恒地予以发展、散布,并灵活运用的话,想必应该会得到一个数量级的进展。捷径是不会有的,但有志者事竟成。

人类能克服疾病的第一步,就是以细菌说(germ theory)[8]淘汰了恶魔说(demon theory)[9]和体液说(humours theory)[10],正是这一步,带给了人类希望,粉碎了所有奇迹式的冀望,告诉人们进步是要靠按部就班、不辞劳苦而来,得在清洁卫生方面持续不断地投入心血,养成良好习惯,才是正道。如今,我们面对软件工程也是一样。

〈没有银弹〉主张并断言在未来的十年之内(从1986年文章发表后开始计算),不会有任何单一的软件工程上的突破,能够让程序设计的生产力得到一个数量级的提升。不过,作者认为这个假设现在已不再成立。

假设软件开发的总工作量为10,其中,本质性工作占掉1,附属性工作占掉9,那么改善附属性工作,将之消除,就可以把软件工作量减轻到1(因为附属性工作变成0),此时我们可以说,软件工作开发的轻松程度提升了一个数量级(因为由10进步到1,差10倍)。

[编辑] 软件开发的困难

布鲁克斯将软件开发的困难分为两类,这篇经典论文的核心论述通常被解释为复杂的软件工程问题无法靠简单的答案来解决。布鲁克斯相信软件开发真正的困难,是在于这种概念构造的规格制定、设计和测试,而并非在孜孜矻矻于它的呈现方式,以及测试该呈现方式的精确程度。

  • 本质性(essence):软件本身在概念(conceptual)建构上存先天的困难;亦即如何从抽象性问题,发展出具体概念上的解决方案。
  • 附属性(accident):将概念上的构思施行于电脑上,所遭遇到的困难。

布鲁克斯提到,有某些地方已经被附属性(accident)和附属的(accidental)这些字眼给混淆了,这个字眼是出自于亚里斯多德的古老用法。[11]就附属的(accidental)的这个字眼而言,他所指的并不是偶然发生的意思,也不是意外不幸的意思,而是比较接近伴随的或次要的意思。

[编辑] 造成本质性困难的原因

布鲁克斯认为,附加性的困难会随着工具的改善而逐渐淡化,反而是本质性的困难最难以解决,因为大部分的活动是发生在人们的脑海里,缺乏有效的辅助工具。依造布鲁克斯的说法有下列几项:[12]

  • 复杂性(complexity):软件要解决的问题,通常牵扯到计算步骤,这是一种人为、抽象化的智能活动,多半是复杂的。
  • 隐匿性(invisibility):尚未完成的软件是看不见的,即使利用图标说明,也常无法充分呈现其结构,使得人们在沟通上面临极大的困难。[13]
  • 配合性(conformity):在大型软件环境中,各子系统的接口必须协同一致。由于时间和环境的演变,要维持这样的一致性通常十分困难。
  • 易变性(changeability):软件所应用的环境常是由人群、法规、硬件设备、应用领域等,各因素所汇集而成,而这些因素皆会快速变化。
[编辑] 过去的突破解决了附属性的困难
[编辑] 高级语言
参见:汇编语言及机器语言

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

[编辑] 分时技术
参见:时间片

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

[编辑] 统一的开发环境
参见:集成开发环境

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

[编辑] 查找银弹

  • Ada和其他高级语言的进展

编程语言Ada是1980年代的一个通用型高级语言。事实上,Ada不只是反映了在语言概念上的演进,同时也具体实现了一些助长现代设计与模块化概念的特征;也许,Ada的理念才是比Ada语言本身更先进的地方,这理念就是:模块化(modularity)、抽象数据类型(abstract data type)、层次结构式结构(hierarchical structure)。

  • 面向对象程序设计

相对于当今流行的各种技术,面向对象程序设计(object-oriented programming)已被许多软件工程的学生寄予了更多的希望,[14]Dartmouth 的 Mark Sherman 指出,有两个不同的概念我们必须小心地加以分辨,从名称上就可以看出这两个概念的不同:抽象数据类型和层次结构式类型。后者也被称为类型(class)。所谓抽象数据类型,其概念就是一个对象的类型应该由一个名称、一组适当的值和一组适当的操作方式来定义,而不是以它存储的结构来定义,这部分应该是要被隐藏起来的,例如Ada的包裹(package)(使用私有类型)或Modula的模块(module)。

  • 人工智能
  • 专家系统
  • 自动化程序设计
  • 可视化或图形化程序设计
  • 软件的验证
  • 环境与工具
  • 工作站

[编辑] 评价反响

虽然《人月神话》引发了许多论述,但争议很少,倒是〈没有银弹〉引发了不少持相反意见的文章,包括寄给期刊主编的一些信件,以及到今天都还在持续出现的一些书函和短评,这其中有大部分是对‘不会有任何特效药的主张’提出反驳。[15]

在1990年,Brad Cox[16]发表一篇〈银弹存在(There Is a Silver Bullet)〉[17][18],Cox指出采取可再利用(reusable)、可替换组件的方式来对付属于概念本质性部分的问题。Glass、Vessey和Conger在他们1992年的一篇论文中就指出,有充分的证据显示,对银弹这种没有意义的研究仍尚未停止。[19]

[编辑] Harel的分析

David Harel在1992年的一篇文献〈咬紧银弹(Biting the Silver Bullet)〉[20]中,对已经发表的〈没有银弹〉进行非常仔细的分析。[21]Harel认为〈没有银弹〉和1984年Parnas〈战略防御系统软件面面观〉[22]这两篇都写得太过于绝望了,于是他就针对这一点来阐述较为光明的一面,他的文章还用了个副标题是“让系统开发走向一个光明的未来”。

就Harvel的认知,他认为造成〈没有银弹〉悲观的原因有三点:

  • 本质性和附属性的二分法。
  • 对每一个可能的银弹采取个别单独评论的方式。
  • 只预测10年,这对“预期任何重大的突破”而言,并没有足够长的时间。

Harvel更提出了一项假想实验,他假定〈没有银弹〉的主张不变,只是发表的时间换做是在1952年,而非1986年。他这时用的是归谬法(reducto ad absurdum)[23],用来反驳自附属性中切分出本质性的作法。

[编辑] Jones的观点

Caper Jones曾提出一个敏锐的见解,这个见解最初是写在一连串非正式的纪录中,后来出现在书上,几个与布鲁克斯通信的朋友也提到过。〈没有银弹〉就如同大部分的论文一般,都把焦点集中在生产力,也就是软件每单位的输入成本能得到多少输出效果。Jones则表示:“把重点放在品质上,生产力将随之而来。”[24][25]他认为,只要是成本过高和时程落后的专案,都耗费了非常多的额外时间和工作在查找并修正规格、设计、实现中的错误。Jones并提出数据佐证,缺乏有系统的品质控制与发生时程落后的灾难,这两者之间有强烈的相关性。

Caper Jones相信,两份同等的Cobol程序分别花10年编写,但其中一份使用结构化的方法,另一份则否,那么所得到的效果将相差3倍。

[编辑] 数据源

[编辑] 参考文献
  1. Brooks, Fred P.. No Silver Bullet — Essence and Accident in Software Engineering. Proceedings of the IFIP Tenth World Computing Conference. 1986: 1069–1076.
  2. Brooks, Fred P.. No Silver Bullet — Essence and Accidents of Software Engineering. IEEE Computer. April 1987, 20 (4): 10–19.
  3. Frederick P. Brooks, Jr.; 译者:钱一一. 人月神话:软件专案管理之道. 台北市: 经济新潮社. 2004-04-01. ISBN 986-7889-18-5 (正体中文).
[编辑] 脚注
  1. ^ IFIP Congress 1986: Dublin, Ireland
  2. ^ Brooks, F. P.,“No silver bullet — essence and accidents of software engineering,”in Information Processing 86, H. J. Kugler, ed. Amsterdam: Elsevier Science (North Holland), 1986, pp. 1069-1076.
  3. ^ Brooks, F. P.,“No silver bullet — essence and accidents of software engineering,”Computer 20, 4(April, 1987),pp. 10-19.
  4. ^ 欧美古老传说中使用银子弹(silver bullet)可以杀死吸血鬼、狼人或怪兽;银子弹引申为解决问题的有效方法
  5. ^ 这篇标题为〈没有银弹〉的文章出自于Information Processing 1986, the Proceedings of the IFIP Tenth World Computing Conference, pp.1069-76.由H. J. Kugler所编辑。
  6. ^ F. P. Brooks,“No Silver Bullet Essence and Accidents of Software Engineering,”Computer, Vol. 20, pp. 10-19, 1987.
  7. ^ 编者钱一一译注:传说在月圆之夜,狼人就会从普通人兽化成狼,变成可怕的怪兽,对付狼人得用银制的子弹贯穿它的心脏。为什么要用银弹?因为银被视为与月亮同体,具有法力,所以银弹是杀死狼人的“必杀技”。
  8. ^ 细菌说:由法国微生物学家巴斯德(Louis Pasteur, 1822~1895)开创,发现疾病是由细菌感染而来。
  9. ^ 恶魔说:生病是因为恶魔作怪,或者是做错事,触怒了恶魔。
  10. ^ 体液说:人体流着四种体液,血液(blood)、黏液(phlegm)、胆汁(choler)、黑胆汁(black bile),这四种体液各有不同的属性,决定了人的性情、脾气。生病是因为这四种体液的比例不均衡所致。
  11. ^ ‘根据亚里斯多德(Aristotle)和士林哲学(Scholastic philosophy)的说法,附属性是一种不属于事物根本或必要的性质,而是其他原因造成的影响才产生出来的性质。’Webster's New International Dictionary of the English Language, 2d ed., Springfield, Mass.: G. C. Merriam, 1960.
  12. ^ 郑炳强. 软件工程:从实务出发(Software Engineering: A Perspective from Practices). 智胜文化事业有限公司. 2007. ISBN 978-957-729-659-7.
  13. ^ Parnas, D. L.,“Designing software for ease of extension and contraction.”
    IEEE Trans. on SE,5,2(March, 1979),pp. 128-138
  14. ^ Booch, G.,“Object-oriented design,”in Software Engineering with Ada.
    Menlo Park, Calif.: Benjamin/Cummings, 1983.
  15. ^ 有些来信与回应刊登在1987年7月份的IEEE《Computer》。虽然没有银弹并未得奖,但Bruce M. Skwiersky对它的评论获选为1988年《Computer Reviews》的最佳评论,这份奖项以及该评论被公布并转E. A. Weiss,“Editrial”Computing Reviews (June, 1989),pp.283-284.评论中得有重大错误:“六倍”应该为“10^6”
  16. ^ Brad Cox也是软件的大师级人物,“软件IC”一词就是他提出来的。
  17. ^ Brad Cox. http://virtualschool.edu/cox/pub/NoSilverBulletRevisted/. American Programmer Journal. 1995年11月 [2012-07-10查阅] (英文). "In one of the most influential books of this era, The Mythical Man-month, Dr. Fred Brooks observed that adding more people to a late software project only seems to make matters worse. And in an equally influential article, No Silver Bullet; Essence and Accidents of Software Engineering, he argued that the difficulties are inevitable, arising from software's inescapable essence, as distinct from accident; something we're doing wrong in producing it."
  18. ^ Cox, B. J.,“There is a silver bullet,”Byte (Oct., 1990),pp.209-218.
  19. ^ Glass, R. L., and S. A. Conger,“Research Software tasks: Intellectual or clerical?”Information and Management, 23, 4 (1992),pp.183-192.
  20. ^ David Harel. Biting the Silver Bullet: Toward Brighter Future for System Development. 1992年 [2012-07-10查阅] (英文). "This article was triggered by those of Brooks and Parnas. It is not a rebuttal. Indeed, I agree with most of the specific points made in both papers. Instead, the goal of this article is to illuminate the brighter side of the coin, emphasizing developments in the field that were too recent or immature to have influenced Brooks and Parnas when they wrote their manuscripts."
  21. ^ Harel, D.,“Biting the silver bullet: Toward a brighter future for system development,”Computer (Jan., 1992),pp.8-20.
  22. ^ Parnas, D. L.,“Software aspects of strategic defense systems,”Communications of the ACM,28,12(Dec., 1985),pp. 1326-1335.
  23. ^ 编者钱一一译注:“归谬法”:由q出发,推导出逻辑结果r,如果r是矛盾的,那么q就被否定掉。
  24. ^ Jones, C., Assessment and Control of Software Risks. Englewood Cliffs, N. J.: Prentice-Hall, 1994.P.619.
  25. ^ T.Caper Jones. Assessment and Control of Software Risks. Prentice Hall. 1993-12-17 [2012-07-12察阅]. ISBN 978-0137414062 (英文).

[编辑] 参见

  • 佛瑞德·布鲁克斯
  • 人月神话
  • 软件危机
  • 狼人

[编辑] 外部链接

  • (英文) 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.
  • (简体中文) 论银弹的存在
  • (简体中文) 从没有银弹到银弹加工场



推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
author-avatar
lock2502898047_947
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有