A bit of both. It depends on how many times I've done the solution to the problem at hand. And how familar I am with the problem domain. The more experience/familarity I have, the more time I spend trying to improve the code. I have to admit that I don't ever remember saying 'I need to decrease coupling' though—usually it's more along the line of 'This code sucks!' or 'What the hell was I doing there?'
When I start on something new, I spend most of my time doing research. Then when I have some slight clue, I proceed to implement my newly acquired vague notion. I tend to do this in a top down fashion and I iterate the code until I've achieved some minimal goal (i.e. like 'Ok, this works, now what?) One thing I do as I move (hopefully forward) along, is review the code that I've written. This is particularly handy if I'm stuck on some feature or solution, since I can switch to improving existing code as a break from pondering problems. Often a side effect of this disjoint approach is that my subconscious mind manages to come up with the needed answer/s.