软件再工程及其应用谷耀(天津市信息中心)摘要本文从软件在运行维护阶段经常遇到的维护困难大、费用高,已开发的软件需要移植等问题出发,介绍了软件再工程(Reengineering)的基本内容和相关技术,并通过国外的应用实例说明再工程对提高软件生产率的重要作用。
关键词软件工程、软件再工程为了建立各类信息系统,人们很重视软件开发过程,提出了多种软件加工模型,如瀑布模型、快速原型模型等,并研制了支持这些模型的软件开发环境和软件开发工具。
这类开发环境和工具的应用对于辅助软件开发人员缩短软件开发周期,提高软件生产效率和质量起到了不可低估的作用。
但是,目前多数开发环境和开发工具是为了支持开发新的应用软件而设计的,对于那些已投入运行的软件系统的维护与移植并没有带来多少帮助。
1.问题的提出根据软件生存周期的概念,一个软件投入运行只是标志开发阶段的结束,而非软件生存周期的终止。
软件进入运行维护阶段经常会遇到如下问题:1)软件维护费用高。
一般来讲软件运行维护阶段是其整个生存周期中持续时间最长的阶段,只要软件仍在使用,其维护工作就不会终止。
据统计,软件维护费用在整个生存期中所占的比例逐渐增长,七十年代35-40% ,八十年代占40一60% ,估计九十年代会上升到70%。
美国空军的一软件项目,其开发费用为每行源程序75美元,而维护费用达到每行源程序400美元。
2)软件维护难度大。
软件难以维护主要反映在以下几个方面:a.被维护软件文档不齐、质量差,或自投入运行后程序已经过多次修改,而文档资料并未随之更新;b.早期开发的软件采用的是非结构化设计方法,原有软件结构不良或经过多次修补使其组织结构变得模糊不清;c.在软件开发阶段缺乏对软件的可维护性的考虑,软件的可理解性、可扩充性差;d.由于维护工作中考虑不周,在改正原有错误的同时又给软件引入了新的问题,即产生了波及影响;e.软件系统规模很大时,系统复杂,理解工作费时费力。
3)软件资产数额巨大。
随着计算机的广泛应用,正在使用和正在开发的软件数量与日俱增。
据估计,美国正在使用的软件已超过一千亿行源代码。
这些软件中的大部分生存期需要延长,不仅要保障正常运行,还要根据环境的变化扩充功能,改善性能,同时随着信息技术的不断进步,许多现有系统要适时地移植到性能更为强大、符合国际标准的软硬件平台上,继续为用户创造效益,正是为了解决软件在运行维护阶段所遇到的种种问题,近年来人们提出了软件再工程(Reengineering)的概念。
2.再工程的基本概念软件再工程是对现有软件系统进行验证、评价,重新设计构造成为一个新的形式并加以实现,使其满足新的需要和/或适合于新的运行环境的软件工程活动。
2.1再工程主要应用范围在软件系统的使用过程中,其运行的内、外部环境可能发生不同程度的变化。
软件再工程可以充分利用和改造现有软件以适应这些变化,避免因重新开发软件而造成时间、人力及软件资源的浪费。
再工程主要应用于:1)改进软件的可维护性。
在软件仍可满足原规格设计说明书所规定的功能、性能的条件下,因原有程序结构不良,文档不齐、不精确,或经过多次修改致使结构不清、有冗余、死码,文档与实际系统不一致等原因造成进一步的维护困难,通过文档再编制(re-documentation)和重构(re-structuring)等再工程活动使得文档齐备、精确,程序结构清晰,有利于系统继续正常运行与维护。
2)增强功能,改进性能。
在原有软件不能满足当前的要求,用户需求超出原规格设计说明书所确定的范围的情况下,可通过再工程对原有软件进行再设计以适应用户需求。
这实际是软件版本的改进和升级。
3)软件移植。
在原有软件系统的业务处理规则、基本算法等仍基本适用的条件下,由于原有支持系统运行的内部环境——硬件、系统软件等不能满足目前的要求或不符合新的标准规范(如非开放系统) ,不宜继续支持系统正常运行,就需将原系统移植到新的平台上(如计算机系统、操作系统、DBMS、网络系统等)。
4)系统开发。
在需要开发与己有的、经实践证明是成功的软件系统相类似的软件时,可以直接利用或稍作修改就可利用已有系统的程序代码、设计说明和规格说明,这样会大大提高软件生产率,缩短开发周期,保证软件质量并能节省开发经费。
2.2再工程活动类型级别根据用户对现有软件改进要求的不同,再工程活动一般可分为系统级、数据级和源程序级三个层次。
1)系统级: 是对现有应用系统的功能规格说明进行再设计。
这需要全面恢复系统的原有功能规格说明和设计说明,在此基础上根据应用要求修改设计,重新产生可执行程序。
2)数据级: 从现有文件/数据库的物理定义中产生概念与逻辑设计文档,并将这些文档转换成适合新要求的数据结构,有可能的话,同时产生访问这些文件/数据库的程序。
3)程序级: 从现有软件的源程序(或经过反编译工具产生的源程序)中提取出设计说明,经过修改设计,再进行相反的转换。
这样做可避免源程序与设计说明的不一致性,同时还降低了详细设计的要求。
源程序级的再工程活动可看作是再编码(ecoding)工作,可以将结构化不良的语言(如BASIC语言)转化为结构化语言(如PASCAL语言等) ,将3GL过程性语言转换成4GL非过程性语言。
2.3再工程活动的步骤软件再工程通常由两个阶段组成:1)逆向工程(reverse engineering)阶段,通过分析、理解现有软件,恢复其设计信息并抽象成为高层次的表示;2)正向工程(forward engineering)阶段,即软件开发过程。
对逆向工程提取出的软件的设计表示进行评审,再设计,重新产生出新的目标程序。
在一些情况下,如现有软件的各项设计文档完备、精确,再工程活动可以不需要经历逆向工程的部分过程。
3.再工程的相关软件技术3.1逆向工程逆向工程是对现有的目标软件系统进行分析与理解,包括:●分析、识别系统整体结构、各个组成成份及其相互关系;●提取软件的设计信息;●以其它或更高级的形式表示系统。
类似的软件工程活动也采用其它术语,如设计恢复(design recovery)、程序理解(program understanding)等。
逆向工程主要包括两个层次:1)反汇编、反编译。
这是比较成熟的技术。
反编译是编译的逆过程,它可将机器代码或汇编语言程序翻译成为与原有程序功能相同的高级语言形式。
2)设计信息提取。
从已有的设计文档和源程序出发,抽象出原有的设计思想,即恢复软件的功能规格说明和设计说明,这是设计和编码的逆过程。
通常这个过程需要具有原应用系统的问题领域知识(domain knowledge)。
逆向工程的关键在于对目标系统的理解,一般对系统的理解可以分为四个层次:●程序设计语言层;●控制结构层;●通用算法层;●问题领域层。
3.2正向工程(软件开发方法)关于软件开发方法及开发环境、工具方面的书籍资料已有许多,这里仅简要介绍较新的几种。
1) 4GL: 4GL为非过程性语言,用户无需具备系统软件与高级语言的知识,只要编写出系统规格说明,用4GL编译程序进行编译就能生成出可运行的程序。
2) OOP(面向对象的程序设计) : 与传统的面向过程的程序设计以功能划分模块的方法不同,OOP是按处理对象(实际事物的抽象模型)划分模块。
OOP将部件级的软件对象结合起来构成应用软件。
在进行维护时只需更换、扩充或添加部件,不影响系统的其它部件和整体结构,可显著降低开发和维护成本。
3) CASE: CASE对再工程的主要支持是帮助用户分析存储于CASE字典中的系统描述,这些分析可用于程序、子系统以及整个系统。
一些综合CASE (I-CASE)可满足整个软件生存周期的需要,包括维护阶段和逆向工程。
目前要实现完全自动化的再工程是不可行的。
千差万别应用领域的再工程离不开人的理解、判断、设计、决策能力。
软件的再工程不仅要具有软件工程知识,更重要的是要具备特定问题领域知识。
4.再工程应用实例国外近年来研制出多种软件工程环境和系统再工程产品,在对现有系统实施再工程方面有许多成功的事例。
下面列举几例以使读者对此领域的应用情况有一个初步的了解。
例一. Allnet公司是美国最大的经营长途电讯业务的公司之一,每日处理长途电话达600多万个。
由于业务高速增长,使得原设计的计费处理工作经常拖延,影响了公司的资金周转,迫切需要对系统进行改进。
Allnet采用了Viasoft公司的系统再工程产品VIA/Renaissanse,该产品能够自动地分析和提取源程序(COBOL语言)中的各种功能说明,然后形成这些功能的独立程序模块,这些模块编译后即可投入运行。
同时这些模块还可供其它应用程序使用或纳入公司的CASE环境,用于今后新系统的开发。
Allnet公司对其计费模块实行改造后;使账单处理的记录数减少到不足原来的10% ,不仅计费处理速度满足了要求,主机IBM3090 - 300J的处理时间和I/O操作时间都明显减少。
例二. 美国Zortec公司推出的面向商务应用的软件开发环境产品SYSTEM-Z集4GL和DBMS功能于一体,可在百余种机型、十多种操作系统上安装。
该产品不仅具有良好的开发环境,而且支持软件移植工作。
如总部设在纽约的一家纺织品公司主机系统是王安VS,数据处理采用COBOL语言,下属几家工厂采用XENIX系统,未与公司联网,采用SYSTEM-Z只用几个月就将系统由开销过大的王安系统移植到HP9000上,并实现了与工厂的联网。
又如,美国西弗吉尼亚州立大学使用SYSTEM-Z,不到三个月就把Unisys1100计算机上的3400多个MAPPER程序移植到IBM RS/6000上,节省了大笔经费。
再如,Alpha Omega公司只用很短的时间就将美国迪斯尼乐园的大部分应用软件移植到开放系统中,比预计节省了95%的工作日。
例三. 美国马里兰大学、NASA (国家宇航局)和CSC(计算机科学公司)联合组织的软件工程实验室(SEL)共同了解、研究NASA的飞行动力学环境中的100多个软件项目,每个软件项目从几千行到一百万行源程序不等,有Ada语言,也有早期开发的Fortran语言,通过SEL的工作NASA的每行源程序开发成本平均降低10%,软件可靠性平均改进了35%,软件的可管理性明显提高。
参考文献1.徐家福,杨冬青,为软件工程的未来建立基础,计算机科学,1990年第6期2.David Sharon,The Psychology of Reengineering,IEEE Software,Vo18. No 6. 19913.Don Yu,A View on Three R's: Reuse,Re - engineering,and Reverse - engineering,Software Engineering Notes,Vo1 16. No 3. 19914.John Kador,Reengineer to Boot Software Productivity,DATAMA ION,Vo1 38. No24. 19925.刘东波,张华伟,新一代商务软件开发环境SYSTEM-Z,计算机世界,1993年37期本文原载于1994年第1期《信息系统工程》杂志。