没有银弹-软件工程中的根本和次要问题(No Silver Bullet – Essence and Accident in Software Engineering)
所有软件由两部分任务组成
- 根本任务: 打造由抽象软件实体构成的复杂概念
- 次要任务: 使用编程语言表达这些抽象实体,在时间和空间限制内将它映射成机器语言
开发者将大部分时间放到了次要任务上,也就是表达抽象实体的过程中,但是它并不能给生产率带来数量级的提高。相比于踏踏实实搭建实体,倒不如关注的最终要达成的复杂概念的结构。
- 仔细进行市场调研,避免开发已上市的产品
- 在获取和订制软件需求时,将快速原型开发作为迭代计划的一部分
- 有机地更新产品(运行、使用和测试),按照用户的需要,按照顺序开发产品,逐渐增加功能
- 挑选和培养杰出的概念设计人员
根本困难
软件开发的发展速度,没有像计算机硬件发展的那么快。
概念结构,定义: 互相牵制关联的概念结构,它包括数据集合、数据条目之间的关系、算法、功能调用等等。
软件开发中最困难的部分是规格化、设计和测试概念上的结构,而不是表达和搭建这些结构。现代软件系统中具有无法规避的内在特性: 复杂度、一致性、可变性和不可见性。
- 首先,软件系统与计算机都是独一无二,这和建筑或者汽车大不相同,它们往往存在大量重复的部分。
- 其次,数字计算机本身就拥有大量状态,已经比人类建造的大多数东西复杂,软件系统的状态又比计算机系统多若个数量级。这与当代科学发展相反,科学发展是通过物理学和数学为表现形式,忽略掉自然系统中的复杂性,获得自然系统的简化模型,而计算机软件系统却不可以这样。
因为复杂度对于计算机软件系统来说是必须必要存在的。复杂度带来了沟通成本,经济成本,不可靠性,效率低速度慢,不可控的副作用,不保证的安全性。软件的内在是纯粹思维活动的产品,可以无限扩展;而软件的外在会扎根在不同的文化母体中,需要与不同的设备对接对齐,它们拥有比设备更长久的生命力。
- 最后,软件的概念不可见,即你不能用地图之于陆地海洋、膜片图之于硅片、电路图之于计算机那样对软件做描述。即使你能描述,你也描述不完,你会发现它不是一张图,而是一堆重叠且相互关联的图形(制流程、数据流、依赖关系、时间序列、名字空间的相互关系等等)。
遗忘解决次要困难的突破
- 高级语言编程
- 分时: 过去批处理编程的周转时长
- 统一编程环境: unix 和 Interlisp