The Re-engineering and Reuse of Software Patrick A.V. Hall and Lingzi Jin Vol 1, p.335-351 Presented by: Andrew Wheeler Overview Definitions Introduction Historical Background Implementations Challenges Conclusions Definitions Re-engineering – The combination of reverse engineering and forward engineering – The concept of “redoing” a software system Reuse – Using a given piece of software to solve more than one problem Reverse engineering – The tools and methods used to understand software – Figuring out a software system for potential redeployment Introduction Software re-engineering and reuse are concerned with maximizing software usage for any given development effort – Both are used to maximize profit and minimize turnaround time Software re-engineering and reuse also help minimize staff – The more code you can reuse the less code you have to write and rewrite Introduction (cont) Reuse not only applies to using a piece of software: – Reuse designs and ideas thrown out during design phase – May have use in other applications Reverse engineering and reuse can help recover lost investment – Time has already been placed into designing it the first time around. Historical Background - Reuse Reuse dates back to sharing of algorithms through publications – Reuse of high level language and packages – Textbook publications Use of macros and similar assembly instructions – Subroutine entry and exit – For loops, if blocks, arithmetic Historical Background – Reuse (cont) Reuse associated with flexibility – Parameterization – Build scripts Historical Background - Re-engineering Flow-charting tools have been around for awhile – Now evolved into UML and sequence diagrams Cross reference listings of variables – Helps understand large pieces of software Originally designed to help maintain COBOL legacy systems around 1980s Implementations – Reuse Integration into lifecycle – Building phase to construct the reusable components into a library – Incorporating those reusable components into the building of a software system Time required to account for integration issues Implementations – Reuse Component based Central to reuse Design for “plug and play” Which components comes from domain analysis – File Input/Output component not needed for a system that won’t write to disk Implementations – Reuse Component based Give clear descriptions and classifications Avoid over generalization – Map instead of tree Object oriented programming lends itself to reuse – Objects are often in reusable component form – Inheritance provides contexts for reuse Sorted Map inherits from Map Size or granularity Implementations – Reuse Reuse in design – Component or components could fulfill a requirement based on specifications – If multiple components are used then requirements must be broken down further Logging utility = Time utility + Format utility + File utility + Process input utility – Identification, evaluation, modification, and integration White-box reuse – Reuse with simple modifications of code Frameworks Implementations – Reuse MIL – Module Interconnection Languages – Prieto-Diaz, et. al (1986) – Going beyond procedure calls in code – Helps in system building another higher language Design with reuse involves transforming the outputs of one components to the inputs of another Implementations – Re-engineering Reverse engineering involves abstracting the current system and revealing the nature of the system – Describe the system to a non technical person Documentation of class methods and members could be used during the process – Outlining tools and sequence diagrams have been in use for many decades Implementations – Re-engineering Use of formal transformations – Gather details about an efficient algorithm that may be difficult to understand Use of wide spectrum language - Ward – An interactive system to abstract details of implementation into Z language and implement Z language in code language of choice Implementations – Re-engineering Use of reverse engineering back to specifications – Lano, et. al – Used to reverse engineer COBOL applications Using good coding practices helps the reengineering process – Self documenting code Knowledge of higher level domain concepts helps re-engineering – Knowing for what purpose the software system was used Implementations – Re-engineering Using design patterns in code – Helps to know the purpose for a software system and helps the forward process by knowing how to build the system Object-oriented programming facilitates the reverse-engineering process – Components of the high level systems share the names of the objects Implementations – Domain Analysis Identify the major concepts and the relationships between the concepts Usage of components is determined by the domain in which they will be used Determine if components needed have already been built Helps guide the production of components for better reuse – Adequate domain models help scope the components and their usage Challenges of Re-engineering and Reuse Personnel issues – “Why buy when you can build?” Reuse doesn’t always mean buying – Contrast to electronic engineering Build your own microprocessor? Payoff issues – Rewarding someone for building a reusable component by royalties? Challenges of Re-engineering and Reuse Economical issues – Payoff occurs after component production – Most companies are geared towards producing a system Gain another contract and reduce turnaround time from reuse – Accounting treats software as consumable and not capital Concept of making software reusable capital like a desk Challenges of Re-engineering and Reuse Legal issues – Protection against physical piracy and intellectual piracy – Use of proprietary software remedies certain issues Conclusions Software reuse, re-engineering, and reverse engineering are cutting-edge methodologies – Product Line and Battle Command Product Line Technology has caught up to these practices – UML There is a future in adding reuse to the software lifecycle – Economic gains must be established