This morning one of our developers pointed me to a post from Avdi Grimm describing the programming languages he was most interested in learning. I agree that it's important to recognize that our time is limited, and we need to prioritize tools that we want to learn, and also to realize that some things have to be pushed aside to make room for our priorities. Inspired by his post, and at the same time realizing that my own priority list is almost entirely different, I decided to jot down my own roadmap. My own language interests tend to blur the line between theory and practice, so I'll present a list of languages as well as theory that inspires some of my interest in tools at the moment.
The languages and tools I'm learning:
- Agda and Coq: We’ve recently done workshops on Agda at Stack Builders, and this has helped to open my eyes to the benefits of dependent types. Coq is a powerhouse of great language ideas, and I’m interested in diving into interactive theorem proving as well.
- Elm: I started using Elm a couple of years ago after seeing Evan Czaplicki's great talk at the Emerging Languages Camp during Strange Loop, and I've used Elm in some recent university talks in Ecuador to demonstrate the benefits of static types and pure functional programming for creating user interfaces. I'm excited to see the Elm community picking up well-deserved steam.
- Idris: Recently I saw a talk by Edwin Brady, the creator of Idris, at Lambda Days in Krakow. His demonstration of how Idris can use uniqueness types to express a network communication protocol blew me away, and I’m interested in learning more about this and other innovations in dependent types coming from Idris-land.
- Liquid Haskell: This extension to Haskell brings us closer to dependent types, which I think is extremely fascinating to help us reduce the cost of software development in the future. As Haskell is already an extremely pragmatic language that we’re using for production projects in Stack Builders, I think that helping Haskell to gain more expressive types is a promising development.
What I'm studying:
I’ll be attending the Oregon Programming Language Summer School in June 2015. Topics covered will include type theory, category theory, and languages such as Coq and Agda which are deeply related to these theoretical areas. As I prepare for OPLSS this June, I'm studying the YouTube videos from the OPLSS 2012 on similar topics. Specifically, I'm going through the talks on Type Theory, Category Theory and Proof Theory, which are taught by some of the most prominent figures in each area (Robert Harper, Steve Awodey, and Frank Pfenning, respectively). I have a long reading list related to the areas of theory that interest me, but I'll leave that for another post.
What I'm not pursuing at the moment:
- Clojure: I played with Clojure for a while, and I think its support for immutability is helpful. But with the lack of static typing, I didn't feel like it gave me the boost I was looking for in development productivity. I'm much happier since I found Haskell, and that has opened up new worlds of tools and theory, part of which I've enumerated above.
- Go: I don't see it as being innovative enough to really change the way that I think about programming. I also don't see it helping us to significantly reduce the cost of producing high-quality software.
- Erlang: I think that the concurrency models offered by Erlang are extremely interesting, but I'd rather get there through expressive types. That said, there is very promising research going on to bridge the gaps between Erlang's concurrency and Idris' dependent types that I'm interested in checking out in the near future.
- Scala: I've heard enough about the complexity arising from a combination of moderately expressive types and object-orientation, so it's not on my list for the moment, though it certainly does have some compelling characteristics.
As a programmer, I think many times each week that I'm lucky to be in a field where the horizon of things to learn is so broad. It requires strong prioritization to maintain focus on our particular areas of interest. There is a wide range of languages, from Haskell, which is an extremely pragmatic tool that we use every day to rapidly build working systems, to Idris, which is introducing compelling concepts at a dizzying rate for the next generation of programmer tools. I'm excited by this path that I've found for my current study of tools and theory, and I hope that some of these ideas have also piqued your interest!
A big thanks to Stack Builders Juan Pedro Villa, Luis Laverde, and Lori Leitgeb for providing useful suggestions on a first draft of this post.