In previous posts (here  and here) it seems I downplayed the importance of functional requirements (vs. quality attributes) on the architecture. Nevertheless the functional requirements do have few  important roles in shaping/looking at  the architecture. One aspect of the functional requirements role was demonstrated in the scenarios that describe the instantiation of quality attributes within the system. Lets look at a couple of other aspects.

 

As I mentioned in a previous post no single structure is the architecture - this means that in order to present an architecture it is needed to describe it from several different angles or viewpoints (I'll spend some time taking about these in the next few posts on SAF). One of these has to do with the domain architecture for the solution. This can include identifying business areas trying to identify services (in an SOA), identifying major components for a component based architecture, or even identifying major use cases in a "use case view" (as part of a Unified Process 4+1 approach )

 

Listening to "Almost Cut My Hair" by Crosby, Stills & Nash, in the background kinds of brings me to the 3rd area where  I see functional requirements meets architectural decisions. When there are extreme/hard/important requirements there are many times where you have to decide whether to cut your hair and  bend the entire design to answer that requirement (i.e. make that a global decision - hence an architectural one) or satisfy it by a specialized local solution (i.e.  Postpone it to the design phase). For example, I once worked on a system where we identified one area of the solution that needs a (relatively) high update rate (low latency, high throughput for updates coming from an external system, processing it within the system and  all the way to the user's workstation window). While this was both predicted to be frequently used and an essential requirement for the success of the system the majority of the system's functionality did not have these characteristics. The decision I've made was to treat it as a local issue (to be given a specific solution @ design time). (Unfortunately ?) I moved to another company before the project ended, and the architect the followed me took the decision the opposite decision (i.e. to make the solution for that problem an architectural solution for all the system's "entities") - which resulted in making all the interactions within the system (even the simplest ones) asynchronous. I recently  had a chance to see the effects of this decision on the system's schedule, robustness and complexity, well let me just say that the lesson here is that while cutting your hair (making an architectural decision) is not an irreversible decision, you cannot just undo it instantly and it can take quite a long time (=money) to correct things.

 

To sum things up

  • Functional requirements manifest themselves as part of the utility tree (as the scenarios),
  • It can also be important to view the architecture from the functional perspective
  • Significant/important functional requirement should be weighted for their influence on the system's architecture (should they get a local treatment (as part of the design) or affect the system globally)

 
Thursday, September 15, 2005 10:53:21 AM (GMT Standard Time, UTC+00:00)
Dear Arnon,

I agree that functional requirements dictate the architecture. However, your example is really just another "non functional" requirement, but for a specific functional subset, and it might be worth exploring true functional requirements a bit further.

You often find functional requirements which have a direct architectural element. An example might be "interface to a specific external service".

Beyond this, I've often found that the dynamic nature of requirements also dictates the architecture. I'm, talking mainly about their stability. If the users can't make up their mind, or the nature of the business, or specific rules are constantly changing, then the architecture needs to explictly accomodate such change at minimal cost. If you have a large number of similar but slightly different requirements, then you need to design an architecture which abstracts the common and makes it as easy as possible to deliver and maintain multiple variants of the differences. If you have a very uncertain or problematic algorithm, you probably want this to be developed and maintained separately from the rest of the code.

Andrew
Thursday, September 15, 2005 8:31:53 PM (GMT Standard Time, UTC+00:00)
Dear Andrew,

You are correct saying my example looks at a "non functional" within a functional subset. However, I think this is also true for your examples:
"Interface to a specific external service" - under Interoperability
and accommodating changes examples under Flexibility/Adaptability etc.

I would expect to identify the functional requirements you gave as examples under the non-functionals (i.e. as scenarios in a utility tree)

It is important to try to find important ("Architectural") requirements. I think coming from that analysis starting with the quality attributes helps you prioritize better, however (and that why I added the "functional requirements" post) it is also good to try to look at things from the functional requirements angle to try to catch additional quality attributes you may have missed.

Arnon

Comments are closed.