×
all 65 comments

[–]Concise_Pirate 11 points12 points  (9 children)

This is fascinating, as the author's ideas of what kind of knowledge makes a better programmer is very bottom-up and thus different from what most people would focus on.

[–]attekojo 1 point2 points  (0 children)

Actually I find his ideas very much aligned with the ideals of iterative development; first you collect same basic low-level facts into set of cards, and then gradually fuse these little bits of knowledge into more sophisticated pieces of abstract knowledge.

[–][deleted] 0 points1 point  (7 children)

Yeah, looking at the cards they state things like: In git conflicts the part after ====== is on whos side? Answer: it's on side X

Wouldn't it be much better to understand a little about git and just know the answer by deducing it from that knowledge? Like sure you can use grep --color "foo|$" to highlight matches and not drop lines, but why does it work? It's much easier to understand that the |$ matches the end of every line but has nothing to highlight, than to memorize that string, so you can use that concept outside of grep.

[–]brightbyte8[S] 27 points28 points  (5 children)

Original author here. The card you take issue with was in a section about refactoring messy cards. In the text I explain that sometimes you enter cards with poor intitial understanding. Once you gain a higher level understanding you should refactor these cards: I did exactly this later in the article.

I'm all for knowing why things work, but I don't agree that you'll always be able to find the time to understand deeply the first time you encounter a topic. Thus the gradual evolution of cards into more abstract forms.

I also disagree with your low valuation of memorization. Taking a programming analogy, it's often a good idea to cache the results of expensive calculations. Why shouldn't the same apply to using your own logic? If you remember the answer to a question others have to deduce, then you have no need to deduce it in the moment and so your mind is free to work on harder and more abstract concepts.

[–][deleted] 2 points3 points  (0 children)

For me, understanding enables me to remember effortlessly.

I used to reason like IonMyMoney, that it was so I could re-derive them... and in fact I thought I was unable to remember arbitrary facts. But, actually, it turned out I just wasn't interested in learning them (when I tried it as an experiment, I could do it). So, perhaps I remember things effortlessly when I understand them because I am interested in understanding. Perhaps also, my mind finds explanatory relationships especially memorable.

However, in support of your view, when I am trying to solve a novel problem, and not making progress, I often find that after immersing in it for a few days, it becomes obvious. I think this is to do with me memorizing the background facts, so that from that platform, I can concentrate on just the key explanatory relationships. An aid to memorizing those background facts would therefore help.

Although you seem to be talking about operational facts (e.g. how to iinterpret syntax), this is just the kind of "background fact" that a true understanding can be built on. I might try it - the only issue for me is that for my "novel problems", it's usually not clear what the background facts are. Being novel, there are no textbooks, tutorials, examples, stackoverflow questions or blogposts about it. And sometimes the solution comes from changing one of those background facts, or reframing it. Still, I think some of them might be clear enough to try it, and even if it is changed or reframed, I still need to know in the first place, to get to the point of changing/reframing it. Hmmm....

[–]munificent 1 point2 points  (1 child)

Taking a programming analogy, it's often a good idea to cache the results of expensive calculations.

Well, to extend that analogy...

It's actually rarely a good idea to cache results. You're trading memory for CPU time, and you have to actually have profiling data before you can determine that that trade-off is a win. Time spent memorizing something is time you could spend learning something new. How do you know that's the best way to spend it?

Worse, you have to then worry about cache invalidation: knowing when you actually do need to recalculate something because the inputs have changed. How do you know when your "best practices" aren't best anymore if you don't remember why you made them best practices to begin with?

[–][deleted] 1 point2 points  (0 children)

Because there is a high probability by memorizing a rule that you will apply it incorrectly because you don't understand the reason that rule exists. It's great if you're using an established library, etc., to do your abstraction, or you understand what you are abstracting because you solved the lower-level problem. 99% of the time an abstraction is only partially applicable to the problem and you will have to customize it so it fits correctly. Once that is finished, then you can ignore the complexity, not before.

Thanks for your clarification though, A+++, etc. I believe we are both correct. I am not a teacher but I recognize the need for abstraction when teaching new concepts.

[–]ex_ample 0 points1 point  (0 children)

I also disagree with your low valuation of memorization. Taking a programming analogy, it's often a good idea to cache the results of expensive calculations.

Only if you are sure you're going to see the same 'calculation' again. 99.9% of programming stuff is going to be stuff you've never seen before, and thus memorization will be useless.

[–]Mishtle 0 points1 point  (0 children)

Knowing what the |$ does is not an example of understanding. That's just simple recall, and a perfect example of what flashcards could be used for.

[–]Mishtle 11 points12 points  (1 child)

