1.1 软件危机

迄今为止,计算机系统已经经历了四个不同的发展阶段,但是在此过程中,人们仍然没有彻底摆脱“软件危机”的困扰,软件已经成为限制计算机系统发展的瓶颈。

1.1.1 软件的定义及特点

随着计算机技术的发展,人们逐渐认识到:高质量的软件会使计算机系统的功能和效率大大地提高。高质量、多功能的软件使得计算机的应用从单一的科学计算扩展到数据处理、实时控制等多个领域。随着计算机应用的逐渐普及,软件变得越来越复杂,规模也越来越大,人们开始意识到软件并不仅仅是程序。目前对软件比较公认的解释为:软件在计算机系统中是与硬件相互依存的,它包括程序、相关数据及其说明文档。其中程序是按照事先设计的功能和性能要求而执行的指令序列;数据是程序运行过程中被处理的对象;文档是与程序开发、维护和使用有关的各种图文资料。

软件有如下特点:

(1)软件是一种逻辑实体,具有抽象性。人们无法看到软件本身的形态,只能通过观察、分析、思考、判断等方式才能了解它的功能和性能。

(2)软件在使用过程中没有磨损的问题。软件在使用过程中不会因为磨损而老化,但为了适应硬件和系统环境以及需求的变化,可能要不断地对软件的设计和编码进行改动,这些改动会不可避免地引入错误,导致软件失效率升高。

(3)软件一旦研制成功,就可以重复制造,其生产过程就变成复制过程。

(4)软件的开发和运行必须依赖于特定的计算机系统环境。为了适应计算机硬件和系统环境的不断升级,软件也需要不断地进行维护和更新。为了减少这种依赖性,在软件的开发过程中提出了软件的可移植性。

(5)软件开发至今尚未摆脱手工方式。虽然市场上出现了一些辅助开发工具,但是最终的核心代码仍然要程序员手工编写和组织。随着科学技术的进步,人们对计算机的依赖程度越来越高,对软件的需求数量和规模也越来越大,所以软件开发人员的工作压力也越来越大。

1.1.2 软件危机的产生原因

软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。软件危机爆发于20世纪60年代中期,软件规模的扩大、复杂性的增加、功能的增强等使得高质量的软件开发变得越来越困难。在软件的开发过程中,经常会出现不能按时完成任务、产品质量得不到保证、工作效率低下和开发经费严重超支等情况。

软件危机的出现及其日益严重的趋势,促使人们去探究其产生的根本原因。最终,人们发现软件危机的产生有两方面的因素:一方面与软件本身的抽象性和复杂性有关,这是客观原因;另一方面则与软件开发和维护过程中使用的技术和方法有关,这是主观原因。根本原因是软件开发过程不成熟,主要表现为:

(1)忽视软件开发前期的调研和分析工作。只有用户最了解他们自己的需要,但许多用户开始并不能正确、具体地描述他们的要求,这要求软件开发人员需要做大量而且深入细致的调查工作,反复地与用户进行交流,才能全面、真实、具体地了解用户的需求。实践证明,在没有准确、完整地了解用户需求和定义问题的前提下就急于编程,是导致软件开发工程失败的主要原因之一。

(2)开发过程缺乏统一的规范。规模日益增大的软件往往需要很多人合作开发,这就需要用户和软件开发人员之间,软件开发人员之间进行及时、有效的沟通,以消除开发过程中对问题理解的差异,防止后续错误的发生。然而多年的“手工作坊”式的工作环境,使得软件开发人员更习惯于独自工作。开发过程中所采用的技术没有一个统一的规范和标准,势必会妨碍整个项目开发的团队合作,这也是导致软件危机的一个重要原因。

(3)软件开发管理困难而复杂。大型软件项目需要规模较大的团队来共同完成,但多数管理人员缺乏大型软件系统的管理经验,多数软件开发人员又缺乏管理方面的经验。两者不能进行及时、准确的信息交流,甚至还会产生误解。软件开发人员不能独立、有效地处理软件开发过程中的各种工作流程和工作关系,因此容易产生疏漏和错误。另外,开发过程中忽视撰写和保存相关文档的工作,使文档缺乏一致性和完整性,从而导致开发者失去工作的基础、管理者失去管理的依据。

(4)没有完善的质量保证体系。建立完善的质量保证体系需要有严格的评审制度,同时还需要有科学的软件测试技术及质量维护技术。软件的质量得不到保证,开发出来的软件产品往往不能满足需求,甚至可能需要花费大量的时间、资金和精力去修复软件的缺陷,从而导致软件质量下降和开发预算超支等后果。

1.1.3 解决软件危机的方法

为了摆脱软件危机造成的困境,北大西洋公约组织(NATO)的科学委员会于1968年在联邦德国召开的有关研讨会上,第一次提出了“软件工程”(Software Engineering)的概念。从此,软件工程作为一门新兴的工程学科诞生了。

软件工程的主要思想是运用工程学的基本原理和方法来组织和管理软件生产。解决软件危机,既要有技术措施(包括方法和工具),又要有必要的组织管理措施。先进的方法和工具可以提高软件开发和维护的效率,更为软件质量提供保证;有效地组织管理措施可以评价、控制、管理整个开发流程,从而保证软件开发能够顺利有效地完成。软件工程正是从技术和管理两个方面,研究如何更好地发展计算机软件技术。