Categories
Notes Old site

Criteria for good software

What is the difference between good software and bad software? It is reasonably easy to recognise the extremes when we encounter them, but there is a set of criteria that can be used to explain the differences. These criteria are also useful when building or modifying software, as they can be used to help make design decisions.

Good software has the following characteristics:

  • Correctness: it produces the right results and exhibits the right behaviour.
  • Usability: the user finds it easy to make it perform the desired functions.
  • Maintainability: it can be easily maintained and updated.
  • Availability: it is available (ie, will run) when it is needed.
  • Useful: it performs a task that someone wants performed.

It is often thought that performance should be another criterion, but in my view the need for good performance results from the usability and availability criteria.

These criteria apply to every kind of software, including spreadsheets. Spreadsheets are an interesting case because it is difficult to tell the difference between usability and maintainability, as one of their main uses is to be updated and enhanced.

Resources

The following external links are relevant:

Categories
Notes Old site

Usability

One of the criteria for good software is that the software is usable. If it is difficult to use, it will meet one of several fates: either it won’t be used, or it will take much longer to use than it should, or it will be used in the wrong way and will produce invalid results. None of these outcomes is desirable.

When looking at usability, it is important to consider all the possible users, their goals in using the software, and the context in which they use it. For instance, technical terms that are second nature to one group of users might be totally meaningless to others. This is particularly important for user-developed software, such as spreadsheets, where the developers often have a very different outlook to other users.

Usability means making it easy for the user to do the right thing, and difficult for them to do the wrong thing. It can be affected by the physical layout of the interface (whether graphical or text based), the wording of any text, the order in which operations must be performed, and many other factors. One of the trickiest aspects of achieving good usability is that it is often difficult to predict how users will react, especially if you are not a typical user yourself. The only way to get it right is to test the software with real users, and take note of what they say.

Categories
Notes Old site

Maintainability

Good software must be maintainable. It is very rarely the case that a piece of software is developed once and then never nedds to be changed again during its lifetime. This is especially true of user-developed software such as spreadsheets, whose big advantage is that they are easily modified.

Even if the requirements do not change, any reasonably sized piece of software is most unlikely to work properly at first; changes will have to be made in order to remove bugs. In fact, the whole process of development can be seen as one of maintenance, starting from a situation in which nothing works at all.

In the worst case, a simple change requires the whole piece of software to be rewritten from scratch. In the best case, really quite significant changes to the functionality require only small changes in the code. The secret is to write good code and to document it effectively. In this context, good code is code that uses techniques of abstraction and modularity.

Resources

The following external links are relevant:

Categories
Notes Old site

Usefulness

There is no point in building a piece of software if it is not going to be used, and it won’t be used unless it is useful to someone. There is often a temptation to build something just because you can: you can see a really nifty way of doing it, and fancy the challenge or think it would be cool. It is a temptation that should usually be resisted.

This applies at all levels of software development, to individual features as well as to entire software systems.

For example, if there is a simple task that is currently performed manually, and you are thinking of automating it, you should look very carefully at what would be gained. Would the new system be easier or quicker to use, would it provide more information, or would it be less likely to result in errors? Unless the answers to these and similar questions are extremely positive, you should be very wary of going ahead.

You should ask similar questions when considering introducing a system or feature that will provide completely new functionality. Is anyone actually interested in this functionality? Will the benefits of using it outweigh the inconvenience? Remember that you, as the developer or designer, may not fully understand the priorities of the users.

Categories
Notes Old site

Availability

There is no point in building a software system unless it is available for use. Availability can be compromised in a number of ways:

  • The software doesn’t run on the equipment available to the users
  • It often crashes
  • The network over which it runs is unreliable

Availability is often an issue with real time systems, but can be significant in other situations too. For example, consider a software system that is used in preparing quarterly financial results, but takes longer than three months to update. If changes are needed, there is a conflict between providing the functionality that is required, and providing any functionality at all. Obviously this example has been exaggerated for effect, but the point is that availability can be affected by maintenance requirements as well as by physical problems.

Categories
Notes Old site

Performance

Performance can affect usability, usefulness and availability.

Software that takes too long to perform its functions rapidly becomes difficult and unpleasant to use, thus making it both less useful and less usable. For real time systems, of course, performance is even more of an issue and is an important aspect of correctness.

The other aspect of performance is the amount of memory and storage that is used. These are less of a problem nowadays than they used to be, but can still be a limiting factor. Even today’s large disks can eventually run out of space, and some systems run very slowly if at all if not enough memory is present. The system then becomes effectively unavailable for use.

Categories
Notes Old site

User-developed software

User-developed software is, as its name suggests, software that is developed by users rather than by specialist developers. It includes spreadsheets, parameter driven financial models, personal databases, VB code, and so on.

