Be Software Architecture Wise
Be Wise Apps

Leer en español · Lire en français · Auf Deutsch lesen

Section 2.1 of 2.8 · Intermediate · 18 min read

Functional requirements, quality attributes and constraints

Video lesson

5 min · narrated, with captions
Listen only (audio)
Read the transcript

This lesson is about the three kinds of requirement every system has. By the end, you'll be able to spot the small number of requirements that really decide a design.

Think of ordering a wedding cake. Three tiers, lemon sponge, white icing. That describes what the cake is: its functions. Ready by two in the afternoon on Saturday, able to survive a forty minute drive, safe for a guest with a nut allergy. That describes how well it must work: its qualities. And the venue only allows cakes from approved bakers. That's a constraint, a choice already made for you. It's the qualities and constraints, not the flavour, that decide how the cake is built and transported. Software is the same.

In software, a functional requirement says what the system must do. For example, a customer can add an item to the basket. A quality attribute says how well it must do it. Search results appear within half a second. Quality attributes only make sense with a measure attached: fast enough for whom, under what load, measured how? A constraint is a decision already made: a regulation, a mandated technology, a deadline or a budget. Constraints remove options.

You'll often see the term non-functional requirements. You need to recognise it, but many architects avoid it, for three reasons. First, it defines a large and important category by what it is not. Second, it suggests these requirements are separate from functions and can be added later. They can't. It's the checkout that must be fast, and the payment that must never be lost. Third, non-functional sounds optional. Yet systems that work but are slow, insecure or impossible to change are exactly the ones that get rewritten. This course says quality attributes and constraints instead.

Most requirements don't affect the architecture at all. This diagram shows how to tell the ones that do. All three kinds of requirement, functions, qualities and constraints, feed in from the left. For each one, ask a single question: if this requirement changed, would the structure of the system have to change? If yes, it's an architecturally significant requirement, or ASR, and it drives architecture decisions. Most are qualities or constraints. If no, it belongs to detailed design and code, and it can be changed in an afternoon.

Here is the central idea of this chapter. Two ticketing systems have identical features: browse events, hold seats, pay. A three hundred seat village hall sees a few requests a second at its busiest. One web application and one database is the right answer: cheap, simple and easy to change. A sixty thousand seat stadium tour must absorb a burst thousands of times larger. So it needs a content delivery network, a virtual waiting room, many web instances and a payment queue. And because it must never sell the same seat twice, it needs a carefully designed seat inventory on partitioned storage. Same functions, completely different architectures.

Let's work through a real sale. A ticketing company sells four nights at a sixty thousand seat stadium. That's two hundred and forty thousand tickets. Marketing expects one and a half million people in the first ten minutes. That's two thousand five hundred arrivals a second, about four thousand five hundred times the normal rate. If each browser makes about eight requests in the first minute, the site faces twenty thousand requests per second. The payment provider allows three hundred authorisations a second. At two and a half tickets per order, that's ninety six thousand orders, which takes at least three hundred and twenty seconds, or five point three minutes. So the system must hold seats and queue payments. That gives five architecturally significant requirements: peak load, no seat sold twice, fairness through a waiting room, bot resistance and graceful degradation. Not one of them appears in the feature list.

Some of the most important qualities are never written down, because everyone assumes them. Do not lose orders. Do not charge the customer twice. These implicit requirements surface only when they're broken, usually in production. To draw them out, ask stakeholders what would make them furious, or what would put the company in the newspaper. Two common mistakes to avoid. Writing qualities without measures: highly available can't be designed for or tested. And assuming quality can be added after the features are built. Performance, security and availability depend on structure, and they're expensive to retrofit.

The full section has the kinds of constraint, a checklist for spotting significant requirements and the whole ticketing example. Next, in Section two point two, we look at quality models, and how to use them as a checklist. See you there.

What you need to know

Three kinds of requirement

A requirement is anything a system must satisfy to be acceptable to its stakeholders. Architects find it useful to sort requirements into three kinds, because each kind influences the design in a different way. A functional requirement says what the system must do: 'a customer can add an item to the basket', 'the pharmacy system checks every new prescription against the patient's allergies', 'a rider can see the driver's position on a map'. Functional requirements describe behaviour, data and the rules that connect them. They are what most user stories and use cases capture.

