System Design in Simple Words: Learn It With a Hotel Story
- Jayant Upadhyaya
- Jan 21
- 7 min read
System design sounds like a big and scary topic. Many people think it is only for top engineers or only for interviews. But system design is not magic. It is just learning how to build a system that keeps working when users and traffic increase.
The easiest way to understand system design is to stop thinking in technical terms first. Instead, think like a normal person solving a real-world problem. After that, you can map the same idea into software.
This blog explains system design using a simple hotel story. No heavy jargon. The goal is to make you understand:
what system design actually means
why it matters
how systems grow step by step
why every improvement has trade-offs
By the end, you will understand common system design ideas like:
indexing (faster search)
load balancing (sharing work)
shared storage (shared memory like Redis)
horizontal scaling (adding more capacity)
API gateway (routing requests)
All using one story.
What Is System Design, Really?

System design is simply this:
When more people start using your system, how do you keep it fast, correct, and reliable?
In the beginning, a simple setup works. But as users grow, small problems appear:
things slow down
people wait
mistakes happen
different parts stop agreeing with each other
System design is the process of fixing these problems step by step.
Start With a Simple Hotel
Imagine you own a small hotel. It is new and not very popular yet.
You have:
a reception desk
some rooms
8 empty rooms available
You want to let people book rooms by phone. This is an old-fashioned story: no apps, no websites.
So you hire one customer support person.
How booking works
A customer calls.
Customer support checks if a room is available.
If yes, they book a room.
The customer comes later and gets the key.
This works perfectly when you have very few customers.
Growth Begins: More Users Start Calling
Now the hotel becomes popular. People recommend it. The number of customers increases.
Earlier, you had 1 customer calling. Now you have 4. Then 10. Then more.
At first, it still works.
But very soon, you hit the first real problem.
Problem 1: Checking Availability Takes Too Long

The support person is using a register (a notebook) to track bookings.
When a customer calls and asks, “Is any room available?”, the support person has to:
look through the register
check room by room
find which rooms are free
This takes time. The call becomes longer. Waiting increases. The support person gets stressed.
This is an important system design moment.
The problem is not the phone call itself.The problem is searching for availability is slow.
What this means in software
This is like having data in a database but no fast way to find what you need.
You are doing a slow scan every time.
Solution 1: Create Two Buckets (Available vs Booked)
Instead of checking the register every time, create a simpler method.
Imagine you have:
one green bucket for available room keys
one red bucket for booked room keys
At the start:
all keys go into the green bucket
red bucket is empty
How booking works now
Customer asks if a room is available.
Support person looks at the green bucket.
If the green bucket has keys, rooms are available.
Support person takes one key out.
That key moves to the red bucket (room booked).
Now availability checking is instant:
no searching the register
no scanning room by room
just check the bucket
What this means in software
This is like using a better data structure.
Instead of searching everything, you maintain a list of “available resources.”
The “Bucket” in Code: Heap Example
Now map the bucket idea into code.
A bucket can be represented using a data structure such as a heap.
A heap helps you quickly pick an item:
without scanning everything
by keeping the best candidate on top
So instead of searching the entire database for free rooms, you check:
if heap size > 0, rooms exist
pop a room ID and assign it
This is a system design idea:use the right data structure so the system stays fast.
Problem 2: Too Many Calls for One Support Person

