Published on

System Design: why it matters

--
Authors
  • avatar
    Name
    Lucas Andrade

Have you ever stopped to think about how your favorite bank's app can process thousands of payments per day without failures?

How your favorite streaming platform delivers the same content in different parts of the world with incredibly low latency?

Or even how the cache system you implement can handle thousands of simultaneous requests without overloading a server?

All of this happens thanks to a set of concepts and technologies working behind the scenes: message queues, distributed systems, load balancing, data replication, fault tolerance, and countless other things.

All of these are concepts included in SYSTEM DESIGN.

Personally speaking, I think it's the most magical part of Software Engineering: realizing that, in most cases, the secret isn't in some miraculous code, but in how the system's components communicate with each other (and especially, how they handle things when something goes wrong). The world of software development has evolved incredibly in recent years. And in this evolution, the ability to build robust, scalable, and efficient systems has become not just a differentiator, but a fundamental necessity.

But what is System Design, anyway?

As I mentioned above, System Design is a concept that's a bit more high-level than having performant code: It's understanding how components connect in a way that your app's growth, in terms of usage, not features, doesn't affect them on a serious scale.

It's asking yourself:

  • How many servers do we need?
  • How do users connect to my system?
  • What if my server fails?
  • What if my demand comes from another location?

This ensures that your app not only works, but works at scale, with security, and efficiently.

Why is System Design So Crucial?

In today's technological landscape, where the demand for applications that work 24/7, process data in real-time, and support a growing number of users is constant, System Design emerges as the map that guides the construction of lasting solutions. Without a well-defined architecture, systems tend to fail, show unsatisfactory performance, and generate high maintenance costs.

Let's be honest: who hasn't been frustrated with a slow website or an app that crashes at the most inopportune moment? This is often a symptom of deficient System Design. It's like trying to build a building without a solid architectural project: eventually the structure gives way.

In an application with good potential for use, we always need to consider some points:

Users are unpredictable

User behavior is one of the most chaotic variables a system needs to handle. One minute everything is calm, the next minute traffic doubles, triples, or completely explodes. This can happen for countless reasons: a viral post, an influencer mention, a highly anticipated new feature, or even a DDoS attack. Unpredictability isn't the exception, it's the rule. That's why systems need to be born ready to scale up and down, without compromising user experience or the operation's financial health.

Systems fail

No matter how much we test, review, or monitor: failures will happen. Servers go down. Connections break at the worst possible moment. Bugs go unnoticed and reach production. The difference between a mature system and an amateur one isn't in avoiding failures, but in how it reacts to them. Having retry mechanisms, intelligent alerts, structured logs, and a good incident culture transforms chaos into learning and panic into resilience.

Resources = Money

Infrastructure is expensive. Every poorly optimized request, every unnecessary loop, every forgotten container running represents money going away. A poorly designed system can burn through a month's budget in a few hours. That's why understanding the impact of each choice, from architecture to instance type, from database to cache, is essential. Scaling is good, but scaling efficiently is what separates a sustainable operation from a financial problem about to explode.


The importance in indie hacking (and in large companies)

When we're in the indie hacking phase, creating something small, validating an idea, testing an MVP, it's easy to fall into the trap of thinking: "System Design is a big tech thing, I don't need that now."

But that's exactly where the mistake lies. Even a simple solo project needs to have a minimum of architectural design to not become chaos with growth. Understanding concepts like SECURITY, background jobs, efficient storage can be what differentiates a functional MVP from a product that can handle 10x more users without collapsing.

In large-scale companies, this understanding is what separates a junior developer from someone ready to lead complex projects. Knowing how systems communicate, scale, and fail is the type of skill that transforms a programmer into a complete software engineer.

Moments when System Design was lacking

  1. Twitter in 2013: the famous "Fail Whale". The system would crash whenever there were traffic spikes, like events or games. The cause? A centralized and poorly distributed backend to handle massive bursts of requests.
  2. Instagram in its early years: before migrating to a distributed architecture on AWS EC2, the app faced slowdowns and constant crashes because everything ran on a single server with a monolithic PostgreSQL.
  3. Startups that go viral overnight: it's the classic scenario of "it worked with 100 users, but stopped at 10 thousand". Lack of cache, queues, and scalability strategies are frequent villains. I won't go into depth, but on the network nearby we have several examples.

Moments when System Design shined

  1. Netflix: the perfect example of distributed architecture and resilience. The company created Chaos Monkey, a system that randomly takes down instances to ensure the service remains stable even with failures.
  2. Amazon: from the beginning, designed to support partial failures and scale horizontally. The concept of microservices was born from a real need to keep operations stable even with independent teams and services.
  3. Cloudflare: thousands of data centers around the world delivering minimal latency through impeccable network and distributed cache design.
  4. WhatsApp: even with a small team in its early years, it supported millions of messages per second using an event-driven architecture, queues, and intelligent replication.

The Challenge and the Reward

I can't say that understanding the whole is easy, as it involves a vast range of concepts, from APIs and databases to caching and networks. It's not like a code problem with a single solution; it requires the ability to justify trade-offs and visualize complex architectures.

But the reward is immense. By mastering System Design, you not only improve your technical skills, but also develop strategic thinking that will transform you from a coder into a solution architect. It's the difference between knowing how to assemble the pieces and knowing how to design the entire machine.

So, if you want to go beyond code and understand the logic behind the systems that move our daily lives, dive into this world, the sooner the better. Getting used to this vision and having it naturally is fascinating.

Where to learn

The good news is that today there are incredible resources (free and paid) to dive into this world:

Free materials

  • System Design Primer (GitHub) The most complete and didactic repository on the subject. Explains everything from basic concepts to complex architectures, with diagrams and interview questions.
  • ByteByteGo (YouTube) Alex Xu's channel, author of the book System Design Interview. The videos are short, didactic, and always illustrated with perfect animations to visualize how systems work.
  • System Design In a Hurry A guide of articles and videos from end to end explaining high and low level system design concepts. Worth studying it as a roadmap
  • Grokking System Design Concepts (Educative Free Samples) Even though the complete course is paid, several introductory lessons are free and help understand the logic of System Design interviews.
  • Cloud service documentation AWS, Google Cloud, and Azure have entire sections on architecture patterns and reference architectures. Reading these guides is seeing System Design happening in practice.

Books

  • Designing Data-Intensive Applications (Martin Kleppmann) Considered the bible of modern System Design. It deeply explains how databases, queues, replication, and fault tolerance work at large scale.
  • System Design Interview (Alex Xu) Excellent recommendation for those who want to understand how to think end-to-end when designing a system.
  • Site Reliability Engineering (Google) An inside look at Google on how large systems remain resilient.

Practice for real

  1. Choose a product you use every day (Instagram, Uber, Spotify, WhatsApp) and try to draw its architecture on a board. Ask yourself: how do they store data? how do they handle peaks? what happens if a service goes down?
  2. Create your own mini distributed system. Use RabbitMQ, Redis, and a simple database to simulate requests, cache, and queues. You'll learn 10x more than just reading about it.
  3. Participate in technical discussions. Forums like Reddit r/SystemDesign, dev.to, and even Discord and Slack groups about systems engineering are incredible places to see real solutions.
  4. Finally, keep an eye on my projects section: I'm preparing a free tool to encourage practice in your daily routine. Coming soon.

I hope my words have been useful and... See you next time 👋