Lessons for Environmentally Friendly Configuration
Management
Green, the planet,
ecology; whatever the phrase, the environment is on people's minds.
The environment and Configuration Management share a lot of the
same ideals, concepts, and rules. Thinking about Configuration
Management planning from the perspective of an environmentalist
helps a CM team plan for for future events in a fairly low
future-cost way.
Reduce,
Reuse Recycle
As CM professionals, we desperately want to reduce breakages, lines
of code, and infrastructure wherever possible. Much like
application development, reducing lines of code, and existing
infrastructure makes for less to maintain, less to manage, and most
importantly, less to replace in the future. We always strive to
reduce complexity in a our processes, our tools, our workflow, and
our code. As a general rule, the less to maintain, the less that
might break.
Reuse is another great example of reduction. How can we reuse
existing infrastructure for current needs. What about existing
code, and technologies. While writing something from scratch can be
a tempting solution, the cost of maintenance tends to be higher
than that of supporting an existing tool. For example, extending an
existing revision control set-up can be much cheaper that migrating
to a new system.
On the other hand, we'll find creative ways to reuse technologies.
In the case of existing code, maybe we can subclass, or extend.
Maybe we can write the “glue” between technologies and libraries.
Virtual machines and chroot jails are possibilities that might help
you reuse hardware, or better provision existing hardware. Or maybe
an existing build system, or revision control server can be “bent”
to meet current needs, without sacrificing anything
important.
Recycling existing hardware makes sense environmentally, and from
an SCM perspective. Examine how can you can move machine workloads
around to free up hardware. Look at system utilization to better
plan for resourcing, and re-provision existing hardware and systems
wherever possible. More importantly, be prepared to
recycle ideas. Just because
something doesn't fit, or is too old for a specific point in time
or situation, doesn't mean that it's not generally
viable.
Think Globally, Act Locally
My favourite lesson from the environmental movement has always been
“think globally, act
locally”. How can a problem be
addressed in a reasonably generic way (or global), while still
solving the specific product's (local) issues. With a build system,
this is fairly easy to do. Whether you're using Make, (N)/Ant, or
SCons, there's always a way to address problems in a
product-agnostic fashion.
Some languages require that you make global rules and override
them. Others support creating a collection of shared functions,
actions, or targets. In target based build languages such as Ant
and NAnt, it's relatively easy to have a shared target in a global
build system, and then have it call the “local” target if it
exists, as in the example below:
When planning for configuration management, remember the “think
globally, act locally” pattern. For a little bit of upfront effort,
it's possible to yield significant savings, while at the same not
overindulging in the tendency to write overly-generic
modules.
Everything is Interconnected
While true of any system, this axiom above is a mantra every
Configuration Management professional should learn to live by. A
good CM and Build System has as few dependencies as possible on the
outside world. Ideally the dependencies would be limited to
networking and power, not external servers or services over which
the CM team has little control. The same should apply
internally.
We need to accept that our system is interconnected between file
shares, web and database servers, revision control systems, network
availability, or some other dependency we haven't thought of. But,
while everything is interconnected, we need to reduce the level of
interconnectedness, in order to reduce possible failure points, our
footprint, and to make things easier to manage.
Look at using protocols that are more tolerant to faults. Analyse
transfer times between systems to understand bottlenecks, packet
patterns, and simply, where the time goes. Verify that operating
system choices are good ones, and that those operating systems are
tuned properly. This sort of proactive information gathering can
yield terrific dividends. One build system I audited, managed to
decrease their transfer times by 35%, solely by changing a routing
table. In another case, we reduced checkout times by nearly 50%
solely by reducing changing, and then tuning the operating system
on the revision control server.
Keeping track of the interconnectedness of things makes terrific
sense for Configuration Management Planning. Tracking and
understanding the flow of information through the CM system can
help us reduce our failure points, and failure rates.
Understanding, and then reducing these dependencies, helps make for
a stronger CM system, and a more fault-tolerant
one.
Everything Goes Somewhere
There's
no Such Thing as a Free Lunch
Whether we're talking about the planet, or the Configuration
Management, lunch is never free. Every branch, every build, every
path adds a minute strain to the system. The key is to understand
the effect choices have over time, to enable the CM team to account
for this in their planning.
Keeping track of resource consumption across the network, whether
in the form of disk space, processor utilization, or network
utilization helps account for the cost associated with “free”
events. Using a tool to track these details on developer desktops
makes it even easier to qualify the cost associated with branching,
and make the business case for a hardware investment. Whether the
effect is on storage, network, or even time, the point is that
nothing is free. Each branch has a ramification, and that's before
we look at handling merge issues.
Just like with the planet, we want to reduce the footprint of our
configuration management system, and activities as much as
possible. We'll never be able to hit a zero footprint, or “free
lunch”, but that doesn't mean we shouldn't try to trend as close to
zero as possible. From the Configuration Management point of view,
we can trend towards that free lunch with automation and
monitoring. By donning our system's administrators caps, we can
monitor over time, and plan for automation, with the goal of
getting as close as possible to our very
lunch.
Nature Bats Last
While we've discussed the environmental affect of our systems,
we've almost completely ignored our users. If we were to approach
the environment as a baseball game, we'd realize that nature bats
last. In the case of SCM, we need to realize that our users,
represent nature, and that they have the last at-bat. No matter how
much effort we put into planning for CM, nature, or our users will
invariably require am unplanned response. People will always have
their own opinions, wants, and even need; these are the things that
lay a plan to waste, if the plan doesn't include flexibility.
People will always have needs outside of the design of the CM
system. Planning for the unexpected can yield terrific results, but
it invariably leads to the question “how do I plan for the
unexpected?”. Part of that leis in our earlier discussion,
understanding what you have and what you can support, or in this
article's parlance, understanding that
Everything is Interconnected.
Knowing your available
disk space, processing power, and network availability, helps deal
with human nature. Flexibility in design, whether it's using
something as simple at
getopt compliant options in
scripts, or overrideable variables in a build system, help you
accept these future goals, and roll them into the plan. Never
imagine that all your users want to work in the same manner, use
the same, tools, or interact with the system in the same way.
Reacting
to Today, Planning for Tomorrow
Much like the planet, a build system has to deal with today's
reality, prior to planning for the future tomorrow brings. Think
about triage; try to understand what you can do today, to plan for
a better tomorrow. How can the team plan for the future CM needs of
the organization, while meeting today's goals? That challenge can
best be met by asking the questions above, and preparing for the
future in the least intrusive manner possible.
Sure, today's situation is not ideal; but much like with the
environment, our goal is to strive for the idealized future. Plan
for tomorrow, and work on implementing today.