I try to read at least one book per month. Reading is a nice way to spend the time when you’re on a plane, a train or a bus. It is a good example of the habit when in doubt, do something—when you have some time over, try spending it doing something useful.
There are a lot of good books on software development, but every now and again you come across a book that gives you a completely new perspective on how development should be done. Here is a list of books that I think every software developer should read, in no particular order.
- Domain-Driven Design: Tackling Complexity in the Heart of Software by Eric Evans
- Implementing Domain-Driven Design by Vaughn Vernon
- Specification by Example: How Successful Teams Deliver the Right Software by Gojko Adzic
- Release It!: Design and Deploy Production-Ready Software by Michael T. Nygard
- Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation by Jez Humble and David Farley
This is the book that coined the term domain-driven design as an approach to modeling the problem domain in a way understandable to domain experts, using the same terms all the way from verbal discussions to source code. Evans’ book is the reference on the theory of DDD. If you want to know what a bounded context is, or what are the transactional properties of an aggregage, this is the book to read.
If Evans’ book explains the theory of domain-driven design, this book explains the practice, and shows how to implement all the elements in DDD under different circumstances. This book also explains domain events in some detail, something that is mostly missing from Evans’ original book. Includes a lot of sample code, nicely interwoven with discussions of why the code is written the way it is.
The author introduces the term specification by example for a process that subsumes acceptance test-driven development and behavior-driven development as a way to specify requirements using concrete executable examples of how the system should behave, with a tool such as FitNesse. Done right, this also provides live documentation that is kept up to date since it is constantly being executed.
This is the book to turn to for tips on building robust systems that can be operated under real-life conditions. The author describes a number of patterns and anti-patterns for stability and capacity, and also devotes several chapters to practical operations. If you want to learn more about the circuit breaker pattern, for example, this is the book to read.
This book explains how to set up a delivery pipeline that lowers stress in the development team by making the release of a new version of a system a non-event, using automation and automated tests to guarantee quality in the system being delivered. The book includes a chapter on version control where the authors explain the benefits of developing on the mainline and avoiding branching as much as possible.