It is largely depends on number of things and the most important one is what are you making.
1) The first step to me is to declare what are you making. Sound, simple? sometime is not. List down what you want the program to do. List what is the must-have, what is nice-to-have and what is ok-to-have (not much trouble to include).
2) The second step is to (at your best) identify what is the weakest link for the success of your project. If you are writing WebDB, what you should worry is web UI (transition from a page to another) and data model. If you are writing game, the rules of the game will be important. Or if the game is highly interfactive, then you should think of the interaction the flow of the game.
What you identified here is what you should spend time design it on paper.
Since identifying that will likely to require experience and you may not have (if you do, you will already know what to do, right :-D), you may come back to review it once in a while as project progress.
3) To avoid over-engineering, focus on modeling for understanding as oppose to modeling as documenting.
4) Once you understand more, try to create a small program to check if it is possible. If you, identify other critical but risky part.
5) Start small but always think about extension. To me, it is OK to think big but it is risky to do big.
Those are what I do. Hope it will give you some idea. :-D