|
Page 3 of 3 "So then I tried . . ."
There are a lot of things you
might do when an error or bug comes up. Many of them make the problem
worse. A friend of mine at school deleted all her Word documents by
mistake, and before calling in any expert help, she tried reinstalling
Word, and then she tried running Defrag. Neither of these helped
recover her files, and between them they scrambled her disk to the
extent that no Undelete program in the world would have been able to
recover anything. If she’d only left it alone, she might have had a
chance.
Users like this are like a mongoose backed into a
corner: with its back to the wall and seeing certain death staring it
in the face, it attacks frantically, because doing something has to be
better than doing nothing. This is not well adapted to the type of
problems computers produce.
Instead of being a mongoose, be an
antelope. When an antelope is confronted with something unexpected or
frightening, it freezes. It stays absolutely still and tries not to
attract any attention, while it stops and thinks and works out the best
thing to do. (If antelopes had a technical support line, it would be
telephoning it at this point.) Then, once it has decided what the
safest thing to do is, it does it.
When something goes wrong,
immediately stop doing anything. Don’t touch any buttons at all. Look
at the screen and notice everything out of the ordinary, and remember
it or write it down. Then perhaps start cautiously pressing “OK” or
“Cancel”, whichever seems safest. Try to develop a reflex reaction - if
a computer does anything unexpected, freeze.
If you manage to
get out of the problem, whether by closing down the affected program or
by rebooting the computer, a good thing to do is to try to make it
happen again. Programmers like problems that they can reproduce more
than once. Happy programmers fix bugs faster and more efficiently.
"I think the tachyon modulation must be wrongly polarised."
It
isn’t only non-programmers who produce bad bug reports. Some of the
worst bug reports I’ve ever seen come from programmers, and even from
good programmers.
I worked with another programmer once, who
kept finding bugs in his own code and trying to fix them. Every so
often he’d hit a bug he couldn’t solve, and he’d call me over to help.
“What’s gone wrong?” I’d ask. He would reply by telling me his current
opinion of what needed to be fixed.
This worked fine when his
current opinion was right. It meant he’d already done half the work and
we were able to finish the job together. It was efficient and useful.
But
quite often he was wrong. We would work for some time trying to figure
out why some particular part of the program was producing incorrect
data, and eventually we would discover that it wasn’t, that we’d been
investigating a perfectly good piece of code for half an hour, and that
the actual problem was somewhere else.
I’m sure he wouldn’t do
that to a doctor. “Doctor, I need a prescription for Hydroyoyodyne.”
People know not to say that to a doctor: you describe the symptoms, the
actual discomforts and aches and pains and rashes and fevers, and you
let the doctor do the diagnosis of what the problem is and what to do
about it. Otherwise the doctor dismisses you as a hypochondriac or
crackpot, and quite rightly so.
It’s the same with programmers.
Providing your own diagnosis might be helpful sometimes, but always
state the symptoms. The diagnosis is an optional extra, and not an
alternative to giving the symptoms. Equally, sending a modification to
the code to fix the problem is a useful addition to a bug report but
not an adequate substitute for one.
If a programmer asks you for
extra information, don’t make it up! Somebody reported a bug to me
once, and I asked him to try a command that I knew wouldn’t work. The
reason I asked him to try it was that I wanted to know which of two
different error messages it would give. Knowing which error message
came back would give a vital clue. But he didn’t actually try it - he
just mailed me back and said “No, that won’t work”. It took me some
time to persuade him to try it for real.
Using your intelligence
to help the programmer is fine. Even if your deductions are wrong, the
programmer should be grateful that you at least tried to make their
life easier. But report the symptoms as well, or you may well make
their life much more difficult instead.
"That's funny, it did it a moment ago."
Say
“intermittent fault” to any programmer and watch their face fall. The
easy problems are the ones where performing a simple sequence of
actions will cause the failure to occur. The programmer can then repeat
those actions under closely observed test conditions and watch what
happens in great detail. Too many problems simply don’t work that way:
there will be programs that fail once a week, or fail once in a blue
moon, or never fail when you try them in front of the programmer but
always fail when you have a deadline coming up.
Most
intermittent faults are not truly intermittent. Most of them have some
logic somewhere. Some might occur when the machine is running out of
memory, some might occur when another program tries to modify a
critical file at the wrong moment, and some might occur only in the
first half of every hour! (I’ve actually seen one of these.)
Also,
if you can reproduce the bug but the programmer can’t, it could very
well be that their computer and your computer are different in some way
and this difference is causing the problem. I had a program once whose
window curled up into a little ball in the top left corner of the
screen, and sat there and sulked. But it only did it on 800×600
screens; it was fine on my 1024×768 monitor.
The programmer will
want to know anything you can find out about the problem. Try it on
another machine, perhaps. Try it twice or three times and see how often
it fails. If it goes wrong when you’re doing serious work but not when
you’re trying to demonstrate it, it might be long running times or
large files that make it fall over. Try to remember as much detail as
you can about what you were doing to it when it did fall over, and if
you see any patterns, mention them. Anything you can provide has to be
some help. Even if it’s only probabilistic (such as “it tends to crash
more often when Emacs is running”), it might not provide direct clues
to the cause of the problem, but it might help the programmer reproduce
it.
Most importantly, the programmer will want to be sure of
whether they’re dealing with a true intermittent fault or a
machine-specific fault. They will want to know lots of details about
your computer, so they can work out how it differs from theirs. A lot
of these details will depend on the particular program, but one thing
you should definitely be ready to provide is version numbers. The
version number of the program itself, and the version number of the
operating system, and probably the version numbers of any other
programs that are involved in the problem.
"So I loaded the disk on to my Windows . . ."
Writing
clearly is essential in a bug report. If the programmer can’t tell what
you meant, you might as well not have said anything.
I get bug
reports from all around the world. Many of them are from non-native
English speakers, and a lot of those apologise for their poor English.
In general, the bug reports with apologies for their poor English are
actually very clear and useful. All the most unclear reports come from
native English speakers who assume that I will understand them even if
they don’t make any effort to be clear or precise.
- Be
specific. If you can do the same thing two different ways, state which
one you used. “I selected Load” might mean “I clicked on Load” or “I
pressed Alt-L”. Say which you did. Sometimes it matters.
- Be
verbose. Give more information rather than less. If you say too much,
the programmer can ignore some of it. If you say too little, they have
to come back and ask more questions. One bug report I received was a
single sentence; every time I asked for more information, the reporter
would reply with another single sentence. It took me several weeks to
get a useful amount of information, because it turned up one short
sentence at a time.
- Be careful of pronouns. Don’t use words
like “it”, or references like “the window”, when it’s unclear what they
mean. Consider this: “I started FooApp. It put up a warning window. I
tried to close it and it crashed.” It isn’t clear what the user tried
to close. Did they try to close the warning window, or the whole of
FooApp? It makes a difference. Instead, you could say “I started
FooApp, which put up a warning window. I tried to close the warning
window, and FooApp crashed.” This is longer and more repetitive, but
also clearer and less easy to misunderstand.
- Read what you
wrote. Read the report back to yourself, and see if you think it’s
clear. If you have listed a sequence of actions which should produce
the failure, try following them yourself, to see if you missed a step.
Summary
- The
first aim of a bug report is to let the programmer see the failure with
their own eyes. If you can’t be with them to make it fail in front of
them, give them detailed instructions so that they can make it fail for
themselves.
- In case the first aim doesn’t succeed, and the
programmer can’t see it failing themselves, the second aim of a bug
report is to describe what went wrong. Describe everything in detail.
State what you saw, and also state what you expected to see. Write down
the error messages, especially if they have numbers in.
- When
your computer does something unexpected, freeze. Do nothing until
you’re calm, and don’t do anything that you think might be dangerous.
- By
all means try to diagnose the fault yourself if you think you can, but
if you do, you should still report the symptoms as well.
- Be
ready to provide extra information if the programmer needs it. If they
didn’t need it, they wouldn’t be asking for it. They aren’t being
deliberately awkward. Have version numbers at your fingertips, because
they will probably be needed.
- Write clearly. Say what you mean, and make sure it can’t be misinterpreted.
- Above all, be precise. Programmers like precision.
|