Requirements Engineering
Requirements engineering is the work of finding out what a system must do and how well it must do it, writing that down precisely enough to build and test against, and keeping it accurate as understanding changes. It covers four activities: elicitation (discovering needs), specification (recording them), validation (checking they are the right needs), and management (tracking and changing them deliberately).
It matters because misunderstood requirements are the most expensive defects in software: they survive code review and testing — the code does exactly what someone wrote down — and surface only when users meet the result. Agile teams did not abolish requirements; they made them smaller, more conversational, and closer to tests. The craft of asking the right questions and writing testable answers matters as much as ever.
TL;DR
- Separate the problem (what users need and why) from the solution (what the system does); requirements describe the first and constrain the second.
- Functional requirements say what the system does; nonfunctional requirements (quality attributes) say how well — and are the ones most often left vague.
- Every requirement needs a way to verify it. If you cannot write a test or an acceptance check, it is not finished.
- User stories are placeholders for a conversation; acceptance criteria and concrete examples are where the precision lives.
- Elicit from behavior and data, not just opinions: observation, support tickets, and analytics complement interviews.
- Change is normal; manage it with short feedback loops, traceability for what matters, and explicit decisions about scope.
Quick Example
A user story with acceptance criteria written as executable examples (Gherkin syntax, runnable with Cucumber, Behave, or SpecFlow).
The story names the user and the goal; the scenarios pin down behavior, including the security-relevant negative cases that informal descriptions usually omit.
Core Concepts
Levels of Requirements
Tracing from system requirements back to business goals tells you which requirements are negotiable when time runs short.
Functional Versus Nonfunctional Requirements
Functional requirements describe behavior: inputs, outputs, rules, and states. Nonfunctional requirements — better called quality attributes — describe properties of that behavior: performance, availability, security, accessibility, maintainability, and so on. Quality attributes drive architecture far more than features do, and they are routinely written as unmeasurable adjectives. See Quality Attributes and Nonfunctional Requirements.
User Stories and Acceptance Criteria
A user story — As a [user], I want [capability], so that [benefit] — is a compact way to capture a need and start a conversation. Good stories follow INVEST: Independent, Negotiable, Valuable, Estimable, Small, and Testable. The story alone is not a specification; its acceptance criteria define when it is done, and concrete examples remove ambiguity.
Specification by Example
Instead of abstract rules, specify behavior through representative examples agreed by product, engineering, and testing — the "three amigos". Examples double as acceptance tests (BDD), so the specification cannot silently drift from the implementation.
Verification and Validation
Verification asks "did we build it right?" — does the software meet the requirement? Validation asks "did we build the right thing?" — does the requirement meet the real need? Tests verify; prototypes, demos, and user feedback validate.
Elicitation Techniques
Combine sources: interviews explain the why behind patterns in the data, and data shows whether an interview finding is common. See UX Research for interviewing technique and Product Discovery for testing assumptions.
Specifying Requirements
Choose the Lightest Format That Removes Ambiguity
Write Requirements That Can Fail
A requirement is useful only if a reasonable implementation could fail it. "The search should be fast" cannot fail; "95% of searches over the 2 million product catalog return in under 300 ms" can.
Capture Decisions, Not Just Requirements
When a requirement is rejected, deferred, or changed, record why. Architecture Decision Records do this for technical choices; the same habit for scope decisions prevents the same debate recurring every quarter.
Managing Change
Requirements change because the world changes and because building software teaches people what they actually want. The goal is not to prevent change but to make it visible and deliberate:
- Short iterations keep the cost of change low — less work is built on a wrong assumption.
- A single prioritized backlog makes trade-offs explicit: adding something means something else moves.
- Traceability — linking business goals to requirements to tests — is worth formalizing where it matters (regulated features, security controls, contractual obligations) and overkill elsewhere.
- Scope decisions have owners: someone with authority decides, and the decision is written down.
Best Practices
Ask Why Until You Reach a Goal
A request such as "export to Excel" usually hides a goal — "share weekly numbers with finance". The goal may have better solutions (a scheduled report, a shared dashboard). Asking "why" a few times turns feature requests into needs.
Involve Testers and Engineers Early
Review stories with product, engineering, and testing together before work starts. Engineers spot feasibility and cost; testers spot missing edge cases. Twenty minutes of discussion prevents days of rework.
Specify the Unhappy Paths
Errors, timeouts, empty states, permissions, concurrency, and abuse cases are where most production bugs live. Every story should say what happens when things go wrong.
Keep Requirements Close to the Code
Store executable specifications in the repository and link stories to the changes that implement them. Requirements that live only in a document tool decay out of sync.
Common Mistakes
Vague Adjectives
Solutions Disguised as Requirements
Missing Negative and Edge Cases
Gold Plating
FAQ
What is the difference between functional and nonfunctional requirements?
Functional requirements describe what the system does — for example, sending a password reset link. Nonfunctional requirements describe how well it does it — how fast, how reliably, how securely, how accessibly. Nonfunctional requirements often have the larger influence on architecture and cost.
Are user stories the same as requirements?
A user story is a lightweight placeholder for a requirement and the conversation about it. The precise requirement lives in the acceptance criteria and examples attached to the story. A story without criteria is a reminder, not a specification.
How detailed should requirements be in an Agile team?
Detailed enough that the team can build and test the next increment without guessing, and no more. Work near the top of the backlog should be refined into testable criteria; work further out can stay as one-line ideas until it is likely to be built.
Who should write requirements?
Usually the product owner or product manager leads, but good requirements are written collaboratively: users and stakeholders supply needs, engineers supply feasibility and technical constraints, and testers supply edge cases. Ownership means accountability for the decision, not sole authorship.
How should we handle requirements that keep changing?
Shorten the feedback loop so less is built on each assumption, keep a single prioritized backlog so changes visibly displace other work, and write down scope decisions with their reasons. Frequent change is a signal to invest more in discovery before committing.
Related Topics
- Product Management & Delivery — Where requirements sit between discovery and delivery
- Quality Attributes and Nonfunctional Requirements — Making performance, reliability, and security measurable
- Product Discovery — Validating needs before specifying solutions
- Product Prioritization — Deciding which requirements to build first
- Agile Software Development — Iterative delivery and backlog refinement
- Test-Driven Development — Turning examples into executable tests
- Architecture Decision Records — Recording why decisions were made
- Acceptance Criteria and Traceability — Testable criteria and requirement links
- Agile vs Waterfall — Requirements in agile and plan-driven work