Moves readers beyond syntax and mechanics to the principles behind fundamental software engineering decisions in object-oriented design. Uses Java examples as a illustration tool to show how principles can be applied to other object-oriented languages. Shows how to build reusable code and easily maintainable programs. Is the book that programmers wish they had when they were learning C++ and Java! Helps users build intuition about object-oriented design.