INCREMENTAL DEVELOPMENT AND DELIVERY
FOR LARGE SOFTWARE SYSTEMS

DOROTHY R. GRAHAM
Software Engineering Consultant
Grove Consultants,
Grove House, 40 Ryles Park Road,
Macclesfield, Cheshire SK11 8AH, UK
Tel +44 1625 616279
Fax +44 1625 619979

ABSTRACT
Life cycle models have arisen in order to bring control to the process of software development. Two aspects of life cycles have provided benefits: the ordering of development phases, and the modularisation of the development process to give discipline and control. The third aspect, production of systems monolithically, is not beneficial for large systems.

Incremental development is the development of a system in a series of partial products, generally with increasing functionality, throughout the project timescale; incremental delivery gives those increments to the users when they are completed. An increment is complete when all the associated life cycle products are finished, including testing, training, and documentation. There are significant benefits both for developers and users, but there are also significant problems. In particular, more discipline is needed to manage incrementally, particularly good configuration management.

An earlier paper [1] gave an extensive bibliography of incremental development and delivery. This paper summarises the types of incremental development with particular reference to large system development, and gives additional recent references.

1. INTRODUCTION

Life Cycle models such as the Waterfall or V-models have been developed in order to bring control to the process of software production. There are three key aspects embodied in such models:

It is my contention in this paper that the first two aspects of monolithic life cycle models have provided the benefits which have been achieved, but the third aspect does not scale up for large system development and may actually be detrimental.

2. SOFTWARE DEVELOPMENT PROBLEMS

Although significant improvements in the development of software systems have been achieved in recent years, there are still significant problems remaining. Monolithic software development is generally fixed at the earliest possible time, both in terms of cost and schedule. In order to meet tight contractual restrictions, the Requirements Specification is produced either before or soon after the start of development, and is then "frozen"; i.e. changes to the requirements are strongly discouraged.

2.1 Estimation

It is difficult to estimate the cost, effort, time or size of large systems with a high degree of accuracy. This is not unique to software development projects, it also affects other engineering disciplines. Being able to foresee the future with unerring accuracy is not a task which is easily done, by people or by machines. The real world does not stand still while large systems are developed; new products and processes are discovered, underlying assumptions are invalidated, new laws are passed, and developers learn new things, which would have enabled them to build a better system, if only they had known those things at the beginning. It is a common experience at the end of development to know how it should have been done.

2.2 Changing Requirements

Knowing how it should have been done is also a common reaction of users when they first see the new system they have asked for. A widespread response when using the new system for the first time is: "That is not what I want". It is much easier to "know it when you see it" than to say what it is that you want before you see it.

This effect occurs even when users have been extensively involved in specifying the system (but then they should add, "even though it is what I asked for"). User knowledge also grows throughout system development; the users cannot ask for what they will really need because they cannot see into the future with unerring accuracy either.

The point is made by Floyd, Reisen and Schmidt that "requirements are not 'given' and therefore cannot, strictly speaking, be analyzed." Rather, they are gradually established through interaction between users and developers. [2]

These two aspects of developing knowledge are illustrated in Figure 1 below. Both user knowledge and developer knowledge increase with time. System A, which is specified at the beginning of development reflects the minimum of that growing body of knowledge for both parties. System B is the system which the developer would have built with hindsight, and System C is the system which the customer would have asked for with hindsight. System D is the system which is actually required at the end of development.


Figure 1. Increasing knowledge throughout development.

2.3 Testing and Maintenance

Significant problems are experienced in the testing and maintenance of large systems. Testing typically takes 40% of the software development effort for any sized system, with testing of real-time systems often taking up to 80% of the development time. Testing of large software systems is difficult, but with the monolithic life cycle, the major dynamic execution testing of the software is done at the end of development. Verification and validation procedures help to produce better quality intermediate life cycle products, but they are no substitute for testing the real end product.

If development takes longer than expected and schedules slip, then it is likely that testing will also take longer than expected. However, the end date has a tendency to remain fixed in time, so the testing schedule is compressed rather than extended. Problems which are built into the software are only discovered late in development, when there is no time to put them right. If testing is difficult, why do we leave it till last?

With some types of development, testing is constrained by the development of hardware, for example, so that testing cannot be done early. However, other types of system can begin testing much earlier in the development timescale than the monolithic life cycle implies, with considerable benefits.

Maintenance can typically account for 80% of the total system costs. A major aspect of the early maintenance of a finished system is to create the system which should have been asked for and built, if only users and developers had the benefit of hindsight. In the diagram above, System A is delivered, but maintenance then progresses the system to System D (and beyond). A frozen specification can only hope to meet a frozen need.

2.4 Customer Confidence (lack of)

Figure 2 below illustrates the confidence levels which occur with both monolithic and incremental development models.

Confidence is initially high with both approaches, probably higher for the monolithic approach at the start because it is the accepted way to do things.

