软件工程教案7_第1页
软件工程教案7_第2页
软件工程教案7_第3页
软件工程教案7_第4页
软件工程教案7_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

第七章 软件维护一、复习要求1. 了解软件质量定义和软件质量度量。2. 了解软件维护的类型与策略。3. 了解软件维护的过程与管理方法。4. 了解可维护性的概念。5. 了解提高可维护性的方法。6. 了解软件逆向工程与再工程的概念二、内容提要1. 软件质量的概念(1) 软件质量的定义关于软件质量的定义,曾给出过多种定义。 ANSI/IEEE Std 729-1983定义软件质量为“与软件产品满足规定的和隐含的需求的能力有关的特征或特性的全体”。 M.J. Fisher 定义软件质量为“所有描述计算机软件优秀程度的特性的组合”。也就是说,为满足软件的各项精确定义的功能、性能需求,符合文档化的开发标准,需要相应地给出或设计一些质量特性及其组合,作为在软件开发与维护中的重要考虑因素。如果这些质量特性及其组合都能在产品中得到满足,则这个软件产品质量就是高的。软件质量反映了以下三方面的问题: 软件需求是度量软件质量的基础。不符合需求的软件就不具备质量。 规范化的标准定义了一组开发准则,用来指导软件人员用工程化的方法来开发软件。如果不遵守这些开发准则,软件质量就得不到保证。 往往会有一些隐含的需求没有显式地提出来。如软件应具备良好的可维护性。如果软件只满足那些精确定义了的需求而没有满足这些隐含的需求,软件质量也不能保证。软件质量是各种特性的复杂组合。它随着应用的不同而不同,随着用户提出的质量要求不同而不同。因此,有必要讨论各种质量特性,以及评价质量的准则,还要介绍为保证质量所进行的各种活动。图7.1 McCall质量模型框架质量特性(2) 软件质量特性与质量模型评价准则评价准则评价准则软件质量特性,反映了软件的本质。讨论一个软件的质量,问题最终要归结到定义软件的质量特性。而定义一个软件的质量,就等价于为该软件定义一系列质量特性。 度量度量度量人们通常把影响软件质量的特性用软件质量模型来描述。已有多种有关软件质量模型的方案。它们共同的特点是:把软件质量特性定义成分层模型。最基本的叫做基本质量特性,它可以由一些子质量特性定义和度量。子质量特性在必要时又可由它的一些子质量特性定义和度量。早在1976年,由Boehm等提出软件质量模型的分层方案。1979年McCall等人改进Boehm质量模型又提出了一种软件质量模型。模型的三层次式框架如图7.1所示。质量模型中的质量概念基于11个特性之上。而这11个特性分别面向软件产品的运行、修正、转移。它们与特性的关系如图7.2所示。McCall等认为,特性是软件质量的反映,软件属性可用做评价准则,定量化地度量软件属性可知软件质量的优劣。可维护性可测试性灵活性可移植性可复用性 互连性产品修正产品转移产品运行正确性 可靠性 效率 可使用性 完整性 图7.2 McCall软件质量模型McCall等人的质量特性定义如下:正 确 性在预定环境下,软件满足设计规格说明及用户预期目标的程度。它要求软件本身没有错误。可 靠 性软件按照设计要求,在规定时间和条件下不出故障,持续运行的程度。效 率为了完成预定功能,软件系统所需的计算机资源的多少。完 整 性为某一目的而保护数据,避免它受到偶然的或有意的破坏、改动或遗失的能力。可使用性对于一个软件系统,用户学习、使用软件及为程序准备输入和解释输出所需工作量的大小。可维护性为满足用户新的要求,或当环境发生了变化,或运行中发现了新的错误时,对一个已投入运行的软件进行相应诊断和修改所需工作量的大小。可测试性测试软件以确保其能够执行预定功能所需工作量的大小。灵 活 性修改或改进一个已投入运行的软件所需工作量的大小。可移植性将一个软件系统从一个计算机系统或环境移植到另一个计算机系统或环境中运行时所需工作量的大小。可复用性一个软件(或软件的部件)能再次用于其它应用(该应用的功能与此软件或软件部件的所完成的功能有关)的程度。互 连 性又称相互操作性。连接一个软件和其它系统所需工作量的大小。如果这个软件要联网或与其它系统通信或要把其它系统纳入到自己的控制之下,必须有系统间的接口,使之可以联结。对以上各个质量特性直接进行度量是很困难的,有些情况下甚至是不可能的。因此,McCall定义了一些评价准则,使用它们对反映质量特性的软件属性分级,以此来估计软件质量特性的值。软件属性一般分级范围从0 (最低)到10 (最高)。各评价准则定义如下。可跟踪性在特定的开发和运行环境下跟踪设计表示或实际程序部件到原始需求的(可追溯)能力。完 备 性软件需求充分实现的程度。一 致 性在整个软件设计与实现的过程中技术与记号的统一程度。安 全 性防止软件受到意外的或蓄意的存取、使用、修改、毁坏,或防止泄密的程度。容 错 性系统出错(机器临时发生故障或数据输入不合理)时,能以某种预定方式,做出适当处理,得以继续执行和恢复系统的能力。它又称健壮性。准 确 性能达到的计算或控制精度。它又称精确性。简 单 性在不复杂、可理解的方式下,定义和实现软件功能的程度。执行效率为了实现某个功能,提供使用最少处理时间的程度。存储效率为了实现某个功能,提供使用最少存储空间的程度。存取控制软件对用户存取权限的控制方式达到的程度。存取审查软件对用户存取权限的检查程度。操 作 性操作软件的难易程度。它通常取决于与软件操作有关的操作规程,以及是否提供有用的输入输出方法。易训练性软件辅助新的用户使用系统的能力。这取决于是否提供帮助用户熟练掌握软件系统的方法。它又称可培训性或培训性。简 明 性软件易读的程度。这个特性可以帮助人们方便地阅读本人或他人编制的程序和文档。它又称可理解性。模块独立性软件系统内部接口达到的高内聚、低耦合的程度。自描述性对软件功能进行自我说明的程度。亦称自含文档性。结 构 性软件能达到的结构良好的程度。文档完备性软件文档齐全、描述清楚、满足规范或标准的程度。通 用 性软件功能覆盖面宽广的程度。可扩充性软件的体系结构、数据设计和过程设计的可扩充的程度。可修改性软件容易修改,而不致于产生副作用的程度。自 检 性软件监测自身操作效果和发现自身错误的能力,又称工具性。机器独立性不依赖于某个特定设备及计算机而能工作的程度,又称硬件独立性。软件独立性软件不依赖于非标准程序设计语言特征、操作系统特征,或其它环境约束,仅靠自身能实现其功能的程度,又称自包含性。通信共享性使用标准的通信协议、接口和带宽的标准化的程度。数据共享性使用标准数据结构和数据类型的程度。通 信 性提供有效的IO方式的程度。正确性和容错性是相互补充的。正确的程序不一定是可容错的程序。反过来,可容错的程序不一定是完全正确的程序。我们要求一个可靠的软件应当在正常的情况下能够正确地工作;而在意外的情况下,也能做出适当的处理,隔离故障,尽快地恢复。这才是一个好的程序。此外,有人在灵活性中加了一个评价准则,叫做“可重配置特性”,它是指软件系统本身各部分的配置能按用户要求实现的容易程度。在简明性中也加了一个评价准则,即“清晰性”,它是指软件的内部结构、内部接口要清晰,人机界面要清晰。(3) ISO的软件质量评价模型ISO/IEC 9126-1991标准规定的软件质量模型由三层组成。在这个标准中,三层次中的第一层为称为质量特性,第二层称为质量子特性,第三层称为度量。如图7.3所示。该标准定义了6个质量特性,即功能性、可靠性、可维护性、效率、可使用性、可移植性;并推荐了21个子特性,如适合性、准确性、互操作性、依从性、安全性、成熟性、容错性、易恢复性、易理解性、易学习性、易操作性、时间特性、资源特性、易分析性、易变更性、稳定性、易测试性、适应性、易安装性、遵循性、易替换性,但不做为标准。用于评价质量子特性的度量没有统一的标准,由各使用单位视实际情况制定。(4) 软件质量特性之间的竞争在软件的质量特性与质量特性之间、质量特性与子特性之间存在着有利影响和不利影响,若用“”表示该质量特性对质量特性有有利影响;用“”表示该质量特性对质量特性有不利影响。 则有下面表7.1所示的关系。例如,由于效率的要求,应尽可能采用汇编语言。但是用汇编语言编制出的程序,可靠性、可移植性以及可维护性都很差。 在进行软件质量设计时,必须考虑利弊,全面权衡,根据质量需求,适当合理地选择设计质量特性,并进行评价。适合性准确性互操作性依从性安全性成熟性容错性易恢复性易理解性易学习性易操作性时间特性资源特性易分析性稳定性易变更性易测试性适应性易安装性遵循性易替换性度量由使用单位自行规定软件质量质量特性 质量特性 质量子特性 度量度量评价准则评价准则评价准则功能性可靠性可使用性效 率可维护性可移植性图7.3 ISO软件质量度量模型表7.1 各质量特性与质量特性之间的关系功能性可靠性可使用性效 率可维护性可移植性功能性可靠性可使用性效 率可维护性可移植性(5) 质量活动产品的高质量将导致成本的下降。质量活动开始于20世纪40年代E. Edwards Deming的开创性工作,由日本人发扬广大,他们开发了一种系统化的方法以从根本上消除造成产品缺陷的原因。1970年代到1980年代,他们的工作移植到西方,称为“全面质量管理(TQC)”。该活动采用的是4个步骤的过程: 开展:是一个连续的过程改进体系,其目的是开发一个看得见的可重复的和可度量的过程; 当然的质量:只有在前一步完成之后才可启动。这一步将检查影响过程的无形因素,并优化这些因素对过程的影响。例如,软件过程可能受到高层职员流动的影响,而这又是由于公司内部不断重组引起的。公司组织的稳定对于软件质量的提高有很大帮助,因此在这一步可以对公司的重组提出建议。 感性:意指“第五感觉”。这一步从过程转到用户身上。通过检查用户使用软件产品的情况,改进产品本身,并(潜在地)改进软件产品的生产过程。 有魅力的质量:通过观察产品在市场上的使用,寻找产品在相关领域发展的方向,从而开发出有预见性的新产品。2. 软件维护的概念(1) 软件维护的定义我们称在软件运行维护阶段对软件产品所进行的修改就是所谓的维护。要求进行维护的原因多种多样,归结起来有三种类型: 改正在特定的使用条件下暴露出来的一些潜在程序错误或设计缺陷; 因在软件使用过程中数据环境发生变化或处理环境发生变化,需要修改软件以适应这种变化。 用户和数据处理人员在使用时常提出改进现有功能,增加新的功能,以及改善总体性能的要求,为满足这些要求,就需要修改软件把这些要求纳入到软件之中。由这些原因引起的维护活动可以归为以下几类: 改正性维护在软件交付使用后,必然会有一部分隐藏的错误被带到运行阶段来。这些隐藏下来的错误在某些特定的使用环境下就会暴露出来。为了识别和纠正软件错误、改正软件性能上的缺陷、排除实施中的误使用,应当进行的诊断和改正错误的过程,就叫做改正性维护。 适应性维护随着计算机的飞速发展,外部环境(新的硬、软件配置)或数据环境(数据库、数据格式、数据输入输出方式、数据存储介质)可能发生变化,为了使软件适应这种变化,而去修改软件的过程就叫做适应性维护。 完善性维护在软件的使用过程中,用户往往会对软件提出新的功能与性能要求。为了满足这些要求,需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维护性。这种情况下进行的维护活动叫做完善性维护。在维护阶段的最初一、二年,改正性维护的工作量较大。随着错误发现率急剧降低,并趋于稳定,就进入了正常使用期。然而,由于改造的要求,适应性维护和完善性维护的工作量逐步增加。实践表明,在几种维护活动中,完善性维护所占的比重最大,来自用户要求扩充、加强软件功能、性能的维护活动约占整个维护工作的50。 图7.4 三类维护占总维护比例 图7.5 维护在软件生存期所占比例 预防性维护除了以上三类维护之外,还有一类维护活动,叫做预防性维护。这是为了提高软件的可维护性、可靠性等,为以后进一步改进软件打下良好基础。通常,预防性维护定义为:“把今天的方法学用于昨天的系统以满足明天的需要”。也就是说,采用先进的软件工程方法对需要维护的软件或软件中的某一部分(重新)进行设计、编制和测试。在整个软件维护阶段所花费的全部工作量中,预防性维护只占很小的比例,而完善性维护占了几乎一半的工作量。参看图7.4。从图7.5中可以看到,软件维护活动所花费的工作占整个生存期工作量的70%以上。(2) 影响维护工作量的因素在软件维护中,影响维护工作量的程序特性有以下6种。 系统大小:系统越大,理解掌握起来越困难。系统越大,所执行功能越复杂。因而需要更多的维护工作量。 程序设计语言:语言的功能越强,生成程序所需的指令数就越少;语言的功能越弱,实现同样功能所需语句就越多,程序就越大。有许多软件是用较老的程序设计语言书写的,程序逻辑复杂而混乱,且没有做到模块化和结构化,直接影响到程序的可读性。 系统年龄:老系统随着不断的修改,结构越来越乱;由于维护人员经常更换,程序又变得越来越难于理解。而且许多老系统在当初并未按照软件工程的要求进行开发,因而没有文档,或文档太少,或在长期的维护过程中文档在许多地方与程序实现变得不一致,这样在维护时就会遇到很大困难。 数据库技术的应用:使用数据库,可以简单而有效地管理和存储用户程序中的数据,还可以减少生成用户报表应用软件的维护工作量。 先进的软件开发技术:在软件开发时,若使用能使软件结构比较稳定的分析与设计技术,及程序设计技术,如面向对象技术、复用技术等,可减少大量的工作量。 其它:例如,应用的类型、数学模型、任务的难度、开关与标记、IF嵌套深度、索引或下标数等,对维护工作量都有影响。此外,许多软件在开发时并未考虑将来的修改,这就为软件的维护带来许多问题。(3) 软件维护的策略根据影响软件维护工作量的各种因素,针对三种典型的维护,James Martin等提出了一些策略,以控制维护成本。 改正性维护要生成100可靠的软件成本太高,不一定合算。但通过使用新技术,可大大提高可靠性,减少进行改正性维护的需要。这些技术包括:数据库管理系统、软件开发环境、程序自动生成系统、较高级(第四代)的语言,应用以上4种方法可产生更加可靠的代码。此外, 利用应用软件包,可开发出比由用户完全自己开发的系统可靠性更高的软件。 结构化技术,用它开发的软件易于理解和测试。 防错性程序设计。把自检能力引入程序,通过非正常状态的检查,提供审查跟踪。 通过周期性维护审查,在形成维护问题之前就可确定质量缺陷。 适应性维护这一类的维护不可避免,但可以控制。 在配置管理时,把硬件、操作系统和其它相关环境因素的可能变化考虑在内,可以减少某些适应性维护的工作量。 把与硬件、操作系统,以及其它外围设备有关的程序归到特定的程序模块中。可把因环境变化而必须修改的程序局部于某些程序模块之中。 使用内部程序列表、外部文件,以及处理的例行程序包,可为维护时修改程序提供方便。 完善性维护利用前两类维护中列举的方法,也可以减少这一类维护。特别是数据库管理系统、程序生成器、应用软件包,可减少系统或程序员的维护工作量。此外,建立软件系统的原型,把它在实际系统开发之前提供给用户。用户通过研究原型,进一步完善他们的功能要求,就可以减少以后完善性维护的需要。(4) 维护成本有形的软件维护成本是花费了多少钱,而其它非直接的的维护成本有更大的影响。例如,无形的成本可以是: 一些看起来是合理的修复或修改请求不能及时安排,使得客户不满意; 变更的结果把一些潜在的错误引入正在维护的软件,使得软件整体质量下降; 当必须把软件人员抽调到维护工作中去时,就使得软件开发工作受到干扰。软件维护的代价是在生产率方面的惊人下降。有报告说,生产率将降到原来的40分之一。维护工作量可以分成生产性活动(如分析和评价、设计修改和实现)和“轮转”活动(如力图理解代码在做什么、试图判明数据结构、接口特性、性能界限等)。下面的公式给出了一个维护工作量的模型: 其中,M是维护中消耗的总工作量,p是上面描述的生产性工作量,K是一个经验常数,c是因缺乏好的设计和文档而导致复杂性的度量,d是对软件熟悉程度的度量。这个模型指明,如果使用了不好的软件开发方法(未按软件工程要求做),原来参加开发的人员或小组不能参加维护,则工作量(及成本)将按指数级增加。3. 软件维护活动(1) 维护机构除了较大的软件开发公司外,通常在软件维护工作方面,不保持正式的维护机构。维护往往是在没有计划的情况下进行的。虽然不要求建立一个正式的维护机构,但是在开发部门,确立一个非正式的维护机构则是非常必要的。例如图7.6就是一个维护机构的组织方案。图7.6 软件维护的机构维护申请提交给一个维护管理员,他把申请交给某个系统监督员去评价。一旦做出评价,由修改负责人确定如何进行修改。在维护人员对程序进行修改的过程中,由配置管理员严格把关,控制修改的范围,对软件配置进行审计。维护管理员、系统监督员、修改负责人等,均代表维护工作的某个职责范围。修改负责人、维护管理员可以是指定的某个人,也可以是一个包括管理人员、高级技术人员在内的小组。系统监督员可以有其他职责,但应具体分管某一个软件包。在开始维护之前,就把责任明确下来,可以大大减少维护过程中的混乱。(2) 软件维护工作流程 先确认维护要求。这需要维护人员与用户反复协商,弄清错误概况以及对业务的影响大小,以及用户希望做什么样的修改。然后由维护组织管理员确认维护类型。 对于改正性维护申请,从评价错误的严重性开始。如果存在严重的错误,则必须安排人员,在系统监督员的指导下,进行问题分析,寻找错误发生的原因,进行“救火”性的紧急维护; 对于不严重的错误,可根据任务、机时情况、视轻重缓急,进行排队,统一安排时间。 对于适应性维护和完善性维护申请,需要先确定每项申请的优先次序。若某项申请的优先级非常高,就可立即开始维护工作,否则,维护申请和其它的开发工作一样,进行排队,统一安排时间。 尽管维护申请的类型不同,但都要进行同样的技术工作。这些工作有:修改软件需求说明、修改软件设计、设计评审、对源程序做必要的修改、单元测试、集成测试( 回归测试)、确认测试、软件配置评审等。 在每次软件维护任务完成后,最好进行一次情况评审,确认:在目前情况下,设计、编码、测试中的哪一方面可以改进?哪些维护资源应该有但没有?工作中主要的或次要的障碍是什么?从维护申请的类型来看是否应当有预防性维护?(3) 维护评价评价维护活动比较困难,因为缺乏可靠的数据。但如果维护记录做得比较好,就可以得出一些维护“性能”方面的度量值。可参考的度量值如: 每次程序运行时的平均出错次数; 花费在每类维护上的总“人时”数; 每个程序、每种语言、每种维护类型的程序平均修改次数; 因为维护,增加或删除每个源程序语句所花费的平均“人时”数; 用于每种语言的平均“人时”数; 维护申请报告的平均处理时间; 各类维护申请的百分比。这七种度量值提供了定量的数据,据此可对开发技术、语言选择、维护工作计划、资源分配、以及其它许多方面做出判定。因此,这些数据可以用来评价维护工作。4. 程序修改的步骤及修改的副作用(1) 分析和理解程序经过分析,全面、准确、迅速地理解程序是决定维护成败和质量好坏的关键。在这方面, 软件的可理解性和文档的质量非常重要。必须: 理解程序的功能和目标; 掌握程序的结构信息,即从程序中细分出若干结构成分。如程序系统结构、 控制结构、数据结构和输入输出结构等; 了解数据流信息,即所涉及到的数据来源何处,在哪里被使用; 了解控制流信息,即执行每条路径的结果; 理解程序的操作(使用)要求;为了容易地理解程序,要求自顶向下地理解现有源程序的程序结构和数据结构,为此可采用如下方法: 分析程序结构图: 分析各个过程的源代码,建立一个直接调用矩阵D或调用树。 建立过程的间接调用矩阵。 分析各个过程的接口,估计更改的复杂性。 数据跟踪 建立各层次的程序级上的接口图,展示各模块或过程的调用方式和接口参数; 利用数据流分析方法,对过程内部的一些变量进行跟踪;维护人员通过这种数据流跟踪,可获得有关数据在过程间如何传递,在过程内如何处理等信息。 控制跟踪控制流跟踪同样可在结构图基础上或源程序基础上进行。可采用符号执行或实际动态跟踪的方法,了解数据如何从一个输入源到达输出点的。 在分析的过程中,充分阅读和使用源程序清单和文档,分析现有文档的合理性。 充分使用由编译程序或汇编程序提供的交叉引用表、符号表、以及其它有用的信息。 如有可能,积极参加开发工作。(2) 修改程序对程序的修改,必须事先做出计划,有预谋地、周密有效地实施修改。 设计程序的修改计划程序的修改计划要考虑人员和资源的安排。修改计划的内容主要包括: 规格说明信息:数据修改、处理修改、作业控制语言修改、系统之间接口的修改等; 维护资源:新程序版本、测试数据、所需的软件系统、计算机时间等; 人员:程序员、用户相关人员、技术支持人员、厂家联系人、数据录入员等; 提供:纸面、计算机媒体等。针对以上每一项,要说明必要性、从何处着手、是否接受、日期等。通常,可采用自顶向下的方法,在理解程序的基础上,) 研究程序的各个模块、模块的接口、及数据库,从全局的观点,提出修改计划。) 依次地把要修改的、以及那些受修改影响的模块和数据结构分离出来。为此,要 识别受修改影响的数据; 识别使用这些数据的程序模块; 对于上面程序模块,按是产生数据、修改数据、还是删除数据进行分类; 识别对这些数据元素的外部控制信息; 识别编辑和检查这些数据元素的地方; 隔离要修改的部分;) 详细地分析要修改的、以及那些受变更影响的模块和数据结构的内部细节,设计修改计划,标明新逻辑及要改动的现有逻辑。) 向用户提供回避措施。用户的某些业务因软件中发生问题而中断,为不让系统长时间停止运行,需把问题局部化,在可能的范围内继续开展业务。可以采取的措施有: 在问题的原因还未找到时,先就问题的现象,提供回避的操作方法。 如果弄清了问题的原因,可通过临时修改或改变运行控制以回避在系统运行时产生的问题。 修改代码,以适应变化 正确、有效地编写修改代码; 要谨慎地修改程序,尽量保持程序的风格及格式,要在程序清单上注明改动的指令; 不要删除程序语句,除非完全肯定它是无用的; 不要试图共用程序中已有的临时变量或工作区,为了避免冲突或混淆用途,应自行设置自己的变量; 插入错误检测语句; 在修改过程中做好修改的详细记录,消除变更中任何有害的副作用(波动效应); 修改程序的副作用所谓副作用是指因修改软件而造成的错误或其它不希望发生的情况,有三种副作用: 修改代码的副作用。在使用程序设计语言修改源代码时,都可能引入错误。例如,删除或修改一个子程序、删除或修改一个标号、 删除或修改一个标识符、改变程序代码的时序关系、改变占用存储的大小、改变逻辑运算符、修改文件的打开或关闭、改进程序的执行效率,以及把设计上的改变翻译成代码的改变、为边界条件的逻辑测试做出改变时,都容易引入错误。 修改数据的副作用。在修改数据结构时,有可能造成软件设计与数据结构不匹配,因而导致软件出错。数据副作用就是修改软件信息结构导致的结果。例如,在重新定义局部的或全局的常量、 重新定义记录或文件的格式、增大或减小一个数组或高层数据结构的大小、修改全局或公共数据、重新初始化控制标志或指针、重新排列输入输出或子程序的参数时,容易导致设计与数据不相容的错误。数据副作用可以通过详细的设计文档加以控制。在此文档中描述了一种交叉引用,把数据元素、记录、文件和其它结构联系起来。 文档的副作用。对数据流、软件结构、 模块逻辑或任何其它有关特性进行修改时,必须对相关技术文档进行相应修改。否则会导致文档与程序功能不匹配,缺省条件改变,新错误信息不正确等错误。使得软件文档不能反映软件的当前状态。对于用户来说,软件事实上就是文档。如果对可执行软件的修改不反映在文档里,就会产生文档的副作用。例如,对交互输入的顺序或格式进行修改,如果没有正确地记入文档中,就可能引起重大的问题。过时的文档内容、索引和文本可能造成冲突,引起用户的失败和不满。因此,必须在软件交付之前对整个软件配置进行评审,以减少文档的副作用。为了控制因修改而引起的副作用,要做到:) 按模块把修改分组;) 自顶向下地安排被修改模块的顺序;) 每次修改一个模块;) 对于每个修改了的模块,在安排修改下一个模块之前,要确定这个修改的副作用。可以使用交叉引用表、存储映象表、执行流程跟踪等。(3) 重新验证程序在将修改后的程序提交用户之前,需要用以下的方法进行充分的确认和测试,以保证整个修改后的程序的正确性。 静态确认修改软件,伴随着引起新的错误的危险。为了能够做出正确的判断,验证修改后的程序至少需要两个人参加。要检查 修改是否涉及到规格说明? 修改结果是否符合规格说明? 有没有歪曲规格说明? 程序的修改是否足以修正软件中的问题? 源程序代码有无逻辑错误? 修改时有无修补失误? 修改部分对其它部分有无不良影响(副作用)?对软件进行修改,常常会引发别的问题,因此有必要检查修改的影响范围。 计算机确认在充分进行了以上确认的基础上,要用计算机对修改程序进行确认测试: 确认测试顺序:先对修改部分进行测试,然后隔离修改部分,测试程序的未修改部分,最后再把它们集成起来进行测试。这种测试称为回归测试。 准备标准的测试用例。 充分利用软件工具帮助重新验证过程。 在重新确认过程中,需邀请用户参加。 维护后的验收在交付新软件之前,维护主管部门要检验: 全部文档是否完备,并已更新; 所有测试用例和测试结果已经正确记载; 记录软件配置所有副本的工作已经完成; 维护工序和责任已经确定。从维护角度来看所需测试种类如: 对修改事务的测试; 对修改程序的测试; 操作过程的测试; 应用系统运用过程的测试; 使用过程的测试; 系统各部分之间接口的测试; 作业控制语言的测试; 与系统软件接口的测试; 软件系统之间接口的测试; 安全性测试; 后备恢复过程的测试。5. 软件可维护性(1) 软件可维护性的定义所谓软件可维护性,是指纠正软件系统出现的错误和缺陷,以及为满足新的要求进行修改、扩充或压缩的容易程度。可维护性、可使用性、可靠性是衡量软件质量的几个主要质量特性,也是用户十分关心的几个方面。可惜的是影响软件质量的这些重要因素,目前尚没有对它们定量度量的普遍适用的方法。但是就它们的概念和内涵来说则是很明确的。软件的可维护性是软件开发阶段各个时期的关键目标。目前广泛使用的是用如下的七个特性来衡量程序的可维护性。而且对于不同类型的维护,这七种特性的侧重点也不相同。表7.2显示了在各类维护中应侧重哪些特性。图中的“”表示需要的特性。 表7.2 在各类维护中的侧重点 改正性维护 适应性维护 完善性维护 可理解性 可测试性 可修改性 可 靠 性 可移植性 可使用性 效 率 上面所列举的这些质量特性通常体现在软件产品的许多方面,为使每一个质量特性都达到预定的要求,需要在软件开发的各个阶段采取相应的措施加以保证。因此,软件的可维护性是产品投入运行以前各阶段面向上述各质量特性要求进行开发的最终结果。(2) 可维护性的度量人们一直期望对软件的可维护性做出定量度量,但要做到这一点并不容易。许多研究工作集中在这个方面,形成了一个引人注目的学科软件度量学。下面我们介绍度量一个可维护的程序的七种特性时常用的方法。这就是质量检查表、质量测试、质量标准。质量检查表是用于测试程序中某些质量特性是否存在的一个问题清单。评价者针对检查表上的每一个问题,依据自己的定性判断,回答“Yes”或者“No”。质量测试与质量标准则用于定量分析和评价程序的质量。由于许多质量特性是相互抵触的,要考虑几种不同的度量标准,相应地去度量不同的质量特性。 可理解性可理解性表明人们通过阅读源代码和相关文档,了解程序功能及其如何运行的容易程度。一个可理解的程序主要应具备以下一些特性:模块化(模块结构良好、功能完整、简明),风格一致性(代码风格及设计风格的一致性),不使用令人捉摸不定或含糊不清的代码,使用有意义的数据名和过程名,结构化,完整性(对输入数据进行完整性检查)等。用于可理解性度量的检查表的内容有:程序是否模块化? 结构是否良好?每个模块是否有注释块,说明程序的功能、主要变量的用途及取值、所有调用它的模块、以及它调用的所有模块?在模块中是否有其它有用的注释内容,包括输入输出、精确度检查、限制范围和约束条件、假设、错误信息、程序履历等?在整个程序中缩进和间隔的使用风格是否一致?在程序中每一个变量,过程是否具有单一的有意义的名字?程序是否体现了设计思想?程序是否限制使用一般系统中没有的内部函数过程与子程序?是否能通过建立公共模块或子程序来避免多余的代码?所有变量是否是必不可少的?是否避免了把程序分解成过多的模块、函数或子程序?程序是否避免了很难理解的、非标准的语言特性? 对于可理解性,可以使用一种叫做“9010测试”的方法来衡量。即把一份被测试的源程序清单拿给一位有经验的程序员阅读10分钟,然后把这个源程序清单拿开,让这位程序员凭自己的理解和记忆,写出该程序的90。如果程序员真的写出来了,则认为这个程序具有可理解性,否则这个要重新编写。 可靠性可靠性表明一个程序按照用户的要求和设计目标,在给定的一段时间内正确执行的概率。关于可靠性,度量的标准主要有:平均失效间隔时间MTTF(Mean Time To Failure)、平均修复时间MTTR(Mean Time To Repair error)、有效性A( = MTBD(MTBD+MDT)。度量可靠性的方法,主要有两类: 根据程序错误统计数字,进行可靠性预测。常用方法是利用一些可靠性模型,根据程序测试时发现并排除的错误数预测平均失效间隔时间MTTF。 根据程序复杂性,预测软件可靠性。用程序复杂性预测可靠性,前提条件是可靠性与复杂性有关。因此可用复杂性预测出错率。程序复杂性度量标准可用于预测哪些模块最可能发生错误,以及可能出现的错误类型。了解了错误类型及它们在哪里可能出现,就能更快地查出和纠正更多的错误,提高可靠性。用于可靠性度量的检查表的内容有:程序中对可能出现的没有定义的数学运算是否做了检查?如除以“0”。循环终止和多重转换变址参数的范围,是否在使用前做了测试?下标的范围是否在使用前测试过?是否包括错误恢复和再启动过程?所有数值方法是否足够准确?输入的数据是否检查过?测试结果是否令人满意?大多数执行路径在测试过程中是否都已执行过?对最复杂的模块和最复杂的模块接口,在测试过程中是否集中做过测试?测试是否包括正常的、特殊的和非正常的测试用例?程序测试中除了假设数据外,是否还用了实际数据?为了执行一些常用功能,程序是否使用了程序库? 可测试性可测试性表明论证程序正确性的容易程度。程序越简单,证明其正确性就越容易。而且设计合用的测试用例,取决于对程序的全面理解。因此,一个可测试的程序应当是可理解的,可靠的,简单的。用于可测试性度量的检查表的内容有:程序是否模块化?结构是否良好?程序是否可理解?程序是否可靠?程序是否能显示任意的中间结果?程序是否能以清楚的方式描述它的输出?程序是否能及时地按照要求显示所有的输入?程序是否有跟踪及显示逻辑控制流程的能力?程序是否能从检查点再启动?程序是否能显示带说明的错误信息?对于程序模块,可用程序复杂性来度量可测试性。程序的环路复杂性越大,程序的路径就越多。因此,全面测试程序的难度就越大。 可修改性可修改性表明程序容易修改的程度。一个可修改的程序应当是可理解的、通用的、灵活的、简单的。其中,通用性是指程序适用于各种功能变化而无需修改。灵活性是指能够容易地对程序进行修改。测试可修改性的一种定量方法是修改练习。其基本思想是通过做几个简单的修改,来评价修改的难度。设C是程序中各个模块的平均复杂性,n是必须修改的模块数,A 是要修改的模块的平均复杂性。 则修改的难度D由下式计算: D = AC对于简单的修改,若D1,说明该程序修改困难。A和C 可用任何一种度量程序复杂性的方法计算。用于可修改性度量的检查表的内容有:程序是否模块化?结构是否良好?程序是否可理解?在表达式、数组表的上下界、输入输出设备命名符中是否使用了预定义的文字常数?是否具有可用于支持程序扩充的附加存储空间?是否使用了提供常用功能的标准库函数?程序是否把可能变化的特定功能部分都分离到单独的模块中?程序是否提供了不受个别功能发生预期变化影响的模块接口?是否确定了一个能够当做应急措施的一部分,或者能在小一些的计算机上运行的系统子集?是否允许一个模块只执行一个功能?每一个变量在程序中是否用途单一?能否在不同的硬件配置上运行?能否以不同的输入输出方式操作?能否根据资源的可利用情形,以不同的数据结构或不同的算法执行? 可移植性可移植性表明程序转移到一个新的计算环境的可能性的大小。或者它表明程序可以容易地、有效地在各种各样的计算环境中运行的容易程度。一个可移植的程序应具有结构良好、灵活、不依赖于某一具体计算机或操作系统的性能。用于可移植性度量的检查表的内容有:是否是用高级的独立于机器的语言来编写程序? 是否是用广泛使用的标准化的程序设计语言来编写程序,且是否仅使用了这种语言的标准版本和特性?程序中是否使用了标准的普遍使用的库功能和子程序?程序中是否极少使用或根本不使用操作系统的功能?程序中数值计算的精度是否与机器的字长或存储器大小的限制无关?程序在执行之前是否初始化内存?程序在执行之前是否测定当前的输入输出设备? 程序是否把与机器相关的语句分离了出来,集中放在了一些单独的程序模块中,并有说明文档?程序是否结构化? 并允许在小一些的计算机上分段(覆盖)运行?程序中是否避免了依赖于字母数字或特殊字符的内部位表示,并有说明文件? 效率效率表明一个程序能执行预定功能而又不浪费机器资源的程度。这些机器资源包括内存容量、外存容量、通道容量和执行时间。用于效率度量的检查表的内容有:程序是否模块化?结构是否良好?程序是否具有高度的区域性(与操作系统的段页处理有关)?是否消除了无用的标号与表达式,以充分发挥编译器优化作用?程序的编译器是否有优化功能?是否把特殊子程序和错误处理子程序都归入了单独的模块中?在编译时是否尽可能多地完成了初始化工作?是否把所有在一个循环内不变的代码都放在了循环外处理?是否以快速的数学运算代替了较慢的数学运算?是否尽可能地使用了整数运算,而不是实数运算?是否在表达式中避免了混合数据类型的使用,消除了不必要的类型转换?程序是否避免了非标准的函数或子程序的调用?在几条分支结构中,是否最有可能为“真“的分支首先得到测试?在复杂的逻辑条件中,是否最有可能为“真“的表达式首先得到测试? 可使用性从用户观点出发,把可使用性定义为程序方便、实用、及易于使用的程度。一个可使用的程序应是易于使用的、能允许用户出错和改变,并尽可能不使用户陷入混乱状态的程序。用于可使用性度量的检查表的内容有:) 程序是否具有自描述性?例如,是否有适应不同读者,并附有实例的程序使用说明?是否有交互形式的Help功能?是否一有请求,就能对每一个操作方式作出解释?用户能否很快熟悉程序的使用而无需他人的帮助?是否一有请求,就能很容易地获得当前程序状态信息?) 程序是否能始终如一地按照用户的要求运行?例如,程序是否有句法上统一的命令语言和错误信息格式?通过尽量缩小响应时间的差异,程序在相似的条件下,其表现是否也相似?) 程序是否让用户对数据处理有一个满意的和适当的控制?例如,程序在交互方式运行时,能否控制中止一项任务,开始或恢复另一项任务?在没有副作用的情形下,程序是否允许处理作废?程序是否允许用户查看后台处理?程序是否有一种易懂的命令语言并允许通过命令组合建立宏指令?程序能否在一旦用户有要求时提供提示信息,帮助用户使用系统?程序能否提供可理解的、非危险性的错误信息?) 程序是否容易学会使用?例如,程序是否不需要专门的数据处理知识就能使用?对输入格式、要求和限制的解释是否完整和清楚?在交互系统中,用户输入是否在菜单指示支持下进行?程序是否提供带有纠错提示的错误信息?对交互式系统,是否有“联机“手册? 对批处理系统,手册是否容易得到?手册是否是用用户术语写的?)程序是否使用数据管理系统来自动地处理事务性工作和管理格式化、地址分配及存储器组织。) 程序是否具有容错性?例如,程序是否容忍典型的输入打字错误?当输入动作需要重复时,程序能否接受简化输入?命令能否简写?程序能否验证输入的数据?) 程序是否灵活?例如,程序是否允许以自由形式输入?程序是否可以重复使用而无须对输入值做过多的说明?对用户而言,是否有各种不同的输出选择?程序是否可以针对所选择的运行方式,删除不必要的输入、计算和输出?程序是否允许用户扩充命令语言?程序是否可移植?程序是否允许用户定义自己的功能集和特性集?程序能否以子集形式出现?程序是否允许有经验的用户使用运行较快的版本、简写命令、缺省值等, 而让没有经验的用户使用运行较慢的版本,并提供求助命令及监控能力等。 其它间接定量度量可维护性的方法Gilb提出了与软件维护期间工作量有关的一些数据,可以使用它们间接地对软件的可维护性做出估计。 问题识别的时间; 收集维护工具的时间; 分析、诊断问题的时间; 具体的改错或修改的时间; 局部测试的时间; 集成或回归测试的时间; 修改规格说明的时间; 维护的评审时间; 因管理活动拖延的时间; 恢复时间。这些数据反映了维护全过程中检错纠错验证的周期,即从检测出软件存在的问题开始至修正它们并经回归测试验证这段时间。可以粗略地认为,这个周期越短,维护越容易。6. 提高可维护性的方法(1) 建立明确的软件质量目标和优先级一个可维护的程序应是可理解的、可靠的、可测试的、可修改的、可移植的、效率高的、可使用的。但要实现这所有的目标,需要付出很大的代价,而且也不一定行得通。因为某些质量特性是相互促进的,例如可理解性和可测试性、可理解性和可修改性。但另一些质量特性却是相互抵触的,例如效率和可移植性、效率和可修改性等。因此,尽管可维护性要求每一种质量特性都要得到满足,但它们的相对重要性应随程序的用途及计算环境的不同而不同。所以,应当对程序的质量特性,在提出目标的同时还必须规定它们的优先级。这样有助于提高软件的质量,并对软件生存期的费用产生很大的影响。(2) 使用提高软件质量的技术和工具 模块化模块化是软件开发过程中提高软件质量,降低成本的有效方法之一。也是提高可维护性的有效的技术。它的优点是如果需要改变某个模块的功能,则只要改变这个模块,对其它模块影响很小;如果需要增加程序的某些功能,则仅需增加完成这些功能的新的模块或模块层;程序的测试与重复测试比较容易;程序错误易于定位和纠正;容易提高程序效率。 结构化程序设计结构化程序设计不仅使得模块结构标准化,而且将模块间的相互作用也标准化了。因而把模块化又向前推进了一步。采用结构化程序设计可以获得良好的程序结构。 使用结构化程序设计技术,提高现有系统的可维护性 采用备用件的方法当要修改某一个模块时,用一个新的结构良好的模块替换掉整个模块。这种方法要求了解所替换模块的外部(接口)特性,可以不了解其内部工作情况。它有利于减少新的错误,并提供了一个用结构化模块逐步替换掉非结构化模块的机会。 采用自动重建结构和重新格式化的工具(结构更新技术)这种方法采用如代码评价程序、重定格式程序、结构化工具等自动软件工具,把非结构化代码转换成良好结构代码。 改进现有程序的不完善的文档改进和补充文档的目的是为了提高程序的可理解性,以提高可维护性。 使用结构化程序设计方法实现新的子系统。 采用结构化小组程序设计的思想和结构文档工具软件开发过程中,建立主程序员小组,实现严格的组织化结构,强调规范,明确领导以及职能分工,能够改善通信、提高程序生产率;在检查程序质量时,采取有组织分工的结构普查,分工合作,各司其职,能够有效地实施质量

温馨提示

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

评论

0/150

提交评论