Introduction: Today's Changing Software Environments

Change is a constant factor in today's software environments. Software engineers have to worry about changing operating systems, libraries, and tools, not to mention the code modules they are responsible for and those with which their software interacts. Inability to deal with changes in a software project leads to needless delays and avoidable rework. Ironically, the answers to these questions do exist but are not readily captureable.

Most organizations don't have the time to address these issues. Those engineers and managers that do tackle these problems typically develop ad hoc, creative solutions that are temporary, limited, not extensible to other parts of the organization, and are simply another form of change with which the poor developers must contend. If change is not managed, it can be disastrous to an organization's technology and to its employees.

Huge Software Projects

Not only is the software development environment changing rapidly, but it is becoming increasingly complex, in both size as well as in process. For example, the development of the Space Station created a 3X increase in just 10 years in millions of object instructions (Figure 1). And the Space Station hasn't even been launched!

FIGURE 1. Software Size Complexity as Evidenced by the Space Effort

At Silicon Graphics, complexity has also increased at an incredible pace (Figure 2). The number of interfaces and overall system complexity are an increasing challenge to manage.

FIGURE 2. SGI's Dramatic Increase in the Size of System Software Releases

Software Management Complexity

It is simplistic, though, to attribute software development problems solely to increasing size and complexity. The rapidity of the development cycle today adds fuel on the fire. For instance, in Figure 3, we see a typical configuration management problem. The mainline of development moves across the top of the drawing. At points during the process, complete clones (labeled Rel in the figure) are released for development work. During the course of development, intermediate releases may be fanned out to numerous developers, who must make their changes and merge them back into the release version. Eventually changes made to the development release must be merged back into the mainline. To further complicate the situation, it is not unusual to release variant versions of the software to various subscribers of the system for trial purposes. With so many different versions of source files and potentially compilers, linkers, and build environments, it is easy to see the potential for problems.

FIGURE 3. A Typical Configuration Problem Problems with development in this type of environment are numerous. Here are a few:

Difficulty of Developing Multiple Releases in Parallel

This is the classic configuration management problem. Companies, today, must support current, old and new development lines, and sometimes even variants on each. In fact, this problem will only get worse, as open system pressures increase.

Time-Consuming System Builds

It is not uncommon to find System Builds that take 36 hours. Build engineers might start a build on Friday evening and are able to certify the build some time during the day on Sunday. If a build fails, however, it is common to find builds certified for release on Tuesday of the following week.

Inability to Fix Older Releases

Many customers do not want to upgrade to the latest release. Thus, we are forced to support more numbers of releases. We must be able to do this efficiently and accurately.

Uncertain Status of Bugs

It is too difficult to figure out what bugs were fixed in a given release. It is typical to sit in a system release meeting and find managers and engineers who have to ask other managers and engineers if a particular bug was fixed in a particular release. Coordinating change is difficult; finding out what changed is nearly impossible.

Lack of Traceability

It is almost impossible to synchronize process deliverables. At some point in the lifecycle of a system release, all of the process deliverables should be frozen and attached to the system release. These include the requirements, designs, sources, executables, tests (data and results) and bug reports for a given system release. At any point in the lifecycle, a development or support engineer should be able to trace from any given executable to any given process deliverable.

Ramifications of Changes

It is hard to figure out what changed or what the impact of a change will be. Too frequently, engineers ask, "it worked yesterday, why doesn't it work today?" With today's systems, it is impossible to figure out what changed or to predict the impact of a new change. Also, almost weekly, engineering managers must make decisions based upon the potential impact of a change in the system. With today's systems, it is virtually impossible to answer that question. Isolating Files with Selected Sharing It is difficult to set up "sandboxes." One of the fundamental software development problems is to set up environments so that engineers can effectively share and isolate their work. Traditionally, scripts are written on top of RCS or SCCS, and through the use of links and copies, these engineering "sandboxes" are set up. This process is time consuming and static. Usually engineers are forced to share what they don't want to share, and are forced to copy what they would rather share. Merging changes becomes a nightmare.

Managing Change in Software

The answer to managing change lies in our ability to understand, control, and track the software development environment in its entirety from initial design requirements through release and maintenance, including development and integration. Gene Forte, Executive Editor of CASE Outlook, puts it best:

"As we gain a better understanding of these factors, we find that getting control of all the work products of development, and their relationships to each other and the development process, is fundamental to the business of Total Quality Management in software, just as it is in manufacturing and in other engineering fields.... ...CM is now charged with managing all the work products involved in software development: all manner of graphical, textual and symbolic design documents; test suites and results; metrics; source and object code; system and network options; data and program locations; business models; and anything else we may invent in the coming years. The latest automated build facilities no longer execute a fixed script, but they automatically determine the correct version of source code as well as the compilers and linkers used to build the system. They know which modules need recompiling and which do not, and they want user-defined rules for promoting systems from development to test and then to production. We are also demanding that CM handle new dimensions of complexity. For example, we not only want to archive historical versions of a particular application, we want to be able to go forward or backward through the historical sequence of versions, and we want to have multiple coexisting variants for parallel development, for many platform targets and for different market niches. We want tools to manage these relationships in a way that is transparent to the developer, so that details of file name and directory variations are of no consequence." - CASE Outlook 90, No. 2

In addition to the general requirements of version control, configuration management and system building, the most asked for integrated application is that of problem tracking and reporting. By integrating a problem tracking system with the CMS facility, the task of determining which bugs have been fixed and which feature requests have been implemented in a given release are greatly simplified.