views:

708

answers:

7

Has anybody successfully used spaced repetition concepts embodied in programs like supermemo in the context of programming ?

The motivation for this question: I'm increasingly having to look up things I knew.

Reading this Wired piece "Want to Remember Everything You'll Ever Learn? Surrender to This Algorithm" has me wondering if this has worked in practice for anybody. I'm talking about using it to remember programming snippets, keywords, APIs etc so I don't have to browse through "X in a Nutshell" just to refresh my memory.

Update: I think I should expand on this a bit more. Let me illustrate with 2 examples:

  • Around 5 years back, I wrote many a Perl program without breaking sweat. I have now forgotten so many of the simple things about writing Perl scripts that the time I'd take to get really productive again isn't worth the simple problem a script solves. Worse yet, I know I'd forget this yet again because it'd be a cursory glance at "Perl in a Nutshell" and the next script-writing opportunity would probably turn up another 6 months down.
  • At an earlier time, I knew the C++ STL inside out. Now, I'm spending time going over the intricacies of the STL, the gotchas, the non-obvious mistakes that it's easy to make that could doom my project, or at least force me to spend hours debugging later.

In both cases, I'd spend that little bit extra time & effort this time around, if I knew it'd help me retain this info in future. Probably highlighting APIs and keywords as what I'd like to remember isn't entirely right, but it's not programming concepts either. I can remember those. It's the knowledge that falls in between, the quirks and specialized ways of doing things on a particular language/platform that I'd like to not have to re-learn.

So, has anyone used these techniques to retain this kind of knowledge?

+4  A: 

I had read that article and found it interesting, but ours is not a profession that rewards rote memorization. It's better to understand programming concepts and be able to apply them in different languages by looking up the syntax you need.

Bill the Lizard
+1, absolutely. Why spend months learned every function in the API when you can look it up in seconds, and could have spent that time perfect other areas, such as code readability, or algorithm design.
Malfist
+1: Why spend months learned every function in the API when the vendor is free to change it tomorrow?
S.Lott
Rote memorization is a poor substitute for understanding, but there does come a point when memorizing language elements does improve efficiency. Nagul mentioned specifically the need to look up some of the same information over and over. That is where memorization would certainly provide a benefit and make this question relevant.
Rich.Carpenter
@Rich: I can only speak from experience and say the repeatedly looking up the same information causes me to remember it after a few iterations. I don't see the purpose in selectively memorizing a set of information before I know what information I'm going to need to memorize. Practice does that for me, though.
Bill the Lizard
@BilltheLizard: I am the same way in that regard. However, depending on the frequency, looking that same information up repeatedly may or may not cause it to stick. Personally, memory exercises bore me to tears and end up proving ineffective, for me anyway, but I can certainly see how they could benefit those who learn that way. Good discussion.
Rich.Carpenter
+1  A: 

I have always sworn by the idea that I don't need to memorize everything I need to know (or have known), I just need to remember how to remember it. Knowing it is in XYZ book, ABC assembly, TUV bookmark, et all is 99% of the battle. From the referenced article:

The problem of forgetting might not torment us so much if we could only convince ourselves that remembering isn't important. Perhaps the things we learn — words, dates, formulas, historical and biographical details — don't really matter. Facts can be looked up. That's what the Internet is for. When it comes to learning, what really matters is how things fit together.

Wayne Hartman
+5  A: 

It's not for "stuff you can just look up." It's for "stuff you wish you didn't have to look up."

I use spaced repetition to help me retain what I learn when I encounter a new problem domain or a new language/API.

It's especially helpful in cases where I dabble in something and wish to be more fluent. Examples:

  • At one job I was primarily a tester, who every few months wrote some Python. I used spaced repetition to stay fluent, keep the the language fresh in my head, so that I was not disrupted by having to look up how to do basic things.
  • Working at a shop that primarily uses CVS, yet I occasionally need to use git when working with open source. To keep git commands fresh in my head, I use spaced repetition. It means less groping for cheat sheets, less looking things up.

Andy Hunt's book, Pragmatic Thinking and Learning: Refactor Your Wetware mentions the technique.

Making the cards forces me to be an active reader when learning new material--what do I want to remember here? It does of course have a bias toward facts, vs. bigger things like ideas, algorithms or diagrams.

It's not for everyone. It does take time to create the cards, and discipline to review them every day. (The nice thing about spaced repetition is you may have a deck of several hundred cards, but you only need to review a few cards a day.) There is something of an art to creating the cards in such a way that you can answer them quickly. And there are some decks I've invested time in building/learning/retaining, only to find I end up not using the info.

It's especially nice on a portable device. When I had a Palm Pilot I could do my reviews on the bus, or in other spare moments where there was "nothing else to do." (At a PC there is always "something else to do." :-)

The software mentioned in the Wired article, SuperMemo, has inspired a number of space repetition tools that use the same or similar algorithms. I started with that but found the UI unnecessarily complicated. I moved to a Palm Pilot tool, then to mnemosyne, and now anki.

Pete TerMaat
I couldn't agree more with Pete. I've learn about SR in Pragmatic Thinking Learning and became a fan of the the technique. See that naturally you use SR when learning to use something. The most used features are repeated more often. Use it for the things that annoy you to search the reference. I've created cards to memorize my most used Python strftime parameters, some bash history commands, and a couple of advanced regexp operators. SR shines in not often used technologies, helping you to keep your flow of thought uninterrupted when you come back to them.
neves
A: 

I read the artcle too, thanks for bringing it to our attention. I have to disagree somewhat with Rich.

I'll grant that one should have a sound base in programming fundamentals to be successful.

However, Increasingly there is a need for developers to be multlingual and familiar with mulitple frmaeworks. Couple that with the constant paradigm shifts inherent in the industry and I think that using this technique to reinforce the languages and frameworks we use everyday could make us more productive.

That would mean you "agree" with me then, right? ;)
Rich.Carpenter
+1  A: 

On the flip side of spaced repetition is the fact that the second time you learn something takes far less effort and time than the first time.

Given the frequency which you need the knowledge, it is probably better to just make sure you write good comments and tests than to try to retain everything you've ever known

Jiaaro
A: 

I just wanted to take advantage of the topic and say that I'm working on a web-based spaced repetition application with open database of learning materials (Wikipedia-like) and mobile clients (iPhone and Android). I'm looking for somebody to help with the project. The server-side code is written in Python (Pylons), the GUI in JavaScript (ExtJS). High test coverage. If anybody is interested, my e-mail is adam.dziendziel at gmail.com.

Adam Dziendziel
+1  A: 

I think spaced repetition has many applications in the programming profession. Here are 3 cases in which I have used it:

  1. Spaced repetition is used in learning foreign languages it helps people remember the kanji for japanese and pronunciation etc. Since I think that human languages are harder than computer languages and Spaced repetition is proven to increment retention in human languages. It isn't hard to imagine it has great benefits in retaining computer languages.

  2. I've been trying to learn Smalltalk, by means of the Squeak opensource implementation. In order to do that I'm reading: Squeak by example. The problem that I have is that I can only study during weekends.

    • So every weekend I read one chapter that is all.
    • Make my cards and put them in my Deck in Anki (opensource spaced repetition software).
    • And during the week just spend a few minutes everyday studying them.
    • By the next weekend I can continue reading the next chapter and remember the previous chapters with no problems at all.
  3. Finally, When I arrived to a new project I needed to learn fast where the build server was, the database server, where each module in the code resided, etc. In order to learn that I would ask questions to my colleagues. Write them in my flashcard in Anki. That way I got familiarized with the project in no time.

elviejo