Luke recommended Working Effectively with Legacy Code. A couple of slide decks from CalPoly and Object Mentor cover some of the high points.

Essentially, Feathers defines legacy software as software without sufficient test coverage. Which is a sufficient insight in and of itself.

I love the idea of tests as a software vice. When machining metal, a vice holds the work steady. You don't use a vice to modify anything. It doesn't perform any operation aside from keeping your work oriented and positioned so you can do something to it. Tests are there to keep your software from squirming.