I think my biggest lesson as a programmer was returning to large projects I hadn't touched in a few months, needing to implement big changes. Nothing else has developed my sense of where, when, and how to separate concerns.
I'd recommend toying around with "design patterns", which forces you to think about different approaches. But I might be answering this at a different scale than you're asking. Personally I've found my biggest challenges have been structural... rather than coming up with tight little algorithms for things.
just kidding, of course.
You don't want to be clever when writing code. Clever is hard to read. You want to be readable.
[1] http://trillian.mit.edu/~jc/humor/ATT_Copyright_true.html