
Martin Fowler
Like Feathers, Fowler treats changing existing code as a disciplined, step-by-step craft. It gives a catalogue of small, behaviour-preserving moves to improve a design without breaking what already works.
Reader-supported: when you buy through links on our site, we may earn an affiliate commission. Learn more
11 books to read next
If you loved Working Effectively with Legacy Code by Michael Feathers
Readers who love Working Effectively with Legacy Code usually value its practical, hands-on approach: concrete techniques for getting untested code under test, breaking dependencies safely, and making changes without fear. It is calm, specific and grounded in real codebases rather than theory, with a clear focus on fast feedback and small, safe steps. Its catalogue of dependency-breaking techniques is a reference many developers return to. The picks below keep that mix of practical craft and careful thinking.

Martin Fowler
Like Feathers, Fowler treats changing existing code as a disciplined, step-by-step craft. It gives a catalogue of small, behaviour-preserving moves to improve a design without breaking what already works.

Steve McConnell
A thorough, practical guide to writing and revising code that is easier to understand and change. Its detailed advice on routines, classes and defensive habits suits readers who want to improve the code they maintain.

John K. Ousterhout
Short and opinionated, it focuses on managing complexity, a theme central to legacy code work. Readers who valued Feathers's attention to what makes code hard to change will find similar reasoning here.

Kent Beck
The classic introduction to writing tests first and letting them guide design. It shows the red-green-refactor rhythm that Feathers relies on when bringing old code under a test harness.

Gerard Meszaros
A detailed catalogue of test patterns and smells. Readers who liked Feathers's dependency-breaking catalogue will appreciate its similar reference style for building maintainable test suites.

Erich Gamma, John Vlissides
The foundational catalogue of object-oriented design patterns. Many of the dependency-breaking techniques in Feathers's book rely on these ideas, so this gives the underlying design vocabulary.

Eric Evans
Addresses how to structure software around the core problem it solves, a helpful lens when untangling a large, confusing codebase. Readers who wanted to understand legacy systems will find a method for seeing their structure.

Robert C. Martin
Focuses on writing readable, well-named, well-structured code, the everyday skill that makes legacy code easier to understand. Readers who liked Feathers's practical tone will find similar concrete examples and advice.
Titus Winters, Tom Manshreck, Hyrum Wright
Describes how a very large, long-lived codebase is kept healthy through testing, code change practices and maintenance. It deals with the same long-term problems of sustaining big systems that Feathers addresses.
Andrew Hunt, David Thomas
A collection of practical habits for keeping code flexible and avoiding decay. Its short, direct tips suit readers who want Feathers's pragmatic mindset applied to day-to-day development.

Jez Humble, David Farley
Explains how automated testing and small, frequent changes make software safer to release. It extends Feathers's focus on fast feedback to the whole path from code change to production.
We earn a commission if you buy through these links. Learn more