跳到主要内容

把语法记牢 — 遗忘曲线、抽认卡与提取

这一章讲三件事: 为什么「反正可以搜」是个昂贵的习惯;遗忘的规律长什么样、怎么绕着它安排复习; 以及把知识真正「焊」进长时记忆的两种主动做法。 它接住第 02 章留下的债:组块靠存货,这一章讲存货怎么进货

1. 全景:记语法是为了少付两笔钱

很多人觉得记语法无所谓——要用了搜一下就行。书里说这笔账漏了两笔钱1:

每次现查语法的真实成本
├─ 显性的:查找本身的几秒钟
├─ 隐性①:打断。查语法要离开 IDE 开浏览器,注意力一散,
│ 回来要重建上下文(即「刚才写到哪、手头各值是什么」的工作现场)——这才是大头
└─ 隐性②:存货。第 02 章说过,长时记忆里的存货决定组块,
从来不记 = 组块素材永远不足 = 读代码永远慢

图说:第二笔是本章的立足点——记语法不是美德,是给读代码提速。

隐性①有多大?北卡州立的帕宁(Parnin)把 85 位程序员的 10000 次编程会话(会话,即一次打开编辑器干活的时段)记录在案:思路被打断后,程序员平均要一刻钟才能重新开始写代码;如果打断发生在改方法改到一半时,只有十分之一的人能在一分钟内找回状态2

2. 抽认卡:语法进货的基本工具

抽认卡就是一面写问题、一面写答案的自制卡片。学语法的标准做法:一面写概念描述,一面写代码。书里拿 Python 列表推导式(用一行方括号语法从旧列表生成新列表的写法)示范了一套四张卡3:

正面反面
基本的推导式numbers = [x for x in numbers]
带筛选条件的推导式odd_numbers = [x for x in numbers if x % 2 == 1]
带计算的推导式[x * x for x in numbers]
筛选加计算squares = [x * x for x in numbers if x > 25]

用法有讲究:先看正面,凭记忆把代码写出来,再翻面对照——这个「先凭空回忆」的动作就是全章的枢纽,第 4 节专门讲它。

三条操作纪律:学新语言、新库时,每遇到一个新概念就当场做一张卡;凡是搜过一次的语法,就是该做卡的信号——搜这个动作本身证明它没进存货4;连续答对的卡抽出来,常错的留下——卡组会自动瘦身成「你的易错点清单」5

范围也要现实:自然语言单词几十万,编程语言的基本语法元素比它少几个数量级——连 C++ 这种「大」语言,核心语法也小到可以用卡片装下6不是所有语法都值得记,常用层值得,冷门层搜了不丢人。

3. 遗忘曲线:你的长时记忆不是硬盘

第 01 章把长时记忆比作硬盘。这里出现第一个裂缝:硬盘写入即保存,长时记忆写入即开始漏。不做任何复习的情况下,1 小时后大约忘掉一半,两天后只剩四分之一7

这条曲线的来历值得讲一遍,因为它的研究方法本身就是个设计。1870 年代,德国心理学家艾宾浩斯(Ebbinghaus)要研究记忆,但拿有意义的材料测不出来——你本来就认识那些词。于是他发明了「wix」「maf」这类无意义音节(专为实验造的、不带任何含义的假词),拿自己当被试,靠节拍器反复朗读,十年间累计练习近一千小时,才画出这条曲线8。2015 年一项研究重新检验了他的记忆公式,结论是基本成立9

还有一个结构性事实:记忆在脑子里不是文件夹式的分层结构,而是网络结构——每个事实和一堆别的事实连着,想起 A 会顺藤摸到 B10。这个结构决定了下面所有记忆技巧的落点:想记得牢,就是把新知识多接到几条旧线上。

4. 间隔重复:同样的总时长,不同的排法

既然必然遗忘,就靠复习对冲。但复习怎么排,效果天差地别。

艾宾浩斯自己先发现:记 12 个无意义音节,一天内复习 68 次、次日 7 次(共 75 次)才记牢;把同样的复习量摊到 3 天里,38 次就够——复习次数省一半11

更有说服力的是巴里克(Bahrick)一家的实验:全家人学 300 个外语单词,分成 6 组,各组用不同的复习节奏——有的组每 2 周学一轮共 26 次,有的组每 8 周学一轮共 26 次。一年后测:间隔最长(8 周一轮)的那组记住 76%,间隔最短(2 周一轮)的那组只记住 56%。复习次数完全相同,只是摊得开,差距 20 个百分点12

结论一句话:拉长学习周期,不是拉长学习时间。落到操作:一个月回顾一次抽认卡,足以把知识留在长时记忆里;而学校一学期塞完、之后再不碰的模式,恰好是这个规律的反面教材13