Now the hotel becomes even more popular.
The number of calls increases so much that one customer support person cannot
handle it.
Calls start waiting. Customers get frustrated.
So you hire a second customer support person.
Now you have:
Support Agent A
Support Agent B
But there is a new problem.
Problem 3: Everyone Calls the Same Number
If you give customers two different numbers:
most customers still call the first number
because that is the number in your ads or visiting cards
or people don’t know the second number exists
Result:
Support A gets overloaded
Support B sits idle
You hired a second person, but you are not using them properly.
This is exactly what happens in software too.
Solution 2: One Public Number + Internal Distribution
Instead of giving two numbers to customers, you create one reception number.
Customers call only this number.
Inside the hotel, the reception forwards calls to Agent A or Agent B.
This helps balance the work.
What this means in software
This is a load balancer.
Instead of users deciding which server to hit, users hit one entry point.
The load balancer distributes traffic to multiple servers behind it.
How Load Balancer Maps to Servers
Imagine two servers:
Server 1 has its own address (IP)
Server 2 has its own address (IP)
If users choose directly, most will go to one server.
So you add a load balancer with one public address.
Users always hit the load balancer.
Load balancer sends requests to Server 1 and Server 2 in a fair way.
That’s the core idea.
Problem 4: Two Agents, Two Buckets, Wrong Results

Now comes a tricky problem.
Each support agent has their own green bucket and red bucket.
So:
Agent A has some available keys
Agent B has some available keys
But over time, buckets can become uneven.
Example
Agent A gets many calls in a row.
Agent A books all keys from their bucket.
Now:
Agent A thinks “no rooms left”
but Agent B still has keys
If the load balancer sends the next call to Agent A, the customer will be told:“Sorry, no rooms available”
But that is wrong.Rooms exist, but Agent A’s local bucket is empty.
This is a false signal.
Solution 3: Shared Bucket for Everyone
The fix is simple:
remove the separate buckets
create one shared bucket for the hotel
both agents access the same bucket
Now any agent can correctly see the real availability.
What this means in software
This is shared state.
Instead of keeping data inside each server’s memory, you move it to a shared system.
A common example is Redis, which is an in-memory distributed cache.
So both servers read and write availability from one shared place.
The Trade-Off: Speed vs Consistency
But nothing is free.
Earlier, each agent had their bucket on the desk:
fast access
no walking
Now the shared bucket is across the room:
agents must walk to it
it takes a little more time
In software:
local memory is faster
network calls are slower
shared storage adds latency
So what is the benefit?
correctness
consistency
no wrong answers
This is a core system design truth:
System design is always about trade-offs.Here the trade-off is:
slightly slower
but always correct
Scaling the Hotel: Horizontal Scaling
Now assume your hotel grows even more.
All rooms are full most of the time. So you add more rooms.
You can do this by:
adding another floor
buying a nearby building
expanding the property
This is called horizontal scaling.
In software, horizontal scaling means:
adding more servers
instead of trying to make one server bigger
More servers help you handle more traffic.
One More Layer: The Gatekeeper (API Gateway)

As the hotel becomes larger, you might offer different services:
basic rooms
premium rooms
banquet hall
restaurant bookings
Now you may want a system that routes customers based on what they need.
A person at the entrance can ask:
“Do you want premium service or basic service?”
then send the customer to the correct reception
In software, this is like an API Gateway.
It becomes a front door that:
receives requests
decides where they should go
routes them to the correct internal service
The Big Lesson: System Design Is Not Memorization
System design cannot be learned by memorizing definitions only.
Real learning happens like this:
Start with a real-world problem.
Solve it in a simple way.
Notice what breaks when scale increases.
Add one improvement.
Understand the trade-off.
That’s the true method.
Terms You Should Know (Simple Meaning)
Even if system design is not about memorizing, some terms should be familiar:
Load Balancer: splits traffic across servers
Redis / Distributed Cache: shared fast memory used by many servers
Horizontal Scaling: adding more servers or more capacity units
API Gateway: one entry point that routes requests to services
Latency: delay (extra time) caused by network hops
Consistency: everyone sees the same correct data
Final Takeaway
System design is just structured problem solving.
Start simple. Grow step by step. Fix problems as scale increases.
The hotel story shows the exact pattern:
fast search needs better structure (bucket/heap)
too many requests need distribution (load balancer)
separate copies cause wrong answers (shared state / Redis)
growth needs scaling (more rooms/servers)
complexity needs routing (API gateway)
That is system design.
It is not magic. It is not a list of buzzwords. It is learning how to build systems that keep working when the world gets bigger.



Comments