A3.2 · Small batches · dive 2
Incremental design
The second Extreme Programming practice: the design grows one rung at a time. Each rung adds only the structure its slice needs — never the whole system up front.
Advance the rung on the right and watch the web design grow piece by piece while the engine below the facade never changes, and the open decisions are settled only as a rung forces each one. The design is grown, not drawn.
The design grows behind a facade · advance the rung
The design grows rung by rung above a fixed facade — the engine below it never changes, and each later decision waits for the rung that forces it.
What incremental design is
Incremental design grows the structure of a system one rung at a time. Each rung adds only what its slice needs and nothing it does not; a structural choice is left open until a slice forces it, recorded as an open decision until then. The opposite is up-front design: drawing the whole architecture before any slice exercises it — the big-bang the course argues against, because it bets correctness on a plan no rung has yet tested.
Two things make incremental design safe rather than chaotic. A stable seam — a facade the increments hang off — means adding structure above the seam never changes what is below it. And a deferred decision is recorded, not forgotten: the roadmap lists what is still open so the team knows which choices a later rung will force. The design is grown against real slices, behind a boundary that keeps the growth local.
- incremental design
- The design is grown rung by rung; each rung adds only the structure its slice needs.
- stable seam
- A fixed boundary (a facade) the increments hang off, so adding structure never changes what is below it.
- deferred decision
- A structural choice held open until a rung forces it, recorded as an open decision until then.
- up-front design
- Drawing the whole architecture before any slice exercises it — the bet incremental design declines.
The cost of incremental design is revisiting structure as slices arrive; the next section weighs that against the cost up-front design pays for decisions no slice has tested.
Up front versus incremental
The two strategies differ in when decisions are made. Designing all up front commits to every structural choice before the first slice ships — and some of those choices are made for slices that change, or never arrive, so a later rung would revise them. Growing incrementally commits only to the choices the first slice needs, and defers the rest until a slice forces each one. Switch the mode below to count the decisions made before the first slice ships, and how many of them a later rung would have changed.
Decisions made before the first slice · pick a mode
Up-front design pays for decisions no slice has tested; incremental design defers them to the rung that forces each one.
Incremental design on the Portal
F6 grows the Portal’s web design one rung at a time, behind one master invariant: “the web
layer calls only the Portal facade and renders only %Portal.Error{}.”
F6.1 adds only PortalWeb.Endpoint to the F5 supervision tree — the smallest
structure that serves a page. The roadmap is explicit that later runtime pieces are deferred: “later
rungs add Phoenix.PubSub and Phoenix.Presence only as the
real-time features require them” (at F6.7). Authentication, the deploy target, and the dashboard are
listed as open decisions, settled at F6.8–F6.9 when their slices force them.
The facade is the stable seam that makes this safe. Every rung adds web surface above it without reaching below, so the F5 engine, its event log, and its supervision tree never change underneath. The design grows; the foundation holds still.
# The master invariant — the seam the web design grows above: # the web layer calls only the Portal facade and renders only %Portal.Error{} # Incremental: each rung adds only the structure its slice needs. # F6.1 + PortalWeb.Endpoint (serve a page) # F6.7 + Phoenix.PubSub/Presence (only when real-time requires them) # F6.8 auth + deploy target (open decisions, settled when forced) id = Portal.ID.generate(:user) # the slice calls the unchanged facade — nothing below it moves
The principle
Incremental design: add only the structure the current slice needs, behind a stable seam, and defer every other decision to the slice that forces it.
On the Portal
Each F6 rung adds web surface above the unchanged Portal facade; PubSub, auth,
and the dashboard are deferred to the rung that needs them, recorded as open decisions until then.
The design is grown, not drawn — one rung's worth at a time, behind a seam that keeps the engine below it untouched.
Recap — grown, not drawn
Incremental design grows the structure of a system one rung at a time, adding only what the current slice needs and deferring the rest until a slice forces it. A stable seam — the facade — keeps each increment local, so the engine below never changes. On the Portal, F6 adds web surface rung by rung above the unchanged facade, with PubSub, auth, and the dashboard deferred to F6.7–F6.9. The next dive closes the module: feedback after every rung, the practice that makes small releases and incremental design pay.
Next in A3.2: A3.2.3 · Continuous feedback — a review after every rung, with feedback editing the spec rather than the shipped page.
References
Primary sources for incremental design and deferred decisions, and where this dive connects in the course and to the real F6 chapter.
Sources
- Beck, K. — Extreme Programming Explained — incremental (evolutionary) design as a named practice.
- Humble, J. & Farley, D. — Continuous Delivery — evolving the design behind a stable interface, increment by increment.
- Hunt, A. & Thomas, D. — The Pragmatic Programmer — orthogonality and decoupling: keeping a change local to the part that needs it.
Related in this course
- A3.2 · Small batches — the module hub.
- A3.2.1 · Small releases — the previous dive.
- A3.2.3 · Continuous feedback — the next dive.
- A1.01 · The two failure modes — the up-front big-bang this practice declines.
- Companion · Phoenix (F6) — the web design grown rung by rung behind the facade.