In the last few months I noticed that I’ve been recommending the same books again and again to new and also to experienced developers. For this reason I decided to put together a list of must-reads. The books I’ll recommend were good company during my journey from beginner to the level I’m currently at (whatever level that is ;)). Many fellow programmers were involved in assembling the list. Special thanks go to Frank Appel, Rüdiger Herrmann, Benjamin Muskalla and Ralf Sternberg.
The ordering of the list reflects my personal choice. Feel free to shuffle it ;). One important thing – if you buy a book from the list, always chose the English version. Even when a translation is available in your language, the original version is almost always the better choice.
If you are new to Java development, you need to get up to speed with the language first. Many books are available for this purpose. The content of these books are almost always the same, but the style of writing differs dramatically.
There are two books to learn the language that are worth recommending. Head First Java is nontraditional but really, really fun reading. As with all Head First books, it’s up to you to like them or not (I love them). Java, A Beginner’s Guide is a more traditional book that explains programming Java really well. Once you know the Java language, I recommend one book before you are granted the level of Journeyman (also valid for other languages). This is Test Driven Development by Kent Beck. It describes a way of development that reflects the way we code at EclipseSource. In my opinion Test Driven Development (TDD) should be part of the introductory education of every programmer.
As described in many books, a Journeyman is a developer who knows his language and has done smaller projects but still has a long way to go to being a professional. At the beginning of this stage I’m sure you didn’t agree with this statement (I didn’t, either). But after 5 to 6 years as a Journeyman, I’m convinced you will agree ;).
Knowing a language is not enough! You need to master it! For this purpose almost every experienced Java programmer will recommend reading Effective Java by Joshua Bloch. The Pragmatic Programmer is like a dictionary. It covers many topics you will face in your career as a programmer and therefore is a must-read. Knowing your language does not enable you to write good software. From my point of view learning about software design is one of the most important, long term challenges in the career of a programmer. For this, the Design Patterns Book by the Gang of Four is probably a good start.
When you have read Beck’s TDD Book you know that the golden rule is: red, green, refactor. Martin Fowler explains how the last step works in his Refactoring Book. After your tests are green and you have refactored the code you need to read Clean Code by Robert C. Martin at least twice. Once you’ve read it, I’m sure you will think about your code differently. The OSGi in Action book feels a little odd in this list. The reason it’s here is that I think modularity is one of the most important design principles. For a Java developer, learning about OSGi is a must. Remember when I said you won’t agree that you are not a professional unless you’ve been a Journeyman for several years? I’m sure you will reach this point after reading The Clean Coder. Robert C. Martin writes about himself and his journey becoming a professional in this book. It’s really an eye-opener!
I use the word “Professional” because many authors use it in this context as well. But I don’t like to use the word to categorize a programmer. Professional sounds like you are done. But this is simply false. As a programmer you can never stop learning! The books I put in this category are just “more advanced”. This means they either go deeper into detail or start to train you for leadership.
You can do quite a bit with Java without facing concurrency and as a Journeyman you will hopefully have a master in your team helping out with this topic. But there is a point in time when you will be the master. Thus mastering concurrency in Java is a must. Brian Goetz did a great job explaining the topic in his book Java Concurrency in Practice. Being a professional means taking responsibility. As a programmer this also means taking responsibility for legacy systems. Micheal Feathers made this boring topic fun in Woking Effectively with Legacy Code. As a professional you not only take responsibility for code, you also take responsibility for your team. Tom DeMarco and Timothy Lister write in Peopleware about how effective teams work and the important characteristics of an effective team. Explaining hard things right is one of the most difficult tasks. Few authors know how this works. Martin Fowler did a great job in Patterns of Enterprise Application Architecture which is an excellent lesson in software design.