Working Effectively with Legacy Code – by Michael Feathers – covers how to refactor and add features to legacy code without breaking it. Legacy code, in the book, is just code without proper tests.
Of course, refactoring code without tests is always dangerous because it might be much harder to find any new bugs you have introduced.
The book covers many techniques with steps you can follow to make it easier and safer to apply these changes. The steps are well explained, with many good examples. There is also plenty of coverage on how to introduce tests on code that wasn't made with unit testing in mind.
Use of techniques in practical problems is also covered in the chapters before these sections, with titles such as I Can't get this Class into a Test Harness or This Class is too big and I don't want it to get any bigger.
There is some cross over with the Refactoring classic, but even in those cases the different context makes this worth your time.
Strongly recommended to anyone that needs to work on codes without tests.