The Timeless Way of Building
Alexander's argument that patterns are the language a living system uses to describe itself — the philosophical root the rest sits on.
The recurring shapes of software, what they cost, and when not to reach for them.
Patterns are the vocabulary of engineering judgment. Once you can name the shape of a problem, you can argue about whether to reach for it. Without the names, you reinvent the same five solutions every year and never learn which one paid back. A working index of patterns at every scope: code, architecture, discipline, plus the anti-patterns worth refusing on purpose.
Every entry names what the pattern costs, not just what it gives you. Every entry says when not to reach for it. The Foundations section anchors the lineage. The Patterns by Category section is the working index. The new shapes emerging with LLM-driven agents live in their own directory now: Patterns for the Age of Agents.
The lineage. Books and essays the rest of this directory is in conversation with — some load-bearing today, some worth knowing as the argument behind a pattern, some kept for historical orientation.
Alexander's argument that patterns are the language a living system uses to describe itself — the philosophical root the rest sits on.
253 architectural patterns at every scale; the structural model every software pattern book has imitated since.
The 'Gang of Four' book: 23 patterns that defined the shared vocabulary of object-oriented design for a generation.
The canonical reference for Reactor, Proactor, Active Object, and the rest of the concurrency-pattern vocabulary.
Beck on the small daily moves that make code communicate: naming, control flow, classes, methods — the line-level patterns.
Feathers on the seam-and-test techniques for changing code you didn't write and don't fully trust — the toolkit of careful change.
Hickey's distinction between simple (one fold) and easy (familiar), and why we keep choosing easy and paying for it later.
Hickey on solving by thinking: the case for slowing down before the keyboard and the case against optimizing typing speed.
Helland's frame for why data crossing service boundaries has different rules than data inside one — the basis of CQRS and Outbox.
Helland's argument that scalable systems must compose around idempotent messages and entities, not global transactions.
Date's relational primer, the through-line back to Codd's 1970 paper that still shapes how we think about data shape.
Bateson's coinage for a system that learns together with its parts — Jessica Kerr's frame for living software teams.
Lampson's 1983 pattern-shaped collection of design hints — separation of concerns, end-to-end principle, get it working first.
Pólya's 1945 method for problem-solving — understand the problem, plan, execute, review — the meta-pattern under every pattern below.
Patterns grouped by where they live in the system. Each category intro names the scope. Click a pattern name for its canonical reference, then read the per-pattern resources below for what it costs and when not to use it.
Code Patterns. How objects and modules come together. Builder, Fluent Interface, Dependency Injection, Factory variants, and Newtype — the moves that decide whether a system feels assembled or merely concatenated. Useful when construction logic is obscuring the thing being constructed.
Fowler's bliki entry on chained methods that read like a sentence — the canonical naming of the pattern.
Step-by-step explanation of Builder with structural diagrams and language-specific examples.
Bloch's reference treatment: builders beat telescoping constructors and JavaBean setters once you cross a handful of fields.
Fowler's definitive essay separating IoC, DI, and Service Locator and naming the three injection variants.
Book-length treatment of DI: composition roots, lifetimes, and the patterns that pay off without a container.
Shore's short, plain-language piece that strips DI down to what it actually is — handing collaborators in, by name.
Catalog entry from Refactoring 2e for swapping noisy constructors for variant-named factory functions.
Walkthrough of Factory Method vs. Abstract Factory with code in multiple languages.
Rust's canonical demonstration of wrapping a primitive in a tuple struct to gain compile-time distinction.
King's foundational essay: lift validation to the type level so invalid states cannot be represented.
Code Patterns. How the next step is chosen. Strategy, Command, Pipeline/Chain of Responsibility, Middleware, Visitor, and State Machines turn nested conditionals into named operations. Reach for them when the if-tree has grown its own gravitational pull.
Diagrammed walkthrough of swappable algorithms behind a single interface, with multi-language examples.
Refactoring catalog move that often produces Strategy as its destination shape.
Encapsulating a request as an object so it can be parameterized, queued, logged, and undone.
Fowler on stacking concerns (logging, auth, retry) onto Command objects via decoration.
Diagrammed walkthrough of handler chains, where each link decides whether to act or pass.
The Go team's reference text on composing concurrent stages with channels, including fan-out and cancellation.
Canonical worked example of a middleware stack: each function gets next(), runs code before and after, composes.
Django's framework-side view of middleware as ordered request/response hooks with explicit lifecycle.
Double-dispatch walkthrough of separating an operation from the data structure it traverses.
Wadler's framing of the design tension Visitor addresses — adding cases vs. adding operations.
Harel's 1987 paper introducing statecharts — the formal extension of finite state machines for real software.
Living catalog of statechart concepts with examples, used by XState and other practical libraries.
Code Patterns. Where one model ends and another begins. Adapter, Facade, Anti-Corruption Layer, Ports and Adapters, and Repository are the load-bearing options for keeping a clean core from being infected by whatever shape the outside world arrived in.
Fowler's PoEAA catalog entry for the gateway role — the architectural sibling of the Adapter pattern.
Walkthrough of presenting a single, simpler interface in front of a tangled subsystem.
Microsoft's pattern catalog entry: when to insert a translation layer between legacy and new bounded contexts.
Original source of Anti-Corruption Layer in the DDD blue book; chapters on context maps remain the reference.
Cockburn's original Hexagonal Architecture essay — the source paper for Ports and Adapters.
Practical walkthrough of designing primary and secondary ports with concrete adapters and dependency direction.
Fowler's PoEAA catalog entry: a collection-like interface mediating between the domain and the data mapping layer.
Code Patterns. How failure is named and recovered from at the function and module level. Result/Either, errors-as-values, Retry with Backoff, and code-level Circuit Breaker and Bulkhead are about making partial failure a thing the program can reason about instead of a thing that escapes upward.
Rust's reference treatment of Result<T, E> — the canonical typed-error API in mainstream programming.
Wlaschin's diagrams-and-prose argument for chaining Result-returning functions — the strongest accessible essay on the model.
The Go team's defense of returning errors as values — the foundational case for the style outside Haskell/ML.
Pike's follow-up post on actually using error values as ordinary data, not as a try/catch substitute.
Brooker on why jitter is mandatory, how to think about retry budgets, and where retries make outages worse.
Simulator-driven walkthrough of full jitter vs. decorrelated jitter and why naive exponential backoff isn't enough.
Fowler's bliki entry codifying Michael Nygard's circuit breaker into the cross-language pattern vocabulary.
The original source for Circuit Breaker, Bulkhead, and most operational resilience patterns now in common use.
Microsoft's pattern catalog entry on isolating workloads so one runaway can't sink the others.
Code Patterns. How parallel work is structured and survived. Actor model, Producer/Consumer, Fan-out/Fan-in, Supervisor Trees, and the Borrow-checker discipline are the patterns that turn concurrency from a bug source into a working assumption.
The Go team's reference text on composing concurrent stages with channels, including fan-out and cancellation.
Compact introduction to actors, mailboxes, and supervision — the lightest accessible primer in print.
The canonical reference for actors and supervision trees — what every later actor framework is reimplementing.
Hello-world treatment of channels as queues between producer and consumer goroutines.
The reference text on fan-out / fan-in with channels, including correct cancellation semantics.
Erlang's documentation of supervisor strategies (one_for_one, rest_for_one, etc.) — the source of the vocabulary.
The reference chapter on Rust's ownership and borrowing rules — the move that turned data races into compile errors.
How Send/Sync and the borrow checker compose into the 'fearless concurrency' guarantee Rust advertises.
Architecture Patterns. How a system holds memory and tells the truth about it. Event Sourcing, CQRS, Outbox, Saga, Materialized Views, and OLTP/OLAP separation are the moves that decide whether your data model can evolve once it has users.
Fowler's foundational essay defining event sourcing as the persistence model for the audit-as-truth approach.
Young's free book on the operational reality of event sourcing — schema evolution, snapshots, and event upcasting.
Fowler's bliki entry — the warning label as much as the definition, naming when CQRS is a load-bearing choice.
Young's original collected writings on CQRS — the source the rest of the literature footnotes.
Richardson's canonical catalog entry: write the event in the same DB transaction, then relay it.
Worked example of the outbox pattern using Debezium and Kafka to ship events from a Postgres table.
Richardson on coordinating long-running cross-service transactions with local steps and compensations.
The original 1987 paper introducing the Saga as a model for long-lived transactions.
Postgres reference for declaring, populating, and refreshing materialized views — the no-frills mechanism reference.
Clear vendor-side primer on transactional vs. analytical workloads and why they want different stores.
Kleppmann's reference text on the data-shape decisions that underpin OLTP/OLAP, event sourcing, and CQRS.
Architecture Patterns. How services agree on what happened. Request/Response, Work Queues, Dead Letter Queues, Idempotency Keys, and Choreography vs. Orchestration are the wiring decisions behind any system that crosses a network and still needs to be reasoned about.
Richardson on coordinating long-running cross-service transactions with local steps and compensations.
The canonical EIP catalog entry — synchronous request/response in messaging terms, including correlation IDs.
Reference tutorial on competing-consumer worker pools backed by a durable queue.
Yanacek on queue design that survives backlogs — dead-letter queues, prioritization, and shedding.
The mechanism reference: how DLQs are configured, when messages move there, and how to drain them.
Brandur's worked-example essay on building Stripe-style idempotency at the application level.
Stripe's public API documentation on idempotency keys — the de facto reference clients are built against.
Richardson's framing of the two saga coordination styles, the trade-offs, and when each one collapses under load.
Architecture Patterns. The shape of the deployment. Monolith, Microservices, Modular Monolith, Backends for Frontends, Strangler Fig boundary, Service Mesh, and Sidecar are about where the seams between teams and runtimes actually live.
Fowler's case for starting with a monolith and only splitting once the domain has been understood.
The 2014 article that named and characterized the style — still the most-cited definitional reference.
Newman's reference text covering boundaries, deployment, integration, and operational reality of microservices.
Grzybek's canonical primer with worked example showing module boundaries enforced inside one deployable.
Newman's original BFF essay — the case for per-client backends rather than one API to rule them all.
Fowler's bliki entry naming the pattern after Alexander's strangler fig — wrap, replace, delete.
Istio's own framing of the service-mesh problem and how a control plane plus sidecars solve it.
Linkerd's overview — the lighter, Rust-based alternative to Istio with the same shape.
Microsoft's catalog entry on the sidecar deployment pattern, with concrete examples and trade-offs.
Architecture Patterns. How a system bends without breaking when things go sideways. Bulkhead between services, Circuit Breaker across services, Back-pressure, Load Shedding, and Graceful Degradation are the moves that turn partial failure into a user-acceptable outcome.
Fowler's bliki entry codifying Michael Nygard's circuit breaker into the cross-language pattern vocabulary.
The original source for Circuit Breaker, Bulkhead, and most operational resilience patterns now in common use.
Microsoft's pattern catalog entry on isolating workloads so one runaway can't sink the others.
Yanacek on queue design that survives backlogs — dead-letter queues, prioritization, and shedding.
AWS Well-Architected guidance on partitioning so a failure in one cell doesn't take down the others.
AWS's whitepaper on cell-based architecture — the scaled version of the bulkhead pattern at AWS itself.
Microsoft's reference for circuit breaker at the service level, with state diagram and trade-offs.
The reactive-systems glossary's definition of back-pressure — the place the term entered the working vocabulary.
Yanacek on load shedding: pick what to drop near capacity so the critical path stays inside its budget.
AWS's framing of static stability — design so a dependency's failure changes nothing observable.
Architecture Patterns. How a system changes shape without stopping. Strangler Fig at the system level, Expand/Contract Schema, Parallel Run, Dark Launches, and Feature Flags as architecture are the patterns of taking a running system from one shape to a better one without an outage.
Fowler's bliki entry naming the pattern after Alexander's strangler fig — wrap, replace, delete.
Sadalage and Fowler's foundational article on evolving schemas alongside code via expand/contract.
Companion catalog to the Refactoring Databases book — concrete database-level refactorings with steps.
The definitional entry: expand, migrate, contract — making breaking changes a three-step backward-compatible process.
LaunchDarkly's working definition of dark launches and where they sit alongside feature flags and canaries.
Hodgson's reference taxonomy — release, ops, experiment, and permission toggles, and how their lifetimes differ.
Patterns of Discipline. How big changes ship in small, reversible steps. Branch by Abstraction, Expand/Contract Schema+API, Parallel Change, and Feature Toggles are about keeping main shippable while a multi-week refactor or migration is in flight.
Sadalage and Fowler's foundational article on evolving schemas alongside code via expand/contract.
Companion catalog to the Refactoring Databases book — concrete database-level refactorings with steps.
The definitional entry: expand, migrate, contract — making breaking changes a three-step backward-compatible process.
Hodgson's reference taxonomy — release, ops, experiment, and permission toggles, and how their lifetimes differ.
The bliki entry codifying the technique — hide what's being replaced, swap, then collapse the seam.
The book that put trunk-based development, feature toggles, and branch by abstraction into the mainstream.
Working-engineer walkthrough of the discipline as a three-step ritual for schema and API changes.
Stripe's approach to additive API versioning and deprecation windows — the API-layer expression of expand/contract.
Working-engineer guide to keeping flags healthy in production: ownership, retirement, and limits.
Patterns of Discipline. How a team agrees the work is done. Review-as-Conversation, Characterization Tests, Golden/Snapshot tests, Property-Based Testing, and Mutation Testing are about raising the floor of trust without lengthening the queue.
Google's published guidance on review as a fast, collaborative pass that's primarily about understanding.
Slimmon on the reviewer's job as shared understanding, not gatekeeping — the texture beneath 'review-as-conversation.'
Stripe's reflection on tuning review for a high-trust IC-heavy org and the queue-time cost of gate-shaped review.
Feathers' canonical chapter introducing characterization tests as the safety harness for changing untrusted code.
Jest's documentation — the working-engineer reference for snapshot tests in mainstream JavaScript projects.
Cross-language site for approval/golden testing as a refactoring scaffold — the form Emily Bache popularized.
Bache's most-cited kata — approval tests as the refactoring scaffold that lets you change legacy code safely.
Hypothesis project's working-engineer essay on what property-based testing actually is and why it pays off.
The original QuickCheck paper — the source of property-based testing as a working idea.
Wayne on PBT as a design tool — writing the property is the work that pays off whether or not a bug is caught.
Henry Coles' Pitest documentation — the most pragmatic working-engineer source on mutation testing today.
Patterns of Discipline. How a team keeps the running system trustworthy. Runbooks as Code, the Four Golden Signals, Error Budgets, Blameless Postmortems, and On-Call as Pattern are the small habits that compound into operational excellence.
Skelton & Thatcher's open-source runbook template — the working starting point for codifying ops knowledge.
The chapter that introduced 'four golden signals' as the minimum monitoring vocabulary for any service.
The canonical step-by-step for defining SLIs, SLOs, and burn-rate alerts that translate into error budgets.
The follow-up chapter — what to actually do when the budget is gone, written as a policy template.
Allspaw's foundational essay — the source the rest of the postmortem literature footnotes.
The SRE book chapter on on-call as a designed practice — page quality, rotations, and follow-up as artifacts.
Sridharan's working-engineer treatment of what good observability buys an on-call rotation: alerts you can act on.
PagerDuty's open-source incident-response training — IC roles, communications, and handoff as a working artifact.
Anti-Patterns. The shapes worth naming so you can refuse them. Each entry below is something that solved a real problem at first and then quietly went toxic. Recognizing the shape is the whole point — the cure is usually one of the patterns above.
Fowler's case for starting with a monolith and only splitting once the domain has been understood.
Bogard names the failure mode: microservices that must deploy together — the worst of both shapes.
The original article — read with hindsight, contains the warnings about premature service boundaries baked in.
The original portland-pattern-repository entry naming the anti-pattern of one omniscient class.
Smell catalog entry on modeling domain concepts with raw primitives, with refactoring moves to escape it.
Fowler's bliki entry naming the anti-pattern: domain objects reduced to data bags with logic scattered into services.
Metz's essay: duplication is far cheaper than the wrong abstraction — the working-engineer answer to over-DRY.
Verraes restating DRY in terms of knowledge — the case that 'two pieces of code look alike' isn't a reason to merge them.
Batchelder's essay arguing that 'just config' is just code without the tooling that makes code maintainable.
The 1997 paper that named the most common production architecture — emergent, unstructured, somehow still shipping.
Long-running c2 wiki thread cataloguing why singletons end up being global state by another name.
The naming of the anti-pattern: encoding meaning into strings the compiler can't see — joke and warning at once.
Smell catalog entry — hooks and indirection added 'just in case' that arrives only as confusion for later readers.
Writers consistently publishing substantive material on patterns, design, and the discipline of software. The bench this directory leans on.
Short answers to the questions that recur about how to read this directory and how to use patterns honestly.
The honest version: read the catalog before you start, then ignore it while you write the obvious solution, then come back when the obvious solution starts to hurt. Patterns are most useful as names for a shape you've already drawn at least once — they shorten the next conversation about it, they don't replace the first attempt. Fowler's Patterns of Enterprise Application Architecture is the best 'read once, refer back forever' starting place.
Source: Martin Fowler: Patterns of Enterprise Application Architecture
When changing one service requires deploying others in lockstep, you're paying the operational cost of distribution and keeping the coupling of a monolith. The diagnostic: if every release ships more than one service, or if your release notes are organized by 'changes in services A, B, and C this week,' the seams are wrong. Fowler's MonolithFirst remains the cleanest argument for delaying the split until you've actually learned where the boundaries are.
Source: Martin Fowler: MonolithFirst
Expand and contract: add the new shape, dual-write to both, migrate readers, then remove the old. Each step is a deploy in its own right; you never do more than one shape-changing step at a time. The same dance applies to APIs (parallel change) and to system-level rewrites (strangler fig). Sadalage and Fowler's evolutionary database design essay is the reference, and Tim Evans' walkthrough is the cleanest working-engineer post on the discipline.
If you treat them as code with a lifecycle, yes; if you treat them as runtime configuration with no expiry, no. The flags that pay off are short-lived release toggles that come out within a release or two, and a small handful of long-lived ops toggles that you actually exercise. Pete Hodgson's reference taxonomy separates the four kinds and is the right place to start. The anti-pattern is a flag graveyard where nobody knows which branches are live in production.
Source: Pete Hodgson: Feature Toggles
When you can state an invariant — a sentence of the form 'for any input that looks like X, the output must satisfy Y' — and the cost of finding the edge cases yourself is too high. PBT is especially good for parsers, serializers, and pure functions on domain types; less good when the function's behavior is irreducibly example-shaped. The Hypothesis project's intro essay is the working-engineer entry point, and Wlaschin's railway oriented programming pieces compose well with it.
Source: What is Property Based Testing?
Because you're changing behavior without a harness, and you don't yet have a definition of what 'unchanged' means. The answer Michael Feathers gave twenty years ago still holds: characterize the current behavior with tests before you change anything, even when those tests pin down behavior nobody likes. Then change the system in seams the tests cover. The Working Effectively with Legacy Code chapters on characterization tests and seams are the canonical reference.
When the cost of moving away from it exceeds the cost of anything else you'd do this quarter, and when each new feature is paying interest on the same structural debt. Anti-patterns rarely cause incidents; they cause slowdown that's invisible until you compare your delivery cadence to a peer team's. The Big Ball of Mud paper is the most honest description of how the shape arrives — by no decision, by every decision being local and time-pressured. The cure is always a sequence of small, named patterns above, applied with patience.
Source: Foote & Yoder: Big Ball of Mud
Three things compound: naming that an agent's index can rely on, modules small enough to fit in a context window, and a machine-readable file (AGENTS.md is the emerging convention) that tells the agent the conventions, commands, and tests it should respect. The verification layer matters as much — property tests, snapshot tests, and type checks become the fences an agent must clear before merge. None of this is specific to agents; agents just punish the codebases that didn't already do it.
Source: AGENTS.md
Original writing coming.
Smarter Dev essays, walkthroughs, and short courses on naming the shapes you're already working with — and arguing about whether to reach for them — will land here as they're written.
Join the Discord to be notifiedLast updated