6 ms·
Memorizing a programming language using spaced repetition software (2013)
- deboflo 7y agoGreat post! Whenever I’ve gone down the path of trying to memorize stuff using spaced repetition or flash cards, it has rarely paid off. I’ve found that real practice works better for me. For example, I’ll create and run a vim macro command 10 times when I realize I’ve forgotten how to write macros. It’s like playing a musical instrument.
- anaphor 7y agoIs there a benefit to trying to actively memorize the syntax/semantics of a language rather than just looking it up when you need to know something, and then passively memorizing the parts you use often? Also a huge component of memory is contextual cues, which is why people find it so hard to code on a whiteboard vs. being at their normal computer/keyboard.
- kiba 7y agoIs there a benefit to trying to actively memorize the syntax/semantics of a language rather than just looking it up when you need to know something, and then passively memorizing the parts you use often? This is akin to looking up words you don't know in a foreign language and hoping through repeated exposure that you learn the right words to use. It's very slow and frustrating. It is much more efficient to just know stuff off the top of your head. Just because you look stuff up doesn't mean you efficiently memorize those things either. Reading had been proven to be a poor strategy for studying. Also a huge component of memory is contextual cues, which is why people find it so hard to code on a whiteboard vs. being at their normal computer/keyboard. Context clues can be embedded in flash cards as necessary. Although it's also possible that you're associating arbitrary clues to your cards, which would be to your detriment. For example, an arbitrary part of the card trigger the answer, instead of an appropriate context. It's why some academics recommend studying using different rooms so that the context for your answer don't become glued to that environment.
- AlchemistCamp 7y ago> This is akin to looking up words you don't know in a foreign language and hoping through repeated exposure that you learn the right words to use. It's very slow and frustrating. It is much more efficient to just know stuff off the top of your head. > Just because you look stuff up doesn't mean you efficiently memorize those things either. Reading had been proven to be a poor strategy for studying. The research of Krashen, Mason and other L2 acquisition linguists on extensive reading for language learners directly contradicts this claim. Regular, sustained reading is considerably more effective for acquiring a language than flashcard-based methods. Anki is great and I'm a contributor! But it's more of an ancillary tool. SRS shines when it comes to memorizing decontextualized, atomic information (e.g. countries and capitals, the periodic table of elements or writing Japanese kanji), but not for learning a language in general.
- kiba 7y agoThe research of Krashen, Mason and other L2 acquisition linguists on extensive reading for language learners directly contradicts this claim. Regular, sustained reading is considerably more effective for acquiring a language than flashcard-based methods. I am not disputing reading in the language learning context as a tool for learning, especially when combined with SRS. Doesn't really apply to me since there is no widespread written component for ASL. By reading, I meant people rereading their old notes instead of actively challenging themselves. That is, no attempt at retrieval-practice that is the basis for spaced repetition. Research said that study method is often regarded as effort in vain. But that apply to contexts such as studying biology. Reading in a foreign language is a different context in that you are also learning new materials and practicing retrieval at the same time. Anki is great and I'm a contributor! But it's more of an ancillary tool. SRS shines when it comes to memorizing decontextualized, atomic information (e.g. countries and capitals, the periodic table of elements or writing Japanese kanji), but not for learning a language in general. I don't see how it's impossible to use anki for contextualized learning. It's the whole point of sentence mining. Rather, with no context, it's essentially useless since I wouldn't know how to use it in context. Periodic table is a great example for this. When I don't know the answer to questions anki posed, I used related information to retrieve what I need to know. In my case, I have no reading materials to sentence mine, so I just mine ASL videos.
- MattRix 7y agoIt kind of covers this in the article, but the theory is that by actively memorizing these things you become a better programmer because you have more tools at your disposal (and more knowledge about exactly how those tools work and what they are good for). I'm sure all of us programmers have been in the situation of discovering a faster/better way to do something that we've been doing for years.
- atomicity 7y agoPersonally I don't think it's worth Anki. There are so many things that you can memorize: - common standard library method - code-level design patterns (like the factory pattern) - system design patterns (like caching in Redis) - SWE process patterns (like code review or 1-1 meetings) Why would syntax be the right level of abstraction to repeatedly review? The space of things you can memorize (or "cache" in your mind) is too large. So a better strategy might not be to use Anki (which optimizes for retention but takes time to set up) and instead "randomly sample" a bunch of different things so that you know the techniques out there. Then you retain the knowledge that you need by actually using it on the job.
- daenz 7y agoI tried spaced repetition for a few months, but I found that I wasn't actually learning anything, I was only remembering facts. I'm not sure what I expected, but when I "learn" something, I grasp the "shape" of the concept...how it fits with other things...where its edges are...where parts of it are unexplored etc. This only comes to me by using the thing I'm trying to learn, not by injecting random facts into my memory. If anyone has had similar experiences, I've found the best way to learn has been writing about things that I use, as I'm using them. The rule for writing in that way is only write what you've come to understand...don't just copy text that is "useful" from another source. Dive deep and learn the shape of the concept, then write about it in your own words, then move on. By writing from your own perspective it has 2 effects: 1) it helps solidify the concepts a bit more, because you can only explain something once you've reached a certain level of comprehension. and 2) it serves as a "stack snapshot" of your mind when you had a handle on the concept, and re-reading that snapshot loads the context back into your mind very quickly.
- kiba 7y agoI tried spaced repetition for a few months, but I found that I wasn't actually learning anything, I was only remembering facts. I'm not sure what I expected, but when I "learn" something, I grasp the "shape" of the concept...how it fits with other things...where its edges are...where parts of it are unexplored etc. This only comes to me by using the thing I'm trying to learn, not by injecting random facts into my memory. One of the first rule of spaced repetition is that SRS is a system for retaining information, not learning. Once you learn the information, then you use the SRS to retain the knowledge you built up. Also, if you have trouble connecting individual facts into larger conceptual framework, you may not be making enough connecting notes to connect those facts. By writing from your own perspective it has 2 effects: 1) it helps solidify the concepts a bit more, because you can only explain something once you've reached a certain level of comprehension. and 2) it serves as a "stack snapshot" of your mind when you had a handle on the concept, and re-reading that snapshot loads the context back into your mind very quickly. Writing is what I do too. I have a note system that I devised that I looked up and revised all the time. It's part of my learning system, but I considered it secondary storage. But beware of reading. It can make you feel like you understand something, but you really don't. Reading is considered a poor study strategy, since it mislead you into thinking you have fluency when you don't.
- pmoriarty 7y agoIf you're memorizing very specific information that's going to be presented to you in exactly the way you've memorized it, this is great. I am a little skeptical, however, about how well the specific information you've memorized generalizes to knowledge of the principles behind what you've memorized. Taking one example from the article, if the front of the flashcard is: var a = 5 + '5'; // what is a? And the back is: '55' If either side of + is a string, the other is converted to a string before adding like strings. I'm sure it would work great if in a real programming context you're ever presented with literally: 5 + '5' But whether you'll remember the principle that "If either side of + is a string, the other is converted to a string before adding like strings" when you see, say 237 + "foo" is open to question. Of course, in this highly simplistic case you probably would remember, as it's not difficult to memorize this principle even without the flashcards, but with more complicated examples I suspect it could be a real problem.
- kiba 7y agoIf you're memorizing very specific information that's going to be presented to you in exactly the way you've memorized it, this is great. I am a little skeptical, however, about how well the specific information you've memorized generalizes to knowledge of the principles behind what you've memorized. Difficulty in generalizing things is a common problem from learning. Unfortunately, from what I know from research, the best way to overcome this is through lot of examples, especially examples that seem contradictory.
- tigershark 7y agoNo, the best way is to read a proper explanation and understand the concept and the apply what you learnt writing some code in a different context. If you are trying to understand a programming language just by reverse engineering it and memorising the keywords in Anki then probably is not going to work.
- kiba 7y agoNo, the best way is to read a proper explanation and understand the concept and the apply what you learnt writing some code in a different context. If you are trying to understand a programming language just by reverse engineering it and memorising the keywords in Anki then probably is not going to work. What make this difference from generating and creating your own examples, as I suggested? As I said, this is a common problem in learning, not just programming. Conceptual explanation is not enough, and neither is a single example. Otherwise, you will get surface level misunderstanding instead of deeper understanding.
- munmaek 7y agoI have been using anki for almost ~3 years now to study Korean vocabulary, sentences, and Japanese kanji. I'm also a software engineer for my day job. I've also written about anki. [0] I don't see the value in memorizing programming -syntax-. It's irrelevant to me to remember how to open a file in ruby or do a specific command- that's what search engines and then my personal wiki is for. If I worked -only- in ruby, then I'd likely remember those specifics much more, but since I hop around with rust, python, c#, clojure ... depending on our clients, there's no way I'm going to remember stuff like that for every language. Especially since languages tend to get updates and changes! I would use anki to retain knowledge of stuff like more complicated data structures. Right now, I just search for what I need, then toss it into my personal wiki folders. I can then use notational-fzf-vim to rapidly fuzzy search my markdown files. [0] I keep these synced across computers with a selfhosted nextcloud instance. [0]: https://andrewzah.com/tags/anki https://andrewzah.com/tags/anki [1]: https://github.com/alok/notational-fzf-vim https://github.com/alok/notational-fzf-vim
- kiba 7y agoIf I worked -only- in ruby, then I'd likely remember those specifics much more, but since I hop around with rust, python, c#, clojure ... depending on our clients, there's no way I'm going to remember stuff like that for every language. Especially since languages tend to get updates and changes! They change that often? I memorized the programming syntax so that hopefully next time I opened up a language I haven't seen in years, I don't have to stumble around trying to catch my footing. I also found that I have terminologies issue which may make communication difficult, so it's a good idea to have labels for structures in your program.
- munmaek 7y ago> They change that often? Typically not very much, but it -can- happen. I don't see the need to have stuff like that memorized when I can just check my wiki, or search online if that fails. Or I can even just look at one of my past codebases really quick with fuzzy searching or grep. For any domain that I'm working in, it's typically unnecessary anyways. I do a lot of work in Rust right now so I have most things like that off the top of my head, etc.
- zelly 7y agoWhat's the point? Programming language rigmarole is well on its way to being automated. It's better to memorize algorithms. Make flashcards of Knuth, not stuff that IDEs autocomplete for you anyway.
- nwatson 7y agoI just returned to Java after 3 years away, IntelliJ IDEA syntax highlighting, auto-completion, code-formatting, and "code analysis/inspection with suggested improvements" made it easy.
- zelly 7y agoIt's only going to get better. There's just so much code out there to learn from. PL grammar is a lot more machine-readable than natural language. https://ai.facebook.com/blog/aroma-ml-for-code-recommendation/ https://ai.facebook.com/blog/aroma-ml-for-code-recommendatio... https://visualstudio.microsoft.com/services/intellicode/ https://visualstudio.microsoft.com/services/intellicode/
- tigershark 7y agoDid you forget the sarcasm tag? Algorithms and code in books will be the first things to be automated... you have to learn how to create the algorithm that you need, not to memorise algorithms...
- zelly 7y agoYes, the point is to create your own algorithms. It's hard to create something you don't know anything about or know how other people created them before you. Imagine this in another field, say an engineer who doesn't want to study how other bridges were designed because those aren't the bridges she's going to make. Eventually algorithm and data structure design will be automated and everyone will be programming in declarative English, but that's a lot more general intelligence than predicting your next line of code is a foreach. That's why I say learn computer science not programming languages because machines already speak programming languages.
- mailjenil 7y agoI just started a new job and have been learning Spark + Scala with Anki. Whenever I need to Google something, I make sure to make a flash card for it. Its working well so far.
- tigershark 7y agoProbably you are memorising it rather than learning it unless I misunderstood what you are saying...
- imedadel 7y agoSimilar to using spaced repetition to learn programming languages, you can use the same technique to organize your problem-solving skills sharpening sessions. A while back I made a Chrome extension for LeetCode. [0] It takes care of scheduling problems for you and the extension users love it :) It costs only two dollars, so you might want to try it :) [0]: https://spacedleet.imedadel.me/ https://spacedleet.imedadel.me/
- erikpukinskis 7y agoI wonder if I could use this technique to learn to remember important personal tasks. Not dates to do things, but just keep in my head, open your mail, sweep the floor, send thank you notes, pay your credit card bill, etc.
- kiba 7y agoIt may be a good idea to use posted checklist(constantly refined) in addition to anki. In all honestly, I have no idea how useful anki would be in setting up habits.
- smabie 7y agoWhile Anki is great, I don’t see much value in using it for programming. I personally use it for equations and find it works very well. While remembering an equation is super useful, remembering APIs and stuff just isn’t. Intellisense solves the problem and even if you don’t have access to it (Python cough cough), it’s not that big a deal to just look up the documentation. Looking up the “documentation” (hah!) for equations is actually genuinely time consuming.
- kazinator 7y ago> it’s not that big a deal to just look up the documentation. Imagine you don't know the language and are trying review a few thousand lines of code. Well, you wouldn't be doing that if you don't know the language, right? But that's just it; maybe spaced repetition can be a good way to get there, especially if you're already an experienced programmer.
- gambler 7y agovar a = new Array('5'); // what is a? var a = 5 + '5'; // what is a? It's sad that many languages force people to memorize trivial stuff like this. This is one of the things that really impressed me about Smalltalk/Pharo syntax when I started learning it recently. The language itself encourages you to name things in a way that labels all the parameters. E.g. you can have a constructor like this: OrderedCollection ofSize: 5. And method names are composed of parameter names: array insert: 11 before: 2. Instead of array.insertBefore(11, 12);
- jeffshek 7y agoIf anyone's interested - I've written a guide to Anki and spaced repetition. I've used it for about 5-6 years and my deck is about 12,000+ cards. Much of it is based in software engineering. https://senrigan.io/blog/everything-i-know-strategies-tips-and-tricks-for-spaced-repetition-anki/ https://senrigan.io/blog/everything-i-know-strategies-tips-a...
- hn17 7y agoThank you for sharing.