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!