5. 存储强度与提取强度:「见过」不等于「取得出」

比约克夫妇(Bjork)提出了区分两种强度,这一对概念是全章的枢纽14:

  • 存储强度:信息在长时记忆里存得牢不牢。学得越多越牢,而且只增不减;
  • 提取强度:此刻把它取出来难不难。它会随时间衰减,但取过一次就回升

书里给了一个所有 C++ 程序员都会心一笑的例子:六段长得几乎一样的反向遍历列表写法,让你挑出正确的那段(rbegin/rend 那段)——写过很多年 C++ 的人也挑不准;可一看到答案,立刻「不用说也知道是这个!」15存储强度很高(从没忘),提取强度很低(临时取不出)。

这就解释了「随手搜」的真正代价:搜索太容易,大脑判定「不需要取」,提取强度永远在低位徘徊;越不取越取不出,越取不出越要搜——恶性循环16。破解动作小得惊人:打开搜索引擎前,先自己试着回忆几秒。哪怕回忆失败,这个「试图取」的动作本身就在抬高提取强度17

球拉德(Ballard)1913 年的实验是这条原理的最早证据之一:学生背 16 行诗,两天后突然再考(没复习过),成绩反而比第一次平均高出 10%——多出来的部分就是「取」练出来的18

6. 精细加工:给新知识多接几条旧线

网络结构的记忆还有一个用法:主动把新知识和旧知识连起来,这叫精细加工。它利用的是第 02 章的组块机制——连接越多,检索时的抓手越多。

先感受一下有没有连接的差别。记住这 6 个数字:5、12、91、54、102、87——很难,它们之间没有结构。再记这 6 个:1、3、15、127、63、31——如果你发现它们全是「2 的幂减一」(1=2¹−1、3=2²−1、7 缺席、15=2⁴−1……),6 个数瞬间压成一条规律,几乎忘不掉19规律就是现成的组块。

大脑甚至会比这更激进:巴特利特(Bartlett)让被试读一篇陌生的印第安民间故事,几个月后复述——故事被悄悄改了,不合理的细节被删掉,「弓」变成了「枪」,一切往被试自己熟悉的世界观上靠20。**存储不是复印,是消化。**这对编程的含义:你学新语法时,它正在被你已有的旧概念塑形——塑形可以借力(多接旧知识),也可能走样(第 08 章的迷思概念正是这么长出来的)。

操作层面,书里给学新概念配了一张「精细加工问题清单」:这个概念让我想到哪些已有概念?两者语法相同吗?能不能互相替代?其他语言里有对应物吗?实现同样目的还有什么别的写法?21——每个问题都在给新知识焊一条新线。

7. 主走查:一条语法从「搜」到「焊」的全程

拿书里反复用的 Python 列表推导式,把本章所有机制串成一次完整的进货:

第 1 周:读别人代码撞见 [x*x for x in numbers],看不懂 → 搜了 → 记下:搜过=该做卡
第 1 周末:做四张卡(概念↔代码),进卡组
第 2~8 周:每天花几分钟过卡——先看正面自己写,再翻面对照
(这个「先取再对」的动作在抬高提取强度)
第 2 个月:答对率稳定 → 卡片移出每日组,改为每月回顾一轮
(间隔拉长,靠遗忘曲线的节奏省钱)
第 3 个月:读代码再撞见列表推导式 → 不搜了,直接读
→ 组块成形:一整行语法压成「推导式」一个块,坑位从七八个变一个
顺手加餐:想到「Java 里有对应物吗?」(没有直接对应,流式写法近似)
→ 精细加工再焊一条线

走查里唯一的「编数」是时间刻度(第几周、几个月)——节奏因人和卡组大小而异,书里给的原则是「几周见效、每月回顾」22,具体日程是我为演示排的。

8. 作者的判断与证据

**有实验撑着的:**遗忘曲线(艾宾浩斯,1880 年前后;Murre 2015 年复核);间隔效应(艾宾浩斯的 75 比 38;巴里克一家的一年追踪);提取练习(球拉德 1913;后续大量重复);存储/提取强度双系统(比约克夫妇,认知心理学主流理论);存储会走样(巴特利特)。

作者的引申,要分开看:「先回忆再搜索」是作者把提取练习翻译成日常习惯的建议;「搜过即做卡」是操作口径,不是实验结论。

**书的坦白:**无意义音节实验的样本是被试本人一人(艾宾浩斯自己),这正是他要造「无意义」材料的原因,但也意味着早期数据的普适性靠后续研究补齐;球拉德的「越考越好看似违背遗忘曲线」在当时连他自己都困惑。

