All Topics  
Software quality

 

   Email Print
   Bookmark   Link






 

Software quality



 
 
In the context of software engineering
Software engineering

Software engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software, and the study of these approaches....
, software quality measures how well software is designed (quality of design), and how well the software conforms to that design (quality of conformance), although there are several different definitions.

Whereas quality of conformance is concerned with implementation (see Software Quality Assurance
Software quality assurance

Software quality assurance consists of a means of monitoring the software engineering processes and methods used to ensure quality. The methods by which this is accomplished are many and varied, and may include ensuring conformance to one or more standards, such as ISO 9000 or CMMI....
), quality of design measures how valid the design and requirement
Requirement

In engineering, a requirement is a singular documented need of what a particular product or service should be or do. It is most commonly used in a formal sense in systems engineering or software engineering....
s are in creating a worthwhile product
Product (business)

The noun product is defined as a "thing produced by labor or effort" or the "result of an act or a process", and stems from the verb produce from the Latin produce, lead or bring forth....
.

Definition
One of the challenges of Software Quality is that "everyone feels they understand it".

A definition in Steve McConnell's Code Complete divides software into two pieces: internal and external quality characteristics.






Discussion
Ask a question about 'Software quality'
Start a new discussion about 'Software quality'
Answer questions from other users
Full Discussion Forum



Encyclopedia


In the context of software engineering
Software engineering

Software engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software, and the study of these approaches....
, software quality measures how well software is designed (quality of design), and how well the software conforms to that design (quality of conformance), although there are several different definitions.

Whereas quality of conformance is concerned with implementation (see Software Quality Assurance
Software quality assurance

Software quality assurance consists of a means of monitoring the software engineering processes and methods used to ensure quality. The methods by which this is accomplished are many and varied, and may include ensuring conformance to one or more standards, such as ISO 9000 or CMMI....
), quality of design measures how valid the design and requirement
Requirement

In engineering, a requirement is a singular documented need of what a particular product or service should be or do. It is most commonly used in a formal sense in systems engineering or software engineering....
s are in creating a worthwhile product
Product (business)

The noun product is defined as a "thing produced by labor or effort" or the "result of an act or a process", and stems from the verb produce from the Latin produce, lead or bring forth....
.

Definition


One of the challenges of Software Quality is that "everyone feels they understand it".

A definition in Steve McConnell's Code Complete divides software into two pieces: internal and external quality characteristics. External quality characteristics are those parts of a product that face its users, where internal quality characteristics are those that do not.

Another definition by Dr. Tom DeMarco
Tom DeMarco

Tom DeMarco is an American software engineer, author, teacher, public speaking on software engineering topics.. He is known as one of the developers of Structured analysis in the 1980s....
 says "a product's quality is a function of how much it changes the world for the better." This can be interpreted as meaning that user satisfaction is more important than anything in determining software quality.

Another definition, coined by Gerald Weinberg
Gerald Weinberg

Gerald Marvin Weinberg is an author and teacher of the psychology and anthropology of computer software development. His most well-known books are The Psychology of Computer Programming and Introduction to General Systems Thinking both of which are considered to be classics....
 in Quality Software Management: Systems Thinking, is "Quality is value to some person." This definition stresses that quality is inherently subjective - different people will experience the quality of the same software very differently. One strength of this definition is the questions it invites software teams to consider, such as "Who are the people we want to value our software?" and "What will be valuable to them?"

History


Software product quality

  • Product
    Product (business)

    The noun product is defined as a "thing produced by labor or effort" or the "result of an act or a process", and stems from the verb produce from the Latin produce, lead or bring forth....
     quality
    • conformance to requirements
      Requirements analysis

      Requirements analysis in systems engineering and software engineering, encompasses those tasks that go into determining the needs or conditions to meet for a new or altered product, taking account of the possibly conflicting requirements of the various Stakeholder , such as beneficiaries or users....
       or program specification; related to Reliability
  • Scalability
    Scalability

    In telecommunications and software engineering, scalability is a desirable property of a system, a network, or a process, which indicates its ability to either handle growing amounts of work in a graceful manner, or to be readily enlarged....
  • Correctness
    Correctness

    In theoretical computer science, correctness of an algorithm is asserted when it is said that the algorithm is correct with respect to a program specification....
  • Completeness
    Completeness

    In general, an object is complete if nothing needs to be added to it. This notion is made more specific in various fields....
  • Absence of Bugs
  • Fault-tolerance
    • Extensibility
      Extensibility

      In software engineering, extensibility is a system design principle where the implementation takes into consideration future growth. It is a systemic measure of the ability to extend a system and the level of effort required to implement the extension....
    • Maintainability
      Maintainability

      In software engineering, the ease with which a software product can be modified in order to:* correct defects* meet new requirements* make future maintenance easier, or...
  • Documentation
    Documentation

    Documentation may refer to the process of providing evidence or to the communicable material used to provide such documentation . Documentation may also refer to tools aiming at identifying documents or to the field of study devoted to the study of documents and bibliographies ....


