No, tests aren’t supposed to make refactoring easier; they make refactoring safer. Sometimes, by accident, they do both.
Investing Wisely in Architecture Through Refactoring
The stronger your refactoring skill, the more easily you can use architecture advice as guidelines instead of as rules to enforce. This makes it significantly more likely that you’ll invest wisely in architecture, rather than over- or under-engineer.
A Matter of Interpretation: Mock Objects
Just another little example of two people looking at a situation, one seeing a problem and the other seeing a solution.
What's Not To Like About This Code? An Experiment.
What happens when I try to review code in small steps and in public? Let’s find out.
What is 'the Right' Amount of Refactoring?
You refactor too much! We’re not refactoring enough! This is a problem that, with a light touch, resolves itself.
What is Refactoring?
The most common definition of “refactoring” suffers from a common weakness that creates big problems for a very specific group of people. I’d like to help.
Why Refactoring Is Not Always a Code Smell
Refactoring means rework, which means that we didn’t “get the design right the first time”. This can indicate a problem. It can also indicate a natural process of convergence towards a suitable design. Calling it “a code smell” seems to overstate the matter.
Stepping Around a TDD Roadblock
Programmers routinely give up on TDD when they try to do it in their toughest, meanest, most-valuable legacy code. I understand their impulse, but I think they’re setting themselves up for failure and ultimately missing out.
Which Kinds of Tests Should I Write?
Programmers routinely ask me for advice on which kinds of tests they ought to write: unit vs. functional, fast vs. slow, big vs. small. They keep saying “integration test” when they mean “integrated test”. We have made this confusing, so I’d like to take one step towards clarifying it.
The Saff Squeeze
Debug with automated tests: it’s systematic, it leaves a record of what we’ve learned, and it’s boring in the best possible ways.
Polynomial Kata in 46 Commits
An example of test-first programming, focusing on adding behavior incrementally and removing duplication.
Modularity and Performance
Are you worried that all these little classes and interfaces are going to destroy your system’s performance? Maybe. More often, however, the bottlenecks are caused by bigger classes and fewer interfaces causing duplication in the design.