TITLE: Developing Instinct
AUTHOR: Eugene Wallingford
DATE: May 28, 2009 10:02 PM
DESC:
-----
BODY:
One of the challenges every beginner faces is learning
the subtle judgments they must make. How much time
will it take for us to implement this story? Should
I create a new kind of object here? Estimation and
other judgments are a challenge because the beginner
lacks the "instinct" for making them, and the
environment often does provide enough data to make
a clear-cut decision.
I've been living with such a beginner's mind this
week on my morning runs. Tuesday morning I started
with a feeling of torpor and was sure I'd end with
a slow time. When I finished, I was surprised to
have run an average time. On Wednesday morning,
I felt good yet came in with one of my slowest
times for the distance ever. This morning, my legs
were stiff, making steps seem a chore. I finished
in one of my better times at this distance since
working my mileage back up.
My inaccurate judgments flow out of bad instincts.
Sometimes, legs feel slow and steps a challenge
because I am pushing. Sometimes, I run with ease
because I'm not running very hard at all!
At this stage in my running, bad instincts are not
a major problem. I'm mostly just trying to run
enough miles to build my aerobic base. Guessing
my pace wrong has little tangible effect. It's
mostly just frustrating not to know. Occasionally,
though, the result is as bad as the judgment.
Last week,
I ran too fast on Wednesday after running faster
than planned on Tuesday. I ended up sick for the
rest of the week and missed out on 8-10 miles I
need to build my base. Other times, the result
goes the other way, as when I turned in a
best-case scenario half-marathon
in Indianapolis. Who knew? Certainly not me.
So, inaccurate instincts can give good or bad
results. The common factor is unpredictability.
That may be okay when running, or not; in any
case, it can be a part of the continuous change
I seek. But unpredictability in process is not
so okay when I am developing software. Continuous
learning is still good, but being wrong can wreak
havoc on a timeline, and it can cause problems for
your customer.
Bad instincts when estimating my pace wasn't a
problem two years, though it has been in my deeper
past. When I started running, I often felt like
an outsider. Runners knew things that I didn't,
which made me feel like a pretender. They had
instincts about training, eating, racing, and
resting that I lacked. But over time I began to
feel like I knew more, and soon -- imperceptibly
I began to feel like a runner after all. A lot
-- all? -- of what we call "instinct" is developed,
not inborn. Practice, repetition, time -- they
added up to my instincts as a runner.
Time can also erode instinct. A lack of practice,
a lack of repetition, and now I am back to where
I was several years ago, instinct-wise. This is,
I think, a big part of what makes learning to run
again uncomfortable, much as
beginners are uncomfortable
learning the first time.
One of the things I like about agile approaches to
software development is their emphasis on the
conscious attention to practice. They encourage
us to reflect about our practice and look for ways
to improve that are supported by experience. The
practices we focus on help us to develop good
instincts: how much time it will take for us to
implement a story, when to write --
and not write
-- tests, how far to refactor a system to prepare
for the next story. Developing accurate and
effective instinct is one way we get better, and
that is
more important than being agile.
The traditional software engineering community
thinks about this challenge,
too. Watts Humphrey created the Personal Software
Process to help developers get a better sense of
how they use their time and to use this sense to
get better. But, typically, the result feels so
heavy, so onerous on the developers it aims to
help, that few people are likely to stick with it
when they get into the trenches with their code.
An aside: This reminds me of conversations I had with
students in my AI courses back in the day. I asked
them to read Alan Turing's classic
Computing Machinery and Intelligence,
and in class we discussed the Turing Test and the
many objections Turing rebuts. Many students clung
to the notion that a computer program could never
exhibit human-like intelligence because humans lacked
"gut instinct" -- instinct. Many students played
right into Turing's rebuttal yet remained firm; they
felt deeply that to be human was different. Now, I
am not at ease with scientific materialism's claim
that humans are purely deterministic beings, but the
scientist in me tells me to strive for natural
explanations of as much of every phenomenon as
possible. Why couldn't a program develop a "gut
feeling"? To the extent that at least some of our
instincts are learned responses, developed through
repetition and time, why couldn't a program learn
the same instincts? I had fun playing devil's
advocate, as I always do, even when I was certain
that I was making little progress in opening some
students' minds.
In your work and in your play, be aware of the role
that practice, repetition, and time play in developing
your instincts. Do not despair that you don't have
good instincts. Work to develop them. The word
missing from your thought is "yet". A little
attention to your work, and a lot of practice, will
go a long way. Once you have good instincts, cherish
them. They give us comfort and confidence. They make
us feel powerful. But don't settle. The same attention
and practice will help you get better, to grow as a
developer or runner or whatever your task.
As for my running, I am certainly glad to be getting
stronger and to be able to run faster than I expect.
Still, I look forward to the feeling of control I have
when my instincts are more reliable. Unpredictable
effort leads to unpredictable days.
-----