Recommended reading list for software engineers. The majority of the books and talks that will be recommended are technology agnostic as these age well.
Foundation
These books are recommended as must reads for developers of all experience levels they cover software and agile/extreme practices that serve as a foundation for every programmer. More experienced programmers will also gain value from rereading these once every few years to help them stay focuses on core principles rather than becoming dogmatic about particular approaches.
Extreme Programming Explained - Kent Beck, Cynthia Andres
This is at the top of the reading list because it is by far the best bang for buck. In just 200 pages of large font Kent Beck and Cynthia Andres distil the practice of being a professional developer who has to deal with real world constraints. This book covers humanity, respect, feedback, working as a team, pairing, continuous integration, planning, quality, testing, and so much more.
Modern Software Engineering - Dave Farley
Dave’s modern software engineering builds on the principles and practices from Extreme Programming (XP). It uses what we have learnt in the industry since the 90s to fill in more detail and gives actionable techniques for applying the principles of XP. It begins by exploring the difference between a craftsperson and an engineer, covers all the foundational principles like the importance of measurements to working iteratively and getting feedback before moving on the management of complexity. The management of complexity is used as the context for why Modularity, Cohesion, Separation of Concerns (Dependency Injection, Domain Driven Design and architectural concepts like ports and adapters) and Coupling are discussed.
Intermediate
These are resources useful for any level but are more focused and specialized than the foundational reading.
Learning Domain-Driven Design - Vlad Khononov
This book talks about the analysis of business domains, building a ubiquitous language and takes it a step or two further by explaining how you can apply these principle in modern application and system design. Learning Domain-Driven Design manages to cover the same ground as other DDD books more concisely and then expands on the concepts by giving practical advice on how to use them. It covers distributed systems as well as large modular applications and spends a lot of time exploring the trade-offs between different designs and so is aligned with the way we think about design problems.
The Practical Testing Pyramid - Ham Vocke
An article on Martin Fowlers site rather than a book. This article explains different styles and scopes of automated test. This article builds a ubiquitous language around testing scopes and describes a lot of testing theory which is important for comprehensive automated testing.
Continuous Delivery - Jez Humble & David Farley
This book is a technology agnostic description of how to shorten feedback loops in the software delivery lifecycle and develop high quality software efficiently.
Advanced
Anyone can read these books/articles, and some value will be gained, but we feel that to get the most out of them, you will need to have some experience in the topic.
Designing Data-Intensive Applications - Martin Kleppmann
Subtitled “The big ideas behind reliable, scalable, and maintainable systems” this (rather thick) book is full of extremely valuable knowledge about Storage, Replication, Encoding, Partitioning, Transactions, Distributed Data, Stream & Batch processing, Consistency and consensus, data models and query languages. It does all this while being almost entirely tool agnostic.
Accelerate - Nicole Forsgren, Jez Humble & Gene Kim
This book is a conclusion of academic research into DevOps and where it provides value demonstrably to organisations. This book provides proof that DevOps works and explains the key metrics that organisation can use to get the most out of organisational change. This is the book to use to help convince management and leadership that DevOps and Continuous Delivery are worthwhile practices.
Reference
Only get these if you like using books for reference. These are not good learning resources to read front to back.
Site Reliability Engineering - Betsy Beyer, Chris Jones, Jennifer Petoff and Niall Richard Murphy
An operations handbook for running highly available services. Covers a huge amount of “Operations” knowledge you might not get elsewhere.
Design Patterns: Elements of Reusable Object-Oriented Software - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
Published originally in 1994, this is one of the most famous software books ever written. Collectively the authors are known as “The Gang of Four”.
The book is divided into two parts, with the first two chapters exploring the capabilities and pitfalls of object-oriented programming, and the remaining chapters describing 23 design patterns. The book includes examples in C++ and Smalltalk alongside diagrams of the pattern.
The first two chapters are a good read but really the point of the book is as a reference guide to the 23 design patterns.