Ask The Computer

Don't reason about what will happen if you do X. Do X and see what happens. Send the Message and see what it does.

~

I used to always say that the best quality for a programmer is persistence, but the best quality for a system analyst is Foresight (see also Guerrilla Guide To Interviewing). Of course, if you're stuck developing a whole system by yourself, then it helps to have both. Foresight is of supreme importance because it keeps you from spending an inordinate amount of effort following Anti Patterns down the wrong path.

Unfortunately, I have found it a rather difficult task to teach somebody to have foresight. It seems more like an innate human trait, people either have it or they don't. If you are a person with foresight, then when you are in the middle of a development project and you face a Decision (a fork in the road, which way should I go from here, what's the right thing to do next?), you connect to yourself (or your clients, or whomever will maintain your software) in the future, and you find out how come they are so happy with what you have done. This will then guide you to do the right thing in the present (a structure? internal documentation? a methodology or algorithm? formal documentation? a self-contained parameter-driven external procedure?).