软件工程课件:软件维护_第1页
软件工程课件:软件维护_第2页
软件工程课件:软件维护_第3页
软件工程课件:软件维护_第4页
软件工程课件:软件维护_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件维护6.1软件维护的基本概念6.2软件维护的任务和分类6.3软件维护过程6.4维护的管理6.5预防性维护6.6软件维护的副作用6.7软件文档与编写要求及方法6.8软件逆向工程和再工程6.9小结习题6

知识点

软件维护的基本概念,维护管理,维护过程,预防性维护,维护的副作用,软件文档,软件逆向工程和再工程。

难点

软件维护过程和管理,预防性维护,软件文档编写。

基于工作过程的教学任务

通过本章的学习,了解软件维护的基本概念及分类,软件维护的副作用,软件可维护性对软件开发的重要性;掌握预防性维护、软件文档编写要求和方法、软件维护过程、软件维护类型、以及提供软件可维护性的方法;了解软件逆向工程与再工程的基本过程。

6.1软件维护的基本概念

软件工程的目的就是提高软件的可维护性,减少软件维护所需要的工作量,降低软件系统的总成本。所谓软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。可以通过描述软件交付使用后可能进行的4项维护活动,具体地定义软件维护。这4种维护活动为改正性维护、适应性维护、完善性维护、预防性维护。

软件维护绝不仅限于纠正使用中发现的错误,事实上在全部维护活动中一半以上是扩充与完善性维护。统计数字表明,完善性维护占全部维护活动的50%~66%,改正性维护占17%~21%,适应性维护占18%~25%,预防性维护活动只占4%左右。如图6-1所示。

图6-1各种维护的比例

需要注意的是,上述4种维护活动都必须应用于整个软件配置,维护软件文档和维护软件的可执行代码是同样重要的。

(1)为什么要进行软件维护?

举例:大学科研机构里的软件维护工作恐怕是做得最差的了。几乎每一批新的研究生都会把毕业生留下的软件臭骂一通,然后全部推倒重做。到他毕业该走时,就轮到别人评论他的工作了。如此轮回,最终没有什么成果留下。

通过上述案例可以看出,如果希望软件系统能延长寿命,必须要对它进行维护。如果希望软件系统有效益,则必须设法降低维护的代价。

(2)影响维护工作量的因素。

①系统大小:系统越大,理解掌握起来越困难。系统越大,所执行功能越复杂。

②程序设计语言:使用强功能的程序设计语言可以控制程序的规模。语言的功能越强,生成程序的模块化和结构化程度越高,所需的指令数就越少,程序的可读性越好。

③数据库技术的应用:使用数据库,可以简单而有效地管理和存储用户程序中的数据,还可以减少生成用户报表应用软件的维护工作量。

④先进的软件开发技术:在软件开发时,若使用能使软件结构比较稳定的分析与设计技术及程序设计技术,如面向对象技术、复用技术等,可减少大量的工作量。

(3)软件维护的成本。

有形的维护成本是花费了多少钱;无形的维护成本是带来的负面影响。

6.2软件维护的任务和分类

软件维护的主要任务就是在软件使用或软件维护阶段,为了改正错误或满足新的需要而修改软件,使软件能持久地满足用户的需求。按软件维护的不同性质,可以把软件维护分为改正性维护、适用性维护、完善性维护、预防性维护四种类型。

1.改正性维护

因为软件测试不可能暴露出一个大型软件系统中所有潜藏的错误,所以必然会有第一项维护活动:在任何大型程序的使用期间,用户必然会发现程序错误,并且把他们遇到的问题报告给维护人员。因此,把诊断和改正错误的过程称为改正性维护。

2.适用性维护

适用性维护是为了使系统适应环境的变化而进行的维护工作。一方面,信息系统要能够适应新的软硬件环境,以提高系统的性能和运行效率;另一方面,应用对象在不断发生变化,机构的调整,管理体制的改变、数据与信息需求的变更等都将导致系统不能适应新的应用环境。如代码改变、数据结构变化、数据格式以及输入/输出方式的变化、数据存储介质的变化等,都将直接影响系统的正常工作。因此,有必要对系统进行调整,使之适应应用对象的变化,满足用户的需求。

3.完善性维护

在系统的使用过程中,用户往往要求扩充原有系统的功能,增加一些在软件需求规范书中没有规定的功能与性能特征,以及对处理效率和编写程序的改进。例如,有时可将几个小程序合并成一个单一的运行良好的程序,从而提高处理效率;增加数据输出的图形方式;增加联机在线帮助功能;调整用户界面等。尽管这些要求在原有系统开发的需求规格说明书中并没有,但用户要求在原有系统基础上进一步改善和提高,并且随着用户对系统的使用和熟悉,这种要求可能会不断提出,为了满足这些要求就要进行完善性维护工作。

4.预防性维护

为了改进未来的可维护性或可靠性,或为了给未来的改进奠定更好的基础而修改软件时,就出现了第4项维护活动。这项维护活动通常称为预防性维护,目前这项维护活动相对比较少。