A quality attribute says how well the system must do it. 'Search results appear within half a second', 'the booking service is available 99.95% of the time', 'a new payment provider can be added in under two weeks', 'patient records are readable only by clinicians treating that patient'. Quality attributes are properties of the system as a whole or of a function, and they only make sense with a measure attached: fast enough for whom, under what load, measured how?

A constraint is a decision that has already been made for you. 'The system must run in the company's existing Azure tenancy', 'all personal data stays in the European Union', 'the team knows Java and has no budget to retrain', 'the first release must be live before the tax year starts on 6 April'. Constraints remove options rather than describe behaviour. They are not negotiable within the project, although a good architect checks that each one really is a constraint and not just a habit or an assumption.

The boundaries are not always crisp, and that is fine. The point of the classification is not bureaucratic tidiness; it is to make sure that nobody collects fifty user stories and forgets to ask how many users there will be, how long the business can survive an outage, or which regulator is watching.

How requirements reach the architecture

Three kinds of requirement pass through a significance filter: significant ones become architecture decisions, the rest go to detailed designFunctionalrequirementswhat it must doQualityattributeshow well it must do itConstraintschoices already madeDoes it changethe structureif it changes?yes: ASRnoArchitecturedecisionsDetailed designand code
All three kinds of requirement feed the architecture, but only those whose change would force a structural change are architecturally significant.

Why many architects avoid the term 'non-functional requirements'

Requirements documents traditionally split everything into functional and non-functional requirements (NFRs). The term is everywhere, in contracts, tender documents and job adverts, so you need to recognise it. Many architects and researchers nevertheless avoid it, for three reasons.

First, it defines a large and important category by what it is not. Anything that is not a function lands in the same bin: response times, encryption rules, the choice of cloud provider and the colour of the logo. Martin Glinz's paper On Non-Functional Requirements (IEEE International Requirements Engineering Conference, 2007) showed that published definitions disagree on what belongs in the category and that the same need can be classed either way depending on how it is phrased: 'only authorised staff may see salaries' reads as a function when written as an access rule and as a quality when written as a security goal.

Second, the name suggests these requirements are separate from functions and can be added later. They cannot. A quality attribute qualifies a function: it is the checkout that must be fast, the payment that must never be lost, the medical record that must be confidential. Bass, Clements and Kazman, in Software Architecture in Practice, therefore speak of quality attribute requirements and treat constraints as a separate category.

Third, 'non-functional' sounds optional, as if a system that works but is slow, insecure or impossible to change still 'functions'. In practice those are exactly the systems that get rewritten. Some teams prefer 'quality requirements'; others, notably at Thoughtworks, say 'cross-functional requirements' to stress that they cut across every feature. This course uses quality attributes and constraints. If your organisation says NFRs, there is no need to fight about the word; just make sure every NFR is either a measurable quality or a clearly stated constraint.

Constraints: technical, organisational, regulatory, time and budget

Constraints deserve more attention than they usually get, because they often decide more of the architecture than any feature. A constraint is simply a requirement with no remaining freedom. It helps to group them by where they come from.

Kinds of constraint and their architectural effect

