Chris LeeLet's be brutally honest: if you're building a new web application and your first instinct is to...
Let's be brutally honest: if you're building a new web application and your first instinct is to reach for a microservices architecture, you are almost certainly building a scalability trap, not a scalable system. The industry has fetishized microservices as the default "enterprise-grade" solution, but this is a classic case of putting the scalability cart before the monolithic horse. True scalability is first and foremost about developer velocity and team cognition, not just partitioning for the sake of partitioning. A distributed system's complexity scales super-linearly with the number of services—you're not just solving your domain problems, you're now solving for network latency, distributed tracing, inter-service authentication, contract versioning, and operational hell. For the vast majority of applications, this overhead destroys the agility you need to iterate and grow.
The pragmatic path to genuine scalability is the modular monolith. Build one deployable unit, but with crystal-clear, strictly enforced module boundaries within the codebase. This gives you the cognitive simplicity of a single codebase, a unified deployment pipeline, and straightforward local development, while still isolating concerns. You scale the application by scaling the monolith's infrastructure (larger instances, caching layers, read replicas) and, critically, by scaling the team's ability to work on it—which the modular structure supports. Only when a specific module's scaling requirements fundamentally differ from the rest (e.g., a real-time video processing service needs GPU instances, while the rest is standard web servers) does it make sense to extract that one module into a service. Starting with microservices is like trying to perform brain surgery with a chainsaw; you might eventually get there, but you'll cause immense unnecessary damage along the way.
The strongest opinion here is this: Scalability is a property of your organization's ability to ship features, not just a property of your infrastructure. A distributed system that a small team cannot understand, test, or deploy reliably is not scalable—it's brittle. Focus first on building a clean, well-structured monolith that your entire team can own. Master database optimization, caching strategies (Redis, CDNs), and asynchronous processing (queues) within that single system. Those are the skills that will make you truly capable of designing a distributed system when and if you genuinely outgrow the monolith's bounds. Don't optimise for the scaling problem you think you'll have in five years; optimise for the delivery problem you definitely have today.