This document discusses principles and practices for unit testing legacy code. It covers background on large, old software projects with complex code. The motivation is that unit testing facilitates changes rather than finding bugs. Principles include keeping tests simple, not adding tests to bad code, avoiding assumptions, stopping production of new legacy code, and educating others. Practices include setting up a framework, domain modeling, identifying hot areas to start, using a bottom-up approach, learning functions through tests, and refactoring to make code testable and break dependencies. The document advocates bringing order to chaos and finding fun in deleting code and learning through testing.