Another important software engineering methodology is versioning where the system development is broken down into a series of smaller goals. The system is released in a series of versions with each version potentially adding more functionality. Using versions develops the system in a sequential manor while, if viewed from the software engineering life cycle prospective, a more cyclical approach is taken. Thus, versioning is a hybrid of both a sequential and a cyclical software engineering methodology. See Figure 4.3 on page .
Each version replays the methodology. Frequently the previous version becomes the starting point for the next version. Some features may be deferred to a later version. Changes in the requirements that happen in the design or implementation phase are usually deferred to a later version. The selection of features in any one version is a complex process involving resource constraints, customer requirements, availability of support environments, and availability of skilled people.
Many times, one released version concentrates on quality improvements while the following release version concentrates on added functionality. This alternating release schedule is common and reflects the difficulty in reaching high product quality before product visibility. First the required functionality is released in a version and then, after the customers use the version, a new version is released with the newly discovered errors fixed. The environments in which the customers use the product may be so variable as to preclude exhaustive testing. Of course, exhaustive testing is seldom accomplished in any one product.