Thinking

Non-Functional Requirements

Most systems do not fail because they do the wrong thing.

They fail because they do the right thing too slowly, too unreliably, too insecurely or at too high a cost.

That is the world of non-functional requirements, often shortened to NFRs. And in my experience, it is where many of the most expensive production problems are quietly born.

What Are Non-Functional Requirements?

Functional requirements describe what a system does. "The customer can view their order history."

Non-functional requirements describe how well it does it. "Order history loads within two seconds for 95 percent of customers, is available 99.9 percent of the time, and only shows a customer their own orders."

Same feature. Completely different engineering challenge.

Grid of the main non-functional requirement categories including performance, availability, scalability, security, maintainability, observability, usability and cost
The main categories of non-functional requirements

Why They Get Ignored

NFRs rarely appear in a user story. Business stakeholders assume they are obvious. Delivery teams assume someone else will define them. And testing them properly takes time that projects under pressure do not want to spend.

So they get skipped until the first production incident, when suddenly everyone cares a great deal.

"We will deal with performance later" is one of the most expensive sentences in technology.

The Categories That Matter Most

Performance

How fast does the system respond, and how much load can it handle? Always define performance under a specific load, not in isolation.

Availability and recovery

How much downtime is acceptable? If something fails, how quickly must the service be restored (recovery time objective) and how much data can be lost (recovery point objective)? These numbers drive architecture and cost dramatically.

Scalability

How will the system cope with growth in users, data and transactions over the next few years? Designing for ten times today's volume is very different from designing for a hundred times.

Security and compliance

Who can access what? What data is sensitive? Which regulations apply? Security requirements need to be designed in from the start, because retrofitting them is painful.

Maintainability

How easily can the system be changed? This affects every future project, even though it rarely appears in the business case.

Observability

When something goes wrong at 2 a.m., can the team see what is happening? Logs, metrics, tracing and alerting should be requirements, not extras.

Cost

What is acceptable to build, run and change the system? In the cloud era, a design choice can quietly double the monthly bill.

Make Them Measurable

"The system must be fast" is a wish, not a requirement.

A good NFR is specific and testable:

If you cannot test it, you cannot prove you met it.

They Pull Against Each Other

Here is the part that makes NFRs genuinely interesting for architects: they conflict.

Higher availability costs more. Stronger security can reduce usability. Maximum performance can hurt maintainability. You cannot maximize all of them at once.

The architect's job is to help the business choose the right balance for this particular system, and to make those trade-offs visible rather than accidental.

How I Approach NFRs on a Project

  1. Raise them in the first week, not the last month.
  2. Use a short checklist of categories so nothing is forgotten.
  3. Ask the business for real numbers, and offer examples if they struggle.
  4. Tie the most important NFRs to specific design decisions.
  5. Make sure they are tested, especially performance and failover.
  6. Monitor them in production, because that is where they really matter.

Final Thought

Users rarely notice when non-functional requirements are met. They notice immediately when they are not.

Treat them as first-class requirements, and your systems will be the ones nobody has to talk about in the incident review.