I'm going to rely upon the SWEBOK (Software Engineering Book Of Knowledge) to guide my answer.
In the Software Requirements* chapter, we're provided with more formal definitions of the terms needed for your question.
Functional requirements describe the functions that the software is to execute; for example, formatting some text or modulating a signal. They are sometimes known as capabilities.
Nonfunctional requirements are the ones that act to constrain the solution. Nonfunctional requirements are sometimes known as constraints or quality requirements.
I point those out because there appears to be some overlap in the way you have been requested to generate your document. You stated: A SRS should only have functional, non functional and constraints
and based upon the SWEBOK / IEEE definition you can see that non-functional requirements and constraints are one and the same.
And while some may protest of overkill, there are three main documents related to requirements work.
System Definition Document This document (sometimes known as the user requirements document or concept of operations) records the system requirements. It defines the high-level system requirements from the domain perspective.
System Requirements Specification In this view, system requirements are specified, the software requirements are derived from the system requirements, and then the requirements for the software components are specified.
Software Requirements Specification establishes the basis for agreement between customers and contractors or suppliers (in market-driven projects, these roles may be played by the marketing and development divisions) on what the software product is to do as well as what it is not expected to do.
So the problem with all of that is it appears clear cut when explained, but it ends up being muddy when implemented. To help focus my answer, I'm going to ignore the System Reqs Spec as it's a huge topic and not quite necessary for your question.
The primary challenge you're encountering is that you are mixing your SDD and your SoftRS (software) documents. Since the two documents are communication bridges between three camps, it's natural and unavoidable that you'll see some overlap between the two. The SDD is a bridge between the client and the analysts, whereas the SRS is a bridge between the analysts and the developers.
So how do you draw the line between the SDD and the SRS? Let's go back to the System's Engineering trinity:
And they really should go in that order because when we look at the V-model, we use those three in order to work our way through the layers. You start with the what
& why
at the system layer. As you capture those, you start generating ideas for the how
, which goes into the next layer below in the V-Model. "Eventually" you finish up with a particular layer and you start revising the layer below in the same manner. The difference on the lower layers is that the upper layer's how
becomes this layer's what
.
Blah, blah, wall of text, let's tackle your questions.
FR 1.1 : Have I incorporated a design idea here, would " the system shall have a registration form" be a better functional requirement?
I'm going to start off with "meh" for an answer. "shall display" vs "shall have" on a form that requires user interaction is kind of pointless. If an argument erupted on a real project over the semantics between those two forms, I'd consider that a huge red flag and try to bail on the project. Seriously.
"Shall display" implies "have" whereas "shall have" implies "display" in this case. To be fully pedantic, you would need at least "shall have and display" to make it clear. Any of those three variants is fine though.
F1.2 ,2.3 : Is this not singular? Would the conditions be better written for each its own separate requirement
They are certainly related, and it gets tricky on how you want to express those. I rely upon team norms in this case as I have seen it go either way with equivalent results. The important part is to be consistent in how you handle compound requirements like this.
FR 1.4: Is this a design idea? Is this a correct functional requirement or have I incorporated non functional(performance) in it? Would it be better if I written it like this:
FR1 The system shall display an error message when check is unsuccessful.
NFR: The system will respond to unsuccesful registration form checks within 1 seconds. Same question with FR 2.8 and 2.9.
I would probably break these out, yes. Here's why: The first is providing function (display error message) while the second provides the constraints (specific amount of time) in providing that function. Constraints often change, but the functionality doesn't. By moving the constraint to its own requirement, we can get up front agreement on the functionality and then deal with the constraints (how fast was the message delivered) when we get into implementation.
FR2.3: The system shall check for "completeness", is completeness here used ambigiously? Should I rephrase it?
Your close to explaining completeness with the list of items you provide. However, you could be more clear in specifying what determines completeness or not in each of the items you listed.
FR1.2: I added that the system shall require a "Captcha code" is this a functional requirement or does it belong to the "security aspect" of a non functional requirement.
Depends upon what level of your design you are talking about. At a high level, it's a non-functional requirement because it's a constraint. At a low level, it's a functional requirement because it's specifying a function to be provided.
* SWEBOK is currently in a review state for the next release. Except for the main link, some of the additional links may go stale.
Relationship between requirements and modules
The relation between requirements and modules is in general not obvious, so that you'll always end up with many-to-many:
- it is very rare that one module implements one single requirement. Usually a module implements several related requirements.
- there are often some general requirements (e.g. non-functional security requirements, or user-interface requirements such as for example the availability of a help button) that are supposed to be implemented in many if not all of the modules.
Therefore, having a highly interconnected schema doesn't necessarily mean that the requirements are flawed. It can also suggest that you're dealing with a complex system. Or that you have identified many general requirements.
How to simplify the picture ?
A first step for mastering the complexity is to decide what you want to represent:
- do you try to represent how the requirements are implemented in the system ? In this case, you can reduce the links you'll show in the diagram, by limiting the links to "is implemented in" relations. So if a general requirement is implemented in a utility module that provides the functionality to the other module, you would have only one link.
- do you want to show how modules comply with requirements from the user perspective ? In this case you can't avoid links of type "is offered to the user by", which will multiply the links.
Another approach is to envisage categories of requirements. For example:
- general requirements non functional (expected in all modules)
- use case requirements (transactional requirements, related to specific business functions: these would be expected in one module)
- utility requirements (includes or extents, used in several different use cases: you'd expect these either in a utility module or in several modules)
- user-interface requirements (expected in modules interacting with user interface modules)
How to use this this diagram to improve your system ?
So in general, high interconnections doesn't mean flawed requirements.
However, some fundamental theory on systems, like for example Herbert's Simon's "Science of the artificial", suggest that in an optimal structured system, one would expect more interrelation within a subsystem than between subsystems.
Therefore, if you draw only "is implemented in" links, and remove all the general requirements (or better, take only the use-case transactional requirements), then you should come more to a situation like the diagram to the left.
With such a simplified/filtered diagram, a high interconnection might suggest that either the use-cases requirements are flawed (still too general, or too ambiguous). Or that the grouping into modules was not ideally thought.
Best Answer
Explicitly separating requirements will make it easier to design the right system.
With nonfunctional requirements (I prefer the concept/term quality attributes - should provide new insights beyond functional vs. not functional), you are more concerned with the properties of the software rather than the functionality. That is how the system performs some function, not simply what the system does. Quality requirements have a significant influence on the architecture of the system in ways that the functional requirements do not and for this reason they should be treated differently.
Keeping the quality attributes separate from functional requirements allows you to analyze, specify, and prioritize different kinds of requirements in different ways. For example, quality attributes are normally specified using a quality attribute scenario while functional requirements might take the form of stories, use cases, shall statements, or any other number of formats. Most of the systems I've worked on had less than a dozen quality attributes and many, many more functional requirements.
I would actually introduce another kind of requirements - technical constraints. Again, explicitly separating the requirements into these three buckets gives you cues for how to make the right trade-offs while building the system. Functional requirements are often quite negotiable, quality attributes will heavily influence your architecture and the structures you choose, technical constraints are non-negotiable.
If this were my team, I would tell them the requirements should be clearly annotated by type to make sure we don't miss something important in the architecture. Think about the architectural drivers, not just the functionality.
Anthony Lattanze in Architecting Software Intensive Systems: A Practitioners Guide gives a practical overview of architectural drivers and why they should be treated differently, much more comprehensive than my summary here.