The topics covered include: understanding the mechanics of software change: adding features, fixing bugs, improving design, optimizing performance; getting legacy code into a test harness; writing tests that protect you against introducing new problems; techniques that can be used with any language or platform - with examples in Java, C++, C, and C#; accurately identifying where code changes need to be made; coping with legacy systems that aren't object-oriented; handling applications that don't seem to have any structure. This book also includes a catalog of twenty-four dependency-breaking techniques that help you work with program elements in isolation and make safer changes.