Source code quality

A computer has no concept of "well-written" source code
Source code

In computer science, source code is any collection of statements or declarations written in some human-readable computer programming language....
. However, from a human point of view source code can be written in a way that has an effect on the effort needed to comprehend its behavior. Many source code programming style
Programming style

Programming style is a set of rules or guidelines used when writing the source code for a computer program. It is often claimed that following a particular programming style will help programmers to read and understand source code conforming to the style, and help to avoid introducing errors....
 guides, which often stress readability and usually language-specific conventions are aimed at reducing the cost of source code maintenance. Some of the issues that effect code quality include:
  • Readability
    Readability

    In writing and typography Readability is defined as reading ease, especially as it results from a writing style. Extensive research has shown that easy-reading text improves comprehension, retention, reading speed, and reading persistence....
  • Ease of maintenance
    Software maintenance

    Software maintenance in software engineering is the modification of a software product after delivery to correct faults, to improve performance or other attributes, or to adapt the product to a modified environment ....
    , testing
    Software testing

    Software Testing is an empirical investigation conducted to provide stakeholders with information about the quality of the product or service under test , with respect to the context in which it is intended to operate....
    , debugging
    Debugging

    Debugging is a methodical process of finding and reducing the number of computer bugs, or defects, in a computer program or a piece of electronic hardware thus making it behave as expected....
    , fixing, modification and portability
  • Low complexity
    Complexity

    In general usage, complexity tends to be used to characterize something with many parts in intricate arrangement. In science there are at this time a number of approaches to characterizing complexity, many of which are reflected in this article....
  • Low resource consumption: memory
    Computer storage

    Computer data storage, often called storage or memory, refers to computer components, devices, and recording medium that retain digital data used for computing for some interval of time....
    , CPU
    Central processing unit

    A central processing unit is an electronic circuit that can execute computer programs. This broad definition can easily be applied to many early computers that existed long before the term "CPU" ever came into widespread usage....
  • Number of compilation or lint
    Lint programming tool

    In computer programming, lint was the name originally given to a particular program that flagged suspicious and non-portable constructs in C source code....
     warnings
  • Robust input validation and error handling, established by software fault injection
    Fault injection

    In software testing, fault injection is a technique for improving the Code coverage of a test by introducing faults in order to test code paths, in particular error handling code paths, that might otherwise rarely be followed....


Methods to improve the quality:
  • Refactoring
    Refactoring

    Code refactoring is the process of changing a computer program's internal structure without modifying its external Functional requirement behavior or existing functionality....
  • Documenting code


Software reliability

Software reliability is an important facet of software quality. It is defined as "the probability of failure-free operation of a computer program in a specified environment for a specified time".

One of reliability's distinguishing characteristics is that it is objective, measurable, and can be estimated, whereas much of software quality is subjective criteria. This distinction is especially important in the discipline of Software Quality Assurance
Software quality assurance

Software quality assurance consists of a means of monitoring the software engineering processes and methods used to ensure quality. The methods by which this is accomplished are many and varied, and may include ensuring conformance to one or more standards, such as ISO 9000 or CMMI....
. These measured criteria are typically called software metric
Software metric

A software metric is a measure of some property of a piece of software or its specifications.Since quantitative methods have proved so powerful in the other sciences, computer science practitioners and theoreticians have worked hard to bring similar approaches to software development....
s
.

History

With software embedded
Embedded system

An embedded system is a special-purpose computer system designed to perform one or a few dedicated functions, often with real-time computing constraints....
 into many devices today, software failure has caused more than inconvenience. Software errors have even caused human fatalities. The causes have ranged from poorly designed user interfaces to direct programming errors. An example of a programming error that lead to multiple deaths is discussed in Dr. Leveson's paper (PDF). This has resulted in requirements for development of some types software. In the United States, both the Food and Drug Administration (FDA)
Food and Drug Administration

The U.S. Food and Drug Administration is an Government agency of the United States Department of Health and Human Services and is responsible for regulating and supervising the safety of foods, dietary supplements, Medications, vaccines, Biopharmaceutical, blood transfusion, medical devices, Electromagnetic radiation-emitting devices, veteri...
 and Federal Aviation Administration (FAA)
Federal Aviation Administration

