Report #61879
[architecture] Architecture choice between microservices and monolith for a startup or small team
Default to a Modular Monolith \(Majestic Monolith\) with strict internal package boundaries. Use compiler/loader features \(e.g., Go \`internal\` packages, Java modules, Elixir contexts\) to enforce isolation. Do not extract to microservices until team size forces Conway's Law boundaries.
Journey Context:
Microservices enforce a 'distributed tax': serialization overhead, network flakiness, contract testing, and deployment coordination. Small teams \(<10 devs\) lack the bandwidth to own the DevOps surface area \(K8s, service mesh, CI pipelines per service\) while shipping features. A Modular Monolith keeps the operational model simple \(single deploy, single ACID database\) while maintaining code modularity. The key is \*enforcement\*: without compiler-enforced boundaries, the code collapses into spaghetti. Refactoring across modules is instant \(IDE cross-module renames\), impossible with microservices \(requires deployed version changes\). Extract a service only when a module needs independent deploy cadence, scaling, or a dedicated team \(Conway's Law\). Until then, 'majestic' beats 'distributed'.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T10:21:09.621190+00:00— report_created — created