Designing Real World Software: The Non Functional Requirements Approach
I completed my Bachelors in Computer Engineering at K. J. Somaiya College of Engineering (https://www.somaiya.edu/kjsce), popularly known as KJSCE, which is one of the few autonomous colleges affiliated to the prestigious University of Mumbai. On the 20th of July, I received a call from the faculty department of my alma mater inviting me to have a session with the graduating class of 2017 for Computer Engineering. These students had just entered into their final year of engineering. As part of their curriculum, they have to design and develop a fully-functional application. Applications can be either hardware-based embedded system applications, websites, web-based applications or mobile applications.
Considering my firsthand experience in the field is on software architecture and design, I was approached to speak with the students on the topic of making their projects real-world worthy.
There are two kinds of design approaches to designing real-world software:
- The Functional Approach
- The Non-Functional Approach
The functional approach answers the question, “How do I build this system?”.
The non-functional approach answers the much more important question, “What is the right way to build this system?”.
What exactly is a Non Functional Requirement?
The boring definition as per Wikipedia is:
“In systems engineering and requirements engineering, a non-functional requirement is a requirement that specifies criteria that can be used to judge the operation of a system, rather than specific behaviours.”
However, the easy way to define an NFR would be:
“An NFR is a requirement which outlines how a system should work, rather than what it should do.”
A big mistake most novice (and in some cases even experienced programmers and/or architects) make when designing applications for the big bad world is the fact that they ignore the NFRs.
What an architect should never forget is that most of the time, it is the NFRs that determine the way functional requirements are to be achieved in software. NFR-focused software design builds a strong foundation for future developers and architects.
There are 5 major Non-Functional Requirements for software architecture:
It’s extremely important to realise that a software design doesn’t just need to work; it needs to work well. Most websites lose a major chunk of their visitors to their competitors just because they aren’t fast enough.
Most software is built by teams of developers, not just one developer alone. Some developers love to show off their skills by writing really complicated code. The problem with this is that the next guy takes twice as long to modify it, which means more billable hours wasted.
3. Scalability & Heterogeneity
This is the most important aspect of software development, yet often the most ignored. When designing software, the most important thing that needs to be kept in mind is that it should work for as much traffic as possible. If the system can’t scale, it limits the revenue that a business can earn.
Product requirements are forever changing, and it’s your job to make sure the system can adapt to the continuously-evolving environment. Make everything configurable and modular so you can easily add a new functionality or seamlessly make changes.
A business owner should be able to sleep peacefully knowing that his system is purring like a kitten. It is integral to the software development process that you ensure your design is sturdy and reliable: this means testing, evaluating, and assessing all components before going to launch – after all, the last thing you want is a bunch of frustrated users…