Often developers shy away from making changes to existing (legacy) code base due to the fear of breaking existing functionality. While the team agrees that refactoring is the only solution, no one wants to take charge. Refactoring code without having automated tests can be scary. And quite often, it ends up being an egg-and-chicken problem. .i.e. to write tests one needs to refactor the code. But to refactor the code, we first need tests.
The Legacy Code Workshop teaches how to effectively understand and improve legacy code by offering a hands-on introduction to the tools, tactics and techniques for reviving legacy code.


Learning Outcome
At the end of this training the team will be able to:
- Understand when to refactor and when to rewrite parts of your legacy system.
- Choose from various strategies to confront legacy code.
- Quickly write characterization or scaffolding tests.
- Find and secure an inflection point
- Pickup refactoring tools/techniques to evolve/improve the design of your code.
- Make classes testable by breaking dependency between them.
- Visualize the health of your codebase using C3.
- Accommodate changing requirements without the fear of damaging your design.

Course Outline
Demo: Using Test as a Probe
Testing Concepts and Patterns
- Unit testing with xUnit
- Measuring test coverage
- Test doubles
- Mocking Frameworks
- Testing patterns
- Characterization tests
Refactoring Legacy Code
- Identifying code smells
- Simplifying code structure
- Organizing data and methods
- Simplifying and encapsulating logic
- Extracting subclasses and interfaces

Changing Legacy Code
- Identifying the change point
- Finding interception points
- Breaking internal and external dependencies
- Writing a scaffolding test
- Test-Driving the change
- Removing the scaffolding test
Seam Model: Finding or Creating a Seam for Changes
- Safely Cutting into a Living System
- Sprout Method
- Sprout Class
- Wrap Class
- Building Seems for Expansion and Testing
Using Design Patterns to Break Dependencies
- Adapter
- Strategy
- Command Design Pattern
- Parameterize constructors and methods
- Extract and over-ride
- Self-Shunting
- Non-OO techniques to break dependencies
- Hidden and global dependencies
- Singleton Pattern
- Inaccessible methods
- 3rd Party Library dependencies
- Dealing with constraints imposed by your Framework
Strongly Recommended
1 or 2 Days of Mentoring via Pair Programming with Developers on your code base
- To get your team kick-started with the learning from the workshop, we recommend, that our trainer spends a day or two, working with your team on your code base.
- Each day will be reserved for 4 pair programming sessions. During these sessions, the workshop participants will take specific examples from their projects, where they are finding it difficult to apply any of the practices learned in the workshop. The trainer will then pair with an individual to show how to resolve those challenges.
- At the end of the day, the 4 volunteers will summarize their learning by showing before and after code from their respective pairing session to the rest of the group.
Pre-Post Programming Assessment
The goal of these programming assessments is to identify real and quantifiable measures for the learning achieved through our workshop.
Objective
- Get a quick understanding of your knowledge and skill level with respect to Designing & Programming
- Establish a baseline against which the effectiveness of the workshop may be measured
- Customize our workshop based on specific areas identified in this assessment
Pre-Assessment
- Before the workshop, we’ll send a problem description, your developers will spend max 4 hours and solve the problem and send us the code. We’ll evaluate the code and send you detailed feedback about the code, including areas for improvement. We can send different types of problems (fresh development, cleaning up existing code and so on.)
Post-Assessment
- 2 week after the workshop, we send another problem and evaluate the solution code. A comparison between the Pre and Post Assessment should be able to clearly quantify per-participant level improvement.
- Click on the image to download the sample report…
Training Details
Method of Instruction
Interactive Dialogues, Programming Exercises, Demos and Instructional Games
Transfer %
Knowledge: 40%, Skill-Building: 60%
Target Audience
- Primary: Sr. Object-Oriented Programmers, Architects, and Designers
- Secondary: Technical Managers, Business Analysts, Testers, Technical Writers
Course Level
Intermediate to Advanced
Course Prerequisites
- Required: some understanding of OO concepts and an OO language
- Highly Recommended: basic understanding of the life-cycle of software projects
General Requirements
- HDMI projector (1024×768 minimum) & Projector screen
- 1 White board & Dry erase markers
- Cluster seating with 5-6 people on each table
- 1 Flip chart with the stand and marker pens for each table
- Notepad and Pen for each participant
- Ample room for students in terms of room size and set up
- For Dev trainings: at least one powerful workstation between two programmers
Development Tools
Java
- Latest Java JDK
- Latest Standard Eclipse OR IntelliJ Idea
- JUnit, Mockito, JBehave, FitNesse or Cucumber
C#
- Latest .Net Framework
- Latest Visual Studio
- Latest ReSharper Plugin
- Latest JetBrains Rider
- SpecFlow‘s Visual Studio IDE Integration or FitNesse
JavaScript
- Latest WebStorm JavaScript IDE
- Latest Chrome Browser
- Latest Jasmine Framework
- Latest Jest Framework
- Latest JsTestDriver
C/C++
- Latest Eclipse CDT OR Visual Studio
- Latest GTest
- Latest Visual Studio
- Latest CLion
Ruby
PHP
Flex
- Latest Flex SDK
- Latest Flash Builder OR IntelliJ Idea