The Ten Software Architecture Books
What each source book contributes: The Pragmatic Programmer, Clean Coder, GoF, PEAA, DDD, DDIA, Building Microservices and more, joined into one mental model.
The Pragmatic Programmer (20th Anniversary Edition)
David Thomas, Andrew Hunt · 1999 · 2nd ed. 2019
Care about your craft, and design so that change stays cheap.
A book of habits and attitudes for working programmers: taking responsibility, avoiding duplicated knowledge, keeping components decoupled and orthogonal, building thin end-to-end slices first, keeping decisions reversible, debugging methodically, automating repetitive work, and treating estimation and requirements as skills.
The Clean Coder: A Code of Conduct for Professional Programmers
Robert C. Martin · 2011
Being a professional means being accountable for outcomes, not just for typing code.
A book about professionalism rather than syntax: owning the quality of your work, saying no (and meaning yes), handling pressure and deadlines, practising test-driven development, estimating with ranges, collaborating, and continuously practising the craft.
Head First Design Patterns & Design Patterns (GoF)
Eric Freeman, Elisabeth Robson, Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides · GoF 1994 · Head First 2nd ed. 2020
Find the part that changes, and put a stable interface in front of it.
The Gang of Four catalogue named 23 recurring object-oriented design solutions grouped as creational, structural and behavioural. Head First Design Patterns teaches the most useful of them through the problems that motivate them, alongside design principles such as encapsulating what varies, programming to interfaces, favouring composition, and keeping classes open for extension but closed for modification.
Fundamentals of Software Architecture & Software Architecture: The Hard Parts
Mark Richards, Neal Ford, Pramod Sadalage, Zhamak Dehghani · 2020 · 2021
There are no best practices in architecture — only trade-offs in context.
Fundamentals (Richards & Ford) frames architecture as trade-off analysis: identifying architecture characteristics (“-ilities”), choosing among styles such as layered, modular monolith, microkernel, event-driven, space-based and microservices, and recording decisions. The Hard Parts (with Sadalage & Dehghani) tackles distributed-architecture decisions: decomposing systems, data ownership, architecture quanta, coupling, and distributed workflows and transactions.
Patterns of Enterprise Application Architecture
Martin Fowler · 2002
Most business apps face the same structural problems — name them and choose deliberately.
A catalogue of patterns for building business applications, organised around layering and grouped into domain logic (Transaction Script, Domain Model, Table Module, Service Layer), data source architecture (gateways, Active Record, Data Mapper), object-relational behaviour and structure (Unit of Work, Identity Map, Lazy Load, Identity Field), metadata mapping (Repository), web presentation (MVC, Front Controller), distribution (Remote Facade, DTO), offline concurrency, session state and base patterns.
Domain-Driven Design: Tackling Complexity in the Heart of Software
Eric Evans · 2003
Put the business model at the centre, and draw explicit boundaries where its language changes.
A method for software whose main difficulty is the business domain itself. Tactical design gives building blocks (entities, value objects, aggregates, repositories, factories, domain services, domain events). Strategic design gives ways to divide large systems: a ubiquitous language shared with experts, bounded contexts, context maps, and distilling the core domain.
Building Evolutionary Architectures
Neal Ford, Rebecca Parsons, Patrick Kua, Pramod Sadalage · 2017 · 2nd ed. 2022
Architecture is never finished — so make change safe, measured and incremental.
How to build systems that support guided, incremental change across multiple dimensions. Introduces fitness functions — objective, automatable checks of architecture characteristics — plus incremental change through deployment pipelines, appropriate coupling, evolutionary data, and governance that protects architecture as the system changes.
Designing Data-Intensive Applications
Martin Kleppmann · 2017
Every data system is a set of guarantees and trade-offs — know exactly which ones you have.
How data systems really work and fail: reliability, scalability and maintainability; data models; storage engines (log-structured vs page-oriented); encoding and schema evolution; replication; partitioning; transactions and isolation; the trouble with networks and clocks; consistency and consensus; batch processing; stream processing; and deriving data between systems.
Building Microservices (2nd Edition)
Sam Newman · 2015 · 2nd ed. 2021
Microservices buy independent deployability and pay for it with distributed-systems complexity.
A broad guide to microservices: what they are and when to avoid them, modelling boundaries with information hiding and DDD, splitting monoliths incrementally, communication styles, workflows and sagas, build and deployment, containers, Kubernetes and serverless, testing, observability, security, resilience, scaling, user interfaces, and the organisational side — team structures and ownership.
Enterprise Integration Patterns
Gregor Hohpe, Bobby Woolf · 2003
Systems integrate best by exchanging messages through well-defined channels, not by sharing databases.
A pattern language for connecting separate applications through asynchronous messaging: message channels (point-to-point, publish-subscribe, dead letter), message construction (command, event, document messages, correlation identifiers), routing (content-based router, splitter, aggregator, process manager), transformation, and endpoints (competing consumers, idempotent receiver, transactional client).