最近开始尝试使用 Anki 记忆一些我认为重要的知识碎片,也是刚刚上手。记忆卡片软件不止 Anki 一款,但它是个不错的例子。在此分享一些心得并尝试着回答这个问题:为什么一个程序员(或各行脑力工作)需要有一个记忆卡片软件?

Anki 是什么

Anki 是一款记忆卡片软件,最早于 2006 年发布,应该算是记忆卡片软件中历史最悠久,最具影响力的。其名来源于日语的“暗记”,意思就是“记忆”。Anki 本身的概念其实非常简单:正面写上单词或是你需要记忆的概念,背面记上单词的释义或是概念的详细解释。如果你能够看到正面能够准确地回想起背面,那么表明你记住了这个卡片,Anki 就会隔更长的时间再次问你(比如一个星期),否则它会缩短间隔的时间(比如一天)。

记忆卡片背后的科学原理也很简单,就是大家熟知的,大名鼎鼎的“艾宾浩斯”遗忘曲线。当你尝试记忆一个单词或是概念,你对它的记忆会成指数型下降。而当你反复间隔一段时间重新记忆它之后,你对它的遗忘速度会下降,你对它的有效记忆时间也更久,从而达到更高的记忆效率。这个知识对学生和脑力工作者是一个福音。

Anki 是开源软件,在移动端也有 App,非常适合通勤等碎片时间中使用。它功能强大,可以插入 HTML 网页,图片,音频等富媒体。

Anki 快速上手

最简单的使用方式:手动加入你想使用的记忆卡片。正面写上你需要记忆的短语或是单词,背面写上短语或者单词的释义。比如:

正面: Ambivalent

背面:adjective, having mixed feelings or contradictory ideas about something or someone. Synonyms: equivocal, uncertain, unsure

Anki 网站上有不少资源分享可以使用。大部分都是单词列表: https://ankiweb.net/shared/decks/gre

如果你找到了文本格式的单词列表的资源,可以将其转换为 Anki 支持的 csv 格式,第一列是卡片的正面,第二列是卡片的背面,并支持 html 格式标注。比如我最近发现的 Economist 重要词汇清单:

https://gre.economist.com/gre-advice/gre-vocabulary/which-words-study/most-common-gre-vocabulary-list-organized-difficulty

可以用一个简单的脚本转换,并使用 html 格式换行符“”支持换行,或是加入更多的格式标注。注意在导入的时候选择“Allow HTML fields”:

https://gist.github.com/hxy9243/e034ac3bff151df8c2f3c2366dd1d8ba

程序员的记忆卡片

Anki 是用来背单词的神器。但其功用之强大远远不止于此。我最早在 Michael Nielson 的博客上首次了解 Anki,也是最近才开始自己慢慢尝试 Anki 的作用。

Michael Nielson 的博客: http://augmentingcognition.com/ltm.html

使用 Anki 进行记忆的方法也被称作“间隔重复记忆”(spaced repetition),并可以用来记忆任何知识,概念。Nielson 在其博客中分享了他的心得:称他在使用 Anki 的两年半时间里积累了大概 10,000 张卡片,每天坚持使用 15-20 分钟时间复习各种知识和概念。其内容包括 Linux 指令,最近阅读的学术论文,技术博客,甚至关于家人朋友的各种琐细的知识(谁的生日是哪天?谁是不是素食主义者,等等)。并指出:Anki 不仅是用来死板记忆概念的工具,而是可以帮助拆解知识,形成知识系统的,并最终帮助理解一系列概念的工具。

Nielson 在上述博客当中提到了他使用 Anki 阅读文章并加深理解的几个步骤:

  • 快速浅读一遍,了解文章的大概内容,找出最简单,但是最基本的信息记录在 Anki 中。这样的信息通常都不需要深加工就能理解并记忆,但对文章是关键的前提,内容,或是结论;
  • 再次深度通读全文,并理解文章的背景,并提出思考问题,等等。如果有某些步骤或是概念没有理解则直接跳过;
  • 继续反复通读全文,并理解如设计方式,思考方式,并加以深刻地理解,直到理解设计的细节。这时候你在 Anki 中留下的问题就会更加高层次,并加上了自己的理解,而不是对知识的简单记忆。而这些理解会随着使用 Anki 的复习重复被唤起,你对文章整体的理解也不会被遗忘。
  • 对于简单或是需要浅读的文章,记住核心的概念,结论就可以了。文章的简介,介绍,和结论通常会是抽取 Anki 问答的好地方。

为什么脑力工作者需要 Anki

上文提到,Anki 是一个非常好的帮助记忆的工具。但是知识,尤其是技术性较强的知识不应该在高层次上进行理解而不是死记硬背吗?这可能是每一个新接触 Anki 或是记忆卡片系统的人会问的问题。

Nielson 对这个问题的想法是:在技术的研究和学习中,基础知识往往是通向更深层次理解的基石,记忆并消化这些知识只会对高层次的理解带来帮助。Nielson 以自己教学量子力学时遇上的问题为例,很多情况下他的朋友在学习时卡壳并不是没有理解深层次的理论,而是因为对很多基本概念并不熟悉,才导致进一步理解困难。就像是当你只有 200 个法语词汇,却需要写一首法语诗一样。难住你的不会是韵律,节奏,创作灵感等,而是你的词汇量。

零碎的知识和概念就像是一块块拼图,只有看到了整体才能够更加有效地记忆及理解。那么使用间隔重复记忆的方式就像是收集拼图的过程。只有集齐并内化了足够多的拼图,才能够进一步整理并找到不同知识之间的关联,和它们之间整体的脉络。

如上文提到,Anki 并不只是一个用来死记硬背的工具。它不仅能够帮助你记忆信息,还能够帮助你记忆各种层次上的理解。将一篇文章拆解成 Anki 问答过程本身也会帮助你对一个概念的拆分和理解。

进一步的理解和消化知识并融会贯通可能就需要更多的知识工具了,比如利用思维导图,和在实战中使用相应的知识(比如 Linux 命令行)等等。

举一个例子

举一个我最近使用 Anki 阅读亚马逊 Dynamo 论文时候的笔记。可能未必是最好的例子,这一点上欢迎讨论和分享。

可以提出的一些问题比如:

  • Dynamo 在设计上需要解决哪些问题?(在不需要实现强一致性的条件下,保证读写高可用,线性可扩展性,解决成员检测问题等)
  • Dynamo 读写高可用是如何实现的?(多成员数据复制,sloppy quorum,并利用矢量时钟实现读修复)
  • Dynamo 如何实现线性扩展性?(使用一致性哈希算法,使得每一个成员加入/离开时都能在最小数据迁移情况下保证所有成员的数据量大致相等)
  • Dynamo 如何定义成员检测问题?(使用 Gossip 算法,使得在不占用大量带宽的条件下,将成员信息扩散给所有成员,所有成员都能知道其他成员的加入/离开)
  • 等等……

使用记忆卡片和背单词一样是一个需要养成的习惯。刚刚开始会有很多不习惯。一旦上手了可以是一件非常有效的工具。欢迎在此分享讨论心得。

参考

  1. Anki https://github.com/dae/anki
  2. Anki Wikipedia https://en.wikipedia.org/wiki/Anki_(software)
  3. https://zh.wikipedia.org/wiki/%E8%B5%AB%E5%B0%94%E6%9B%BC%C2%B7%E8%89%BE%E5%AE%BE%E6%B5%A9%E6%96%AF
  4. https://zh.wikipedia.org/zh-hans/%E9%81%97%E5%BF%98%E6%9B%B2%E7%BA%BF