During lengthy development, however, customer confidence drops off, as no working product is yet visible, developers talk in techno-speak, and delays are announced. If delivery of the system comes before all confidence is lost, there is hope of recovery, but if confidence goes below a certain point, then no matter how good the system is technically, it will not be accepted by users.

This user resistance may be dormant during monolithic analysis and implementation, emerging when the system becomes operational, and taking the form of sabotage, scapegoating, or incorrect use of the system. [3]

An incremental approach produces a working product much earlier than a monolithic approach. The initial reaction to seeing this is usually "This is not what I want", leading to an initial loss of confidence, although the delivery of an increment on time is generally a refreshing change for customers.

By developing incrementally towards the needed system (rather than the specified system), confidence is restored to a high level which is then maintained and increased.

Figure 2. Customer Confidence throughout development.

3. THE THREE-DIMENSIONAL WATERFALL MODEL

The Waterfall model is taken as illustrative and representative of monolithic life cycle models. It is usually shown in a form similar to Figure 3 below. The Requirements Specification (RS) should be done first, followed by System Design (SD), Detailed Design (DD), Code and Test (C&T), and Integration and Test (I&T).


Figure 3. The Waterfall Model

Monolithic life cycle models recommend that each phase be completed before starting on the next phase. In practice, this never occurs; there is always some reworking of baselined products from previous phases.

In monolithic development, the working system in its entirety is delivered at the end of the whole development process.

The waterfall model does not show what is actually being recommended, however. It is really a two-dimensional representation of a three-dimensional object. A three-dimensional model, Figure 4, shows more accurately the time sequence of development. Each horizontal "slab" should be completed before starting on the next one.


Figure 4. The Three-dimensional Waterfall Model.

4. INCREMENTAL DEFINITIONS

An incremental approach postpones detail in some or all phases to produce working software earlier in the project development timescale. The basic idea is to develop the system in a vertical slice rather than a horizontal slab.

4.1 Incremental Development

Incremental Development is the development of a system in a series of partial products (increments) throughout the project timescale.

4.2 Incremental Delivery

Incremental Delivery is the delivery of increments to the customer/users at intervals throughout the project timescale.

Note: A system can be developed incrementally without being delivered incrementally to users, but not vice versa.

4.3 Increment

An Increment is a self-contained functional unit of software, together with all supporting material, including:

- requirements specification,

- design documentation,

- test plans, cases and results,

- user manuals and training,

- estimates, plans, schedules, resourcing,

- quality assurance information (e.g. review reports)

- configuration management information.

An increment produces (or alters) a cross-section of the final system deliverables, related to a functional portion of the final system.

Incremental development is the construction of a software system in a series of small mini-life-cycles, rather than construction in one large monolithic life cycle.

In the following sections, a number of incremental life cycle models are shown.

5. INCREMENTAL LIFE CYCLE MODELS

5.1 Incremental Build and Test


Figure 5. Incremental Build and Test.

The incremental build and test approach begins the incremental development in the coding phase, with the previous phases being monolithic. Examples are given in Deutsch [4] and Wong [5] among others.

Many developers go some way toward this approach informally, although often without the complete set of life cycle documentation. Since this is not what is recommended by the monolithic waterfall model, the developers may feel guilty that they are not following the model correctly; better results will be obtained from following the incremental build and test approach intentionally rather than accidentally.

5.2 Evolutionary Delivery


Figure 6. Evolutionary Delivery

Evolutionary delivery as described by Gilb [6] is shown in Figure 6, and is the most extreme incremental approach, defining the increments from the top of the life cycle. Gilb's method includes incremental delivery as well as incremental development, and therefore has useful working facilities available to the customers much earlier than other life cycle models.

The diagram shown actually does not do justice to the evolutionary delivery method, however, since there is a higher level process which precedes the incremental steps, consisting of setting system and business objectives, open architecture design, planning and quality assurance.

The evolutionary deliveries are made at frequent intervals (possibly as small as a week), and consist of some function, facility, or organisational change which is useful to the customer and relatively easy to produce. In fact that ratio is used to determine the order of the increments.

A major effect of evolutionary delivery is to elicit requests for change, mainly from users ("that isn't what we want"). However, these change requests may be "folded back" into the development process at significantly less cost than for monolithic models, for two reasons. First, change is expected and planned for, so it does not come as an unwelcome surprise. Secondly, when requirements have been completely detailed and designed (in the monolithic approach), changes which are requested will affect the work already invested in the frozen specification. With incremental development, requested changes which affect those areas which have not yet been completely detailed, do not result in discarding work already done. Change can be turned to advantage, provided it is controlled.

5.3 Framework Incremental Life Cycle


Figure 7. Framework Incremental Life Cycle

Just as one extreme being wrong does not imply that the other extreme is right, a framework incremental approach may be the "best of both worlds", by providing a compromise between the monolithic waterfall and Gilb's evolutionary delivery. Enough of the initial requirements specification and architectural design is done so that the direction and structure of the system produced is clear enough to direct the software development process. This approach can still give useful products very early in the development timescale. An example of this type of approach is the specification of the structure and interfaces for a database, with detailed facilities to be specified later.