软件维护工作不应总是被动地等待用户提出要求后才进行,应进行主动的预防性维护,即选择那些还有较长使用寿命,目前尚能正常运行,但可能将要发生变化或调整的系统进行维护,目的是通过预防性维护为未来的修改与调整奠定更好的基础。例如,将目前能应用的报表功能改成通用报表生成功能,以应对今后报表内容和格式可能的变化。

6.3软件维护过程

维护过程本质上是修改和压缩了的软件定义和开发过程,而且事实上远在提出一项维护要求之前,与软件维护有关的工作已经开始了。软件维护主要包括5个过程:建立维护组织、撰写维护报告、确定维护事件流、保存维护记录、评价维护活动。

1.建立维护组织

虽然通常并不需要建立正式的维护组织,但是,即使对于一个小的软件开发团体而言,非正式地委托责任也是绝对必要的。每个维护要求都通过维护管理员转交给相应的系统管理员去评价。系统管理员是被指定去熟悉部分产品程序的技术人员,系统管理员一旦对维护任务做出评价之后,由变化授权人决定应该进行的活动。如图6-2所示。

在维护活动开始之前就明确维护责任是十分必要的,这样做可以大大减少维护过程中可能出现的混乱。

图6-2维护组织

2.撰写维护报告

应该用标准化的格式表达所有软件维护要求。软件维护人员通常给用户提供空白的维护要求表,有时也称为软件问题报告表,这个表格由要求一项维护活动的用户填写。如果遇到了一个错误,那么必须完整描述导致出现错误的环境(包括输入数据、全部输出数据以及其他有关信息)。对于适应性或完善性的维护要求,用户必须提出一份修改说明书,列出所有希望的修改。如前所述,由维护管理员和系统管理员评价用户提交的维护要求表,并相应做出软件修改报告,并给出下述信息:

维护要求的性质;

这项要求的优先次序;

与修改有关的事后数据;

满足维护要求表中提出的要求所需要的工作量。

在拟定进一步的维护计划之前,把软件修改报告提交给变化授权人审查批准。

3.确定维护事件流

当一个维护申请提出并通过评审确定需要维护时,则按图6-3所描绘的过程实施维护。首先应该确定要求进行的维护的类型。用户常常把一项要求看作是为了改正软件的错误(改正性维护),而开发人员可能把同一项要求看作是适应性或完善性维护。当存在不同意见时,必须协商解决。

图6-3维护阶段的事件流

从图6-3描绘的事件流可看到,对一项改正性维护要求(图中“错误”通路)的处理,从估量错误的严重程度开始。如果是一个严重的错误(例如,一个关键性的系统不能正常运行),则在系统管理员的指导下分派人员,并且立即开始问题分析过程。如果错误并不严重,那么改正性的维护和其他要求软件开发资源的任务一起统筹安排。

适应性维护和完善性维护的要求沿着相同的事件流通路前进,对每个维护要求进行优先度评价,并且安排要求的工作时间,好似它是另一个开发任务一样。如果一项维护要求的优先次序非常高,就要立即开始维护工作。

不管维护类型如何,都需要进行同样的技术工作。这些工作包括修改软件设计、复查、必要的代码修改、单元测试和集成测试(包括使用以前的测试方案的回归测试)、验收测试和复审。不同类型的维护强调的重点不同,但是基本途径是相同的。维护事件流中最后一个事件是复审,它再次检验软件配置的所有成分的有效性,并且保证事实上满足了维护要求表中的要求。

4.保存维护记录

对于软件生命周期的所有阶段而言,以前记录保存都是不充分的,而软件维护则根本没有记录保存下来。由于这个原因,往往不能估计维护技术的有效性,不能确定一个产品程序的优良程度,而且很难确定维护的实际代价是什么。

在维护阶段需要记录一些与维护有关的信息,这些信息可作为估计维护的有效程度,确定软件产品的质量,估算维护费用等工作的原始依据。维护档案记录主要包括:

程序名称;

源程序语句条数;

机器代码指令条数;

所用的程序设计语言;

程序安装的日期;

程序安装后的运行次数;

与程序安装后运行次数有关的处理故障次数;

程序改变的层次及名称;

修改程序增加的源程序语句条数;

修改程序减少的源程序语句条数;

每次修改所付出的人时数;

修改程序的日期;

软件维护人员的姓名;

维护申请报告的名称、维护类型;

维护开始时间和维护结束时间;

花费在维护上的累计人时数;

维护工作的净收益等。

5.评价维护活动

缺乏有效的数据就无法评价维护活动。如果已经开始保存维护记录了,则可以对维护工作做一些定量度量。至少可以从下述7个方面度量维护工作:

每次程序运行平均失效的次数;

用于每一类维护活动的总人时数;

平均每个程序、每种语言、每种维护类型所做的程序变动数;

维护过程中增加或删除一个源语句平均花费的人时数;

维护每种语言平均花费的人时数;

一张维护要求表的平均周转时间;

不同维护类型所占的百分比。

根据对维护工作定量度量的结果,可以做出关于开发技术、语言选择、维护工作量规划、资源分配及其他许多方面的决定,而且可以利用这些数据去分析评价维护任务。

