In system design, it’s not enough to build something that just “works.” Your system needs to work well, reliably, and at scale. That’s where non-functional requirements come in.
Whilst functional requirements tell you what your system should do, non-functional requirements define how well it should do it. Should it handle a million users? Should it stay online 99.99% of the time? Should it respond in under 100 milliseconds?
These are the questions that separate a toy project from a production-ready system.
What You’ll Learn
In this section, we’ll explore the key non-functional requirements that every system designer must consider:
- Scalability: How does your system grow when you go from 100 to 10 million users?
- Availability: Keeping your system running even when components fail
- Reliability: Building systems users can depend on
- Performance: Ensuring your system is fast enough for your users
- Consistency: Managing data correctness across distributed components
- Durability: Protecting data from loss
- Maintainability: Building systems that are easy to evolve and debug
Why These Matter
In a system design interview, you’ll often be asked: “How would you handle 10 million daily users?” or “What if a data centre goes down?” These questions are probing your understanding of non-functional requirements.
More importantly, in the real world, these requirements often determine whether your system succeeds or fails. A brilliant feature is worthless if it’s too slow, frequently down, or loses user data.
Trade-offs Are Everything
Here’s the secret: you can’t optimise for everything simultaneously. Building a highly consistent system might mean sacrificing some availability. Maximising performance might increase costs. The art of system design is understanding and articulating these trade-offs.
Let’s explore each requirement in depth and learn how to make intelligent trade-offs!