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 software will work.
From my experience, functional specs are fun to write, reveal many problems in the initial design, and make you think how the software 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).