标题：软件再工程
再分析
再分析阶段的主要任务是对既存系统的规模、体系结构、外部功能、内部算法、复杂度等进行调查分析。这一阶段早期分析最直接目的就是调查和预测再工程涉及的范围。北京工业大学软件工程研究所研制开发的“软件再工程辅助调查工具——SFRE”正是从整体上支持该分析阶段的再工程自动化工具。重用是软件工程经济学最重要原则之一，重用得越多，再工程成本越低，所以逆向工程再分析阶段最重要的目的是寻找可重用的对象和重用策略，最终确定的再工程任务和工作量也将依存于可重用对象范围(重用率)和重用策略。
与一次工程不同，再工程分析者最终提出的重用范围和重用策略将成为决定再工程成败以及再工程产品系统可维护性高低的关键因素。如果重用对象都是既存代码级的当然理想，然而可能性有限。但是再工程分析者如果因此而放弃重用，以为“改他人的代码不如自己重新编写”，便犯了再工程的大忌。因为一个运行良久的既存系统，最起码的价值是在操作方法和正确性上已被用户接受。而再高明的程序员在软件没有经过用户一段时间的使用验证之前都不敢保证自己的程序正确无误;更何况越是有经验的程序员越是知道对一个处于局部变更地位的程序进行重新编写远比一次工程的原始编程复杂得多，因为他需要对应无数的“副作用”，正所谓“碰一筋而动全身”。所以，读文档——即使是“破烂不堪”、读代码——即使是“千疮百孔”，也要坚持住，并且从中筛出可重用对象。
再编码
根据再分析阶段做成的再工程设计书，再编码过程将在系统整体再分析基础上对代码做进一步分析。如果说再分析阶段产品是再工程的基本设计书，那么再编码阶段如同一次工程一样，先要产生的是类似详细设计书的编码设计书。但是再工程比一次工程更难以进行过程分割，换言之，瀑布模型更不适应再工程，无法将再分析、再设计、再编码截然分开。
再测试
一般来说，再测试是再工程过程中工作量最大的一项工作。如果能够重用原有的测试用例及运行结果，将能大大降低再工程成本。对于重用的部分，特别是可重用的（独立性较强的）局部系统，还可以免除测试，这也正是重用技术被再工程高度评价的关键原因之一。当然再工程后的系统总有变动和增加的部分，对受其影响的整个范围都要毫无遗漏地进行测试，不可心存侥幸，以免因“一个苍蝇坏了百年老汤”。
实用的重用战略
在判断既存系统应该如何重用时，首先要明确哪些是可重用对象，以及如何使用这些可重用对象。下面以既存LAN系统重构成Web系统的再工程为例，说明再分析和再编码将遇到的一些重用课题。
我们可以将既存LAN系统划分成界面、逻辑、数据三个层次。用既存系统的三个层次去分别对应典型Web系统的表示层、逻辑层和数据层。由此从逻辑上得到对应每个层次的输入和输出，然后为每一层寻找能够实现最大程度重用的重构方法。
● 界面重用策略
界面模拟方法　将基于文本的旧界面包装为新的图形界面。旧界面运行在终端上，新界面可以是基于PC的图形界面，也可以是运行在浏览器上的HTML页面。新用户界面通过一个界面模拟工具与旧界面通信。此方法重用率相当高。但是不修改既存系统会同时将旧系统的结构性缺点全部继承下来。
基于客户端的Web应用（Java Applet）　Applet可以实现从界面、逻辑到数据库的许多功能。完全用Java语言重写一个系统是不现实的，重用率也不会很高，这不是软件再工程所提倡的。已有许多Applet自动转化工具，而且其转化后代码的重用率相当高。
基于服务器端的Web应用　即重新开发界面。这种方法看上去没有重用既存界面代码，其实不然。首先，界面设计完全可以重用，从而节省设计时间；其次，我们可以将某些界面做成可重用的，这样也会减少工作量。

