According to the study report by Rick Kazman and Len Bass using an example of utility tree they have tried explaining the business goals appearing at the upper levels and quality attribute scenarios derive directly from business goals.
Example. Lets say social network, this system technically it can be built within one huge single C++ file that is compiled into one huge single art effect.
Will this system be functionally be complete?
It might be… But will this system be maintainable?
Oh no it will be totally impossible to do something with this code…
Will you be able to find new developer somewhere in the market to work on that code?
Well no not at all….
So you see the system that is functionally complete will be so far away from the system that you wanted to receive right?
So the quality attributes are how our system should behave and how you should develop it?
This is what defines the choice of the technology as you see.
And usually at this point someone jumps in and says that Nodejs is so amazing…
I have heard about it asynchronous I/O and saw the benchmarks that Nodejs is like 70 times more performance than Java so lets all use Nodejs.
Well Nodejs is a great technology I like it but you need to stop thinking about performance.
So you are saying you need performance… you want your system to be fast thats great.
And my next question is what exactly is fast for you? Can you define fast? Is it like 50 secs, 100 msecs, 1000 msecs fast?
What are you building?
Are you building a system that will look out into the internet or you’re building an alto trading application that is resource intensive and needs to calculate each and every microsecond?
Most of the people are building things for internet and then I say you know what the perceived performance of your system will be dominated by the network conditions so your mobile operator will define more about the performance of your system than your backend technology.
And even in the perfect network conditions;
Your database will most likely be the bottleneck so you will need to think about optimising the data structure may be adding some cache if you want to really optimise the performance.
And in the most case after this type of a discussion turns out that performance is not a critical attribute at all and most of the frameworks, most of the backend technologies will satisfy the performance requirements for a particular system.
But than if the performance is not an issue what are the others?
No matter which technology you choose? Will it be Java, Nodejs, Python, C++, C# – whatever you’re making a compromise to trade one attribute over other quality attributes and thats exactly how you approach this decision.
So you stop from writing down the quality attributes of the system that you want to receive.
If you say I want performance don’t forget you can just write I want fast and be as specific as possible so write down I want my system to answer within 100 msecs to the 90% of the requests. Other 10% of requests I am okay to answer within 1.5 secs.
If you are talking about this aspects don’t forget things like
The volumes of data that you are dealing with, the amount of the concurrent users that are connected to be as specific as you can one defining those right? And than talk about the other quality attributes.