Learn

/

Vertical vs Horizontal

Vertical vs Horizontal

6 patterns

Why splitting a story by technical layer fails INVEST on three letters at once. The vertical slice that ships end-to-end, teaches the team something, and lets product deprioritize the rest.

Avoid
Epic
PAY-100
Customers can pay with SEPA direct debit
Child issues
Backend: SEPA mandate API endpoint
Frontend: SEPA fields on checkout
DB: SEPA_MANDATE table + migration
Analytics: instrument SEPA conversion funnel

Prefer
Epic
PAY-100
Customers can pay with SEPA direct debit
Child issues
Customer enters bank details and sees the mandate confirmation
Customer signs the mandate inline
Customer sees the direct debit on the receipt
Failed debits notify the customer and pause the subscription
Why avoid

Layer-by-layer splits fail INVEST on three letters at once: the backend slice is not Independent (frontend waits), not Valuable (no user benefits from an API nobody calls), and not Testable from the user perspective. Nothing ships until everything ships.

Why prefer

Each vertical slice goes through the data, logic, and UI layers it needs and ships a piece of customer-visible value end-to-end. After slice one, the team has shipped something real and learned what the next slice should look like.

Humanizing Work: Splitting User Stories
Avoid
Story
AUTH-50
5 pts
Build the entire SSO infrastructure (no provider integration yet)
Description

Add SAML support, JWT issuance, session refresh, and the new sign-in page. No provider wired up; that comes next sprint.


Prefer
Story
AUTH-50
5 pts
Enterprise admins sign in with one specific Okta tenant
Description

End-to-end: one Okta tenant, the new sign-in page, SAML handling for that one provider. The next slice generalizes to other tenants.

Why avoid

An infrastructure-only slice carries all the cost of the provider integration without the learning. The next sprint will discover that the chosen abstraction does not fit Okta's actual response shape and rework most of it.

Why prefer

The right slice ships value AND teaches the team about real SAML edge cases the second slice would otherwise rediscover. The 'infrastructure first' framing is horizontal slicing in disguise.

Humanizing Work: Splitting User Stories
Avoid
Epic
REP-100
Managers see weekly throughput per direct report
Child issues
Schema migration for the throughput table
Backend: aggregation job (cron)
API: GET /reports/throughput
Frontend: throughput dashboard

Prefer
Epic
REP-100
Managers see weekly throughput per direct report
Child issues
Manager sees PR count for one direct report on /reports/team (read-only)
Manager sees PR + review count for all direct reports
Manager sees the same data with a sparkline
Why avoid

Schema → job → API → UI is a textbook horizontal split. Three slices have no user-visible result. The fourth slice has all the integration cost, and product cannot demo anything until the entire epic is done.

Why prefer

Each slice ships a usable view a manager can demo. Slice one is rough but real; slice two broadens the scope; slice three polishes it. Product can deprioritize slice three on its own merits.

Bill Wake: INVEST in Good Stories
Avoid
Task
META-20
Splitting at refinement
Description

When a story is too big, the most senior engineer proposes a split and the team accepts it.


Prefer
Task
META-20
Splitting at refinement
Description

When a story is too big, the team generates three different splits using three different patterns (workflow, data, rules), sketches each on the board, then picks the split that lets product deprioritize the least valuable slices most cleanly.

Why avoid

Stopping at the first workable split is a common shortcut that costs the team product flexibility. The senior's split may be technically valid and still leave product with one big slice and two unimportant ones.

Why prefer

The first workable split is rarely the best one. Generating three lets the team see which one yields the most product optionality. That is the lever that turns slicing from 'making it smaller' into 'making it deliverable'.

Humanizing Work: Splitting User Stories
Avoid
Epic
ONB-30
Self-serve enterprise onboarding
Child issues
Set up the org, invite teammates, pick a plan, configure SSO
Add a help-center link to the wizard
Pre-fill the org name from the email domain

Prefer
Epic
ONB-30
Self-serve enterprise onboarding
Child issues
Admin creates the org and invites teammates
Admin picks a plan and starts the trial
Admin configures SSO during onboarding
Why avoid

A 12-1-1 split has one real slice plus two rounding errors. Product cannot meaningfully reorder them, and the big slice is the same Epic with two trivial decorations attached.

Why prefer

Three roughly equal slices give product three real options: ship all, drop the SSO slice for now, or move the plan slice to a later sprint. The slices are individually valuable.

Humanizing Work: Splitting User Stories
Avoid
Task
META-21
Splitting preflight
Description

If a story is too big, run it through the splitting patterns until it fits in a sprint.


Prefer
Task
META-21
Splitting preflight
Description

Before splitting: confirm it is a story (named user, observable outcome) and confirm INVEST fails only on Small. If it also fails on Valuable or Testable, fix the framing first.

Why avoid

Reaching for splitting patterns first will produce four small things that still fail INVEST in the same way the original did. The split looks like progress; the work has not actually been clarified.

Why prefer

Splitting patterns apply to stories. 'Refactor the payment module' is not a story, and no pattern will turn it into one. Confirming the framing first prevents the team from generating four equally-bad sub-tasks.

Humanizing Work: Splitting User Stories