| 
 | 
 
这件事我已经做了一年了,这是我 14 年的编程经历中最有帮助的学习技巧。 
背景: 
 
我是一个中等水平的程序员,没有为此去上学。我只在必要时学习,因为我搭建了一个网站,而这个网站越来越火,我又雇不起程序员,所以我只好拿起几本关于 PHP、SQL、Linux 和 Apache 的书,学到的东西只够让网站工作,然后用这些小知识做了好几年。 
但是后来,我和一位专业的程序员一同工作,我被他的专业水平折服了!所有这些命令和函数从他指尖毫不费力的流出。我们使用同一门编程语言,但是他掌握的实在是太多了,以至于我感觉就像一个懵懂小孩与大学教授坐在一起。我非常想达到那种熟练程度。 
这引起了我的思考:这些年里,有多少知识是我学习过又很快忘记的。我阅读了很多书和文章,学习过许多有用的知识点,并且立刻实践。但是后来我分了心,忘记了那些知识,又重新回到了我原来做事的方式。 
我想深深地记住编程语言的命令和技巧,不忘记它们,以便在我需要的时候,它们能浮现在眼前。 
间隔重复: 
 
当你听到一个新的事实,你容易很快忘记,除非它不断在你的脑海中重复。 
通过把自己沉浸在某门语言中你可以凑巧做到不断重复新学的内容,比如你学到的新词碰巧被提起。 
但是对记忆的研究表明,记住一个新事实最高效的时间恰好是你将遗忘它的时候。 
 
  
 
遗忘曲线 
 
比方说,如果你学了一个外语的新单词,你在听完几分钟后再练习,然后是几个小时,第二天,然后是 2 天,5 天,然后是 10 天,3 周,6 周,3 个月,8 个月,等等。一段时间后,它基本上就被永久地记住了,只需偶尔提醒一下。 
间隔重复软件就是这么帮助你的,所以你只需给间隔重复软件一系列你需要记忆的知识,然后一天做一次小测试,软件将根据你的反馈结果来确定复习间隔。在每次小测试之后,如果你觉得容易,这个知识点在很长时间内都不会再重复。但如果你觉得被难住了,软件将在几分钟之内再次提问,直到你掌握了知识点。 
到 apps.ankiweb.net 并下载 Anki。 这是个流行的免费开源间隔重复软件。 
至于编程,你知道我要说什么。 
如果你能记忆你所选择的编程语言的一切呢?所有命令,每个参数,各种函数,大部分常见问题的每一个解决方案,都被你的指尖牢牢记住?想象一下,翻阅一篇文档或一本书,永久地记住其中的每一个字 
介绍到此为止,我们来讨论一下如何做: 
首先,学起来! 
 
抽认卡片适用于*记住*所学知识。 
在你建立某一知识的抽认卡片之前,其实你需要学习并理解这个知识。在你很好掌握之后再建立抽认卡片。 
(这就是为什么看别人的抽认卡片帮助不大的原因。抽认卡片只是用来辅助记忆的。) 
把知识转变成许多小的知识点: 
 
在制作一系列抽认卡片的时候,在正面写上问题,在反面写上答案。 
如果你只是用抽认卡片来记忆外语单词,那么抽认卡片的设计非常简单。在正面写上一个单词或短语,背面写上翻译,反之亦然。 
 
  
 
example chinese flash card question 
 
  
 
example chinese flash card answer 
 
  
 
example chinese flash card question 
 
  
 
example chinese flash card answer 
 
但是,如果你要学习其他东西,你就得在制作自己的抽认卡时投入一点技艺和创意。 
要花一些功夫来读你想记住的片段,挑出关键的事实,把它们分解成不可再分的最小片段,并把它们编成问题,用来考查未来的自己。 
以下是我一年来做这件事的省时建议: 
把散落的文字变成代码 
 
如果你在阅读一本关于编程的教程时,看到一段描述一个特性的文字。 
 「加法(+)运算符...如果只有一个操作数是字符串,另一个操作数被转为字符串,那么结果是两个字符串的连接。」 你自己测试了一下,玩了一下,就明白了。所以你做了一张抽认卡来记住它。 
var a = 5 + '5'; 
 
 // a 的值是什么? 
  '55' 
 
  如果 + 号的任何一边是一个字符串,另一边就会 
 
  先转换为字符串,再像字符串一样相加尝试检测未来的自己 
 
有时你会学到一个 「疑点」——一个常见的错误或出人意料的特性。 
 「如果向数组构造函数传递一个数字,它将按这个数字的长度来建立一个空数组。任何其他变量的组合都会创建一个包含这些变量的数组。」 你自己测试一下,玩一玩,了解一下。然后做两张抽认卡,尝试检测一下未来的自己。 
var a = new Array('5'); 
 
 // a 的值是什么? 
  只有一个元素的数组,字符串 '5':['5'];...然后是几乎一模一样的问题... 
