摘要:软件工程最重要的研究内容之一就是软件维护,软件维护也是软件生存期中时间最长,消耗人力最多的一个阶段。当前,软件的可维护性越来越受到业界的重视,已经成为衡量一个软件产品是否成功的重要标准。
关键词:软件维护;软件可维护性;维护途径
编程大师曾说过:“哪怕程序只有三行长,总有一天你也不得不对它进行维护。”软件是一种商品,从它被生产出来的那一天开始,软件维护的问题也就应运而生。任何一种产品出售以后,用户在使用的过程中总会发现新的问题,这就像软件维护一样,一个新的应用软件交付到客户手中,除了发现一些在软件测试阶段没有发现的错误外,在使用过程中不同的用户、不同的运行环境都会促使客户对软件不断提出新的要求,这就是软件维护。软件维护的工作量占据了软件生命周期的70%以上,因此,如何减少软件维护的工作量,降低软件维护成本,提高软件的可维护性就成了提高软件维护效率和质量的关键。
一、软件维护概述
1.软件维护的定义
软件维护是软件生命周期中的最后一个阶段也是最重要的历时最长的一个阶段,处于系统投入生产运行以后的时期。而软件维护又与普通的商品维护不一样,因为软件产品在重复使用的过程中不会像车辆、电器那样有磨损,所谓软件维护,就是指软件系统交付使用以后,为了改正软件运行错误,或者为了满足新的需求而加入新功能的修改软件的过程。[1]
2.软件维护的分类
一般来说,需要对软件进行维护的原因大致有以下几种:改正原程序中的错误和缺陷;改进原设计以适应新的软、硬件环境需要;增加软件的应用范围等。根据软件维护的不同原因,一般将软件维护划分为以下四类:(1)纠错性维护(CorrectiveMaintenance)。软件开发时,由于技术的限制,没有一种可以检测出所有错误的测试技术,必然有一部分潜在的隐藏错误被带到运行阶段,用户在使用软件时会发现在前期的测试时没有检测出来的潜在错误,这种对软件中存在的错误进行修改和维护的活动称为纠错性维护。纠错性维护约占整个维护工作总量的21%左右。(2)适应性维护(AdaptiveMaintenance)。由于操作系统或编译系统的升级,为了使软件能适应新的软硬件环境而对软件进行修改的活动称为适应性维护。适应性维护约占整个维护工作总量的25%左右。(3)完善性维护(PerfectiveMaintenance)。在软件的使用过程中,用户往往会对软件提出新的功能与性能要求,为了满足这些要求而对软件进行修改为产生的活动称为完善性维护。完善性维护的工作量较大,约占整个维护工作总量的50%左右。(4)预防性维护(PreventiveMaintenance)。预防性维护即软件再工程,为了提高软件的可维护性和可靠性,为未来的进一步改进打下基础而修改软件的活动[2][3]。通常来说,在软件交付使用初期的磨合阶段,纠错性维护所占比例较大,随着错误逐渐被修正、消除,并趋于稳定后软件就进入正常的使用期。然而由于环境的变化和客户的新需求,适应性维护和完善性维护的工作量逐渐增加,实践表明,大部分的维护工作都是完善性维护,因为软件维护不仅仅局限于故障和错误的校正,维护很大一部分是处理新的或者变化的用户需求。
3.软件维护的费用
软件维护是软件生命周期中耗费最多,延续时间最长的活动。通常软件维护的费用占整个软件开发费用的55%—70%,并且所占比例在逐年上升。根据软件行业统计,1970年软件维护费约占软件开发费用的40%,到1990年维护费用的比例就超过了70%。有的大型软件的维护费用甚至会达到开发费用原来的40—50倍,例如:1976年Gansler报告说,美国***对空***飞行控制软件的一项研究表明,每条指令的开发费用约为75美元,而维护费竟达到4000美元/指令。B.Boehm在1979年报导,某大型软件每行费用约为:开发25美元,维护1000美元[4]。
二、软件的可维护性
在软件开发过程中始终强调软件的可维护性。原因是因为一个应用系统由于需求和环境的变化以及自身暴露的问题,在交付用户使用后,对它进行维护是不可避免的,许多大型软件公司为维护已有软件耗费大量人力、财力。
许多软件的维护十分困难,原因在于这些软件开发时没有严格按照软件工程的规范和标准,在维护时也没有按照规范认真填写维护申请单和修改报告单,例如:文档不全、质量差、开发过程不注意采用结构化方法,忽视程序设计风格等。因此造成软件维护工作量增加,成本上升,修改出错率升高,许多软件维护要求并不是因为程序出错而提出的,而是为适应环境的变化或需求提出的,为了使得软件能够易于维护,必需考虑软件的可维护性。软件的可维护性是指软件能够被理解,并能纠正软件系统出现的错误和缺陷,以及为满足新的要求进行修改、扩充或压缩的容易程度[5]。一个软件的可维护性又取决于以下几个属性:可理解性、可修改性、可测试性、可靠性、可移植性、可适用性与效率。
三、软件维护的困难
1、软件维护人员变动。软件维护是一个长期的过程,当软件需要维护时,维护者首先要对软件各个阶段的文档和代码进行分析、理解,在大多数情况下,软件维护工作并不是由软件的设计和开发人员来完成,而是由一个专门的维护机构承担,因为软件交付使用以后,开发人员就会开始新产品的研发,无暇顾及软件的维护工作,维护工作就交到专门的维护团队,但是理解别人的源程序是非常困难的,如果文档不全,或仅有程序无文档,难度则更大。
2、未严格遵守软件开发标准。由于有的软件在设计时没有考虑到将来会修改,未使用统一的编程语言也没有按模块***设计原理进行设计,因此这种软件的维护既困难也易出错,软件生命周期越长越难维护。
3、文档缺失、不充分或过期。主要表现在各类文档之间的不一致、文档与程序之间的不一致性以及文档缺失,从而导致维护人员不知如何进行修改和维护,加大了维护的难度。造成这种情况的原因是开发过程和维护过程中文档管理不善引起的,开发测试中经常会出现修改了程序而忘记修改相关文档,或者是修改了某个文档而没有修改与之相关的文档。
4、软件维护工作本身不具备吸引力。开发组人员通常承担这软件系统的初期维护,因为他们对软件最熟悉,维护起来最方便,然而当软件转入正常使用后,开发人员就会被分配去承担其他新产品的研发,这样开发人员就可以集中精力做好开发工作,所以维护工作就由专门的维护机构承担而非开发人员。软件维护工作是一项难出成果、经常受挫,大家都不愿意干的工作。高水平的维护人员程序员不愿意去做维护工作,而专门维护人员又不甘心长期从事软件维护工作。这样就造成了维护人员不断更换,影响了软件的可维护性。
四、提高软件可维护性的途径软件的可维护性越高软件的生命周期就越长,提高软件的可维护性,最根本的就是让所有的程序员知道维护的重要性,以在各个阶段减少维护工作量为目标而展开工作。
1、专业训练有素的软件开发人员。一个专业的软件开发人员除了具备最基本的软件编程技能外,还需拥有足够多的系统知识和应用领域的知识,以及对源代码的基本原理认识。除此之外还需具备较强的逻辑思维能力,因为逻辑思维好的开发人员编写的代码会让后期程序维护人员在阅读文档时更容易理解。
2、可理解的系统结构设计。首先系统的设计必须采用模块化和结构化的设计,每个模块都应具有***的功能,需要满足高内聚、低耦合的原则。因为如果系统最初设计得不可理解,随着时间的推移,系统也会变得更难以维护,但是如果采用可理解的结构设计,就可以帮助维护人员进行维护。因为结构化设计不仅可以使得模块结构标准化,还可以将模块化间的相互作用也标准化,可以的得到良好的程序结构。
3、标准化的程序设计语言。程序设计语言的选择,直接影响到软件的维护,因为语言的功能越强,生成程序的模块化和结构化程度越高,所需的指令数就越少,程序的可读性越好。源代码都必须具有良好的结构,所有代码都必须文档化。一般来说,第4代开发工具和高级语言程序比汇编语程序更容易理解。
5、结构化的文档。软件维护人员在维护软件时只能通过阅读、理解和分析源代码来了解系统的功能、结构、设计模式等,如果没有这些结构化文档就会给维护带来困难,要弄清某个系统就必须花费大量的人力和物力,这样势必影响到软件的可维护性。因此需要及时创建各个阶段的文档,文档的设计风格也要简洁一致,及时更新完善相关文档,固定存放文档。为今后维护工作提供帮助。
6、软件维护管理。程序员更倾向于从事软件开发而是从事软件维护,为了保证软件维护人员的稳定性,可以定期安排软件人员开发任务和维护任务的轮换。这样可以使软件人员体会到开发和维护工作的具体要求、开发和维护的关系,有利于软件人员的技术水平和软件系统的质量。
五、结束语
软件维护是软件生命周期的最后阶段,也是历时最长最重要的阶段,软件维护除了在前期开发、需求分析、软件设计、语言选择、软件测试、软件复用各个阶段严格把关外,在软件维护阶段更为重要,最后要指出的是不仅在开发时期要尽量提高软件的可维护性,在维护时期也要继续采取正确的方法,编好有关的文档,每个维护人员都要知道,正如你要维护别人开发的软件一样,很可能还有别人要维护你维护过的软件。(作者单位:云南师范大学信息学院)
参考文献:
[1]许家珆,白忠建,吴磊.软件工程—理论与实践(第2版)[M],2009.
[2]刘新航.软件工程与项目管理案例教程[M],北京大学出版社,2009.
[3]李东生,崔冬华,李爱萍等.软件工程——原理、方法和工具[M],机械工业出版社,2009.
[4]史济民,顾春华,李昌武,苑荣.软件工程—原理、方法与应用(第二版)[M].高等教育出版社,2004.
[5]郑炜,朱怡安.软件工程[M].西北工业大学出版社,2010.