6.4维护的管理

软件维护管理包括有缺陷报告、批准对产品的修改、软件的可维护性、影响软件可维护性的因素、软件可维护性度量、提高软件可维护性的方法等。

1.缺陷报告

缺陷报告必须包括足够的信息,使维护程序员能够再现该问题,通常是某种类型的软件故障。另外,维护程序员必须指出缺陷的严重性,典型的严重性类别包括致命的、主要的、通常的、较小的和微不足道的。

理想情况下,用户提出的每个缺陷都应立即纠正。而实际上,程序开发公司通常人力不足,开发和维护工作都会滞后。如果缺陷是致命的,例如工资发放软件在发工资的前一天或有员工增减工资的前一天崩溃了,那么必须立即采取纠正措施。其他情况下,必须立即对每一份缺陷报告进行初步的调查。

维护程序员应该首先参考缺陷报告文件。缺陷报告包括已经发现但尚未纠正的所有缺陷,以及关于在缺陷得到纠正之前用户如何绕过它们的建议。如果缺陷以前已经报告过,缺陷报告中的任何信息都应传递给用户。但如果用户报告的是新缺陷,那么维护程序员应该对问题加以研究并设法找出原因和解决问题。

另外,应该设法找到绕过问题的办法,因为有可能需要6~9个月的时间才能分配人力对软件做出必要的修改。考虑到程序员,特别是能够胜任维护工作的优秀程序员的短缺,对于那些不十分紧急的缺陷报告,只能建议用户通过某种方法继续使用带有缺陷的软件,直到缺陷可以得到解决。

然后,维护程序员的结论要连同所有支持其结论的文档——用以得出上述结论的清单、设计、手册等,一同加入缺陷报告文件中。负责交付后维护的管理员应该定期阅读该报告,确定各种纠错任务的优先次序。该文件还应包括客户在完善性维护和适应性维护等方面的要求,下一次将纠正优先级最高的缺陷。

2.批准对产品的修改

一旦决定进行纠错性维护,维护程序员就要查找软件运行失败的原因,并承担起修正该错误的任务。代码改变后,必须像对整个产品进行测试一样,对所做修改进行回归测试。然后必须更新文档,以反映所做的修改。特别是对改变后的代码制品,要在其序言注释中加入关于进行了哪些修改、为什么修改、由谁做的修改以及何时进行修改等方面的信息。如果有必要,分析或设计制品也需要修改。

在完善性维护或适应性维护之后,也要采取类似的步骤。唯一的区别是,完善性维护和适应性维护是按客户要求进行的,不是由缺陷报告引发的。

如果维护程序员对所做的修改测试不充分该怎么办呢?产品在发布前,要通过一个独立的小组进行软件质量保证,即维护SQA小组的成员一定不能作为维护程序员给相同的管理者提供报告。SQA保持管理上的独立很重要。

维护工作是容易出错的,交付后维护期间的测试是困难的,也是消耗时间的。SQA小组不应低估测试对软件维护的影响,一旦新版本得到SQA小组的批准,它就可以发布了。

3.软件的可维护性

许多软件的维护十分困难,原因在于,这些软件的文档不全、质量差、开发过程不注意采用好的方法,忽视程序设计风格等。许多维护要求并不是因为程序中出错而提出的,而是为适应环境变化或需求变化而提出的。为了使得软件能够易于维护,必须考虑使软件具有可维护性。

软件可维护性是指纠正软件系统出现的错误和缺陷,以及为满足新的要求进行修改、扩充或压缩的难易程度。在前面的章节中曾经多次强调,提高可维护性是支配软件工程方法学所有步骤的关键目标。

4.影响软件可维护性的因素

维护就是在软件交付使用后进行的修改,修改之前必须理解待修改的对象,修改之后应该进行必要的测试,以保证所做的修改是正确的。如果是改正性维护,还必须预先进行调试以确定错误的具体位置。因此,影响软件可维护性的因素主要有下述7个:

1)可理解性

软件可理解性表现为维护人员理解软件的结构、功能、接口和内部处理过程的难易程度。模块化(模块结构良好,高内聚,松耦合)、详细的设计文档、结构化设计、程序内部的文档和良好的高级程序设计语言等,都对提高软件的可理解性有重要贡献。

2)可测试性

软件的可测试性指程序正确性的难易程度。诊断和测试的容易程度取决于软件容易理解的程度,良好的文档对诊断和测试是至关重要的。维护人员应该能够得到在开发阶段用过的测试方案,以便进行回归测试。

3)可修改性

软件可修改性指修改程序的难易程度。软件容易修改的程度和本书第3章讲过的结构化设计原理和启发规则直接有关。耦合、内聚、信息隐藏、局部化、控制域与作用域的关系等等,都影响软件的可修改性。

4)可靠性

软件可靠性指一个程序在满足用户功能需求的基础上,在一定时间内正确执行的概率。软件的可靠性越好,越有助于减少由于修改软件而出现更多的错误,越有利于维护工作。

5)可移植性

