What is software architecture? What is the role of a software architect? How do you define software architecture? How do you share software architecture? How do you deliver software architecture?

Defining the non-functional requirements

Sometimes you just have to put a stake in the ground

First a quote from a recent comment.

The architect might not be responsible for defining the non-functional requirements, but they're definitely responsible for fulfilling them.

I agree, typically the architect will fulfil the requirements rather than define them, although sometimes you need to define them too.

I've been burnt by non-functional requirements before, either because they've been ambiguously defined (e.g. "the system must be fast") or because they simply haven't been defined. Both are fairly common occurrences. When specifying a software system, it's much easier to think about exactly what it should do. The features of a system are tangible and, ultimately, demonstrable. The non-functional qualities, on the other hand, are much harder to define and people often have problems quantifying them. If somebody says, "the web application must be fast", how fast is that? Do you want response times of less than a second or less than a minute?

As an architect, I've learnt the hard way that you must try to quantify the non-functional qualities. If somebody says, "the web application must be fast", you need to ask them exactly how fast it should be. Get specific, ask about response times for key use cases and how many concurrent users this applies to.

More often than not you'll be able to ask the right questions and use your exploratory skills to figure out what the non-functional requirements are. When this isn't the case, sometimes you just have to put a stake in the ground and define the requirements yourself. This either results in a general agreement or it forces people to think through it further and provide the numbers you are looking for. The non-functional requirements need to be defined and somebody has to do it.



Re: Defining the non-functional requirements

A question I tend to ask a lot is "why?" Why does the web application need to respond to 99% of requests in under 2.4 seconds? I've experienced a tendency to equate specificity with importance.

Without knowing the potential consequence of failing to fulfill an NFR it's hard to balance it against other forces on the system.

Re: Defining the non-functional requirements

Very good point. It's amazing how people will back down from needing a fully available, 24x7 system when you mention they'll need more than a single server!

Re: Defining the non-functional requirements

First off, I think quality attributes is a better name than "non-functional" reuqirements - since what we really want is functionality to exhibit these attributes where needed. There is a technique called Utility trees" which is part of an architecture evaluation process called ATAM. which promotes drafting quality attributes as scenarios within the system. I think this is even more useful if you do that when you think about the design. This allows you to see where the real value from the quality attributes will be in the system as well as provides you with a nice way to prioritize and decide on the tradeoffs between the different quality attributes (such as the cost tradeoff mentioned in the comment above) Arnon

Re: Defining the non-functional requirements

Hi Simon, I’ve just come across your site and am really enjoying your posts. I totally agree that defining non-functional requirements is very important. Sometimes it can be difficult to decide how best to quantify non-functionals and one technique that I have found useful is Distributed Landing Zones which I have described in a recent blog post. Keep up the good work!

Re: Defining the non-functional requirements

Thanks! Your post is interesting too and I think it's a great idea. I'm actually doing some performance testing at the moment and we've had to adopt this type of approach because it quickly became clear that it's nearly impossible to get 100% of the requests (in our case) responding in less than X milliseconds. In a similar way to what you write about, we're basically saying things like "the 99th percentile will be less than X milliseconds". You're right, this can get tricky and you can put a massive amount of effort into making absolute guarantees when, in reality, they probably aren't required. You've just got to be pragmatic.

Add a comment Send a TrackBack
Software architecture for developers