A colleague asked me to recommend some books on software design. That’s a good opportunity to have a look at this particular part of my bookshelf and select a few highlights. As usual, you can’t go wrong by reading Fowler, but let’s see what we’ve got.
Ranging on the border between coding style and design, there are two candidates: Refactoring and Clean Code. Refactoring by Martin Fowler is a widely recognized classic that had a huge impact on the industry. It provides a catalog of refactorings, many of which have been integrated into IDEs like Eclipse. Clean Code by Robert C. Martin on the other hand focuses on coding style in a slightly wider context. Personally, I think Refactoring is a better read but if you’re looking for ways to improve your coding style and design, Clean Code probably offers more bang for your buck.
Next is the undying classic, Design Patterns: Elements of Reusable Object-Oriented Software by Gamma, Helm, Johnson, and Vlissides, also known as the Gang of Four. The book contains a rather large catalog of patterns that every software developer should be familiar with. This is a must-have if you’re serious about your craft. Being from 1995, the book is rather old with examples in C++ and Smalltalk and diagrams in OMT (one of the UML predecessors). A friend of mine suggested Design Patterns Explained as a more modern way to learn the classic patterns. Others prefer Head First Design Patterns, a good book certainly, but much too verbose for my taste.
Another good one is Patterns of Enterprise Application Architecture by Martin Fowler. The book shows how to structure your application (layering, organizing domain logic, database access, etc.) and is essential if you build larger business applications.
Domain Driven Design by Eric Evans is a great book that received its fair share of hype. It’s one of the few books that focuses entirely on creating expressive, flexible domain models. The book is rather long but extremely well written and one of the best technical books I’ve read. If you want to try before you buy you can watch some conference videos to get a first impression.
A rather new addition to my collection is Agile Principles, Patterns, and Practices in C# by Robert C. Martin. Usually, I wouldn’t read anything with C# in the title, but even as a Java guy, you can understand the book without problems. I bought it because it’s one of the few books to discuss package design, an area where many developers (including me) seem to struggle. The book is very practical and, like the title suggests, touches a lot of bases.
There are a lot more good books, especially pattern-centric ones, but my impression is that there’s much repetition. Once you’ve read the books above, you should know enough to focus on other, equally interesting topics.