[an error occurred while processing this directive]

Software Engineering Values


Before you can produce high-quality software, you must first develop the ability to judge its quality. Although software quality is based on concepts that are not hard to grasp, judging the quality of software is difficult and doing it well requires considerable experience. Judgement is difficult because the ability to understand a value concept does not automatically give you the ability to recognize when it is applicable. Experience is required to learn to see the factors of quality or their deficiency in software.

Judgement is also difficult because software quality is a complex of values with complex relationships between them. Experience is required in order to build a mental map that captures the relationships.

Finally, judgement of quality is difficult because the different values often conflict with each other, requiring tradeoffs. Experience is required to judge the appropriateness of the tradeoffs that are made.

Stakeholders in Software Development

Part of the complexity of software quality arises from the fact that software is important to many people, who play a variety of roles with regard to the software. Some people will use the software, others will purchase it, and others will manage the hardware systems on which the software runs. Furthermore, software developers also impose their own values on software, usually for components of programs rather than for complete programs.

These roles define the stakeholders in the software. Although the roles may be filled by the same people, the different roles have distinct but overlapping values. The concept of a stakeholder serves a useful purpose in organizing our knowledge of software values. If you can conceptualize a particular kind of stakeholder, it is easier to put yourself in their shoes and recognize the importance of their values.

Aside from the stakeholders described above, there may be other stakeholders that are important to consider. For examples, consider software to manage bank accounts, or software to control radiation treatment machines, or software involved with aircraft flight control. In each case, there are people that are directly affected by the software even though they may be unaware of its existence. The values of these stakeholders are not mentioned explicitly below only because it is difficult to make generalizations. In spite of the difficulties, they must be considered. Due to the possibility of software impact on their lives or property, they can have a major impact on the weighting of the various quality factors.

Purchaser Values

The purchaser pays for the software and determines its overall objectives. If the software is developed under contract then the primary functional specifications for the software are negotiated between the purchaser and the developers.

User Values

Users interact with the software. Their needs may determine additional specifications with regard to the user interface. Prototypes may be required to work out these specifications.

System Manager Values

System managers oversee the operation of computer systems on which software must run. System managers are responsible for installing new software and purchasing new hardware to meet increasing demands. These responsibilities determine their values.

Software Developer Values

Software developers face a difficult task in the production of quality software. Programs need to be broken down into components, each specialized to deal with a limited aspect of the overall functionality of the program. Like a person in a complex organization, each component will do some of the work, but it will call upon other components if the need for their specialized ability arises.

Many people are involved in the design and programming of a complex program and most will deal with only a few components. The people involved in such a project thus play two roles: they are producers of some components, but they are users of other components. As users, they will evaluate other components in terms of the user values described above. As producers they must be concerned with the primary values of quality in their own product. In addition, they impose their own values.

Although ease of maintenance, reuse, and verification are of direct interest only to software producers, they have a significant effect on timely delivery of software and software upgrades. Due to tradeoffs between timely delivery and other primary values, they also have a major effect on the overall quality of software.

Ease of maintenance and verification are not only important for components; they are also important considerations for complete programs. Ease of maintenance and verification of programs is dependent on the corresponding qualities of the components, but high quality components are not sufficient to guarantee quality of the program. The components interact as a system and the structure of the interactions has a decisive influence on quality.

Coupling is an important concept that pertains to interactions between components. More precisely, it is a relationship between two components that arises when implementation of one component requires knowledge of the implementation of another component.

Coupling between components can greatly hinder software verification and maintenance, and coupled components are less likely to be reusable. For example, when components are strongly coupled, individual component verification may be impractical or impossible. Then verification of interacting groups must be more thorough to ensure correctness. A strongly coupled group of components is more than the sum of its parts. As a consequence, the difficulty of verifying the group is more than the sum of the difficulties of verifying its parts. This is one reason that coupling is an important term in the vocabulary of software engineering.

Components may have implementation dependence in order to serve an essential purpose. For example, a function for adding entries to a table and a function for removing entries from a table must be dependent since they are working with the same implementation model. On the other hand, clients of a table component should not need to be aware of the implementation. Careful use of encapsulation can and should be used to keep the implementation dependence from arising between a table and its clients.

The Importance of Context

Evaluation of quality depends on the nature of the application and the roles of its components. If human lives or property depend on a program then correctness and robustness are of utmost importance in the program and many of its components. If a component is a part of a prototype then timely delivery assumes a greater importance. If it is a part of a real-time system then its response time may be crucial.

Evaluation of quality also depends on the level of skill and sophistication of the user. When writing software to aid software developers you can assume that the user can handle a complex interface. Such users are more patient about dealing with a steep learning curve; they are likely to be more concerned with ease of performing tasks than with ease of learning the operations and their use.

Finally, evaluation of quality depends on the technological context. For example, minimal response time and resource usage are of lesser importance today than they were when hardware capabilities were more limited. And as a consequence of the development of more complex software, the importance of ease of reuse, maintenance, and verification has greatly increased.

Learning to Judge Quality

The values and value concepts presented in this web page are only a first step towards learning to judge quality. Although it is easy to grasp the values and value concepts in terms of their purpose and general nature, a good software engineer spends a lifetime learning to use them effectively to judge software quality.

Judgement is difficult because the ability to understand a value concept does not automatically give you the ability to recognize when it is applicable. For example, you often do not see couplings until you have seen an alternative that avoids them. Also, you might not see problems with ease of use until you have see a better user interface. Finally, you do not see where to apply value concepts until you have gotten into the habit of looking out for them.

Judgement is also difficult because software quality is a network of values with complex relationships between them. The network is initially just a framework for your later understanding. As you acquire experience, you develop the ability to see relationships between the concepts so that you can more comfortably navigate within the framework. Your experience is also recorded within that framework as judgements of what is important and in what contexts is it important.

Finally, judgement of quality is difficult because the different values often conflict with each other, requiring tradeoffs. One common example of a value conflict arises between response time and various other qualities involving program structure. Many inexperienced programmers will corrupt program structure for a small gain in respnse time. More experienced programmers are aware of the consequences: maintenance can get much harder. Timeliness is another value that frequently conflicts with other values. It takes a lot of experience to decide between delivering a flawed product now or a better product later.

[an error occurred while processing this directive]