Problem
Microservices are often sold as maturity — they're actually a trade-off
Microservices carry a halo in startup culture. They're what Netflix uses, what Amazon uses, what “serious” engineering organizations do. Founders sometimes push for microservices as a signal of technical ambition or because they've heard the term enough times to associate it with scale. The problem is that microservices are a solution to a specific organizational and operational problem — and if you don't have that problem yet, adopting them creates more complexity than they resolve.
A small team that builds microservices prematurely ends up managing 12–15 services, a complex CI/CD pipeline, distributed tracing, service discovery, and inter-service authentication — before they've figured out product-market fit. Every deployment becomes a coordination exercise. Every bug that crosses a service boundary takes three times as long to debug. Every new engineer needs weeks to understand how the services relate before they can ship anything meaningful. This is the microservices tax, and it's charged every single day.
Netflix and Amazon built microservices because they had hundreds of engineers who needed to deploy independently without stepping on each other. At 8 engineers, you don't have that problem. What you have is a coordination overhead that the architecture just made dramatically worse. The question isn't which architecture is “better” — it's which one is right for where you are right now.
Requirements
What each architecture actually means in practice
A monolith is a single deployable unit — all of your application code ships together. That doesn't mean it's unstructured; a well-designed monolith has clear internal module boundaries, clean domain separation, and a sensible layered architecture. What it means operationally is that you have one thing to deploy, one set of logs to read, one process to debug, and one codebase for every engineer to work in. For a small team, that simplicity is a significant advantage.
Microservices are independent services that communicate over a network, each deployed and scaled separately. The operational requirements are substantially higher: you need a way for services to find each other (service discovery), a way to trace requests across service boundaries (distributed tracing), a way to manage authentication between services, and a deployment pipeline sophisticated enough to coordinate releases across multiple repositories. None of these are unsolvable problems — managed Kubernetes, service meshes, and modern observability platforms make them tractable. But they require infrastructure expertise that adds real hiring and operational cost.
Process
Start with the forcing function, not the architecture preference
For any startup under 20 engineers, the default answer should be a well-structured monolith unless there's a specific, concrete problem that services would solve. The question to ask your engineering team isn't “should we use microservices?” — it's “what specific problem would microservices solve that we can't solve in a monolith?” If the answer is “it's cleaner” or “it'll be easier to scale later,” that's not a forcing function. That's a preference.
Legitimate forcing functions look like: a component that needs to scale to 100x the load of the rest of the system; a team within the company that needs to deploy independently on a different release cycle; a domain with a radically different security or compliance posture that requires isolation. These are real architectural reasons. They also tend to be obvious when they exist — if your engineers can't articulate one clearly, it probably doesn't exist yet.
If you do need to extract a service, extract only the one that creates the forcing function. The pattern is: start with a monolith, identify the one component that genuinely needs independence, extract it, and leave everything else where it is. Repeat only when the next forcing function appears. This approach — sometimes called a “strangler fig” pattern — lets you accrue the benefits of services incrementally without paying the full operational tax upfront.
Structure
The real business consequences of each choice
A monolith gives you faster initial development, simpler debugging, and significantly easier onboarding for new engineers. When something breaks, the blast radius is usually obvious and the fix is local. The limitation is that you can't scale specific components independently — if one part of your system needs 10x the compute of another, you're scaling the whole thing together. That limitation matters at large scale; it often doesn't matter at all at early stage.
Microservices give you independent deployment (one team can ship without waiting for another), team autonomy at scale, and the ability to use different technologies for different services. The cost — at small team size — is dramatically higher operational complexity, slower onboarding, and significantly harder debugging when problems cross service boundaries. The hiring profile also shifts: microservices require engineers who are comfortable with distributed systems, which is a more specialized skill set and a narrower hiring pool.
A useful mental model: the monolith is paying a small tax on every future scaling decision while keeping all current costs low. Microservices are paying a large tax now to reduce future scaling costs that may never materialize. At pre-PMF or early-growth stage, that trade rarely makes sense. Build the monolith, structure it well internally, and extract services only when the forcing function arrives. Most companies that follow this path find they need fewer services than they expected — and the ones they do extract are cleaner because the domain boundaries were already proven in the monolith.
Learn this properly, not just for one decision
In-depth courses and books that teach you to think like an engineer — not a one-off answer you'll need to look up again next time.
Frequently asked questions
We already have microservices — should we consolidate?
It depends on the team size and operational pain. If you have fewer than 15 engineers managing more than 8–10 services, the overhead is probably costing you more than the architecture is giving you. The consolidation question to ask is: which services could be merged without sacrificing anything the business actually needs today? Not which services were designed to be independent — which ones genuinely need to be? If the answer is "only two or three," the rest are candidates for merging back into a modular monolith. This is called a “macro-services” pattern, and it's increasingly common at companies that over-decomposed early.
At what team size does the microservices operational overhead become worth it?
There's no fixed number, but the forcing functions matter more than headcount. Microservices start paying off when you have multiple teams that need to deploy independently without coordinating — typically 20+ engineers organized into 3+ product teams. They also make sense when a specific component has dramatically different scaling or availability requirements than the rest of your system. If neither of those conditions applies, the overhead isn't justified regardless of team size. Some companies stay on a well-structured monolith at 50+ engineers because the product doesn't create the forcing functions that make services worthwhile.