软件可移植性指把程序从一种计算环境(硬件配置和操作系统)转移到另一种计算环境的难易程度。把与硬件、操作系统以及其他外部设备有关的程序代码集中放到特定的程序模块中,可以把因环境变化而必须修改的程序局限在少数程序模块中,从而降低修改的难度。

6)可使用性

软件可使用性是指程序方便、实用及易于使用的程度。一个可使用的程序应是易于使用、允许用户出错和改变、并尽可能不使用户陷入混乱状态的程序。

7)效率

效率指一个程序能执行预定功能而又不浪费机器资源的程度(即对存储容量、通道容量和执行时间的使用情况)。编程时,不能一味追求效率,有时需要牺牲部分执行效率而提高程序的其他特性。

对于不同类型的维护,上述7个因素的侧重点也不相同。表6-1列出了在各类维护中应侧重哪些特性。

5.软件可维护性度量

软件维护性度量的任务是对软件产品的维护性给出量化的评价,和其他软件质量特性一样,软件维护的度量也分为内部维护性度量和外部维护性度量。

从表6-2中可以看出,内部维护性度量是在软件产品尚未开发完成时实施的度量。此时只有阶段产品,例如已得到设计规格说明和源程序(但未经测试),度量的目的在于预测将获得的软件产品的维护性。而外部维护性度量则是在产品完成后,经运行开发出的程序而获得的维护性数据。

维护性度量的实施者可能是用户、测试人员、开发人员、产品评价人员或是软件维护人员。以下分别说明内部维护性子特性度量及外部维护性子特性度量的含义:

(1)内部维护性子特性度量。

易分析性度量—预测未来维护人员或软件产品用户在维护工作中为诊断软件产品缺陷或失效原因,或是找出要修改的部分所付出的工作量和资源。

易变更性度量—预测未来维护人员或软件产品用户在进行维护时,修改软件所需的工作量。

稳定性度量—预测对软件产品进行修改后的稳定程度,例如,如果某软件产品修改的局部化程度较高,或是修改变更的副作用较小,表明未来产品的维护性的稳定性较好。

测试性度量—预测软件产品中设计并实现的自动测试辅助功能的总量。

维护性的依从性度量—评估软件产品遵循与维护性有关的用户组织的标准、约定或法规的能力。例如,如果开发的软件是出口给某外国公司的产品,那就要评估该产品是否能符合该国、该公司有关软件维护性的标准或法规。

(2)外部维护性子特性度量。

易分析性度量—软件维护人员或软件产品用户在维护工作中为诊断软件产品缺陷或失效原因,或是找出要修改的部分所付出的工作量和资源。

易变更性度量—软件维护人员或软件产品用户在进行维护时,修改所付出的工作量,如实现变更所用时间。

稳定性度量—在软件产品修改后的测试或运行时对所出现的意外行为属性的度量,如变更成功比率。

测试性度量—在测试已经修改或未修改的软件时所付出的测试工作量等测试属性的度量。

维护性的依从性度量—软件产品不遵循说要求的与维护性相关的标准、约定或法规的功能数和出现依从性问题的数量。

6.提高软件可维护性的方法

软件的可维护性对于延长软件的生存期具有决定意义,因此必须考虑怎样才能提高软件的可维护性。为此,可以从以下5个方面着手。

(1)建立明确的软件质量目标。

如果要使程序完全满足可维护性的7种影响软件可维护性的因素,肯定是很难实现的。实际上,某些因素是相互促进的,如可理解性和可测试性,可理解性和可修改性;某些质量特性是相互抵触的,如效率和可移植性,效率和可修改性。因此,为保证程序的可维护性,应该在一定程度上满足可维护的各个因素,但各个因素的重要性又是随着程序的用途或计算机环境的不同而改变的。

对编译程序来说,效率和可移植性是主要的;对信息管理系统来说,可使用性和可修改性可能是主要的。通过实验证明,强调效率的程序包含的错误比强调简明性的程序所包含的错误要高出10倍,所以在提出目标的同时还必须规定它们的优先级,这样有助于提高软件的质量。

(2)使用先进的软件开发技术和工具。

使用先进的软件开发技术是软件开发过程中提高软件质量、降低成本的有效方法之一,也是提高可维护性的有效技术。常用的技术有:模块化、结构化程序设计、自动重建结构和重新格式化的工具等。

例如,面向对象的软件开发方法就是一个常用的强而有力的软件开发方法。面向对象方法是按照人的思维方法,用现实世界的概念来思考问题的,这样能自然地解决问题。它强调模拟现实世界中的概念而不是强调算法,鼓励开发者在开发过程中按应用领域的实际概念来思考并建立模型,模拟客观世界,使描述问题的问题空间和解空间尽量一致,开发出尽量直观、自然地表现求解方法的软件系统。

总之,面向对象方法开发出来的软件系统的稳定性好、容易修改、易于测试和调试,因此可维护性好。

(3)建立明确的质量保证工作。

质量保证是提高软件质量所做的各种检查工作。在软件开发和软件维护的各阶段,质量保证检查是非常有效的方法。为了保证软件的可维护性,有4种类型的软件检查。

①在检查点进行复审。

