Too bad I can only ++ you once, steves
I've always done most of it in my head during more mundane activities like driving the car, mowing the lawn or visting relatives
I get a good deal of work done this way. Once I get an idea of the data I'll be working with, I start thinking about the data structures I'll use within my application. I often find that this kind of design is easier to do when I'm not at my desk.
When I'm into it a bit I also usually write some throw-away test code to help solidify the ideas. I've never been a fan of the design first/code second method -- I just have to try things out or it gets too abstract.
I've learned that in my job, the users often don't really know what they want, and they will agree to a paper specification without really reviewing it. I think a lot of people have a tough time visualizing the end product from some words and mocked up screens on paper. So I like to hack up a prototype application as soon as I get the basic requirements, then let the users comment on that. Not to mention that this increases the fun factor by minimizing the amount if spec. writing and maximizing the amount of coding.