I Was Good at Spring Boot Until a System Design Interview Humbled Me
For years, I believed I was on the right path.
I Was Good at Spring Boot Until a System Design Interview Humbled Me
For years, I believed I was on the right path.
I had spent countless hours learning Java, Spring Boot, Hibernate, REST APIs, Microservices, and databases. I could build complete applications from scratch. Give me a requirement, and I’d create controllers, services, repositories, DTOs, and APIs without breaking a sweat.
My confidence was high.
After all, I had successfully delivered projects, fixed production bugs, optimized SQL queries, and even mentored junior developers.
Then came a system design interview.
And within 30 minutes, I realized there was a huge gap between building applications and designing systems.
That interview didn’t just expose my weakness — it completely changed the way I think about software engineering.

The Interview Started Perfectly
The first round was exactly what I expected.
The interviewer asked:
- Java Collections
- Multithreading
- Spring Boot Annotations
- JPA and Hibernate
- Microservices
- REST APIs
Everything went smoothly.
I answered confidently.
I explained the difference between HashMap and ConcurrentHashMap.
I discussed @Transactional propagation levels.
I explained Kafka consumers and partitions.
The interviewer seemed satisfied.
Then he opened a blank document and asked:
“Let’s design a ticket booking system similar to BookMyShow.”
I immediately started thinking about entities.
Movie. Theater. Screen. Show. Booking.
The interviewer stopped me.
“Forget code for a moment. Think about the system.”
That was the moment I realized we were playing a completely different game.
Most Java Developers Focus on Implementation
This is not a criticism.
It’s simply how many of us learn.
When we start our careers, success is measured by our ability to write working code.
We focus on:
- Writing APIs
- Connecting databases
- Creating UI screens
- Fixing bugs
- Deploying applications
Naturally, our brains become trained to think at the code level.
A requirement comes in.
We immediately think:
- Which controller should I create?
- Which service should I add?
- Which database table should I use?
System design requires a different mindset.
Instead of thinking about classes, you think about traffic.
Instead of thinking about methods, you think about scale.
Instead of thinking about APIs, you think about architecture.
The Difference Between a Developer and a System Designer
Imagine someone asks:
“Design a food delivery application.”
A developer might think:
- Create Restaurant API
- Create Order API
- Create Payment API
A system designer asks:
- What happens during lunch hours when traffic increases 20x?
- How do we handle thousands of concurrent orders?
- How do we track drivers in real time?
- What happens if the payment service fails?
- How do we prevent double ordering?
- How do we maintain availability during deployments?
Both perspectives are important.
But only one prepares you for senior engineering roles.
My Biggest Realization
The interviewer wasn’t interested in whether I could write code.
He already assumed I could.
That’s why my resume got me into the interview.
What he wanted to evaluate was whether I understood how software behaves in the real world.
Because real-world systems are messy.
Users don’t arrive one at a time.
Servers don’t run forever.
Databases become slow.
Networks fail.
Services crash.
Unexpected traffic appears.
A system that works perfectly for 100 users may completely collapse with 100,000 users.
That’s where system design becomes critical.
The Question That Broke My Confidence
The interviewer asked:
“Imagine tickets for a cricket world cup final become available. One million users try to book seats at exactly the same time. What happens?”
My answer:
“Users call the booking API and tickets get reserved.”
The interviewer smiled.
Then asked:
“What if ten thousand people try to book the same seat simultaneously?”
I had no answer.
The issue wasn’t coding.
The issue was concurrency.
The problem wasn’t Spring Boot.
The problem was architecture.
Real Systems Have Problems That Tutorials Rarely Teach
Most tutorials teach happy-path scenarios.
Create API. Save data. Return response.
But production systems face challenges such as:
Race Conditions
Two users trying to reserve the same seat.
Network Failures
One service cannot reach another.
Database Bottlenecks
Millions of reads overwhelming a database.
Traffic Spikes
Black Friday sales.
IPL ticket bookings.
Flash sales.
Distributed Transactions
Data spread across multiple services.
Partial Failures
Some components working while others fail.
These challenges cannot be solved by adding more annotations.
They require system design thinking.
Learning System Design Changed Everything
After that interview, I started studying topics I had previously ignored.
At first, it felt overwhelming.
Terms like:
- Load Balancing
- CAP Theorem
- Eventual Consistency
- Distributed Locks
- Database Sharding
- Replication
- Message Queues
Sounded complicated.
But gradually, things started connecting.
I realized these concepts explain why large-scale systems work.
Understanding Scalability
One of the first lessons I learned was scalability.
Many applications start like this:
Users
|
Application
|
Database
This works perfectly.
Until growth arrives.
As users increase, response times increase.
Database connections become exhausted.
CPU usage spikes.
Memory fills up.
Now the architecture must evolve.
Users
|
Load Balancer
|
Multiple Application Instances
|
Cache
|
Database Cluster
Suddenly the conversation becomes much bigger than Spring Boot.
Why Caching Became My Favorite Topic
Before learning system design, I viewed performance problems as database problems.
Slow query?
Optimize SQL.
Still slow?
Upgrade server.
Then I learned Redis.
And it changed everything.
Imagine a product page receiving one million requests.
Without caching:
1,000,000 Requests
|
Database
The database suffers.
With Redis:
1,000,000 Requests
|
Redis
|
Database
Database load drops dramatically.
Response times improve.
Infrastructure costs decrease.
One simple concept can transform an entire system.
Kafka Taught Me a New Way to Think
One of the biggest mindset shifts came from Kafka.
Previously I thought:
Request arrives. Process immediately.
But what if processing takes time?
What if traffic spikes suddenly?
That’s where asynchronous processing shines.
Instead of processing instantly:
Client
|
API
|
Kafka
|
Consumers
The API remains fast.
Consumers process requests independently.
The system becomes more resilient.
This pattern powers many large-scale platforms.
The Hidden Cost of Microservices
Many developers love microservices.
I did too.
Until I learned system design.
Microservices provide:
- Independent deployment
- Better scalability
- Team autonomy
But they also introduce:
- Network latency
- Service discovery
- Distributed tracing
- Data consistency challenges
- Increased operational complexity
The lesson?
Not every application needs microservices.
Sometimes a well-designed monolith is the better choice.
Understanding these trade-offs is exactly what system design teaches.
The Architecture Topics Every Java Developer Should Learn
If you’re serious about becoming a senior engineer, invest time in:
Databases
Learn:
- Indexing
- Query Optimization
- Replication
- Partitioning
- Sharding
Caching
Learn:
- Redis
- Cache Aside Pattern
- Write Through Cache
- Cache Invalidation
Messaging Systems
Learn:
- Kafka
- RabbitMQ
- Event-Driven Architecture
Cloud Computing
Learn:
- AWS
- EC2
- S3
- Load Balancers
- Auto Scaling
Containers
Learn:
- Docker
- Kubernetes
Reliability
Learn:
- Circuit Breakers
- Retry Mechanisms
- Rate Limiting
- Fault Tolerance
Observability
Learn:
- Logging
- Metrics
- Monitoring
- Distributed Tracing
The Roadmap I Wish Someone Had Given Me Earlier
After mastering Spring Boot:
Phase 1
- SQL Deep Dive
- PostgreSQL Internals
- Redis
Phase 2
- Kafka
- Event-Driven Systems
- Messaging Patterns
Phase 3
- System Design Fundamentals
- High-Level Design
- Low-Level Design
Phase 4
- Docker
- Kubernetes
Phase 5
- AWS
Phase 6
- Distributed Systems
- Consistency Models
- Consensus Algorithms
Phase 7
- AI Agents
- Spring AI
- Modern Architectures
This roadmap would have saved me years.
What Senior Engineers Actually Do
One misconception I had early in my career was:
Senior engineers write more code.
Not necessarily.
Many senior engineers spend most of their time:
- Designing systems
- Reviewing architectures
- Identifying bottlenecks
- Planning scalability
- Improving reliability
- Mentoring teams
The impact comes from decisions, not lines of code.
The Lesson That Stayed With Me
That interview taught me something I will never forget.
Frameworks come and go.
Today it’s Spring Boot.
Tomorrow it may be something else.
But architecture principles remain valuable for decades.
Load balancing. Caching. Messaging. Scalability. Reliability.
These concepts are timeless.
Final Thoughts
If you’re currently learning Spring Boot, keep going.
It’s an excellent framework and one of the best technologies for backend development.
But don’t stop there.
The biggest leap in your career will happen when you move from asking:
“How do I build this feature?”
to asking:
“How will this system behave when a million users use it simultaneously?”
That shift transformed the way I think about software engineering.
And it all started with one interview that humbled me.
Looking back, it was one of the best things that ever happened to my career.
메타데이터
- post_id
- 929b20c64772
- slug
- i-was-good-at-spring-boot-until-a-system-design-interview-humbled-me-929b20c64772
- url
- https://medium.com/@kaurharjeet122/i-was-good-at-spring-boot-until-a-system-design-interview-humbled-me-929b20c64772
- canonical_url
- https://medium.com/@kaurharjeet122/i-was-good-at-spring-boot-until-a-system-design-interview-humbled-me-929b20c64772
- author_url
- https://medium.com/@kaurharjeet122
- status
- ok
- fetched_at
- 2026-06-12 07:40:50