Caution: user-developed systems may be hazardous to your organization
Davis, 1981

User-developed software has many advantages, and can really leverage the expertise of those users. You, the users, maintain control over the system being developed; you hope for rapid turnaround on modifications; and a whole layer of communication is removed from between the concepts being modelled and the people doing the implementation.

However, the expertise of the user is unlikely to included extensive software engineering experience. Many systems developed by users end up being very large and complex, and are not as easy to maintain and enhance as they should be. Moreover, as they are often not subject to rigorous quality controls, they may contain significant bugs, be hard to use and lack robustness.

Resources

The following external links are relevant:

Categories
Notes Old site

Dynamic Ranges

Usually, when you specify a range in a formula, you specify it through its address: for example, $B$5:$C$10. However, you can specify ranges through formulae, effectively making them dynamic.

There are a number of formulae you can use to specify dynamic ranges, including OFFSET and IF.

Using the OFFSET formula to define a dynamic range

The formula that is most often used to define a dynamic range is OFFSET. The result of an OFFSET formula is a range. You have to specify the top left hand corner and the dimensions.

Specifically, there are five arguments:

  • Reference: A range that forms the basis of the new range. This can be a single cell, or a range of adjacent cells.
  • Rows: The number of rows up (negative) or down (positive) from the top of the reference range that you want the new range to start at.
  • Cols: The number of columns left (negative) or right (positive) from the left of the reference range that you want the new range to start at.
  • Height: The height (number of rows) of the new range. This argument is optional. If you omit it, the new range will have the same number of rows as the reference range.
  • Width: The width (number of colums) of the new range. This argument is optional. If you omit it, the new range will have the same number of columns as the reference range.

So, for example, the result of the formula OFFSET($B$5:$C$10, 3, -1) would be the range A8:B13: it starts 3 rows down and one column to the left of B5, and has 6 rows and 2 columns, just like the range $B$5:$C$10.

The real utility of this formula comes when you use formulae for some of the arguments, and define a name to refer to it.

For example, suppose you have monthly sales data in a spreadsheet; you want to plot a chart, but don’t want to edit the chart each time you update the sales data.

sales data in column B

You can define a name SalesData to refer to the following formula:
=OFFSET(chartData!$B$5,0,0,COUNT(chartData!C:C)-COUNT(chartData!$B$1:$B$4),1)
and then set the data series in the chart to refer to SalesData.

You can then update the chart simply by adding a new line of data.

Note that we have to be a bit careful how we specify the number of rows in the dynamic range, so as not to count any values that are not sales data.

Using IF to define a dynamic range

There is an even simpler way to define a dynamic range, which is especially useful for data validation. Suppose you have related sets of options: if you choose a service level of premier, for example, you can choose one of three delivery methods, but if the service level is standard, you only have a choice of two.

sales data in column B

For the cell B5 we can set the data validation type to list and enter the following formula as the range:
=IF($B$4="Premier", $E$3:$E$5,$E$4:$E$5)
The drop down box for cell B5 will then show the valid delivery options for the service level chosen in cell B4.

Categories
Notes Old site

Operational Risk

Operational risk is gaining an increasingly high profile. In the UK, the Turnbull report recommended that listed companies should manage their operational risk explicitly; and the FSA includes operational risk in its new ARROW framework for risk assessment.

Historically (though the history is admittedly rather short), operational risk has received most attention from the banking industry. This is still evident in much of the published literature; often the authors simply assume that the industry in question is banking, without explicitly saying so. This can be confusing.

Definition

The FSA, following Basel, defines operational risk:

Operational risk is the risk of loss, resulting from inadequate or failed internal processes, people and systems or from external events.

This definition gives a reasonable idea of operational risk, but is not detailed enough for operational use. For purposes of risk identification, assessment, control and mitigation the definition must be refined so that it is a clearcut decision as to which risks are included and which are not.

In addition, the final phrase or from external events must be interpreted appropriately for the organization in question. For example, for a general insurance company the losses due to paying out claims for an earthquake should not be counted as an operational loss, whereas the losses due to the destruction of head office by the same earthquake should.

Resources

The following external links are relevant:

Categories
Notes Old site

Software Risk

Software risk is a form of operational risk: it consists of the risks of using software.

The principal components are:

  • Erroneous results. The software produces the wrong results.
  • No results. The software fails to produce results, or fails to produce them by the time at which they are needed.
  • High costs. The results are accurate, and appear on time, but at a very high cost.

These risks apply whether the software is developed in-house or externally and whether by professional developers or users (see user-developed software. Problems can be caused by:

  • Bugs
  • Usability issues
  • Development delays
  • Misunderstood requirements

among other causes.

Resources

The following external links are relevant: