|laziness, impatience, and hubris|
When I first think of a new project, I try and draw out exactly how the meat of the project will work. This is the first thing I attack during my process. I always catch myself trying to add features, or trying to make it sleek even before the thing works. I can usually catch myself and write those items down for later. Or "After it Works" (tm).
Once I have the basic code working, I start drawing out all the things I want to add to my project. Then I take another look at my methods used for the working code and see if everything will fit the way I have it down so far.
The next phase for me is a little messy. I think I start to brainstorm a bit and I quickly add features/improvements all over the place. I can tell that I should learn to curb this habit before doing anything larger.
Another thing I've found is never ever release an early concept to friends. =) "add this", "do this", "this would be cool" - I learned my lesson, they get it after its done
Once I get most of the features in that I want, I start to organize myself a bit and clean up the code. I do this until I'm satisfied with the layout(functions++), then I complete any outstanding features within the new structure.
Then I release.....