InfoQ Editors' Recommended Reading List
We recently had a conversation amongst the InfoQ editorial team about the books we would most recommend to InfoQ readers based on the books that we felt had most influenced us as programmers, architects and managers. Here is the resulting list of sixteen books that we eventually agreed on, plus a few other tips, with comments from the editors who originally suggested them.
Extreme Programming Explained (Kent Beck) is a good intro to XP, and even if you don't subscribe to the everything-agile approach, it makes a good read. Probably not a reference tome though.
My reference guide is An introduction to algorithms (Cormen/Leiserson/Rivest/Stein) which is an insanely dense but very worthwhile book.
Troubled IT Projects by John Smith is probably one you've not come across before, but actually explains a number of things that can go wrong in managing a project. It's also quite fun as a scorecard on the project you're currently working on ...
What I think probably is worth observing, though, is that it depends what level of experience you have as to which type of book you like (or should be recommended). Kent's XP book is good for novices and people not familiar with agile, but Cockburn's might be better for a more experienced person. Similarly, I wouldn't foist the introduction to algorithms on a complete newbie, but if you want to know how to implement B-trees or understand complexity measurements of algorithms, it's indispensable.
Set in the highly collaborative environment of agile software development, Jean Tabaka's book entitled Collaboration Explained: Facilitation skills for software project leaders provides answers to tough management issues like conflict, interpersonal communications, and time constraints. If you hate meetings and/or believe they should improve, you must read this book - whether you are involved in an agile project or not!
Structure and Interpretation of Computer Programs by Harold Abelson, Gerald Jay Sussman, and Julie Sussman: I was recommended 'SIC-P' a few years ago when I was chatting to a friend about the fact my coding ability seemed to have plateaud. It isn't a particularly easy book and if you're after quick drop-in solutions for a problem then this isn't the book you are looking for. It is, however, rewarding, dense reading and it has probably had more impact on my coding then anything else I've read.
Design Patterns by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides is a good follow-on book from SIC-P, though I'll admit I wasn't a fan of it the first time I read it. Whilst it undeniably captures a wealth of object-oriented design expertise in one place, I felt initially that much of it was interesting theory that I would never really use. As time has gone on though I've come to appreciate the ideas more and more and I still regularly refer to it when I'm stuck with a piece of design work. Highly recommended.
Agile Software Development: A Cooperative Game (2nd Ed) by Alistair Cockburn. Possibly the most interesting book I've ever read about agile software development. It's not about any one methodology, instead Alistair analyzes game play, individual communication, team cooperation: the elements that are the core of all software development. The book also includes sections on agile outside of software, a survey of the various methodologies and much more.
The Wisdom of Teams by Jon Katzenbach and Douglas Smith - A pre Agile book, Katzenbach and Smith study real teams in many industries providing some real analysis and rigor to the question of what made these teams successful. By the end of the book you will discover that "Nothing can guarantee the creation of high performance teams. The best you can do is put in place the conditions that will help them form." This book was at the core of my series Why Scrum Works.
Patterns of Enterprise Application Architecture by Martin Fowler: I like this book because it's a single information resource on pretty much all the design problems an architect or a developer runs into when working on a typical software development project. It may be the best patterns book (along with Gang of Four design patterns) that covers topics like domain logic, presentation layer, managing session state, and object-relational structural and behavioral patterns. Like any good resource, the patterns discussed in this book are relevant and valid, whether you are still using pre-EJB3 J2EE technology, JEE, or light-weight frameworks like Hibernate and Spring, or a .NET application. A must-read and must-own book for every developer.
Domain-Driven Design by Eric Evans: This book has been a great reference to the software development community since it was released in 2004. It stresses the importance of aligning business domain with software design and development. Some of the concepts discussed, like Ubiquitous Language, Model-Driven Design, Bounded Context, and Anti-corruption Layer, can be used in any medium to large size business domain to manage the complexity of the domain model. After reading this book I started applying the DDD principles in my projects wherever applicable and I have been successful in eliminating anemic domain models and handling business logic in a more OO way. The concepts discussed in the book are technology and framework independent so they can be applied in any software development project based on Java, .NET or other technologies. Also, this book was the main inspiration for my "Domain Driven Design and Development In Practice" article published last year. This book is a must read for any software developer who is involved in creating or managing a business domain.
Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions by Gregor Hohpe and Bobby Woolf: This has been one of my favorite books since 2004 when I first read the book. The authors have nicely organized and described several asynchronous design patterns useful in every day enterprise applications, especially those involving multi-system integration. The core discussion is on various integration styles including "Messaging" which is the heart of asynchronous communication patterns. The examples in the book include the popular loan broker process application which has been implemented in several recent ESB frameworks. This book has been an inspiration to most of the recent SOA integration and ESB frameworks (like ServiceMix, Mule, and Spring Integration) which support the integration patterns discussed in the book.
Peopleware - Productive Projects and Teams by Tom DeMarco and Timothy Lister: I read this book last year after it was recommended by a friend. I have to say it was one of the most influential books I've ever read. In the book, the authors demonstrate, with the help of industry examples, surveys, and statistics, that major problems in software development are human (hence the title Peopleware), not technical (like hardware or software). Their theory is that developers, designers and other brain-workers reach a state called the "flow", where they can make great strides towards solving complex problems. But any interruption, whether it's an e-mail, a phone call, or a walk-up, will break this flow and it takes time (15 minutes on average based on the statistics) to get back into the flow again. According to the authors, a manager's job is not to make the team members work but to make it possible for them to work. It has been more than 20 years since this book was first published and the concepts discussed in the book are still relevant and valid even after the emergence of all the new software development technologies and frameworks, and agile project management methodologies. This book is a must read for every manager and team-lead out there whose responsibility is to manage the team members. I highly recommend this book for every software manager to read - more than once.
Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt brings the Pragmatic Programmers point of view to the ultimate platform: the gray matter inside our noggins. It contains many ways to help improve learning, working etc., for one by using the Dreyfus learning model.
Inside the Machine: An Illustrated Introduction to Microprocessors and Computer Architecture by Jon Stokes collects years of articles on CPUs and other technology from Ars Technica. Jon Stokes ('Hannibal') cracks open the black box of the CPU, pointing out the interesting bits here and there - and he does so with modern CPUs such as recent x86 and Power CPUs. Knowing how instruction fusion helps improve reorder buffer efficiency is great for water cooler discussions - but knowing how memory hierarchy and cache behavior impacts performance on modern CPUs might just help you optimize yourself out of a tight corner.
Also have a look at the proceedings of the HOPL conferences. Many of the papers are available online and they're also available in printed form. It seems like the drab world of C-like, imperative, curly braces languages might be spiced up by a variety of paradigms. And as these things go: the languages or ideas of the future have been around for decades. The HOPL papers are detailed histories of many languages which either have had their time in the limelight or whose time might come, be it Smalltalk, Erlang, Lua, LISP, or many others.
Alan Kay's paper on The Early History of Smalltalk is a wealth of information. I've started re-reading it every year - somehow I always find something new; at the last reading I realized just how much original Smalltalk was based on the Actors model.
The HOPL papers are obviously mostly about history - but I find that many developers lack even the basic knowledge of events that happened and technologies that were developed before, oh, 1995. It's a bit disturbing to show 40 year old technology to 'experienced' developers and see them gasp with disbelief (which has the benefit of appearing like Prometheus bearing a novel gift from above, although that gets boring pretty fast).
Effective Java by Joshua Bloch: Effective Java is widely revered as one of the bibles of Java development. It gives the reader an understanding of not only what is available in the language, as many other books do, but of how to most effectively make use of the Java language and APIs to create fast, reliable, scalable and maintainable software. Many of the principles are also applicable to other programming languages, as a lot of the principles of good software design are universal ones. I found that, after reading this book, I looked at the code that I wrote in a different light - it became easier to read, there were less lines of code overall, and it was easier to fix bugs when I came back into it later. I consider this book an essential read for anyone that does development in the Java language - it doesn't just tell you what is there, but also tells you when and how to use it most effectively.
One of the best books I've read in recent years is Michael Nygard's Release It! – filled with practical advice from someone who makes stuff work for a living. The book is filled with war stories showing where large-scale systems fail, and Michael uses his vast experience to extract some common anti-patterns, problems that occur again and again in naive designs. He then shows how to address them using appropriate patterns. I found this book to be highly entertaining for the anecdotes from real life alone, and full of practical advice applicable every time you build systems that actually need to work.
correction - introduction to algorithms authors
Re: correction - introduction to algorithms authors