Design Desk

Architecture Patterns

Monolith vs Microservices

The mechanics of splitting a system are the easy part. The actual decision is about your org, not your traffic.

Architecture PatternsIntermediate6 min readPrerequisites: Microservices Architecture

After this lesson, you should be able to:

  • Explain why the decision to split into microservices is fundamentally about organizational structure, not traffic volume.
  • Diagnose 'splitting before the org is ready' as drawing service boundaries along technical layers instead of team ownership.
  • Recognize operational readiness, monitoring, on-call, deploy tooling, as a prerequisite the split itself doesn't provide.
  • Distinguish what actually improves after a well-timed split from what doesn't, when a small team just coordinates more moving parts.

At a Glance

  • The forcing function for splitting a monolith is almost never technical scale. It's team size: once enough people are stepping on each other in one codebase, that's the actual signal, not requests per second.
  • Conway's Law isn't a warning, it's a description: your system's architecture will end up mirroring your org chart whether you plan it that way or not, so you might as well plan it.
  • Adopting microservices before you have the operational maturity, monitoring, on-call, deployment tooling, to run many services trades a coordination problem you had for an incident-response problem you're not ready for.

01 The Problem

A six-person engineering team at an early-stage startup reads that a company with thousands of engineers runs hundreds of microservices, and splits their monolith into twelve services because that's how you scale. Six months later: twelve repos, twelve deploy pipelines, twelve places a request can fail, and still six engineers. An incident at 2am now means figuring out which of twelve services is actually the problem, with no distributed tracing in place to help, and the same six people who used to grep one codebase for a bug now spend part of every week keeping twelve codebases' dependencies from drifting out of sync.

The problem they actually had, two people stepping on each other's changes in the same file, was never an architecture problem. It was six people working closely enough that their work kept colliding, and splitting the code didn't split the six people. They're still coordinating on everything, just now across twelve deploy pipelines instead of one, with twelve times the operational surface and none of the org structure that would have made twelve services make sense.

This is the actual decision. Not "can this be split," almost anything can. It's whether splitting matches how the org is actually organized, and whether the org has what it takes to run what a split creates.

02 What It Is

Whether to split a monolith into services isn't a technical question first, it's a Conway's Law question. Conway's Law says a system's architecture ends up mirroring the communication structure of the organization that builds it. It's usually stated as a warning, don't let your architecture accidentally mirror your org chart, but it's more useful read the other way: your architecture will mirror your org chart whether you intend it to or not, so the real question is whether you're planning for that or getting surprised by it. Split a system into services that don't match how your teams are actually organized, and you get services owned by nobody in particular, or a "boundary" two different teams both have to touch for every feature, still coupled, now with a network call in between.

The forcing function for splitting is team size hitting the point where one codebase, one deploy pipeline, actually gets in the way, not a request-per-second number. And splitting requires operational maturity the team may not have yet: someone owns monitoring across N services instead of one, someone's on call for N things instead of one, and deployment tooling has to make deploying twelve things routine, not an adventure each time.

In Plain Terms

A family of four sharing one car works fine right up until everyone's schedule stops overlapping enough to coordinate around one vehicle. The fix at that point is buying a second car for the two people whose schedules actually conflict, not because the family grew, but because two specific people now need to be in two places at the same time. Buying four separate cars before anyone's schedules conflict just means four car payments, four insurance policies, and four things to maintain, for a problem nobody had yet.

03 How It Works

Rendering diagram…

The first gate isn't a request-per-second number. If the pain is traffic, a monolith usually still has room to scale vertically or behind a cache. If the pain is multiple teams blocking each other, the next question is whether a split would actually follow team boundaries, or just add a network call between two teams still coupled to the same feature.

Rendering diagram…

Team boundaries lining up isn't enough on its own. Splitting before monitoring, on-call, and deployment tooling can handle more than one service trades a coordination problem for an incident-response problem the org isn't ready for.

04 Trade-offs

 Splitting before the org is readySplitting when team size forces it
What drives the decisionA blog post, a resume line, "this is how it's done"Multiple teams actually blocked on each other in one codebase
Operational readinessMonitoring, on-call, and deploy tooling built for one thing, now stretched across manyBuilt out alongside the split, or already in place before it happens
Service boundariesDrawn along technical layers, since no team structure exists yet to draw them alongDrawn along team ownership, so each service has one clear owner
What actually improvesNothing; the same small team now coordinates across more moving partsTeams stop blocking each other, because the split matches how they already work

Watch out

It's tempting to read "microservices" as a maturity signal, a company that's split into services must be more advanced than one that hasn't. Service count isn't a maturity signal. A six-person team running twelve services with no distributed tracing and no dedicated on-call isn't more mature than the same team running one well-organized monolith, it's running twelve single points of failure instead of one, with less visibility into each. The team that stayed a monolith because splitting wouldn't have matched how they work made the more mature call, not the less ambitious one.

05 Where You'll Actually See This

Both case studies in this library are deliberately scoped as a single service, and that's itself an example of the right call for their context: a scaffold article demonstrating one pattern doesn't need twelve services and an on-call rotation to make its point.

This article is the "when." Microservices architecture is the "how," the actual mechanics of what splitting costs: network calls where function calls used to be, data ownership split across databases once one becomes several. Read that one for what a split actually does to your system. Read this one for whether you should do it at all.

How to reason about it

When asked whether a system should move to microservices, don't answer with anything about the system's architecture first. Ask about the team: how many people, how many teams, are they actually blocked on each other today, and does the org have the on-call and monitoring muscle to run more than one deployable thing. A technically clean service boundary drawn for a team of six that doesn't have the ops maturity yet is a worse outcome than staying a monolith for another year.

06 Quick Check

A company splits its monolith into a 'users' service and an 'orders' service, drawn along a technical layer, not along their two actual teams, which are organized by customer segment, enterprise and self-serve, each team needing to touch both users and orders constantly. What's the most likely outcome?