Ubin.io All Articles
Engineering Culture

Microservices vs. Monolith: Stop Letting Hype Make Your Architecture Decisions

By Ubin.io Engineering Culture
Microservices vs. Monolith: Stop Letting Hype Make Your Architecture Decisions

Photo by Vitaly Gariev on Unsplash

Somewhere along the way, "we're moving to microservices" became a status symbol in startup culture. Say it in a board meeting and heads nod approvingly. Put it in a job posting and senior engineers get interested. It signals technical maturity, scalability ambition, and engineering sophistication — even when the team asking for it has 11 engineers and $2M ARR.

Here's the thing nobody says out loud at conference talks: microservices are genuinely hard, genuinely expensive, and genuinely the wrong call for a huge percentage of the teams pursuing them. This isn't a contrarian take — it's just math. And yet the pressure to decompose, decouple, and distribute pushes teams toward architectural decisions that can set them back by years.

This article isn't going to tell you which architecture is right. It's going to give you the questions that actually matter before you decide.

Let's Be Clear About What You're Actually Signing Up For

A monolith gets a bad reputation mostly because people conflate monolith with big ball of mud. They're not the same thing. A well-structured monolith — with clear module boundaries, good separation of concerns, and disciplined dependency management — can scale a company to hundreds of millions in revenue. Shopify ran as a monolith for a long time. Stack Overflow still does, at a scale that embarrasses most distributed systems. Basecamp has built an entire philosophy around it.

Microservices, meanwhile, don't eliminate complexity. They redistribute it. Instead of complex code, you get complex infrastructure. Instead of a tangled codebase, you get tangled service dependencies, distributed tracing nightmares, network latency between services, and the ever-present joy of debugging a failure that spans six different logs across four different services.

Neither is inherently better. Both are tools. The question is which tool fits your current situation.

The Framework: Four Questions Before You Commit

1. What Problem Are You Actually Solving?

This sounds obvious, but it's the question most teams skip. When engineering leadership says "we need to move to microservices," push back gently and ask: what specific pain is this solving right now?

Legitimate answers include: "Our deployment pipeline is so coupled that a change to the payments module requires a full regression test of the entire app." Or: "Two teams are constantly blocked on each other because they share the same codebase." Or: "One part of our system has radically different scaling requirements than everything else."

Suspect answers include: "It's what Netflix does." Or: "We want to be able to scale in the future." Or: "Our new VP of Engineering came from a place that used microservices."

If you can't name the specific, present-tense pain that microservices would address, you're not solving a problem — you're chasing a pattern.

2. What's Your Team's Actual Operational Maturity?

Microservices don't just require engineers who can write code. They require teams that can operate distributed systems. That means solid observability practices (distributed tracing, structured logging, meaningful alerting). It means a mature on-call culture. It means engineers who understand network partitions, eventual consistency, and the subtle ways that inter-service communication fails under load.

If your team is still figuring out basic monitoring on a single application, adding ten services doesn't make that easier — it makes it ten times harder. The operational overhead of microservices is real, and it falls on your engineers whether you've prepared for it or not.

A practical gut-check: can your team currently deploy your monolith confidently, roll back safely, and debug production issues in under an hour? If the answer is no, microservices will make all of those things worse before they make them better.

3. What Are the Actual Financial Costs?

This one almost never makes it into the architectural discussion, and it should. Microservices cost more money to run. More services means more compute, more networking overhead, more load balancers, more managed databases if you're following the one-database-per-service principle. On AWS, Azure, or GCP, that adds up fast.

Beyond infrastructure, there's the engineering cost of the migration itself. A serious monolith-to-microservices transition at a mid-sized company is a 12-to-24-month project if you're doing it carefully. During that time, feature velocity typically slows. Engineers are context-switching between migration work and product work. Technical debt from the transition accumulates alongside the debt you were trying to escape.

For a Series A startup burning $400K a month, that's a significant bet. Is the expected return worth it? Sometimes yes. Often, if you're honest about it, the answer is not yet.

4. Where Are Your Team's Actual Seams?

If you do decide to decompose, the most dangerous mistake is drawing service boundaries in the wrong places. Services should reflect genuine organizational or domain boundaries — not technical layers. Splitting your app into a "user service," a "data service," and a "business logic service" is not microservices. It's a distributed monolith, which combines all the operational complexity of microservices with all the coupling problems of a monolith. The worst of both worlds.

Real service boundaries emerge from domain-driven design: what areas of your business truly operate independently? Payments is a classic candidate — it has distinct scaling needs, compliance requirements, and a clear interface. Notifications is another. But "everything related to users" is probably not a clean boundary if user data touches 80% of your application logic.

When Staying Put Is the Smart Move

If you're pre-product-market fit, stay in the monolith. Full stop. Your understanding of your own domain is still changing, and microservices lock in architectural decisions you'll likely regret as your product evolves.

If you have fewer than 20 engineers, the coordination overhead of microservices probably exceeds the benefit. Conway's Law works in both directions — your architecture will mirror your team structure, and a small team is a monolith-shaped team.

If your primary scaling constraint is database reads, horizontal scaling of your monolith with read replicas is cheaper, faster to implement, and more reversible than a full decomposition.

When It's Genuinely Time to Split

There are real signals that decomposition makes sense. When independent teams are genuinely blocked on each other at the code level. When one component needs to scale to 100x while everything else stays flat. When regulatory or compliance requirements demand strict data isolation. When deployment of one area requires risky, full-application regression testing that's slowing your entire release cadence.

These are engineering problems that microservices actually solve. The key word is actually.

The Honest Bottom Line

Architecture decisions made under social pressure — from investors, from new hires, from conference culture — are among the most expensive mistakes a technical organization can make. The right architecture is the one that fits your team's current size, current operational capability, current budget, and current product understanding.

For most early-stage and mid-stage startups, that architecture is a well-organized monolith with a clear path toward selective decomposition when specific pain points emerge. Build the thing that ships value today. Refactor toward the architecture your future team will actually need — not the one that looks impressive on a whiteboard.