The Federal Aviation Administration is an agency of the United States Department of Transportation with authority to regulate and oversee all aspects of civil aviation in the U.S....
 have requirements for software development.

The goal of reliability

The need for a means to objectively determine software quality comes from the desire to apply the techniques of contemporary engineering fields to the development of software. That desire is a result of the common observation, by both lay-persons and specialists, that computer software does not work the way it ought to. In other words, software is seen to exhibit undesirable behaviour, up to and including outright failure, with consequences for the data which is processed, the machinery on which the software runs, and by extension the people and materials which those machines might negatively affect. The more critical the application of the software to economic and production processes, or to life-sustaining systems, the more important is the need to assess the software's reliability.

Regardless of the criticality of any single software application, it is also more and more frequently observed that software has penetrated deeply into most every aspect of modern life through the technology we use. It is only expected that this infiltration will continue, along with an accompanying dependency on the software by the systems which maintain our society. As software becomes more and more crucial to the operation of the systems on which we depend, the argument goes, it only follows that the software should offer a concomitant level of dependability. In other words, the software should behave in the way it is intended, or even better, in the way it should.

The challenge of reliability

The circular logic of the preceding sentence is not accidental—it is meant to illustrate a fundamental problem in the issue of measuring software reliability, which is the difficulty of determining, in advance, exactly how the software is intended to operate. The problem seems to stem from a common conceptual error in the consideration of software, which is that software in some sense takes on a role which would otherwise be filled by a human being. This is a problem on two levels. Firstly, most modern software performs work which a human could never perform, especially at the high level of reliability that is often expected from software in comparison to humans. Secondly, software is fundamentally incapable of most of the mental capabilities of humans which separate them from mere mechanisms: qualities such as adaptability, general-purpose knowledge, a sense of conceptual and functional context, and common sense
Common sense

For the pamphlet by Thomas Paine see Common Sense . For use with Wikipedia see WP:COMMON SENSE.Common sense , based on a strict interpretation of the term, consists of what people in common would agree on: that which they "sense" as their common natural understanding....
.

Nevertheless, most software programs could safely be considered to have a particular, even singular purpose. If the possibility can be allowed that said purpose can be well or even completely defined, it should present a means for at least considering objectively whether the software is, in fact, reliable, by comparing the expected outcome to the actual outcome of running the software in a given environment, with given data. Unfortunately, it is still not known whether it is possible to exhaustively determine either the expected outcome or the actual outcome of the entire set of possible environment and input data to a given program, without which it is probably impossible to determine the program's reliability with any certainty.

However, various attempts are in the works to attempt to rein in the vastness of the space of software's environmental and input variables, both for actual programs and theoretical descriptions of programs. Such attempts to improve software reliability can be applied at different stages of a program's development, in the case of real software. These stages principally include: requirements, design, programming, testing, and runtime evaluation. The study of theoretical software reliability is predominantly concerned with the concept of correctness, a mathematical field of computer science which is an outgrowth of language and automata theory
Automata theory

In theoretical computer science, automata theory is the study of abstract machines and problems which they are able to solve. Automata theory is closely related to formal language theory as the automata are often classified by the class of formal languages they are able to recognize....
.

Reliability in program development


Requirements
A program cannot be expected to work as desired if the developers of the program do not, in fact, know the program's desired behaviour in advance, or if they cannot at least determine its desired behaviour in parallel with development, in sufficient detail. What level of detail is considered sufficient is hotly debated. The idea of perfect detail is attractive, but may be impractical, if not actually impossible, in practice. This is because the desired behaviour tends to change as the possible range of the behaviour is determined through actual attempts, or more accurately, failed attempts, to achieve it.

Whether a program's desired behaviour can be successfully specified in advance is a moot point if the behaviour cannot be specified at all, and this is the focus of attempts to formalize the process of creating requirements for new software projects. In situ with the formalization effort is an attempt to help inform non-specialists, particularly non-programmers, who commission software projects without sufficient knowledge of what computer software is in fact capable. Communicating this knowledge is made more difficult by the fact that, as hinted above, even programmers cannot always know in advance what is actually possible for software in advance of trying.

Design
While requirements are meant to specify what a program should do, design
Software design

Software design is a process of problem-solving and planning for a software solution. After the purpose and specifications of software are determined, software developers will design or employ designers to develop a plan for a solution....
 is meant, at least at a high level, to specify how the program should do it. The usefulness of design is also questioned by some, but those who look to formalize the process of ensuring reliability often offer good software design processes as the most significant means to accomplish it. Software design usually involves the use of more abstract and general means of specifying the parts of the software and what they do. As such, it can be seen as a way to break a large program down into many smaller programs, such that those smaller pieces together do the work of the whole program.