检查点是软件开发过程中一个阶段的终点。检查点进行检查的目标是,证实已开发的软件是满足设计要求的。保证软件质量的最佳方法是,在软件开发的最初阶段就把质量要求考虑进去,并在每个阶段的终点,设置检查点进行检查。各阶段的检查重点、对象和方法如表6-3所示。

②验收检查。

验收检查是对一个特殊的检查点的检查,它是把软件从开发转移到维护的最后一次检查。它对减少维护费用,提高软件质量非常重要。

③周期性的维护检查。

上述两种软件检查可用来保证新的软件系统的可维护性。周期性的维护检查的结果是开发阶段对检查点进行检查的继续,采用的检查方法和内容都是相同的。把多次检查的结果与以前进行的验收检查的结果和检查点检查的结果进行比较,对检查结果的任何变化进行分析,并找出原因。

④对软件包进行检查。

上述三种方法使用与组织内部开发和维护的软件或专为少量用户设计的软件,很难适用于有很多用户的通用软件包。因软件包属于卖方的资产,用户很难获得软件包源代码和完整的文档。对软件包的维护通常采用单位的维护程序员在分析研究卖方提供的用户手册、操作手册、培训手册、新版本策略指导、计算机环境和验收测试的基础上,深入了解本单位的希望和要求,来编制软件包检验程序。软件包检测程序是一个测试程序,它检查软件包程序所执行的功能是否与用户的要求和条件相一致。

(4)选择可维护的程序设计语言。

程序设计语言的选择对软件可维护性影响很大。恰当的程序设计语言能使编码时困难最少,可以减少需要的程序测试量,并且可以得到更容易阅读、更容易维护的程序。

第四代语言(4GL),例如查询语言、图形语言、报表生成语言和非常高级语言等,对减少维护费用来说是最有吸引力的语言。人们容易理解、使用和修改它们。

例如,用户使用4GL开发商业应用程序比使用通常的高级语言快很多倍。一些4GL是过程语言,另一些是非过程语言。对非过程语言,用户不需要指出实现算法,只需向编译程序或解释程序提出自己的要求。例如它能自动选择报表格式、文字字符类型等。自动生成指令能改进软件的可靠性。另外,4GL容易理解,容易编程,程序容易修改,因此改进了可维护性。

(5)改进程序的文档。

程序员利用程序文档来解释和理解程序的内部结构,以及程序同系统内其他程序、操作系统和其他软件系统是如何相互作用的。程序文档包括源代码注释、设计文档、系统流程、程序流程图和交叉引用表等。

程序文档是对程序的总目标、程序的各组成部分之间的关系、程序设计策略、程序时间过程的历史数据等的说明和补充。程序文档能提高程序的可阅读性。为了维护程序,人们不得不阅读和理解程序文档。虽然大家对程序的看法不一,但普遍同意以下观点:

好的文档能使程序更容易阅读,坏的文档比没有更糟糕;

好的文档简明扼要,风格统一,容易修改;

程序编码中加入必要的注释可提高程序的可理解性;

程序越长、越复杂,越应该注意程序文档的编写。

6.5预

几乎所有历史比较悠久的软件开发组织,都有一些十几年前开发出的老系统。目前,某些老系统仍然在为用户服务,但是,当初开发这些程序时并没有使用软件工程方法学来指导。因此,这些程序的体系结构和数据结构都很差,文档不全甚至完全没有文档,对曾经做过的修改也没有完整的记录。针对这些寿命长、目前正在为用户服务的老版本的软件系统,为了更好地发挥其优势,需要进行预防性维护。

预防性维护,就是采用先进的软件工程方法对需要维护的软件或软件中的某一部分(重新)进行设计、编制和测试。预防性维护的目的是为了提高软件的可维护性、可靠性等,为以后进一步改进软件打下良好基础。

怎样满足用户对上述这类老系统的维护要求呢?为了修改这类程序以适应用户新的或变更的需求,有以下几种做法可供选择:

(1)盲目修改。反复多次地做修改程序的尝试,与不可见的设计及源代码“顽强战斗”,以实现所要求的修改。

(2)认真阅读。通过仔细分析程序,尽可能多地掌握程序的内部工作细节,以便更有效地修改它。

(3)重新设计。在深入理解原有设计的基础上,用软件工程方法重新设计、重新编码和测试那些需要变更的软件部分。

(4)借助先进工具。以软件工程方法学为指导,对程序全部重新设计、重新编码和测试,为此可以使用CASE工具(逆向工程和再工程工具)来帮助理解原有的设计。

第一种做法很盲目,通常人们采用后3种做法。其中第4种做法称为软件再工程,而第3种做法实质上是局部的再工程。

预防性维护方法是由米勒(Miller)提出来的,他的想法是“结构化翻新”,并将这个概念定义为:把今天的方法学应用到昨天的系统上,以支持明天的需求。

粗看起来,在一个正在工作的程序版本已经存在的情况下,重新开发一个大型程序,似乎是一种浪费。其实不然,下述事实很能说明问题。

(1)维护一行源代码的代价可能是最初开发该行源代码代价的14~40倍;

