没有任何技术或管理上的进展,能够独立地许诺十年内使生产率、可靠性或简洁性获得数量级上的进步。

建议:

  1. 仔细地进行市场调研,避免开发已上市的产品。
  2. 在获取和制订软件需求时,将快速原型开发作为迭代计划的一部分。
  3. 有机地更新软件,随着系统的运行、使用和测试,逐渐添加越来越多的功能。
  4. 不断挑选和培养杰出的概念设计人员。

解决管理灾难的第一步是将大块的“巨无霸理论”替换成“微生物理论”

是否一定那么困难呢?——根本困难

  首先,我们必须看到这样的畸形并不是由于软件发展得太慢,而是因为计算机硬件发展得太快。从人类文明开始,没有任何其他产业技术的性价比,能在 30 年之内取得 6 个数量级的提高,也没有任何一个产业可以在性能提高或者降低成本方面取得如此的进步。这些进步来自计算机制造产业的转变,从装配工业转变成流水线工业。

  我认为软件开发中困难的部分是规格化、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证。当然,我们还是会犯一些语法错误,但是和绝大多数系统中的概念错误相比,它们是微不足道的。

让我们来考虑现代软件系统中这些无法规避的内在特性:复杂度、一致性、可变性和不可见性。

复杂度

  规模上,软件实体可能比任何由人类创造的其他实体要复杂,因为没有任何两个软件部分是相同的(至少是在语句的级别)。如果有相同的情况,我们会把它们合并成供调用的子函数。在这个方面,软件系统与计算机、建筑或者汽车大不相同,后者往往存在着大量重复的部分。

一致性。

  软件工程师却无法从类似的信念中获得安慰,他必须控制的很多复杂度是随心所欲、毫无规则可言的,来自若干必须遵循的人为惯例和系统。它们随接口的不同而改变,随时间的推移而变化,而且,这些变化不是必需的,仅仅由于它们是不同的人——而非上帝——设计的结果。

可变性。

  简言之,软件产品扎根于文化的母体中,如各种应用、用户、自然及社会规律、计算机硬件等等。后者持续不断地变化着,这些变化无情地强迫着软件随之变化。

不可见性。

  除去软件结构上的限制和简化方面的进展,软件仍然保持着无法可视化的固有特性,从而剥夺了一些具有强大功能的概念工具的构造思路。这种缺憾不仅限制了个人的设计过程,也严重地阻碍了相互之间的交流。

以往解决次要困难的一些突破

高级语言

它减轻了一些次要的软件复杂度。抽象程序包含了很多概念上的要素:操作、数据类型、流程和相互通讯,而具体的机器语言程序则关心位、寄存器、条件、分支、通道、磁盘等等。高级语言所达到的抽象程度包含了(抽象)程序所需要的要素,避免了更低级的元素,它消除了并不是程序所固有的整个级别的复杂度。

分时。

大多数观察者相信分时提高了程序员的生产率和产品的质量,尽管它带来的进步不如高级语言。

统一编程环境。

第一个集成开发环境——Unix 和 Interlisp 现在已经得到了广泛应用,并且使生产率提高了 5 倍。为什么?

它们主要通过提供集成库、统一文件格式、管道和过滤器,解决了共同使用程序的次要困难。这样,概念性结构理论上的相互调用、提供输入和互相使用,在现实中可以非常容
易地实现。

银弹的希望

Ada 和其他高级编程语言

面向对象编程

人工智能

专家系统。

“自动”编程

图形化编程。

程序验证。

环境和工具

工作站

针对概念上根本问题的颇具前途的方法

任务时间 = ∑(频率)i×(时间)i

购买和自行开发

需求精炼和快速原型

增量开发——增长,而非搭建系统.

我现在还记得在 1958 年,当听到一个朋友提及搭建(building),而不是编写(writing)系统时,我所感受到的震动。一瞬间,我的整个软件开发流程的视野开阔了。这种暗喻是非常有力和精确的。现在,我们已经理解软件开发是
如何类似于其他的建造过程,并开始随意地使用其他的暗喻,如规格说明、构件装备、脚手架(测试平台)(specifications, assembly of components, and scaffolding)

卓越的设计人员

  1. 尽可能早地、有系统地识别顶级的设计人员。最好的通常不是那些最有经验的人员。
  2. 为设计人员指派一位职业导师,负责他们技术方面的成长,仔细地为他们规划职业生涯。
  3. 为每个方面制订和维护一份职业计划,包括与设计大师的、经过仔细挑选的学习过程、正式的高级教育和以及短期的课程——所有这些都穿插在设计和技术领导能力的培养安排中。
  4. 为成长中的设计人员提供相互交流和学习的机会