The purposes of high-level design are as follows. It separates what are considered to be problems of architecture, or overall program concept and structure, from problems of actual coding, which solve problems of actual data processing
Data processing

Computer data processing is any computering Process that converts datas into information or knowledge. The processing is usually assumed to be automated and running on a computer....
. It applies additional constraints to the development process by narrowing the scope of the smaller software components, and thereby—it is hoped—removing variables which could increase the likelihood of programming errors. It provides a program template, including the specification of interfaces, which can be shared by different teams of developers working on disparate parts, such that they can know in advance how each of their contributions will interface with those of the other teams. Finally, and perhaps most controversially, it specifies the program independently of the implementation language or languages, thereby removing language-specific biases and limitations which would otherwise creep into the design, perhaps unwittingly on the part of programmer-designers.

Programming
The history of computer programming language
Programming language

A programming language is a machine-readable artificial language designed to express computations that can be performed by a machine, particularly a computer....
 development can often be best understood in the light of attempts to master the complexity of computer programs, which otherwise becomes more difficult to understand in proportion (perhaps exponentially) to the size of the programs. (Another way of looking at the evolution of programming languages is simply as a way of getting the computer to do more and more of the work, but this may be a different way of saying the same thing.) Lack of understanding of a program's overall structure and functionality is a sure way to fail to detect errors in the program, and thus the use of better languages should, conversely, reduce the number of errors by enabling a better understanding.

Improvements in languages tend to provide incrementally what software design has attempted to do in one fell swoop: consider the software at ever greater levels of abstraction. Such inventions as statement, sub-routine, file, class, template, library, component and more have allowed the arrangement of a program's parts to be specified using abstractions such as layers, hierarchies and modules, which provide structure at different granularities, so that from any point of view the program's code can be imagined to be orderly and comprehensible.

In addition, improvements in languages have enabled more exact control over the shape and use of data elements, culminating in the abstract data type. These data types can be specified to a very fine degree, including how and when they are accessed, and even the state of the data before and after it is accessed..

Software Build and Deployment
Many programming languages such as C and Java require the program "source code" to be translated in to a form that can be executed by a computer. This translation is done by a program called a compiler
Compiler

A compiler is a computer program that transforms source code written in a programming language into another computer language . The most common reason for wanting to transform source code is to create an executable program....
. Additional operations may be involved to associate, bind, link or package files together in order to create a usable runtime configuration of the software application. The totality of the compiling and assembly process is called generically "building" the software.

The software build is critical to software quality because if any of the generated files are incorrect the software build is likely to fail. And, if the incorrect version of a program is inadvertently used, then testing can lead to false results.

Software builds are typically done in work area unrelated to the runtime area, such as the application server. For this reason, a deployment step is needed to physically transfer the software build products to the runtime area. The deployment procedure
Software deployment

Software deployment is all of the activities that make a software system available for use.The general deployment process consists of several interrelated activities with possible transitions between them....
 may also involve technical parameters, which, if set incorrectly, can also prevent software testing from beginning. For example, a Java application server may have options for parent-first or parent-last class loading. Using the incorrect parameter can cause the application to fail to execute on the application server.

The technical activities supporting software quality including build, deployment, change control and reporting are collectively known as Software configuration management
Software configuration management

In software engineering, software configuration management is the task of tracking and controlling changes in the software. Configuration management practices include revision control and the establishment of baseline ....
. A number of software tools have arisen to help meet the challenges of configuration management including file control tools
List of revision control software

This is a list of notable software for revision control....
 and build control tools
List of build automation software

Build automation is the act of scripting or automating the process of compiling computer source code into binary code. Below is a list of notable tools associated, at least in part, of the build automation process....
.

Testing

Software testing, when done correctly, can increase overall software quality of conformance by testing that the product conforms to its requirement
Requirement

In engineering, a requirement is a singular documented need of what a particular product or service should be or do. It is most commonly used in a formal sense in systems engineering or software engineering....
s. Testing includes, but is not limited to:

  1. Unit Testing
  2. Functional Testing
  3. Regression Testing
  4. Performance Testing
    Performance testing

    In software engineering, performance testing is Software testing that is performed, from one perspective, to determine how fast some aspect of a system performs under a particular workload....
  5. Failover Testing
  6. Usability Testing
    Usability testing

    Usability testing is a technique used to evaluate a product by testing it on users. This can be seen as an irreplaceable usability practice, since it gives direct input on how real users use the system....


A number of agile methodologies
Agile software development

Agile software development is a group of software development methodologies that are based on similar principles. Agile methodologies generally promote a project management process that encourages frequent inspection and adaptation, a leadership philosophy that encourages teamwork, self-organization and accountability, a set of engineering be...
 use testing early in the development cycle to ensure quality in their products. For example, the test-driven development
