1.1 软件、软件危机和软件工程
1.1.1 软件、软件危机和软件工程的基本概念
计算机系统分为硬件系统和软件系统两大部分。在过去的50多年里,随着微电子技术的发展和进步,计算机硬件技术以令人惊讶的速度发展,现在已经达到相当成熟的状态。
计算机软件是在计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档的完整集合。程序是指按特定的功能和性能要求而设计的能够执行的指令序列;数据是指程序能正常操纵、处理的信息及其数据结构;文档是指与程序设计开发、维护和使用有关的图文材料。
进入20世纪60年代,随着计算机技术的进步,软件功能日益复杂,人们对软件的需求急剧增加。软件开发从早期以个人活动为主的手工作坊方式,逐步转到以程序员小组为代表的集体开发方式。在这一转换过程中,国外的软件开发人员在开发一些大型软件系统时遇到了许多困难,有些系统最终彻底失败了;有些系统虽然完成了,但比原计划推迟了好几年,而且费用大大超过了预算;有些系统未能完全地满足用户的期望;有些系统则无法被修改和维护。例如,美国IBM公司的OS/360系统和美国空军某后勤系统都耗费了几千人·年的工作量,历尽艰辛,但结果却令人失望。落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象,这就是软件危机。软件危机主要表现在以下几个方面。
(1)软件生产不能满足日益增长的软件需求,软件生产率远低于硬件生产率和计算机应用的增长率,社会出现了软件供不应求的局面。更为严重的是,软件生产效率随软件生产规模的增加和软件复杂性的提高而急剧下降。
(2)软件生产率随软件规模与复杂性提高而下降,智力密集型行业的人力成本不断增加,这些都导致软件成本在计算机系统成本构成中的比例急剧上升。
(3)软件开发的进度与成本失控。人们很难估计软件开发的成本与进度,通常情况是预算成倍突破,项目计划一再延期。软件开发单位为了赶进度、节约成本,往往只有降低软件质量。软件开发陷入成本居高不下、质量无保证、用户不满意、开发单位信誉降低的怪圈中。
(4)软件系统实现的功能与实际需求不符。软件开发人员对用户需求缺乏深入的理解,往往急于编写程序,闭门造车,最后完成的软件与用户需求相距太远。
(5)软件难以维护。程序中的错误很难改正,要想使软件适应新的运行环境几乎不可能,软件在使用过程中不能增加用户需要的新功能,大量的软件开发人员在重复开发基本类似的软件。
(6)软件文档配置没有受到足够的重视。软件文档包括开发过程各阶段的说明书、数据词典、程序清单、软件使用手册、维护手册、软件测试报告和测试用例等。这些软件文档的不规范、不健全是造成软件开发的进度、成本不可控制和软件的维护、管理困难的重要原因。
软件危机实际上是软件开发与维护中存在的具有共性的种种问题的汇总。近40年来,为解决这些问题,计算机科学家和软件产业从业者已经做出了巨大的努力。
软件危机产生的原因可以从两个方面加以认识,一是软件产品的固有特性;二是软件专业人员自身的缺陷。
软件的不可预见性是软件产品的固有特点之一。与硬件产品不同,软件是计算机系统中的逻辑部件。在程序代码运行之前,开发工作的质量、进度难以度量。软件产品最终的使用价值是在软件运行过程中体现出来的。软件产品的故障隐蔽性强,可靠性难以度量,对原有故障的修改可能导致新的错误。
软件产品的固有特点之二是软件的规模较大并且逻辑较复杂。现代的软件产品往往规模庞大,功能多种多样、逻辑结构十分复杂。从软件开发管理的角度看,软件生产率常随软件规模和复杂性的增加而下降。就目前的软件技术水平而言,软件开发的工作量随软件规模的增大而呈几何级数上升。
来自于软件开发人员的弱点主要是,软件产品是人的思维结果,因此软件生产水平最终在相当程度上取决于软件人员的教育、训练和经验的积累;对于大型软件往往需要许多人合作开发,甚至要求软件开发人员深入应用领域的问题研究,这样就需要在用户与软件人员之间以及软件开发人员之间相互通信,在此过程中难免发生理解的差异,从而导致后续错误的设计或实现,而要消除这些误解和错误往往需要付出巨大的代价;另外,由于计算机技术和应用发展迅速,知识更新周期加快,软件开发人员经常处在变化之中,不仅需要适应硬件更新的变化,而且还要涉及日益扩大的应用领域问题研究,软件开发人员所进行的每一项软件开发几乎都必须调整自身的知识结构以适应新的问题求解的需要。
为了解决软件危机,既要有技术措施,又要有必要的组织管理措施。软件工程正是从技术和管理两个方面研究如何更好地开发和维护计算机软件的一门学科。
软件工程是应用计算机科学、数学及管理科学等原理开发软件的工程。通俗来说,软件工程是一套实现一个大型程序的原则方法,是将其他工程领域中行之有效的工程学知识运用到软件开发工作中来,即按工程化的原则和方法组织软件开发工作。