Sunday, February 7, 2010

Software Quality: internal vs. external

Let's check following questions:
1)How to define the quality of a software product?
2)Is a bug free software a high quality software?
3)Is software quality determined by QA testing?
4)Can QA testing help improve the quality?

The software quality can be divided into two parts: external and internal.

External quality is explicit, transparent and easy for user to experience, easy to test, the bug can be easily found;
Internal quality is implicit, it is hard to describe and visualize by the end user, but it is the true quality of the software, usually related clarity, flexibility, maintainability, readability etc, it is a gene of a software.
The relationship between external and internal quality like a iceberg: external quality is above the water, while most of the stuff under the water are belong to internal quality.
We say that Internal quality determines the external quality:
If internal quality is good, then external quality are also good,
If we found more external bugs, then there must be more internal bugs, we just haven't found them yet.

Now we can answer question 1) and 2):
To determine a software is high quality or not, the most important is how much it can add value to customer, which is based on its internal quality; if it does not bring much value, even if it is no bug, still it can not be treated as a high quality software, because it is useless.

To answer question 3) and 4), Let's check another metaphor:
A human being is healthy is determined by his internal physical condition,or his gene, not by the physical examination. The annual checkup will give you a feedback of your body. The testing itself does not improve your body condition.
So the answer will be: the internal quality determine the software quality; the QA testing just give the feedback of the quality, itself can not improve the quality.

We just pay too much attention on the external quality, but ignore the internal quality; if we want to truly improve the software quality, we need to pay more attention on the internal quality, pay attention on external quality is too late and not efficient.

How to measure the internal quality? How to improve the transparency and visualize the internal quality?
Static analysis tool can tell you how good your code is.

How to improve the internal quality?
Use iterative development process, encourage team reflection, keep constantly refactoring, code review, use design patterns, etc.