While I'm talking about metaphors...
A very long time ago, I learned to fence. What you see above is a
lunge. A lunge moves you from a defensive posture to an attacking
one—you're trying to stab the other person. But notice that
the figure is balanced. Its center of gravity is between its feet,
and it could remain in that position without tipping either forward
or back.
If its opponent counters the attack and launches a counterattack, it
could recover backward by pushing off the front leg, snapping the
back arm up, and reassuming the original
en garde position:
But suppose the opponent retreats away from the attack. Then our
lunging figure
can recover forward: keeping the center of gravity as is,
pull the back leg in and curl the back arm. Now it's ready to keep
pressing the attack: it can lunge again or move forward in a more
guarded way.
The important thing here is that—despite the failure of the
original attack—the manner in which it moved forward
allows it to keep moving forward.
Software teams often seem to be unable to recover forward. If they
make a wrong decision, they land off balance:
The can
scramble awkwardly backward (svn revert), leaving them
worse off than before:
Or they can bull forward along a path they would not have
chosen, had they known then what they know now, jabbing repeatedly and
getting more and more off balance:
What they're unable to do is make use of where they are to take what
now appears to be the best path:
For those of us who are merely mortal, it seems the best way to be
able to recover forward is to practice the right stance. Get
yourself into lots of situations where you end up going down
the wrong path. Instead of reverting backward to a known stable
state of code, add and rearrange code to move forward.
A good way to get yourself into those situations is by only writing
the code that's needed for the small feature you're working on right
now. Then some later small feature will make you recover
forward—and learn about how your stance is imbalanced.
Some people believe you can recover forward from pretty much
anything. (Ron
Jeffries' Extreme
Programming Adventures in C# demonstrates recovering forward from
a design that doesn't support undo to one that does.) Others don't. I
don't know what my opinion is, but I believe most people could recover
forward a lot more than they think they can, if they practice.
The trick is persuading them to practice.
Credits: I learned to move forward instead of revert from Zhon
Johansen.
The first photo is
from Dr. Stephan
Dann and is licensed under the Creative Commons
Attribution-ShareAlike 2.0 license.
The second photo is
from [www.tcnj.edu];
there's no copyright notice, but it looks to be from an old fencing book.