5.0

Pros: The opening chapters give a great introduction to refactoring. The middle chapters are worth their weight in gold as a reference to object-oriented refactorings. Explains why refactoring is a necessity for us.

Cons: The final 3 chapters by other authors weren't very useful to me, exluding Beck's chapter, but don't necessarily detract from the book because I suspect others will find them relevant.

Summary: One of those "must have" books for all "classical" developers (procedural and object-oriented), unless you're already a refactoring whiz. All examples are written in Java.

Details: Seldom do I think a technical writing is worth 5 stars but in this case Fowler has an outstanding book. The topic, which is relevant to all programmers, is explained simply so that the benefits to using refactoring as part of the developer's minute-by-minute habits becomes obvious.

Whether by design or by accident the book is also an argument for many of the techniques that successful developers use today - writing tests first, utilizing design patterns and looking for "smells" in your code all play into refactoring.

The middle of the book is a recipe book of refactorings. For each technique you get "before" and "after" code, how to detect the problem that needs the refactoring, the steps to producing the refactoring, and the code in the intermediate stages of refactoring. This is the section that makes the book an excellent reference to keep next to you while you code.

The last few chapters are contributions from several authors. William Opdyke's chapter didn't say much to me, but he has a set of C++ refactorings that might be useful to others.

Don Roberts and John Brant have a chapter on refactoring tools. Again this wasn't very useful to me.

The final chapter is by Kent Beck and is not information-filled but tries to give you a sense of the "feel" of refactoring. Beck also contributes extensively in the chapter on smells and a chapter on "big refactorings".

I'm now interested to see if there are similar books by other authors for refactoring other languages - each language of course having distinguishing characteristics to make refactoring different. Especially non-OO features such as in JavaScript and Scala.