Whenever we start a new project, we have to make decisions that have significant influence over the software architecture. Architects should work in order to guarantee that the software will comply with aspects related to quality attributes and design a software considering potentials impacts in the future.
Quality attributes aren't a silver bullet. They represent areas of concerns that have potential for application impact across layers and tiers.
In Software Architecture in Pratice 3rd Edition, Len Bass defines Quality Attributes [QA] as measurable or testable property of a system that is used to indicate how well the system satisfies the needs of its stakeholders. You can think of a quality attribute as measuring the “goodness” of a product along some dimension of interest to a stakeholder.
This article presents a set of qualities attributes with a small description about each of them. And of course, each one deserves its own article, but here I'll just provide a brief description about them all, and you can have a deeper study from the book Software Architecture in Pratice 3rd Edition or wait for futures articles.
This is perhaps a wider-covering attribute because it subsumes other concepts including security, performance, integrity, confidentiality, reliability, dependability, and others. However, for this topic, we’ll just go over reliability and dependability attributes.
Firstly, I would briefly describe availability as a feature of software meaning that it's ready to carry out its task when you need it to be.
In a broad perspective, availability builds upon the concepts of reliability that encompass the notion of recovery, which in a few words means: when the system breaks, it repairs itself.
Availability also entails dependability refering to the ability of a system to mask or repair faults such that the cumulative service outage period does not exceed a required value over a specified time interval.
Basic List of Quality Attributes
This describes the degree to which two or more systems can fully exchange meaningful information via interfaces in a particular context. The definition includes not only having the ability to exchange data (syntactic interoperability) but also having the ability to correctly interpret the data being exchanged (semantic interoperability).
Modifiability relates to the costs of changes and refers to the ease with which software can deal with changes.
It’s all about time and the software system’s ability to meet timing requirements. When events occur—interrupts, messages, requests from users or other systems, or clock events marking the passage of time—the system, or some element of the system, must respond to them in a timely manner.
Software testability is a measure of how easy is to create test criteria for the system and its components, and to execute these tests that assess if the criteria are met.
All systems must be capable of prevent malicious or accidental actions that aren't following designed usage. With security comes a measure of the system’s ability to protect data and information from unauthorized access while still providing access to people and systems that are authorized.
Usability is concerned with how easy it is for the user to accomplish a desired task and the kind of user support the system provides.
Other Quality Attributes
The list above is quite important, but there are some others attributes that frequently arise are variability, portability, development, distributability, scalability, and elasticity.
More on these in the future!