Engineering
Will It Hold at 10x? A Founder’s Guide to Software Scalability
By Better Software · Thu Sep 10 2026 · 8 min read
Software scalability, defined for the person who signs the cheque
Software scalability is not speed, and it is not uptime. It is the ability to take on 10x the load without forcing a redesign.
More precisely: if usage grows, can the system absorb that growth as a capacity problem—more compute, more database headroom, more managed services—or does it become an engineering problem that requires a rewrite?
Founders often mix up three things:
- Performance: does it feel fast today?
- Reliability: does it stay up and behave correctly?
- Scalability in software development: when usage rises, do you add capacity or re-architect?
You can have a fast system that is fragile. You can have a reliable system that cannot grow. Scalability is the third question.
Scalability is not a technology you buy at the start. It is a small set of decisions you get right early so growth stays a capacity problem, not a rewrite.
The only question that matters: what breaks first at 10x?
Every product breaks somewhere. The useful question is not “is it scalable?” but “what breaks first when usage multiplies?”
In practice, the order is usually boring and predictable:
- The database becomes the first bottleneck.
- Background work done inline slows the user request path.
- Anything holding state on one machine becomes hard to coordinate.
- The team’s ability to change the code safely becomes the real limit.
A concrete example: imagine a workflow app with 1,000 active users, 200 of whom generate reports each morning. At low volume, one database and one application server are enough. At 10x volume, the report job runs while users are logging in, the database starts queuing requests, and the app appears “slow” even though nothing is technically down. The problem is not that you lacked Kubernetes. The problem is that one expensive task was happening in the wrong place at the wrong time.
That distinction matters. Many teams reach for infrastructure before they understand the bottleneck. Real software scalability starts by identifying which layer fails first.
Why most scalability advice is wrong for you right now
Most search results are written for engineers and default to the same list: load balancing, caching, microservices, sharding, queues, multi-region, Kubernetes. Those tools are real. They are just not the starting point for most founders.
At Stage 0, over-building for scale has a real cost:
- weeks of runway spent on architecture no customer asked for
- features delayed because the system got more complex than the team can safely change
- a codebase that is “enterprise-ready” in theory and brittle in practice
The counter-position is simpler: a well-designed single application on a managed relational database carries most products much farther than founders are told. That is not a failure of ambition. It is good sequencing.
So the question is not “Should we use microservices?” It is “Which decisions are cheap now and expensive later?”
The four seams: decisions that are cheap now and expensive later
This is the framework that matters if you are a non-technical operator trying to judge software scalability without reading code. The four seams are the places where early decisions are hard to reverse later.
1) The data model
The shape of your data is the hardest thing to unmake. Good scalable software architecture starts with real entities and real relationships: customers, accounts, orders, permissions, events, invoices. Not a blob of JSON where everything is stuffed into one flexible column because it was faster to ship.
Why it matters: if the data model is vague now, every reporting, permissions, billing, and migration problem gets harder later. The database is not just storage. It is the product’s memory.
Reassuring answer: “We have a clear schema, normalised where it matters, and we can explain the core entities.”
Hand-waving answer: “We keep it flexible with JSON so we can adapt later.” Sometimes flexibility is useful. As a strategy for the core product model, it is often debt disguised as speed.
2) Identity and tenancy
If you have users, organisations, roles, permissions, or any enterprise buyer on the horizon, this seam matters immediately. The question is whether the product knows, from day one, who belongs to what account and what they are allowed to do.
Why it matters: many rewrites are not caused by traffic. They are caused by bad assumptions about account structure. The moment you need team accounts, audit trails, invitations, role-based permissions, or customer-specific data separation, identity and tenancy become expensive to repair.
Reassuring answer: “We model users, organisations, and permissions explicitly, and tenancy is built into the product boundaries.”
Worrying answer: “Right now everyone is basically one user type, but we can sort that out when needed.”
3) Money, jobs, and idempotency
Anything that moves money, sends emails, triggers webhooks, creates files, or calls another system must be safe to retry. That is what idempotency means in practice: if a job runs twice, you do not charge twice, notify twice, or create duplicate records.
Why it matters: retry logic is where scale exposes correctness bugs. Under light use, duplicates may be rare and invisible. Under growth, they become expensive, public, and operationally noisy.
Reassuring answer: “Critical actions are idempotent, jobs are queued or tracked, and we can safely retry failures.”
Worrying answer: “We haven’t needed retries yet.” That usually means the system has not been exercised enough, not that it is safe.
4) Modules with clear boundaries
The best scalable systems are not necessarily microservices. They are systems with clear seams inside one application.
That means the reporting module does not know too much about billing; the billing logic does not leak into authentication; the workflow engine does not depend on every other part of the product. When boundaries are clear, the part that eventually needs to scale can be pulled apart later without a rewrite.
Reassuring answer: “The code is modular, the boundaries are explicit, and pieces have limited reasons to change together.”
Worrying answer: “Everything talks to everything, but it works.” That is not architecture. That is future migration work.
What you can safely defer, and the signal that says stop deferring
Here is the practical defer-versus-decide table most founders need:
- Sharding — defer unless one database is clearly saturated and partitioning is the simplest fix.
- Microservices — defer unless a part of the system has a genuinely different scaling profile and separate team ownership.
- Read replicas — defer until read traffic is materially competing with writes and you can prove that is the bottleneck.
- Caching layers — add when repeat reads are dominating latency or cost, not because caching sounds mature.
- Multi-region — defer until geography, resilience, or compliance forces it.
- Queues at scale — use when work can safely happen later and you need to protect the user path from slow jobs.
The signal to stop deferring is not “someone on the team is worried.” It is measured evidence: the slow query is known, the queue is growing, the database is pegged, or the deploy path is too risky for the rate of change.
How to know it is true when you cannot read the code
If you are not technical, do not ask “Is it scalable?” Ask questions that force an inspectable answer.
- Can you show me the data model? Reassuring: a diagram or schema with core entities and relationships. Worrying: “It’s abstracted away.”
- What is the slowest query in production right now? Reassuring: they know it, measure it, and can explain why it is slow. Worrying: no one can name it.
- What happens if this job runs twice? Reassuring: retries are safe, duplicates are prevented, side effects are controlled. Worrying: “That should not happen.”
- Where are the tests that would fail if this broke? Reassuring: unit, integration, and critical path tests exist. Worrying: “We test manually.”
- Can you deploy a change today and roll it back in five minutes? Reassuring: yes, with a known process. Worrying: rollback is a ceremony.
- Who reviewed the last change that went out? Reassuring: code review is standard and specific. Worrying: one person merges everything.
These questions do not require code fluency. They require accountability. A confident answer should be specific enough that you can picture the system. If it stays vague, it is usually not mature enough for growth.
The engineering discipline that makes scaling boring
Software scalability is easier when the team uses basic engineering discipline from the start. Not because it is fashionable, but because each practice prevents a specific failure mode.
- Code review prevents a single person from shipping hidden complexity.
- Automated tests with enforced coverage catch regressions before they become production incidents.
- CI/CD makes small releases possible instead of risky, infrequent events.
- Observability and logging show what is slow, what is failing, and where traffic is actually going.
- Infrastructure as code reduces environment drift when the system grows.
- A broken-window policy keeps temporary hacks from becoming permanent structure.
That is the difference between a team that can absorb growth and a team that loses confidence each time traffic rises.
For an inspectable example of how this is done in practice, see the