JW Cornelis

Software Engineer

Scaling Without Complexity

November 07, 20246 min read

A person putting out a server that is on fire

Engineers love complexity. They don't set out to, but it's easy to see how they end up there. A founder, fresh off their first round of funding, feels the pressure to "scale." After all, they’re building the next big thing. So they and their engineers look at what the successful companies are doing and try to emulate it: Kubernetes, multi-cloud redundancy, microservices, serverless functions, continuous integration, automated rollbacks, and a hundred other buzzwords that seem like tickets to the big leagues. Before long, the company is spending more time wrangling infrastructure than actually building the product that’s supposed to matter and can bring in enough money and margin to even consider this technical dept.

Here’s the truth: most of this complexity is unnecessary—maybe even harmful. Startups aren’t succeeding because they’re masters of complicated infrastructure. They’re succeeding because they’ve built something people want. And, more often than not, the simplest path to that goal is the right one. Adding complexity doesn’t just slow you down, it risks turning your company into an elaborate Rube Goldberg machine—all gears, pulleys, and moving parts that you spend more time servicing than benefiting from.

The thing about scaling is that it’s not really about infrastructure. It’s about understanding where your bottlenecks are. Most of the time, that bottleneck is customer interest, not server performance. Startups die because they fail to make something people want to pay for and even endure slow onboardings and loadtimes, not because they couldn’t autoscale quickly enough.

There's a whole industry designed to make scaling look complicated. Tech conferences are full of polished speakers telling you that unless you’re using managed Kubernetes, horizontal scaling, container orchestration, and all the other bells and whistles, you’re doing it wrong. And why wouldn’t they say that? Their companies literally exist to sell you these things. They’re solving problems they think you should have—or maybe they’re just making you aware of them so they can offer a solution.

There’s an insidious trick that happens here. Complexity starts to feel like the "safe" choice. No one gets fired for following "best practices." The more tools and services you add, the more bulletproof you feel. But what’s lost is a sense of the trade-offs you’re making. You add another layer of abstraction, and now deploys take twice as long. You introduce a managed database service, and now your engineers spend half their time troubleshooting networking issues between services that used to be in the same VM. You follow all the "best practices" and wonder why suddenly it takes a 15-person ops team to do what one engineer used to handle alone.

These best practices work for companies with hundreds or thousands of engineers—companies that need to keep hundreds of microservices running in sync across the globe. But that’s not you, not yet. For 99% of startups, that level of complexity is a self-inflicted wound. It’s like trying to navigate a canoe with a battleship’s command center. You don’t need a control room full of buttons and blinking lights; you need a paddle, maybe two.

Simple Scales Better

The most productive teams I've worked with never had complicated infrastructure. They were fast because they kept things simple. They iterated quickly because they could actually understand the whole system. And when something broke, they fixed it without having to call in Sherlock Holmes to decipher what went wrong.

Consider this: you have a backend that runs on a single VM. It’s a boring stack—maybe just nodejs and SQLite—but it’s solid. You don’t have to worry about networking issues between containers. You don’t need to manage different node types in your Kubernetes cluster or worry about the latest patch for a managed service you barely understand. When something breaks, it’s obvious what broke, and you can fix it directly. You can get your engineers up to speed in a day instead of weeks. Your deploys take seconds, not 15-minute-long mystery tours. You spend more time building your product and less time managing the machinery that’s supposed to run it.

The irony is that simple systems are often more reliable, not less. Fewer moving parts mean fewer things to break. When they do break, they’re easier to fix. Instead of adding layer upon layer of redundancy, simplicity itself becomes your redundancy—you can fix issues faster, understand your stack more comprehensively, and, most importantly, you can move with speed and confidence.

Complexity as a Form of Procrastination

So why do people still do it? Why do startups reach for Kubernetes before they’ve even found product-market fit? I think part of the answer is that complexity makes us feel busy. It’s easier to add new tech than it is to face the uncertainty of whether your product is working. Setting up elaborate infrastructure feels like progress, even if it’s the wrong kind of progress. It’s a way to stay in motion while avoiding the hard question: are we building something people actually want?

The biggest lie complexity tells is that it’s preparing you for the future. That if you set up everything "right" from the beginning, you’ll never need to revisit it. But the reality is that every product’s needs change over time, and what’s "right" today might be dead weight tomorrow. What works at one scale almost certainly won’t work at another—no matter how sophisticated your Kubernetes setup is.

In the early days, you’re not supposed to be building a perfect system. You’re supposed to be building the quickest, most direct path to answering the one existential question: "Does anyone care about what we’re building?" Complexity distracts from that mission. It shifts the focus from customers to infrastructure, from iteration to optimization. But you can’t optimize your way to product-market fit. That only comes from listening to users, iterating quickly, and keeping your focus on what really matters.

Swim Against the Current

The funny thing about "industry best practices" is that they always come with the implicit assumption that everyone’s problems are the same. But your problems aren’t Google’s problems. You’re not running Gmail or Facebook. You don’t have a billion users (yet), and until you do, you shouldn’t pretend you’re operating at that scale. The tools those companies use are designed for their particular problems, not yours. And trying to use them prematurely is like trying to build a suspension bridge to cross a small creek.

So swim against the current. Resist the pressure to scale like a tech giant when you’re still just trying to find your first ten thousand users. Build the simplest system you can get away with. Run it on one database. If you have a backend, make it one service. When you eventually reach the point where these things actually break—where one database can no longer handle the load, where a single VM isn’t enough—you’ll have learned enough about your product and your users to make those changes with purpose.

Until then, keep it simple. You'll move faster, your team will thank you, and, most importantly, you’ll spend your time on what actually matters: making something people want.

Want to read more?

Sign up to receive my newsletter, usually once every two weeks. I write in-depth insights and guides about startups, tech, and growth.

Max one email per week, unsubscribe anytime with one click.