To be able to deliver great software, we need to be mindful of software quality.
One of the best expositions on software quality I have found is Chapter 1 of Bertrand Meyer's Object-Oriented Software Construction. Nineteen pages of the best advice on what constitutes quality software. Rest of the book (1200+ pages) is very concrete, detailed, and specific design and construction advice on how to actually achieve quality software. The short version of the advice is to focus on correctness. How do you ensure correctness? Design By Contract - Chapter 11.
What are the quality attributes for software? According to Meyer, they are the following:
- Correctness. The ability of software products to perform their exact tasks, as defined by their specifications.
- Robustness. The ability of software systems to react appropriately to abnormal conditions.
- Extendibility. The ease of adapting software products to changes of specification.
- Reusability. The ability of software elements to serve for the construction of many different applications.
- Compatibility. The ease of combining software elements with others.
- Efficiency. The ability of a software system to place as few demands as possible on hardware resources.
- Portability. The ease of transferring software products to various hardware and software environments.
- Ease of Use. The ease with which people of various backgrounds and qualifications can learn to use software products and apply them to solve problems. It also covers the ease of installation, operation, and monitoring.
- Functionality. The extent of possibilities provided by a system. How much functionality is enough? Do you sacrifice reliability, extendibility, etc. for more functionality?
- Timeliness. The ability of a software system to be released when or before its users want it.
Tradeoffs are necessary, as these factors may conflict with one another. Economy often fights with functionality. Efficiency may require perfect adaptation to a particular environment, which is the opposite of portability. Reusability requires solving problems more general than the one initially given. Timeliness may require using rapid techniques whose results may conflict with extendibility. A true software engineering approach implies an effort to state criteria clearly and to make the choices consciously.
Necessary as tradeoffs between quality factors may be, one factor stands out from the rest: correctness. There is never any justification for compromising correctness for the sake of other concerns such as efficiency. If the software does not perform its function, other attributes are useless. I recall a conversation with a client who insisted that we make the software much faster. I explained to the customer, that I can make it extremely fast, if it did not have to do all these things that he wanted it to do. That is the definition of a useless quality attribute! Very fast, but doesn't do much.
So I maintain that outrageously great software is software that does what it is supposed to do, in other words, honors its contract with its potential users. A user of a piece of software, most of the time, is another piece of software. Only the UI modules of a software system have humans as the end user.
So to deliver great software, it would pay to know how to make a software module honor its contracts with other software modules (tests are those software modules that represent the user). This leads to the realization that great software boils down to DBC - Design by Contract!
Other definitions, of course, abound. Great software is great because:
- It generates great revenue for the company.
- It is a great market success
- It is great performing. Lightning fast.
- It has a great user interface.
- It is bug free. Never breaks down.
You can deliver great software by other means, like test-driven development, and by being relentlessly test-driven. Having explicit contracts checkable at runtime, is complementary, and will get you there faster.
Recent Comments