In practice, software is delivered from developers to some outlet in one or more stages, comprising a Software Delivery Life Cycle (SDLC). At each stage, the software matures through code iteration, automated and manual testing, review, audit, and user feedback before being introduced in to production environments. Despite testing at each stage, oftentimes errors, bugs, and unexpected data interactions are only detected upon introduction into live production environments.
Many times this failure can be attributable to conventional software development approaches. For example, development of software by teams of people is organized by grouping work together. Software Configuration Management (SCM) systems provide organization for group development, by collecting the source code and configuration data for a software deliverable into a source code repository. A popular approach to tracking and development on an SCM includes the use of codeline tracking. Each codeline is a sequence of revisions of a set of source code files. For example, a revision B builds on a previous revision P by specifying a transformation to P that produces B. It is thus possible to track the evolution of work through specific transformations or a codeline.
Codelines are said to branch when multiple revisions (B0 . . . Bn) are all based on the same previous (or parent) revision P without any relationship between B0 . . . Bn. In this case, multiple codelines exist. In such cases, there is often a main (or master, or trunk) codeline, whose revisions serve as parents. Branches can merge—applying the revisions unique to B1 to P produces P′ and P′ can then be used as a baseline upon which to produce new code. Branches can be abandoned, by causing the SCM to forget their unique changes. Logically, the codelines are directed acyclic graphs (DAGs), where each node captures the state of the source and edges represent change events that relate one state to another. These DAG can be represented explicitly by the SCM, implicitly among the personal workspaces created by developers, tracked by a central controller, or distributed across multiple asymmetric controllers.
Branching codelines are ubiquitous in the modern SDLC. They allow development on different parts of a system to occur without interfering with each other until an agreed upon point. Risky, experimental work is isolated, independent work can go on in parallel, and when work is ready to be released, components can be assembled in an orderly way. Qualification and review apply against mutually agreed-upon reference points.