Back to Blog
NewsOctober 24, 202613 min read

System Design Mistakes Beginners Make: Build Boring First

The biggest system design mistake beginners make is building for scale they don't have. Stack Overflow, Martin Fowler and Google's SRE book all point the same way.

System Design Mistakes Beginners Make: Build Boring First

8 min read · Last updated: October 24, 2026

The most common system design mistake beginners make is designing for scale they do not have. They add message queues, caches and microservices before a single user arrives. The fix is to build the simplest version that works, write down real numbers, measure it, and add a component only when a measured problem asks for it.

Came here from Instagram, LinkedIn, X or YouTube? Here is the full source list you came for. Everything below is built from these, nothing else.

The essay that started this

The architecture writing

The docs

The receipts

Here is my take, plainly: most beginner systems do not fail because they are too simple. They fail because they are too clever, too early.

A post on Beyond Localhost this week opens with a line I felt in my chest. The writer describes the first system they designed alone, a "simple" notes app, and within a week it had a message queue and a pile of other moving parts. I have built that notes app. You probably have too.

This article is about why that happens, what the evidence says, and what to do instead.

Key takeaways

  • The number one system design mistake beginners make is solving scale problems they do not have yet.
  • Stack Overflow served 209,420,973 HTTP requests a day on 11 web servers and 4 SQL servers, per Nick Craver's February 2016 write-up.
  • Martin Fowler wrote in 2015 that almost all successful microservice stories started with a monolith.
  • Dan McKinley's rule: every company gets about 3 innovation tokens. Spend them on your product, not your plumbing.
  • Google's SRE book names 4 golden signals to monitor: latency, traffic, errors and saturation. Beginners usually monitor none.

What are the most common system design mistakes beginners make?

The most common system design mistakes beginners make are: designing for millions of users on day one, splitting into microservices too early, adopting new technology for every layer, adding queues and caches before measuring anything, skipping the numbers, and shipping with no monitoring. Every one of them adds complexity before there is a problem to justify it.

Here they are side by side.

MistakeWhat it looks likeWhat to do instead
Designing for imaginary scaleSharding a database with 40 rowsWrite down expected users and requests per second first
Microservices on day oneFive services for one notes appStart with one well-structured monolith
New tech everywhereA new database, queue and framework in one projectSpend at most 3 innovation tokens
Queues and caches before measuringRedis and a broker "just in case"Add them when a measured bottleneck appears
No numbers"It needs to be fast"Estimate reads, writes and storage with real arithmetic
No monitoringFinding out from users that it is downTrack latency, traffic, errors and saturation

Notice the pattern. Five of the six are the same mistake wearing different clothes: adding things. Only one is about leaving something out, and that one is monitoring.

Why do beginners over-engineer their first system?

Beginners over-engineer because the system design content they learn from is about companies at enormous scale. Interview prep, conference talks and architecture diagrams all show the end state of a big company, not the first version. So the beginner copies the end state and skips the decade of real problems that produced it.

I do not blame anyone for this. If every diagram you have ever seen has a load balancer, a cache, a queue and a sharded database, then a diagram without them looks unfinished. It looks junior.

But a diagram is not a system. Every box you draw is something you now have to deploy, configure, monitor, secure and debug at 2 a.m.

Google's SRE book has a name for this. In the chapter on simplicity it separates two kinds of complexity: "Essential complexity is the complexity inherent in a given situation that cannot be removed from a problem definition, whereas accidental complexity is more fluid and can be resolved with engineering effort."

A message queue in a notes app with no users is accidental complexity. You created it. Nobody asked for it.

The same chapter says "boring" is actually a positive attribute when it comes to software, and quotes C.A.R. Hoare: "The price of reliability is the pursuit of the utmost simplicity."

Every box on your diagram is a thing that can break. Draw fewer boxes.

How much can a simple architecture actually handle?

