软件工程案例教程(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

知识链接 软件工程基础

1 软件危机

1968年NATO会议(Garmisch, Germany)提出的“软件危机”,在今天仍然存在。软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这些问题绝不仅仅是“不能正常运行的”软件才具有的,实际上几乎所有软件都不同程度地存在这些问题。

1.1 软件危机的表现

软件危机主要有下述一些表现:

(1)软件开发成本和进度的估计不准确。实际成本比估计成本有可能高出一个数量级,实际进度比预期进度拖延几个月甚至几年的现象并不罕见。

(2)用户对“已完成的”软件系统不满意,这些不满意可能是功能或者性能上不能满足用户需求,也可能是操作上不太方便,还有可能界面不美观等。

(3)软件产品的质量往往靠不住。

(4)软件常常是不可维护的。很多程序中的错误是非常难改正的,因为实际上不可能使这些程序适应新的硬件环境,也不能根据用户的需要在原有程序中增加一些新的功能。

(5)软件通常没有适当的文档资料。软件不仅仅是程序,还应该有一整套文档资料。这些文档资料应该是在软件开发过程中产生出来的,而且是与该软件系统相匹配的。

(6)软件开发生产率提高的速度远远跟不上计算机应用迅速地普及深入的趋势。软件产品“供不应求”的现象使人类不能充分利用现代计算机硬件提供的巨大潜力。

1.2 软件危机产生的原因

在软件开发和维护的过程中存在很多严重问题,一方面与软件本身的特点有关,另一方面也和软件开发与维护的方法不正确有关。

(1)软件不同于硬件,软件缺乏可见性,在写出程序代码并在计算机上试运行之前,软件开发过程的进展情况较难衡量,软件开发的质量也较难评价。

(2)软件的一个显著特点是规模庞大,而且程序复杂性将随着程序规模的增加而成指数上升。图形用户界面(GUI)、客户/服务器结构、分布式应用、数据通信、超大型关系式数据库,以及庞大的系统规模使得软件及系统的复杂性呈指数增长。

(3)用户需求不明确。对用户要求没有完整准确的认识就匆忙着手编写程序,是许多软件开发工程失败的主要原因之一。编写程序只是软件开发过程中的一个阶段,而且在典型的软件开发工程中,编写程序所需的工作量只占软件开发全部工作量的10%~20%。

(4)目前相当多的软件专业人员对软件开发和维护还有不少糊涂观念,使其在实践过程中或多或少地采用了错误的方法和技术,这可能是使软件问题发展成软件危机的主要原因。

(5)缺乏文档等配置信息。一个软件产品必须由一个完整的配置组成,里面主要包括程序、文档和数据等部分。软件专业人员应该清除只重视程序而忽视软件配置其余成分的糊涂观念。

(6)轻视维护。许多软件产品的使用寿命可以长达10年甚至20年,在这样漫长的时期中不仅必须改正使用过程中发现的每一个潜伏的错误,而且当环境变化时(例如硬件或系统软件更新换代)还必须相应地修改软件以适应新的环境,特别是必须经常改进或扩充原来的软件以满足用户不断变化的需要。统计数据表明,实际上用于软件维护的费用占软件总费用的55%~70%。软件工程学的一个重要目标就是,提高软件的可维护性,减少软件维护的代价。

1.3 软件危机经典事例

事例一:千年虫

“千年虫”问题的根源始于20世纪60年代。当时计算机存储器的成本很高,如果用四位数字表示年份,就要多占用存储器空间,这就会使成本增加。因此,为了节省存储空间,计算机系统的编程人员采用两位数字表示年份。随着计算机技术的迅猛发展,虽然后来存储器的价格降低了,但在计算机系统中使用两位数字来表示年份的做法却由于思维上的惯性势力而被沿袭下来。年复一年,直到新世纪即将来临之际,大家才突然意识到用两位数字表示年份将无法正确辨识公元2000年及其以后的年份,当系统进行(或涉及到)跨世纪的日期处理运算时(如多个日期之间的计算或比较等),就会出现错误的结果,进而引发各种各样的系统功能紊乱甚至崩溃。1997年,信息界开始拉起了“千年虫”警钟,并很快引起了全球关注。

事例二:爱国者导弹防御系统

1990年2月25日,海湾战争期间,美军在沙特阿拉伯的城市宰赫兰部署的爱国者导弹防御系统因浮点数舍入错误而失效,该系统的计算机精度仅有24位,存在0.0001%的计时误差,所以有效时间阈值是20个小时。当系统运行100个小时以后,已经积累了0.3422秒的误差。这个错误导致导弹系统不断地自我循环,而不能正确地瞄准目标。结果未能拦截一枚伊拉克飞毛腿导弹,致使飞毛腿导弹在美国军营中爆炸,造成28名美国陆军士兵死亡。

事例三:奥运会门票订票系统

2011年,伦敦4月26日消息,2012年伦敦奥运会660万张门票的网上预订在最后时刻重蹈了北京奥运会覆辙,网站订票系统抵挡不住巨大的访问量需求而崩溃,最后不得不临时紧急延长了一个小时来解决这一尴尬问题。

按计划,这批为期六周、面向公众销售的660万张奥运门票原定于当地时间26日晚22:59截止。然而随着截止日期的临近,网上订单日益增加,在最后一周的下单数更是达到了此前五周订单总和的三到四倍,而在截止时间前的一小时则飙升到超过预期的峰值,被奥组委官员形容为需求“冲破了屋顶!”这一情形在2008年北京奥运会第二阶段门票预售中也出现过。由于北京奥运实行“先到先得、售完为止”的售票方案,公众纷纷抢在第一时间订票,致使票务官网压力激增,承受了超过自身设计容量8倍的流量,导致系统瘫痪,并导致奥运门票暂停销售5天。

事例四:IOS8

2014年9月18号,“果粉们”终于等来了iOS8正式版的推送。在iOS8正式上线仅一周之后,苹果公司出人意料地发布了iOS8的升级补丁。更出人意料的是,在一个小时后,苹果公司又紧急撤回了这个补丁,因为用户发现,升级这个补丁之后可能导致无法拨打电话。

想想看,还知道哪些软件危机的事例?

1.4 解决软件危机的办法

在软件危机相当严重的背景下,软件工程产生了。在引入工程化的思想后,人们总结了出现软件危机的原因并提出了相应的解决对策。主要内容是:

(1)充分吸收和借鉴人类长期以来从事各种工程项目中积累的行之有效的有效原理、概念、技术与方法,特别是吸取几十年来人类从事计算机硬件研究和开发的经验教训。在开发软件的过程中努力做到良好的组织,严格的管理,相互友好的协作。

(2)推广在实践中总结出来的开发软件的成功技术和方法,并研究更好、更有效的技术和方法,尽快克服在计算机系统早期发展阶段形成的一些错误概念和做法。

(3)根据不同的应用领域,开发更好的软件工具并使用这些工具。将软件开发各个阶段使用的软件工具集合成一个整体,形成一个很好的软件开发环境。

总之,为了解决软件危机,既要有对过去经验的归纳总结,有技术措施(方法和工具),又要有必要的组织管理措施。

2 软件工程

2.1 软件工程的概念

软件工程一直以来都缺乏一个统一的定义,很多学者、组织机构都分别给出了自己的定义:

(1)美国工程院院士、软件工程专家Barry Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。

(2)IEEE在《软件工程术语汇编中》的定义:软件工程是:①将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;②对①中所述方法的研究。

(3)德国计算机科学家FritzBauer在NATO会议上给出的定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。

(4)《计算机科学技术百科全书》中的定义:软件工程是应用计算机科学、数学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本。其中,计算机科学、数学用于构建模型与算法。工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡。管理科学用于计划、资源、质量、成本等管理。

目前比较认可的一种定义认为:软件工程是研究和应用如何以系统性的、规范化的、可定量的工程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。

2.2 软件工程的要素

软件工程包括三个要素:方法、工具和过程,如图1-1所示。

图1-1 软件工程层次图

软件工程方法为软件开发提供了“如何做”的技术。它包括了多方面的任务,如项目计划与估算、软件系统需求分析、数据结构、系统总体结构的设计、算法过程的设计、编码、测试及维护等。目前常见的软件开发方法是结构化方法和面向对象方法。

软件工具为软件工程方法提供了自动的或半自动的软件支撑环境。目前,已经推出了许多软件工具,这些软件工具集成起来,建立起称之为计算机辅助软件工程(CASE)的软件开发支撑系统。CASE将各种软件工具、开发机器和一个存放开发过程信息的工程数据库组合起来形成一个软件工程环境。

软件工程的过程则是,将软件工程的方法和工具综合起来,以达到合理、及时地进行计算机软件开发的目的。过程定义了方法使用的顺序、要求交付的文档资料、为保证质量和协调变化所需要的管理、及软件开发各个阶段完成的里程碑。

软件工程是一种层次化的技术,以有组织的质量保证为基础。全面的质量管理和类似的理念刺激了不断的过程改进,正是这种改进导致了更加成熟的软件工程方法的不断出现。支持软件工程的根基就在于对质量的关注。

2.3 软件工程的基本原理

著名的美国软件工程专家Boehm综合了学者们的意见,并总结了TRW公司多年开发软件的经验,于1983年在一篇论文中提出了软件工程的七条基本原理。他认为这七条原理是确保软件产品质量和开发效率的原理的最小集合。这七条原理是互相独立的,其中任意六条原理的组合都不能代替另一条原理。然而这七条原理又是相当完备的,人们虽然不能用数学方法严格证明它们是一个完备的集合,但是可以证明在此之前已经提出的100多条软件工程原理都可以由这七条原理的任意组合蕴含或派生。

下面简要介绍软件工程的七条基本原理:

(1)用分阶段的生命周期计划严格管理

这一条是吸取前人的教训而提出来的。统计表明,50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。这条原理意味着应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。Boehm认为,在整个软件生命周期中应指定并严格执行6类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。

(2)坚持进行阶段评审

统计结果显示:大部分错误是在编码之前造成的,大约占63%。错误发现得越晚,改正它所付出的代价就越大,要差2到3个数量级。因此,软件的质量保证工作不能等到编码结束之后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。

(3)实行严格的产品控制

开发人员最痛恨的事情之一就是改动需求。但是实践告诉我们,需求的改动往往是不可避免的。这就要求我们要采用科学的产品控制技术来顺应这种要求。也就是要采用变动控制,又叫基准配置管理。当需求变动时,其他各个阶段的文档或代码随之相应变动,以保证软件的一致性。

(4)采纳现代程序设计技术

从20世纪六七十年代的结构化软件开发技术,到目前的面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。采用先进的技术既可以提高软件开发的效率,又可以减少软件维护的成本。

(5)结果应能清楚地审查

软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难于评价和管理。为更好地进行管理,应根据软件开发的总目标及完成期限,尽量明确地规定开发小组的责任和产品标准,从而使所得到的标准能清楚地审查。

(6)开发小组的人员应少而精

开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍,开发工作中犯的错误也要少得多。当开发小组为N人时,可能的通信信道为N(N-1)/2。可见随着人数N的增大,通信开销将急剧增大。

(7)承认不断改进软件工程实践的必要性

遵从上述七条基本原理,就能够较好地实现软件的工程化生产。但是,它们只是对现有的经验的总结和归纳,并不能保证赶上技术不断前进发展的步伐。因此,Boehm提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条原理。根据这条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新的软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。

2.4 软件工程的目标

软件工程的目标是:在给定成本、进度的前提下,开发出具有可修改性、有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性(简称“十性原则”),并且满足用户需求的软件产品。

追求这些目标促进软件工程提高软件质量、降低软件成本、满足用户要求,主要体现在以下方面。

(1)付出较低的开发成本

软件开发成本主要指软件开发过程中所花费的工作量及相应的代价。不同于传统的工业产品成本,软件的成本不包括原材料和能源的消耗,主要是人力的消耗——人员工资。另外,软件也没有一个明显的制造过程。它的开发成本不是以一次性开发过程所花费的代价来计算的,而是整个软件开发过程所花费的各种费用。降低软件开发成本一直是软件工程的目标。

(2)达到要求的软件功能

软件功能,即软件能够“做什么”,它是软件的价值体现。由于软件开发人员和用户知识领域的差异,往往造成双方对功能理解不一致,导致软件功能不能完全符合用户要求。一个成功的软件应能够完全满足用户需要。

(3)取得较好的软件性能

软件的性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,而是在完成该功能时展示出来的及时性。由于感受软件性能的主体是人,不同的人对于同样的软件性能有不同的主观感受,而且不同的人对于软件性能关心的视角也不同。软件性能的好坏通常从响应时间、吞吐量、并发用户量、资源利用率等方面进行衡量,取得较好的软件性能是软件工程的重要目标。

(4)开发的软件易于移植

软件移植是将软件从一种计算机上转置到其他计算机上。软件移植是实现功能的等价联系,而不是等同联系。从一种计算机向另一种计算机移植软件时,首先要考虑所移植的软件对宿主机硬件及操作系统的接口,然后设法用对目标机的接口代换之。因此,开发容易改造接口的软件,是软件工程的目标。

(5)需要较低的维护费用

软件维护主要是指根据需求变化或硬件环境的变化对应用程序进行部分或全部的修改。软件维护是软件生命周期中最长的一个阶段,有很多软件由于前期管理或技术失误导致后期维护费用激增,收益在维护中耗尽。因此,维护费用的高低是一个软件是否优秀的衡量标准。

(6)能按时完成开发工作,及时交付使用

软件是一种信息产品,具有可延展性,属于柔性生产,进度通常难以把握,拖延工期几个月甚至几年的现象并不罕见,这种现象降低了软件开发组织的信誉。因此,能按时完成开发工作,及时交付使用是软件工程的目标。

小结

软件是计算机程序及其有关的数据和文档的结合。软件危机是指在计算机软件开发和维护时所遇到的一系列问题。软件危机主要问题:一是如何开发软件以满足对软件日益增长的需求;二是如何维护数量不断增长的已有软件。

软件工程采用工程的概念、原理、技术和方法来开发与维护软件。软件工程的目标是实现软件的优质高产。其主要内容是软件开发技术和软件工程管理。软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,在软件开发中如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。

软件开发方法学是编制软件的系统方法。它确定软件开发的各个阶段,规定每一阶段的活动、产品、验收的步骤和完成准则。常用的软件开发方法有结构化方法、面向数据结构方法和面向对象方法等。

通过正反两个案例来认识什么是软件危机、软件危机的表现。通过软件危机的经典故事来思考其产生的原因及解决方法。

习题

一、选择题

1.下面不属于软件工程的3个要素是( )。

A.工具

B.过程

C.方法

D.环境

2.软件工程方法的产生源于软件危机,下列( )是产生软件危机的内在原因。

Ⅰ 软件的复杂性

Ⅱ 软件维护困难

Ⅲ 软件成本太高

Ⅳ 软件质量难保证

A.Ⅰ

B.Ⅲ

C.Ⅰ和Ⅳ

D.Ⅲ和Ⅳ

3.软件工程的出现主要是由于( )。

A.程序设计方法学的影响

B.其他工程科学的影响

C.软件危机的出现

D.计算机的发展

4.软件工程学一般包含软件开发技术和软件工程管理两方面的内容,下述( )是属于软件开发技术的内容。

Ⅰ.软件开发方法学

Ⅱ.软件工程过程

Ⅲ.软件工程经济学

A.Ⅰ

B.Ⅲ

C.Ⅱ和Ⅲ

D.Ⅰ和Ⅱ

5.软件工程学一般应包括:软件开发技术和软件工程管理两部分内容,下述( )是软件工程管理的内容。

Ⅰ.人员组织

Ⅱ.进度安排

Ⅲ.质量保证

Ⅳ.成本核算

A.Ⅰ和Ⅱ

B.Ⅱ和Ⅲ

C.Ⅲ和Ⅳ

D.都是

6.软件工程学中除重视软件开发的研究外,另一重要组成内容是软件的( )。

A.工程管理

B.成本核算

C.人员培训

D.工具开发

7.软件工程的目的是( )。

A.建造大型的软件系统

B.软件开发的理论研究

C.软件的质量的保证

D.研究软件开发的原理

二、思考题

1.火星业务支撑软件失败的因素。

2.腾讯成功的原因。

3.软件工程是什么?

4.怎样按时完成高质量的软件?