心智模型与概念机器 — 你脑子里跑的那台计算机
这一章讲三件事: 大脑凭什么解决从没见过的问题(答案:先建简化版);两个学派为模型存在哪吵了四十年; 以及把变量比作「盒子」这个人人用过的比喻,为什么被一个 496 人的实验判了「有功也有罪」。
1. 表征决定解法:一道小鸟题
先感受「问题在心里摆成什么样 」的威力。经典题:剑桥到伦敦 50 英里,两列火车同时相向开出,时速各 50 英里;一只小鸟以 75 英里的时速在两车之间来回飞,两车相遇时它共飞了多远?1
顺着「鸟」解:算它每一段来回飞多远,再加总——一道无穷级数求和,大多数人直接放弃。换个摆法:先别管鸟飞了几趟,只问鸟总共飞了多久——两车 30 分钟后相遇(各走 25 英里),鸟也就飞了 30 分钟,75 英里时速 × 半小时 = 37.5 英里,一步乘法完事2。
问题的难度不在问题里,在表征里——你把它在心里摆成什么样子,决定了你用什么工具解它。程序设计同理:把客户摆成列表还是树、把状态摆成开关还是进度条,后面的解法已经注定了一半。而「在心里摆」的那个东西,就是本章的主角。
2. 心智模型:脑子里跑的简化版
模型就是对现实做的简化表征——不追求完整,只保留解决问题需要的部分3。程序员时时刻刻在用它:文件「放在」文件夹里(硬盘上其实只有 0 和 1)、程序「一行一行」执行(Java 真正执行的是编译后的中间代码)、树「长」在内存里(其实只是一堆互相引用的值)。这些都不是事实,但都是好用的不真实——拿「某个节点的子节点」推理,比拿「某个元素引用的元素」推理省力得多4。
这类不在纸上、直接长在脑子里的模型,叫心智模型。概念是 1943 年一位苏格兰哲学家克拉克(Craik)提出的;书里采用的定义是:心智模型在工作记忆中造出一个抽象,专门拿来对当前问题做推理5。
心智模型有三个要紧的脾气6:
-
多个矛盾的模型可以共存。「文件在文件夹里」和「文件是硬盘上的一串字节(字节,即 8 个 0/1 组成的存储单位)」同时住在你脑子里,按场合取用;
-
旧模型不会删除。学得更深并不会覆盖旧模型——它还留在长时记忆里,随时可能乱入:认知负荷一高,大脑就抓最顺手的旧模型来用。调试异步(调用发出后不原地等它完成、先去干别的)代码时拿同步的心智模型硬套、看见指针就和普通变量混着想,都是乱入7;
-
**第一反应往往来自最熟的模型,不是最对的。**书里给的测试题:给雪人穿毛衣,它化得更快还是更慢?直觉答「更快」 的人,是被「毛衣=保暖」这个日常模型劫持了;毛衣的真实功能是减少热量散失——所以化得更慢8。
3. 两大阵营:模型住在哪
心智模型到底存放在三套记忆的哪一套里?1983 年有两本同名著作同场打擂,各执一端9:
- **约翰逊-莱尔德(Johnson-Laird):模型长在工作记忆里。**证据是餐桌实验:让人听一段座位描述(「勺子在叉子右边」),再做别的事,最后判断四段新描述哪段「最像刚才听的」——人们把「听过的」和「能推出来的」排在「无关的」前面,说明他们在脑内真摆了一个座位图,拿图对答案10。他还发现:描述越确定,判断越准——只对应一种摆法的描述,正确率 88%;可以对应多种摆法的,只有 58%11。模型越具体,推理越硬。
- **根特纳与史蒂文斯(Gentner & Stevens):模型存于长时记忆。**你脑子里存着「液体流动」的通用模型,倒牛奶时激活它,倒更稠的面糊时小改着用;存着「树遍 历」的通用模型,见到任何带树结构的程序都能直接调档12。
九十年代起的研究把两边缝上了:两种都对——长时记忆里存着现成模型,工作记忆里现搭专用模型,而且存的影响搭的13。对程序员的实操含义是双份的,见下一节主走查。
4. 主走查:给一段陌生代码配模型
按两派各自的思路,给同一段代码配模型。任务:读懂一个开票模块——用户可以有多张发票,一张发票只属于一个用户。
**路线 A(长时记忆派):先看存货够不够。**列出候选模型清点:有向图?时序图?MVC?观察者模式?——发现「实体关系」模型在存货里:两个实体、一条一对多关系。调档命中,直接套用,连代码都没细读,结构已经预判了大半14。
路线 B(工作记忆派):现场搭一个,按三步走15:
- 先搭局部模型:只画「发票」一个实体的状态(草稿→已开→已作废),不管别 的——局部模型先给工作记忆腾地方;
- 列出对象和关系:白板上写下「用户——发票」「发票——条目」两组关系,标上一对多;
- 拿问题考它,按答案修:问它「一个用户有两张发票,系统允许吗?」「删掉用户,发票去哪?」,拿答案对照代码验证;模型答错的地方,就是理解的缺口,回去重读对应代码。
两条路线的产出可以合并:存货里有现成模型就用现成的(快),缺的部分现场搭(稳)。书里还给了一个维护「存货」的土办法——心智模型抽认卡:一面写模型名(树结构、状态表、时序图),一面写它的要点和适用问题,遇到难代码就翻一遍卡片逐个问「这段能不能用它描述?」16
5. 概念机器:公共版的模型
心智模型是私人的,可能对可能错。但针对「这门语言怎么执行代码」,还存在一套公共的、有意简化的标准像——概念机器:对执行代码的机器做的一致抽象17。
它和心智模型的关系是一句话:概念机器是「教材正确答案」,心智模型是「你脑内的理解」;把概念机器内化得足够好,心智模型就向它看齐18。
几个有名的概念机器:
- 工厂工人(杜布拉伊为教学语言 Logo 设计):工人听命令、嘴里说结果、手上干活——一个能一路长成「会调用自己(这叫递归)的工人」的教学模型19;
- 替换机器(你自己天天在用):心算
(9.0/5.0)*10+32时,把变量换成值、按括号顺序代——这台「机器」和真实计算机(转成逆波兰式、用栈倒腾,栈就是先进后出的收纳结构)根本不一样,但算数照样对。概念机器不追求等于真机,只追求在该抽象的层面一致、可用20; - 概念机器还藏在语言词汇里:「打开/关闭文件」(实际是允许/禁止读取)、「变量保存值」、「函数返回值」——日常黑话全是某个概念机器的化石21。
概念机器还能叠起来长:变量是「一个盒子」,数组就是「一摞盒子」;无参函数是「一小包代码」,带参数就升级成「背着输入去调用点的旅行者」,再带返回值就背篓里再放一个回来——后一个模型建在前一个上面22。
6. 隐喻的陷阱: 盒子实验
「变量是盒子」是全世界编程课本的第一比喻。它有没有代价?2017 年,作者团队在阿姆斯特丹科学博物馆做了个实验:496 位从没编过程序的访客(成年人带孩子都有)上一节 20 分钟的 Scratch 入门课,一半人全程用「盒子」比喻(「x 里装着 5」),另一半用「标签」比喻(「x 贴在 5 上」),课后立刻测试23。
结果把隐喻的两面同时拍在桌上24:
| 题目 | 盒子组 | 标签组 |
|---|---|---|
| 一次赋值(x = 5) | 正确率更高 | 较低 |
| 「一个变量能不能存两个值?」 | 错得多——相当多人答「能」 | 更少出错 |
盒子的直觉给了上手速度(东西本来就往盒子里放),也附赠了错误的直觉(一个盒子确实能装两颗糖)。标签的直觉反着来:一张贴纸只能贴一处,「一个变量一个值」天经地义,但上手没有盒子快。
书里从实验里拧出来的教训,比「选哪个比喻」重要得多:不要贸然拿现实物件直接解释编程概念——现实隐喻带来的现实直觉,一半是助力,一半是日后要还的债;而且旧直觉进了长时记忆就不走(第 2 节的「乱入」),教学时省下的那点力气,是拿将来的困惑换的25。
7. 作者的判断与证据
**有实验撑着的:**餐桌实验与 88% 对 58%(约翰逊-莱尔德);NEMO 博物馆 496 人的盒子/标签实验(作者本人参与,样本大、场景真实,但被试全部是零基础新手——推到有经验程序员身上要小心);雪人毛衣是认知教学里的常用示例。
作者的立场,要分开看:「工作记忆中造出抽象」这个定义,书里原话是「我认为恰如其分」——作者的裁决,不是学界定论;两派调和的说法(九十年代起)被书里表述得比实际更从容,「相得益彰」是作者搭的桥。
书的坦白:概念机器「未必是完整的模型」;替换概念机器明知道不真还是建议大家继续用——这是一个罕见的「作者公开推荐使用错误模型」的时刻,理由是它在该抽象的层面上够用。
8. 边界与局限
- NEMO 实验测的是一节 20 分钟入门课后的即时表现,不能回答「长期用盒子比喻的程序员后来怎样」——长期账两边都没算;
- 概念机器和形式语义学不是一回事。语义,即「这段程序到底是什么意思」这回事;研究它的语义学追求精确且完整地规定含义,概念机器要的恰恰是丢弃细节;拿语义学的标准去要求概念机器,或者反 过来,都读岔了26;
- 选隐喻还得看对象:图式因人而异——「盒子」对多数人好用,因为人人收拾过东西;给从没收拾过盒子的人讲,不如挑他熟悉的(书里举例:对印度农村的孩子,有人用大象和驯象师讲计算机)27;
- 本章讲「模型怎么帮我」;模型错了怎么办(迷思概念、怎么洗掉),第 08 章正面处理。
9. 可带走的
- 卡壳时先检查表征:这道题/这个系统在心里摆成什么样子了?换个摆法常比换个算法便宜;
- 读难代码前先问存货:有没有现成模型(树、状态机、生产者消费者)能套?有就先套再看码;
- 没有存货就现场搭:局部模型→对象与关系→拿问题考它,三步,配白板;
- 给团队建「心智模型抽认卡」,把各自的存货摊开互相看见;
- 心算代码行为时尽管用「替换机器」,但要记得它和真机的差异在哪(求值顺序、小数精度(即保留多少位小数)、短路);
- 给新人讲概念,挑比喻前先想想它附赠什么错误直觉——「盒子」的债是「一个变量能存两个值」;
- 发现自己在高负荷下「想当然」,别自责——那是旧模型乱入的标准姿势,降低负荷比提高警惕有效。
10. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 模型的定义与两优点 | 6.1 借助模型来思考代码 | text/37-ch06-01-6-1.txt:5(搜「简化表征」) · text/37-ch06-01-6-1.txt:15(搜「相互交流」) · text/37-ch06-01-6-1.txt:19(搜「约束条件」) |
| 小鸟与火车 | 6.1 借助模型来思考代码 | text/37-ch06-01-6-1.txt:25(搜「小鸟以每小时75英里」) · text/37-ch06-01-6-1.txt:31(搜「37.5英里」) |
| 心智模型的起源与定义 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:11(搜「Kenneth Craik」) · text/38-ch06-02-6-2.txt:13(搜「我认为这个定义恰如其分」) |
| 文件系统与逐行执行 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:15(搜「文件夹」) · text/38-ch06-02-6-2.txt:17(搜「逐行执行」) |
| 模型共存与乱入 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:37(搜「乱入」) |
| 雪人毛衣 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:39(搜「毛衣」) · text/38-ch06-02-6-2.txt:41(搜「减少热量散失」) |
| 餐桌实验 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:59(搜「勺子在叉子的右侧」) · text/38-ch06-02-6-2.txt:63(搜「餐桌布置的心智模型」) |
| 88% 对 58% | 6.2 心智模型 | text/38-ch06-02-6-2.txt:75(搜「88%」) |
| 构建模型三步 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:85(搜「局部模型入手」) · text/38-ch06-02-6-2.txt:89(搜「相关对象以及对象之间的关系」) · text/38-ch06-02-6-2.txt:93(搜「完善模型」) |
| 长时记忆派 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:111(搜「Gentner」) · text/38-ch06-02-6-2.txt:113(搜「牛奶倒入玻璃杯」) · text/38-ch06-02-6-2.txt:115(搜「树遍历」) |
| 心智模型抽认卡 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:123(搜「扩展心智模型的数量」) · text/38-ch06-02-6-2.txt:145(搜「叶节点」) |
| 两派调和 | 6.2 心智模型 | text/38-ch06-02-6-2.txt:151(搜「相得益彰」) |
| 概念机器定义 | 6.3 概念机器 | text/39-ch06-03-6-3.txt:5(搜「概念机器」) · text/39-ch06-03-6-3.txt:11(搜「一致而正确的抽象」) · text/39-ch06-03-6-3.txt:13(搜「内化于心」) |
| 工厂工人 | 6.3 概念机器 | text/39-ch06-03-6-3.txt:23(搜「Logo语言」) · text/39-ch06-03-6-3.txt:27(搜「工厂工人」) |
| 替换概念机器 | 6.3 概念机器 | text/39-ch06-03-6-3.txt:33(搜「celsius」) · text/39-ch06-03-6-3.txt:40(搜「逆波兰」) |
| 语言里的化石 | 6.4 概念机器和语言描述 | text/40-ch06-04-6-4.txt:5(搜「保存」) · text/40-ch06-04-6-4.txt:7(搜「打开」) |
| 可组合的概念机器 | 6.4 概念机器和语言描述 | text/40-ch06-04-6-4.txt:17(搜「一摞盒子」) · text/40-ch06-04-6-4.txt:21(搜「旅行者」) |
| NEMO 实验 | 6.4 概念机器和语言描述 | text/40-ch06-04-6-4.txt:29(搜「496位被试者」) · text/40-ch06-04-6-4.txt:33(搜「标签」) · text/40-ch06-04-6-4.txt:37(搜「存储两个值」) · text/40-ch06-04-6-4.txt:39(搜「不要贸然」) |
| 图式与选隐喻 | 6.5 概念机器和图式 | text/41-ch06-05-6-5.txt:9(搜「独轮车」) · text/41-ch06-05-6-5.txt:11(搜「驯象师」) |
| 语义学之别 | 6.5 概念机器和图式 | text/41-ch06-05-6-5.txt:15(搜「语义学」) |