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!


Fault Tolerance - Designing Resilient Systems

Complete guide to fault tolerance covering failure modes, redundancy strategies, circuit breakers, graceful degradation, and designing systems that survive failures.

System Maintainability - Building Evolvable Systems

Complete guide to system maintainability covering code quality, documentation, modularity, observability, and designing systems that evolve gracefully over time.

System Scalability - Horizontal and Vertical Scaling

Complete guide to scalability covering horizontal and vertical scaling strategies, stateless architecture, caching, database sharding, and handling massive traffic.

System Reliability - Building Dependable Systems

Complete guide to system reliability covering MTBF (Mean Time Between Failures), MTTR (Mean Time To Recovery), fault tolerance, and building dependable distributed systems.

System Availability - Understanding Uptime and SLAs

Complete guide to system availability covering uptime calculations, SLA requirements, five nines availability, redundancy strategies, and high availability architecture.