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 captionsListen 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
- Functional requirements state what a system must do; quality attributes state how well it must do it; constraints are decisions already made, such as regulations, mandated technologies, deadlines and budgets.
- Many architects avoid the term 'non-functional requirements' because it defines a large category by exclusion, suggests the requirements are separate from functions and sounds optional.
- An architecturally significant requirement (ASR) is one whose change would force a change to the system's structure; most ASRs are quality attributes or constraints, but some functions are significant too.
- The same functions can be delivered by very different architectures; it is the quality attributes and constraints that decide between them.
- Implicit requirements, such as never losing orders or never charging twice, are rarely written down and must be actively drawn out from stakeholders, incidents and regulations.
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
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
| Kind | Example | Typical effect on the architecture |
|---|---|---|
| Technical | Must 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. |
| Organisational | Three 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 legal | Personal 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. |
| Time | The 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. |
| Budget | Running 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
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 sale | 4 nights × 60,000 seats = 240,000 tickets |
|---|---|
| Normal arrival rate | 2,000 visitors ÷ 3,600 s ≈ 0.56 visitors per second |
| Sale-day arrival rate | 1,500,000 visitors ÷ 600 s = 2,500 visitors per second, about 4,500 times the normal rate |
| Request rate | If 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 supply | 1,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 constraint | The 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 |
| Constraint | Fixed 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.
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?”