KindExampleTypical effect on the architecture
TechnicalMust integrate with the existing SAP finance system through its published interfaces; must run on the company's Kubernetes platform.Fixes integration styles, data formats and deployment model; may rule out some databases or languages.
OrganisationalThree teams in two time zones; the operations team supports only PostgreSQL; the security team must approve every external dependency.Shapes how the system is divided (Conway's law, Chapter 3) and which technologies are realistic.
Regulatory and legalPersonal data of EU residents is processed under the GDPR; card data falls under PCI DSS; a medical device must meet safety regulations.Drives data location, encryption, audit logging, retention rules and the separation of sensitive components.
TimeThe new tax rules apply from a fixed date; a retail platform must be ready before the November peak.Favours proven technology and simpler designs; may force a phased release with known technical debt.
BudgetRunning costs must stay below a fixed sum per month; no money for commercial licences.Limits redundancy, regions and managed services; makes cost per transaction an explicit quality.

Two habits help. First, write down the source of every constraint (a regulation, a contract, a named decision-maker) so that it can be checked and, if circumstances change, revisited. Second, distinguish real constraints from preferences dressed up as constraints. 'We must use microservices' is rarely a constraint; it is a design decision someone made early, and it should be justified by quality attributes like any other decision. Chapter 1's section on decisions and trade-offs explains why early, hard-to-reverse choices deserve that scrutiny.

Architecturally significant requirements

Most requirements do not affect the architecture. Whether the invoice shows the customer's postcode above or below the street name is a detail; it can be changed in an afternoon. An architecturally significant requirement (ASR) is one that has a measurable effect on the architecture: if it changed, the structure of the system would have to change. Recognising ASRs early matters because they are expensive to accommodate late. Adding a waiting room to a ticketing site the week before a sale is possible; partitioning the seat inventory across servers after launch is a rewrite.

Lianping Chen, Muhammad Ali Babar and Bashar Nuseibeh interviewed practitioners about how they recognise ASRs (Characterizing Architecturally Significant Requirements, IEEE Software, 2013). Their findings match most architects' experience. ASRs tend to be hard to satisfy, they often concern the system as a whole rather than one feature, they frequently conflict with each other, and they are often stated vaguely or not at all. Quality attributes and constraints make up the majority, but some functional requirements are significant too.

Examples of functional ASRs: 'every change to a patient record must be traceable to a person and a time' (it needs an audit mechanism across all components), 'users can collaborate on the same document in real time' (it demands a synchronisation model and probably a different communication style), and 'customers can undo a bank transfer within 30 minutes' (it affects how money moves between accounts). Each forces a structural decision, not just more code.

Why qualities shape architecture more than functions do

Here is the central idea of this chapter. If functionality were all that mattered, almost any structure would do: you could write the whole system as one large program and it would still compute the right answers. Bass, Clements and Kazman make this point directly: functionality does not determine architecture, because many different architectures can deliver the same functions. What separates them is how well each one achieves the qualities.

Consider two ticketing systems with identical features: browse events, hold seats, pay. One sells tickets for a 300-seat village hall; the other sells a 60,000-seat stadium tour. The village hall's busiest moment might bring a few requests per second, and a single web application with one database is the right answer: cheap, simple and easy to change. The stadium tour must absorb a burst thousands of times larger, must never sell the same seat twice, and must keep bots from buying everything in the first second. That system needs a content delivery network, a queue in front of the shop, a carefully designed seat inventory, partitioned storage and a payment flow that can wait for an overloaded provider. Same functions, completely different architectures, and the difference comes entirely from quality attributes and constraints.

Same functions, different qualities

The same three ticketing functions delivered by a small single-server design and by a large design with a waiting room, cache and separate inventory and payment servicesBrowse, hold seats, pay300-seat village hallOne web applicationOne databasepeak: a few requests a secondone cheap server60,000-seat stadium tourCDN and page cacheVirtual waiting roomMany web instancesSeat inventoryPayment queuePartitioned storepeak: tens of thousands of requests a second
Identical features can lead to radically different structures when the load, consistency and security requirements differ.

Implicit qualities nobody writes down

Some of the most important qualities are never stated because every stakeholder assumes them. These implicit requirements surface only when they are violated, usually in production. Nobody writes 'do not lose orders', 'do not charge the customer twice', 'keep working when the clocks go forward', 'show the same balance on the phone and the website', or 'do not leak one customer's data to another'. Yet each of these is an ASR with heavy consequences: idempotent payment handling, durable writes, time-zone-safe scheduling, consistency between channels and strict tenant isolation.

Implicit requirements hide for social reasons. Business stakeholders think they are too obvious to mention; developers assume someone else has handled them; and requirement templates rarely prompt for them. Useful questions to flush them out are: 'What would make you furious if it happened?', 'What would put us in the newspaper?', 'What has gone wrong with the system we are replacing?', and 'What does the operations team get woken up for?'. Incident reports and support tickets of predecessor systems are a rich source; so are regulators' published guidance and the obligations in customer contracts.

Worked example

Worked example: a concert-ticketing system on sale day

A ticketing company will sell a four-night stadium run (60,000 seats a night) at 10:00 on a Friday. On a normal day the site sees about 2,000 visitors an hour. Marketing expects 1.5 million people to arrive in the first ten minutes. The features are the usual ones: browse, choose seats, hold them for ten minutes, pay. What are the architecturally significant requirements?

Tickets on sale4 nights × 60,000 seats = 240,000 tickets
Normal arrival rate2,000 visitors ÷ 3,600 s ≈ 0.56 visitors per second
Sale-day arrival rate1,500,000 visitors ÷ 600 s = 2,500 visitors per second, about 4,500 times the normal rate
Request rateIf each visitor's browser makes about 8 requests to the site in the first minute (pages, seat maps, API calls): 2,500 × 8 = 20,000 requests per second
Demand versus supply1,500,000 visitors for 240,000 tickets: most people will be disappointed whatever the design, so fairness and clear communication matter as much as speed
Payment constraintThe payment provider's contract allows 300 payment authorisations per second. With an average of 2.5 tickets per order, 240,000 ÷ 2.5 = 96,000 orders; 96,000 ÷ 300 = 320 s, so payments alone take at least 5.3 minutes even if everything else is instant
ASR 1: peak load (performance)Absorb 2,500 arrivals a second without collapsing; serve static pages and seat maps from a cache or CDN so only real purchases reach the core
ASR 2: no seat sold twice (consistency)Seat holds must be atomic even when thousands of people click the same block at once; this shapes the inventory design and its storage
ASR 3: fairness (business rule with structural impact)Admit buyers in arrival order through a virtual waiting room, so the core system sees a controlled flow rather than a stampede
ASR 4: bot resistance (security)Detect and block automated buyers before they reach the inventory; rate-limit per account and per device
ASR 5: graceful degradation (availability)If payments slow down, keep holds valid and queue payment attempts rather than failing whole orders
ConstraintFixed date and time announced in advance; payment provider limit of 300 per second

None of these ASRs appears in the feature list. All of them come from load, consistency, fairness, security and a third-party constraint.

The payment limit converts directly into a design decision: since buyers cannot all pay at once, the system must hold seats and queue payments, which in turn sets the hold time.

The real world offers a reminder. In November 2022 Ticketmaster's presale for a major stadium tour suffered long delays and failures under demand; the company reported 3.5 billion total system requests, four times its previous peak.

Checklist: spotting architecturally significant requirements

Run through these questions for each candidate requirement, and for the system as a whole, early in a project.

  • Would changing it change the structure?If doubling the number, relaxing the rule or removing the requirement would move components, data or communication paths, it is significant.
  • Does it apply across many features?Requirements that cut across the whole system (audit, security, availability, internationalisation) usually need a structural answer.
  • Is it hard or new?A demanding number (sub-100 ms, 99.99%), a load far above anything the team has handled, or a first-of-its-kind feature is a strong signal.
  • Does it carry high business value or risk?If failing it would lose revenue, break the law or harm someone, treat it as significant even if it looks simple.
  • Does it conflict with another quality?Requirements in tension (fast and strongly consistent, open and secure) need deliberate trade-offs, which are architectural decisions.
  • Is it a constraint in disguise?Fixed technologies, regulations, deadlines and budgets remove options; record them with their source.
  • Has it hurt before?Look at incidents, support tickets and post-mortems of the system being replaced, and of similar systems elsewhere.
  • Is anyone assuming it silently?Ask what would make stakeholders furious or put the company in the news; those answers reveal implicit requirements.

How professionals work with ASRs

Experienced architects keep a short, living list of ASRs, typically five to fifteen items, rather than a long requirements document. Each item states the quality as a testable scenario (Section 2.3), names the stakeholder who cares, records its priority and links to the decisions it drove. The arc42 template, for example, asks for the top three to five quality goals on its first page and a fuller list of quality requirements later. The list is revisited whenever a big decision is made or the business changes direction, and the most important items are eventually backed by automated checks called fitness functions, introduced in Section 2.8.

Check your understanding

Is 'patients can book appointments online' a functional requirement, a quality attribute or a constraint?

A functional requirement: it says what the system must do. A quality would add how well, for example how quickly bookings are confirmed or how many can be handled at 8am on a Monday.

Why is 'the system must be scalable' not yet a useful requirement?

It has no stimulus, context or measure. It does not say how much load, how quickly the load grows, or what response must be preserved, so nobody can design for it or test it.

Give one example of a functional requirement that is architecturally significant.

For instance, a full audit trail of every change to medical records, or real-time collaborative editing. Each needs a structural mechanism across the system, not just more code in one place.

What question best separates a significant requirement from an ordinary one?

Would the structure of the system have to change if this requirement changed? If yes, it is architecturally significant.

Next · 2.2Quality modelsThe ISO/IEC 25010:2023 product quality model and its nine characteristics, what changed since 2011, other lists such as FURPS+, and how to use a model as a checklist without drowning in paperwork.Continue →

Sources and further reading

Have a question about this section? ArchitectBot, the course’s AI study assistant, answers from the course first.

Ask: “How do I tell whether a requirement on my project is architecturally significant or just a detail for the developers?”