Test-driven development

Test-driven development is a software development technique that uses short development iterations based on pre-written test cases that define desired improvements or new functions....
 practice, where tests are written before the code they will test, is used in Extreme Programming
Extreme Programming

Extreme Programming is a software engineering methodology prescribing a set of daily stakeholder Extreme Programming#Practices that embody and encourage particular Extreme Programming#XP values ....
 to ensure quality.

Runtime
Runtime
Runtime

In computer science, runtime or run time describes the operation of a computer program, the duration of its execution, from beginning to termination ....
 reliability determinations are similar to tests, but go beyond simple confirmation of behaviour to the evaluation of qualities such as performance and interoperability with other code or particular hardware configurations.

Software Quality Factors


A software quality factor is a non-functional requirement for a software program which is not called up by the customer's contract, but nevertheless is a desirable requirement which enhances the quality of the software program. Note that none of these factors are binary; that is, they are not “either you have it or you don’t” traits. Rather, they are characteristics that one seeks to maximize in one’s software to optimize its quality. So rather than asking whether a software product “has” factor x, ask instead the degree to which it does (or does not).

Some software quality factors are listed here:

Understandability–clarity of purpose. This goes further than just a statement of purpose; all of the design and user documentation must be clearly written so that it is easily understandable. This is obviously subjective in that the user context must be taken into account: for instance, if the software product is to be used by software engineers it is not required to be understandable to the layman.

Completeness–presence of all constituent parts, with each part fully developed. This means that if the code calls a subroutine
Subroutine

In computer science, a subroutine or subprogram is a portion of computer code within a larger computer program, which performs a specific task and is relatively independent of the remaining code....
 from an external library, the software package must provide reference to that library and all required parameters must be passed. All required input data must also be available.

Conciseness–minimization of excessive or redundant information or processing. This is important where memory capacity is limited, and it is generally considered good practice to keep lines of code to a minimum. It can be improved by replacing repeated functionality by one subroutine or function which achieves that functionality. It also applies to documents.

Portability
Software portability

Portability is one of the key concepts of High-level programming language. Portability is the software codebase feature to be able to reuse the existing code instead of creating new code when moving software from an environment to another....
–ability to be run well and easily on multiple computer configurations. Portability can mean both between different hardware—such as running on a PC as well as a smartphone—and between different operating systems—such as running on both Mac OS X and GNU/Linux.

Consistency–uniformity in notation, symbology, appearance, and terminology within itself.

Maintainability
Maintainability

In software engineering, the ease with which a software product can be modified in order to:* correct defects* meet new requirements* make future maintenance easier, or...
–propensity to facilitate updates to satisfy new requirements. Thus the software product that is maintainable should be well-documented, should not be complex, and should have spare capacity for memory, storage and processor utilization and other resources.

Testability
Testability

Testability, a property applying to an empirical hypothesis, involves two components: the logical property that is variously described as contingency, defeasibility, or falsifiability, which means that counterexamples to the hypothesis are logically possible, and the practical feasibility of observing a reproducibility series of such count...
–disposition to support acceptance criteria and evaluation of performance. Such a characteristic must be built-in during the design phase if the product is to be easily testable; a complex design leads to poor testability.

Usability–convenience and practicality of use. This is affected by such things as the human-computer interface. The component of the software that has most impact on this is the user interface (UI), which for best usability is usually graphical (i.e. a GUI).

Reliability–ability to be expected to perform its intended functions satisfactorily. This implies a time factor in that a reliable product is expected to perform correctly over a period of time. It also encompasses environmental considerations in that the product is required to perform correctly in whatever conditions it finds itself (sometimes termed robustness
Robustness

Robustness is the quality of being able to withstand stresses, pressures, or changes in procedure or circumstance. A system, organism or design may be said to be "robust" if it is capable of coping well with variations in its operating environment with minimal damage, alteration or loss of functionality....
).

Structuredness–organisation of constituent parts in a definite pattern. A software product written in a block-structured language such as Pascal
Pascal (programming language)

Pascal is an influential imperative programming and Procedural programming programming language, designed in 1968/9 and published in 1970 by Niklaus Wirth as a small and efficient language intended to encourage good programming practices using structured programming and data structure....
 will satisfy this characteristic.

Efficiency
Efficiency

Efficiency may refer to:...
–fulfillment of purpose without waste of resources, such as memory, space and processor utilization, network bandwidth, time, etc.

Security–ability to protect data against unauthorized access and to withstand malicious or inadvertent interference with its operations. Besides the presence of appropriate security mechanisms such as authentication, access control and encryption, security also implies resilience in the face of malicious, intelligent and adaptive attackers.

