scheduled around a business’s convenience. The change can be immediate, or can wait for a suitable time.
Once the client updates have occurred, we simultaneously add a check
to produce a server error message for
anyone who accidentally uses an ou-dated U.S.-only version of the client.
This check is a bit like the “can’t happen” case in an else-if: it’s done to
identify impossibly out-of-date calls.
It fails conspicuously, and the system
administrators can then hunt down
and replace the ancient version of the
program. This also discourages the
unwise from permanently deferring
fixes to their programs, much like the
coarse version numbers on entire programs in present practice.
This kind of fine-grain versioning is
sometimes seen in more recent programs. Linkers are an example, as
they read files containing numbered
records, each of which identifies a
particular kind of code or data. For example, a record number 7 might contain the information needed to link
a subroutine call, containing items
such as the name of the function to
call and a space for an address. If the
linker uses record types 1 through 34,
and later needs to extend 7 for a new
compiler, then create a type 35, use it
for the new compiler, and schedule
changes from type 7 to type 35 in all
the other compilers, typically by announcing the date on which type 7 records would no longer be accepted.
Another example is in networking
protocols such as IBM SMB (Server
Message Block), used for Windows
networking. It has both protocol versions and packet types that can be
used exactly the same way as the record types of a linker.
Object languages can also support
controlled maintenance by creating new versions as subclasses of the
same parent. This is a slightly odd use
of a subclass, as the variations you
create aren’t necessarily meant to persist, but you can go back and clean out
unneeded variants later, after they’re
no longer in use.
With AJAX, a reasonably small client can be downloaded every time the
program is run, thus allowing change
without versioning. A larger client
would need only a simple versioning scheme, enough to allow it to be
downloaded whenever it was out of
An elegant modern form of continuous maintenance exists in relational
databases: one can always add columns to a relation, and there is a well-known value called null that stands
for “no data.” If the programs that
use the database understand that any
calculation with a null yields a null,
then a new column can be added, programs changed to use it over some
period of time, and the old column(s)
filled with nulls. Once all the users of
the old column are no more, as indicated by the column being null for
some time, then the old column can
Another elegant mechanism is a
markup language such as SGML or
XML, which can add or subtract attributes of a type at will. If you’re careful
to change the attribute name when
the type changes, and if your XML
processor understands that adding 3
to a null value is still null, you’ve an
easy way to transfer and store mutating data.
maintenance isn’t hard, it’s easy
During the last boom, (author) Collier-Brown’s team needed to create
a single front end to multiple back
ends, under the usual insane time
pressures. The front end passed a few
parameters and a C structure to the
back ends, and the structure repeatedly needed to be changed for one or
another of the back ends as they were
Even when all the programs were on
the same machine, the team couldn’t
change them simultaneously because
they would have been forced to stop
everything they were doing and apply a structure change. Therefore, the
team started using version numbers.
If a back end needed version 2. 6 of the
structure, it told the front end, which
handed it the new one. If it could use
only version 2. 5, that’s what it asked
for. The team never had a “flag day”
when all work stopped to apply an
interface change. They could make
those changes when they could schedule them.
Of course, the team did have to
make the changes eventually, and
their management had to manage
that, but they were able to make the
changes when it wouldn’t destroy our
schedule. In an early precursor to test-directed design, they had a regression
test that checked whether all the version numbers were up to date and
warned them if updates were needed.
The first time the team avoided a
flag day, they gained the few hours expended preparing for change. By the
12th time, they were winning big.
Maintenance really is easy. More
importantly, investing time to prepare for it can save you and your management time in the most frantic of
The Meaning of Maintenance
The Long Road to 64 Bits
A Conversation with David Brown
Paul Stachour is a soft ware engineer equally at home
in development, quality assurance, and process. one
of his focal areas is how to create correct, reliable,
functional software in effective and efficient ways in many
programming languages. Most of his work has been with
life-, safety-, and security-critical applications from his
home base in the twin Cities of Minnesota.
David Collier-Brown is an author and systems
programmer, formerly with Sun Microsystems, who
mostly does performance and capacity work from his
home in toronto.