π Where this lives: when a security advisory names a vulnerable library version, the first question every organisation asks is "are we using it?" β and the ones who can answer in minutes have configuration management, while the ones who spend a week grepping do not. Log4Shell in December 2021 was exactly this test, applied simultaneously to every Java shop on earth. Configuration management is the discipline that makes "what is actually running in production, built from precisely which sources?" an answerable question. Search "software bill of materials incident response inventory".
What configuration management is
SOFTWARE CONFIGURATION MANAGEMENT (SCM) is the development and
application of standards and procedures for MANAGING AN EVOLVING
SOFTWARE SYSTEM. It is an umbrella activity applied throughout
the software process.
WHY IT IS NECESSARY: change is inevitable, and uncontrolled
change is the source of a distinctive class of failure β
systems that cannot be rebuilt, defects fixed twice, fixes
lost, two developers overwriting each other, and a released
product nobody can reproduce.
THE FIRST LAW OF SYSTEM ENGINEERING (Bersoff): "No matter where
you are in the system life cycle, the system will change, and
the desire to change it will persist throughout the life
cycle."
THE FOUR SOURCES OF CHANGE:
Β· new business or market conditions dictate changes in
product requirements or business rules
Β· new stakeholder needs demand modification of data, of
functionality, or of services
Β· reorganisation or business growth/downsizing causes
changes in project priorities or team structure
Β· budgetary or scheduling constraints cause a redefinition
of the system
SCM ELEMENTS (Pressman's four):
COMPONENT ELEMENTS a set of tools coupled within a file
management system enabling access to
and management of each configuration
item
PROCESS ELEMENTS a collection of procedures and tasks
defining an effective approach to
change management for all parties
CONSTRUCTION a set of tools automating the
ELEMENTS construction of software by ensuring
the proper set of validated components
has been assembled
HUMAN ELEMENTS the set of tools and process features
used by the software team to implement
effective SCM
THE FIVE SCM TASKS β the standard enumeration:
1. IDENTIFICATION of the items to be controlled
2. VERSION CONTROL managing versions and their
relationships
3. CHANGE CONTROL the procedure by which changes are
proposed, evaluated, approved and
applied
4. CONFIGURATION determining whether a change has been
AUDITING properly implemented
5. STATUS REPORTING telling everyone who needs to know what
happened
CONFIGURATION ITEMS (CIs) β what is placed under control. The
answer is broader than "the code":
the specification Β· the design model Β· the source code Β·
test cases and test scripts Β· build scripts and the build
configuration Β· the database schema and migrations Β·
user documentation Β· third-party dependencies and their
versions Β· the deployment/infrastructure definition Β·
the tools and compiler versions themselves
THAT LAST ONE MATTERS MORE THAN IT LOOKS. If your build uses
"whatever compiler is installed", your build is not
reproducible, and a defect that appears only under one
compiler version is undiagnosable. This is why modern practice
pins toolchain versions in the repository β the tool is a
configuration item.
THE SCM REPOSITORY performs or precipitates: data integrity,
information sharing, tool integration, data integration,
methodology enforcement, and document standardisation.
BASELINES β the central concept, and the one most often asked.
A BASELINE is a specification or product that has been FORMALLY
REVIEWED AND AGREED UPON, that thereafter serves as the basis
for further development, and that can be changed ONLY THROUGH
FORMAL CHANGE CONTROL PROCEDURES. (IEEE definition)
THE MECHANISM:
a work product is developed β informally changed at will
it passes a formal technical review β it becomes a
BASELINE and is placed in the project database
thereafter, a change requires a CHANGE REQUEST and formal
approval
TYPICAL BASELINES through the life cycle:
FUNCTIONAL baseline the approved system specification
ALLOCATED baseline the approved requirements / SRS
DESIGN baseline the approved design description
PRODUCT baseline the approved, released product
THE INSIGHT BEHIND BASELINES: before a baseline, changes are
cheap and should be easy β imposing control on a document
still being drafted only slows work. After a baseline, other
people have started depending on it, so a change now has
consequences beyond the author. THE BASELINE IS THE MOMENT THE
COST OF CHANGE JUMPS, and the control exists because of that
jump, not for its own sake.
The plan, and identification schemes
A CONFIGURATION MANAGEMENT PLAN (IEEE 828) defines:
1. the ORGANISATION and responsibilities β who does CM, who
approves changes
2. the CM ACTIVITIES β identification, control, status
accounting, audits
3. the SCHEDULE β when baselines are established, relative to
project milestones
4. the RESOURCES β tools, techniques, staffing and training
5. PLAN MAINTENANCE β who keeps the plan current
6. SUPPLIER CONTROL β CM of subcontracted and third-party
software
7. RECORDS COLLECTION AND RETENTION
IT MUST ANSWER, concretely:
Β· which items are controlled, and how are they named?
Β· who may change what, and who approves?
Β· what tools are used, and where is the repository?
Β· how are releases identified and built?
Β· how are branches used, and when are they merged?
Β· what audits happen, and when?
IDENTIFICATION SCHEMES β every CI needs a unique, meaningful
name. A common scheme is hierarchical:
PROJECT / SUBSYSTEM / MODULE / ITEM / VERSION
LICENCE/intake/validation/FeeValidator.java/1.4.2
SEMANTIC VERSIONING β the widely adopted convention for
release identification, and it encodes a promise:
MAJOR.MINOR.PATCH
MAJOR incremented for BREAKING changes β existing users
must do work to upgrade
MINOR incremented for backwards-COMPATIBLE additions
PATCH incremented for backwards-compatible BUG FIXES
2.4.1 β 2.4.2 a bug fix; upgrade freely
2.4.1 β 2.5.0 new features, nothing broken; upgrade freely
2.4.1 β 3.0.0 something you depend on has changed or gone;
read the release notes before upgrading
THE VERSION NUMBER IS A COMMUNICATION, NOT A COUNTER. Recall
from the interface specification topic that adding an
optional field is not breaking while removing a field or
narrowing a type is β semantic versioning is that rule,
expressed as a number your consumers can act on
automatically.
VERSIONS, VARIANTS AND RELEASES β three words that are
routinely confused:
VERSION an instance of a system that differs in some way
from other instances. A new version may have
different functionality, or fixed defects.
VARIANT an instance of a system that is FUNCTIONALLY
IDENTICAL but NON-FUNCTIONALLY DISTINCT from other
instances β a build for a different platform, or
with a different locale.
RELEASE an instance of a system that is DISTRIBUTED TO
CUSTOMERS. Not every version is released.
WHAT MUST BE CAPTURED TO REPRODUCE A BUILD β the practical test
of whether your CM works. To rebuild release 2.4.1 exactly you
need:
the source at the exact revision (a tag)
the versions of every dependency (a lock file)
the toolchain versions (pinned)
the build configuration and flags (in the repo)
the build environment (a container
image, itself
versioned)
MISS ANY ONE and "reproducible build" is aspirational. The
reason this matters is not tidiness: when a customer reports a
defect against 2.4.1 and your current code is 2.7.0, you must
be able to reproduce 2.4.1 to diagnose it β and to ship a fix
to a customer who cannot yet upgrade.
What it costs to lack it
A CONCRETE FAILURE CASE, worked, because the value of CM is most
visible in its absence.
THE SITUATION: a critical defect is reported by a user of the
licence system. Production is running "the version deployed in
March". There is no tagging, dependencies are unpinned, and the
build runs on one engineer's machine.
DIAGNOSING IT WITHOUT CM:
determine what is actually deployed ~ 8 h
(compare deployed files against the repository by hand)
identify which commit that corresponds to ~ 6 h
(bisect by inspection; the history has no tags)
reproduce the build ~ 12 h
(dependency versions have moved on; two libraries have
breaking changes since March, so the old code no longer
compiles against current versions)
reproduce the defect ~ 4 h
fix and test ~ 6 h
deploy without breaking the unrelated
changes made since March ~ 10 h
βββββββββββββββββββββββββββββββββββββββββββββββββ
TOTAL ~ 46 h
THE SAME TASK WITH CM:
check out tag v2.4.1 0.1 h
restore pinned dependencies from lock file 0.2 h
reproduce build in the versioned container 0.5 h
reproduce the defect 4 h
fix and test 6 h
cherry-pick onto the release branch, tag
v2.4.2, deploy 1 h
βββββββββββββββββββββββββββββββββββββββββββββββββ
TOTAL ~ 11.8 h
A SAVING OF 34 HOURS ON ONE INCIDENT β and the 34 hours are
almost entirely the "figure out what we shipped" work, which
produces nothing of value. Note also that the fix-and-test
time (10 h) is IDENTICAL in both columns: CM does not make
programming faster, it removes the archaeology.
AND THE RISK THAT DOES NOT APPEAR IN THE TABLE: in the no-CM
column, the engineer deploying the fix must also carry along
every unrelated change made since March, because there is no
way to ship the fix alone. That is how a one-line bug fix
becomes an incident.
THE STANDARD PROBLEMS CM PREVENTS, named:
THE DOUBLE MAINTENANCE PROBLEM the same fix applied
separately to two copies of the code, diverging over time
THE SHARED DATA PROBLEM two developers editing the same
file, one overwriting the other
THE SIMULTANEOUS UPDATE PROBLEM concurrent changes to the
same item, lost silently
THE UNRECORDED FIX a defect fixed directly in production
and never committed, so the next deployment reintroduces
it β the single most demoralising CM failure, and
entirely preventable
The line worth internalising from the worked incident: fix-and-test takes ten hours in both columns. Configuration management does not make anyone a faster programmer β it eliminates the thirty-four hours of archaeology spent establishing what was shipped, which is pure waste and entirely avoidable.
π Go further: the strongest modern form of this discipline is the reproducible build: given the same source, the same build must produce a bit-for-bit identical binary, on any machine, at any time. Achieving it means eliminating every hidden input β timestamps, file ordering, absolute paths, locale, the build user's name β and the payoff is a security property, not just tidiness: independent parties can verify that a published binary really was built from the published source, which defends against a compromised build server. Debian and others have pursued this for years, and it is the logical end point of "the toolchain is a configuration item". Search "reproducible builds bit for bit verification".
π‘ Exam angle: define software configuration management and give the first law of system engineering and the sources of change. Define configuration item and give a broad list β noting that tools and dependency versions count. The highest-value definition is baseline: a formally reviewed and agreed specification or product, thereafter changeable only through formal change control β and explain that a work product becomes a baseline after passing a formal technical review. List the five SCM tasks (identification, version control, change control, configuration auditing, status reporting) and distinguish version, variant and release. Know the IEEE 828 CM plan contents.
Syllabus points
CM planning
Create a free account to tick topics off, take notes as you read, watch the video lessons and get a day-by-day study plan built around your exam date.
Related topics in Testing, Cost Estimation, Quality & Configuration Management