把语法记牢 — 遗忘曲线、抽认卡与提取
这一章讲三件事: 为什么「反正可以搜」是个昂贵的习惯;遗忘的规律长什么样、怎么绕着它安排复习; 以及把知识真正「焊」进长时记忆的两种主动做法。 它接住第 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——每个问题都在给新知识焊一条新线。