Software qualities: what they are and how can you improve them

Published in 2021.

I've found myself in many situations where I am either reviewing my own or someone else's code and I keep thinking that I am probably not considering something that I should. I also try to help my company develop better software and there's probably a lot more stuff we could do but I can't think of any. These events led me to investigate what makes software great. I organized all my knowledge and all I could find about software qualities in one place that I could regularly check to ensure I'm not forgetting something. This is that place.

In this post I will try to explain what each quality is about. These are the qualities I'm most familiar with as a professional software engineer. My experience mainly consists on developing and maintaining a private equity marketplace, accessible via web applications. In total I've got 11 qualities. They are, in no particular order: correctness, availability, efficiency, security, maintainability, adaptability, usability, usefulness, stability, community and support, and pricing. Depending on where you consult, each standards commitee has its own list of qualities, all of which I found too narrow as they mainly focused on requirements specification and implementation and didn't consider qualities such as usefulness, pricing, and others, which I find essential for software to be considered good. If you want to learn more about what others think of this matter, I found the Wikipedia article a good starting point.

There's an infinite amount of things one can do to improve each quality. There's so much that large organizations tend to hire severals specialists to focus on just one. In this post I will also try to provide a small list of suggestions for each quality, highly based on my experience, which should let you get started. In case you don't understand the suggestion I recommend searching for it in the Internet.

How can you improve any quality?

There is a small list of suggestions I find applicable to improve any quality, which are:

Table of contents

  1. Correctness
  2. Availability
  3. Efficiency
  4. Security
  5. Maintainability
  6. Adaptability
  7. Usability
  8. Usefulness
  9. Stability
  10. Community and Support
  11. Pricing

1. Correctness

Correctness means that the software works as expected by the software makers. It's the first thing engineers try to do, which is "Make it work". I personally believe that behaviors that were not expected and also not supported cannot be considered bugs, otherwise everything is a bug.

How can you make your software less buggy?

Re-use

Test

Misunderstandings

Detect and don't forget about bugs

Avoid bugs with automation

Concurrency

Failures (machine, network)

Let others help you

2. Availability

Availability means that the software is available to be used. This quality is related with resilience, which is the ability to handle failures, and with recoverability or self-healing, which is the ability to recover from failures.

How can you make your software more available?

Re-use

Avoid failures

Detect failures

Recover from failures

Let others help you

3. Efficiency

Software is said to be efficient when it requires as few resources as possible, where resources can be time (CPU, GPU, people's), memory space, disk space, energy, money, network bandwidth, and others. Users typically notice more when software is slow (time). In most cases, the reason why software is slow is because of how it works (code) and not due to lack of resources.

How can you make your software more efficient?

Re-use

Prevent and detect

Improve

Let others help you

4. Security

Security means how likely attackers might breach the software, i.e., interrupt its activity, gain access to sensitive information, change its behavior to achieve some other goal (e.g. mine Bitcoin). Software can never be completely secure. Given enough time and money, any software can be hacked.

How can you make your software more secure?

Re-use

Detect

Prevent

Test

Let others help you

5. Maintainability

Maintainable software means it's easier to understand and to change (only small things like bug fixing, not including adding new features). It's also easy to build, run, test, install and update.

How can you make your software more maintainable?

Standardize

Simplify

Document

Let others help you

Monitor

6. Adaptability

Adaptability means that the software easily adapts to new situations such as new features, new platforms, new hardware, new user interfaces, etc. For me adaptability and maintainability are two different qualities of software because, first, it's possible to have software that is maintainable but is not adaptable, and second, it's very hard to make software adaptable. The main reason that seems to make software really hard to adapt is that humans are complicated, and the software that has to model or interact with stuff created by humans is even more complicated.

How can you make your software more adaptable?

Simplify

Test

7. Usability

Usability is related with user interfaces. When a software is highly usable, people call it intuitive. It's software that is as simple as possible to use. It's easy to understand. It follows appropriate language for its goals. It's consistent. It's pretty. It follows standard conventions. It uses the appropriate communication channels to communicate with users depending on the message.

How can you make your software more usable?

Re-use

User feedback

Research

Execution

Simplify

Let others help you

8. Usefulness

Software is said to be useful when it solves some users' needs. The more needs it solves the more useful it is. It's also more useful when it can be used in different situations. For example, a text editor is more useful if it allows to edit more types of text.

How can you make your software more useful?

User feedback

Research

Prioritization

Complexity

Announcements

9. Stability

Software is stable when it minimizes breaking changes. This is specially applicable to software used by other software engineers, but it also applies to GUIs.

What can you do to make your software more stable?

10. Community and Support

Software is said to be supportive when it has at least one communication channel where users can ask for help and have their questions and concerns cleared. It's the team of humans that is always ready to help users and to be their voice when talking with the remaining team members.

How can you make your software more supportive?

11. Pricing

Software is said to have a good price when users are happy to pay for that price to be able to use your software. Nowadays a lot of software isn't paid directly but indirectly (as part of a service). I still think it makes sense to include pricing as a quality of software, even if that pricing includes more than paying for the software.

How can you improve your pricing?