这件事我已经做了一年了,这是我 14 年的编程经历中最有帮助的学习技巧。
背景:
我是一个中等水平的程序员,没有为此去上学。我只在必要时学习,因为我搭建了一个网站,而这个网站越来越火,我又雇不起程序员,所以我只好拿起几本关于 PHP、SQL、Linux 和 Apache 的书,学到的东西只够让网站工作,然后用这些小知识做了好几年。
但是后来,我和一位专业的程序员一同工作,我被他的专业水平折服了!所有这些命令和函数从他指尖毫不费力的流出。我们使用同一门编程语言,但是他掌握的实在是太多了,以至于我感觉就像一个懵懂小孩与大学教授坐在一起。我非常想达到那种熟练程度。
这引起了我的思考:这些年里,有多少知识是我学习过又很快忘记的。我阅读了很多书和文章,学习过许多有用的知识点,并且立刻实践。但是后来我分了心,忘记了那些知识,又重新回到了我原来做事的方式。
我想深深地记住编程语言的命令和技巧,不忘记它们,以便在我需要的时候,它们能浮现在眼前。
间隔重复:
当你听到一个新的事实,你容易很快忘记,除非它不断在你的脑海中重复。
通过把自己沉浸在某门语言中你可以凑巧做到不断重复新学的内容,比如你学到的新词碰巧被提起。
但是对记忆的研究表明,记住一个新事实最高效的时间恰好是你将遗忘它的时候。
比方说,如果你学了一个外语的新单词,你在听完几分钟后再练习,然后是几个小时,第二天,然后是 2 天,5 天,然后是 10 天,3 周,6 周,3 个月,8 个月,等等。一段时间后,它基本上就被永久地记住了,只需偶尔提醒一下。
间隔重复软件就是这么帮助你的,所以你只需给间隔重复软件一系列你需要记忆的知识,然后一天做一次小测试,软件将根据你的反馈结果来确定复习间隔。在每次小测试之后,如果你觉得容易,这个知识点在很长时间内都不会再重复。但如果你觉得被难住了,软件将在几分钟之内再次提问,直到你掌握了知识点。
到 apps.ankiweb.net 并下载 Anki。 这是个流行的免费开源间隔重复软件。
至于编程,你知道我要说什么。
如果你能记忆你所选择的编程语言的一切呢?所有命令,每个参数,各种函数,大部分常见问题的每一个解决方案,都被你的指尖牢牢记住?想象一下,翻阅一篇文档或一本书,永久地记住其中的每一个字
介绍到此为止,我们来讨论一下如何做:
首先,学起来!
抽认卡片适用于*记住*所学知识。
在你建立某一知识的抽认卡片之前,其实你需要学习并理解这个知识。在你很好掌握之后再建立抽认卡片。
(这就是为什么看别人的抽认卡片帮助不大的原因。抽认卡片只是用来辅助记忆的。)
把知识转变成许多小的知识点:
在制作一系列抽认卡片的时候,在正面写上问题,在反面写上答案。
如果你只是用抽认卡片来记忆外语单词,那么抽认卡片的设计非常简单。在正面写上一个单词或短语,背面写上翻译,反之亦然。
但是,如果你要学习其他东西,你就得在制作自己的抽认卡时投入一点技艺和创意。
要花一些功夫来读你想记住的片段,挑出关键的事实,把它们分解成不可再分的最小片段,并把它们编成问题,用来考查未来的自己。
以下是我一年来做这件事的省时建议:
把散落的文字变成代码
如果你在阅读一本关于编程的教程时,看到一段描述一个特性的文字。
「加法(+)运算符...如果只有一个操作数是字符串,另一个操作数被转为字符串,那么结果是两个字符串的连接。」
你自己测试了一下,玩了一下,就明白了。所以你做了一张抽认卡来记住它。
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/20rules2. JAnki:写给程序员们的 13 条 Anki 使用经验 ./412012134.html
3. 量子物理学家是如何使用 Anki 的? https://zhuanlan.zhihu.com/p/65131722