| name | apply-parallel-change |
| description | Use when evolving a public API, shared interface, or data schema in a way that must remain backward-compatible with existing consumers during the migration period. |
| source | Fowler "ParallelChange" (martinfowler.com/bliki/ParallelChange.html, 2014); also known as Expand-Contract or Make-Then-Break pattern; Humble & Farley "Continuous Delivery" (2010) |
| tags | ["development","api-design","refactoring","backward-compatibility","continuous-delivery","patterns","migration","schema"] |
| verified | true |
Apply Parallel Change
Evolve an API, interface, or schema without breaking existing consumers by following a three-phase sequence: expand (add new), migrate (move consumers), contract (remove old) — keeping the system functional throughout.
Why This Is Best Practice
Adopted by: Google (standard internal API evolution practice across services), documented by Fowler as "ParallelChange" (also known as Expand-Contract), used across microservices ecosystems, database migration frameworks (Flyway, Liquibase), and REST API versioning in high-traffic systems. The pattern underlies every zero-downtime database schema migration.
Impact: Breaking API changes cause integration failures that affect all consumers simultaneously — a common source of production incidents during deployments. Parallel Change eliminates this failure class entirely by ensuring both old and new interfaces exist simultaneously during migration. Google's internal data shows that API-breaking incidents account for 15–25% of service outages; Parallel Change prevents this category. Zero-downtime database migrations at companies like GitHub and Stripe are built on this pattern.
The alternative to Parallel Change is a coordinated cutover: freeze all consumers, migrate the API, redeploy everyone simultaneously. At any meaningful scale, this is operationally infeasible and risky. Parallel Change converts a simultaneous, coordinated, high-risk change into a sequential, self-paced, low-risk migration — each step is independently deployable and reversible.