This is the first in a series of blog posts exploring characteristics of development projects to consider when choosing a Software Configuration Management system.
A Software Configuration Management (SCM) system is an essential part of almost any effective software development project. It can provide solutions to different challenges faced by the many roles in a development team. These roles include software engineers/developers, project leaders, release engineers, process engineers, engineering managers, and even engineering executives.
Although all software development projects share many common characteristics, the differences between the projects often dictate the degree of sophistication needed in the underlying development tools. Characteristics that drive the need for a highly sophisticated SCM system can include projects with numerous developers, project teams spread across many different physical locations, projects dealing with a huge software system, projects needing tightly controlled security, projects with complex process automation and enforcement requirements, and projects subject to critical regulatory requirements. If you think of increasing sophistication represented by a series of layers, or strata, each of the aforementioned characteristics can push a project into higher strata. Many SCM systems can satisfy the needs in the lower strata. Few are powerful enough and flexible enough to handle the higher strata.
IBM Rational ClearCase is without doubt, the most flexible SCM system in the world. It supports a wide variety of deployment models for local or globally distributed teams; provides a simple process model as well a highly customizable option; includes a wide variety of powerful graphical user interfaces (GUIs) in addition to a comprehensive command line interface (CLI); provides unique build tools that generate a detailed audit trail and enable high-speed parallel builds; and integrates with a wide variety of other tools including Eclipse, Microsoft Visual Studio, Cadence Virtuoso, workflow and lifecycle management/engineering tools, etc.
POSSIBLE PROJECT NEEDS TO CONSIDER
An SCM system provides significant benefits to numerous roles in a software development project. The value of an SCM system to an individual usually grows with experience. For instance, a software developer might initially only value an SCM system for its ability to help recover from introducing a regression in previously functioning code. Over time, however, as they experience first-hand the realities of complex software development, they may start to value the support for parallel development and detailed traceability. Not every project requires all the capabilities of an SCM system but all projects benefit from at least some.
When properly used, an SCM system will capture every key change in the evolution of a software system. “Proper use” involves not only checking in (committing) new versions of artifacts when a task is complete but also checking in intermediate states that capture notable progress. An effective SCM system will make it easy to reconstruct the software system at any point in the past. In that sense, an SCM system functions as a time machine.
A developer may begin their day intent on enhancing a feature that already works only to discover later in the day that their “enhancement” did more harm than good. A Web site development team may have unwittingly deployed a security vulnerability and quickly needs to build and redeploy last month’s release. An automobile accident analysis reveals a defect in the control software of a 5-year old antilock braking system requiring the manufacturer to fix the bug in the 5-year old code and distribute the software to automobile service centers. All three situations benefit greatly from having a time machine that can correctly reconstruct the exact state of the system at some point in the past, whether it’s earlier in the day, a month ago, or a half decade ago.
Almost all but the smallest of development projects need a way to progress on one set of tasks in isolation from progress on other tasks. One part of a team might have to implement a feature that will take a week to complete and introduces numerous incompatible changes. Being able to implement the feature in isolation from the rest of the project and then deliver the completed change all at once can save the rest of the team from constantly adapting to incremental changes or worse, being unable to make progress on their tasks until the project stabilizes again.
Many software systems have multiple versions used by their customer base simultaneously. If a defect is discovered in a released version, the team must be able to reconstruct the software system as it was when that version was released, fix the defect, and then release an update to the customers. They must be able to do this in a way that does not pick up features that were implemented in later releases.
SCM Systems typically support parallel development through the use of branches or streams. They require a starting point (often referred to as a foundation which is usually a baseline or equivalent, a set of versions of files that compose a consistent and compatible set) and create a branch for a given file if and when a change is needed to that file. A branching mechanism is relatively easy to implement.
In most circumstances, changes made on one branch are later needed on one or more other branches. For example, a defect fix to an early release of a software system is usually also needed in the later releases. SCM systems often provide a mechanism to merge changes from one branch to another. The more powerful this mechanism is (including three-way merge support, effective common ancestor computation, powerful compare/merge GUIs and command line support), the lower the burden on the person performing the merge operation and the more effective the system will be handling large software systems with a huge number of files that may require merging.