本文系软件工程中著名的一篇论文:No Silver Bullet: Essence and Accidents of Software 1
@Author:Frederick P. Brooks, Jr.,百度百科,Wikipedia
@Publish Date:April 1987
@Journal:IEEE Computer
没有银弹:软件开发中的本质性工作和附属工作
1. 银弹(Silver Bullet)
在西方传说中,有狼人的存在,而杀死狼人的只能是银弹。
作者想要表明的是,软件工程因为没有计划、预算爆炸以及产品缺陷成为了类似狼人的存在,我们想要一种类似银弹的东西,这可以使得软件成本像计算机硬件成本一样快速下降。
但是实际上从此(1987年)向后展望十年,是没有银弹的,即没有一种单独的技术或管理的进步可以保证
在生产率、可靠性、简单性上有一个数量级的改善。作者想要的是十年增长10倍生产效率,但是这无法实现。作者承认这些年会有进步,但是不大(没有达到数量级)就是了。
2. 本质性难题(Essence)
软件工程本质使得其成本不能像计算机一样快速下降,我们不能期望两年两倍收益(计算机硬件满足摩尔定律:计算机硬件每两年CPU芯片上集成度翻一番,性能翻一倍。2)。
当然了,不是软件进展太慢,而是计算机硬件发展太快了。人类文明史上没有一种技术能够在30年内在性能和价格上获得6个数量级的提升。没有其它一种技术可以同时提高性能和降低价格,这是因为电脑制造从组装做业走向了流水线作业。
然而,因为其本质性难题,软件工程不可能做到计算机那样。所谓的其本质难题主要是:
- 复杂性:软件工程是解决问题的步骤的抽象,在软件中增加元素不是简单的线性增加,而且软件中状态众多,元素之间交互也不是线性的。
- 配合性:软件接口,因人而异。尤其是其它非本软件所作接口,导致重构软件难以一致。
- 可变性:软件常常需要根据人群、法规、硬件环境、应用领域等改变。
- 隐匿性:尚未完成的软件是不可见的,也无法具象化,没法用图表准确表述。
3. 过去突破解决了附属性难题(Accident)
过去的几年里,通过努力基本解决了非本质性难题。
- 高级编程语言:消除了程序所有非内生性复杂性,但是也带来了工具(非语言本身)负担。
- 分时性:主要是缩短系统响应时间。但是比100ms还小时人们通常注意不到了。
- 开发环境统一:完整的函数库、统一的文件格式、管道和过滤器,促成软件共用。
4. 对于银弹的期待
- Ada和其它高级编程语言:Ada的理念比其自身更加先进:模块化(Modularity)、抽象数据类型(Abstract Data Type)、层次式结构(Hierarchy Structure)
- 面向对象语言:如上,解决了附属性难题,而非本质性难题。
- 人工智能:像人一样解决问题;或者通过启发式(Heuristic)算法或基于规则编程。
- 专家系统:人工智能当时的发展成果【可惜了,我上学太晚了,如果是2000年上大学,那么信息管理与信息系统还挺不错的】。
- 自动化程序设计相比于解决问题本身,解决问题的方法更应该具有规范。
- 图形化编程:用图形化的方式进行软件设计(所见即所得呗)。但是流程图并不能很好的表达软件结构,而且电脑屏幕有限,不能展现所有的软件逻辑。
- 程序验证:测试程序,调试bug。系统设计阶段消除bug好像不太可能(因为这是程序员写出来的额)。
- 工具和环境:IDE保证的是程序没有语法或者语义错误,但是对于程序本身逻辑的正确性,即是否能够解决问题并不知道。
- 工作站:加快计算机的速度,也只是提高了编程效率。
5. 从概念设计上看起来具有前途的方法3
- 买还是构建:作者希望的是买,因为专业,也能降低开发成本。额,“造不如买,买不如租”,国内经过上次中美贸易战和中兴事件,估计。。。
- 精炼需求和快速原型:这是对于真的要开发而不是买的人来说,作者推崇快速原型方法,现有一个能跑的软件,然后再逐步求精,添加功能。这是一种增量开发。
- 伟大的设计者:好的设计者和好的管理者一样,都很稀少。好的设计可以传授下去,可以通过学习得到, 但是伟大的设计则是因为伟大的设计师。