My approach probably sucks, but I just pick a feature I'm interested in making happen and then just hack away at it and anything required to make it happen. Eventually, I get in the mood to clean up the mess left behind by this process and spend time doing that. There is a lot of wasted time, but it seems like I get more done even with the wasted time. Maybe I'm just working longer hours because I'm working on stuff I want to implement, or maybe I'm just more productive with the hours I work. I'm not sure which it is, but it seems to work.
Note I do have to mix in the sucky stuff I never feel like doing. Usually it's not too complicated, so I can knock out a ton of the boring stuff in a single week. Often that will burn me out and I'll take a mini-vacation, but it still seems faster to work for a week and take half a week off than it does to constantly convince myself how the boring code must wait so I can play minesweeper or clean an already clean part of the house or whatever else I come up with to procrastinate.
Edit: by hacking away at something, I mean just making something work. Sort of like a proof of concept in a lot of ways. I'm not worried about bugs or code re-usability or scalability or performance or anything, just seeing a result. Fleshing out the details is included in what I called cleaning up the mess.