如何全面综述模型驱动的遗留系统逆向工程方法?
摘要:作为软件工程师,我们都曾有过这样的经历:面对一个庞大、陈旧且几乎没有任何文档的遗留代码库。它就像一座没有地图的迷宫,每一次修改都可能触发意想不到的连锁反应。在这个关键时刻,逆向工程(Reverse Engineering)——即从现有代码中
作为软件工程师,我们都曾有过这样的经历:面对一个庞大、陈旧且几乎没有任何文档的遗留代码库。它就像一座没有地图的迷宫,每一次修改都可能触发意想不到的连锁反应。在这个关键时刻,逆向工程(Reverse Engineering)——即从现有代码中提取设计和需求的过程——就成了我们唯一的指引。
H. A. Siala, K. Lano and H. Alfraihi, "Model-Driven Approaches for Reverse Engineering—A Systematic Literature Review," in IEEE Access, vol. 12, pp. 62558-62580, 2024, doi: 10.1109/ACCESS.2024.3394732.
keywords: {Reverse engineering;Unified modeling language;Software systems;Databases;Bibliographies;Systematics;Software;Application program;legacy system;model-driven reverse engineering (MDRE);model-driven re-engineering;software application},
背景
许多组织在满足新用户需求、支持新技术平台及提升质量的过程中,其软件系统会经历增长与复杂化。此时,原有的系统设计和架构已无法满足用户需求的新功能及技术创新。若未进行妥善维护与升级,这些系统可能沦为遗留系统。由于系统复杂性高、文档记录不全、对整体架构认知有限等诸多因素,遗留软件系统往往难以有效运维。因此,对任何组织而言,维护和升级这些系统都至关重要。当组织的软件系统无法满足需求时,需决定是通过升级延长其使用寿命,还是彻底重写或重构系统。通常而言,完全替换或重写遗留系统既耗时又费钱。此时,通过改进现有系统来满足新需求并延长其使用周期是更优选择。软件系统使用得越多,企业从中获得的收益就越多。
在着手维护和演进软件系统之前,必须先对其有深入理解。逆向工程通过提取反映软件系统结构与行为的不同模型和图表,在理解软件系统的各个方面中发挥着关键作用。重构工程旨在理解现有软件系统、提升其质量,并将其迁移至新技术或平台。
奇科夫斯基与克罗斯将重构工程定义为“对目标系统进行审视与改造,以重构其新形态并实施新形态”。重构工程包含三个阶段:逆向工程、重构和正向工程。逆向工程定义为:“通过分析目标系统来实现以下目标的过程:a)识别系统组件及其相互关系;b)以另一种形式或更高抽象层次创建系统表征”。在重构阶段,表征被映射到相同相对抽象层次的另一种表征形式。在此抽象层次上,软件系统的外部行为可能得以保留,同时改进内部结构(重构),或添加新功能。最后是正向工程阶段,其定义为:“从高层次抽象和逻辑独立于实现的设计转向系统物理实现的传统过程”。
下图清晰展示了逆向工程、正向工程与重构工程的核心概念。
尽管“逆向工程”与“重构工程”涉及不同技术手段,但在软件开发领域二者具有密切关联。逆向工程的核心目标是通过分析现有软件系统来理解其结构与功能,而重构工程则侧重于通过改变系统结构、行为或功能来实现改造,旨在提升系统性能、可维护性等特性。因此,在对系统进行任何改动前,逆向工程是重构工程的必要前提,它能帮助开发者透彻理解系统运作机制。
模型驱动工程(Model-driven engineering, MDE)是辅助逆向工程流程的一种方法。 MDE 提供高级抽象层,使设计者和开发人员能够通过模型来处理复杂的软件系统。这些模型对于不同的软件工程活动至关重要,包括正向工程、逆向工程和重构的三个阶段中,可以通过模型转换链来实现这些转换过程。
模型驱动的重构与模型驱动的逆向工程(Model-driven reverse engineering, MDRE)是 MDE 技术的主要应用场景,模型用于现有软件系统的表示、理解和文档化。
为通过模型集合表征软件系统,已开发出多种 MDRE 方法和工具,这些模型聚焦于软件系统的不同方面(结构与行为)。现有的 MDRE 方法可归纳为两大框架:通用与专用。通用方法可应用于不同目标的多种应用领域或技术,而专用方法则针对具有明确目标的特定领域或技术设计。
MDRE 方法可实现完全自动化,因此在逆向工程过程中无需人工干预。部分自动化 MDRE 方法中,可能需要在某个或多个步骤进行人工干预。 MDRE 技术还可分为静态、动态和混合三种类型。静态技术无需执行代码即可从源代码或二进制代码中提取信息,而动态技术则在运行时从系统中提取信息。
