← All Articles

Service architecture is deliberate debt

At my first job, we had a monolith that had grown unwieldy. The team debated: ambitious rewrite, or incremental migration to services?

We chose services. Which meant deliberately taking on technical debt. New boundaries to maintain. Network calls where there used to be function calls. More infrastructure complexity.

But here's the thing: messy monoliths usually aren't architecture problems. They're skill problems. Unclear domain boundaries. Gaps in understanding. The code reflects how well (or poorly) the team understood the domain when they wrote it.

Splitting into services forces you to define those boundaries explicitly. It's training disguised as architecture work.

Why it works

In a monolith, small changes can break unrelated things. Extract user authentication into its own service, and now changes to auth can't accidentally break payments. The boundaries create isolation.

Yes, you're adding overhead. But the overhead is predictable. You know what you're paying for.

The training angle

Junior developers can own a service without risking the whole system. They experiment within clear boundaries. Senior developers focus on the harder problems: integration, infrastructure, the system-level view.

I've watched teams level up faster through service migrations than through any formal training. The architecture forces clarity.

You can see the debt now

In a monolith, technical debt hides. Hacky logic buried in some utility class. Inefficient queries nobody notices until they don't. When you extract services, the problems become visible. That helper function that does seventeen things? Now you have to decide which service it belongs to. The mess surfaces.

More visible debt is easier to prioritize.

The strangler approach

You don't have to kill the monolith all at once. Extract pieces incrementally. The old system keeps running while you untangle it. No big-bang rewrites. No six-month freezes.

Don't go too small

The microservices critique is valid. Too many tiny services means too much network overhead, too many deploys, too much coordination. Keep services domain-sized. User management. Payments. Notifications. Big enough to be meaningful, small enough to be ownable.

You might go back to a monolith

Here's something people don't say enough: once your team has learned to think in clear domains, you can merge services back into a monolith. A better monolith. One with real boundaries.

Services aren't the destination. They're a tool for building skills and clarity. Sometimes the end state is a well-structured monolith that you couldn't have built before because the team didn't understand the domain well enough.

The point

Yes, service architecture is debt. Own that. The debt buys you clarity, autonomy, skill development. It buys you a path forward that doesn't require stopping everything for a rewrite.

When someone complains about the complexity, don't argue. Acknowledge it. Then explain what you're buying with that complexity.