<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software Architecture on Software Engineering Learning Paths</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/</link><description>Recent content in Software Architecture on Software Engineering Learning Paths</description><generator>Hugo</generator><language>en</language><atom:link href="https://kyngo.github.io/learning-paths/paths/software-architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>Architecture Fundamentals</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/01-architecture-fundamentals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/software-architecture/01-architecture-fundamentals/</guid><description>&lt;h1 id="architecture-fundamentals"&gt;Architecture Fundamentals&lt;a class="anchor" href="#architecture-fundamentals"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Software architecture is the set of significant decisions about the organization of a software system — the selection of structural elements and their interfaces, their behavior as specified in collaborations, and the composition of these elements into progressively larger subsystems.&lt;/p&gt;
&lt;h2 id="what-is-software-architecture"&gt;What Is Software Architecture?&lt;a class="anchor" href="#what-is-software-architecture"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Architecture is not about the code. It&amp;rsquo;s about the &lt;strong&gt;decisions that are costly to change&lt;/strong&gt;. These decisions shape the system&amp;rsquo;s ability to meet both functional requirements and quality attributes.&lt;/p&gt;</description></item><item><title>Design Patterns</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/02-design-patterns/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/software-architecture/02-design-patterns/</guid><description>&lt;h1 id="design-patterns"&gt;Design Patterns&lt;a class="anchor" href="#design-patterns"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Design patterns are reusable solutions to common problems in software design. They are not ready-made code — they are templates for solving problems that occur repeatedly in different contexts. Understanding when (and when not) to apply them is a core architectural skill.&lt;/p&gt;
&lt;h2 id="pattern-categories"&gt;Pattern Categories&lt;a class="anchor" href="#pattern-categories"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;graph TD
 DP[Design Patterns] --&amp;gt; C[Creational]
 DP --&amp;gt; S[Structural]
 DP --&amp;gt; B[Behavioral]
 
 C --&amp;gt; C1[Singleton]
 C --&amp;gt; C2[Factory Method]
 C --&amp;gt; C3[Abstract Factory]
 C --&amp;gt; C4[Builder]
 C --&amp;gt; C5[Prototype]
 
 S --&amp;gt; S1[Adapter]
 S --&amp;gt; S2[Facade]
 S --&amp;gt; S3[Decorator]
 S --&amp;gt; S4[Proxy]
 S --&amp;gt; S5[Composite]
 
 B --&amp;gt; B1[Strategy]
 B --&amp;gt; B2[Observer]
 B --&amp;gt; B3[Command]
 B --&amp;gt; B4[State]
 B --&amp;gt; B5[Template Method]&lt;/pre&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Category&lt;/th&gt;
					&lt;th&gt;Purpose&lt;/th&gt;
					&lt;th&gt;Key Question&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Creational&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Object creation mechanisms&lt;/td&gt;
					&lt;td&gt;&lt;em&gt;How should objects be created?&lt;/em&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Structural&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Object composition and relationships&lt;/td&gt;
					&lt;td&gt;&lt;em&gt;How should objects be composed?&lt;/em&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Behavioral&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Object communication and responsibility&lt;/td&gt;
					&lt;td&gt;&lt;em&gt;How should objects communicate?&lt;/em&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="creational-patterns"&gt;Creational Patterns&lt;a class="anchor" href="#creational-patterns"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="singleton"&gt;Singleton&lt;a class="anchor" href="#singleton"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ensures a class has only one instance and provides a global access point.&lt;/p&gt;</description></item><item><title>Clean Architecture</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/03-clean-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/software-architecture/03-clean-architecture/</guid><description>&lt;h1 id="clean-architecture"&gt;Clean Architecture&lt;a class="anchor" href="#clean-architecture"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Clean Architecture, introduced by Robert C. Martin, organizes code so that &lt;strong&gt;business rules are independent of frameworks, databases, and delivery mechanisms&lt;/strong&gt;. The core idea is simple: dependencies point inward, and the inner layers know nothing about the outer layers.&lt;/p&gt;
