进步来自计算机制造产业的转变,从装配工业转变成流水线工业。
其次,让我们通过观察预期的软件技术产业发展速度,来了解中间的困难。效仿亚里 士多德,我将它们分成根本的——软件特性中固有的困难,次要的——出现在目前生产上的, 但并非那些与生俱来的困难。
我们在下一章中讨论次要问题。首先,来关注内在、必要的问题。
一个相互牵制关联的概念结构,是软件实体必不可少的部分,它包括:数据集合、数 据条目之间的关系、算法、功能调用等等。这些要素本身是抽象的,体现在相同的概念构架 中,可以存在不同的表现形式。尽管如此,它仍然是内容丰富和高度精确的。
我认为软件开发中困难的部分是规格化、设计和测试这些概念上的结构,而不是对概 念进行表达和对实现逼真程度进行验证。当然,我们还是会犯一些语法错误,但是和绝大多 数系统中的概念错误相比,它们是微不足道的。
如果这是事实,那么软件开发总是非常困难的。天生就没有银弹。
让我们来考虑现代软件系统中这些无法规避的内在特性:复杂度、一致性、可变性和 不可见性。
复杂度。规模上,软件实体可能比任何由人类创造的其他实体要复杂,因为没有任何 两个软件部分是相同的(至少是在语句的级别)。如果有相同的情况,我们会把它们合并成 供调用的子函数。在这个方面,软件系统与计算机、建筑或者汽车大不相同,后者往往存在 着大量重复的部分。
数字计算机本身就比人类建造的大多数东西复杂。计算机拥有大量的状态,这使得构 思、描述和测试都非常困难。软件系统的状态又比计算机系统状态多若干个数量级。
同样,软件实体的扩展也不仅仅是相同元素重复添加,而必须是不同元素实体的添加。 大多数情况下,这些元素以非线性递增的方式交互,因此整个软件的复杂度以更大的非线性 级数增长。
软件的复杂度是必要属性,不是次要因素。因此,抽掉复杂度的软件实体描述常常也 去掉了一些本质属性。数学和物理学在过去三个世纪取得了巨大的进步,数学家和物理学家 们建立模型以简化复杂的现象,从模型中抽取出各种特性,并通过试验来验证这些特性。这