Something I’ve heard other developers brag about is how much they google answers. The argument goes, “I only learned what a quick sort was for an interview and I’ve forgotten since. If I ever need to use it, I’ll just google it.” The idea is that real engineering skills are more abstract and learned through practice and not basic recall; fake engineering skills are things that you can google or look up on Stack Overflow. I’ll concede that specific things aren’t worth memorizing, but in general memorizing is a valuable tool for improving my programming skills.
I find that memorizing has two main benefits. The first is I run into fewer known unknowns (i.e. I know that I don’t know a fact) and thus I’m taken out of my flow less often. Every time I have to pause what I’m writing, open up google, read something, and then switch back to my IDE – that’s time I’m losing focus. It’s like reading from a hard drive instead of RAM. It’s slower and more disruptive.
The second benefit is less obvious and deals with unknown unknowns (i.e. I don’t even know the fact exists). The more I’m able to recall from memory, the more potential solutions I have to draw from. Maybe I learned about tries once but what good is that if I don’t remember it in the moment when it would be the ideal solution to a problem.
I’ve long been sold on using memorization to improve myself but struggled to find an effective means of committing things to memory. Then I came across spaced repetition. It’s essentially like flashcards that you repeat based on how well you remember them. If you’re struggling to remember a card, it will frequently appear. If you find a card easy it won’t show up for a while, but you’ll still see it again. This repetition of cards is what makes it effective at indefinite retention.
Conveniently, there’s apps available for space repetition. Personally I use https://ankiweb.net because it’s free, simple, and available both as a website and as a mobile app. But there’s plenty of options out there.
When it comes to creating decks and cards, I recommend a couple of things.
Create a deck for each language you’re using
I typically create a deck per language I’m actively working in. I’ll add cards related to the language or frameworks written in that language to the deck.
Consider adding a card each time you look something up
Each time I catch myself googling something, I’ll consider a) whether I’ll ever use the knowledge again and b) whether I can capture it in card. For example, I once had to figure out how to iterate over the values in a C# enum. I created a card with the front:
and the back:
Create decks for software engineering topics
I’ve created decks for other software engineering topics I want to have at my finger tips like Domain Driven Development or Refactoring patterns.
After a few weeks of doing this I found myself recalling a wider range of programming concepts and keywords both when writing code and when discussing solutions with co-workers. It’s become up a regular tool in my self-improvement tool belt. I hope it helps you out too.