&lt;h2 id="the-dependency-rule"&gt;The Dependency Rule&lt;a class="anchor" href="#the-dependency-rule"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;Source code dependencies must point only inward, toward higher-level policies.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Nothing in an inner circle can know anything about something in an outer circle. The name of something declared in an outer circle must not be mentioned by code in an inner circle — functions, classes, variables, or any named software entity.&lt;/p&gt;</description></item><item><title>Domain-Driven Design</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/04-domain-driven-design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/software-architecture/04-domain-driven-design/</guid><description>&lt;h1 id="domain-driven-design"&gt;Domain-Driven Design&lt;a class="anchor" href="#domain-driven-design"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Domain-Driven Design (DDD) is an approach to software development that centers the design on the core business domain. It provides strategic patterns for organizing large systems and tactical patterns for modeling complex business logic.&lt;/p&gt;
&lt;h2 id="strategic-ddd"&gt;Strategic DDD&lt;a class="anchor" href="#strategic-ddd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Strategic DDD addresses the &lt;strong&gt;big picture&lt;/strong&gt; — how to decompose a large system into manageable parts that can evolve independently.&lt;/p&gt;
&lt;h3 id="ubiquitous-language"&gt;Ubiquitous Language&lt;a class="anchor" href="#ubiquitous-language"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The most fundamental concept in DDD: a shared language between developers and domain experts that is used consistently in code, conversations, and documentation.&lt;/p&gt;</description></item><item><title>Event-Driven Architecture</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/05-event-driven-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/software-architecture/05-event-driven-architecture/</guid><description>&lt;h1 id="event-driven-architecture"&gt;Event-Driven Architecture&lt;a class="anchor" href="#event-driven-architecture"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Event-Driven Architecture (EDA) is a paradigm where the production, detection, consumption, and reaction to events drives the system&amp;rsquo;s behavior. Instead of direct calls between services, components communicate through events — facts about things that happened.&lt;/p&gt;
&lt;h2 id="event-types"&gt;Event Types&lt;a class="anchor" href="#event-types"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Not all events are equal. Understanding the type helps you choose the right infrastructure and guarantees.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Purpose&lt;/th&gt;
					&lt;th&gt;Content&lt;/th&gt;
					&lt;th&gt;Example&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Domain Event&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Records what happened in the domain&lt;/td&gt;
					&lt;td&gt;Full state at time of event&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BookingConfirmed { booking_id, guest, dates, total }&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Integration Event&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Communicates across bounded contexts&lt;/td&gt;
					&lt;td&gt;Minimal data + references&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BookingConfirmed { booking_id, guest_id }&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Notification Event&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Signals something happened (no data)&lt;/td&gt;
					&lt;td&gt;Event type + aggregate ID only&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BookingConfirmed { booking_id }&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="domain-events"&gt;Domain Events&lt;a class="anchor" href="#domain-events"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Rich events used within a bounded context. They contain enough information for any handler within the same context to act.&lt;/p&gt;</description></item><item><title>Monolith to Microservices</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/06-monolith-to-microservices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/software-architecture/06-monolith-to-microservices/</guid><description>&lt;h1 id="monolith-to-microservices"&gt;Monolith to Microservices&lt;a class="anchor" href="#monolith-to-microservices"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Migrating from a monolith to microservices is one of the most impactful — and risky — architectural transitions a team can undertake. Success requires a deliberate, incremental strategy rather than a big-bang rewrite.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="why-migrate"&gt;Why Migrate?&lt;a class="anchor" href="#why-migrate"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Driver&lt;/th&gt;
					&lt;th&gt;Monolith Pain&lt;/th&gt;
					&lt;th&gt;Microservices Solution&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Deployment speed&lt;/td&gt;
					&lt;td&gt;Entire app redeployed for any change&lt;/td&gt;
					&lt;td&gt;Deploy services independently&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Team scaling&lt;/td&gt;
					&lt;td&gt;Merge conflicts, coordination overhead&lt;/td&gt;
					&lt;td&gt;Teams own independent services&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Technology lock-in&lt;/td&gt;
					&lt;td&gt;One stack for everything&lt;/td&gt;
					&lt;td&gt;Polyglot — best tool per service&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Fault isolation&lt;/td&gt;
					&lt;td&gt;One bug crashes everything&lt;/td&gt;
					&lt;td&gt;Failures contained per service&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Scalability&lt;/td&gt;
					&lt;td&gt;Scale entire app for one hot path&lt;/td&gt;
					&lt;td&gt;Scale individual services&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="when-not-to-migrate"&gt;When NOT to Migrate&lt;a class="anchor" href="#when-not-to-migrate"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Small team (&amp;lt; 10 engineers)&lt;/li&gt;
