% Advice on Studying Programming Languages % Michael Stone % February 24, 2013 ## Dear Student... Amateur study of programming languages has been extremely valuable to me, first as an inexhaustible source of curious insights and second as an [economic signal][] [^jobs]. As a result, when a [favorite professor][Richard] wrote to me for advice on where to direct you, I figured that I might be able to do us both a favor[^hiring] with the following ["reply to public"][Might]. Thus, without further ado, here are some of the PL people, projects, venues, and other resources that have been helpful to me so far. [^jobs]: Both of the [hiring][Ivan] [managers][Brian] for the two jobs I've held so far have remarked that I came to their attention in part as a result of my working knowledge of [Haskell]. [economic signal]: https://en.wikipedia.org/wiki/Signalling_%28economics%29 [Haskell]: http://haskell.org [^hiring]: Like PL? If so, this [Security Architect](http://jobs.akamai.com/job/Cambridge-Security-Architect-Job-MA-02138/2430305/) might interest you... [Ivan]: http://radian.org/ [Brian]: http://evenmere.org/~bts/ [Richard]: http://www.cs.swarthmore.edu/~richardw/ [Might]: http://matt.might.net/articles/how-to-blog-as-an-academic/ ## Blogs and Aggregators * [Lambda the Ultimate](http://lambda-the-ultimate.org/) has been a rich source of pointers to fun papers in PLT. * [Planet Haskell](http://planet.haskell.org) is often excellent. * [r/haskell](http://reddit.com/r/haskell), [proggit](http://reddit.com/r/programming), and [r/golang](http://reddit.com/r/golang) often publish thoughtful posts. * [Planet Clojure](http://planet.clojure.in/), [Planet Scheme](http://scheme.dk/planet/) and [Planet Python](http://planet.python.org) are occasionally helpful. * The [n-Category Café](http://golem.ph.utexas.edu/category/) also has occasional gems. ## Conferences, Symposia, and Workshops I've found that informal workshops and symposia are great places to meet implementers and theorists whose work I respect. Some of my favorite venues have been: * The [Symposium on Trends in Functional Programming](http://www.tifp.org/) * The [New England Programming Languages and Systems Symposium](http://www.nepls.org/) * The [2009 Dynamic VM Summit](http://radian.org/notebook/2009-dynvm) I've also heard good things about some of the more formal venues like * The [International Conference on Functional Programming](http://www.icfpconference.org/) and [related events](http://www.icfpconference.org/related.html) though I haven't yet attended any of their events. ## Teachers and Research Groups There are a variety of good PLT research groups on the US East coast. Some of my favorites include: * [Benjamin Pierce](http://www.cis.upenn.edu/~bcpierce/), [Stephanie Weirich](http://www.cis.upenn.edu/~sweirich/), [Steve Zdancewic](http://www.cis.upenn.edu/~stevez/) and the [Penn PL Club](http://www.cis.upenn.edu/~plclub/) * [Bob Harper](https://www.cs.cmu.edu/~rwh/), [Frank Pfenning](https://www.cs.cmu.edu/~fp/) and the [CMU Principles of Programming](https://www.cs.cmu.edu/Groups/pop/) group * [Greg Morrisett](http://www.eecs.harvard.edu/~greg/) and the [Harvard Programming Languages Group](http://cs.harvard.edu/pl/) * [Mitch Wand](http://www.ccs.neu.edu/home/wand/), [Matthias Felleisen](http://www.ccs.neu.edu/home/matthias/) and the Northeastern [PLT](http://www.ccs.neu.edu/racket/) and [PRL](http://www.ccs.neu.edu/research/prl/) research groups. Even better, these folks often host seminar series (announced via mailing lists like [`programming@eecs.harvard.edu`](https://lists.eecs.harvard.edu/mailman/listinfo/programming) and [`pl-seminar@lists.ccs.neu.edu`](https://lists.ccs.neu.edu/bin/listinfo/pl-seminar)) that, if you ask nicely, you can attend. (Note: there are many other awesome PL research groups on the US East Coast, in Western Europe and on the US West Coast but, for the most part, I'm less directly familiar with their work.) ## Math Books As I got deeper into PL, I eventually ran into math that was beyond my ability to efficiently learn via self-study. Fortunately, I sought help from another [favorite professor](http://www.swarthmore.edu/NatSci/thunter1/) and, together, we developed a [summer reading program](http://mstone.info/school/math/summer2006/) that really helped me to connect my undergraduate study of math with my interest in PLT via some classic books like: * [Types and Programming Languages](http://www.cis.upenn.edu/~bcpierce/tapl/) by [Benjamin Pierce](http://www.cis.upenn.edu/~bcpierce/) * [Category Theory for the Working Mathematician](http://www.amazon.com/Categories-Working-Mathematician-Graduate-Mathematics/dp/1441931236) by [Saunders Mac Lane](https://en.wikipedia.org/wiki/Saunders_Mac_Lane) * [Practical Foundations of Mathematics](http://www.amazon.com/Practical-Foundations-Mathematics-Cambridge-Advanced/dp/0521631076) by [Paul Taylor](http://www.paultaylor.eu/) is [available online](http://www.paultaylor.eu/prafm/html/index.html) ## Applied Works and Authors These projects and people have all done work that I'm glad to have used and studied: * [Scheme](http://schemers.org/) and [PLT Racket](http://racket-lang.org/) * [Haskell](http://haskell.org), by many, but with special contributions from [Simon Peyton-Jones](https://research.microsoft.com/en-us/people/simonpj/) and [Simon Marlow](https://github.com/simonmar) * [Real World Haskell](http://book.realworldhaskell.org/), by [Don Stewart](https://donsbot.wordpress.com/), [Bryan O'Sullivan](http://www.serpentine.com) and [John Goerzen](http://www.complete.org/) * [ML](https://en.wikipedia.org/wiki/ML_%28programming_language%29) and [OCaml](http://ocaml.org/) * [GNU Make](https://www.gnu.org/software/make/manual/make.html) * [GNU BASH](https://www.gnu.org/software/bash/manual/bash.html) * [Coq](http://coq.inria.fr/), by [INRIA](http://inria.fr) * [Certified Programming with Dependent Types](http://adam.chlipala.net/cpdt/) by [Adam Chlipala](http://adam.chlipala.net/) * [Software Foundations](http://www.cis.upenn.edu/~bcpierce/sf/) by [Benjamin Pierce](http://www.cis.upenn.edu/~bcpierce/) and many others. * [Erlang](http://erlang.org) and [OTP](http://www.erlang.org/doc/design_principles/users_guide.html) by [Ericsson](http://ericsson.com/) * [Programming Erlang](http://www.amazon.com/Programming-Erlang-Software-Concurrent-World/dp/193435600X), by [Joe Armstrong](http://armstrongonsoftware.blogspot.com/) * [VHDL](http://www.vhdl.org/) * [Prolog](https://en.wikipedia.org/wiki/Prolog) and [Datalog](https://en.wikipedia.org/wiki/Datalog) * [A Grammatical View of Logic Programming](https://mitpress.mit.edu/books/grammatical-view-logic-programming) by [Pierre Deransart](http://deransart.fr) and [Jan Maluszynski](https://www.ida.liu.se/~janma/) * [The Craft of Prolog](http://mitpress.mit.edu/books/craft-prolog) by [Richard O'Keefe](http://www.cs.otago.ac.nz/staffpriv/ok/) * [BOOM](http://boom.cs.berkeley.edu/) and [Bloom](http://www.bloom-lang.net/) by [Joe Hellerstein](http://db.cs.berkeley.edu/jmh/)'s group * [Dyna](http://www.dyna.org/) by [Jason Eisner](http://www.cs.jhu.edu/~jason/)'s group * [Javascript](https://developer.mozilla.org/en-US/docs/JavaScript) * [Javascript: The Good Parts](http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742) by [Douglas Crockford](http://www.crockford.com/) * [GNU R](http://www.r-project.org/) by [many](http://www.r-project.org/contributors.html) * [ggplot2](http://ggplot2.org/) by [Hadley Wickham](http://had.co.nz/) * [Google Go](http://golang.org/) by [Rob Pike](http://research.google.com/pubs/r.html), [Andrew Gerrand](http://nf.id.au/), and [Robert Griesemer](http://research.google.com/pubs/author96.html) * [PROMELA](https://en.wikipedia.org/wiki/Promela) and the [SPIN](http://spinroot.com/spin/whatispin.html) model checker * [Mozart / Oz](http://www.mozart-oz.org/) by [Peter Van Roy](http://www.info.ucl.ac.be/~pvr/) and [friends](http://www.mozart-oz.org/governance.html). * [Clojure](http://clojure.org) and [Clojure Programming](http://www.amazon.com/Clojure-Programming-Chas-Emerick/dp/1449394701) by [Chas Emerick](http://cemerick.com), [Brian Carper](http://briancarper.net), and [Christophe Grand](http://cgrand.net/) * The [Cryptographic Protocol Shapes Analyzer](http://hackage.haskell.org/package/cpsa) by [Joshua Guttman](http://web.cs.wpi.edu/~guttman/), [John Ramsdell](http://www.ccs.neu.edu/home/ramsdell/), [Jon Herzog](http://www.jonathanherzog.com/), and others and, of course, I can't leave out the debt owed other members of the [ALGOL](https://en.wikipedia.org/wiki/ALGOL) [family](http://c2.com/cgi/wiki?AlgolFamily): * [BASIC](https://en.wikipedia.org/wiki/BASIC) and [Visual Basic](https://en.wikipedia.org/wiki/Visual_Basic) * [The C Programming Language](http://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628) by [Brian Kernighan](http://www.cs.princeton.edu/~bwk/) and [Dennis Ritchie](https://en.wikipedia.org/wiki/Dennis_Ritchie) * [OCW: MIT 6.172: Performance Engineering](http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-172-performance-engineering-of-software-systems-fall-2010/index.htm) * [The C++ Programming Language](http://www.amazon.com/The-Programming-Language-3rd-Edition/dp/0201889544) by [Bjarne Stroustrup](http://www.stroustrup.com/) * [Effective C++](http://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876), [More Effective C++](http://www.amazon.com/More-Effective-Improve-Programs-Designs/dp/020163371X), and [Effective STL](http://www.amazon.com/Effective-STL-Specific-Standard-Template/dp/0201749629) by [Scott Meyers](http://www.aristeia.com/) and [Herb Sutter](http://herbsutter.com/) * [Python](http://python.org) and [Dive into Python](http://www.diveintopython.net/) * [Lua](http://lua.org) and [Programming in Lua](www.amazon.com/exec/obidos/ASIN/859037985X/lua-home-20) by [Roberto Ierusalimschy](http://www.inf.puc-rio.br/~roberto/) ## Programming Language Meetups Tech centers like Boston, San Francisco, New York, and Philly often have monthly programming language user group meetings like these: * The [Boston Haskell](https://groups.google.com/forum/?fromgroups#!forum/bostonhaskell) Users Group * The [Boston Clojure Meetup](http://www.meetup.com/Boston-Clojure-Group/) * The [Boston Lisp Meeting](http://common-lisp.net/project/boston-lisp/) and many others that I have never had the pleasure of attending! ## Self-Study Techniques Finally, aside from reading voraciously and from going out of my way to search for languages that seem appropriate for the problem of the day, the most useful technique that I've found for really learning the idioms and quirks of new languages is to systematically implement one or more of a suite of toy problems (2-d line rendering, Paxos, line-oriented network protocols or UNIX utilities, data structures) that I've accumulated over the years.