Software Development for Product Integration
Defining Technical Requirements
From Vision to Blueprint
Every great piece of software starts as an idea. But to build it, you need a blueprint. This blueprint is a set of technical requirements that translate a product vision into something engineers can actually create. Not all requirements are created equal, however. Some have a far greater impact on the fundamental structure of your system.
These are called Architecturally Significant Requirements (ASRs). They are the requirements that, if changed, would cause a significant ripple effect across the system's design. Think of them as the load-bearing walls of your software. You can repaint a room easily, but moving a load-bearing wall requires a major overhaul. Identifying ASRs early is crucial because they dictate the core architectural decisions you'll make.
For example, a requirement to process one million transactions per second is an ASR. It fundamentally shapes database choices, server infrastructure, and how data flows. A requirement to change the color of a button is not.
To find your ASRs, you must first separate what the system needs to do from how it needs to do it.
What vs. How
Technical requirements fall into two broad categories: functional and non-functional. It's a simple distinction with profound consequences for your architecture.
Functional requirements define what the system does. They are the features and capabilities a user interacts with. Think of them as the verbs of your application: users must be able to upload a photo, create a playlist, or purchase an item. These are often captured in user stories or use cases, mapping a user's journey to specific system behaviors.
Non-functional requirements (NFRs), also called quality attributes, define how the system performs. They are the system's characteristics and constraints, such as its speed, reliability, and security. They don't provide a feature, but they ensure the features work well. An NFR is the difference between a video streaming service that plays instantly and one that buffers constantly.
| Requirement Type | Description | Example |
|---|---|---|
| Functional | Specifies what the system should do. | A user must be able to log in with an email and password. |
| Non-Functional | Specifies how the system should be. | The login process must complete in under 500 milliseconds. |
While users might explicitly ask for functional requirements, they often assume the non-functional ones. No one asks for a slow or insecure app. Ignoring NFRs is a common path to building a product that technically works but fails to satisfy users.
Prioritizing What Matters
Once you have a list of requirements, you can't build everything at once. You need to prioritize. This is especially true for a new product, where speed to market is key. A powerful framework for this is the
It categorizes features into four buckets:
- Must-have: These are non-negotiable for the initial release. The system is a failure without them. For a ride-sharing app, this would be requesting a ride and processing a payment.
- Should-have: Important, but not vital for the first release. The system will work without them, but they might be painful to omit. This could be scheduling a ride in advance.
- Could-have: Desirable but less important. These are often the first to be cut if time is tight. Think of adding a feature to split a fare with friends.
- Won't-have (this time): These are explicitly out of scope for the current release. This helps manage expectations. This could be a loyalty points program.
Using MoSCoW helps you define your Minimum Viable Product (MVP) and ensures your architecture is built to support the most critical user journeys from day one.
Defining System Qualities
The most important ASRs are often non-functional. Let's look at three of the most common quality attributes that shape an architecture.
Performance: This measures how quickly the system responds to a request. It's often defined by latency, the time it takes for a single transaction. For example, search results must appear in under 200ms. Poor performance directly frustrates users.
Scalability: This is the system's ability to handle a growing amount of work. If your user base doubles, can your system handle the load without degrading performance? Scalability can mean adding more servers (horizontal scaling) or upgrading existing ones (vertical scaling).
This refers to the proportion of time the system is operational and accessible. It's often expressed as a percentage, like "99.9% uptime." High availability is critical for services that people rely on, like e-commerce or banking, and often requires redundant components and failover mechanisms to achieve.
Defining these attributes with specific, measurable targets transforms them from vague goals into concrete requirements. "The system must be fast" is an aspiration. "95% of API requests must be served in under 150ms" is a requirement you can design for and test against.
What is the primary characteristic of an Architecturally Significant Requirement (ASR)?
A requirement stating that "users must be able to upload a profile photo" is an example of what kind of requirement?
By clearly defining and prioritizing your technical requirements, you create a stable foundation. This clarity allows you to make deliberate, informed trade-offs as you design and build your system.