While I won't say this is bad advice, I also don't think it's the best way to truly free yourself in the manner I think the OP is getting at. In the long run you'll be far better off learning and cultivating rock solid CS fundamentals rather than just hopping from one framework to the next hoping to glean a little more from each. Having an in-depth understanding of the types of data structures and algorithms that go into developing $new_hotness will allow you to pick up different languages/frameworks/etc significantly faster than just learning $new_hotness on the surface level.
Take parametric polymorphism [1] as a random example; i.e. what's called generics in Java, templates in C++, etc. You might know how to use it in a particular language and realize it provides some benefit. But if you truly understand the underlying concept then you can quickly recognize it and/or know to look for it in any language you pick up, whether it's Java, OCaml, Visual Prolog, etc. Note each of those languages are in three totally separate paradigms (object oriented, functional, & logic) and yet all of them still make use of the same underlying idea to achieve a particular goal (in this case, a form of type-safe expressivity). If you have a good understanding of $random_fundamental_concept then all you would need is to take a couple minutes to learn its syntax in your new language of choice and be on your way. I chose that example because it was the first that popped into my head, but in reality it goes for just about anything.
In short, with a good understanding of the fundamentals, you can make the time it takes to learn something new that will invariably be based on them significantly shorter.
How do you establish the deep understanding of these concepts without actually using them in their various incarnations? I don't believe that reading the definition of parametric polymorphism is enough for someone to recognize the place it should be used in a real project and to use it there in a way that won't cause trouble.
Also, "learning and cultivating rock solid CS fundamentals" is a given - we're talking about what more to do.
I've been taking the Programming Languages course on Coursera, the motivation for the course is exactly what you're talking about. "Syntax doesn't matter" has become something of a catchphrase in the lectures, emphasis is always on semantics and how different languages accomplish the same/similar things.
As the author, I completely agree, good fundamentals are critical, and not be be neglected. I make the practice of fundamentals a regular part of my learning new languages. I just finished a project in Clojure that was implementing a variety of typical algorithms, but in a functional way. I now understand those algorithms far deeper, and with a greater understanding of their complexities and run times than if I had just done them in my "go-to" language.
Comments
While I won't say this is bad advice, I also don't think it's the best way to truly free yourself in the manner I think the OP is getting at. In the long run you'll be far better off learning and cultivating rock solid CS fundamentals rather than just hopping from one framework to the next hoping to glean a little more from each. Having an in-depth understanding of the types of data structures and algorithms that go into developing $new_hotness will allow you to pick up different languages/frameworks/etc significantly faster than just learning $new_hotness on the surface level.
Take parametric polymorphism [1] as a random example; i.e. what's called generics in Java, templates in C++, etc. You might know how to use it in a particular language and realize it provides some benefit. But if you truly understand the underlying concept then you can quickly recognize it and/or know to look for it in any language you pick up, whether it's Java, OCaml, Visual Prolog, etc. Note each of those languages are in three totally separate paradigms (object oriented, functional, & logic) and yet all of them still make use of the same underlying idea to achieve a particular goal (in this case, a form of type-safe expressivity). If you have a good understanding of $random_fundamental_concept then all you would need is to take a couple minutes to learn its syntax in your new language of choice and be on your way. I chose that example because it was the first that popped into my head, but in reality it goes for just about anything.
In short, with a good understanding of the fundamentals, you can make the time it takes to learn something new that will invariably be based on them significantly shorter.
[1] http://en.wikipedia.org/wiki/Parametric_polymorphism
How do you establish the deep understanding of these concepts without actually using them in their various incarnations? I don't believe that reading the definition of parametric polymorphism is enough for someone to recognize the place it should be used in a real project and to use it there in a way that won't cause trouble.
Also, "learning and cultivating rock solid CS fundamentals" is a given - we're talking about what more to do.
I've been taking the Programming Languages course on Coursera, the motivation for the course is exactly what you're talking about. "Syntax doesn't matter" has become something of a catchphrase in the lectures, emphasis is always on semantics and how different languages accomplish the same/similar things.
https://www.coursera.org/course/proglang
Snap, me too. It's a great course run by Dan Grossman (who pops up on HN occasionally).
I signed up to learn functional programming and have learnt a lot.
As the author, I completely agree, good fundamentals are critical, and not be be neglected. I make the practice of fundamentals a regular part of my learning new languages. I just finished a project in Clojure that was implementing a variety of typical algorithms, but in a functional way. I now understand those algorithms far deeper, and with a greater understanding of their complexities and run times than if I had just done them in my "go-to" language.