A similar method recently described by Hill [7] as a hybrid between "conservative" and "radical" top-down approaches has been found to work successfully. See also Redmill [8] and Krzanik [9].

5.4 Phased Development


Figure 8. Phased Development

Phased development has frequently been used in the development of large systems, and is a step in the right direction. The difference between a very small phase and a large increment is not distinct. However, phases tend to be large and growing; there is a tendency to put as much as possible into the current phase. There is also a temptation to compensate for timescale slippage by bringing forward the later phases to overlap the earlier ones. This approach can result in severe incompatibility between successive phase products. The emphasis with incremental development is to include as little as possible, i.e. as little as would be useful into each increment.

5.5 Prototyping
Prototyping is usually regarded as the building of a small system (or two) before building the big one. The knowledge gained in either building or using the prototype is then used in building the "real" system. A good description of the prototyping approach, combined with risk analysis, is given by Boehm [10].

"Rapid prototyping" is used to describe the building of systems using software tools such as code generators, report generators, or Fourth Generation Languages (4GL's). A recent book called "Structured Rapid Prototyping" by Connell and Shafer [11] gives guidance in the development of systems incrementally.

Prototypes are used to reduce risk in the applications area (a novel design, function or performance), or to reduce risk in the user interface area. (The users should then recognise the final system as what they had approved as a prototype.)

However, in a long development timescale, with several years between deliveries of prototypes, the requirements may change extensively, so that it is difficult to relate new requirements to the old prototypes. New hardware capacity, newer user interface styles and graphical capabilities seen on personal computers can make a prototyped user interface seem very old-fashioned.

It is not always possible to predict in advance of development whether a prototype will be thrown away, incorporated or built upon. Prototypes are classified in terms of their use into experimental, exploratory, or evolutionary prototypes. (Floyd [12]) Prototypes can also be classified in terms of their relationship to the life cycle as Throw-Away, Incorporated, or Incremental,. (Ince and Hekmatpour [13]).

5.5.1 Throw-Away Prototype


Figure 9. Throw-Away Prototype

If the prototype is written with the intention of throwing it away, then it is unlikely (and unnecessary) for it to be developed to the same standards as a "real" development. This type of prototyping is sometimes called "quick and dirty". The prototype can be discarded as soon as development of the large system begins (the first bin in the diagram), or it can be kept and possibly used by the customer until the large system is actually delivered and finished (the second bin). There is a tendency for users to become fond of a well-used prototype and be reluctant to throw it away.

A throw-away prototype can be used as an animated requirements specification; if the prototype looks and interacts in a way which is liked and approved by the customer, then the final system can be tested to ensure that it looks and behaves in the same way.

5.5.2 Incorporated Prototype


Figure 10. Incorporated Prototype

Part or all of the prototype can be incorporated into the final system software product, either code, design, or requirements. If a prototype has any possibility of becoming incorporated, the software engineering discipline and standards applied to its development should be consistent with the desired quality of the final product.

5.5.3 Incremental Prototype

An incremental prototype is the development of the system in a series of prototypes which are integrated together to become the final system. This therefore looks the same as the Evolutionary approach shown in Figure 6, but possibly without incremental delivery or the higher level of overall objectives, open architecture and planning of Gilb's approach.

5.6 Tool-intensive Incremental Development


Figure 11. Tool-Intensive Incremental Development

Software development tools are becoming capable of automating "higher up" the life cycle, i.e. code can now be generated directly from detailed design specifications. At the same time, requirements are being specified in increasingly more formal notations.

These two trends give the possibility of eventually automating the entire life cycle. Semi-formal specification methods such as SSADM, Jackson, Yourdon and others may eventually be automated. Mathematically based formal methods such as VDM, Z, and OBJ are rigourous enough to automate now. There is already a commercial tool (ObjEx) [14] which automates specifications written in OBJ.

Although current approaches suffer from severe performance limitations, future hardware and software development will continue to ameliorate performance problems. Ultimately we are left with only two phases: specifying requirements and testing. If this happens, it would not be sensible to specify all requirements before getting something working, and software development will naturally follow an incremental cycle.

6. INCREMENTAL DEVELOPMENT RESEARCH

There is a large body of research in the area of incremental development as described in Graham [1] for a comprehensive overview, Gilb [6] for historical development and general inspiration, Ince and Hekmatpour [13] on prototyping, Agresti [15] for discussion of new paradigms, and Law and Longworth [16] for strategic considerations.

Guidance for implementing incremental development and delivery can be found in Deutsch [4] for incremental build and test, Gilb [6] for evolutionary delivery, Connell & Shafer [11] for tool-intensive (4GL) development. An interactive incremental development methodology called "STEPS" (Software Technology for Evolutionary Participative System Development) is given in Floyd, Reisen and Schmidt [2]. Michael Jackson has recently launched an incremental development methodology called "ISE" (Incremental Software Engineering) [17].

Reported experience in the use of incremental development is scarce. The design of a prototype for a large system is described in Harker [18]. Other references have been given in Graham [1].

It is interesting to note three instances of successful use in other papers included in this publication: Warboys [19] on the success of CADES, Chatters [20] on the fault-free factory approach, and Malcolm [21] on the first on-time delivery in ten years, albeit in a project which was probably already doomed (due to the loss of user confidence). Willmott [22] also felt that incremental re-development of an air traffic control system would be safer than one-time replacement.

The successful IBM "Cleanroom" approach [23], described at an earlier CSR conference, is also an incremental approach.

7. INCREMENTAL STRATEGY

7.1 Suitability

Large systems are particularly suitable for incremental development. Monolithic development is suitable only for small systems of short duration, where the requirements are well known at the beginning of development and unlikely to change, according to Krzanik [9], and for commercial packages such as a database package, operating system, or word processor, according to Connell and Shafer [11]. Gilb maintains that any system can be developed using evolutionary delivery. [6]

Deciding which form of incremental development to use should be based on the risk factors for the particular system to be developed. If the system requirements are very uncertain and highly likely to change, then prototyping may be suitable. If the system architecture is critical, e.g. a database, then the framework model may be suitable. If development funding is uncertain, then evolutionary delivery may be most suitable. Incremental development is quite feasible for fixed-price contracts, but may well be easier without incremental delivery.

7.2 Partitioning the System into Increments

Deciding how the system can be divided up into self-contained functional increments, particularly for incremental delivery to users, can be difficult when incremental techniques are initially tried. (Deciding how best to partition a system for development is never easy anyway.) There are a number of good design methodologies for producing a loosely coupled architecture of non-overlapping functions (which is good design practice in any case); incremental development does not require any particular or specific design technique. The involvement of outside consultants with knowledge and experience of incremental development can be very helpful in the initial stages.

The initial difficulties experienced in designing increments are often due to thinking about the system in ways which are quite different to the monolithic approach. Monolithic thinking is directed toward completing all requirements first, but incremental thinking takes a small requirement subset toward implementation first.

The objectives which drive the partitioning process are to keep the increments as small as possible, provided they will provide a useful function to the users. The temptation to continually increase the functionality within each increment should be resisted. It is also essential to retain control over the content of each increment, and prevent developers from incorporating other "good changes at the same time", which then becomes undisciplined and uncontrolled.

7.3 Prioritising and Scheduling

The scheduling and sequencing of development is based on three aspects: first, any parts of the system which must be in place before functional increments can be implemented should be completed first, but only the minimum needed.

Second, the broad strategy for the next series of increments should be defined. Alternatives include the development of the most critical increments first to minimise risk, the development of interface increments first to test control, or the development of functional threads first to achieve a working partial product. The latter is needed as early as possible in order to use incremental delivery effectively.

Within the broad strategy, there will be a choice of increments among equal priority. The third scheduling aspect is based on a ratio of two things: the user benefits and the development cost. The user benefits for the selection of proposed increments should be analysed and prioritised by the user organisation, if that is feasible. The development costings should be estimated by the developer organisation.

This ratio of benefit over cost determines the scheduling priority. This is technically called "the juiciest bit" (Gilb, [6]) Thus an increment with a high perceived benefit with high cost may be developed before one for a low cost and low perceived benefit, but those with both high benefit and low cost will be earliest.

The increments to be prioritised will not stay fixed for long, but need to be re-analysed in the context of recently delivered increments; error correction increments may take precedence over other planned increments, for example.

8. PROBLEMS OF INCREMENTAL DEVELOPMENT AND DELIVERY

In this section, various problems related to incremental development and delivery are outlined. Possible solutions are suggested where appropriate. Further discussion, particularly of management problems, can be found in Redmill [8].

There are many aspects of software development which are not affected by incremental development or delivery, such as the need for good management, quality assurance, configuration management, and the training of staff in software engineering principles. Additional training is needed, however, when departing from development techniques which are widely accepted, even when extensive benefits can be gained.

8.1 Hardware Related Problems

8.1.1 Risk of inadequate choice

The choice of hardware for a system to be developed incrementally will be based on intentionally incomplete specifications, with the risk that an inadequate choice will be made. In fact monolithically developed systems often make the wrong choice of hardware as well, but the risk is increased in incremental development. A hardware upgrade may be a possible solution.

8.1.2 Response times

If a small number of increments have been delivered on the target hardware, response times should be extremely good at first, but will gradually deteriorate with increasing functionality, to the disappointment and frustration of users. To overcome this, it is possible to "simulate the final user environment", i.e. put in slowing-down code to be removed during system tuning. If response times are severely affected by a single increment, this can be an aid to identifying system bottlenecks, which can be difficult to localise with a slow system which has been developed monolithically.

8.1.3 Development hardware

If the target hardware is delivered with the early increments, additional hardware may be needed to continue the development of the system. This problem is normally postponed until the maintenance phase of monolithic development, but needs to be faced earlier in incremental delivery.

8.1.4 Embedded systems hardware

The parallel development of hardware for embedded systems may constrain the definition of the increments.

8.2 Life Cycle Problems

Incremental development is not an alternative to applying life cycle discipline; the phases of the life cycle still need to be followed in the right order and with all of the associated controls. Each increment is a small life cycle in its own right.

8.2.1 Requirements specification

Requirements still need to be specified for the limited area which comprises an increment, and need to be frozen while the increment is developed (icecubes instead of icebergs). This enables planning, estimation and scheduling to be done in the small. The Requirements Specification is needed to define the boundaries of the system and of the increment.

8.2.2 Design

Design is needed in order to preserve a coherent structure to the software system throughout the changes which will occur during incremental development. The overall design should be defined in the first increment, but each increment should also be designed, and the design must work towards preserving the integrity of the overall architecture. This requires effort, as Lehman and Belady point out in their second law of program evolution [24]. The difficulty of providing a good overall design without a full definition of requirements should not be underestimated.

8.2.3 Testing

Testing is needed to ensure that each increment fulfils its requirement, and has not adversely affected the rest of the system. With incremental delivery, more extensive regression testing will probably be needed, since any change to the system results in a changed system. All tests should be run again to ensure that there are no adverse side-effects of the change.

There are additional considerations for a system which is tested extensively using a purpose-built simulator or test harness. If the production software is developed incrementally, the test software needs to be ready for use early in the development timescale, and so may also need to be developed incrementally. This will have an effect on the scheduling of effort between the software product and the test software. Note that the test software needs to be tested as well, before it can be relied upon to test the production software.

Redmill has found that there is a tendency for users to perform thorough acceptance testing only for the first increment with the testing of subsequent increments being skimped. [8]

8.2.4 Other life cycle products

Documentation, user manuals, training, and quality control procedures should not be skimped in the excitement of having something working. They are still needed in order to retain control over the development process. A good configuration management system is essential for keeping track of increments in various stages of completion. Although working code may be produced quickly, the extra documentation required for additional releases may be seen as a greater overhead than with monolithic development.

8.3 Management Problems

8.3.1 Living with uncertainty

It is unsettling to live with uncertainty; this is one reason why developers prefer to specify complete requirements before beginning to design a system. However, incremental development requires a certain level of uncertainty to be tolerated within the context of controlled development. There are levels of uncertainty with monolithic development as well, but we tend to hide them from ourselves by attempting to resolve specification uncertainties on paper.

8.3.2 Team coordination

The coordination of teams of people working on different parts of the system, and being in different life cycle phases at once, presents a challenge to management. Corrections found in the use of a delivered increment have to be incorporated into the system as part of an increment further "down-stream". Configuration management is essential.

8.3.3 System releases

Releasing a system to a large user base incrementally is even more of a challenge, and may prove very difficult even with a good configuration management system.

8.3.4 Scheduling and prioritising

The scheduling and prioritising of increments is a process which is constantly being altered by the results of earlier incremental deliveries; management must be prepared to spend effort in supporting this continuing process.

8.3.5 Balance between original specification and desired changes

Development may tend to proceed in two directions at once; pulled toward the original specification by the developers (who can easily become "locked in" to local goals), and pushed toward new changes by the users. Management needs to keep the balance between these two. The requests for change should not be allowed to "hijack" the original system objectives, but some change must be allowed or the benefit of incremental delivery will be lost. Changes need to be controlled at a strategic level, in order to take the widest view of the system objectives into account.

8.3.6 Organisational cultural change

Changing the way a large organisation develops software is not easy and cannot be done overnight. Effort is needed in introducing incremental development ideas, to assess and then convince of the benefits. Effort is also needed to ensure that the concepts are being implemented correctly; for example, the temptation to merge increments together in order to meet a timescale should be resisted. Without continuing pressure, attitudes and habits will revert to the earlier ideas, even if the new words are used.

The development organisation may find strong resistance even from those departments which stand to gain from incremental development or delivery, for example contracts, quality assurance, and higher management.

8.4 Financial/Contractual Problems

8.4.1 Contracts

Contracts for the development of software systems are generally based on a statement of requirements, under the assumption that development will proceed monolithically. There is no reason why incremental development or even delivery cannot proceed from a "completed", i.e. frozen, Requirements Specification. However, many of the benefits of the incremental approach will be lost if user and developer knowledge were prohibited from being incorporated into the development process.

To allow the format of the contract to determine the development strategy appears to be putting the cart before the horse; surely the contract should be the servant of development, not its master. However, a new contractual approach may also involve significant organisational culture changes.

8.4.2 Competitive tendering

Competitive tenders using an incremental approach as opposed to a fully specified requirement may not enable the purchaser to evaluate like with like. The unspoken basis for pre-specifying the full requirement is the assumption that the requirements can be fully known in advance, which is rarely completely true.

A working prototype may be more convincing to a potential customer than a 250-page document, however.

8.4.3 Estimation

Estimation of system development effort is even more difficult when you don't know what you are going to build. Estimation methods and tools are the wrong way around for incremental development; they tell how long for a known (guessed) size, whereas an incremental estimate wants to know what functionality (size) can be achieved with known effort.

8.4.4 Management accountability

Accountability to higher management may be distorted by incremental development. Effort will be spent on the original specification, corrections and change requests. If management are tracking only effort on the original specifications, they may not have a true picture of the system being produced. On the other hand, incremental development may be the means of forcing out into the open what is really happening, which can be hidden in monolithic development.

8.4.5 De-stabilised development environment

If a developer is funded for only a small number of increments rather than for a full development, this may lead to a de-stabilised development environment, i.e. insufficient commitment to the project from the developer because of the uncertain future of the project. This may produce an inadequate product, a new search for a more suitable developer, with delays and additional expense. However, it is preferable for the purchaser to discover the limitations of the supplier after only a few increments than after a lengthy monolithic development.

If a contract is awarded before a full specification is produced, the buyer may become "locked in" to an unsuitable supplier. It may well be cost-effective to fund more than one developer to produce an early increment, particularly for a large system.

8.5 User-Developer Relationship Problems

8.5.1 User expectations

Users need to be involved in the process of setting goals and requirements for each increment, and need a thorough understanding of what is to be achieved by each one; their expectations can become somewhat inflated if they are not kept in touch with realistic proposals. User perceptions of what is easy and difficult to achieve are notoriously inaccurate.

9. ADVANTAGES OF INCREMENTAL DEVELOPMENT

The advantages of incremental development are given separately to those of incremental delivery. Incremental development without delivery gives advantages to the developers, and incremental delivery gives advantages to the users.

9.1 Improved Team Morale

Success breeds success; if the team can see the end product actually working, it is a great boost to morale and can lead to greater productivity.

9.2 Early Solution of Implementation Problems

Problems which are discovered during implementation can be put right before the rest of the system is built according to the same (faulty) assumptions. Testing the software early in development leads to improved quality of the finished product.

9.3 Reduced Risk of Disaster

If you are going to have a disaster, it is much cheaper to have an incremental one; you will have lost only thousands or tens of thousands rather than millions.

9.4 Improved Maintenance

The maintenance of incrementally developed systems is easier than monolithically developed systems because a maintenance environment is started early on in development. Good maintenance is continuous controlled change, and so is incremental development. Increments which are not designed to be easy to change will not survive the incremental development process.

9.5 Control of Over-engineering or Gold-plating

If best-value increments are developed first, that leaves the worst-value increments until last, where their true cost can be seen. Additions to specifications are often agreed for political reasons at the beginning of a project; if the benefits to end users drive the production schedule, the political enhancements may well be quietly forgotten.

9.6 Measurement of Productivity

In monolithic development, productivity is measured in terms of lines of code produced per day, or pages of documentation. If parts of the system are working, "product"-ivity can be measured in terms of the actual product.

9.7 Estimation Feedback

Estimates are produced in the large, for the whole system, but also in the small for the increments. If the first increment's actual effort is out by a factor of two, for example, it is possible that the global estimates are also out by the same factor. In monolithic development for a project taking say 6 years, you may not find out how inaccurate your estimates are until 4 years have elapsed; with incremental development you will find out much earlier, say after 2 months.

The feedback from incremental estimation can either modify or confirm both the global estimates and the estimates for subsequent increments. Either way management has better information sooner than with monolithic development.

9.8 Smoother Staffing Requirements

With monolithic development, the project will need teams of analysts, followed by teams of designers, coders, and testers in sequence. With incremental development the need for specialised teams is distributed throughout the development process.

10. ADVANTAGES OF INCREMENTAL DELIVERY

The benefits of incremental development for developers are significant, but the greatest benefits come from both incremental development and delivery to users.

10.1 Useful Product Early

Seeing something working which will actually benefit their needs is the greatest reward for users. Users may well be worried about their decision to invest in a software system and may remember hearing tales of disaster in related areas. Having something which can bring business or operational benefits early in the development process gives them the beginning of a return on their investment without having to wait years for anything tangible.

10.2 Increased Confidence in Developer

The users' confidence in their developer is greatly enhanced by having something working early; actually this applies whether the increment is delivered or not. An improved working relationship results from better morale.

10.3 Better Quality Software

The software which is produced benefits from the developers' increasing knowledge being "folded" back into the developing product.

10.4 Longer Useful Life

The system will have a longer useful life, because it will be easy to maintain, having been subject to a great deal of controlled change throughout development. Products which can evolve easily to satisfy changing business needs last longer and are more cost-effective than those which are so difficult to change that they are abandoned and replaced.

10.5 More Flexible Options

If a project does suffer from cost or time overruns, some later increments can be eliminated, and the most useful parts of the system will still be produced within the original financial constraints.

10.6 Something Useful if Cancelled

If a monolithic project is cancelled, the only things produced are piles of paper (requirements, design documents, etc.). If an incremental project is cancelled, the increments already produced form a working product of some sort.

10.7 Increased User Acceptance

If users actually have some say in the way the system is developed, their sense of "ownership" is improved, which leads to better acceptance of the system by the user organisation.

10.8 Increased System Assimilation

The assimilation of a major new system into working practices can be traumatic for the user organisation. People are resistant to change, but they resist large changes more than small ones. Most problems of system use stem from people problems rather than technical ones. Incremental delivery allows small areas of the organisational procedures to be altered at any one time; when the problems are overcome, those areas are then established, so the system has a foothold in the organisation. This also increases the sense of system "ownership".

10.9 Increased Understanding of Requirements

Incremental delivery gives the users something real. Their first reaction is "this is not what I want", but now they have a much better idea of what they do want, and can progress toward their true requirements.

10.10 System can Meet Real Need, not Frozen Need

The increasing user knowledge gained during development can be "folded" back into the development process, so that the eventual system is much closer to what is really needed at the end, rather than what was thought to be wanted at the beginning.

11. SUMMARY OF EFFECTS

A summary of the effects of incremental development and delivery is shown in Figure 11 below.


Figure 11. Effect of incremental development and delivery.

Incremental development moves the final product from the initial specification, System A, towards System B, what the developer would have produced with hindsight.

Incremental delivery cannot occur without incremental development, so it is not possible to move from System A to C.

Incremental development and delivery moves the final product from System A towards System D, the system which is wanted at the end of development.

Monolithic development confines the system to System A, the frozen specification. Neither user nor developer knowledge can be incorporated into the software system product.

12. COMPARATIVE COSTS

The comparative costs of monolithic and incremental development for a hypothetical project are shown in Figure 12 below.


Figure 12. Comparative Costs of Monolithic and Incremental Development

12.1 Original Specification

With monolithic development, the cost of developing the original specification must be met in full in order for the project to produce anything useful. With incremental development, it is possible that the original specification would still be produced, but is more likely that only part of the original specification will be produced.

12.2 Corrections

The cost of corrections is no more, and should be less, for incremental development than for monolithic, since errors of analysis, design or implementation will be discovered earlier in development and will not have propagated through the rest of the system requirements, designs and code.

12.3 Inevitable Change

It will not be any more costly to respond to inevitable change, such as a changed hardware environment or new work practices. It should in fact be less costly for incremental development, since a system which has been developed incrementally is accustomed to frequent change.

12.4 Requirements Evolution

It will not be any more costly to implement evolving requirements, and in fact should be less in incremental development, since many changed requirements can be incorporated into the final system without having to discard work already done on superseded requirements.

12.5 Configuration Management

Configuration management costs are likely to be higher with incremental development than with monolithic development, particularly if the existing configuration mangement method and/or tools are fairly primitive. Configuration management is more essential for incremental development and delivery, although it is a good idea for any software development.

13. COMPARATIVE SCHEDULING

The comparison of scheduling differences between monolithic and incremental development is shown in Figure 13 below.


Figure 13. Comparative Scheduling for Monolithic and Incremental Development

13.1 Timescale to Finish

The elapsed time to finish the total development may be longer for incremental development than for monolithic development, but it is not as critical.

13.2 Timescale to Produce Useful Function

The timescale until something useful is produced is much shorter with incremental development and delivery; this is the main reason for using incremental models. This is also why it is not as critical if the elapsed time to finish the total system is greater than with monolithic development.

13.3 Requirements Evolution

Real requirements do evolve, whether the developers take note of the changes or not. In monolithic development, only a limited number of requirement changes are permitted; the remaining changes are therefore stacked up waiting until after handover to be implemented. In incremental development, the evolving requirements can be incorporated into the evolving product.

After handover, the incrementally developed system merely continues to adjust to changing requirements in much the same way as it did during development, but probably at a reduced rate (fewer new facilities being included).

The monolithic system has two problems after handover. First, it must become a maintenance-type environment capable of handling changes in a controlled way, which may involve some "teething" troubles. Second, it must deal with the backlog of changed requirements which have been stacked up and prohibited during development, in addition to coping with the on-going requests for changes.

14. SUMMARY AND CONCLUSIONS

This paper has given definitions of incremental development and delivery, and emphasized that an increment should be a complete self-contained functional unit of software, including all life cycle documentation, test documentation, and other support such as user manuals and training.

Essentially the incremental idea for large system development is to develop a series of small systems, which will eventually become the large system. The main strategy is to postpone some detail in order to get something working as soon as possible. A vertical "slice" of the life cycle model is taken, rather than a horizontal "slab" at once.

Incremental development can reduce many of the risks of large system development, but it is not without problems. The problems of incremental development centre around the management and control of software and associated products in a different time ordering to monolithic development.

In order to "think incremental", there are three guidelines:

As software developers begin "taking their own medicine" by adopting software tools, I have predicted [1] that incrementally developed tools will be more successful than monolithically developed tools; this is already supported in the experiences of implementing IPSE's as reported by LeQuesne [25]

Barry Boehm once said that developing software from requirements is like walking on water; it's easier if it's frozen. However, it is easier to freeze a pond than an ocean.

Software is the most flexible, malleable and adaptible medium ever known; isn't it strange that the first thing we do with a software requirement is to freeze it? Incremental development and delivery can help to put the "soft" back into software.

15. REFERENCES

  1. 1. Graham, D. R., "Incremental development: review of nonmonolithic life-cycle development models", Information and Software Technology, 1989, 31(1), 7-20.
  2. Floyd, C., Reisen, F.-M., and Schmidt, G., STEPS to Software Development with Users. In Lecture Notes in Computer Science, Vol 387: ESEC '89, ed. C. Ghezzi and J. A. McDermid, Springer-Verlag, 1989, pp. 48-64.
  3. Hirschheim, R. & Newman, M., Information Systems and User Resistance: Theory and Practice, The Computer Journal, 1988, 31(5), 398-408.
  4. Deutsch, M. S., Software Verification and Validation: Realistic Project Approaches, Prentice-Hall, Hemel Hempstead, 1982.
  5. Wong, C., A Successful Software Development, IEEE Transactions in Software Engineering, 1984, SE-10(6),714-727.
  6. Gilb, T., Principles of Software Engineering Management, Addison-Wesley, Wokingham, 1988.
  7. Hill, G., Radical and Conservative Top-down Development, Software Engineering Notes, 1989, 14(2), 32-38.
  8. Redmill, F., Computer System Development: Problems Experienced in the Use of Incremental Delivery, to be presented at SAFECOMP '89, 5-7 Dec, 1989, Vienna, Austria.
  9. Krzanik, L., Anomalies with evolutionary innovation project control strategies. In The art and Science of Innovation Management, ed. H. Hubner, Elsevier Science Publishers, Amsterdam, 1986.
  10. Boehm, B. W., A Spiral Model of Software Development and Enhancement, ACM SigSoft Software Engineering Notes, 1986, 11(4), 14-24.
  11. Connell, J. L., and Shafer, L. B., Structured Rapid Prototyping, An Evolutionary Approach to Software Development, Yourdon Press Computing Series, Prentice-Hall, Englewood Cliffs, 1989.
  12. Floyd, C., A Systematic Look at Prototyping. In Approaches to Prototyping, ed. R. Budde, K. Kuhlenkamp, L. Mathiassen, H. Zullighoven, Springer-Verlag, 1984, pp. 1-17.
  13. Ince, D., and Hekmatpour, S., Rapid Software Prototyping, Technical Report 86/4, Open University, 1986.
  14. Gerrard, C., ObjEx, Gerrard Software, Macclesfield, 1988.
  15. Agresti, W. W., New Paradigms for Software Development, IEEE Computer Society Press, 1986.
  16. Law, D., and Longworth, G., Systems Development: Strategies and Techniques, The National Computing Centre, Manchester, 1987.
  17. Jackson, M., Jackson Information Update: Conference 1989, 30-31 October, Eastbourne, Computing, 19 Oct 1989, p. 52.
  18. Harker, S., The Use of Prototyping and Simulation in the Development of Large-Scale Applications, The Computer Journal, 1988, 31(5), 420-425.
  19. Warboys, B., Reflections on a Large Software Development Project. In CSR: Sixth Annual Conference on Large Software Systems, ed. B. Kitchenham, 1989.
  20. Chatters, B., Software Reliability Improvement - The Fault Free Factory (A Case Study). In CSR: Sixth Annual Conference on Large Software Systems, ed. B. Kitchenham, 1989.
  21. Malcolm, B., A Large Embedded System Project Case Study. In CSR: Sixth Annual Conference on Large Software Systems, ed. B. Kitchenham, 1989.
  22. Willmott, S., Design of a Flight and Radar Data Processing System for the Support of Air Traffic Control. In CSR: Sixth Annual Conference on Large Software Systems, ed. B. Kitchenham, 1989.
  23. Dyer, M., A Formal Approach to Software Error Removal, The Journal of Systems and Software, 1987, 7, pp. 109-114.
  24. Lehman, M. M. and Belady, L. A., Program Evolution: Processes of Software Change, Academic Press Inc. (London) Ltd., 1985.
  25. LeQuesne, Individual and Organisational Factors and the Design of IPSE's, The Computer Journal, 1988, 31(5), 391-397.

Dorothy R. Graham: Incremental Development and Delivery for Large Software Systems,

published in Software Engineering for Large Software Systems, ed. B. A. Kitchenham,

Proceedings of the Sixth Annual CSR Conference on Large Software Systems, Elsevier, 1990.


Gästboken
Write in my guestbook

Skriv i gästboken

 

Homepage without frames please

.........................................................

Hemsidan utan frames



Web-messages to Anders!

Synpunkter 
med webb-post