Measurement of software quality factors

There are varied perspectives within the field on measurement. There are a great many measures that are valued by some professionals—or in some contexts, that are decried as harmful by others. Some believe that quantitative measures of software quality are essential. Others believe that contexts where quantitative measures are useful are quite rare, and so prefer qualitative measures. Several leaders in the field of software testing
Software testing

Software Testing is an empirical investigation conducted to provide stakeholders with information about the quality of the product or service under test , with respect to the context in which it is intended to operate....
 have written about the difficulty of measuring what we truly want to measure well, including Dr. Cem Kaner (PDF) and Douglass Hoffman (PDF).

One example of a popular metric is the number of faults encountered in the software. Software that contains few faults is considered by some to have higher quality than software that contains many faults. Questions that can help determine the usefulness of this metric in a particular context include:
  1. What constitutes “many faults?” Does this differ depending upon the purpose of the software (e.g., blogging software vs. navigational software)? Does this take into account the size and complexity of the software?
  2. Does this account for the importance of the bugs (and the importance to the stakeholders of the people those bugs bug)? Does one try to weight this metric by the severity of the fault, or the incidence of users it effects? If so, how? And if not, how does one know that 100 faults discovered is better than 1000?
  3. If the count of faults being discovered is shrinking, how do I know what that means? For example, does that mean that the product is now higher quality than it was before? Or that this is a smaller/less ambitious change than before? Or that fewer tester-hours have gone into the project than before? Or that this project was tested by less skilled testers than before? Or that the team has discovered that fewer faults reported is in their interest?


This last question points to an especially difficult one to manage. All software quality metrics are in some sense measures of human behavior, since humans create software(PDF). If a team discovers that they will benefit from a drop in the number of reported bugs, there is a strong tendency for the team to start reporting fewer defects. That may mean that email begins to circumvent the bug tracking system, or that four or five bugs get lumped into one bug report, or that testers learn not to report minor annoyances. The difficulty is measuring what we mean to measure, without creating incentives for software programmers and testers to consciously or unconsciously “game” the measurements.

Software quality factors cannot be measured because of their vague definitions. It is necessary to find measurements, or metrics, which can be used to quantify them as non-functional requirements. For example, reliability is a software quality factor, but cannot be evaluated in its own right. However, there are related attributes to reliability, which can indeed be measured. Some such attributes are mean time to failure, rate of failure occurrence, and availability of the system. Similarly, an attribute of portability is the number of target-dependent statements in a program.

A scheme that could be used for evaluating software quality factors is given below. For every characteristic, there are a set of questions which are relevant to that characteristic. Some type of scoring formula could be developed based on the answers to these questions, from which a measurement of the characteristic can be obtained.

Understandability
Are variable names descriptive of the physical or functional property represented? Do uniquely recognisable functions contain adequate comments so that their purpose is clear? Are deviations from forward logical flow adequately commented? Are all elements of an array functionally related?

Completeness
Are all necessary components available? Does any process fail for lack of resources or programming? Are all potential pathways through the code accounted for, including proper error handling?

Conciseness
Is all code reachable? Is any code redundant? How many statements within loops could be placed outside the loop, thus reducing computation time? Are branch decisions too complex?

Portability
Does the program depend upon system or library routines unique to a particular installation? Have machine-dependent statements been flagged and commented? Has dependency on internal bit representation of alphanumeric or special characters been avoided? How much effort would be required to transfer the program from one hardware/software system or environment to another?

Consistency
Is one variable name used to represent different logical or physical entities in the program? Does the program contain only one representation for any given physical or mathematical constant? Are functionally similar arithmetic expressions similarly constructed? Is a consistent scheme used for indentation, nomenclature, the color pallette, fonts and other visual elements?

Maintainability
Has some memory capacity been reserved for future expansion? Is the design cohesive—i.e., does each module have distinct, recognisable functionality? Does the software allow for a change in data structures (object-oriented designs are more likely to allow for this)? If the code is procedure-based (rather than object-oriented), is a change likely to require restructuring the main program, or just a module?

Testability
Are complex structures employed in the code? Does the detailed design contain clear pseudo-code? Is the pseudo-code at a higher level of abstraction than the code? If tasking is used in concurrent designs, are schemes available for providing adequate test cases?

Usability
Is a GUI used? Is there adequate on-line help? Is a user manual provided? Are meaningful error messages provided?

Reliability
Are loop indexes range-tested? Is input data checked for range errors? Is divide-by-zero avoided? Is exception handling provided?

Structuredness
Is a block-structured programming language used? Are modules limited in size? Have the rules for transfer of control between modules been established and followed?