● 逻辑层包装原则
通过对逻辑层的分解可以得到可重用和不可重用的两部分代码。对可重用部分可直接使用，对于不可重用部分则应尽量通过各种包装技术按统一标准将其改造成可重用构件。包装方法有很多，如对象包装法、部件包装法等。
● 数据层重用策略
数据层通常要求更高的重用率。逻辑和数据休戚相关，如果改动数据库，逻辑势必不能正常运行，对逻辑部分的重用也就无从谈起。如果非改不可的话，也要以保证最大限度的重用为原则，争取做到只增不删，以保证数据的完整性。
软件再工程分为哪两个部分
答：软件再工程的两部分：首先，逆向过程：从代码开始推导出设计或是规格说明（可理解性）；其次，改善软件的静态质量（可维护性、复用性或演化性）。
为什么实施软件再工程
（1）再工程可帮助软件机构降低软件演化的风险
（2）再工程可帮助机构补偿软件投资
（3）再工程可使得软件易于进一步变革
（4）软件再工程有着广阔的市场
（5）再工程能力扩大CASE工具集（如：Aidedsoft）
（6）再工程是推动自动软件维护发展的动力
再工程工具
再工程工具用来支持重构一个功能和性能更为完善的软件系统。再工程工具主要集中在代码重构、程序结构重构和数据结构重构等方面。
过程
典型的软件再工程过程模型如图所示，该模型定义了6类活动。在某些情况下这些活动以线性顺序发生，但  软件再工程过程模型也并非总是这样，例如，为了理解某个程序的内部工作原理，可能在文档重构开始之前必须先进行逆向工程。
在图中显示的再工程范型是一个循环模型。这意味着作为该范围的组成部分的每个活动都可能被重复，而且对于任意一个特定的循环来说，过程可以在完成任意一个活动之后终止。下面简要地介绍该模型所定义的6类活动。　　1．库存目录分析　　每个软件组织都应该保存其拥有的所有应用系统的库存目录。该目录包含关于每个应用系统的基本信息（例如，应用系统的名字，最初构建它的日期，已做过的实质性修改次数，过去18个月报告的错误，用户数量，安装它的机器数量，它的复杂程度，文档质量，整体可维护性等级，预期寿命，在未来36个月内的预期修改次数，业务重要程度等）。　　每一个大的软件开发机构都拥有上百万行老代码，它们都可能是逆向工程或再工程的对象。但是，某些程序并不频繁使用而且不需要改变。此外，逆向工程和再工程工具尚不成熟，仅能对有限种类的应用系统执行逆向工程或再工程，代价又十分高昂，因此，对库中每个程序都做逆向工程或再工程是不现实的。下述3类程序有可能成为预防性维护的对象。　　（1）预定将使用多年的程序。　　（2）当前正在成功地使用着的程序。　　（3）在最近的将来可能要做重大修改或增强的程序。　　应该仔细分析库存目录，按照业务重要程度、寿命、当前可维护性、预期的修改次数等标准，把库中的应用系统排序，从中选出再工程的候选者，然后明智地分配再工程所需要的资源。　　3．文档重构　　老程序固有的特点是缺乏文档。具体情况不同，处理这个问题的方法也不同。　　（1）建立文档非常耗费时间，不可能为数百个程序都重新建立文档。如果一个程序是相对稳定的，正在走向其有用生命的终点，而且可能不会再经历什么变化，那么，让它保持现状是个明智的选择。　　（2）为了便于今后的维护，必须更新文档，但是由于资源有限，应采用“使用时建文档”的方法，也就是说，不是一下子把某应用系统的文档全部都重建起来，而是只针对系统中当前正在修改的那些部分建立完整文档。随着时间流逝，将得到一组有用的和相关的文档。　　（3）如果某应用系统是完成业务工作的关键，而且必须重构全部文档，则仍然应该设法把文档工作减少到必需的最小量。　　3．逆向工程　　软件的逆向工程是分析程序以便在比源代码更高的抽象层次上创建出程序的某种表示的过程。也就是说，逆向工程是一个恢复设计结果的过程，逆向工程工具从现存的程序代码中抽取有关数据、体系结构和处理过程的设计信息。　　4．代码重构　　代码重构是最常见的再工程活动。某些老程序具有比较完整、合理的体系结构，但是，个体模块的编码方式却是难于理解测试和维护的。在这种情况下，可以重构可疑模块的代码。　　为了完成代码重构活动，首先用重构工具分析源代码，标注出和结构化程序设计概念相违背的部分。然后重构有问题的代码（此项工作可自动进行）。最后，复审和测试生成的重构代码（以保证没有引入异常）并更新代码文档。　　通常，重构并不修改整体的程序体系结构，它仅关注个体模块的设计细节以及在模块中定义的局部数据结构。如果重构扩展到模块边界之外并涉及软件体系结构，则重构变成了正向工程。　　5．数据重构　　对数据体系结构差的程序很难进行适应性修改和增强，事实上，对许多应用系统来说，数据体系结构比源代码本身对程序的长期生存力有更大影响。　　与代码重构不同，数据重构发生在相当低的抽象层次上，它是一种全范围的再工程活动。在大多数情况下，数据重构始于逆向工程活动，分解当前使用的数据体系结构，必要时定义数据模型，标识数据对象和属性，并从软件质量的角度复审现存的数据结构。　　当数据结构较差时（例如，在关系型方法可大大简化处理的情况下却使用平坦文件实现），应该对数据进行再工程。　　由于数据体系结构对程序体系结构及程序中的算法有很大影响，对数据的修改必然会导致体系结构或代码层的改变。　　6．正向工程　　正向工程也称为革新或改造，这项活动不仅从现有程序中恢复设计信息，而且使用该信息去改变或重构现有系统，以提高其整体质量。　　正向工程过程应用软件工程的原理、概念、技术和方法来重新开发某个现有的应用系统。在大多数情况下，被再工程的软件不仅重新实现现有系统的功能，而且加入了新功能和提高了整体性能。[1]