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