I think he's operating with the assumption that all languages have the same concepts, just with different "lexical and syntactical bureaucracy." But I think the point of the advice to learn more programming languages is to expose yourself to different programming paradigms. And in order to do this, I don't think you need to become an expert in the nuances of that language, but you need to become comfortable in thinking in new ways.
If your language of choice is C, and you learn Pascal, then you haven't gained any new concepts. But if your language of choice is C, and you learn Prolog, then you will be exposed to a whole new way of thinking.
My native state of coding is procedural with a sprinkling of OO, mainly to represent families of concrete data types. I find functional programming appealing on an emotional level, and my attempts to learn how to think functionally have changed my native coding habits, even in non-functional languages.
My pragmatic advice is learn enough of a language from a different programming paradigm so you can apply that new way of thinking to your native language.
I didn't read it that way. He's seems to be claiming that getting good at a new language involves a lot of non-mind-expanding overhead---which, in the author's estimation, isn't worth the opportunity cost past one or two additional (sufficiently different) languages. I think this passage sums it up:
Aside from the immediate reasons, there's some merit to the mind expansion argument. I think being proficient in at least two languages is indeed important for boosting your ability as a developer. This resembles human language: learning a second one changes the way you think and your perception of the world. The third or fourth, not as much. But it can't be any two languages. If you know Portuguese and Spanish, your mind didn't have to expand much. Likewise, learning VB.net and C# doesn't count.
My pragmatic advice is learn enough of a language from a different programming paradigm so you can apply that new way of thinking to your native language.
I think "enough" is a crucial point here. The author almost seemed to be arguing against switching to a new language every year, which I agree is ridiculous. The idea is to learn some new concepts, not to write significant programs in a new language every year. I only adopt new languages for regular work if they're the pragmatic choice.
That's exactly it. Saying that learning a new language is just a matter of learning a new syntax is like saying that an English-speaking, non-German speaker could translate a German text to English by taking a German-English dictionary and going through and translating the words one-by-one. It's not quite as simple as that.
A real phenomenon: there are people who never get anything done because they are constantly dabbling in the language flavor of the moment.
Another real phenomenon: some of the best programmers in the world still rely entirely on C. [Late edit: "and outperform developers in modern languages"].
I agree, absolutely. But I wouldn't go so far as to say that "dabbling in languages is counterproductive". That's like concluding that martinis are fundamentally wrong because some people are alcoholics.
I'd also suggest that of the two pathological conditions -- Overdabbling and Underdabbling -- the Underdabblers outnumber the Overdabblers by a huge margin. We just see a lot more of the latter on the Internet, because for many obsessive dabblers the whole point is to brag about it.
You need to find a balance. In the end, I think this essay is much more about that balance than its title suggests.
From Peter Norvig's "teach Yourself Programming in 10 years"
"Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal)."
That's actually very similar to the point this writer makes: that learning different languages does have benefits, but that they should be significantly different. The two just differ on whether you should learn many different languages, or a few.
These days, I don't know if I can trust advice on the internet anymore. Could be they just want to send the competition down the wrong path (Norvig is commercial now, working for Google). Follow their advice, and you waste a lot of time, while they are busy making progress.
His thesis: that learning the basics of most new languages is an exercise in tedium and trivia with little or negative benefit. He instead recommends reading high-quality code, learning computer science theory, and mastering a few quality tools (not Java).
I thought this was going to be a "let's make fun of this idiot" Reddit-type post, but I was wrong.
I promised myself long ago that I would never engage a "language war" thread. Not sure if I'm actually breaking my promise, but this article was too compelling to ignore. The author states what I've intuitively known all along, but was never really able to explain.
I am proficient in about a dozen languages, but only use 3. I go back to the SPS, PL1, Fortran, and COBOL days, and would rather chew razor blades than ever use them again. Today, I use javascript on the client and php on the server; I have yet to find a problem I couldn't solve with them.
In the years in between I discovered BASIC and have found it to be the Swiss army knife of apps. Not the old Dartmouth Basic, and certainly not anything Microsoft bastardized, but there are many other versions that seamlessly integrate with relational data bases that I think are a dream. <laughter dies down>
It's actually reached the point where I "think" in BASIC, design my app, and then sometimes write in in javascript or php.
I certainly wouldn't recommend my approach to someone else, but I think that's the whole point. Use the right tool for the job and get good at it. I see no need to learn new languages just for the purpose of learning something new. If I get "curious" or want to expand my mind, I can think of several hundred app problems waiting to be solved in any language, take your pick.
Thanks, Gustavo Duarte, for the chance to put a little thought into this. Time to xfer control back to work (GO TOs not allowed).
I think he misses the important benefit of being more marketable as a programmer. I have a major problem when I interview people and they are totally focussed on one language (e.g. Java). It's not the language that ends up worrying me, it's the lack of curiosity.
For that reason I often ask people in interviews to tell me about the computer they have at home: what OS does it run and why? And I ask them what they hack in their spare time. That tends to be very revealing.
I think the article would be received more warmly if it were put into the perspective of a company project. I.e., don't implement this new product in XYZ just because I want to know/learn XYZ and it's all the rage right now. That would be a waste of time.
I'm a full-time Java programmer now because it pays the bills. But you'd better believe I'm learning other lanaguages on the side, because it's pretty clear that Java 1.) has some serious limitations that other languages don't have, and 2.) is falling out-of-favor as a web development tool to more flexible, less statically-typed, more functional languages.
It's not so much to "open my mind" as it is to keep myself marketable after Java's impending demise.
> It's not so much to "open my mind" as it is to keep myself marketable after Java's impending demise.
As someone who is starting to step out of the comfort zone of Java, I agree about marketability. However, Java is not going to disappear, it's firmly entrenched. It's like COBOL. I'm not sure how Sun pulled it off exactly but Java in it's 13 years has spread itself in a lot of corporate systems/applications/backends (some of which may be COBOL). Ruby on Rails and other minority languages are the minority in some companies precisely because the majority don't like the minority ("RoR? We don't use that"). However, there are some rogues in companies who are trying to bring RoR in discretely (I'm trying to be one - developing business cases for RoR adoption on small projects)
Completely agree you shouldn't choose a language just because you feel like learning a new one but the article ignores the design implications of choosing one language over another. I just don't think it is a particularly complete or well reasoned argument and is a border line rant.
Waste of time? Quite a lot of fun things could be considered a waste of time. Learning new languages can be fun. People learning one language and sticking with it for life is why COBOL stuck around for so long, and Java seems to be going the same way.
EDIT: I just read the article. Maybe it's just that many of the languages I've been learning have had little syntax and no operator precedence quirks (or any operator precedence whatsoever). I also noticed the article made the same comment about COBOL and Java that I did. I really should read these things first. Anyway, I guess as a high school freshman I'm still at the point where learning new languages is really the best I can do.
> Maybe it's just that many of the languages I've been learning have had little syntax and no operator precedence quirks
This is a good point. It is probably not a good use of your time to learn Java and then C# (or similar), or Perl and then Python and Ruby. Sure, there are differences, but basically the languages in the same groups are the same.
If you go for the more "academic" languages, you'll get more return on your learning investment. Recently, I've learned Lisp (this is what started me down the "wait, learning new languages isn't a waste of time!" path), Smalltalk, and OCaml, and I've picked up a lot of good ideas to port to my primary language. (Otherwise, my background before that was C, Perl, and Haskell. All good languages to know :)
By all means, play around with different languages when you're getting started. I think it's really important to be exposed to different languages as part of your education, be it undergrad or (for you as it was for me) junior/high school.
But even in your situation, I'd say balance languages with other knowledge that is important. It's easy to play with languages because it's fun, but there's a lot of other important stuff to learn, some of which might make more practical difference to you.
But by all means, learn and have fun. If you're getting a kick out of languages, have at it, especially if you've got plenty of time.
Learning new languages teaches you what you know and most importantly don't know. Coming from a Java working background, I find Ruby on Rails pleasantly abstruse and remarkably concise (which makes it hard to learn, coming from the land of boilerplateness).
I have a long commute on the train and I find that when I am trying to debug/learn - (learning Ruby on Rails) - the time flies by like that. If that isn't a benefit (making time fly by when you're having fun learning), I don't know what is.
The article's not bad. His main focus, and he states it, is not to constantly learn new languages for the sake of profit. As a hobby cool, but not for profit. I can agree with that. There are all sorts of topics you could learn for fun and profit, and investing in a new language is not necessarily the silver bullet to mad coin.
Who cares though? I think as long as we're constantly learning, whether it's new programming languages, economics, or snowbaording, it makes life interesting. New skills always seem to come in useful at some point. Make the investment in learning things that interest you and it'll always pay off. Don't let someone else tell you what NOT to learn. That's jut silly. Heck even learning COBOL or FORTRAN would benefit you with a little insight, and might be fun in a retro sort of way.
I think that the writer is deliberately being controversial just to get a rise out of the readers. Having said that - he does make some valid points.
The bottom line is that you have to use the right tool for the job: it could mean using what you know, learning something new, or even inventing something totally new and original.
I get the impression that the author didn't think through his argument before he wrote it. He starts off saying one thing and proceeds to contradict himself. Really there are advantages and disadvantages to everything. Spending too much time learning new languages and never master CS basics is clearly a waste. However, never learning a new language, or more importantly, never programming in a fashion or environment that is unfamiliar to you, can lead to an insular way of thinking. "If all you have is a hammer, all problems begin to look like nuts," or something like that. Its a matter of being a little bit selective and aggressive with your choices. If a new language is too easy, its probably not teaching you much.
Is this about a refusal to learn new things, though? He does, after all, point out towards the end that good programmers use multiple languages - so whilst a refusal to learn new things is a bad thing, isn't a bit of prudence in how to budget your time a good thing?
You misread the article. He's not arguing against learning new things. He's arguing against learning the specific new things you want him to; he'd rather learn business or security.
I've read this article three times over now, trying to find a way to agree with it. I'm sorry, but since this guy thinks learning Dvorak is a better use of his time, I'm afraid I'm going to have to write him, and this terrible article off.
i just read up to here (2nd parapraph):
"The theory is that by learning a new language you "expand your mind" and become "a better programmer". Right. By that kind of argument we should all be eating LSD (don't)."
You should finish it. By the end of the essay, the guy has successfully argued himself out of half of his original thesis, and has laid the seeds for finishing off the other half. That's one of the good side effects of essay writing: You can start out arguing one thing and eventually find yourself having to argue something else.
One of the things the guy missed is there in plain sight in his essay:
You need to get to know the libraries, struggle with the environment, find or tune a text editor, look for tools, and so on. Most of the effort has to do with housekeeping chores, which are surely not mind-expanding by anyone's measure. If you hope to be productive in the new language, things are even bleaker: proficiency has less to do with the language itself than with the myriad technologies you must master to use it effectively.
Unfortunately, everyday productivity is a lot of housekeeping chores, one after another. While your higher mind is soaring with the architecture astronauts, the rest of your mind had better be editing text efficiently, and running top and netstat, and administering the version control system.
And more than half of the point of learning a new language is to force yourself to experiment with a different tool ecosystem. The point of learning Ruby isn't just to learn Ruby: You get to learn about Rails and Capistrano and the obsessive use of test-driven development and, in my case, git. (If I'd been a kernel hacker, I'd have known about git. I presume the Rails folks learned about git because some kernel hackers, seeking to learn a new language, wandered into the Rails community.) You want to be forced to experiment with different tools because sometimes they're better: git is just a much better tool than Subversion, and don't get me started on CVS. Even when the alternatives aren't better, you become a better technologist by playing with them. If I'd never played with a Java IDE I would have no chance of understanding how Java programmers think. If I'd never actually deployed both Rails and PHP I wouldn't understand why PHP deserved to live. (Yes, it's filled with stupidly broken parts, but it's so easy to deploy, and it's fast, and it's not that hard to comprehend.)
The other thing this guy doesn't seem to understand is that there's a difference between tourism and living in another country. When you "learn a new language every year" that doesn't mean you have to become a pro in your new language. You can visit, kick the tires, read a couple of introductory books, write some simple code, read some code to something more complicated, and then move on. Yes, that means you're a dilettante -- but it's better to be a dilettante than to blindly plug away at the same thing for a decade.
[+] [-] scott_s|18 years ago|reply
If your language of choice is C, and you learn Pascal, then you haven't gained any new concepts. But if your language of choice is C, and you learn Prolog, then you will be exposed to a whole new way of thinking.
My native state of coding is procedural with a sprinkling of OO, mainly to represent families of concrete data types. I find functional programming appealing on an emotional level, and my attempts to learn how to think functionally have changed my native coding habits, even in non-functional languages.
My pragmatic advice is learn enough of a language from a different programming paradigm so you can apply that new way of thinking to your native language.
[+] [-] mhartl|18 years ago|reply
Aside from the immediate reasons, there's some merit to the mind expansion argument. I think being proficient in at least two languages is indeed important for boosting your ability as a developer. This resembles human language: learning a second one changes the way you think and your perception of the world. The third or fourth, not as much. But it can't be any two languages. If you know Portuguese and Spanish, your mind didn't have to expand much. Likewise, learning VB.net and C# doesn't count.
[+] [-] sah|18 years ago|reply
I think "enough" is a crucial point here. The author almost seemed to be arguing against switching to a new language every year, which I agree is ridiculous. The idea is to learn some new concepts, not to write significant programs in a new language every year. I only adopt new languages for regular work if they're the pragmatic choice.
[+] [-] paul_reiners|18 years ago|reply
[+] [-] tptacek|18 years ago|reply
Another real phenomenon: some of the best programmers in the world still rely entirely on C. [Late edit: "and outperform developers in modern languages"].
[+] [-] mechanical_fish|18 years ago|reply
I'd also suggest that of the two pathological conditions -- Overdabbling and Underdabbling -- the Underdabblers outnumber the Overdabblers by a huge margin. We just see a lot more of the latter on the Internet, because for many obsessive dabblers the whole point is to brag about it.
You need to find a balance. In the end, I think this essay is much more about that balance than its title suggests.
[+] [-] plinkplonk|18 years ago|reply
From Peter Norvig's "teach Yourself Programming in 10 years"
"Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal)."
[+] [-] anirbas|18 years ago|reply
[+] [-] Tichy|18 years ago|reply
[+] [-] motoko|18 years ago|reply
I thought this was going to be a "let's make fun of this idiot" Reddit-type post, but I was wrong.
[+] [-] edw519|18 years ago|reply
I am proficient in about a dozen languages, but only use 3. I go back to the SPS, PL1, Fortran, and COBOL days, and would rather chew razor blades than ever use them again. Today, I use javascript on the client and php on the server; I have yet to find a problem I couldn't solve with them.
In the years in between I discovered BASIC and have found it to be the Swiss army knife of apps. Not the old Dartmouth Basic, and certainly not anything Microsoft bastardized, but there are many other versions that seamlessly integrate with relational data bases that I think are a dream. <laughter dies down>
It's actually reached the point where I "think" in BASIC, design my app, and then sometimes write in in javascript or php.
I certainly wouldn't recommend my approach to someone else, but I think that's the whole point. Use the right tool for the job and get good at it. I see no need to learn new languages just for the purpose of learning something new. If I get "curious" or want to expand my mind, I can think of several hundred app problems waiting to be solved in any language, take your pick.
Thanks, Gustavo Duarte, for the chance to put a little thought into this. Time to xfer control back to work (GO TOs not allowed).
[+] [-] gordianknot|18 years ago|reply
[+] [-] jgrahamc|18 years ago|reply
For that reason I often ask people in interviews to tell me about the computer they have at home: what OS does it run and why? And I ask them what they hack in their spare time. That tends to be very revealing.
[+] [-] tptacek|18 years ago|reply
[+] [-] ojbyrne|18 years ago|reply
Q: What computer do you have at home
A: I have five.
Q: What OS do they run?
A: All of them. ;-)
[+] [-] mosburger|18 years ago|reply
I'm a full-time Java programmer now because it pays the bills. But you'd better believe I'm learning other lanaguages on the side, because it's pretty clear that Java 1.) has some serious limitations that other languages don't have, and 2.) is falling out-of-favor as a web development tool to more flexible, less statically-typed, more functional languages.
It's not so much to "open my mind" as it is to keep myself marketable after Java's impending demise.
[+] [-] wallflower|18 years ago|reply
As someone who is starting to step out of the comfort zone of Java, I agree about marketability. However, Java is not going to disappear, it's firmly entrenched. It's like COBOL. I'm not sure how Sun pulled it off exactly but Java in it's 13 years has spread itself in a lot of corporate systems/applications/backends (some of which may be COBOL). Ruby on Rails and other minority languages are the minority in some companies precisely because the majority don't like the minority ("RoR? We don't use that"). However, there are some rogues in companies who are trying to bring RoR in discretely (I'm trying to be one - developing business cases for RoR adoption on small projects)
[+] [-] pmorici|18 years ago|reply
[+] [-] Jesin|18 years ago|reply
EDIT: I just read the article. Maybe it's just that many of the languages I've been learning have had little syntax and no operator precedence quirks (or any operator precedence whatsoever). I also noticed the article made the same comment about COBOL and Java that I did. I really should read these things first. Anyway, I guess as a high school freshman I'm still at the point where learning new languages is really the best I can do.
[+] [-] jrockway|18 years ago|reply
This is a good point. It is probably not a good use of your time to learn Java and then C# (or similar), or Perl and then Python and Ruby. Sure, there are differences, but basically the languages in the same groups are the same.
If you go for the more "academic" languages, you'll get more return on your learning investment. Recently, I've learned Lisp (this is what started me down the "wait, learning new languages isn't a waste of time!" path), Smalltalk, and OCaml, and I've picked up a lot of good ideas to port to my primary language. (Otherwise, my background before that was C, Perl, and Haskell. All good languages to know :)
[+] [-] gustavo_duarte|18 years ago|reply
But even in your situation, I'd say balance languages with other knowledge that is important. It's easy to play with languages because it's fun, but there's a lot of other important stuff to learn, some of which might make more practical difference to you.
But by all means, learn and have fun. If you're getting a kick out of languages, have at it, especially if you've got plenty of time.
[+] [-] wallflower|18 years ago|reply
Learning new languages teaches you what you know and most importantly don't know. Coming from a Java working background, I find Ruby on Rails pleasantly abstruse and remarkably concise (which makes it hard to learn, coming from the land of boilerplateness).
I have a long commute on the train and I find that when I am trying to debug/learn - (learning Ruby on Rails) - the time flies by like that. If that isn't a benefit (making time fly by when you're having fun learning), I don't know what is.
[+] [-] ChrisRicca|18 years ago|reply
[+] [-] rapind|18 years ago|reply
Who cares though? I think as long as we're constantly learning, whether it's new programming languages, economics, or snowbaording, it makes life interesting. New skills always seem to come in useful at some point. Make the investment in learning things that interest you and it'll always pay off. Don't let someone else tell you what NOT to learn. That's jut silly. Heck even learning COBOL or FORTRAN would benefit you with a little insight, and might be fun in a retro sort of way.
[+] [-] edw519|18 years ago|reply
<sarcasm>
So would gargling Drano.
</sarcasm>
(I always thought about COBOL like this: Let's spend 3 hours getting dressed to go outside and pick up the mail.)
[+] [-] alfredp|18 years ago|reply
The bottom line is that you have to use the right tool for the job: it could mean using what you know, learning something new, or even inventing something totally new and original.
[+] [-] astine|18 years ago|reply
[+] [-] Tichy|18 years ago|reply
[+] [-] pmorici|18 years ago|reply
[+] [-] andygeers|18 years ago|reply
[+] [-] tptacek|18 years ago|reply
[+] [-] icey|18 years ago|reply
[+] [-] attack|18 years ago|reply
I don't know many people who learn languages without the intent of ever spending time to do something with them.
[+] [-] cmars232|18 years ago|reply
[+] [-] utx00|18 years ago|reply
this sounds very much like inexperience.
[+] [-] mechanical_fish|18 years ago|reply
One of the things the guy missed is there in plain sight in his essay:
You need to get to know the libraries, struggle with the environment, find or tune a text editor, look for tools, and so on. Most of the effort has to do with housekeeping chores, which are surely not mind-expanding by anyone's measure. If you hope to be productive in the new language, things are even bleaker: proficiency has less to do with the language itself than with the myriad technologies you must master to use it effectively.
Unfortunately, everyday productivity is a lot of housekeeping chores, one after another. While your higher mind is soaring with the architecture astronauts, the rest of your mind had better be editing text efficiently, and running top and netstat, and administering the version control system.
And more than half of the point of learning a new language is to force yourself to experiment with a different tool ecosystem. The point of learning Ruby isn't just to learn Ruby: You get to learn about Rails and Capistrano and the obsessive use of test-driven development and, in my case, git. (If I'd been a kernel hacker, I'd have known about git. I presume the Rails folks learned about git because some kernel hackers, seeking to learn a new language, wandered into the Rails community.) You want to be forced to experiment with different tools because sometimes they're better: git is just a much better tool than Subversion, and don't get me started on CVS. Even when the alternatives aren't better, you become a better technologist by playing with them. If I'd never played with a Java IDE I would have no chance of understanding how Java programmers think. If I'd never actually deployed both Rails and PHP I wouldn't understand why PHP deserved to live. (Yes, it's filled with stupidly broken parts, but it's so easy to deploy, and it's fast, and it's not that hard to comprehend.)
The other thing this guy doesn't seem to understand is that there's a difference between tourism and living in another country. When you "learn a new language every year" that doesn't mean you have to become a pro in your new language. You can visit, kick the tires, read a couple of introductory books, write some simple code, read some code to something more complicated, and then move on. Yes, that means you're a dilettante -- but it's better to be a dilettante than to blindly plug away at the same thing for a decade.
[+] [-] unknown|18 years ago|reply
[deleted]
[+] [-] rumblerob|18 years ago|reply
"Doing this is like doing a really bad thing, which by the way you shouldn't do."
[+] [-] cvg|18 years ago|reply
BTW, building a web framework using APL. Anyone care to help?
[+] [-] bayareaguy|18 years ago|reply
A web-style APL should let you do something like that as tersely as APL lets you compose operations like +.×/ for the inner product.
[+] [-] unknown|18 years ago|reply
[deleted]