var a = new Array(5); 
 
 // a 的值是什么? 
  一个长度为 5 的空数组。当程序对你进行测验时,卡片会被打乱,因此希望你的例子能有意地吸引你的注意力。 
你也可以尝试用更复杂的例子来检测自己,让这些问题在你脑海中记忆犹新: 
var a = [20, 10, 5, 1]; 
 
 // a.sort() 的结果是什么? 
  [1, 10, 20, 5] 
 
  // sort 将所有值视为字符串不要忘记用这个结果检测自己: 
var a = [20, 10, 5, 1]; 
 
  // 按数值大小顺序排序 
  function compare(v1, v2) { return(v1 — v2); } 
 
  a.sort(compare);保存很酷的技巧 
 
如果你发现一个你想记住的很酷的技巧,可以把它变成一个小挑战的答案。 
var albums = [ 
 
    {name: 'Beatles', title: 'White Album', price: 15}, 
 
    {name: 'Zeppelin', title: 'II', price: 7}]; 
 
 // 让下面的代码能够运行: 
 
  albums.sort(by('name')); 
 
  albums.sort(by('title')); 
 
  albums.sort(by('price')); 
  function by(propName) { 
 
    return function(obj1, obj2) { 
 
      v1 = obj1[propName]; 
 
      v2 = obj2[propName]; 
 
      if (v1 < v2) { return -1; } 
 
      else if (v1 > v2) { return 1; } 
 
      else { return 0; } 
 
    }; 
 
  }要求包含多种解决方案的答案 
 
如果做某事有不止一种方法,而你想把它们都记住,以便将来能想出不止一种解决方案,那么你可以把两种方案都记在脑海中。 
s = &#39;string like this&#39; 
 
  # 在 Ruby 中,展示两种把它变成 &#39;String Like This&#39; 的方法 
  s.split.map(&:capitalize).join(&#39; &#39;) 
 
  s.gsub(/\b\S/) {|x| x.upcase}把宽泛的概念变成言简意赅的例子 
 
假设你刚刚花了 20 分钟学习一些概念性较强的知识,没那么多具体的功能需要记住。这时你只需要一个简洁的例子来提醒自己这个概念。 
/(a(b)((c)d))/.match(&#39;abcd&#39;) 
 
  # $1, $2, $3, $4 的值是什么? 
  $1 = &#39;abcd&#39; 
 
  $2 = &#39;b&#39; 
 
  $3 = &#39;cd&#39; 
 
  $4 = &#39;c&#39;其他例子: 
class C 
 
    self 
 
  end 
 
  class D < C 
 
  end 
 
  d1 = D.new 
 
  # 哪一个对象是 self? 
  class D阅读彼得·沃兹尼亚克所著的《知识表述的 20 条规则[1]》 
 
有关制卡的最佳建议出自一篇名为《知识表述的 20 条规则》的文章,作者是彼得·沃兹尼亚克 ,网址:supermemo.com/en/articles/20rules。希望大家能读一下。 
每日练习 
 
为了达到最佳效果,你需要每天打开一次间隔重复软件。如果你太久没有这样做,你将前功尽弃,并且不得不重新学习你本应记住的东西。 
只需要每天 20 分钟,你可以记住成千上万条知识。我把它当作早晨的例行事项。泡一杯茶,用一会儿 Anki,然后喝茶。 
在你测试自己时产生肾上腺素,让自己以最快的速度前进,是一件非常有趣的事情。 
这就像一种去精神健身房的旅程。每天 20 分钟的小强度训练,无论是考虑眼前还是长期的影响都很值当。 
随时增加新卡片,你将会惊喜地发现所有知识都清晰地印在你的脑海中。 
总结 
 
我已经这样练习了一年,这大大促进了我写代码的流畅度。如你所见,我强烈推荐这个方法。 
你可以向我发邮件来让我知道这种方法对你效果如何。 
进一步阅读: 
 
Jack Kinsella 所著的《JAnki:写给程序员们的 13 条 Anki 使用经验》[2]是一篇关于相同方法的好文章,有些地方比我写得更好。 
你可以用 Anki 来学习所有知识。 
Michael Nielsen 所著的《增强长期记忆》[3]是一篇讲述用 Anki 学习任何知识的好文章。 
阅读《连线》对彼得·沃兹尼亚克的访谈 ——把这个方法推向极限的人的故事。 
© 2013 Derek Sivers. 
Copy & share: sive.rs/srs 
 
 
Thoughts Memo 汉化组译制 
感谢主要译者 Lucas-Tsui、校对燕汝成 
原文:Memorizing a programming language using spaced repetition software | Derek Sivers 
发布于 2013-01-06 参考 
 
 
- ^有效的学习:处理知识的20条规则 https://www.yuque.com/supermemo/wiki/20rules
 
 - ^JAnki:写给程序员们的 13 条 Anki 使用经验 https://zhuanlan.zhihu.com/p/412012134
 
 - ^量子物理学家是如何使用 Anki 的? https://zhuanlan.zhihu.com/p/65131722
 
 
  |   
 
 
 
 |