Do you have a TODO list Sure you do. I bet you have all sorts of cool projects on it, like a better todo list application, a web spider for some RSS feeds, a search engine experimentation, a git backend built on riak, and a slew of other ideas you haven't got around to.
I bet you also have some new programming languages you want to learn. Maybe expand your scripting language knowledge with some Python, break into functional programming with Clojure and Haskell, and go hardcore OO with Smalltalk.
The first problem you encounter is you need some sort of non-trivial project to really learn a language. Hello, World! only goes so far, and building a blog 7 times over gets boring quite quick.
So you wake up on a Saturday with some vigor and excitement, and you think "I'll pump out this little webapp idea with python and django on AppEngine." You've got stuff to do on Sunday, so you want to try to get it done by the end of the day.
Now the problem is that by wanting to learn Python with a non-trivial project, you now have to learn a new non-trivial framework, along with other various non-trivial libraries. You might be lucky if you get the basic datamodel laid out with whatever ORM the framework uses.
You can push through and hope you find all the right blog posts and documentation pages, struggling with some stupid syntax problem or framework quirk (there's a "django-annoying" library…), sorting out the deployment issues, and maybe working later into the evening. At this point, you might have a working application, but the code is terrible (hey, you're learning), and the application is probably laid out all wrong. But it works.
You can just grab your current favorite language and framework, hammer the app out in a few hours, and you've still got time to promote your new app, clean up the code for public consumption, work on another todo list item, and take your better half out for dinner.
With the first method, you probably learn something, enough even that the next app won't be so bad to start up. The app might not be pretty and you probably spent all day working on it. It'll probably crash and generally isn't that pretty. But you learned something.
With the second method, you got way more done, and it's probably a well built app since you're well versed in the language and framework you used. But you learned a lot less, if anything at all. No new language, no new framework, no new programming paradigms.
Learning. I wants it. Productivity. I wants it. I can't have both at the same time it seems, so what do you do? Suck it up and have a few crap days of productivity to learn something completely new,1 or specialize like a maniac and crank the productivity through the roof? I think a big part of it is, are you excited about the project, or excited about the language (or platform, or framework, etc)?
What do you do? Do you even worry about it? Add your comments below.
As opposed to learning a new library in your language of choice, which is considerably easier than learning a new language and framework from scratch.