I run through nearly every part of a system in my head before I even think about touching a keyboard. I think about it at the highest levels, then hone in on areas I know will be difficult or enforce some particular constraint on the system. When I think I have a good understanding of what I'm about to build, the technology I need to use, and constraints - then I sit at a PC and start to...study all that shit in detail. I make sure I know the algorithms and techniques I'm looking to use are appropriate.
After that, it's just a matter of sitting down and pushing the design out of my brain and into the PC. I usually code alone these days so 9/10 times I will pound it straight into code with perhaps a set of notes typed up for reminders of what I just worked out.