Refactoring sometimes devolves into an appalling mess. You're chasing a broken test suite, and every change just makes it worse. At other times it's a slow, controlled process culminating in dreadful design.
This talk presents an end-to-end refactoring that demonstrates strategies to avoid this.
The code example for the talk is an algorithmic folk tale ("I know an old lady who swallowed a fly..."). This is an easy to grasp domain. There is no need to understand complicated economics theory, or video encoding. The algorithmic component gives the code example a useful amount of complexity. The techniques that apply to this simple example also apply in the real world.
Duplication catches our eye, yet much of design is about encapsulating differences. Focusing on the bits that are alike leads to awkward abstractions.
This talk shows how focusing on differences instead of similarities provides a better outcome.