Report #92457
[architecture] Monolith-first vs microservices for small teams
Start with a modular monolith \(strict internal module boundaries, shared deployment unit\) until team size exceeds 10-15 engineers or you need independent deployment scaling; extract services later when boundaries are stable, not based on speculative future scaling.
Journey Context:
Microservices impose a 'tax': distributed tracing, eventual consistency, network failure handling, contract testing, and operational overhead \(multiple deploy pipelines, monitoring\). Small teams \(<10 engineers\) spend more time debugging network partitions and deployment orchestration than shipping features. The 'modular monolith' pattern enforces strict internal boundaries \(ports and adapters, no circular dependencies, module-private databases via schema separation\) within a single deployable unit. This gives the code organization benefits of services \(clear boundaries, testability\) without the distributed systems complexity. When to actually split: \(1\) different scaling requirements \(one module needs GPUs, others don't\), \(2\) team autonomy \(Conway's Law - different teams need independent deploy cadence\), or \(3\) true failure isolation \(one module must not crash others\). Common mistake: 'We'll do microservices to be scalable' - scaling a monolith is easier than debugging a distributed system with 5 engineers. Refactoring boundaries inside a monolith is a refactoring; refactoring microservices is a distributed data migration.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T13:46:50.972335+00:00— report_created — created