(2)重新设计软件体系结构(程序及数据结构)时使用了现代设计概念,它对将来的维护可能有很大的帮助;

(3)由于现有的程序版本可作为软件原型使用,开发生产率可大大高于平均水平;

(4)用户具有较多使用该软件的经验,因此,能够很容易地搞清新的变更需求和变更的范围;

(5)利用逆向工程和再工程的工具,可以使一部分工作自动化;

(6)在完成预防性维护的过程中可以建立起完整的软件配置。

虽然由于条件所限,目前预防性维护在全部维护活动中仅占很小比例,但是,我们不应该忽视这类维护,在条件具备时应该主动地进行预防性维护。

6.6软件维护的副作用

通过维护可以延长软件的寿命,使其创造更多的价值。但是,修改软件是危险的,每修改一次,可能会产生新的潜在错误。因此,维护的副作用是指由于修改程序而导致新的错误或新增加一些不必要的活动。一般,软件维护产生的副作用有如下3种。

1.修改代码的副作用

在使用程序设计语言修改源代码时,可能引入新的错误。例如修改或删除一个标识符、改变占用存储的大小、改进程序的执行效率、改变逻辑运算符,以及把设计上的改变翻译成代码的改变、边界条件的逻辑测试做出改变等。任何一个修改都容易引入错误,因此在修改时必须特别小心。

2.修改数据的副作用

在修改数据结构时,有可能造成软件设计与数据结构不匹配,因而导致软件出错。例如在重新定义局部常量或全局常量、修改全局数据或公共数据、重新初始化控制标志或指针、减小或增大一个数组大小、减小或增大一个高层数据结构大小、重新排列输入或输出的参数时,非常容易导致设计与数据不相容的错误。修改数据的副作用是修改软件信息结构导致的,它可以通过详细的设计文档来加以控制。在文档中通过一种交叉引用,把数据元素、记录、文件和其他结构联系起来。

3.修改文档的副作用

对数据流、软件结构、模块逻辑或任何其他有关特性进行修改时,必须对相关技术文档进行相应修改。但修改文档过程会产生新的错误,导致文档与程序功能不匹配、缺省条件改变、新错误信息不正确等,产生修改文档的副作用。例如对交互输入的顺序或格式进行修改,如果没有正确地记入文档中,可能引起重大的问题。因此,必须在软件交付前对整个软件配置进行评审,以减少文档的副作用。

为了控制因修改而引起的副作用,要做到以下几点:

(1)按模块把修改分组;

(2)自顶向下地安排被修改模块的顺序;

(3)每次只修改一个模块;

(4)对每个修改过的模块,在安排修改下一个模块之前,要确定这个修改的副作用。

6.7软件文档与编写要求及方法

文档(document)是指某些数据媒体和其中所记录的数据。文档具有永久性,并可以由人或机器阅读。在软件工程中文档常常用来表示对活动、需求、过程或结果进行描述、定义、规定、报告或认证的任何书面或图示的信息。文档也是软件产品的一部分,没有文档的软件就不称其为软件。软件文档的编制在软件开发中占有突出的地位和相当大的工作量。高质量、高效率地开发、管理和维护文档,对于转让、变更、修正、扩充和使用文档,对于充分发挥软件产品的效益有着重要的意义。

举例:一位软件公司的老总感慨地说:“做软件公司,最痛苦的事情是下班之后,你发现自己的公司除了几台电脑外,几乎什么也没有了。”因为公司最值钱的资产都在每个程序员的脑子里,这些人一旦离开,公司的资产就等于零。

6.7.1软件文档的重要性与分类

文档是影响软件可维护性的决定因素。由于长期使用的大型软件系统在使用过程中必然会经受多次修改,所以维护期间的文档比程序代码更重要。例如国内某著名IT企业所提到的“人人都痛恨别人不写文档,人人自己都不愿意写文档”,说明软件文档十分重要。

软件系统的文档可以分为用户文档和系统文档两类。用户文档主要描述系统功能和使用方法,并不关心这些功能是怎样实现的;系统文档描述系统设计、实现和测试等各方面的内容。文档在开发人员、维护人员、管理人员、用户与计算机之间起着重要的桥梁作用,如图6-4所示。

软件开发人员在各个阶段中以文档作为前阶段工作成果的体现和后阶段工作的依据。软件开发过程中软件开发人员需制定一些工作计划或工作报告,这些计划和报告都要提供给管理人员,并得到必要的支持。管理人员则可通过这些文档了解软件开发项目安排、进度、资源使用和成果等。软件开发人员需为用户了解软件的使用、操作和维护提供详细的资料。文档作为计算机软件的重要组成部分,告诉用户如何操作和维护系统。

图6-4文档的桥梁作用

下面分别讨论用户文档和系统文档。

1.用户文档

用户文档是用户了解系统的第一步,它应该能使用户获得对系统的准确的初步印象。文档的结构方式应该使用户能够方便地根据需要阅读有关的内容。用户文档至少应该包括下述5方面的内容。

(1)功能描述:说明系统能做什么。

(2)安装文档:说明怎样安装这个系统以及怎样使系统适应特定的硬件配置。

