2020/2/9软件工程——软件维护一、软件维护的概念二、软件维护分类三、维护问题四、维护成本五、维护过程六、维护的副作用七、如何做好软件维护2020/2/9软件维护阶段覆盖了从软件交付使用到软件被淘汰为止的整个时期。软件的开发时间可能需要一、二年,甚至更短,但它的使用时间可能要经历几年或几十年。在软件开发过程中始终强调软件的可维护性。原因是,一个应用系统由于需求和环境的变化以及自身暴露的问题,在交付用户使用后,对它进行维护是不可避免的,统计和估测结果表明,信息技术中硬件费用一般占35%,软件占65%,而软件后期维护费用有时竟高达软件总费用的80%,所有前期开发费用仅占20%。软件维护一、软件维护的概念什么是软件维护是指软件系统交付使用以后,为了改正错误或满足新的需要而修改软件的过程国标GB/T11457-95给出如下定义在一软件产品交付使用后对其进行修改,以纠正故障;在一软件产品交付使用后对其进行修改,以纠正故障、改进其性能和其它属性,或使产品适应改变了的环境2020/2/9按照维护的起因分类四类:纠错性维护适应性维护完善性维护预防性维护二、软件维护分类1.纠错性维护(CorrectiveMaintenance)——为改正软件系统中潜藏的错误而进行的活动。纠错性维护是指在系统开发阶段已发生而系统测试阶段尚未发现的错误。这方面的维护工作量占整个维护工作量的17%-21%。所发现的错误有的不太重要,不影响系统的正常运行,其维护工作可随时进行;而有的错误非常重要,甚至影响整个系统的正常运行,其维护工作必须制定计划,进行修改,并且要进行复查和控制。这部分维护工作实际上就是软件系统运行过程中修改前期没有发现的bug,在修改旧bug过程中也可能会引入新的bug,这部分工作以后会成为新的纠错性维护工作。在软件开发过程中加强测试,可以有效减少这部分的维护工作。2020/2/92.适应性维护(AdaptiveMaintenance)——为适应软件运行环境的变化而修改软件的活动。适应性维护是指是软件适应信息技术变化和管理需求而进行的修改。这方面的维护工作量占整个维护工作量的18%-25%。由于目前计算机硬件价格的不断下降,各类系统软件层出不穷,人们常常为改善系统硬件环境和运行环境而产生系统更新换代的需求;企业的外部市场环境和管理需求的不断变化也使得各级管理人员不断提出新的信息需求。这些因素都将导致适应性维护工作的产生。2020/2/93.完善性维护(PerfectiveMaintenance)——根据用户在软件使用过程中提出的建设性意见而进行的维护活动。完善性维护是为扩充功能和改善性能而进行的修改,主要是指对已有的软件系统增加一些在系统分析和设计阶段中没有规定的功能与性能特征。这些功能对完善系统功能是非常必要的。另外,还包括对处理效率和编写程序的改进,这方面的维护占整个维护工作的50%-60%,比重较大,也是关系到系统开发质量的重要方面。完善性维护是软件维护工作的主要部分,触发这类维护工作的常常是用户业务交易增加了,或是业务流程改变了,需要修改软件;也可能是软件不能满足业务量要去,需要在性能上有所提高。2020/2/94.预防性维护(PreventiveMaintenance)——为了进一步改善软件系统的可维护性和可靠性,并为以后的改进奠定基础。预防性维护为了改进应用软件的可靠性和可维护性,为了适应未来的软硬件环境的变化,主动增加预防性的新的功能,以使应用系统适应各类变化而不被淘汰。这方面的维护工作占整个维护工作量的4%左右,是维护工作中占比最少的一部分工作。2020/2/9三、维护问题和软件维护有关的部分问题:理解别人的代码通常是非常困难的,而且难度随着软件配置成分的缺失而迅速增加需要维护的软件往往没有文档、或文档资料严重不足、或软件的变化未在相应的文档中反映出来2020/2/9当软件要求维护时,不能指望由原来的开发人员来完成或提供软件的解释。由于维护持续时间很长,因此当需要解释软件时候,往往开发人员已经不在附近了绝大多数软件在设计时没有考虑到将来的修改问题软件维护这项工作毫无吸引力。一方面是因为软件维护,看不到什么“成果”,但工作量很大,更重要的是维护工作难度大,软件维护人员经常遭受挫折。2020/2/9过去的二十年,软件维护的成本在不断增长。七十年代,一个信息系统机构用于软件维护的费用占其软件总预算的35~40%,八十年代接近60%。若维护方式没有大的改进,未来几年,许多大型软件公司可能要将其预算的80%用于软件系统的维护上。四、维护成本2020/2/9软件维护除费用外的无形代价包括维护活动占用了其他软件开发可用的资源,使资源的利用率降低一些修复或修改请求得不到及时安排,使得客户满意率下降维护的结果把一些新的潜在的错误引入软件,降低了软件质量将软件人员抽调到维护工作中,使得其它软件开发过程受到干扰2020/2/9维护的工作可划分成:生产性活动如,分析评价、修改设计、编写程序代码等非生产性活动如,程序代码功能理解、数据结构解释、接口特点和性能界限分析等2020/2/9在软件维护中,影响维护工作量的因素主要有以下六种:系统的大小系统规模越大,其功能就越复杂,软件维护的工作量也随之增大。程序设计语言使用功能强大的程序设计语言可以控制程序的规模。语言的功能越强,生成程序的模块化和结构化程度越高,所需的指令数就越少,程序的可读性越好。2020/2/9系统年龄系统使用时间越长,所进行的修改就越多,而多次的修改可能造成系统结构混乱。由于维护人员经常更换,程序变得越来越难于理解,加之系统开发时文档不齐全,或在长期的维护过程中文档在许多地方与程序实现不一致,从而使维护变得十分困难。数据库技术的应用使用数据库,可以简单而有效地存储、管理系统数据,还可以减少生成用户报表应用软件的维护工作量。2020/2/9先进的软件开发技术在软件开发过程中,如果采用先进的分析设计技术和程序设计技术,如面向对象技术、复用技术等,可减少大量的维护工作量。其它一些因素如应用的类型、数学模型、任务的难度、开关与标记、IF嵌套深度、索引或下标数等,对维护工作量也有影响。2020/2/9五、维护过程对于非纠错性维护,则首先判断维护类型,对适应性维护,按照评估后得到的优先级放入队列对于改善性维护,则还要考虑是否采取行动,如果接受申请,则同样按照评估后得到的优先级放入队列,如果拒绝申请,则通知请求者,并说明原因对于工作安排队列中的任务,由修改负责人依次从队列中取出任务,按照软件工程方法学规划、组织、实施工程。2020/2/9维护请求类型类型严重性评估后按优先级在队列排队救火行动,当排在队列之首评估后分类评估后按优先级在队列排队采取的行动通知请求者并说明原因按优先级在队列中排队从维护请求队列之首取出一任务按SE方法学规划、组织、实施工程队列中还有维护请求吗?资源用于开发新的软件。yn纠错性维护其他改善性维护适应性维护拒绝接受并不严重非常严重2020/2/92020/2/9六、维护的副作用软件修改是一项很危险的工作,对一个复杂的逻辑过程,那怕做一项微小的改动,都可能引入潜在的错误,虽然设计文档化和细致的测试有助于排除错误,但是维护仍然会产生副作用。一次修改5-10个语句,成功率50%;一次修改40-50个语句,成功的可能性20%;每纠正一个错误平均需修改17条指令。2020/2/9软件维护的副作用指,由于维护或在维护过程中其他一些不期望的行为引入的错误,副作用大致可分为三类:(1)代码副作用(2)数据副作用(3)文档的副作用2020/2/9(1)代码副作用—下面的修改最易引起副作用:①修改或删除子程序;②修改或删除语句标号;③修改或删除标识符;④为提高程序效率而做的修改;⑤修改逻辑操作符;⑥由设计变动引起的代码修改;⑦修改分支处的判断条件;2020/2/9(2)数据副作用数据副作用是由于修改数据结构带来的副作用。容易引起数据副作用的修改包括:①局部和全局常量的再定义;②记录或文件格式的再定义;③增减数据或是由于修改数据结构的定义导致数据结构长度的改变;④修改全局数据;⑤重新初始化控制标志和指针;⑥重新排列I/O表或子程序参数表。。2020/2/9(3)文档副作用由于程序修改而没有对文档进行相应的修改引起文档的副作用。1.爱上软件维护工作首先要认识软件维护工作在软件生命周期中的重要性,做维护工作虽然不能成为台前英雄,但却是个实实在在的幕后英雄。实际上很多所谓的开发人员所做的开发工作就为软件增加新功能,修改业务流程,这其实就是在做完善性维护工作。软件维护工作同样存在大量的挑战,同样需要创造性、灵活性、耐心、训练和良好的沟通。爱好是学习最好的老师,只要喜欢上软件维护工作,你就会在这一领域中发挥你的聪明才智,收获属于你的一片蓝天。七、如何做好软件维护2.熟悉软件系统熟悉所维护软件的功能是非常重要的,也是进行软件维护工作的第一步。首先阅读现有的文档,最好能对文档中提到的内容亲自进行测试。掌握现实中软件的使用方法,确保你要知道最常用的使用情形。有时候用户会要求提供一些已经存在的功能特性,只是因为他们不知道软件中已经具有了这些功能。最后只能研究代码了,试着去理解函数、模块和组件在软件中所扮演的角色。使用调试器单步执行程序中不同的分支,查看当代码的不同部分执行时将会发生什么。要把熟悉软件的体系结构当做一个持续进行的过程,而不是一次就能完成的事情。当你修改bug或添加新的特性时,可能对系统有更好的理解。以上过程一定要记录结果,这样对维护工作有巨大的帮助。3.与用户沟通与用户沟通是非常重要的。许多软件开发者都很内向,他们宁愿与技术打交道,也不愿意去与用户沟通。然而,软件就是为了人们使用才开发的。而且在软件的维护阶段,已经有用户使用我们的软件了。试着建立一个简单有效的机制,用于及时反馈用户提出的问题,即使我们不能立即解决这个问题,也要让用户知道我们正在处理这个问题,而没有怠慢他们。最后,要诚实的告诉他们问题的最新解决情况,如果由于某些原因不能满足他们的需求,也要及时告诉他么。4.保留修改记录有很多种保留修改记录的方法。最常见的方式是在每次提交代码前要进行注释说明,还有些人喜欢把修改的记录列表写到文件的顶部,在电子表格中保留一份修改列表也是和方便的。无论你采用哪种方式,一定要重视它。一份精确的修改记录对成功的维护工作来说是无价的。5.尽量保持程序原貌,避免重构在软件维护的很多时候,你会被某些模块中的代码弄得很沮丧。真想把这些代码删除后从头重写。事实上,无论何时我们对代码进行修改,不管是多么微小的修改,都存在引入新的bug的风险。避免重构,尽管在开发阶段重构是一项很有用的技术,但在软件的维护阶段,它可能只会给你带来麻烦。即使你使用重构没有破坏任何东西,至少也增加了维护记录的复杂度,使源代码管理系统中不同版本间的差别变大。6.重视测试测试永远是软件质量保证中重要的一环,当你接手软件的维护工作时,也许你需要做的第一件任务就是做测试。7.要有稳定的维护团队总之软件的安全运行离不开维护工作。软件维护工作有它有独特的魅力。谢谢大家2017年12月2020/2/9