I think some people are missing the point of this technique. It's not a stand-alone technique designed to replace learning through actual hands-on programming. It's a supplementary method designed to help you remember the facts and pieces of knowledge you accumulate through experience.

[–]joesb 4 points5 points  (0 children)

It's the same people who complain about any technique with argument like "it's not silver bullet! You still have use your brain!". To this people saying that any knowledge is imperfect makes them feel better about themselves.

[–]FermiAnyon 4 points5 points  (3 children)

I've been using an SRS for a while to learn Japanese. It's legit. Btw, it's not just about memorizing things. The cards eventually feel intuitive and augment your day to day interaction with the discipline (Japanese, in my case.) Repeat. Flashcards are not intended to be the user's only exposure to the discipline. They are to help the user incorporate key pieces of information into his usable skillset.

[–][deleted] 0 points1 point  (2 children)

Are you learning Japanese grammar though this kind of system, or simply learning katakana, hiragatana, and kanji? A language in that sense is much different than a programming language.

[–]zeggman 2 points3 points  (1 child)

It's a useful tool for grammar and vocabulary as well. One thing I've done is combine the two, and simply put a Japanese sentence or phrase on one side of the card, and the English translation on the other.

[–][deleted] 0 points1 point  (0 children)

Ah. I've been learning Japanese myself. I've mostly been learning it through listening to it being spoken. I've been putting off becoming literate in it for a little while, though, and I'm still working on learning the symbols.

[–]i_went_full_retard 5 points6 points  (0 children)

To skeptics - I used to be on the Quiz Bowl team and memorization of a large amount of facts was vital to being an extremely good player. The thing I found most interesting was, as I began to learn more and more facts, it became easier to learn additional facts as I was able to draw connections between ideas in history, art, math, etc. and things started to intertwine. I literally started paying attention to the world around me far better than before. And, as a result, I was able to see a new world. I believe the same goes for programming. The larger your base pool of knowledge, the easier and faster it is to learn and draw connections in the future. Sure, you can get the same foundation of facts through sheer experience alone. But, surely, as a programmer you can understand that more efficient ways to do that exists, and this highlights one of them.

[–]joesmoe10 11 points12 points  (7 children)

It's surprising to me how many programmers think this is a terrible idea. I get the feeling people are simply rejecting this method because it requires memorization.

Programming certainly requires abstraction that doesn't translate well to flash cards and is better gained through experience or deep study. But, there are so many little steps involved in any project that do map well to flashcards. The author calls this chunking and provides many examples. His argument is that being fluent in these little steps allows you to better focus on the high-level problems. This method reminds me of a personal stackoverflow that you can keep in memory.

[–]jrochkind 3 points4 points  (5 children)

But we already have stackoverflow, and the internet. It takes a certain amount of time to find/get your answers on stackoverflow (or similar) -- is the time you spend on The Method really less than the time it would take you to find the answers by looking them up, is it a net gain?

[–]julesjacobs 7 points8 points  (3 children)

Often you won't think of something you don't know. For example suppose you want to filter an array in Ruby. If you don't have the array methods in your memory you'd write something like this:

filtered = []
for x in array
  if x > 2
    filtered << x
  end
end

On the other hand if you'd memorized the array API then you'd write this:

array.select{|x| x > 2}

Personally I found time spent memorizing the important APIs in a language one of the most effective productivity boosting things you can do. It doesn't take long to memorize at all; certainly less time per method/function than time spent memorizing a word in a foreign human language. Usually writing a short snippet that uses the method/function and checks whether the result is the result you expect suffices.

[–]jripley2006 4 points5 points  (0 children)

One thing I used to do every time I learned a new language was to read at least once all the standard library documentation. My intention wasn't to memorize every single function, but to have an idea of the kind of things I had to my disposition. The sad part was, month later, to know that certain function that I needed was implemented, but not remembering exactly where.

[–]lurgi 0 points1 point  (1 child)

If you don't have the array methods in your memory you'd write something like this

I hope I wouldn't. The first thing I'd do is check the array methods to see if there was a function to do that. I don't have the Java API memorized (no one does), so rather than re-inventing the wheel I just check it before I write code to see if someone has done it for me already.

[–]ytumufugoo 1 point2 points  (0 children)

"I don't have the Java API memorized (no one does)"

Tell that to the interviewer. My experience has been that you better know more than the person interviewing you, often through osmosis, or your going to be kicked to the curb.

[–]gwern 2 points3 points  (0 children)

is it a net gain?

I'm glad you asked that question! Spaced repetition is well-understood from the view of time invested, so we can pretty easily calculate where the break-even point is: http://gwern.net/Spaced%20repetition#what-to-add (Somewhere under 5 minutes.)

