关于软件的概念,我们给出一个形式化的定义,即软件是 (1) 能够完成预定功能和性能的可执行指令; (2) 使得程序能够适当地操作信息的数据结构; (3) 描述程序的操作和使用的文档。 然而,真正理解软件的含义需要了解软件的特点,从而明白软件与人类建造的其他事物的区别。与硬件相比,软件具有以下不同的特点: (1) 软件是逻辑的,而不是物理的产品。逻辑往往实际只存在于人的头脑当中,软件人员好比"皇帝的新衣"故事中的裁缝,软件的开发过程极难加以控制。 (2) 软件是由开发或工程化而形成的,没有明显的制造过程。软件成本集中于"开"上,意味着软件项目不能象硬件制造项目那样来管理。 (3) 如图1.2和1.3所示,软件在运行和使用期间,不存在硬件那样的磨损和老化问题,但它存在退化问题,开发人员必须维护软件。
图1.2 硬件的故障率曲线
图1.3 软件的故障率曲线
图1.2表明了硬件故障率的变化曲线,即硬件在生命初期具有较高的故障率,这些故障主要是由于设计或制造的缺陷造成的。当这些缺陷修正后,故障率在一段时期内会降低到一个稳定的曲线上。随着时间的推移,硬件构件由于种种原因受到不同程度的损害,故障率又升高了。也就是说,硬件已经开始磨损了。 图1.3表明了软件的故障率曲线,在软件的生命初期隐藏的错误会使程序具有较高的故障率,理想的情况下当这些错误改正后曲线便趋于平稳,但实际情况是随着这些修改有可能引入新的错误,从而是故障率曲线呈现图中所示的锯齿状。于是,软件的退化由于修改而发生了。 (4) 大多数软件是自定的,而不是通过已有构件组装而成的。迄今为止,软件的开发尚未完全摆脱手工的方式。 (5) 软件成本相当昂贵。 IBM360操作系统的研制人员最多时可达1000多人,从1963年到1966年共花了四年时间才完成,总计耗费了5000多人年,以后又进行不断的修改和补充。该系统的整个研制费用为5亿美元,其中近一半花在软件上。 (6) 软件本身是复杂的。 软件比任何其他人类制造的结构更复杂,甚至硬件的复杂性和软件相比也是微不足道的。软件本质上的复杂性是软件产品难以理解,影响软件过程的管理,并使维护过程十分复杂。