Microservices are a tax your startup probably can't afford

Microservices as Organizational Pattern, Not Startup Default

  • Many argue microservices primarily solve organizational problems: letting multiple long‑lived teams own independent domains and deploy on their own cadence.
  • For startups or orgs with <~5–10 engineers, this overhead is seen as pure tax: more repos, infra, coordination, and fragile local setups, with no real scaling or team benefit yet.
  • Several note that team boundaries are often unstable in startups; tying architecture to transient org charts backfires.

Costs, Failure Stories, and Overengineering

  • Numerous anecdotes: tiny user bases (hundreds or low tens of thousands of MAUs) running dozens of services or hundreds of Lambdas, burning years and millions, then collapsing or rewriting back to a monolith.
  • Common problems: complex deployments, hard local dev, slow onboarding, brittle inter-service contracts, and “distributed monoliths” with tightly coupled services and shared databases.
  • Nanoservices (one-table DB per service, or single-URL Lambdas) are widely mocked as pure overhead.

Alternatives: Monoliths, Modular Monoliths, and “Regular” Services

  • Strong support for starting with a monolith, sometimes split only into frontend/backend and a background job worker.
  • “Modular monoliths” with clear module boundaries, DI, actors, and tools like CODEOWNERS/ArchUnit are presented as giving many microservice benefits (interfaces, isolation) without network and ops tax.
  • Some advocate single codebase / multi-role binaries or monorepos with multiple deployable services.

When Microservices (or Separate Services) Do Make Sense

  • Repeated “good reasons” cited:
    • Very different resource/scale or availability requirements (GPU jobs, hot paths, queue pollers, control vs data plane).
    • Different tech stacks (e.g., Ruby app plus R or Python for data/ML).
    • Distinct security/compliance or data‑lifecycle needs (healthcare data, auth).
    • Large orgs (many teams) needing independent lifecycles and risk isolation.
  • Even then, advice is to avoid synchronous chains, noun-based services, and shared DBs; favor bounded contexts and async messaging.

Tooling, Testing, and Culture Requirements

  • Successful microservice setups are said to require: strong shared standards, dedicated platform/devops/tooling teams, robust CI/CD, observability, and often end‑to‑end tests.
  • Debate appears around “broken builds”, test guarantees, and static vs dynamic typing, but consensus is that without solid engineering discipline, microservices amplify problems.
  • Some note microservices force serious API and modularity design; monoliths often don’t get the same design rigor unless the engineering culture is strong.