1.2 软件危机
本节讲述软件危机的表现与原因,以及软件危机的启示。
1.2.1 软件危机的表现与原因
软件危机是指人们在开发软件和维护软件过程中所遇到的一系列的问题。在20世纪60年代中期,随着软件规模的扩大、复杂性的增加、功能的增强,高质量的软件开发变得越来越困难。在软件开发的过程中,会经常出现一些不能按时完成任务、产品质量得不到保证、工作效率低下和开发经费严重超支等现象。这些情况逐渐使人们意识到软件危机的存在及其影响。计算机软件的开发、维护和应用过程中普遍出现的一些严重的问题,主要表现如下。
●开发出来的软件产品不能满足用户的需求,即产品的功能或特性与需求不符。这主要是由于开发人员与用户之间不能充分有效地进行交流造成的,使得开发人员对用户需求的理解存在着差异。
●相比越来越廉价的硬件,软件成本过高。
●软件质量难以得到保证,且难以发挥硬件潜能。开发团队缺少完善的软件质量评审体系以及科学的软件测试规程,使得最终的软件产品存在着诸多缺陷。
●难以准确估计软件开发、维护的费用以及开发周期。软件产品往往不能在预算范围之内按照计划完成开发。很多情况下,软件产品的开发周期或经费会大大超出预算。
●难以控制开发风险,开发速度赶不上市场变化。
●软件产品修改与维护困难,集成遗留系统更困难。
●软件文档不完备,并且存在文档内容与软件产品不符的情况。软件文档是计算机软件的重要组成部分,它为软件开发人员之间以及开发人员与用户之间的信息共享提供了重要的平台。软件文档不完整和不一致的问题会给软件的开发和维护等工作带来很多麻烦。
这些问题严重影响了软件产业的发展,制约着计算机的应用。为了形象地描述软件危机,OS/360操作系统的开发经常被作为一个典型的案例。20世纪60年代初期,IBM公司组织了OS/360操作系统的开发,这是一个超大型的软件项目,参与的程序员有1000人左右。在经历了数十年的开发之后,极度复杂的软件项目甚至产生了一套不包括在原始设计方案之中的工作系统。Fred Brooks是这个项目的管理者,他在自己的著作《人月神话》中曾经承认,自己犯了一个价值数百万美元的错误。
软件危机的出现和日益严重的趋势充分暴露了软件产业在早期的发展过程中存在的各种各样的问题。可以说,人们对软件产品认识的不足以及对软件开发内在规律的理解偏差是软件危机出现的本质原因。具体来说,软件危机出现的原因可以概括为以下几点。
●忽视软件开发前期的需求分析。
●开发过程缺乏统一的、规范化的方法论的指导。软件开发是一项复杂的工程,人们需要用科学的、工程化的思想来组织和指导软件开发的各个阶段。而这种工程学的视角正是很多软件开发人员所没有的,他们往往简单地认为软件开发就是程序设计。
●文档资料不齐全或不准确。软件文档的重要性没有得到软件开发人员和用户的足够重视。软件文档是软件开发团队成员之间交流和沟通的重要平台,还是软件开发项目管理的重要工具。如果人们不能充分重视软件文档的价值,势必会给软件开发带来很多不便。
●忽视与用户之间、开发组成员之间的交流。
●忽视测试的重要性。
●不重视维护或由于上述原因造成维护工作的困难。由于软件的抽象性和复杂性,软件在运行之前,对开发过程的进展情况很难估计。再加上软件错误的隐蔽性和改正的复杂性,这些都使得软件的开发和维护在客观上比较困难。
●从事软件开发的专业人员对这个产业认识不充分,缺乏经验。软件产业相对于其他工业产业而言,是一个比较年轻、发展不成熟的产业,人们在对它的认识上缺乏深刻性。
●没有完善的质量保证体系。完善的质量保证体系的建立需要有严格的评审制度,同时还需要有科学的软件测试技术及质量维护技术。软件的质量得不到保证,使得开发出来的软件产品往往不能满足人们的需求,同时人们还可能需要花费大量的时间、资金和精力去修复软件的缺陷,从而导致了软件质量的下降和开发预算超支等后果。
1.2.2 软件危机的启示
软件危机给人们的最大启示,是使人们更加深刻地认识到软件的特性以及软件产品开发的内在规律。
●软件产品是复杂的人造系统,具有复杂性、不可见性和易变性,难以处理。
●个人或小组在开发小型软件时使用到的非常有效的编程技术和过程,在开发大型、复杂系统时难以发挥同样的作用。
●从本质上讲,软件开发的创造性成分很大,发挥的余地也很大,很接近于艺术。它介于艺术与工程之间的某一点,并逐步向工程一段漂移,但很难发展成完全的工程。
●计算机和软件技术的快速发展,提高了用户对软件的期望,促进了软件产品的演化,为软件产品提出了新的、更多的需求,难以在可接受的开发进度内保证软件的质量。
●几乎所有的软件项目都是新的,而且是不断变化的。项目需求在开发过程中会发生变化,而且很多原来预想不到的问题也会出现,对设计和实现手段进行适当的调整是不可避免的。
●“人月神化”现象——生产力与人数并不成正比。
为了解决软件危机,人们开始尝试用工程化的思想去指导软件开发,于是软件工程应运而生。