The University of Sheffield
Department of Computer Science

COM6523 Software Re-engineering


Software development often involves the improvement and adaptation of "legacy systems" - well-established, business-critical software systems that might have become difficult to maintain over time. This module introduces the skill-set that is required to get to grips with such systems. It teaches students how to reverse-engineer and appraise complex, unwieldy systems by implementing source code and execution analysis techniques. It also presents a range of strategies that can be used to adapt and reengineer such systems to improve their quality and viability.

Session Spring 2021/22
Credits 15 credits
  • Individual project
  • Group project
Lecturer(s) Dr. Neil Walkinshaw

The aims of the module are:

  • to introduce the main drivers that lead to software deterioration, along with a practical understanding of how poor design manifests itself, including "code smells" and "anti-patterns".
  • to introduce key static and dynamic software analysis techniques that support reverse-engineering (with a view to understand unfamiliar software systems, and to identify and diagnose design problems).
  • to introduce key reengineering strategies to improve software structure, at both a unit-scale and a "system" scale.

On completion of this module, students will be able to:

  • Identify common "code smells" and "anti-patterns" from a design document of a software system.
  • Compute a variety of software analyses and metrics with techniques such as source code slicing and software reconnaissance, to reverse-engineer design documents, and to highlight hidden dependencies.
  • Apply program comprehension strategies (with the help of analysis results and metrics) to yield a high-level understanding of how an unfamiliar program works, along with a broad assessment of its strengths and weaknesses.
  • Apply a selection of standard refactoring strategies and Reengineering patterns to improve low-level source code structure.
Content The taught material is split into three broad phases:
1: Basic strategies and techniques to understand unfamiliar software systems including code reading, automated code analysis, and automated execution analysis.
2: Diagnosing problems with design and code.
3: Improving design, migration strategies, and testing software changes to guard against the introduction of bugs.
Restrictions Available to students in Computer Science only.
Teaching Method
  • Teaching with GitHub: The course will be loosely based on the ideas underpinning the Software Architecture course at the University of Delft (, which has been highly popular thanks to its "hands-on" nature. Students will be provided with private Git repositories obtained via GitHub Classroom. This will provide a direct link between students and "real" software systems hosted on GitHub, a direct link between teaching staff and students' work, and a means to monitor student progress and offer support.
  • Lectures: The concepts will be delivered via traditional lectures. A large proportion will include live demonstrations with respect to open-source software systems. Plus a guest-lecture from a practitioner with experience of reengineering legacy software systems within an organisation.
  • Labs: Labs will be used to provide students with hands-on experience of the techniques that are taught in the lectures and how to apply them to a real software system, so that they are well-placed to contribute to the group work (see below).
  • Group work: Students work in groups (of 4-6, depending on the size of the cohort) on a large open-source case study system for the duration of the module, applying the various techniques that they learn about to their case study system. This culminates in a short, assessed group presentation showcasing their findings to their peers.
  • Summative feedback: Each of the summative assessments will include individual (or group) written feedback. For the Blackboard quiz and project there will also be a feedback session in a lecture, where the class as a whole are given feedback on particular aspects of the assessments.
  • Interaction in labs: Labs will be applied in nature, with the instructor and TAs present to provide immediate feedback on lab activities.
  • Discussion forums: Students will be invited to use Blackboard discussion forums to ask questions. Since all of the applied work will be available on GitHub Classroom, the instructor and TAs will be able to provide immediate, specific feedback.
Recommended Reading
Demeyer, Serge, Stéphane Ducasse, and Oscar Nierstrasz. Object-oriented reengineering patterns. Elsevier, 2002