← 返回目录


用间隔重复软件记住一门编程语言

学校≠教育≠技能;文凭溢价=80%信号传递+20%人力资本

201 👍 / 40 💬

这件事我已经做了一年了,这是我 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 = 'string like this'

  # 在 Ruby 中,展示两种把它变成 'String Like This' 的方法


  s.split.map(&:capitalize).join(' ')

  s.gsub(/\b\S/) {|x| x.upcase}

把宽泛的概念变成言简意赅的例子

假设你刚刚花了 20 分钟学习一些概念性较强的知识,没那么多具体的功能需要记住。这时你只需要一个简洁的例子来提醒自己这个概念。

/(a(b)((c)d))/.match('abcd')

  # $1, $2, $3, $4 的值是什么?


  $1 = 'abcd'

  $2 = 'b'

  $3 = 'cd'

  $4 = 'c'

其他例子:

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

参考

1. 有效的学习:处理知识的20条规则 https://www.yuque.com/supermemo/wiki/20rules
2. JAnki:写给程序员们的 13 条 Anki 使用经验 ./412012134.html
3. 量子物理学家是如何使用 Anki 的? https://zhuanlan.zhihu.com/p/65131722

专栏:Thoughts Memo的文章


← 返回目录