Part 1: Easing Haskell's Intimidating Glare
Welcome to the first part of the Haskell Brain series! While our Liftoff Series goes over the basics of the actual language, there's also a lot of mental work that goes into learning anything new! This series will cover some of the psychological barriers people encounter when learning Haskell. It will also some tips for overcoming them.
This first part will take a specific look at Haskell's reputation in the larger programming community. We'll examine why Haskell often is seen as intimidating and difficult, and why this shouldn't be the case!
If you're totally fearless and want to hop straight into some techniques for learning, you can move on to part 2 of this series. There, we'll discuss the actual process of learning. If you want to jump straight into learning the language and writing some code, make sure you download our Beginner's Checklist to help you with that!
An Academic Language
People have long considered Haskell primarily as a research language. It builds on the lambda calculus, possibly the simplest, purest programming language. This gives it a host of connections to cool concepts in abstract mathematics, primarily the province of professors and PhD. students. The connection is so elegant many mathematical ideas can be well represented in Haskell.
But this connection has a price in accessibility. Important Haskell concepts include functors, monads, categories, etc. These are cool, but few without a math degree have any intuition for what the terms mean. Compare these to terms from other languages: class, iterator, loop, template. These terms are a lot more intuitive, so the languages using them have an automatic advantage in accessibility.
Aside from this terminology point though, the great academic interest is a good thing, not a bad thing. However, on the production side of things, the tooling has not been sufficient. It was simply too difficult to maintain a large-scale Haskell project. As a result, companies had little incentive to use it. This meant there was little to no balance of the academic influence.
The net result of Haskell’s academic primacy is a skewed knowledge base. The nature of academia is that relatively few people spend a large amount of time on a relatively small set of problems. Consider another academic field, like virology. You have some experts who understand viruses at an extremely high level, and the rest of us don't know much at all. There are no hobbyist virologists. Unfortunately, this kind of distribution is not conducive to introducing new people to a topic.
Naturally, people have to learn from those who know more than they do. But the truth is they don’t want their teachers to be too much better. It helps tremendously to learn from someone who was in your shoes not too long ago. They’ll more likely remember the pitfalls and frustrations they encountered early on, so they’ll be able to help you avoid them. But when the distribution skews towards the extreme, there is no middle class. There are fewer people who can optimally teach new learners. In addition to not remembering old mistakes, experts tend to use overly complicated terminology. New folks may feel intimidated by this and despair.
Turning the Tide of Production
The lack of production work mentioned above contributes substantially to this divide. Many other languages, like C++, have strong academic followings. But since so many companies use C++ in production, it does not face the knowledge distribution problem Haskell does. Companies using C++ have no choice but to train people to use the language. Many of these people stick with the language long enough to train the next generation. This creates a more normal looking knowledge distribution curve.
The good news for Haskell is there have been major tooling improvements in the last few years. This has brought about a renaissance for the language. More companies are starting to use it in production. More meetups are happening; more people are writing libraries for the most crucial tasks. If this trend continues, Haskell will hopefully reach a tipping point where the distribution becomes more normal.
The Key Insight
If you are someone who is interested in learning Haskell, or who has tried learning Haskell in the past, there is one key thing to know. While the abstract mathematics is cool, understanding it is mostly unnecessary. Monads are essential. But category theory is overkill for most day-to-day problems you’ll solve. The dozens of language extensions might seem intimidating, but you can pick them up one-by-one as you go.
At Haskell eXchange 2016, Don Stewart from Standard Chartered gave a talk about the company’s use of Haskell. He explained they rarely use anything outside of vanilla Haskell constructs*. They just don’t need to. Anything you can do with, say, lenses, you can accomplish without them.
Haskell is different from most other programming languages. It constrains you in ways those languages do not. But the constraints are not nearly as binding as they seem. You can’t use for loops. So use recursion. You can’t re-assign variables. So create new names for expressions. You just have take it one step at a time.
Now that you know Haskell isn't really that scary, you should move on to part 2 of this series. You'll learn all about the very process of learning and a few tricks for more rapid improvement.
If you want, you can also jump right into some coding by looking at our Beginner's Checklist! It will help you get started with Haskell and point you towards some useful tools!
*At least with respect to their normal Haskell code. Some of their code is in a proprietary language of theirs called Mu, which is built on Haskell but obviously different.