5 ms·
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
by hassy 17y ago
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.
- camccann 17y agoI 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.
- gchpaco 17y agoThat old saw is really about points of view, as you note. Going from C to Pascal isn't really going to teach you very much. Going from C to programming idiomatic Prolog is a huge shift, and teaches you a new way to look at things.
- swannodette 17y ago"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." I don't know how you came up with these numbers- from what I've seen of the variety language of programming languages out there this doesn't seem at all supportable. Not unless you take a completely reductive sampling of the various computer languages that have been developed thus far. But yes, tackling different kinds of problems and different kinds of program languages will certainly give you healthy and open-minded perspective about programming.
- dkersten 17y agoLemme see, which six languages would I choose... * C++, Java, C# or some other imperative OO language * Scheme, Common Lisp, Clojure or some other lisp * Haskell, OCaml, Scala or F# (and maybe Erlang?) * Prolog or Mercury * LabVIEW, Luster/SCADE or some other dataflow language * Factor, Forth, Joy or Cat This gets me imperative/OO, monitor based concurrency, Lisp-ness (homoiconic language, real macros, DSLs), functional, strong static typing, type inference, powerful type systems, logic programming, dataflow and concatenative. Yes, there are gaps - I'd also add Oz, Python/Ruby/Boo/Groovy and J into the mix to get a more fully rounded paradigm tour and, even then, there are some things missing, though at this point you should have a strong knowledge of languages and paradigms and should be able to tackle most problems pretty well - or at least, know enough to choose a good programming language for the task at hand.
- camccann 17y agoHmm, after looking at your rather nice list, six was probably too low; I think I'll revise my estimate to a more conservative eight. There'll always be some gap, of course, but eight ought to get closer to the point of diminishing returns I had in mind. Incidentally, I'd probably include some form of assembly as well, for the whole "must understand the underlying hardware" aspect.
- dkersten 17y agoOhhh! That was certainly an oversight on my part - an assembly language should be included. Eight should be enough, after that, you probably wouldn't learn enough to make the effort worthwhile (except maybe to learn a language for a particular need, eg available libraries). I think my number seven then would be an assembly language and my eight would be Oz, ATS[1] and J[2] (not really in the same category, but more of a misc interesting languages category). I would then add Python/Ruby/Boo/Groovy in with C++, C# and Java. ATS and J are both unique in their own ways. I'm not sure what value there is in learning either of these (since I don't know them) but they seem different enough to teach you something new. J (or APL or K) do teach you about array processing languages and point-free programming, so maybe this is useful. ATS is interesting because of its emphasis on types in a way I haven't seen in other languages: [1] http://www.ats-lang.org/ http://www.ats-lang.org/ [2] http://www.jsoftware.com/ http://www.jsoftware.com/ PS: Turns out I spelled Lustre wrong :-D
- dkersten 17y agoI 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. Learning a new language, on its own, isn't very beneficial - learning a new language thats different to the ones you already know is very beneficial. If you primarily work with statically typed languages, try a dynamically typed one (or one with type inference). If you're used to object oriented languages, try a functional language. If you're used to monitor based concurrency, try actor based concurrency. If you're used to imperative programming, try dataflow. If to you macro means the C preprocessor, try a language with lisp-style macros. Its about the paradigms, core features, abstract concepts - not the languages themselves. If you know C++ and Java, you probably won't get much out of learning C#, aside from different APIs and libraries, but if you instead learn F#, you would get a lot out of the experience of using a completely different paradigm for conceptualizing and reasoning about problems. Thats why I like tinkering with languages that are radically different from the ones I already know. Of course, this means that when you learn a new language, you have to put a conscious effort into programming in that languages idiomatic fashion. Programming in Haskell as you would program in Java isn't going to teach you anything and will probably only make you frustrated at how hard the language appears to make your life.
- bugs 17y agoIt 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.
- swannodette 17y agoLearning 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".
- xtho 17y agoI 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.