Seasoned programmers will wince at a few snippets of advice scattered throughout the book - especially how quickly he glosses over the important modern tools such as "test first", refactoring, and "continuous integration" and how much time he spends on exploring poorly contrived metaphors. In fact, he seems to have a practical knowledge of software design but little theoretical background, knowledge of what literature has already been written on the subject, nor the ability to speak at a level high enough to really teach how to write clean code.
Just pages from a perfect example of the Proxy design pattern (which he doesn't call the Proxy pattern), he introduces design patterns (and gives it a single paragraph). Then he fails to wrap that very important topic into the rest of the text at all. When speaking about failed software projects, he uses Mozilla as a classic example of a failure even though it still exists in the form of the second most widely used web browser, Firefox.
Perhaps it sounds like I am nitpicking the book now. When talking to today's audience about how to handle legacy code, more words shouldn't be spent on the necessity for better upfront design than on refactoring, which is given about two sentences and a reference to Martin Fowler's book. That reference is followed closely with several pages that explain the different mythical "code monkeys" - an attempt to pigeon-hole ever programmer into one of a hand-full of personality types.
The author seems only generally familiar with most of the really important material which forces the book to over-generalize and miss important arguments over how to choose between options in the real world. Every time an important topic is raised, it is given a brief introduction and then we are fed more opinions about the psychology of programming.
I went back and read some of the reviews on Amazon.com of this book, just to make sure I wasn't missing something. The negative ones seem to have the same conclusion, and the positive ones seem to be coming from people who haven't read any of the better books already on the subject or assuming that this book is for novice programmers. The idea that novice programmers need a dumbed-down book is a little condescending in my opinion.
If you are a Java programmer, save yourself time and read a much better book: Effective Java. Otherwise, check out the list of alternative books in the negative reviews of this one for much better books.