A lot more than beginners assume. Stack Overflow is the best public example. In February 2016, engineer Nick Craver published the full architecture: 11 IIS web servers and 4 Microsoft SQL Servers handling 209,420,973 HTTP requests and 66,294,789 page loads in a single day.

Read that again. One of the most visited developer sites in the world, running on a server count you could fit in a small room.

Craver went further. He wrote that thanks to optimizations and new hardware, "we're down to needing only 1 web server." He immediately added, "I'm saying it works. I'm not saying it's a good idea." They kept redundancy for safety, which is the right call. But the point stands: the capacity was there.

He also noted that every Redis instance was "below 2% CPU. Usually much lower."

Your notes app will not hit 209 million requests a day this year. Probably not ever. You do not need the architecture of a company ten thousand times your size.

Should beginners start with microservices or a monolith?

Beginners should start with a monolith. Martin Fowler, one of the most cited voices in software architecture, wrote in June 2015 that "almost all the successful microservice stories have started with a monolith that got too big and was broken up," and that systems built as microservices from scratch often ended up in serious trouble.

His reason is simple. Microservices carry a cost he calls the microservice premium. In a separate May 2015 post he put it bluntly: "don't even consider microservices unless you have a system that's too complex to manage as a monolith." He adds that the approach "brings a high premium, one that can slow down your development considerably."

That premium is real, and you pay it on day one:

  1. Every call between services is now a network call that can time out.
  2. Every service needs its own deploy, logs and health checks.
  3. A single change can touch three repos and three releases.
  4. Debugging means tracing a request across processes instead of reading one stack trace.

A monolith with clean module boundaries gives you most of the organisation benefits with none of the network. When one part genuinely outgrows it, you split that part. You will know which part, because you measured it.

If you are still getting comfortable with how services talk to each other, our REST API guide for beginners covers the basics before you add more of them.

How many new technologies should a beginner use in one project?

Use as few as possible, ideally one new thing per project. Dan McKinley, an engineer formerly at Etsy, argued in his March 2015 essay Choose Boring Technology that every company gets about three innovation tokens. Each new, unproven tool spends one. Spend them on what makes your product different, not on infrastructure.

His case for boring tools is that "their failure modes are well understood." When PostgreSQL misbehaves, thousands of people have hit the same problem and written about it. When the database you found last Tuesday misbehaves, you are on your own.

For a beginner the token budget is even smaller. If the goal is to learn system design, pick one new thing to learn and keep everything else familiar. Learning a new database, a new queue and container orchestration in one project means you learn none of them well.

If containers are your one new thing this month, start with our Docker explainer for beginners instead of jumping straight to a cluster.

How do you know when to add a cache or a queue?

Add a cache or a queue when a measurement tells you to, not when a diagram does. Write down your expected load as numbers, run the arithmetic, then watch the real system. If a specific endpoint is slow or a specific job blocks requests, that is the moment to add the component that fixes that one problem.

The arithmetic is the part beginners skip, and it takes five minutes. Here is the whole thing for a notes app:

users = 1_000
notes_written_per_user_per_day = 20
reads_per_write = 10
seconds_per_day = 86_400

writes_per_day = users * notes_written_per_user_per_day
writes_per_second = writes_per_day / seconds_per_day
reads_per_second = writes_per_second * reads_per_write

print(f"{writes_per_day:,} writes/day")
print(f"{writes_per_second:.2f} writes/sec")
print(f"{reads_per_second:.2f} reads/sec")

Run it and you get 20,000 writes a day, about 0.23 writes per second and about 2.3 reads per second.

That is the load. Two reads a second. A single ordinary database handles that while barely noticing. There is no queue in this picture because there is no problem for a queue to solve.

Now multiply users by 1,000 and run it again. You get about 231 writes per second. Still not scary, but now you have a real number to design against, and you can decide what to add with evidence instead of anxiety.

What should beginners monitor in a new system?