[–]fdtm 0 points1 point  (0 children)

The problem is this: If you're starting out learning programming, the best thing you can do is learn the CONCEPTS and the interactions and logical framework of how everything works. This is NOT good with flashcards.

If you're an expert programmer, on the other hand, then you should already have memorized naturally 99% of what you need to know. The extra things you learn along the way are just that... learned along the way. When you encounter things you learn and move on.

I think flashcards could be helpful if they're on really useful bits of information. Then I'd flip through them like a big FAQ and learn. But that's not flashcards, that's an FAQ / trivia page.

[–]theoldboy 1 point2 points  (0 children)

Whether there is anything in this or not (and I don't doubt that flash cards can help with simple memorization tasks), the way it is being presented here is complete rubbish and smacks of modern day snake oil.

For a start, the 10,000 hour rule is used completely out of context. 10,000 hours to master a field, maybe (if you agree with Gladwell's book). 10,000 hours to learn how to build an web application or an iphone app? Utter nonsense. Does anyone here seriously think that it would take 5-10 years (at 20-40 hours x 50 weeks) to learn that?

By following my approach, I believe that any intelligent and disciplined reader can achieve proficiency* in a given field of programming (e.g. web applications, iPhone applications) in less than 12 months.

Any intelligent and disciplined person can do that without this method.

[–]sedaak 1 point2 points  (0 children)

What. Syntax isn't where programmers tend to be lacking. If your language syntax is that obscure, perhaps you are using Perl.

[–]Yuushi 2 points3 points  (1 child)

It still seems like something of a waste of time to me, but for a different reason. If you program enough, you automatically build in repetition of the things that you most commonly use. Using flashcards seems more like a stab in the dark of guessing what will be useful, and hoping that some of it eventually is.

[–]jherod 0 points1 point  (0 children)

Learning out of context is wasteful. Reading a textbook from cover to cover may be interesting, but if those concepts are not relevant to the technical problems you currently face, then you will lack the mental context needed to assimilate that knowledge effectively. Incomplete understanding and wasted effort ensues.

The third rule of Janki keeps you focused on what is important in the moment:

“Learn in context. Pick a project, and learn only what you need to get it done.”

and

The fourth rule of Janki grounds knowledge in reality: “Only add a card to your deck after having tried to use the item of knowledge therein.”

You did read this article right?

Just because you automatically build mental constructs due to repetition does not mean that process on it's own is the most efficient way of improving mastery.

[–]dhaivatpandya 5 points6 points  (7 children)

I personally think this is pretty useless. To gather knowledge in any subject worth its salt, you need to practice and understand the subject, not just go about memorizing things. Especially true for things like Mathematics, CS and Physics.

[–]jacques_chester 11 points12 points  (0 children)

Instant recall is what enables one to have flashes of insight, to make connections and so forth. It won't make a person "smart", but it will help a smart person be smarter.

[–]brightbyte8[S] 16 points17 points  (3 children)

Original author here.

I used to think that way, and initially I was skeptical about the method. What I found, after a year of practice, was that deep and certain knowledge of foundations enables you to reason more accurately and solve problems significantly more quickly.

You see connections, notice patterns, and generally know what to do. Many of my cards deal with mathematics too - be that definitions, notation, formulas, stages in techniques for solving problems, or ways of thinking about concepts.

I wrote entire sections emphasizing the need to practice and understand the subject. The article is necessarily long, so perhaps you didn't get the chance to read these yet.

[–]jrochkind 2 points3 points  (0 children)

It's a very long post, so I may have missed it, but I'd like more info on actual experienced outcomes. There's lots of analytic argument for why one might believe this technique would work -- I want to know if and how it really did. If you believe this has made you a better programmer, please give us specific examples.

I too am skeptical.

[–]possessed_flea 2 points3 points  (0 children)

This does not make sense to me while I can understand that this would be a good way to teach people the basic concepts of a language or framework, but the 10,000 hour idea is more based on the concept of mastery rather than competence.

And to achieve mastery IMHO there is a lot more why as opposed to 'how', for example, one can teach the basics of thread safe code to anyone, I can take a collage grad, give them a 3 month refresher course on mutex's and semaphores give them hundreds of examples of best practices, but once I get someone to a level of competence, then drop them onto a real world task (for example, taking a 20 yearold behemoth single threaded application and giving them the task of taking all "proccessing work" into a threadpool, making the GUI disconnect from the data model, and giving it the ability to have multiple views and controllers running in paralell)

I read the article in depth but I really think that while this may be a neat trick for getting someone up to speed with a base level of competence really there is no shortcut for putting in the years of hard work. (well there is, you COULD practice for 16 hours a day and become a master in 2 years instead of 10). I hit my 10k hours somewhere around 2001 in regards to software development. I mean you can ask me almost any software related question and then without thinking I can explain it in detail for over half a hour,

what these cards let you do is fast forward through the first 3 steps of competence ( http://en.wikipedia.org/wiki/Four_stages_of_competence ) but I really think that they will struggle to push you past the third in under 8 years.

[–]queus 2 points3 points  (0 children)

It will give your a vocabulary. Faster. Maybe a lot faster, than it is a win.

[–]Sohck -1 points0 points  (0 children)

Spaced repetition works. You've probably forgotten thousands of formulae, algos, APIs, solving techniques, diagrams and other types of (semi-)rigidly structured knowledge that you've understood and memorized at one point of your studies. With proper learning technique, you could have known them all now.

[–]wwwyzzrd 3 points4 points  (1 child)

How does knowing a bunch of trivia make me a better programmer? I feel that I have better things to store in my brain than programming trivia. (Like, I don't know... anything).

Here's a different approach: Quit trying to cut corners. Take all of that time you would have spent setting up flashcards and program something. It doesn't matter what. If you don't know something, look it up or ask someone. Have a list of websites at hand where you can look stuff up. You will know the stuff that occurs regularly by heart, and you will know how to find the stuff that happens less regularly.

[–]fdtm 1 point2 points  (0 children)

How does knowing a bunch of trivia make me a better programmer? I feel that I have better things to store in my brain than programming trivia. (Like, I don't know... anything).

Thank you.

If you find yourself memorizing trivia to get your job done, you're either going about programming entirely wrong, or have a very unusual type of programming work I can't even imagine.

The best flashcard is when you practice programming and learn from experience.

[–]ex_ample 2 points3 points  (11 children)

This is stupid. Programming, at least at a high level, Isn't about learning a bunch of facts that you can put on cards. It's about learning techniques and algorithms that you change and modify depending on the situation.

I can quickly start working in a new language and write code just knowing the very basics in that language, and looking things up when I need too because I already know what the code needs to do. Obviously you need to be proficient in at least one language to have learned what you need to know, but I seriously doubt flashcards will help.

It's almost like trying to learn to ride a bicycle using flashcards. It's a skill not a set of facts.

[–]jacques_chester 9 points10 points  (5 children)

It's a skill not a set of facts.

This is a false dichotomy. Part of programming is recollection. Knowing more interesting bits and bobs can drastically speed up the performance of a programmer in their day to day.

I don't think the blog poster's intent is to do away with learning-by-doing, but instead to optimise the parts where recollection is in fact the core task.

[–]ex_ample 4 points5 points  (4 children)

Well, when you're a good programmer the facts that you might put on a card will be easy to recall, because you will have dealt with them so many times they become second nature. But there's all kinds of 'structural' things that you can't write down. Time spent doing flashcards would be much better spent writing code.

[–]jacques_chester 8 points9 points  (2 children)

because you will have dealt with them so many times they become second nature

That is, because you have been exposed to them at random. Essentially you are arguing that for learning facts, a wholly stochastic process is going to perform better than a spaced repetition process.

That's not supported by the psych research on learning. However if you can disprove spaced repetition's efficacy, there may be a PhD, some journal articles and a post-doc in a nice uni in it for you.

Programming is not a unique snowflake in the history of learning. The same principles of recall, consolidation and application apply.

[–]ex_ample 0 points1 point  (1 child)

That is, because you have been exposed to them at random. Essentially you are arguing that for learning facts

Yes. But the important facts can't be expressed on cards.

Think about it this way. There are two aspects to programming: Thinking up ideas, and typing them in a programming language. You have to know the basics (but just the basics) to do the typing part. But to think up the ideas, you have to have a lot experience.

You have to be able to manipulate and structure ideas in order to create the structure of a program, then type it. There isn't really any way to encode the ideas you need to manipulate in a small enough space to fit on a card.

Maybe "Design Patterns" get close to what I'm talking about. But design patterns can be horribly misused by amateurs.

[–][deleted] 1 point2 points  (0 children)

you can put more interesting things on the flashcards.

so, for design patterns, not only "What is the Observer pattern", but "What problems does the Observer pattern solve", or "Why wasn't the observer pattern used in example X", or "What other techniques solve the same problems as the observer pattern"

[–]zeggman 2 points3 points  (0 children)

Not necessarily. I think one of the major points that's being lost in the criticism of the post is that the "time spent" usually only amounts to 5-10 minutes a day, and if you have the hardware, that can be time that would otherwise be wasted (waiting in line, commuting as a passenger, answering nature's call, etc.). When I write code, I'm generally talking about hours rather than minutes. Those hours still need to be spent writing code, but taking a couple of minutes to cut and paste (or compose) a card after solving a minor problem can anchor the learning later in a way which simply moving on to the next problem does not.

[–][deleted] -3 points-2 points  (3 children)

Here, get my upvote. This idea is so ridiculously stupid. Why do people find it appealing to waste their time on preparing and playing with a flash cards, instead of programming itself? I guess that's why they are bad coders and look for stupid ways like this. If one ever forget any fact about programming, he/she can look it up in a matter of seconds. Whatever, I'm out of here, I have some programming to do.

Edit: It reminds me of my mother's behavior, when I started to show her how to use web browser. She naturally understood little from what was going on, and insisted on making notes in her notebook how to do things step by step. But my god, this were her first steps with computer interface and in fact her notes did not really helped her. What helped her was just keeping on using the browser for a month or two and asking me for help when she didn't know what to do. Now she's a happy web citizen and asks for help once a month.

[–][deleted]  (2 children)

[deleted]

    [–]ex_ample -2 points-1 points  (1 child)

    Programming when your knowledge is limited in the hope you will expand it may just cement what you already know.

    That is not a valid sentence.

    [–]GravitasFreeZone 2 points3 points  (0 children)

    Grammatically? Did I mis-conjungate a subjunctive or split an infinitive? What?

    I guess I could have clarified that the gross majority of programming cements a common subset of what one knows, instead of the entire set of one's knowledge.

    [–]jacques_chester 1 point2 points  (2 children)

    I wrote an honours thesis proposal to explore whether first year students taking Java or C could have their "fluency" improved through a spaced repetition method.

    The main problem was the 1-year time frame and sample size (not to mention ethics board hurdles).

    [–][deleted] 1 point2 points  (1 child)

    and what was the result of your study?

    [–]jacques_chester 1 point2 points  (0 children)

    It was a proposal only, I went with a different project.

    [–]brainfart98 0 points1 point  (0 children)

    I feel like this would be better placed under the IWTL section.

    [–]WalterGR 0 points1 point  (1 child)

    What research on spaced repetition did you use to build "Anki"?

    [–]gwern 0 points1 point  (0 children)

    He didn't write it.

    [–]skulgnome 0 points1 point  (0 children)

    Dunno. Seems kind of janky.

    [–][deleted] 0 points1 point  (0 children)

    Thanks for taking the time to write about your experience. I intend to experiment with the Janki method now, as a result of reading your article.

    [–]joshcheek 0 points1 point  (0 children)

    I don't understand the critics who refer to this as memorizing trivia. The card is just an aid to a deeper idea. If you fill it with trivia, that's what it will be (and to be fair, most of the examples were like this) but there isn't anything preventing you from adding in higher level concepts and reminders of insights.

    [–]nath1234 0 points1 point  (1 child)

    God that looks like a painful and inefficient way to learn. It would be more time effective to hack out some little application that covers the things you need..

    Sitting there with flash cars for rather wordy crap = my idea of hell.

    [–]judasblue 2 points3 points  (0 children)

    Yeah, I have tons of commented code snippets like that in various languages that acted as my "notes" while learning a new language.

    I dunno, people are cracking on this idea in general, and I think they are kind of creating a false dichotomy. I see flash cards as useful adjunct to getting certain kinds of information to stick a little bit quicker. No, it won't teach you overarching principles and coding a few simple examples is the master key, but I can also see backing that up with flashcards. I have some stuff I have kept a lot of notes for and reviewed it for a few weeks every few days to keep it current and it helped me nail down details quicker and commit them to long term memory. This seems like it could automate that process and probably make it a little more efficient. Not a replacement for coding and learning the deeper principles, just a slightly quicker way to drill in some of the rote stuff and keep it from falling out of memory.

    [–]codeprimate -1 points0 points  (0 children)

    Fluency in a language, and efficacy as a developer are two different things entirely.

    [–]mindsidea -1 points0 points  (0 children)

    Great article--I'm going to try this out immediately. One minor gripe, though: please change "whilst" to "while."

    [–]mosquit0 -1 points0 points  (0 children)

    I can attest to this method. I was using it to remember some python basics 5 years ago. One example: I could off the top of my head write a code to traverse a directory and list all the files. Of course you can find it but it will be quicker to remember it. I think that I've read somewhere (probably it was supermemo.com site) that if you assume that you will use a fact more than once a year it's quicker to rembember it (assuming that the cost of memorization is X and the cost of finding an information is Y).