Software Architecture Learning Path: 11 Levels
The software architecture learning path in 11 levels and 98 lessons: clean code, OO design, design patterns, DDD, data systems, microservices and production.
Level 1: Engineering Foundations
Make changes cheap: spot duplicated knowledge, hidden coupling and irreversible decisions early.
- Meet ShopFlow: The System You Will Architect — One small Spring Boot app, five years of growth, and the questions architects ask at every step.
- DRY Is About Knowledge, Not Code — The same business rule in three places is a bug waiting to happen — but similar-looking code is not always duplication.
- Orthogonality: Change One Thing, Break One Thing — Coupling, cohesion and designing parts that can change independently.
- Contracts, Assertions & Crashing Early — Defensive programming done right: fail loudly at the boundary instead of corrupting data quietly.
- Tracer Bullets & Prototypes — Build a thin end-to-end slice first, and throw prototypes away on purpose.
- Reversibility: Don’t Bet the Company on One Decision — Keep expensive decisions reversible with seams, abstractions and configuration.
- Debugging Like an Engineer — Reproduce, isolate, hypothesise, verify — a repeatable method instead of guessing.
- Automate Everything: Version Control, Builds & Pipelines — If you do it twice by hand, the third time it will go wrong.
Level 2: Clean Code & Professional Engineering
Write code others can safely change, and behave like a professional under pressure.
- Names and Functions That Explain Themselves — Good names and small functions turn code into documentation that cannot go stale.
- Separation of Concerns: Untangling the God Service — Split the 2,000-line OrderService by responsibility, one safe step at a time.
- Tests That Let You Change Code Without Fear — Unit, integration and end-to-end tests — what each buys you and what each costs.
- Test-Driven Development in Practice — Red, green, refactor on a real ShopFlow discount rule.
- Refactoring in Small, Safe Steps — Change structure without changing behaviour, protected by tests.
- Technical Debt: The Loan You Didn’t Know You Took — Deliberate vs accidental debt, interest payments, and how to pay it down.
- The Professional Engineer: Estimates, Deadlines & Saying No — Honest estimates, clear commitments and staying clean under pressure.
Level 3: Object-Oriented Design
Design classes and interfaces so new requirements mean adding code, not editing fragile code.
- Single Responsibility: One Reason to Change — A class should answer to one group of people with one kind of change.
- Open/Closed: Add Features Without Editing Old Code — Extend behaviour through new classes instead of growing if/else chains.
- Liskov Substitution: Subtypes That Keep Their Promises — When a subclass surprises its callers, inheritance becomes a trap.
- Interface Segregation & Dependency Inversion — Small interfaces owned by the caller, and business logic that does not depend on infrastructure.
- Composition Over Inheritance — Assemble behaviour from parts instead of building deep class trees.
- Encapsulation, Tell Don’t Ask & the Law of Demeter — Put behaviour next to the data it protects, and stop reaching through objects.
Level 4: Design Patterns
Recognise the recurring pain behind a design, and reach for the pattern that relieves it — or decide you do not need one.
- Patterns Are Answers to Recurring Pain — How to read a pattern: problem, forces, solution, consequences.
- Strategy: Pluggable Payment Methods — Replace a growing if/else over payment types with interchangeable processors.
- Factory Method & Abstract Factory: Creating the Right Thing — Centralise the decision of which implementation to create.
- Builder, and Why Singleton Is Usually a Trap — Readable construction of complex objects — and global state disguised as a pattern.
- Adapter: Taming Third-Party Payment Gateways — Make Stripe-like and Razorpay-like SDKs look like your own interface.
- Decorator: Adding Behaviour Without Touching the Core — Wrap a processor with logging, retries, metrics and fraud checks.
- Facade & Proxy: Simple Front Doors and Smart Stand-ins — Hide subsystem complexity; control access with caching, lazy loading and security proxies.
- Observer: Reacting to Order Events — Let email, analytics and loyalty react to “order placed” without the order knowing them.
- Command: Refunds, Retries and Queued Work as Objects — Turn requests into objects you can queue, log, retry and undo.
- State: An Order Lifecycle Without the Giant Switch — Model PLACED → PAID → SHIPPED → DELIVERED with objects that know their own transitions.
- Template Method: One Checkout Skeleton, Many Variations — Fix the algorithm’s steps, let subclasses fill the variable parts.
- Chain of Responsibility: Validation & Fraud Pipelines — Pass a request through a line of independent handlers.
- Composite, Bridge, Mediator, Iterator & Prototype — The less common patterns — recognise them when you meet them.
Level 5: Enterprise Application Architecture
Structure a business application into layers, choose how domain logic and data access are organised, and understand what your framework does for you.
- Layered Architecture: Presentation, Domain, Data — Why separating layers helps — and how layers become a lasagne of pass-through code.
- Transaction Script vs Domain Model vs Table Module — Three ways to organise business logic, chosen by how complex the logic is.
- Service Layer: One Front Door for Every Use Case — Define application boundaries, transactions and orchestration in one place.
- Active Record vs Data Mapper (and the Gateways) — Should objects save themselves, or should a mapper keep them ignorant of the database?
- Repository: A Collection-Like Home for Aggregates — Let the domain ask for objects without knowing about SQL.
- Unit of Work, Identity Map & Lazy Load — What JPA/Hibernate does for you — and how it surprises you (N+1, dirty checking).
- MVC, Front Controller & Friends — How Spring MVC’s DispatcherServlet embodies decades-old presentation patterns.
- Remote Facade & DTO: Designing Across the Network — Coarse-grained APIs and data transfer objects for expensive remote calls.
- Optimistic vs Pessimistic Offline Locks — Protect business transactions that span several requests.
- Enterprise Integration Patterns: Messaging Between Systems — Channels, routers, translators, dead letters and idempotent receivers.
Level 6: Domain-Driven Design
Model a complex business domain in code, and draw boundaries where the language changes.
- Ubiquitous Language: Code That Speaks the Business — One shared vocabulary between experts and code, per boundary.
- Entities vs Value Objects — Identity vs value: why Address and Money should not have ids.
- Aggregates: Consistency Boundaries That Protect Invariants — Group objects that must change together, and guard them behind one root.
- Domain Services vs Application Services — Where logic goes when it does not belong to a single entity.
- Domain Events: Things That Happened — Model important facts explicitly and let other parts react.
- Bounded Contexts: Where Words Keep One Meaning — A boundary around a part of the business where the same words mean the same thing.
- Context Maps: How Bounded Contexts Relate — Anti-corruption layers, shared kernels, customer/supplier, open host and more.
- Strategic Design: Core, Supporting & Generic Subdomains — Invest where you compete; buy or simplify the rest.
Level 7: Software Architecture
Identify the characteristics that matter, compare styles by their trade-offs, and record decisions so others understand why.
- What Architecture Really Is (and Isn’t) — Structure, characteristics, decisions and principles — and why “it depends” is the honest answer.
- Architecture Characteristics: The -ilities Under Pressure — Availability, scalability, performance, deployability… identified from real business scenarios.
- Architecture Styles and Their Trade-offs — Layered, modular monolith, microkernel, event-driven, space-based and microservices compared.
- The Modular Monolith — Strong module boundaries in one deployable — the most underrated architecture.
- Coupling, Connascence & Architecture Quanta — Measure how parts depend on each other, statically and at runtime.
- Architecture Decision Records — Write down context, decision and consequences so the “why” survives.
- Trade-off Analysis: Thinking Like an Architect — A repeatable way to compare options when there is no right answer.
Level 8: Data-Intensive Systems
Explain how databases store, replicate, partition and protect data — and predict how they fail.
- Storage Engines: B-Trees vs LSM-Trees — Pages and in-place updates vs append-only logs, SSTables and compaction.
- Indexes: Fast Reads, Slower Writes — How an index turns a full scan into a lookup, and what every index costs.
- Caching: Speed at the Cost of Truth — Cache-aside, write-through, TTLs, invalidation and stampedes.
- Replication: Leaders, Followers & Failover — Synchronous vs asynchronous copies, and what happens when the leader dies.
- Replication Lag: When Your Own Write Disappears — Read-your-writes, monotonic reads and consistent prefix reads.
- Partitioning: Hash, Range, Hotspots & Rebalancing — Split data across machines without creating hot partitions.
- Transactions & What ACID Actually Promises — Atomicity, consistency, isolation, durability — precisely, and without marketing.
- Isolation Levels: Dirty Reads to Serializable — Anomalies, MVCC, locks, and why “read committed” is not enough for money.
- Lost Updates: Optimistic vs Pessimistic Locking — Two admins edit the same product; one change silently vanishes.
- The Trouble With Distributed Systems — Unreliable networks, unreliable clocks and partial failure.
- Consistency Models, CAP & Consensus — Linearizability, eventual consistency and an honest reading of CAP.
- Logs & Kafka: Partitions, Offsets and Ordering — An append-only log as the backbone of data flow.
- Consumer Groups & Delivery Semantics — Scaling consumers, rebalancing, and at-least-once vs “exactly-once”.
- Batch vs Stream Processing & Data Pipelines — Derived data, reprocessing, and moving data between systems.
- Event Sourcing & CQRS — Store what happened; build read models for how you want to query it.
Level 9: Microservices
Decide whether microservices are worth it, draw service boundaries, and design communication and failure handling that survive production.
- Why Microservices Exist — and When Not to Use Them — Independent deployability is the point; complexity is the price.
- Finding Service Boundaries & Splitting the Monolith — Information hiding, bounded contexts and the strangler fig.
- Database per Service & Data Ownership — Why sharing a database couples services, and how to live without joins.
- Synchronous vs Asynchronous Communication — REST, gRPC and events — temporal coupling and its consequences.
- API Gateways, BFFs & Service Discovery — How clients find services, and what belongs at the edge.
- Timeouts, Retries & Retry Storms — Why naive retries turn a slow service into an outage.
- Circuit Breakers & Bulkheads — Fail fast, isolate damage, and recover gracefully.
- Idempotency: Making Retries Safe — Idempotency keys, deduplication and the myth of exactly-once.
- Distributed Transactions: 2PC, Sagas & the Outbox — Keep data consistent across services without a global transaction.
- Observability: Logs, Metrics, Traces & SLOs — Answer “why is checkout slow?” across ten services.
- Deployment: Containers, Kubernetes, Canary & Feature Flags — Ship small, ship often, and limit the blast radius.
- Testing Microservices & Consumer-Driven Contracts — Catch breaking API changes without a giant end-to-end suite.
- Teams, Ownership & Conway’s Law — Architecture and org charts shape each other.
Level 10: Architecture That Survives Change
Protect architecture characteristics automatically and evolve the system incrementally instead of by big rewrites.
- Architecture Erosion: How Good Designs Decay — Small shortcuts, repeated for a year, become the architecture.
- Fitness Functions: Tests for Your Architecture — Turn architecture goals into objective, automated checks.
- Automated Architecture Tests with ArchUnit — Fail the build when a module breaks a dependency rule.
- Incremental Change: Strangler Fig, Expand/Contract & Pipelines — Evolve a running system without big-bang rewrites.
- Evolving Data: Schema Changes Without Downtime — Parallel change, backfills and versioned events.
- Change Dimensions & the Last Responsible Moment — Decide late enough to know more, early enough to act.
Level 11: Production Architecture
Design, operate and reason about a system at global scale — and put every previous level together.
- Load Balancing & Horizontal Scaling — Spread traffic across instances and scale without sticky surprises.
- Reliability: SLOs, Error Budgets & Graceful Degradation — Decide how reliable is reliable enough, then engineer for it.
- Security Architecture for Backend Engineers — Authentication, authorisation, zero trust, secrets and threat modelling.
- Going Global: Multi-Region & Disaster Recovery — Active-passive vs active-active, RPO/RTO and data residency.
- ShopFlow 2030: The Whole Picture — Every decision from monolith to multi-region, and the trade-offs behind each one.