Start with the four golden signals from Google's SRE book: latency, traffic, errors and saturation. Latency is how long requests take. Traffic is how many arrive. Errors are how many fail. Saturation is how full your resources are. Those four numbers tell you when to change your design.

This is the one place where beginners usually do too little, not too much. They add three services and zero dashboards.

Monitoring is also what makes the rest of this advice safe. "Add complexity when a measured problem asks for it" only works if you are measuring. Without the four signals you are guessing, and guessing is how the message queue got into the notes app in the first place.

Isn't it better to design for scale from the start?

This is the strongest counter-argument, and it deserves a real answer. The worry goes like this: if the app takes off, a simple design will collapse, and a rewrite under pressure is far worse than building it right the first time.

There is something true in it. Some decisions are expensive to change later. Your data model is one. How you identify users is another. Getting those wrong early really does hurt.

But look at what that argument actually protects. It protects the data model and clean boundaries in your code. It does not protect a message broker, a service mesh or a sharded database. Those are easy to add later and expensive to carry now.

The evidence also points the other way. Fowler's observation is that the microservice systems that succeeded mostly started as monoliths, and the ones built as microservices from scratch were the ones that got into trouble. Stack Overflow shows how far a careful simple design stretches. And the arithmetic above shows that "takes off" means 1,000 times your launch traffic before a single database even starts to sweat.

So my answer is: design your data and your boundaries carefully from day one. Design your infrastructure for the load you can prove. Those are different jobs.

This is also exactly what interviewers look for, which we cover in why most developers fail system design interviews. The candidate who asks for numbers before drawing boxes usually wins.

What should you do on your next project?

Here is the order I would follow:

  1. Write the requirements in one paragraph. What does the system do, for whom, and how many of them?
  2. Do the arithmetic. Users, requests per second, storage per year. Five minutes, real numbers.
  3. Build one deployable app with one database. Keep the modules inside it cleanly separated.
  4. Spend at most one innovation token. Everything else should be something you already know.
  5. Add the four golden signals before you add anything else.
  6. Wait for a measured problem. Then add the one component that fixes it, and write down why.

Step 6 is the hard one. It feels like doing nothing. It is actually the discipline that separates a working system from a diagram.

The fundamentals behind all of this, data structures, how a database index works, what a network call costs, matter more than the tools. That is the argument in our post on why coding fundamentals still matter.

FAQ

What is the biggest system design mistake beginners make?

Designing for scale they do not have. Beginners add queues, caches and microservices before any real load exists, which creates accidental complexity that has to be deployed, monitored and debugged. Build the simplest version that works, then add components only when a measured problem requires them.

Is a monolith bad system design?

No. A well-structured monolith is the recommended starting point for most new systems. Martin Fowler wrote in 2015 that almost all successful microservice stories began as a monolith that grew too big and was split up. Keep clean module boundaries so you can split later if you need to.

How many servers does a large website really need?

Fewer than most people think. In February 2016, Stack Overflow handled about 209 million HTTP requests a day on 11 web servers and 4 SQL servers, according to engineer Nick Craver. He wrote that, after optimizations, they could technically run on a single web server, though they did not recommend it.

What should I learn first for system design?

Learn to estimate load with simple arithmetic, understand how a single relational database behaves, and learn the four golden signals of monitoring: latency, traffic, errors and saturation. Those three skills tell you when a design needs to change, which matters more than memorising big-company architectures.

Open your current side project, run the five-minute arithmetic, and delete one box you cannot justify. Then browse the free tools on Art of Code, or read why most developers fail system design interviews if an interview is next.

Written by Adithya Guttha, Founder of Art of Code.

#system design#software architecture#microservices#monolith#beginners

Sign in to like and save posts.

Curious Adithya

Written by

Curious Adithya

@curious_adithya · 5 followers

Discussion

Comments (0)

Want to join the conversation?

Sign in to comment

No comments yet. Be the first to comment!