(3)使用手册:图表结合、文字前后描述统一,简要说明如何着手使用这个系统(应该通过丰富例子说明怎样使用常用的系统功能,还应该说明用户操作错误时怎样恢复和重新启动)。

(4)参考手册:详尽描述用户可以使用的所有系统设施以及它们的使用方法,还应该解释系统可能产生的各种出错信息的含义(对参考手册最主要的要求是完整,因此通常使用形式化的描述技术)。

(5)操作员指南(如果需要有系统操作员的话):说明操作员应该如何处理使用中出现的各种情况。

上述内容可以分别作为独立的文档,也可以作为一个文档的不同分册,具体做法应该由系统规模决定。

2.系统文档

系统文档又称开发文档,指从问题定义、需求说明到验收测试计划这样一系列和系统实现有关的文档。描述系统设计、实现和测试的文档对于理解程序和维护程序来说是极端重要的。和用户文档类似,系统文档的结构也应该能把读者从对系统概貌的了解,引导到对系统每个方面每个特点的更形式化更具体的认识。下面通过表6-4显示出软件生存期各阶段与各种文档编制的关系。

文档最终要向软件管理部门,或向用户回答下列问题:①What:工作目标要满足哪些需求?②Where:开发的软件在什么环境中实现,所需信息从哪里来?③When:开发工作的时间如何安排?④Who:开发或维护工作打算由谁来完成?⑤How:需求应如何实现?⑥Why:为什么要进行这些软件开发或维护修改工作?

6.7.2软件文档应该满足的要求

总的说来,软件文档应该满足下述要求:

必须描述如何使用这个系统,没有这种描述时即使是最简单的系统也无法使用;

必须描述怎样安装和管理这个系统;

必须描述系统需求和设计;

必须描述系统的实现和测试,以便使系统成为可维护的。

在项目开发过程中,应该按要求编写好11种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。

(1)可行性分析报告。说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。

(2)项目开发计划。为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的预算、所需的硬件及软件资源等。

(3)软件需求说明书(软件规格说明书)。对所开发软件的功能、性能、用户界面及运行环境等做出详细的说明。它是在用户与开发人员双方对软件需求取得共同理解并达成协议的条件下编写的,也是实施开发工作的基础。该说明书应给出数据逻辑和数据采集的各项要求,为生成和维护系统数据文件做好准备。

(4)概要设计说明书。该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入/输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。

(5)详细设计说明书。着重描述每一模块是怎样实现的,包括实现算法、逻辑流程等。

(6)用户操作手册。本手册详细描述软件的功能、性能和用户界面,使用户对如何使用该软件得到具体的了解,为操作人员提供该软件各种运行情况的有关知识,特别是操作方法的具体细节。

(7)测试计划。为做好集成测试和验收测试,需为如何组织测试制订实施计划。计划应包括测试的内容、进度、条件、人员、测试用例的选取原则、测试结果允许的偏差范

围等。

(8)测试分析报告。测试工作完成以后,应提交测试计划执行情况的说明,对测试结果加以分析,并提出测试的结论意见。

(9)开发进度月报。该月报系软件人员按月向管理部门提交的项目进展情况报告,报告应包括进度计划与实际执行情况的比较、阶段成果、遇到的问题和解决的办法以及下个月的打算等。

(10)项目开发总结报告。软件项目开发完成以后,应与项目实施计划对照,总结实际执行的情况,如进度、成果、资源利用、成本和投入的人力,此外,还需对开发工作做出评价,总结出经验和教训。

(11)软件维护手册。主要包括软件系统说明、程序模块说明、操作环境、支持软件的说明、维护过程的说明,便于软件的维护。

6.7.3对软件文档编制的质量要求

为了使软件文档能起到多种桥梁作用,使它有助于程序员编制程序,有助于管理人员监督和管理软件开发,有助于用户了解软件的工作和应做的操作,有助于维护人员进行有效的修改和扩充,文档的编制必须保证一定的质量。

质量差的软件文档不仅使读者难于理解,给使用者造成许多不便,而且会削弱对软件的管理(如管理人员难以确认和评价开发工作的进展),增加软件的成本(如一些工作可能被迫返工),甚至造成更加有害的后果(如误操作等)。造成软件文档质量不高的原因可能是:缺乏实践经验,缺乏评价文档质量的标准;不重视文档编写工作或是对文档编写工作的安排不恰当。

高质量的文档应当体现在以下几个方面。

(1)针对性:文档编制以前应分清读者对象,按不同的类型、不同层次的读者,决定怎样适应他们的需要。例如,管理文档主要是面向管理人员的,用户文档主要是面向用户的,这两类文档不应像开发文档(面向软件开发人员)那样过多地使用软件的专业术语。

(2)精确性:文档的行文应当十分确切,不能出现多义性的描述。同一课题若干文档内容应该协调一致,应是没有矛盾的。

(3)清晰性:文档编写应力求简明,如有可能,配以适当的图表,以增强其清晰性。

