Refactoring: Improving the Design of Existing Code (2nd Edition) Martin Fowler

A nice touch in this textbook is the self-assessment quizzes after each lesson.