Handbooks  /  Monolith vs Microservices
Engineering~9 min readComparison
Head to Head

Monolith vs microservices: where does the complexity live?

MonolithvsMicroservices

Microservices don't remove complexity — they relocate it, from your codebase into your network. That trade is worth making for exactly one reason, and it isn't "clean architecture."

01

The one distinction that decides everything

A monolith is a single deployable codebase and process for the whole application. Microservices split that application into independently deployable services that talk over the network. The code inside a monolith still has module boundaries — the difference is whether those boundaries are enforced by a network call (microservices) or by convention within one process (monolith).

→ The rule

Small team, unclear domain boundaries, want to move fast? Monolith. Large org where independent teams are blocked on each other's deploys, with boundaries you've already proven out? Microservices.

02

Head to head

DimensionMonolithMicroservices
DeploymentOne unit, one deployIndependent deploys per service
Team scalingCoordination overhead grows with team sizeTeams own services, less deploy coordination
Where complexity livesIn the codeIn the network — partial failure, latency, consistency
DebuggingA single stack traceDistributed tracing needed across boundaries
ScalingThe whole app scales togetherScale only the hot service independently
DataOne shared DB, easy joins/transactionsDB-per-service, no cross-service joins, sagas
LatencyIn-process calls, near-zeroNetwork calls between services, added failure modes
Operational overheadSimple — one thing to run/monitorHigh — service mesh, discovery, per-service alerting
03

When to use each

Reach for a monolith

  • Small team, early-stage product
  • Domain boundaries are still unclear
  • Want to move fast without the distributed-systems tax
  • No real organizational coordination pain yet

Reach for microservices

  • Large org, teams genuinely blocked on each other’s deploys
  • Different components have genuinely different scaling needs
  • Domain boundaries are proven and stable, not guessed
  • You have the ops maturity to run a distributed system
04

Monolith first

Most successful microservice architectures started as a monolith and split along real, observed seams once team size or scaling pressure demanded it. Splitting along GUESSED boundaries before you understand the domain tends to produce a "distributed monolith" — every service still tightly coupled and chatty, so you pay the full network/ops overhead of microservices while getting none of the independent-deployability benefit that was the entire point.

→ The decision rule

Don't split until you can point to the actual pain — a specific team blocked, a specific component that needs to scale differently — not a general sense that microservices are the more "proper" architecture.

05

The real trigger is organizational, not technical

It's tempting to think the decision to split is about codebase SIZE — once it gets big enough, split it. But Conway's Law (system architecture tends to mirror the communication structure of the organization that builds it) points at the actual mechanism: a monolith maintained by 3 engineers rarely needs splitting no matter how much code it has, because there's no coordination bottleneck between people to route around. A monolith blocking 15 independent teams from deploying without stepping on each other's changes has a real problem — but it's an ORGANIZATIONAL one (too many people needing to move independently through one release process), and microservices solve it by giving each team its own deployable unit, not by making the code itself better.

This is why splitting "for clean architecture" without that organizational pressure usually backfires: you've paid for network calls, service discovery, distributed tracing, and eventual consistency — real, ongoing costs — to solve a coordination problem that didn't actually exist yet. The split becomes worth its cost exactly when the number of people who need to deploy independently, without waiting on each other, exceeds what one release process can comfortably serialize.

→ The trade you’re actually making

Microservices trade a monolith's simple, in-process complexity for network-level complexity (partial failure, distributed consistency) — a trade that only pays off when the thing actually blocking you is people waiting on people, not code being hard to read.

06

A worked scenario: an e-commerce startup at two team sizes

At 5 engineers, the startup ships a single Rails or Django monolith, one deploy for everything — the right call, because there's no team-coordination pain to solve yet, and splitting now would add distributed-systems overhead for zero organizational benefit. Every engineer can still hold the whole system in their head, and one deploy pipeline serves everyone fine.

Three years later, at 80 engineers, deploys start queuing behind each other because every team shares the same release train — and worse, the checkout team's flaky test occasionally blocks the catalog team's unrelated deploy from going out. THAT specific, observed pain — teams genuinely blocked on each other, not a code-quality complaint — is the real signal to split checkout, catalog, and search into independently deployable services. Notice the trigger wasn't a predetermined size or a calendar date; it was the organizational bottleneck actually showing up.

→ The pattern generalizes

Watch for teams blocked on teams, not lines of code. That's the signal a monolith is done buying you speed — everything before that point, splitting mostly just adds cost.

Frequently asked

Quick answers

Monolith or microservices — which should I use?

Start with a monolith unless you already have a large, multi-team organization with real deploy-coordination pain. Split along proven, observed domain boundaries once that organizational pressure actually shows up, not on a predetermined size or timeline.

Do microservices reduce complexity?

No — they relocate it, from the codebase into the network. You trade in-process function calls for network calls with partial failure, added latency, and distributed consistency problems (sagas, eventual consistency) that a monolith with one shared database doesn’t have.

What is a "distributed monolith"?

A microservices architecture split along guessed, rather than proven, boundaries — services end up tightly coupled and chatty over the network, paying the full operational cost of microservices (service discovery, distributed tracing, network failure modes) without the independent-deployability benefit that justified the split.

What actually triggers the decision to split into microservices?

Organizational scaling, not code size — specifically, independent teams becoming blocked on each other’s deploys through one shared release process. A monolith maintained by a small team rarely needs splitting regardless of how much code it contains.

Monolith vs Microservices · Vibe Engines · 2026
Finished this one? 0 / 115 Handbooks done

Explore the topic

See this alongside everything else on the same subject — handbooks, system designs, challenges and tools, in one place.