Efficiency
Have functions been optimized for speed? Have repeatedly used blocks of code been formed into subroutines? Has the program been checked for memory leaks or overflow errors?

Security
Does the software protect itself and its data against unauthorized access and use? Does it allow its operator to enforce security policies? Are security mechanisms appropriate, adequate and correctly implemented? Can the software withstand attacks that can be anticipated in its intended environment? Is the software free of errors that would make it possible to circumvent its security mechanisms? Does the architecture limit the potential impact of yet unknown errors?

User's perspective

In addition to the technical qualities of software, the end user's experience also determines the quality of software. This aspect of software quality is called usability
Usability

Usability is a term used to denote the ease with which people can employ a particular tool or other human-made object in order to achieve a particular goal....
. It is hard to quantify the usability of a given software product. Some important questions to be asked are:
  • Is the user interface
    User interface

    The user interface is the aggregate of means by which people—the User s—Interaction with the system—a particular machine, device, computer program or other complex tools....
     intuitive (self-explanatory/self-documenting
    Self-documenting

    In computer programming, self-documenting is a common descriptor for source code that follows certain loosely-defined conventions for Naming conventions and Structured programming....
    )?
  • Is it easy to perform simple operations?
  • Is it feasible to perform complex operations?
  • Does the software give sensible error message
    Error message

    An error message is a message displayed when an unexpected condition occurs, usually on a computer or other device. Error messages are often displayed using dialog boxes....
    s?
  • Do widgets
    Widget (computing)

    In computer programming, a widget is an element of a graphical user interface that displays an information arrangement changeable by the user, such as a window or a text box....
     behave as expected?
  • Is the software well documented
    Software documentation

    Software documentation or source code documentation is written text that accompanies computer software. It either explains how it operates or how to use it, and may mean different things to people in different roles....
    ?
  • Is the user interface responsive or too slow?


Also, the availability of (free or paid) support may factor into the usability of the software.

