A Crash Course in Software Quality

It occurred to me recently that while intuitively obvious to many the concept of “Software Quality” is probably something never actually studied by the average developer who doesn’t have a formal computer science education.

Yet understanding software quality beyond intuition has been extremely helpful to me over the years as a programmer and software architect. And while there are many amazing self-taught developers it’d be a shame for me not to blog about it since I can cover the essence of software quality so quickly.

A Bit of Personal History

It was back around 1988 I was first learning OOP, also known as “object-oriented programming”. One of the few books avaiable on the subject was “Object-Oriented Software Construction” by Bertrand Meyer, but of the books available I probably learned more from it than any other. I’ve learned an amazing amount since but it was from that book I learned many of the foundational principles I still use daily as a software architect.

I still think most of what was covered in the book’s 2nd edition is relevant. If you are interested in reviewing it to decide if you want to read it I found a copy online but you can buy a used one for US$0.01 on Amazon.com

The External Factors of Software Quality, Named

The first chapter in OOSC covers Software Quality. To explain the concept Meyer simply defined numerous related terms, which he called “External Factors”, and wrote a few paragraphs about each. I’ve edited his definitions slightly, for brevity, and I’ve included them here as your crash course in software quality. Enjoy!

  • Correctness - The ability of software to perform its exact tasks, as defined by its specification.
  • Robustness - The ability of software to react appropriately to abnormal conditions.
  • Extendibility - The ease of adapting software to changes of specification.
  • Reusability - The ability of software elements to be used to construct different applications.
  • Compatibility - The ease of combining software elements with others.
  • Efficiency - To place as few demands as possible on processor, memory and bandwidth.
  • Portability - The ease of transferring software to different computing environments.
  • Ease of use - The ease with which various people can learn to use software to solve problems.
  • Functionality - The extent of possibilities provided by a system.
  • Timeliness - The ability for software to be usable when or before its users need it.
  • Verifiability - The ability to detect failures and to trace errors during operation.
  • Integrity - The ability of software to protect code and data from unauthorized access/modification._
  • Repairability - The ability to facilitate the repair of defects.
  • Economy - The ability of a system to be completed on or below budget.

Take these terms and commit them to memory. And when building software ask yourself “How does my software fare with respect to these factors?” If you can answer that your software fares well then you can rest easy in knowing that you are probably a developer who builds quality software.

As a side-note, after having learned OOP in the late 80’s I’m still surprised when a professional WordPress developer says, in 2014, that “I don’t really understand OOP.” Time to get with the program, I say!