软件工程
上QQ阅读APP看书,第一时间看更新

1.2 软件工程的产生与发展

1.2.1 软件危机

20世纪60年代末至70年代初,“软件危机”一词在计算机界广为流传。事实上,软件危机几乎从计算机诞生的那一天起就出现了,只不过到了1968年,北大西洋公约组织的计算机科学家在联邦德国召开的国际学术会议上第一次提出了“软件危机”(software crisis)这个名词。

软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这类问题绝不仅仅是“不能正常运行的软件”才具有的,实际上几乎所有软件都不同程度地存在这类问题。

美国Standish集团是一家专门跟踪软件项目的研究机构。该机构对1994—2010年期间开发的软件项目进行了调查统计,结果如图1-1所示。

图1-1 美国Standish集团调查报告

研究表明,软件项目的平均成功率大概在30%。大概50%的项目超出预算和最后期限,或者存在特定缺陷。另外,还有20%左右的项目彻底失败。最终完成的项目也总是存在着错误多、性能低、不可靠、不安全等质量问题。

软件的错误可能导致巨大的财产损失。1996年6月4日,欧洲航天局Ariane 5火箭在发射37秒之后,偏离了飞行路径,突然发生爆炸,火箭上载有价值数亿美元的通信卫星。事后的调查显示,导致事故的原因是程序中试图将64位浮点数转化成16位整数的时候,产生了溢出,而系统又缺乏对数据溢出的错误处理程序。

Windows Vista系统,是曾经被微软公司寄予厚望的一个桌面操作系统,也是微软公司历史上最艰难曲折、开发时间最长的一个项目。这个系统从2001年开始研发,整个过程历时5年,耗资数十亿美元,代码规模超过5000万行。由于系统过于庞杂,给整个开发带来了很大的困难,很多的时间用在了互相沟通和重新决策上。本应该在2003年面世的Vista系统,一再地推迟,最后在取消了一些高级功能之后,于2006年11月正式发布。即使这样,Vista系统在面世之后,仍然暴露出运行效率低、兼容性差、死机频繁等严重缺陷。

显然,软件开发一直面临着诸多的挑战,主要表现在以下4个方面。

(1)客户不满意。软件产品的交付质量难以保证,许多功能不是用户所需要的,用户在使用的过程中遭遇很多Bug。

(2)项目过程失控。由于客户需求的不确定性和持续的变化,给整个开发过程带来了不可控性。

(3)风险与成本问题。开发团队专注于技术,忽视对风险的管理,从而造成整个开发成本的超支。

(4)无力管理团队。无法评估开发人员的能力以及工作进度。如何提升团队的能力和效率,一直是软件开发中存在的难题。

之所以出现软件危机,其主要原因一方面是与软件本身的特点有关,另一方面是与软件开发和维护的方法不正确有关。

软件的特点前面已经有一个简单介绍。软件开发和维护的不正确方法主要表现为:忽视软件开发前期的需求分析;开发过程没有统一、规范的方法论的指导,文档资料不齐全,忽视人与人的交流;忽视测试阶段的工作,提交给用户的软件质量差;轻视软件的维护。这些大多数是软件开发过程管理上的原因。

1968年秋季,NATO(North Atlantic Treaty Organization,北大西洋公约组织)科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。在那次会议上第一次提出了“软件工程”(software engineering)这个概念。当时的会议报告中提到,“我们特意选择‘软件工程’这个颇具争议性的词,是为了暗示这样一种意见:软件的生产,有必要建立在某些理论基础和实践指导之上。在工程学的某些成效卓著的分支中,这些理论基础和实践指导早已成为了一种传统。”

1.2.2 软件工程的发展

统计数据表明,大多数软件开发项目的失败,并不是由于软件开发技术方面的原因。它们的失败是由于不适当的管理造成的。遗憾的是,尽管人们对软件项目管理重要性的认识有所提高,但在软件管理方面的进步远比在设计方法学和实现方法学上的进步小,至今还提不出管理软件开发的通用指导原则。

在软件的长期发展中,人们针对软件危机的表现和原因,经过不断的实践和总结,越来越认识到:按照工程化的原则和方法组织软件开发工作,是摆脱软件危机的一条主要出路。软件工程的发展大概经历了4个阶段。

(1)1968年以前,属于软件工程的史前阶段。在这个时期,没有什么工程化的开发方法可循,更多的是个人作坊式的开发。当时的软件几乎都是为每个具体应用而专门编写的,编写者和使用者往往是同一个或同一组人。这些个体化的软件设计环境,使软件设计成为在人们头脑中进行的一个隐含过程,最后除了程序清单外,没有其他文档资料保存下来。于是20世纪60年代末,爆发了软件危机。

(2)从1968年开始,一直到20世纪80年代末,软件工程进入了一个新的时期。1968年首次提出了“软件工程”的概念。瀑布模型成为软件开发的经典模型,整个软件开发过程被划分成需求、设计、编码、测试等不同阶段,并且这些阶段都是严格按照线性的方式执行的。

(3)从1983年到1995年,人们逐步意识到过程质量对产品质量的重大影响。这个时期面向对象的方法和软件过程改进运动逐渐盛行,提出了CMM/ISO9000/SPICE等质量标准体系。

(4)从20世纪90年代至今,互联网技术和应用迅速发展。为了应对需求变化和快速交付的需要,人们开始尝试一种新型的敏捷开发方法。这种方法采用迭代和增量的开发过程,强调更紧密的团队协作。目前,敏捷开发方法已经广泛地应用于软件企业之中,给软件行业带来了巨大的变化。

今天,尽管“软件危机”并未被彻底解决,但软件工程已经成为现代软件产业一个关键的技术,并且正在向成熟发展,在未来对网络时代的软件开发将有更大的推动力。