1. Good/difficult programming books, the more theoretical the better. Blogs are full of windbags and echo-chamberism; after a certain point, you'll just waste your time reading them. I've kind of exhausted what I can read from my local Borders just sitting in the cafe, unfortunately, and it gets fairly expensive to buy niche stuff.<p>2. New languages, new application domains, new concepts. This could mean "closer to the hardware," or "further from the hardware." They both have uses. I have a lengthy list of languages I want to get around to learning...but have no compelling immediate use for, which is a strong discouraging factor. Hence application domains - if you're doing coding for small embedded processors, you're forced down to a few language options. If you're doing web apps, another set of options. If you're doing compilers, a third set of options. Et cetera. Find the app that lets you learn the language.<p>3. Cycling between "research" coding(a tool, algorithm or data structure that might do something cool and useful) and "production" coding(bang out the app). If I did only the latter, I probably wouldn't learn anything! But the former lets me lay down a strategy for "this time, I'll be more efficient by doing x...." and then I try it and find out if x worked.<p>I would also note that commercial programming work is likely to limit your growth unless you're working at a hardcore tech company. (I'm unemployed at the moment, going into indie game development, and I've been consistently emphasizing the use of technology to automate more, tighten the iteration cycle, and wring out more quality in less time, so I have few limits other than "make it good enough to pay the bills.")