I'm not in the same league as most of the guys on this thread, but I'll add my perspective anyway.

I prefer to work things out mathematically, so the first step for me is to build a flexible and thorough library of math functions that are distributed within a bundle of custom classes. Once these are established, I write additional classes that contain functions for rendering, input handling, etc.

I write copious comments in my code until a class is in its final state, often with "note to self" multiple times.

I think it's important to develop a personal library of classes that can be used in a wide variety of situations before moving into a full blown project. If you're going to be making games, alot of it is writing low-level code, so it's easiest to write it once, make it flexible, and only have to code the things that are specific to the project.

From there, it's alot of thinking on paper and reading stuff on FK, Kirupa, LiveDocs, etc. I think the slowest part of any planning I do has to be thinking on paper because I try to work out all the possible pros and cons in the design approach to each element before I script.

Also, I prefer to avoid author-time construction of anything I work on, unless it is necessary. In nearly all cases, if I do not script it, it isn't in my project (with the exception of graphics, of course).