《No Silver Bullet — Essence and Accidents of Software Engineering》是IBM大型机之父Frederick P. Brooks在1986年发表的一篇关于软件工程的经典论文。银弹(Silver Bullet)是外国传说中可以杀死狼人等怪物的神器,而后引申出的含义类似于大杀招、王牌。而Brooks在这篇论文中强调,由于软件本质的复杂性,真正的“银弹”并不存在;也断言在十年内,没有任何一项技术或方法可使软件工程的生产力提高一个数量级。
Brooks将软件开发的困难分为两类:本质性(essence)和伴随性(accident)。本质性困难是指软件“先天性”的困难,即如何从抽象性问题得到具体概念上的解决方案。就像数据库中的实体是对现实世界的抽象,但怎么设计这些抽象是难点,也是最重要的,将会影响整个开发的过程。伴随性困难是指将概念构思施行到代码编写等上遇到的困难。当然对伴随性困难感受最深的就是开发环境的配置安装……顺便略吐槽一下当年安SQLSEVER时因为先装了VS2010竟然导致不能安装最后重装系统的悲惨经历。
Brooks认为,伴随性困难会随着工具的改善而淡化,但本质性困难是难以解决的,因为它大部分发生在我们的头脑中,而没有什么工具可以有效地帮助我们。这一点我并不完全赞同。
Brooks例举的本质性困难比如软件的复杂性Complexity(计算是人为抽象的)、一致性Conformity(接口统一)、易变性Changeability(需求、硬件等变化)、不可见性Invisibility(未完成的的软件难以充分展现其结构,带来沟通困难)。
过去的突破比如高级语言High-level languages.、分时技术Time-sharing、统一的开发环境Unified programming environments,解决了一些伴随性困难。
而后Brooks也对一些兴起的技术或方法做了讨论和分析(感觉不乐观的分析占多数),例如Ada和其他高级语言的进展、面向对象的程序设计、人工智能、专家系统、自动化程序设计等等……以及比较有前景的对本质性问题有效果的法子,如购买部分软件取代开发、使用优秀的设计人员。
Brooks的这篇《没有银弹》引起的反响是很大的,争议与反对的声音也很多。1990年,Brad Cox发表了一篇名为《There Is a Silver Bullet》的文章,在其中指出采取可再利用(reusable)、可替换组件的方式来对付属于概念本质性部分的问题。(后来他还写了《No Silver Bullet Revisted》)
没有银弹,这种说法在我看来过于悲观。前面提到我不赞同头脑的思考难以借助工具那一点,我认为,软件开发者累积的经验与其自身归纳总结的能力即是头脑的“工具”。这一点确实不具有普适性,并且差异性很大。但随着软件工程的发展,我认为未来的软件工程师会得到更好的培训,正如这门课就是一种尝试。我们都没有牛顿的头脑,但我们每个人都会计算万有引力,此所谓“站在巨人的肩膀上”。对于总体来说,经验性的进步是显著的,并会因为某些契机可能得到大幅度提升,比如互联网的全球化。经验转化为更优质的培训后,开发人员的水平提升,软件开发总体的质量或时间将得到有效的提高。
一点拙见,还请指教。