9. 边界与局限

  • 「该记多少」没有定论。书里明确说记住所有语法既无必要也无可能;本章的记账逻辑(打断成本+组块素材)给了判断框架,但「常用层」的边界因人而异。
  • 艾宾浩斯曲线是平均行为。情绪、睡眠、材料难度都影响具体形状;「1 小时忘一半」不能拿来做精确计划。
  • 精细加工有走样风险:连接旧知识在加深记忆的同时也在让新概念「长得像旧的」——这是第 08 章负迁移的温床,本章先埋个伏笔。
  • 抽认卡练的是陈述性知识(能背出来的事实);「闭着眼就能敲」的肌肉记忆是另一套机制——第 11 章的自动化专讲它。

10. 可带走的

  1. 「反正能搜」的真实成本=打断一刻钟+存货永远不足,不是搜索那几秒;
  2. 被打断后的一刻钟是重建上下文(即「刚才写到哪、手头各值是什么」的工作现场),不是磨蹭——给排班和会议安排留余量;
  3. 搜过一次的语法,就是该进抽认卡的信号;
  4. 先试着回忆、再搜索:回忆失败也在涨提取强度;
  5. 复习要摊开不要堆叠:同样次数,隔 8 周一轮比隔 2 周一轮,一年后多记 20 个百分点;
  6. 抽认卡先回忆后翻面——「对答案」的动作不能省;
  7. 学新概念时过一遍精细加工问题清单,给它多焊几条旧线;
  8. 记不住不是道德问题,是没给长时记忆安排复习节奏。

11. 原文地图

主题原书章原文位置
查语法的两笔成本3.1 语法记忆小贴士text/19-ch03-01-3-1.txt:15(搜「掌握语法知识不是那么重要」)
打断的代价3.1 语法记忆小贴士text/19-ch03-01-3-1.txt:21(搜「一刻钟」) · text/19-ch03-01-3-1.txt:21(搜「1/10」)
抽认卡与四张示例卡3.2 如何利用抽认卡快速学习语法text/20-ch03-02-3-2.txt:5(搜「一面写有文字提示」) · text/20-ch03-02-3-2.txt:9(搜「基本的推导式」)
编程语言小于自然语言3.2 如何利用抽认卡快速学习语法text/20-ch03-02-3-2.txt:19(搜「远远小于任何自然语言」)
搜过=该做卡、卡组瘦身3.2 如何利用抽认卡快速学习语法text/20-ch03-02-3-2.txt:35(搜「尚未烂熟于心」) · text/20-ch03-02-3-2.txt:41(搜「回答正确和回答错误」)
遗忘曲线3.3 如何避免遗忘text/21-ch03-03-3-3.txt:11(搜「忘记一半信息」)
网络结构3.3 如何避免遗忘text/21-ch03-03-3-3.txt:23(搜「网络结构来组织」)
艾宾浩斯方法与复核3.3 如何避免遗忘text/21-ch03-03-3-3.txt:33(搜「无意义音节」) · text/21-ch03-03-3-3.txt:35(搜「1000小时」) · text/21-ch03-03-3-3.txt:39(搜「基本正确」)
间隔重复3.3 如何避免遗忘text/21-ch03-03-3-3.txt:43(搜「38次」) · text/21-ch03-03-3-3.txt:49(搜「76%」) · text/21-ch03-03-3-3.txt:51(搜「一个月复习一次」)
存储强度与提取强度3.4 如何牢记编程语法text/22-ch03-04-3-4.txt:11(搜「存储强度」) · text/22-ch03-04-3-4.txt:21(搜「只增不减」)
C++ 六选一3.4 如何牢记编程语法text/22-ch03-04-3-4.txt:36(搜「恍然大悟」)
搜索的恶性循环3.4 如何牢记编程语法text/22-ch03-04-3-4.txt:46(搜「低位徘徊」) · text/22-ch03-04-3-4.txt:48(搜「恶性循环」) · text/22-ch03-04-3-4.txt:50(搜「尝试记忆的行为」)
球拉德实验3.4 如何牢记编程语法text/22-ch03-04-3-4.txt:44(搜「10%的诗句」)
图式3.4 如何牢记编程语法text/22-ch03-04-3-4.txt:60(搜「图式(schema)描述」)
两组数字3.4 如何牢记编程语法text/22-ch03-04-3-4.txt:62(搜「5、12、91」) · text/22-ch03-04-3-4.txt:64(搜「只包含1」)
巴特利特实验3.4 如何牢记编程语法text/22-ch03-04-3-4.txt:68(搜「枪」)
精细加工清单3.4 如何牢记编程语法text/22-ch03-04-3-4.txt:86(搜「精细加工策略」) · text/22-ch03-04-3-4.txt:92(搜「从新概念可以联想到」)

