I have a soft spot for older software books, and this one from 2005 didn’t disappoint. It’s fascinating to see how its take on working with messy code has aged and how some of its ideas still feel relevant, while others have quietly faded.
What really stood out to me was the way it approaches transforming code from chaotic to maintainable. Feathers doesn’t just present the results; he walks you through the thinking behind each decision. It’s like watching Bob Ross plan his next brushstroke—careful, deliberate, and oddly satisfying to follow.
Another highlight is the vocabulary Feathers introduces. These terms fundamentally change how you see code. They provide a framework that makes it easier to identify opportunities for testing, refactoring, or better design. It’s like being handed tools you didn’t know you needed, and suddenly, the same code looks entirely different, more approachable.
New Vocabulary from the Book
- Characterization Test: A test written to document the current behavior of a piece of software and preserve it as you change its code.
- Effect Sketch: A small hand-drawn sketch that shows what variables and method return values can be affected by a software change.
- Feature Sketch: A small hand-drawn sketch that shows how methods in a class use other methods and instance variables.
- Interception Point: A place where a test can be written to sense some condition in a piece of software.
- Mock Object: A fake object that asserts conditions internally.
- Object Seam: A place where you can vary behavior by replacing one object with another in object-oriented systems.
- Pinch Point: A narrowing in an effect sketch that indicates an ideal place to test a cluster of features.
- Programming by Difference: A way of using inheritance to add features in object-oriented systems, often as a shortcut to get a new feature into the system quickly.
- Seam: A place where you can vary behavior in a software system without editing the code in that place.
- Test Harness: A piece of software that enables unit testing.
Feathers doesn’t just mention these terms in passing—he provides a full glossary at the end of the book, which feels like a cheat sheet for working effectively with code. Once these ideas take root, it’s impossible to look at your work the same way again.
I didn’t rush to read this book initially, partly because of its focus on “legacy code.” That label gave me the impression it might not be as broadly useful. But in hindsight, it taught me more about software modeling and design than I expected. While I’m not sure I’d place it before Martin Fowler’s Refactoring on my reading list, it absolutely deserves a spot beside it.
Speaking of Refactoring, I’ve got something to say about that one too, but I’ll save it for another post.