InfoQ just put up a presentation I did at StrangeLoop last year. It's a bit fuzzy as my talks go because I'm describing a way of thinking about design while doing it.
The crux involves thinking about the shapes of data and articulating intermediate steps between the input and output of a piece of a program. I find that this helps me jiggle my thoughts about structure and arrive at the names of functions later. It's sort of a sandwich between top-down and bottom-up.