Haskell. I know Scala and occasionally use it work (although my main project is still in Java: it's often difficult to mix languages at the same level in a project and for many reasons, I'd like to keep as few external dependencies for my project as possible) and great enjoy it. I also know OCaml and am doing some hobby projects in it. I've been a Lisp weenie for a long time now (Scheme, Common Lisp, recently Clojure both at work and in hobby projects).
So, why Haskell if I already know lots of other functional languages (both statically and dynamically typed ones)? Due to type classes and lazyness/purity by default. I still find myself thinking imperatively, or thinking at a lower functional level (e.g., just tail recursion and folds/map). I'd like to learn to think in a a lazy and purely functional way and Haskell seems to be a way to get there. Additionally, both Scala (with implicits and higher kindred types) and OCaml (since 3.12 with first class modules) do support type classes, but Haskell seems to be a good way to learn to use them. I've been thinking a great deal about type systems and type safe DSLs, presently working my way through TAPL. One particular field that interests me is the intersection of programming languages and systems: can we do user level systems programing in languages other than C; how can we safely "hint" a garbage collector to avoid memory pressure issues that happen frequently in memory intensive applications written in high level languages; can we use the type systems to ensure application-level code can sustain loss of consistency or availability (Google for CALM Conjecture for a dynamically typed Ruby DSL approach to this)?
Finally, Haskell is a great language in terms of forcing myself to think before I code (Yes, I should already be doing that): you may have a solution that may be short in terms of lines of code but takes hours to come up with. Why is this important? That's a great way of improving myself in other areas of programming: seeing which classes of algorithms solve a particular program, finding the simplest solution vs. one that comes to mind first.
[EDIT: Forgot to say that fun also plays a huge part of it. It's the reason I chose on the site (was the best one of those listed there: Haskell won't get you a job nor is there always a guarantee you'll be more productive with it, especially right away) and a perfectly legitimate one].
Yeah, I went through the learn-every-programming-language-possible stage in late college and the couple years afterwards. I eventually decided that no language is going to boost your effectiveness as much as knowing your problem domain very, very thoroughly. There's a lot of depth in specialized algorithms that isn't visible to someone in college or a web shop, yet many of the most lucrative startups come from specialized algorithmic knowledge.
In violent agreement with you. Specialized knowledge is how you make your way out of the enterprise/web ghetto and onto much more fascinating problems, including in the greater enterprise/web industry: you can think of most of what Amazon does as enterprise software, yet they've used e.g., distributed systems expertise to their advantage; where most saw "class ShoppingCart extends StatefulSessionBean" (and a big fat check for WebLogic and Coherence) they saw http://www.allthingsdistributed.com/2007/10/amazons_dynamo.h...
However, I remember a comment you've posted once on this site (don't have the URL) saying there are no shortcuts to being a programmer: i.e., you should learn several programming languages and you should be a competent algorist. Some languages also force you to think differently about algorithm design (e.g., purely functional data structures), which is always a good thing.
Another interesting thing: virtually all the really high-level programmers I know have either a PL or OS background. Jeff Dean worked on Cecil. Urs Hoezle worked on Self. Lars Bak worked on Beta, Self, and HotSpot. Peter Norvig worked on Lisp. Many of the other senior guys at Google - the ones who actually understand how all the search engine works, that people go to when there's a tough problem - worked on languages like Dylan, Python, and HotSpot.
Most of them aren't working on languages now, but there's this blip in the past of a surprisingly large number of them. I wonder if it's causation or correlation.
The Good Books depends upon which specific field you go into. The first step is to pick a field that you're interested in. This is often the hardest step, because from a 10,000-foot level, you often can't tell what will be interesting, and whichever field you dive into will shut off various other opportunity costs.
Then, go to your favorite graduate school website. I'm partial to Stanford and MIT, because both put up fairly complete syllabi on the web, including textbooks and often homework assignments. Pick out a couple courses, just as if you were back in college, and note down the textbooks.
Then go to Amazon.com (or Amazon.co.uk, when I was in college Europe had much better textbook prices, I dunno if they've closed that loophole) and search for those textbooks. And when it pops up "Related books" with good ratings, add those to your cart as well. Buy them.
Read, rinse, and repeat. Many textbooks have generous citation indexes that you can use to find further books or papers to check out.
I want the power of types and functional programming and Actor concurrency, but am leery of doing anything practical with languages like Erlang or Haskell.
Plus, Scala runs on the JVM and is thus compatible with all of Java's libraries. The day I have to read a UTF8 string backwards I want to use some standard library, not get creative with a linked list of ints.
> doing anything practical with languages like Erlang or Haskell
Why do learn it for a specific reason? Why not learn a language to expand your mind? Scala is awesome, but Haskell will help you make use of some of its more powerful features. By all means, learn both.
Erlang is interesting and is quite practical too (albeit Scala tends to be practical in more kinds of problems: there many times where you want an easier way to deal state shared between processes than ETS/Amnesia). Knowing Erlang you can make a better decision when to use Scala's own actor facilities and when not to.
I don't have an opinion about erlang or scala, but I agree with the poster that it is important to do something practical with a language. How will you learn the concepts that a language tries to teach you without actually building something non-trivial in it?
Oh you can certainly build non-trivial things in the language. It's just you may not be able to use it for a work project (for different reasons). This is what I meant by practical: software that you build at work and that operations will deploy or sales will sell.
There's tons of practical applications built in both Haskell and Erlang: erlang has rabbit mq (I have some criticisms of it, but they're not related to the language it's built in), Haskell has XMonad (the window manager I use on a daily basis). Both are very practical.
I've already dabbled a bit in Erlang and Haskell. I think they are great languages.
Anyway, this was just an expression of interest that Scala might be a better all-around language for getting things done. I have no Scala experience. I could totally be wrong about this.
I should note that I have a particular project in mind that has a web-facing component and multiple nodes on the backend. It's not 100% clear to me that Haskell is the right tool for that job. Erlang could definitely do that sort of thing. But Scala might be more convenient than either.
Erlang comes from industry and design has been driven by use... that's pretty practical.
Your point about the JVM is solid, but it would be a mistake to dismiss a language wholesale with a cheap dig because you hear that "string handling sucks". :)
Why are you leery of doing anything practical with Erlang and Haskell? #haskell on freenode is filled with people doing practical things in Haskell and Ericsson has bet most of its infrastructure on Erlang...
Scala may be a way to get many of the benefits of Erlang and Haskell while also using a platform that is very successful and well-understood. And if I need to calculate what day of the week it is in 10 days in German, I know some library will exist for this. Scala could be snake oil, but it looks interesting.
I have to come to terms with my own ignorance. I'm not saying there isn't a good date library in Haskell. I'm saying I don't know if there is one, and as long as I'm learning a new language, I might as well choose something where I know at least some of those issues are definitely solved. This may cause some partisans to rage, but when choosing a language for a project, personal comfort is really the #1 issue.
Clojure. I've found my code in other languages looking more and more like Lispy as time goes on, and my shame at not actually having learnt to use one well has grown too strong.
Yes, really. I think the potential for a really sexy open source Smalltalk is there with Pharo; it just needs a lot of work. But building web apps in Seaside has really convinced me of the productivity you can gain by tossing out certain ideas and embracing a very focused and principled environment like Smalltalk (focused in the sense that it's the only place I've seen OOP taken seriously; i.e. it's not "OOP, but...").
I'm a big big fan of functional languages, especially Clojure, but the fact is that UIs are stateful and OO design really works there, and users need UIs.
I've just been writing a small app in pharo the last few days. I haven't used Smalltalk in 15 years and its coming back very quickly. Pharo is nice but it still needs polish to get to the Smalltalk I had in 1994.
For this new app, I am using Iliad framework http://www.iliadproject.org/ instead of Seaside. I started out playing with Seaside but the code base is so large I felt I couldn't understand the internals of the framework without a lot of time invested. The trade off is that iliad has almost no docs and you have to read the source.
Haskell. I feel as though it is a language that I would really enjoy, regardless of whether or not it fits a niche with my research interests. Some languages just have that feel about them, I suppose.
Haskell was my answer too, mainly because it is rather different from other languages I know, so it forces you to think out side the box, and try new things. Which you then bring back to other languages.
Common Lisp. I have just started scratching the surface of the language(one-two weeks so far). The high opinion that many HNers have for the language played definitely a role in my choice.
I have been contemplating re-learning Common Lisp - I wrote Lisp (along with some C and PostScript) at work from about '89 to '95. Although I also did web development from about '93 the two areas never overlapped and when I co-founded a startup in '95 we were a Java shop - which was my language of choice for the next 6 years or so.
Inevitably I've spent a significant amount of time over the last 15 years telling people how wonderful Lisp is without actually using it for anything - so I'm pretty keen to jump back into using Lisp for Web projects.
At this point, I'm tired of learning programming languages, and would rather learn how to be more effective with the dozen or so that I've already learned.
I absolutely agree - do you know of any good resources for learning JavaScript as a language? Most books are targeted at using it to add whiz-bang stuff to web sites.
Having settled on Common Lisp a good few years ago I haven't explored a new programming language for a looong time (having gone through the phase of trying out a lot of them before that). However, recently I've felt the need to broaden my horizons again and did dabble a little in Haskell.
Agreed, although I recently realized I likely need a better understanding of C to fully understand where Go is going. (I'd also like to spend time with Lua--it keeps showing up in interesting places.)
Ruby, from a pragmatic point of view. As a front-end developer in a Rails agency I want to be able to debug the interface of my Javascript and my colleagues’ Ruby better.
I'd second Erlang. It's a lot of fun first learning. I know when I went through Armstrong's book on it, the first 5-6 chapters were mostly just "okay, so an intro to the syntax and functional programming", then when the meat of the language hit, it was a big fat "whoa...this is crazy."
I'm glad HN had that crazy "Erlang Day" a few years ago, as that was Erlang's first blip on my radar. Thanks HN :)
Erlang is definitely the most fun language I've learned in many years. It will make you think very differently then most other languages and at least slightly change the way you think about everyday programming.
I've been using Python for the last two years and I totally love it. While it does support functional paradigms, it's not actually a functional programming language.
Having said that, I would love to pick up Clojure next. Realistically though, I'm going to dive deeper into Python.
Spark & Ada just to see if the language and associated tools and processes are really practical (read fast development with low bug rates and easy to mantain code) and secure.
Scheme to learn functional programming and see if this paradigm really implies in good reuse of code.
In my experience a lot of Python programmers move on to learning the functional Python features and libraries and then after they get that down, the eventually jump ship to a mainly-functional language (a lot of people seem to move to Haskell, I personally moved to Clojure).
This is based on my own personal experience, that of Python Ireland members and from things I've read or seen (here on HN and elsewhere).
Do you mind elaborating on what 'functional' libraries exist in python? I've practiced a bit using the whole map-reduce paradigm in different ways in python, but I'm not really sure what you mean beyond that.
I once read a quote that when you're using itertools frequently enough in your Python code you're one step away from jumping to a language like Haskell.
I've heard that the OReilly Haskell book was one of the most bought books at PyCon.
My progression went similarly - I started using map, reduce, filter and list comprehension a lot, then moved on to itertools and functools and then decided what I really wanted was a functional by default language. That, the great concurrency support and the desire to learn a lisp-based language properly[1] made me choose Clojure.
It seems that this progression is actually fairly common. I still use Python for quick'n'dirty scripts (especially as a shell scripting alternative) and for web development (for other people; I use Clojure for my own code).
[1] I already knew some Scheme, but never used it for any real projects.
I'm learning making my own. This is the first time I'm seriously muddling through parsing and lexing. I want to make at-least a toy-language interpreter.
Cobra - I've dabbled with it to see that it works nicely with my brain, but not enough to really know and grok all it has to offer.
The initial draw is that it is a python-like language for .Net (important since my day job is in .Net). And while I've dabbled with Boo and IronPython, Cobra seems to have removed most of the syntactic worts that I found w/ Python, as well as a few other features.
In particular, as someone who hasn't really done automated unit testing or contractual programming, I'm drawn to the fact that support for unit testing and contracts is built in. I like the python-like syntax as I find it easiest to learn new programming concepts in (which I can then generalize to my day-to-day work).
I have used Clojure for large projects and PLTScheme for a lot of academic projects. But I have not tried to write a large application in Scheme. In addition, I want to use all those libraries, typed/racket and mainly the syntax/parse macro dsl.
I wish people would focus more on PROGRAMMING rather than LANGUAGES. A better question might be, what area of computer science do you want to learn next?
Languages affect how you can express certain concepts. More expressive languages can be useful in new programming concepts. A personal example: Many years ago I had to program in VB.Net, and never understood polymorphism until I dabbled in Python and played around with some projects in that language. VB.Net lets you do Polymorphism, but it doesn't assist you in learning it (at least for the way my brain is wired).
Ruby. My favorite language is Python and I really like Django but I think I'm missing something by not learning Ruby and Rails. Haskell is the other language I want to learn, and probably more than Ruby but I'm currently looking for a job and RoR is the better choice...
Me too. Because now it's possible to use Javascript on the server as well as the client. I think that for small teams doing Webapp development, being able to use the same language on the client and the server is a big win.
I guess the author means 'using php to for writing web apps that are not a index.php file, a file called 'includes.php' and a couple of files called 'header.php', 'content.php' and 'footer.php' which then have functions called 'printHeader() { echo "<table>...</table>" etc. }'.
Basically, the way php application were written 10 years ago. I consider that the 'wrong' way to use php, but it's how it's (necessarily) taught so many people write their first couple of apps this way (and others never rise above this stage).
F#. It should let me get my mind around a somewhat different approach to programming compared my main languages (C#, Javascript) while letting me still work with a know platform.
+1 for F#. it is a really great language and I learned a ton by spending about 250 hours with it. The book Expert F# is a really good resource. the first 200 pages are about the language (a complete guide) and the rest is just case studies of .NET junk. I wish they had made 2 books not one... 1st 1/2 is excellent though and worth buying.
You can go ahead and write your own forth interpreter (or maybe Cat http://cat-language.com). Writing your own stack-based programming lang is a lot of fun! (That is my toy project for december)
So, why Haskell if I already know lots of other functional languages (both statically and dynamically typed ones)? Due to type classes and lazyness/purity by default. I still find myself thinking imperatively, or thinking at a lower functional level (e.g., just tail recursion and folds/map). I'd like to learn to think in a a lazy and purely functional way and Haskell seems to be a way to get there. Additionally, both Scala (with implicits and higher kindred types) and OCaml (since 3.12 with first class modules) do support type classes, but Haskell seems to be a good way to learn to use them. I've been thinking a great deal about type systems and type safe DSLs, presently working my way through TAPL. One particular field that interests me is the intersection of programming languages and systems: can we do user level systems programing in languages other than C; how can we safely "hint" a garbage collector to avoid memory pressure issues that happen frequently in memory intensive applications written in high level languages; can we use the type systems to ensure application-level code can sustain loss of consistency or availability (Google for CALM Conjecture for a dynamically typed Ruby DSL approach to this)?
Finally, Haskell is a great language in terms of forcing myself to think before I code (Yes, I should already be doing that): you may have a solution that may be short in terms of lines of code but takes hours to come up with. Why is this important? That's a great way of improving myself in other areas of programming: seeing which classes of algorithms solve a particular program, finding the simplest solution vs. one that comes to mind first.
[EDIT: Forgot to say that fun also plays a huge part of it. It's the reason I chose on the site (was the best one of those listed there: Haskell won't get you a job nor is there always a guarantee you'll be more productive with it, especially right away) and a perfectly legitimate one].