Checklist for learning a new programming language
Tags: tips
Published: 2021-02-06 20:39:11



**Update 22/01/2020:** I’ve applied the checklist to [learning Scala](https://www.horiaconstantin.com/checklist-for-learning-scala/) and I’m updating it based on that experience.

In a workshop that I recently gave, I compared learning a new programming language with learning a new natural language. Depending on your experience, learning a new programming language might be a medium difficulty task or a hard project. In the latter situation, you’re going to need to have some structure in your approach, to ensure you reach your goal. But what is an easy way to start? I propose to use a checklist similar to the one I’ve written below.

## Naive solution

*“I’ve got enough Java experience. I’m a good software engineer. I’ve played with other languages before, and it went well.”* I said to myself. I was aware that Scala has some very funky notations and that it uses plenty of functional programming concepts. But my confidence was high. I’ll do it as I did it before: take an online course, read a book, find the documentation, make a small app, and go from there. But I didn’t expect to get into analysis paralysis because of the overwhelming number of books, frameworks, courses, etc. I eventually decided on an online course and finished it only to realize that I wasn’t learning as much as I wanted. I decided to make the learning process explicit by creating a checklist that I could improve iteratively.

## The checklist

I created this checklist iteratively as I was learning Scala, but I’ve generalized it for any programming language. In a future post, I’ll show how I’ve applied it to my learning.

There are two components that I found valuable while learning Scala: keeping my motivation high (mindset) and having a good learning plan that supports my learning experience (setting). Start with mindset first (ordered starting with top priority), continue with the setting.

## Mindset

* Clarify what your personal why’s for learning are. [Try to connect this to intangible needs/wants/dreams](https://en.wikipedia.org/wiki/Self-determination_theory). Bad: I want to learn this because my boss promised me a 2% raise at the end of the year. Good: I want to learn this because I’m curious about how it works
* Find a project to build while learning. Online courses and books tend to teach concepts without applying them to real-world use cases.

## Setting
### One-time tasks

* Follow a high-quality online course/book about the language. Material created by the language’s author or main contributor clarifies the language philosophy and its specific patterns.
* Find/create a cheat sheet with the most common expressions and idioms of the language and keep it open in a browser tab
* Find/create a comparison between the new language and another that you’re familiar with
* Start collaborating on an open-source library. Pick a common one, but not a complex one. Start by searching on GitHub.
* Find the official language documentation, learn how to read it, and keep it open in a browser tab
* Find/create a roadmap that describes the steps that you will go through (the table of contents of online courses are usually a good source)
* Find a code-conventions/style-guide document

### Continuous tasks

* Take notes: questions, curiosities, “strange” code.
* Find someone to review the code that you write.
* Find/create a dictionary/glossary of the concepts, keywords, etc. which are specific to the new language (consider making a mindmap). Aim to understand the use cases for them. And practice it.

### Deprecated tasks

These tasks seemed a good idea in theory but were not useful to me in practice.
* Find/create a list of antipatterns. It might be syntax or design patterns, but the language that you are learning is going to do a couple of things differently compared to what you were used to.
* Find the frameworks that you foresee needing and are the most popular (GitHub search with the new language tag)
* Find and learn how to use the most popular build tool

## Work in progress

At this point, I’m convinced of the usefulness of having a checklist for learning a new programming language. However, I’m aware that some of these ideas are more effective than others. In a future article, I’ll tell you how my learning process was affected by following this checklist.