&lt;li&gt;Well-understood domain with stable requirements&lt;/li&gt;
&lt;li&gt;No deployment bottleneck&lt;/li&gt;
&lt;li&gt;You cannot invest in platform infrastructure (CI/CD, observability, service mesh)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="the-modular-monolith--first-step"&gt;The Modular Monolith — First Step&lt;a class="anchor" href="#the-modular-monolith--first-step"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before extracting services, &lt;strong&gt;modularize within the monolith&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Architectural Patterns</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/07-architectural-patterns/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/software-architecture/07-architectural-patterns/</guid><description>&lt;h1 id="architectural-patterns"&gt;Architectural Patterns&lt;a class="anchor" href="#architectural-patterns"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Architectural patterns are proven structural templates for organizing software systems. Each pattern makes different tradeoffs between complexity, scalability, flexibility, and maintainability. Choosing the right one depends on your constraints and quality attributes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="layered-architecture"&gt;Layered Architecture&lt;a class="anchor" href="#layered-architecture"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The most common pattern — organizes code into horizontal layers with strict dependency rules:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────┐
│ Presentation Layer │ UI, API endpoints
├─────────────────────────────┤
│ Business Logic Layer │ Domain rules, workflows
├─────────────────────────────┤
│ Persistence Layer │ Data access, repositories
├─────────────────────────────┤
│ Database Layer │ Storage engines
└─────────────────────────────┘
 Dependencies flow DOWN only&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Aspect&lt;/th&gt;
					&lt;th&gt;Details&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Principle&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Each layer only depends on the layer directly below&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Variants&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Strict (only adjacent layers) vs relaxed (skip layers)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Strengths&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Simple, well-understood, good separation of concerns&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Weaknesses&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Monolithic deployments, changes ripple through layers&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Traditional business applications, CRUD systems, small teams&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="sinkhole-anti-pattern"&gt;Sinkhole Anti-Pattern&lt;a class="anchor" href="#sinkhole-anti-pattern"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When requests pass through layers without adding value — just forwarding calls. If &amp;gt; 20% of requests are sinkholes, the architecture is over-layered.&lt;/p&gt;</description></item><item><title>Architecture Decisions</title><link>https://kyngo.github.io/learning-paths/paths/software-architecture/08-architecture-decisions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/software-architecture/08-architecture-decisions/</guid><description>&lt;h1 id="architecture-decisions"&gt;Architecture Decisions&lt;a class="anchor" href="#architecture-decisions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Every software system is shaped by hundreds of decisions — technology choices, structural patterns, integration approaches. The best teams make these decisions &lt;strong&gt;explicitly, traceably, and reversibly&lt;/strong&gt;. Architecture Decision Records (ADRs) are the primary tool for this discipline.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="architecture-decision-records-adrs"&gt;Architecture Decision Records (ADRs)&lt;a class="anchor" href="#architecture-decision-records-adrs"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;An ADR documents &lt;strong&gt;one significant architectural decision&lt;/strong&gt; along with its context, rationale, and consequences.&lt;/p&gt;
&lt;h3 id="standard-format"&gt;Standard Format&lt;a class="anchor" href="#standard-format"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# ADR-001: Use PostgreSQL for order storage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Status
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Accepted (2024-03-15)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The orders service needs persistent storage supporting:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; ACID transactions for financial data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; Complex queries for reporting
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; High write throughput (10K orders/hour peak)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;We considered PostgreSQL, DynamoDB, and MongoDB.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Decision
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;We will use PostgreSQL (via AWS RDS).
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Consequences
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;### Positive
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; Strong consistency guarantees
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; Rich query capabilities (JOIN, aggregates)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; Team expertise exists
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;### Negative
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; Vertical scaling limits (vs DynamoDB)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; Operational overhead (backups, failover)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; Schema migrations required for changes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;### Risks
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- May need read replicas at 100K orders/hour&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="adr-lifecycle"&gt;ADR Lifecycle&lt;a class="anchor" href="#adr-lifecycle"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Status&lt;/th&gt;
					&lt;th&gt;Meaning&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Proposed&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Under discussion, not yet approved&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Accepted&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Approved and active&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Deprecated&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;No longer recommended but existing code may use it&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Superseded&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Replaced by another ADR (link to successor)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="where-to-store-adrs"&gt;Where to Store ADRs&lt;a class="anchor" href="#where-to-store-adrs"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Location&lt;/th&gt;
					&lt;th&gt;Pros&lt;/th&gt;
					&lt;th&gt;Cons&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Repository (&lt;code&gt;docs/adr/&lt;/code&gt;)&lt;/td&gt;
					&lt;td&gt;Versioned with code, close to context&lt;/td&gt;
					&lt;td&gt;Scattered across repos&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Wiki/Confluence&lt;/td&gt;
					&lt;td&gt;Searchable, cross-project visibility&lt;/td&gt;
					&lt;td&gt;Not versioned with code&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Dedicated ADR repo&lt;/td&gt;
					&lt;td&gt;Central registry, easy to browse&lt;/td&gt;
					&lt;td&gt;Disconnected from implementation&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt; Store in the repo for service-specific decisions; use a central wiki for cross-cutting decisions.&lt;/p&gt;</description></item></channel></rss>