Architecture trade-off

There's no right number of services — only the right trade-off for your team.

Splitting one service into many is neither modern nor backward. It's a trade. You buy independent deploys, team autonomy and independent scaling — and you pay for them in network calls, operational surface, distributed debugging and latency. The correct number of services depends on how many teams you have and how complex your domain is. Everything else is fashion, and the fashion swings on a multi-year cycle. This tool lets you feel the trade-off directly, then tells you where your split actually lands.

01 — The dial

Turn one service into many, and watch what it costs.

Start at a monolith — one deployable — and split it. As services multiply, the calls between them multiply too. The gains rise; so do the costs. Set your team size and domain complexity, then drag the dial and read the fit: right-sized, over-split, or under-split.

3 · a few services
~15 eng
Moderate

Gains — the case for splitting

Costs — the tax you take on

Adjust the dial

Set your context above, then move the services dial to see where your split lands.

02 — The trade-off

"Microservices = modern = better" is the myth. It's a trade-off.

The industry keeps re-litigating this as a trend when it's a context-dependent choice. Three architectures sit on a spectrum, and each is the right answer somewhere. The middle one — the modular monolith — is the option most teams forget exists.

Dimension Monolith Modular monolith Microservices
Deployable units One One, with clean internal seams Many, one per service
Deploy independence None — everyone ships together None yet, but split-ready High — each team on its own cadence
Ops complexity Low — one thing to run Low — still one thing to run High — per-service infra, on-call, tracing
Call latency In-process (nanoseconds) In-process (nanoseconds) Over the network (milliseconds + retries)
Best team fit 1–2 teams 2–4 teams sharing a codebase Many teams, each owning services
Failure mode Big-bang releases; code turns to spaghetti Module boundaries erode without discipline Distributed monolith; ops sprawl; cascading failures
The distributed monolith is the trap in the last row. That's when you've paid to split into many services, but they're so tangled they must be built, tested and deployed together. You get every cost of microservices — network calls, ops surface, distributed debugging — and none of the independence. It is strictly worse than the monolith you started with.
Conway's Law is the reason this is really an org question. Organisations ship systems that mirror their own communication structure. Your architecture will come to look like your org chart whether you plan it or not — so you can't choose the boundaries without choosing the teams. Split for the org you have, and the seams hold; split against it, and they rot.

The fashion cycle

Watch the pendulum swing. Each era over-corrects for the pain of the last — which is why "just do what everyone's doing now" is such poor guidance.

2000s
SOA & the big monolith
Service-oriented architecture promised reuse through heavyweight middleware. In practice, most shops ran one large application.
~2014 onward
Microservices everywhere
Big-tech scaling stories became everyone's default. Teams of five adopted the architecture of teams of five thousand.
2020s
Modular monolith / monolith again
The bill came due. The advice swung back: start with a well-structured monolith, and split only where a real seam demands it.
03 — Recommender

Pick your situation. Get the call — and the classic mistake.

The right architecture falls out of two things: your team size and your domain. Choose the scenario that's closest to yours. You'll get a recommendation, the reasoning behind it, and the specific trap teams in that situation tend to fall into.

04 — In the wild

Four situations you'll recognise.

The same trade-off, lived out at different scales. Two are failures of judgement in opposite directions, one is the anti-pattern that looks like success, and one is the quiet, sensible middle almost nobody brags about.

Over-split

The 5-person startup with 20 microservices

Five engineers, twenty services, and a Kubernetes cluster nobody fully understands. They copied an architecture built for a thousand engineers and inherited its whole operational bill up front.

Tells

  • A simple feature touches six repos and three deploys.
  • More time goes to YAML, service meshes and on-call than to product.
  • Local development needs half the system running just to test one thing.
The fix: collapse back toward one deployable. At this size the autonomy buys you nothing — there's only one team — and the ops tax is crushing.
Under-split

The 500-engineer org on one monolith

One enormous codebase, seventy teams, and a single release train everyone has to board. The architecture that got them here now blocks every team from shipping.

Tells

  • Merges queue for hours; one bad commit freezes everyone's release.
  • Teams wait on each other to deploy code they don't even share.
  • Nobody can reason about the blast radius of a change any more.
The fix: carve services along bounded contexts so teams can deploy independently. At this scale the autonomy is worth the operational tax.
Anti-pattern

The distributed monolith

On the diagram it's a clean set of microservices. In reality they share a database and call each other synchronously, so a change to one forces a coordinated release of all of them.

Tells

  • You can't deploy service A without also deploying B, C and D.
  • Services share a schema, so no one can change their own data model.
  • One slow service takes the whole request path down with it.
The fix: either restore real independence — separate data, async boundaries — or merge them back. As-is it's the worst of both worlds.
The sensible middle

The modular monolith

One deployable, but organised into strict internal modules with clear interfaces. Fast in-process calls, one pipeline to run, and seams already drawn where a future split would go.

Why it works

  • Keeps ops trivial while the team is still small enough for it.
  • The module boundaries teach you where the real domain seams are.
  • When one module genuinely needs to scale or ship alone, you extract just that one.
The move: default here. Earn each service by hitting a real limit — a team that needs autonomy, a component that needs its own scaling — not a trend.
05 — Go deeper

The diagram is easy. The judgement is the job.

Choosing the number of services is really a decision about your organisation — how your teams are shaped, where they need to move independently, and what operational load they can carry. That's the work we do with the engineering leaders we coach: turning an architecture debate back into a clear-eyed call about people, boundaries and cost.

Talk to us about coaching
TAKE ONE

Split for teams, not for fashion

A new service should be earned by a real constraint — a team that needs autonomy, a component that needs its own scaling. Never adopted because it's the trend.

TAKE TWO

Conway's Law is undefeated

Your architecture ends up mirroring your org chart. Choose the boundaries and the team structure together, or the seams you draw on paper will rot in practice.

TAKE THREE

The distributed monolith is the worst of both

Services that must deploy together give you every cost of splitting and none of the benefit. If you can't deploy one alone, you haven't split — you've just added latency.