Learning a new language to improve your programming skills is a cliché. I realized recently (and I'm into languages) that tinkering on a project in a different domain is hundred times more educational and fun.
E.g. if you mostly do webapp backends, write a ray tracer in Javascript. If you're a systems programmer, write a blog on AppEngine. Make a screensaver. Make an iPhone app. Etc etc.
I think the advice to learn a new language is more incomplete than anything else; it's not learning a new language that's valuable, it's learning new ways to think about problems. Picking up a language that's very similar to one you already use, or that differs only in matters of syntax, isn't really going to do much for you, and it probably wouldn't take more than maybe six carefully-selected languages to get 99% of the benefit learning new languages will ever have.
Writing a program in a radically different domain than what you're used to has a lot of the same value, plus the advantage of being a much less exhaustible resource.
I beg to differ. Learning a new language[1] also means learning to know a different paradigm & culture & ecosystem. You learn to know novel ways of doing things that you can transfer to your main programming language---or not.
Tinkering on a project in a different domain most likely means learning to know new libraries and maybe new tools. But those are most often just more of the same and don't help you to get a new perspective on what you're doing.
Instead of just learning a new language, I'd also suggest to read related CS papers.
[1] With "new language" I mean a language that puts emphasis on a paradigm you are not familiar with yet. E.g. if you're a ruby programmer, I wouldn't consider python a "new language"---and vice verse.
Learning a new language to improve your programming skills is truly a cliché. Instead the proper advice should be "I should learn a new programming language so I can escape my myopic understanding of the practice programming." Building applications, as you say, is of course very instructive, but tackling a language which has very little relation to the ones with which you are familiar has benefits which are pointless to reduce to "it will make you a better programmer".
It may be a less useful technique to improve programming skills when you are well versed in different kinds of languages but it could be argued that what you are striving for with your projects in different fields can be achieved when someone who has programmed for 5 years in java and only java goes and learns how to do substantial things in a language like haskell.
Bypass the whole lot and "learn" Mozart/Oz. The most elegant kitchen-sink of programming paradigms. It's so good nothing useful has ever been written in it. It's the subject of the second greatest text on computer programming.
Mozart/Oz, it's like programming the way the classic Vienna Musician would have written Music, if he moved to Bondi Sydney and picked up surfing and wild-growing marijuana.
Mozart/Oz is, indeed, a very interesting and powerful language and certainly one of the more complete multiparadigm languages. After reading Peter Van Roys CTM, I told myself that I would learn and use Oz, but... it never happened.
"Factor is to Forth what Clojure is to Common Lisp"
I disagree. Its well known in the Factor community that, as one of the core Factor devs stated, idiomatic Factor doesn't use the stack; its only superficially related to Forth in that it uses similar syntax, but it has much more in common with lisp.
Sure, Factor is stack based - like Forth - but Factor provides a lot of abstractions on top of this (many of which are inspired by lisp), which Forth does not, like macros, combinators (which help avoid manually dealing with the stack), local variables, lisp-style lists, concurrency, generics, object oriented programming, even infix expressions (though the use of a macro)... and a ton more.
I find the list slightly disappointing. Those languages are listed in almost every other list of that kind. Checking out new entries in the language shootout is more informative.
Has Io been useful in any application yet? Admittedly, I find it an interesting language, and my experience with it has been kind of fun - but I can't think of anything it does that most other programming languages don't do better.
"but I can't think of anything it does that most other programming languages don't do better."
What do you mean by that? Io is slow and does not have the extensive libraries that are present in other languages. However, as a pure prototype oo language, it is second to none.
Schemers have not only appreciated exception handling, they have generalized control transfer to a first-class operation. The last 20 years of PL research in Scheme have only been about control semantics, to the point of abuse.
[+] [-] hassy|16 years ago|reply
E.g. if you mostly do webapp backends, write a ray tracer in Javascript. If you're a systems programmer, write a blog on AppEngine. Make a screensaver. Make an iPhone app. Etc etc.
[+] [-] camccann|16 years ago|reply
Writing a program in a radically different domain than what you're used to has a lot of the same value, plus the advantage of being a much less exhaustible resource.
[+] [-] xtho|16 years ago|reply
Tinkering on a project in a different domain most likely means learning to know new libraries and maybe new tools. But those are most often just more of the same and don't help you to get a new perspective on what you're doing.
Instead of just learning a new language, I'd also suggest to read related CS papers.
[1] With "new language" I mean a language that puts emphasis on a paradigm you are not familiar with yet. E.g. if you're a ruby programmer, I wouldn't consider python a "new language"---and vice verse.
[+] [-] swannodette|16 years ago|reply
[+] [-] bugs|16 years ago|reply
[+] [-] mahmud|16 years ago|reply
Mozart/Oz, it's like programming the way the classic Vienna Musician would have written Music, if he moved to Bondi Sydney and picked up surfing and wild-growing marijuana.
[+] [-] dkersten|16 years ago|reply
[+] [-] knv|16 years ago|reply
Care to elaborate a little bit?
[+] [-] dkersten|16 years ago|reply
I disagree. Its well known in the Factor community that, as one of the core Factor devs stated, idiomatic Factor doesn't use the stack; its only superficially related to Forth in that it uses similar syntax, but it has much more in common with lisp.
Sure, Factor is stack based - like Forth - but Factor provides a lot of abstractions on top of this (many of which are inspired by lisp), which Forth does not, like macros, combinators (which help avoid manually dealing with the stack), local variables, lisp-style lists, concurrency, generics, object oriented programming, even infix expressions (though the use of a macro)... and a ton more.
[+] [-] xtho|16 years ago|reply
[+] [-] azgolfer|16 years ago|reply
http://newspeaklanguage.org/
[+] [-] _dexodro|16 years ago|reply
[+] [-] rgrinberg|16 years ago|reply
What do you mean by that? Io is slow and does not have the extensive libraries that are present in other languages. However, as a pure prototype oo language, it is second to none.
Read here: http://c2.com/cgi/wiki?IoLanguage
[+] [-] viraptor|16 years ago|reply
[+] [-] malkia|16 years ago|reply
[+] [-] mahmud|16 years ago|reply