See also

  • ISO 9126
    ISO 9126

    ISO 9126 is an international standard for the evaluation of software quality. The fundamental objective of this standard is to address some of the well known human biases that can adversely effect the delivery and perception of a software development project....
  • Software Process Improvement and Capability Determination - ISO 15504
    ISO 15504

    ISO/IEC 15504 also known as SPICE is a "framework for the assessment of processes" developed by the Joint Technical Subcommittee between ISO and IEC ....
  • Software testing
    Software testing

    Software Testing is an empirical investigation conducted to provide stakeholders with information about the quality of the product or service under test , with respect to the context in which it is intended to operate....
  • Quality
    Quality

    Quality may refer to:Concepts:* Quality * Quality , an attribute or a property* Quality , which has separate meanings in thermodynamics and harmonics...
    : Quality control
    Quality control

    In engineering and manufacturing, quality control and quality engineering are used in developing systems to ensure product s or Service are designed and produced to meet or exceed customer requirements....
    , Total Quality Management
    Total Quality Management

    Total Quality Management is a business management strategy aimed at embedding awareness of Quality in all organizational processes. TQM has been widely used in manufacturing, education, call centers, government, and service industry, as well as NASA space and science programs....
  • Capability Maturity Model
    Capability Maturity Model

    The Capability Maturity Model in software engineering is a model of the maturity of the capability of certain business processes. A maturity model can be described as a structured collection of elements that describe certain aspects of maturity in an organization, and aids in the definition and understanding of an organization's processes....
  • Software Engineering
    Software engineering

    Software engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software, and the study of these approaches....
  • Performance Engineering
    Performance Engineering

    Within systems engineering, performance engineering encompasses the set of roles, skills, activities, practices, tools, and deliverables applied at every phase of the Systems Development Lifecycle which ensures that a solution will be designed, implemented, and operationally supported to meet the non-functional requirements defined for the so...
  • Assertion (computing)
    Assertion (computing)

    In computer programming, an assertion is a First-order logic placed in a program to indicate that the developer thinks that the predicate is always true at that place....
  • Splint (programming tool)
    Splint (programming tool)

    Splint, short for Secure Programming Lint, is a programming tool for Static code analysis C for security vulnerability and coding mistakes....
    • Optimization (computer science)
      Optimization (computer science)

      In computing, optimization is the process of modifying a system to make some aspect of it work more efficiently or use fewer resources. For instance, a computer program may be optimized so that it executes more rapidly, or is capable of operating with less Computer data storage or other resources, or draw less power....
    • Algorithmic efficiency
      Algorithmic efficiency

      In computer science, efficiency is used to describe properties of an algorithm relating to how much of various types of resources it consumes. The two most frequently encountered are...
    • Performance analysis
      Performance analysis

      In software engineering, performance analysis, more commonly today known as profiling, is the investigation of a program's behavior using information gathered as the program executes ....
  • Order
    Order (information processing)

    Order is a measure of the number of objects or sub-systems in a system as seen by an observation.See also Information processing...
    • Programming paradigm
      Programming paradigm

      A programming paradigm is a fundamental style of computer programming. . Paradigms differ in the concepts and abstractions used to represent the elements of a program and the steps that compose a computation ....
    • Programming style
      Programming style

      Programming style is a set of rules or guidelines used when writing the source code for a computer program. It is often claimed that following a particular programming style will help programmers to read and understand source code conforming to the style, and help to avoid introducing errors....
    • Software architecture
      Software architecture

      The software architecture of a program or computing system is the structure or structures of the software system, which comprise software components, the externally visible properties of those components, and the relationships between them....
  • Software metric
    Software metric

    A software metric is a measure of some property of a piece of software or its specifications.Since quantitative methods have proved so powerful in the other sciences, computer science practitioners and theoreticians have worked hard to bring similar approaches to software development....
    s
    • Cyclomatic complexity
      Cyclomatic complexity

      Cyclomatic complexity is a software metric . It was developed by Thomas J. McCabe in 1976 and is used to measure the complexity of a program. It directly measures the number of linearly independent paths through a program's source code....
    • Cohesion
      Cohesion (computer science)

      In computer programming, cohesion is a measure of how strongly-related and focused the various responsibilities of a software module are. Cohesion is an level of measurement#Ordinal measurement type of measurement and is usually expressed as "high cohesion" or "low cohesion" when being discussed....
       and Coupling
      Coupling (computer science)

      In computer science, coupling or dependency is the degree to which each program module relies on each one of the other modules.Coupling is usually contrasted with cohesion ....
  • Standards (software)
    Standards (software)

    Software standard is a standard in software, which is particularly essential in software interroperatibility....
  • Software reusability
  • Ilities
    Ilities

    Within systems engineering, quality attributes are Non-Functional Requirements used to evaluate the performance of a system. These are sometimes named "ilities" after the suffix many of the words share....
    • Accessibility
      Accessibility

      Accessibility is a general term used to describe the degree to which a product is accessible by as many people as possible. Accessibility can be viewed as the "ability to access" the functionality, and possible benefit, of some system or entity....
    • Availability
      Availability

      In telecommunications and reliability theory, the term availability has the following meanings:1. The degree to which a system, subsystem, or equipment is operable and in a committable state at the start of a mission, when the mission is called for at an unknown, i.e., a random, time....
    • Dependability
      Dependability

      Dependability is a value showing the reliability of a person to others because of his/her integrity, truthfulness, and trustfulness, traits that can encourage someone to depend on him/her....
  • Security
    Security

    Security is the degree of protection against danger, loss, and criminals. Individuals or actions that encroach upon the condition of protection are responsible for a "breach of security."...
  • Security engineering
    Security engineering

    Security engineering is a specialized field of engineering that deals with the development of detailed engineering plans and designs for security features, controls and systems....
  • bugs
  • Anomaly in software
    Anomaly in software

    In software testing an anomaly is anything that differs from expectation. This expectation can result from many things like from a document or from a person's view or experiences ....
  • Software Quality Model
    Software Quality Model

    Software quality can be defined as 'conformance to requirements' and/or 'fitness of use'. Quality achievements start with a loud and clear definition of what "quality of source code" means to your organization or project....
  • Software Quality Assurance
    Software quality assurance

    Software quality assurance consists of a means of monitoring the software engineering processes and methods used to ensure quality. The methods by which this is accomplished are many and varied, and may include ensuring conformance to one or more standards, such as ISO 9000 or CMMI....
  • Software Quality Observatory for Open Source Software
    SQO-OSS

    SQO-OSS is an Information Society Technologies-funded initiative aiming to create a platform and the associated tools to measure the software quality....


Further reading

  • International Organization for Standardization. Software Engineering—Product Quality—Part 1: Quality Model. ISO, Geneva, Switzerland, 2001. ISO/IEC 9126-1:2001(E).
  • Diomidis Spinellis. . Addison Wesley, Boston, MA, 2006.
  • Ho-Won Jung, Seung-Gweon Kim, and Chang-Sin Chung. . IEEE Software, 21(5):10–13, September/October 2004.
  • Stephen H. Kan. Metrics and Models in Software Quality Engineering. Addison-Wesley, Boston, MA, second edition, 2002.
  • Robert L. Glass. Building Quality Software. Prentice Hall, Upper Saddle River, NJ, 1992.