Modern Tech Stacks Kill Startups
writingThere is a specific kind of startup failure that nobody talks about because it does not look like failure from the outside. The team is talented, the idea is good, the GitHub organization is full of well-named repositories. But six months in there is no product. There is infrastructure. There is a Terraform setup, a Kubernetes cluster, a service mesh, an API gateway. There just is not anything a user can use. I have watched this happen. I have been adjacent to it in hackathons. And I have made the mistake myself on smaller side projects.
The Pattern
It starts with stack selection. A first-time founder reads about microservices on Hacker News, sees that the big companies use Kubernetes, and decides the MVP should be built that way so it can scale. A few weeks later they are debugging service discovery issues and writing YAML files for services that do not have a single user yet. The product never ships because the infrastructure became the product.
The counterintuitive insight is that boring technology often scales better in practice than the modern alternative, at least for the first few years. PHP and MySQL run Facebook at its beginning. Rails ran GitHub for a long time. The technology is not the constraint. The constraint is that you have not found product-market fit yet, which means you cannot predict what you need to scale.
Modern vs Simple Stack
Numbers from a real product that served 500k users on a $50/month DigitalOcean droplet.
The Hidden Cost of Complexity
Kubernetes is a sophisticated piece of technology built by Google to solve problems Google has at Google's scale. If you have fewer than a million daily active users you almost certainly do not have those problems. But you do now have the operational overhead of running a distributed container orchestration system with a small team that is also supposed to be building product.
The cost shows up in unexpected places. Every new engineer you hire needs to understand your entire infrastructure before they can ship a feature. Debugging a user-facing bug now requires understanding which of your twelve services is involved. Your deployment pipeline has five more failure modes than a simple git push to a server. Each of these is a small drag that compounds over time.
What Actually Matters Early
The question to ask at the start of a project is not what stack will scale best. It is what stack lets you ship and change fastest. Early stage startups do not die from scaling too slowly. They die from not shipping, or from shipping the wrong thing and not being able to pivot fast enough. A monolith that deploys in 30 seconds is more valuable than a microservices architecture that deploys in 45 minutes when you are still figuring out what to build.
The right time to introduce complexity is when the pain of not having it is greater than the cost of adding it. When your monolith genuinely becomes a bottleneck, split it. When you have a specific service that needs different scaling characteristics, extract it. Do not build for future problems you have not encountered yet.
Exceptions
None of this applies if your core product is inherently distributed. Real-time collaborative tools, systems that process large volumes of streaming data, or products that need geographic distribution from day one have legitimate reasons for more complex stacks. The point is not that microservices are always wrong. It is that most startups adopt them as a status signal rather than a solution to an actual technical problem.
The engineers who end up building the most interesting systems are usually the ones who understood the tradeoffs deeply enough to start simple, ship fast, and reach the point where they actually needed to solve hard infrastructure problems. You cannot get to interesting scale problems without first having scale.