The most common delivery anti-pattern I see in growing engineering teams is horizontal layer development. The team builds the entire database schema first. Then the entire API layer. Then the entire frontend. Eight weeks in, nothing works end-to-end. Nobody can demo anything. The CEO is asking "what have we been building?" and the engineering team is saying "we're almost done with the foundation."

This approach feels logical — build from the bottom up — but it optimizes for architectural cleanliness at the expense of everything that actually matters: feedback, risk reduction, and delivering value.

The Skateboard Principle

You've probably seen the illustration: building a car by first making a skateboard, then a bicycle, then a motorcycle, then a car. Each stage is a complete, usable thing. The user gets value at every step. Contrast this with building a car by first making the chassis, then adding wheels, then the engine, then the body — the user gets nothing until the very end.

Vertical slice development applies this principle to software. Take one complete user workflow — the most important one — and build it end-to-end. User interface, API, business logic, database, deployment. The entire slice works in production. Then build the next workflow. And the next.

Why This Works Better

Early feedback. When you ship a working vertical slice in week two, users can try it. They'll tell you that the workflow is wrong, or the data model is missing a field, or the performance isn't acceptable. You learn this when it's cheap to fix, not when you've built six months of horizontal layers on a flawed assumption.

Risk front-loading. The hardest technical problems — deployment pipeline, authentication, database migration strategy, third-party integrations — get solved in the first slice. If the deployment pipeline is going to be a nightmare, you find out in week two, not month four. Every subsequent slice benefits from the infrastructure you've already proven.

Demonstrable progress. Stakeholders can see working software, not diagrams. "Here's what a user can do this week that they couldn't do last week" is a much more compelling progress report than "we completed the data layer and are starting on the API layer."

Natural parallelism. Once the first slice is done and the patterns are established, multiple engineers or pods can work on different vertical slices simultaneously. Each slice is independent because it's a complete workflow, which means less coordination overhead and fewer merge conflicts than when everyone is working on the same horizontal layer.

How to Choose the First Slice

The first slice should be the workflow that delivers the most learning with the least complexity. That usually means: the core value proposition of your product (the thing users are paying for), exercising the full technology stack (UI, API, database, at minimum one external integration), and involving the highest-risk technical decisions (if you need to prove that your architecture can handle real-time updates, the first slice should include real-time updates).

For a SaaS product, the first slice might be: user signs up, does the core thing the product is known for, and sees the result. Not all the settings. Not the admin panel. Not the billing integration. Just the core loop, working end-to-end.

What About the Architecture?

The most common pushback I hear: "If we don't design the whole architecture first, we'll end up with a mess." This fear is legitimate but usually overblown.

You do need to make foundational architecture decisions before the first slice: what framework, what database, what deployment target, what authentication approach. But you don't need to design every service boundary, every API contract, and every database relationship upfront. You need enough architecture to support the first slice, and enough foresight to avoid decisions that will be expensive to reverse.

I call this "just enough architecture." Define the macro-level patterns (monolith vs. services, deployment model, data storage strategy) and let the details emerge as you build slices. The architecture will be better for it, because it will be shaped by actual requirements rather than theoretical ones.

The Practical Implementation

Here's how I implement vertical slice development with client teams.

Sprint 0 (1 week): Make the foundational decisions. Framework, database, deployment pipeline, CI/CD, authentication approach. Get "hello world" deployed to production. This is the skeleton that every slice will build on.

Sprint 1 (2 weeks): Build the first vertical slice. The core user workflow, end to end, deployed and working in production. Accept that it will be rough. The goal is complete, not polished.

Sprint 2+ (2 weeks each): Each sprint adds one or two additional vertical slices. Refine earlier slices based on feedback. Each sprint ends with a working demo that shows real users doing real things.

The team naturally builds up shared infrastructure as they go — the authentication middleware, the error handling patterns, the deployment scripts — because they need it for each slice. This infrastructure emerges from actual need rather than speculative design.

When Horizontal Makes Sense

There are situations where you need to build horizontally: data migrations, infrastructure changes that affect everything, and platform capabilities that multiple features depend on. The key is that these horizontal efforts should be driven by the needs of the next vertical slice, not by a desire to "get the foundation right" before building anything that works.


Related: The Prototype-to-Production Gap | Scaling From 1 to 20 Engineers | Engineering Metrics That Actually Matter