Footnotes

  1. 出处:「3.1 语法记忆小贴士」第 15 段(text/19-ch03-01-3-1.txt:15,搜「掌握语法知识不是那么重要」)。原文给出的两个理由:已知信息影响加工效率,以及思路被打断的影响远超想象。

  2. 出处:「3.1 语法记忆小贴士」第 21 段(text/19-ch03-01-3-1.txt:21,搜「一刻钟」)。85 位程序员、10000 次编程会话同段;第 11 章将再次引用这项研究。

  3. 出处:「3.2 如何利用抽认卡快速学习语法」第 5、9–15 段(text/20-ch03-02-3-2.txt:5,搜「一面写有文字提示」)。四张卡的内容见第 9–15 段。

  4. 出处:「3.2 如何利用抽认卡快速学习语法」第 35 段(text/20-ch03-02-3-2.txt:35,搜「尚未烂熟于心」)。

  5. 出处:「3.2 如何利用抽认卡快速学习语法」第 41 段(text/20-ch03-02-3-2.txt:41,搜「回答正确和回答错误」)。

  6. 出处:「3.2 如何利用抽认卡快速学习语法」第 19 段(text/20-ch03-02-3-2.txt:19,搜「远远小于任何自然语言」)。

  7. 出处:「3.3 如何避免遗忘」第 11 段(text/21-ch03-03-3-3.txt:11,搜「忘记一半信息」)。前提是完全没有复习。

  8. 出处:「3.3 如何避免遗忘」第 33、35 段(text/21-ch03-03-3-3.txt:33,搜「无意义音节」;text/21-ch03-03-3-3.txt:35,搜「1000小时」)。原文:每分钟可背出 150 个无意义音节。

  9. 出处:「3.3 如何避免遗忘」第 39 段(text/21-ch03-03-3-3.txt:39,搜「基本正确」)。研究者为阿姆斯特丹大学的 Jaap Murre。

  10. 出处:「3.3 如何避免遗忘」第 23 段(text/21-ch03-03-3-3.txt:23,搜「网络结构来组织」)。

  11. 出处:「3.3 如何避免遗忘」第 43 段(text/21-ch03-03-3-3.txt:43,搜「38次」)。68+7=75 次与 3 天 38 次的对照。

  12. 出处:「3.3 如何避免遗忘」第 49 段(text/21-ch03-03-3-3.txt:49,搜「76%」)。8 周间隔组 76%、2 周间隔组 56%,复习次数同为 26 次。

  13. 出处:「3.3 如何避免遗忘」第 51 段(text/21-ch03-03-3-3.txt:51,搜「一个月复习一次」)。

  14. 出处:「3.4 如何牢记编程语法」第 11 段(text/22-ch03-04-3-4.txt:11,搜「存储强度」)。提出者为加州大学洛杉矶分校的 Robert 与 Elizabeth Bjork。

  15. 出处:「3.4 如何牢记编程语法」第 36 段(text/22-ch03-04-3-4.txt:36,搜「恍然大悟」)。六段候选写法见同文件第 29–34 段。

  16. 出处:「3.4 如何牢记编程语法」第 46、48 段(text/22-ch03-04-3-4.txt:46,搜「低位徘徊」;text/22-ch03-04-3-4.txt:48,搜「恶性循环」)。

  17. 出处:「3.4 如何牢记编程语法」第 50 段(text/22-ch03-04-3-4.txt:50,搜「尝试记忆的行为」)。

  18. 出处:「3.4 如何牢记编程语法」第 44 段(text/22-ch03-04-3-4.txt:44,搜「10%的诗句」)。Ballard 的论文发表于 1913 年。

  19. 出处:「3.4 如何牢记编程语法」第 62、64 段(text/22-ch03-04-3-4.txt:62,搜「5、12、91」;text/22-ch03-04-3-4.txt:64,搜「只包含1」)。原文脚注补了另一种记法:均可写成 2^n−1。

  20. 出处:「3.4 如何牢记编程语法」第 68 段(text/22-ch03-04-3-4.txt:68,搜「枪」)。被试把故事里的「弓」改成了「枪」。

  21. 出处:「3.4 如何牢记编程语法」第 86 段(text/22-ch03-04-3-4.txt:86,搜「精细加工策略」)与第 92 段(text/22-ch03-04-3-4.txt:92,搜「从新概念可以联想到」)。

  22. 出处:「3.2 如何利用抽认卡快速学习语法」第 29 段(text/20-ch03-02-3-2.txt:29,搜「几周后就会出现明显增长」)与「3.3 如何避免遗忘」第 51 段(text/21-ch03-03-3-3.txt:51,搜「一个月复习一次」)。