(4)完整性:任何一个文档都应当是完整的、独立的,它应自成体系。例如,前言部分应作一般性介绍,正文给出中心内容,必要时还有附录,列出参考资料等。同一课题的几个文档之间可能有些部分相同,这些重复是必要的。例如同一项目的用户手册和操作手册中关于本项目功能、性能、实现环境等方面的描述是没有差别的。特别要避免在文档中出现转引其他文档内容的情况。例如一些段落并未具体描述,而用“见××文档××节”的方式,这将给读者带来许多不便。

(5)灵活性:各个不同的软件项目,其规模和复杂程度有许多实际差别,不能同等对待。对于较小或较简单的项目,可做适当调整或合并。例如可将用户手册和操作手册合并成用户操作手册;软件需求说明书可包括对数据的要求,从而去掉数据要求说明书;概要设计说明书与详细设计说明书合并成软件设计说明书等。

(6)可追溯性:由于各开发阶段编制的文档与各阶段完成的工作有着紧密的关系,前后两个阶段生成的文档,随着开发工作的逐步扩展,具有一定的继承关系。在一个项目各开发阶段之间提供文档必定存在着可追溯的关系。例如某一项软件需求,必定在设计说明书、测试计划以至用户手册中有所体现。必要时应能做到跟踪追查。

6.7.4软件文档的管理和维护

在整个软件生存期中,各种文档作为半成品或是最终成品,会不断地被生成、修改或补充。为了最终得到高质量的产品,达到上节提出的质量要求,必须加强对文档的管理。以下几个方面是应注意做到的:

(1)软件开发小组应设一位文档保管人员,负责集中保管本项目已有文档的两套主文本。两套文本内容完全一致。其中的一套可按一定手续,办理借阅。

(2)软件开发小组的成员可根据工作需要在自己手中保存一些个人文档。这些一般都应是主文本的复制件,注意和主文本保持一致,在做必要的修改时,也应先修改主文本。

(3)开发人员个人只保存着主文本中与他工作相关的部分文档。

(4)在新文档取代了旧文档时,管理人员应及时注销旧文档。在文档内容有更改时,管理人员应随时修订主文本,使其及时反映更新了的内容。

(5)项目开发结束时,文档管理人员应收回开发人员的个人文档。发现个人文档与主文本有差别时,应立即着手解决,这常常是未及时修订主文本造成的。

(6)在软件开发过程中,可能发现需要修改已完成的文档,特别是规模较大的项目,主文本的修改必须特别谨慎。修改以前要充分估计修改可能带来的影响,并且要按照提议、评议、审核、批准和实施等步骤加以严格的控制。

软件文档作为一类配置项,必须纳入配置管理的范围。在整个软件生命周期中,通过软件配置管理,控制这些配置项的投放和更改,记录并报告配置的状态和更改要求,验证配置项的安全性和正确性以及系统级上的一致性。上面所提到的文档保管员,可能就是软件配置管理员,可通过软件配置信息数据库,对配置项(主要是文档)进行跟踪和控制。

6.8软件逆向工程和再工程

所谓软件再工程(Reengineering),是以软件工程学为指导,对老系统进行重新设计、用更先进的程序设计语言重新编码、执行新的测试过程、修改和更新系统结构和系统数据、重新建立其文档等方法,来提高老系统的可维护性。就是说,将新技术和新工具应用于老系统的一种较彻底的预防性维护。

软件再工程作为一种新的预防性维护方法,近年来得到很大发展。它通过逆向工程和软件重构等技术,有效地提高现有软件的可理解性、可维护性和复用性。

典型的软件再工程过程模型如图6-5所示,该模型定义了6类活动。一般情况下,这些活动是顺序发生的,但每个活动都可能重复,形成一个循环的过程,这个过程可以在任意一个活动之后结束。下面简要地介绍该模型所定义的6类活动。

图6-5软件再工程过程模型

1.库存目录分析

每个软件组织都应该保存其拥有的所有应用系统的库存目录。该目录包含关于每个应用系统的基本信息,例如最初构建时间、以往维护情况、访问的数据库、接口情况、文档数量与质量、代码复杂性等。在确定对一个软件实施再工程之前,应收集这些数据,根据业务重要程度、寿命、当前可维护情况等对应用软件进行分析,从中选出再工程的修造者,合理地分配再工程所需要的资源。

2.文档重构

文档重构就是重新构建原本缺乏文档的应用系统的文档。根据应用系统的重要性和复杂性,可以选择对文档全部重构或维持现状。

老系统固有的特点是缺乏文档。具体情况不同,处理这个问题的方法也不同:

(1)建立文档非常耗费时间,不可能为数百个程序都重新建立文档。如果一个程序是相对稳定的,正在走向其有用生命的终点,而且可能不会再经历什么变化,那么,让它保持现状是一个明智的选择。

(2)为了便于今后的维护,必须更新文档,但是由于资源有限,应采用“使用时建文档”的方法,也就是说,不是一下子把某应用系统的文档全部都重建起来,而是只针对系统中当前正在修改的那些部分建立完整文档。随着时间流逝,将得到一组有用的和相关的文档。

(3)如果某应用系统是完成业务工作的关键,而且必须

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论