“没有任何一种单纯的技术或管理上的进步,能够独立地承诺在十年内提高生产率、可靠性和简洁性。”
Silever Bullet(猎杀狼人的特效武器),被喻为一项技术或方法能让软件工程的生产力在十年内提高十倍,或是针对所有情况都管用的奇效工具。Fred Brooks预言这样的“银弹”在十年之内方法学家是找不到的。有意思的是,对比于Gordon Moore认为的集成电路上可容纳的元器件数目每隔18至24个月便会增加一倍,软件和硬件两大工程的关联与差异也就显得十分微妙。
该论述中通过次要复杂度和必要复杂度的概念来解释这一现象。次要复杂度就是指人们本身所产生的问题,是可以被解决的,高级语言的诞生让语言优化组合之类的次要复杂度的移除取得了极大的进展;但必要复杂度则是软件本身要解决的问题衍生而来的,无法被移除,主要表现为软件实体一下性质: 复杂性——两个软件部分不可能相同且扩展过程中元素交互以指数形式剧增,一致性——各种接口标准与兼容性限制沿用,可变性——软件变更容易快速,不可见性——软件结构思路难以可视化。
软件工程的任务分为两类:根本任务——打造构成抽象软件实体的复杂概念结构,次要任务——使用编程语言表达这些抽象实体,在空间和时间限制内将他们映射成机器语言。由于根本任务在任务占比中比重大,想要生产率有数量级式的提高,就触及了软件性质的固有困难,就类似于妄谈“永动机”。
基于大量卓越的设计人的与增量开发以及软件流通等形式,我们能够专注于简化这些困难,迈出的第一步也就是表达出软件复杂的概念结构。
软件项目存在可能成为一个进度落后、预算超支、缺陷繁多、用户缺少的怪物,恐怖犹如所谓的“人狼”,在任何时候都可能发出绝望的呼唤。完美的软件在开发过程中没有万能的理论和方法,偷来的巧是致命的拙,唯有具体问题具体分析,将各种方法综合运用才是解决之道。(然而再完美的软件也仅仅是一项工程,就算能提供再多再好的必要功能,必要复杂度的存在也会让问题无法完全被软件替代)