Note: This document is work-in-progress. Please don’t publish it on news sites, or otherwise link to it in public without the author’s permission. Private linking is acceptable.
The first advice I can give is to write functional specs. In the link, Joel Spolsky explains the motivation and method of writing functional spec. A functional spec describes how the end-user will use and interact with the program. It is not a technical spec which explains how the inner code will work.
From my experience, functional specs are fun to write, reveal many problems in the initial design, and make you think how the program will work on the inside.
Here are three examples for functional specs I wrote:
Functional Spec for a Freelancers Board (with a Biblical theme).
Functional Spec for a better classification of CPAN Modules (with a theme of FOSS world celebrities).
Functional Spec for a Windows package management system. (featuring characters from Ozy and Millie).