“Make the workmanship surpass the materials.” — Ovid
This article presents a comprehensive list of quality attributes that software developers and engineers should consider when designing and building software systems.
Each quality attribute is defined and explained in simple language to help readers understand what it is and why it matters.
By organizing these attributes into categories such as maintainability, security, performance, and usability, readers can gain a better understanding of how they fit together and how they impact the overall quality of a software system.
Whether you’re a software engineer or a business leader, this article provides a valuable resource for understanding the key quality attributes that are critical to the success of any software project.
What are Quality Attributes?
Quality attributes in terms of software development refer to the various characteristics or properties that a software system should possess in order to meet the requirements of its users and stakeholders.
These attributes often include things like performance, reliability, usability, maintainability, security, and scalability, among others. They are essential considerations for software developers when designing, building, testing, and evaluating software systems.
By paying close attention to quality attributes, software developers can ensure that their products are not only functional, but also meet the needs and expectations of their users.
List of Quality Attributes
The List of Quality Attributes is a comprehensive compilation of key qualities that define software quality.
By using this list as a reference, developers can create more reliable, maintainable, and effective software systems that meet the needs of their users.
When thinking about quality, I tend to draw from the following quality attributes:
- Accessibility
- Auditability
- Availability
- Compatibility
- Configurability
- Correctness
- Completeness
- Consistency
- Conformance
- Dependability
- Durability
- Effectiveness
- Efficiency
- Elegance
- Extensibility
- Fault Tolerance
- Flexibility
- Functionality
- Installability
- Integrability
- Interoperability
- Learnability
- Maintainability
- Manageability
- Modifiability
- Observability
- Operability
- Performance
- Portability
- Recoverability
- Reliability
- Reusability
- Robustness
- Scalability
- Security
- Serviceability
- Simplicity
- Stability
- Testability
- Timeliness
- Traceability
- Transparency
- Understandability
- Usability
Description of Quality Attributes
Here is a brief description of each qulaity attribute:
- Availability: The extent to which a system or service is operational and accessible when needed, without any downtime or disruptions.
- Buildability: The ease and efficiency with which a system or product can be built, including the build process, tools, and technology.
- Conceptual Integrity: The degree to which the system’s design and architecture reflect a unified, consistent, and clear understanding of its purpose and goals.
- Evolvability: The ability of a system to be easily modified, enhanced, and adapted to changing requirements and circumstances over time.
- Extensibility: The ease and flexibility with which the system’s functionality can be expanded and extended to meet new requirements and use cases.
- Functionality: The extent to which the system meets the specified functional requirements and user needs, and the ease of using those functions.
- Implementation Transparency: The extent to which the implementation details of the system are easily understood, well-documented, and transparent to users and other stakeholders.
- Integrability: The ease and efficiency with which the system can be integrated with other systems, components, and technologies.
- Interoperability: The ability of the system to work seamlessly with other systems and technologies, and to exchange data and services with them.
- Maintainability: The ease and efficiency with which the system can be maintained and repaired, including the speed of identifying and fixing defects, updating and upgrading the system, and cleaning the code.
- Performance: The speed, efficiency, and responsiveness of the system in delivering its functions and services, including throughput, latency, and resource usage.
- Portability: The ease with which the system can be deployed and run on different platforms, operating systems, and environments.
- Reliability: The extent to which the system performs its functions and services without errors, failures, or crashes, and meets its service level agreements (SLAs).
- Reusability: The ability of the system’s components, modules, and code to be easily reused in other projects, systems, and products.
- Scalability: The ability of the system to handle increasing amounts of users, data, transactions, and workload, and to maintain its performance and quality.
- Security: The level of protection and resistance to unauthorized access, attacks, and breaches of the system’s data, processes, and services.
- Serviceability: The ease with which the system can be serviced, repaired, and maintained, including diagnosing problems, fixing issues, and replacing faulty components.
- Subsetability: The ability of the system to provide a smaller, more focused set of functionality, while still maintaining the overall quality and reliability.
- Supportability: The ease with which the system can be supported by its developers, maintainers, and users, including documentation, training, and community resources.
- Testability: The ease with which the system can be tested and validated, including automated testing, test cases, and test coverage.
- Usability: The extent to which the system is easy to learn, understand, and use, and provides a positive user experience for its intended audience.
Quality Attributes Organized into Categories
I’ve organized the list of Quality Attributes into categories to help software developers and engineers better understand and evaluate the attributes of their software systems.
Here’s how the list of Quality Attributes can be organized into categories:
Functional Quality Attributes
- Functionality: The degree to which a software system performs its intended function.
- Reliability: The ability of a software system to perform its functions under stated conditions for a specified period of time.
- Usability: The ease with which a user can interact with a software system to perform its functions.
Non-functional Quality Attributes
- Availability: The ability of a software system to be available and accessible when needed.
- Performance: The degree to which a software system performs its functions within an acceptable time frame.
- Scalability: The ability of a software system to handle an increasing amount of work or its potential to be enlarged.
- Portability: The ability of a software system to be moved from one environment to another.
- Security: The ability of a software system to protect against unauthorized access and ensure data confidentiality, integrity, and availability.
- Maintanability: The ability of a software system to be modified and updated with ease.
- Testability: The degree to which a software system can be tested to verify that it meets its requirements.
- Evolvability: The ability of a software system to evolve with changing requirements or environments.
- Serviceability: The ability of a software system to be serviced, monitored, and maintained.
- Reusability: The degree to which a software system can be used in multiple contexts.
- Interoperability: The ability of a software system to work with other systems or components.
- Integrability: The ability of a software system to be integrated with other systems or components.
Other Quality Attributes
- Buildability: The ease with which a software system can be built or compiled.
- Conceptual Integrity: The degree to which a software system is coherent, consistent, and understandable.
- Implementation Transparency: The degree to which the implementation of a software system is visible and understandable to developers.
- Subsetability: The ability of a software system to be used in a subset of its intended environment.
You Might Also Like
The Quality Attribute Framework: Categories for Organizing Quality Attributes
These qualities–criteria, really–are applicable at every level where we desire quality (and are how we can define and measure quality).
As an example, when I work with dev teams I get them in a room and start a list like this on the whiteboard, asking each developer what 2 or 3 things they most value in their code, in a design, etc. I do the usual NLP hierarchy or criteria process (“what would be so important that it caused you to choose a less-reliable solution over a more-reliable one?” etc.) if I need to elicit more.
Then, I have the tech lead(s) define the shared team hierarchy. The top 5+-2 get put up on the wall in the dev pit, included in emails about code, and are written on the whiteboard at every code review.
“I think this is better” is great to hear (and encouraged); “this supports a higher criteria for this project” is a) behavioral as opposed to personal, b) cuts down on philosophizing when it’s not appropriate, c) teaches more-junior developers not only what to prefer and why to prefer it, but what process to use to make that decision, and d) gets the team using *shared* criteria.
Teams with shared criteria are routinely more successful, have better cohesion, have a lower “bus number”, and produce fewer surprises for S&M, support, and customers. It’s also nice that explicit criteria like these, whether for QA of the product or making decisions in the implementation, helps people keep their personal preference for criteria separate from the project’s preference and still be committed to the project. (i.e., it helps avoid the “I can write LISP in any language!” and “I can shave a couple of clock cycles off this once-a-week process, no matter how many tricks I need to use!” syndromes, plus it makes it easier to address as behavior rather than intention).
In all cases, of course, criteria are heterarchies rather than hierarchies. That’s where the artistry of the more senior engineers comes in. And sometimes the politics between stakeholders 🙂
Great list!
Great rundown and details Seth!
I like your focus on shared values and your approach to team mentoring. I really like your distinction between personal preferences and project preferences.