What Is Software Quality?

27 April 2018 | Software Engineering

In consulting (and other environments), you often hear the adage:

You can have it fast, cheap or good. Pick 2.

We offer a quality service to our customers and don't like to compromise on quality. But if you are not a software developer how can you spot good or bad software? How do you know if someone can provide quality software?

As we aim to provide high-quality software-based solutions, I've been giving this question some thought.

What is Software Quality?

Quality software is software that meets your needs and expectations. That definition is pretty straightforward.

However, it seems like software often fails to hit the mark. There is a feeling that software is too complicated or too unreliable more often than not.

That is because expectations are the hard bit. Needs are often quite easy to define and understand. But everyone has expectations that they think are too obvious to tell developers or don't even realise they have them.

To help consider all needs and expectations we can break down software quality into a few components. 

Components of Software Quality

We are not the first to consider these. In fact, there is a standard (ISO 25010) that breaks these down into great detail.

In this section, we have picked the 6 that we have found to be the most important and tried to simplify them. Each table below describes what that factor means, why it is important, what you might notice in good and bad cases, and finally, some of the common practices that you can look for that tend to result in good outcomes.

Minuature plastic men working on a close up hard drive

Maintenance is one component of quality

The areas we have included are:

  1. Correctness
  2. Usability
  3. Robustness
  4. Maintainability
  5. Performance
  6. Security

Each project will have their priorities within these (each one has costs associated and conflicts with others), but this order is intended to be the order of importance in a typical measurement application.

1. Correctness

What Is Correctness

Correctness is a term that encompasses a few requirements:

  • The software is designed to meet your needs.
  • The software is accurate (it does what it was designed to do).
  • The software has low or no defects/bugs.
Why Is This ImportantThis is important to make sure you get what you need from the software. It improves your engineering rather than getting in the way.
Good Looks Like...The software helps you complete your work. Software flaws are not causing your users to have to do any rework or additional work.
Bad Looks Like...In addition to the software, users have to take extra steps to complete their work due to missing functions or bugs in the software. Users are frustrated because it gets in their way.
Practices That Improve This
  • Requirements Gathering Processes - time is taken to understand your needs.
  • Testing practices and plans are in place before the developer starts the project.

2.Usability

What Is Usability

This is the famous "it should be easy to use". It is tough to define, but we tend to consider three key criteria:

  1. The software should make sense when following your process. Ideally, it guides the user through it.
  2. Commonly used features are the most accessible.
  3. The right level of flexibility and configuration are exposed to the user. This can be less or more depending on the project.
Why Is This ImportantThis is all about reducing human error due to poor design and increasing user efficiency.
Good Looks Like...The software feels natural in the context it is used. Users should find it "gets out of their way" and helps them to achieve their primary task.
Bad Looks Like...The software feels awkward to use. There is a higher rate of errors in the process due to operator error or tasks will take longer than you would expect.
Practices That Improve This
  • Good requirements gathering to understand what the interface should involve.
  • Early design and testing of the user interface with the opportunity for feedback and improvement.

3. Robustness

What Is Robustness

Robustness means it doesn't only work in the perfect circumstances, or in the first year. 

Why Is This ImportantSimilar to Correctness, you need this software to maximise your success, so you want it to work consistently.
Good Looks Like...You trust that the software will work each time you use it.
Bad Looks Like...You have to account for the probability that the software will fail you during the work. That may involve retesting, or extra steps to check the validity.
Practices That Improve This
  • Defensive programming practices anticipate and manage failure scenarios.
  • Developers allow sufficient time for testing in different scenarios and potential failure modes.

4. Maintainability

What Is Maintainability

Maintainability is all about how easy the software is to change. Change doesn't necessarily mean adding new features but being able to turn around bug fixes quickly as well.

Why Is This Important

There are a few reasons why maintainability is a concern, even though it doesn't directly impact the user of the software.

  1. In maintainable code, bug fixes or new features are quicker to add and much less likely to introduce additional bugs. This means less downtime of the system and lower costs for changes.
  2. Hard to maintain code means it is more likely that developers miss or introduce bugs. Hence this is likely to be higher quality for correctness and reliability as well.
  3. When the code is written with this in mind, it is easier to have different developers work on it. This reduces the project risk of future changes if the original developers are unavailable or need a bigger team.
Good Looks Like...When you request a new feature or report a new bug, the changes are completed quickly without any additional issues being added.
Bad Looks Like...It seems like for every change you request, two more are needed to fix other issues.
Practices That Improve This
  • Keep the software simple. Take opportunities to remove and simplify existing code and avoid complex frameworks and structures which are hard to understand.
  • A modular and structured approach to developing software which creates consistency across the code base.

5. Performance

What Is Performance

The performance is the measure of the size and speed of the application. Good performance means that the software completes its tasks in a reasonable time on reasonably specified hardware.

Optimisation is a balancing act. Performance can always be improved but at a cost. It is about finding the balance for the particular application.

Why Is This Important

Computers are cheap, people are expensive. You don't want to waste your engineers time waiting around for the software to complete what it is doing.

Good Looks Like...The software runs on standard hardware, and your engineers don't have to wait around for it.
Bad Looks Like...Your engineers are taking coffee breaks because they know the software will make them wait 15 minutes before they can carry on. Or for a simple application, you need a supercomputer to run it.
Practices That Improve This
  • Ability to identify likely bottlenecks and apply standard optimisation methods to the code.
  • Avoid premature optimisation that costs a lot of development time until performance problems are identified and understood.

6. Security

What Is Security

Application and system security is in the headlines more and more. Secure software is designed to avoid key risks of outside interference in the application.

Like performance, this is a balancing act. Secure software costs more to develop and is less usable, so this must be balanced with other factors.

Why Is This Important

There are two key concerns in engineering software:

  1. Avoid downtime due to malware/virus exploitation.
  2. Avoid confidential data getting into the wrong hands and being exploited to harm your company.
Good Looks Like...Your systems are running as expected.
Bad Looks Like...Your test systems get infected with malware causing affecting system throughput.
Practices That Improve This
  • Threat Evaluation - Taking time to understand the credible threats to the system.
  • Secure By Design - The early design phases consider security from the start, and the system level design provides a secure base.

Conclusion

So I appreciate that is a lot of information. Hopefully it made sense, so what next:

  • If you are starting a new project. Talk to your team about some of these practices and others that they use.
  • If you think you have a quality problem in an existing project, identify why and start putting things in place to improve the quality.

Of course, you can reach out to us if you want to discuss these issues with us directly and we can see how we can help you.