Reverse Software Engineering

As part of our work in software engineering environments, we got interested in reverse software engineering (RSE) and software system re-engineering. Our focus was aimed at (a) extracting, visualizing, and restructuring architectural design representations from source code, and (b) transitioning legacy code into forms compatible with advanced software engineering environments (such as those incorporating configuration management services). A couple of companion papers describe these efforts and associated environment mechanisms in more detail [Choi 90,Choi 91].

From a reuse perspective, one reason to investigate RSE techniques is to determine to what extent extracted architectural designs reveal software reusability information. Consider the following: Assume that an extracted architectural design of a software application can be represented by a directed-acyclic graph, with nodes corresponding to application modules, and edges as module interconnections for resource exchange. Then we might, for example, seek to identify modules with high interconnectivity as candidates for reusable components. This makes more sense when many applications have their architecture extracted and logical subsystems compared. Alternatively, if we must build new generation replacement systems for older less maintainable systems, then recovered design information might serve as a guide for more rapidly analyzing and prototyping the new replacement system. However, when moving to new source code language paradigms (e.g., from imperative to object-oriented) this technique may not be as useful. Instead, we may need to develop application-specific RSE tools which produce a neutral, intermediate representation for possible reuse. We have proposed to develop such tools to some of our research sponsors to aid their proposed redevelopment of large programs in ``old'' programming languages into Ada.