这篇文章首先是介绍了软件工程要面临的固有的不可避免的问题,主要是复杂性(complexity),软件整合(conformity),可变性(changeability)和不可见性(invisibility)。下面是对文章里这些问题观点的整理:
(1)复杂性(complexity)。软件要增加规模不仅仅是简单地增加相同内容的规模,还要增 加新的内容,这就使得随着软件规模的增加其复杂度的增加是非线性的,整体复杂性的增加可能比线性增加要大得多。软件的复杂性的这个特征给软件的开发带来了 不少的困难,它会给软件项目组里的组员之间交流带来困难,从而导致产品的瑕疵、开支过多和时间耽搁;这样的复杂性给我们穷举所有软件可能的状态带来了不少的困难,进而导致软件最后的不可靠性;各个功能模块之间的调用关系也会随着软件的复杂度的增加而变得复杂,这使得项目变得很难去使用;复杂的软件结构同样会使得软件的扩展性和安全性受到影响。
(2)软件整合(conformity)。一个软件往往是由不同的人一起开发出来的,因此软件开发者不得不设计出符合各种接口的软件来,这个困难往往随着时间变化,甚至随着不同的应用场合而变化。总的就是说软件整合是个不好解决的问题。
(3)可变性(changeability)。软件相对于其它的传统产品,要更容易修改,而且修改 的频率要比传统的产品大;一个成功的软件必须要能够适应用户的各种需求,比如,有些用户就是喜欢去试探那些超出软件工作域的情形,软件开发者设计的软件必 须要能够面对这些挑战而不崩溃,但这是一个不可能在一开始全部知道的,所以软件更新时软件发布后的“家常饭”。
(4)不可见性(invisibility)。软件不同于其它设计,软件没有空间性,所以具有不可见性的特点;有向图帮了软件工作者一个大忙,软件工作者可以用有向图来表示出控制流,数据流,模式的依赖,时间序列,命名空间的关系,但是尽管是这样软件开发还是存在内在的不可见性,这都将成为阻碍软件设计和各个软件工作者交流的“拦路虎”。
紧接着文章介绍了过去软件开发解决事故性困难的方法,首先是高级语言(High-level languages)带来的方便性,高级语言给软件开发者带来的便捷式显而易见的,软件开发者不用再去关心低层的实现而只要在一个抽象的(相对与计算机)但更接近人类思维的层面上去设计软件;其次就是分时(Time-sharing),只要分时的频率足够大,在人类分辨能力之上,那么就能取到很好的效果;最后是统一的编程环境(Unified programming environments),统一的编程环境是的软件开发者都使用统一格式,这样便于软件工作者之间的交流。
那能否找到解决软件生产率“怪物”的银弹呢,作者就此展开了讨论。
(1)Ada和其它高级程序设计语言的发展。Ada只是另外一种高级程序设计语言,它不可能成为解决软件生产率“怪物”的银弹,只能是带来一种新的软件设计的技术。
(2)面向对象编程的方法。作者认为这也不可能成为解决软件成产率“怪物”的银弹,面向对象编程方法只能让软件开发者在定义接口时方便许多,而具体软件开发需要的复杂度并没有的到有效地降低。
(3)人工智能和专家系统。能够解决涉及相关领域的问题,但是在处理实际问题时,软件的规模是决定复杂度的主要因素。
(4)自动编程。这是一个诱人的技术,它从已有的解决问题的方法里找出解决要解决的问题的方法,然后生成代码;但是作者觉得这个扩展性不好,并且不能预见它在泛化方面的突破。
(5)图形编程。在上面作者已经提到了软件的固有属性里就有不可见性这么一条,因此很难用流程图去表达出所有的软件项目,况且到了软件的一定规模的话,这个图肯定会比较大,就现在的计算机屏幕大小来说,能显示出来的图形是有限的,因此图形编程也不可能解决软件生产率怪物。
(6)程序验证。首先程序验证并不能完全消除测试程序这一部分的工作,;其次,要建立一个程序规格(最难的部分软件的任务是到达一个完整和一致的规格),必须要求程序验证的完美性。这似乎不太可能。
(7)环境和工具。只能说方便了软件开发者,但不能实际的减小软件开发的复杂度。
(8)工作站。不能期待一个大的工作站就能简化软件开发的复杂度。
最后作者讲了下寻找银弹的前途。主要有买VS重建(Buy versus build)的讨论,其中成本是主要考虑的因素;要求完善和快速成型(Requirements refinement and rapid prototyping)是软件设计的基础工作,一开始就要设计好;人是软件开发中最重要的决定因素,拥有强大的设计者(Great designers)将使软件开发效率提高好多,作者给出了培养Great designers的明显的步骤。