November 6, 20256 min read
ArchitectureEngineering

Small Services, Big Systems

When splitting a codebase pays off — and when it quietly doesn't.

Callum ReidPlatform Engineer, nularUI

Why do some teams get faster after splitting their system apart, while others just get more pagers?

Service-oriented architectures earned their reputation at companies with hundreds of engineers and problems most teams will never have. The pattern then trickled down as fashion, and plenty of ten-person teams now operate a distributed system they never needed.

Having built both — and un-built a few — we've come to a simple position. Splitting a system is a organizational tool with a technical cost. Used that way, it's excellent. Here's the reasoning we walk through with every client.

Start Reading

Services solve people problems first

The honest reason to split a system is ownership: two groups who ship on different rhythms, with different risk profiles, stepping on each other’s deploys.

A boundary lets each group move at its own speed. That’s the benefit — autonomy — and it accrues to teams, not to code. If one team owns everything, a split mostly buys them network calls between their own functions.

Every boundary has a bill

The costs arrive quietly and all at once:

  • A function call becomes a network call that can fail half-way.
  • One log file becomes tracing infrastructure.
  • One deploy becomes a compatibility matrix.
  • “Where does this happen?” becomes a research task.

None of these are arguments against services. They’re the price tag — and the price is fixed even when the benefit isn’t.

The modular monolith is a real destination

The middle path deserves more respect than it gets: one deployable, strict internal modules, boundaries enforced by the build rather than by the network.

You can draw every line a service architecture needs without paying the distributed-systems bill — and harden a line into a service later, when a team actually needs the autonomy.

Most systems we’re hired to rescue should have stopped here.

Signs a split is genuinely due

We look for evidence, not vibes:

  1. Two parts of the system need conflicting scaling profiles.
  2. A component’s deploys keep endangering an unrelated one.
  3. A team is measurably blocked waiting on another’s release train.
  4. A piece needs an isolation boundary for compliance or risk.

Two or more of these, sustained for months — split, and split only there.

Extract like a surgeon, not a demolition crew

When the time comes, the winning move is boring: pick one seam, extract one service, run it in production long enough to trust your tooling, then decide again. Big-bang decompositions convert a working monolith into a distributed rewrite with no rollback plan.

The takeaway

Size the architecture to the organization you have, not the one in the conference talk. Small teams win with small systems — and the best distributed systems are the ones that grew a boundary at a time, each one paying rent.