跳到主要内容

the-programmers-brain 通读笔记(边读边记)

原文:library/the-programmers-brain/text/。导航章(目录01/版权02/致谢05/封面07)跳过。 序言(03-fm)、前言(04-fm)、关于本书(06-fm)已读:作者 Felienne Hermans,少儿编程教学出身; 序言作者是 Jon Skeet(Noda Time 贡献者,Google),举了 PlusDays vs AddDays 命名、Java 引用传递心智模型两例。 关于本书:四部分 13 章,建议按序读。研究语言:JS/Python/Java 混合。

关键既有引用口径(BOOK-TEARDOWN 已用,必须沿用):

  • 2.2 §25:text/15-ch02-02-2-2.txt:25 搜「4个信息元素」——棋局组块,西西里防御例子
  • 10.4 §17:text/62-ch10-04-10-4.txt:17 搜「5倍」——配解释的学习效果
  • 13.1 §19:text/73-ch13-01-13-1.txt:19——知识的诅咒

原书第1章 剖析程序设计之惑(text/08–12)

  • 三段代码同作用(n 的二进制表示),三种困惑:APL(缺知识)/Java(缺信息)/BASIC(缺加工能力)
    • APL: 2 2 2 2 2 ⊤ n,不懂 ⊤(09:13)
    • Java: toBinaryString(),要检索信息;"main"错拼"mian"(09:20, 10:56)——长时记忆抄近道,没注意到错拼
    • BASIC: 9 行循环,要追踪变量中间值(09:26)
  • 三种认知过程(10):长时记忆=硬盘(缺知识),短时记忆=内存/缓存(缺信息,容量≤12,通常更少),工作记忆=处理器(缺加工能力)
    • 短时记忆容量:10:35 说"不超过12个"
    • 10:41 解决当前问题后大脑清空短时记忆
  • 追踪(tracing)=在脑海里编译并执行代码(10:70);需要外部媒介记中间值=工作记忆过载信号(10:72)
  • 差一错误例子:读 bug 报告涉及全部三种过程(11:17)
  • 练习1-1:APL 斐波那契递归(11:29)、Java Luhn 校验(11:35)、BASIC 反转字符串(11:61)

原书第2章 快速阅读代码(text/13–17)

  • 程序员平均每天近 60% 时间在理解代码而非编写(13:21)
  • 插入排序 Java 3 分钟默写练习(14:15–34);默写=短时+长时协作;程序员默写时会自己加注释帮助记忆(14:52)
  • 第二个默写程序(堆排序,变量名 b/l 奇怪)(14:66–79);l 像 1 有误导性(14:85)
  • 短时记忆留存 ≤30 秒(14:91);Miller 1956 "7±2"(14:95);近年研究 2~6 个(14:97)
    • 注意:10:35 说"不超过12",14:97 说"2~6"——两处口径不一致,引用时选一处并照原文
  • 2.2 组块:Adrian de Groot 两项实验(15):真棋局大师远好于普通棋手;随机摆放则两者都差
    • 职业棋手记法「西西里防御开局,马左移两格」→ 只有 4 个信息元素进短时记忆(15:25)★
    • 普通棋手逐子记忆("车在a7…")耗尽插槽(15:23,29)
    • 组块定义(15:31)
    • 练习:三组字符记忆(cat loves cake)(15:37–51)
  • McKeithen 1981 贝尔实验室:53 位初/中/高级程序员,30 行 ALGOL;正常程序:高级>中级>初级;打乱行序:三者无差别(15:63–67)
    • 编程新手能加工的代码比老手少得多(15:69)
  • 2.3 感觉记忆→图像记忆(iconic memory),类比 I/O 缓冲区(16:5–7)
    • Sperling 实验:3×3/3×4 字母网格,50ms 呈现,随机回忆一行/列,75% 成功率→全部信息在图像记忆,但短时记忆只加工一部分(16:15–21)
    • 扫视代码练习:看结构/嵌套/空白(16:29–45)
  • McKeithen 关键字记忆实验:21 个 ALGOL 关键字;新手用句子记("TRUE IS REAL THEN FALSE"),老手用编程知识分组(TRUE/FALSE、IF/THEN/ELSE)(16:51–59)
  • 编写可分块代码(16:61+):
    • 设计模式:Walter Tichy 两轮实验(学生/专业人士),前测-后测+双代码库交叉;学会设计模式后维护有模式的代码明显加快;观察者模式比装饰器模式效果更明显(16:63–75)
    • 注释:程序员读带注释代码花更多时间=浏览了注释;新手比老鸟更关心注释(Martha Elizabeth Crosby)(16:79–81)
    • Quyin Fan 2010 博士论文:高级注释(「该函数按顺序输出给定的二叉树」)助分块;低级注释(i++ 后「自增i」)反而不利于分块(16:83)
    • 信标(beacon):让程序员"茅塞顿开"的代码元素(16:87);二叉树中序遍历 Python 例子:root/tree/left/right(16:89–133)
    • 简单信标(有意义的变量名、运算符)vs 复合信标(self.left+self.right、for 循环整体)(16:129–131)
    • 高级程序员比初级更频繁使用信标(Crosby)(16:135)
  • 刻意练习(deliberate practice)定义(16:179);默写代码=自我评估工具(16:183–217)
  • 小结(17):2~6 组块;图像记忆;记忆代码评估水平;设计模式/注释/信标便于加工

原书第3章 快速学习编程语法(text/18–23)

  • 记语法的两个理由(19):①已知信息助分块;②打断成本——Chris Parnin:85 位程序员 10000 次编程会话,被打断后约一刻钟才能重新写代码;改方法时被打断,只有 1/10 能 1 分钟内找回状态(19:21)
  • 抽认卡(20):概念一面/代码一面;Python 列表推导式四张卡示例(20:9–15);编程语言远小于自然语言,适合抽认卡(20:19);Cerego/Anki/Quizlet(20:29);搜过的概念=该做卡的信号(20:35);连续答对可抽出(20:41)
  • 遗忘(21):长时记忆需反复练习;1 小时忘一半,两天只剩 25%(21:11)★;记忆按网络结构非分层(21:23);艾宾浩斯无意义音节,1880 年约 1000 小时练习,每分钟 150 个音节(21:33–35);Jaap Murre 2015 验证公式基本正确(21:39)
  • 间隔重复(21:43):艾宾浩斯 68+7 次 vs 3 天 38 次;Bahrick 一家 300 外语单词,6 组,间隔 2/4/8 周学 13/26 次;8 周×26 次的 1 年后记住 76%,2 周×26 次只有 56%(21:47–49)★;一个月复习一次抽认卡足以巩固(21:51)
  • 提取练习+精细加工(22):Bjork 夫妇:存储强度(只增不减)vs 提取强度(随时间降低)(22:11–21)★
    • C++ 反向遍历 6 选 1(rbegin/rend)(22:29–34):读过多次也记不住,但看到答案"不用说也知道"=存储强、提取弱(22:36)
    • Ballard 1913:16 行诗,两天后再背反而多 10%(22:44)
    • 恶性循环:搜→不记→提取强度低→再搜(22:46–48);先回忆再搜(22:50)
    • 图式 schema(22:60);6 个数字 5,12,91…vs 1,3,15,127,63,31(全是 2^n-1)(22:62–64)★
    • Bartlett 1930s「The War of the Ghosts」:复述会改故事(枪代替弓)(22:68)
    • 约翰·亚当斯"第五任"错误例子(22:76)
    • 精细加工=把新知识与已有记忆联系(22:78,82–86);练习3-2 的问题清单(22:88–107)

原书第4章 阅读复杂的代码(text/24–28)

  • 工作记忆 vs 短时记忆:作者定义为「应用于某个问题的短时记忆」(25:24–26);短时记忆管记电话号码,工作记忆管做数学运算(25:28)
  • 认知负荷 cognitive load(25:34);Sweller 三分(25:38):内部(问题本身,固有复杂性)/外部(表现形式,偶发复杂性)/ germane(第10章讲)
    • 直角三角形例子:a=8,b=6 vs 直接给 8 和 6(25:47–58)
    • 列表推导式两段等价 Python(25:64–69):外部负荷因人而异
  • 重构(26):常规重构=改内部结构不改外部行为,为可维护;认知重构 cognitive refactoring=为当下可读性(26:24);反向重构/内联(26:26);版本控制开「代码理解」分支(26:34)
  • 替换不熟悉结构(26:36+):lambda→普通函数 Java 例子(26:52–71);列表推导式→for 循环(26:79–95);三元运算符(26:99–109);「可读性取决于先验知识」(26:113)
  • 抽认卡两面都写代码(普通版 vs 高级版等价代码)增强学习(26:117–127)
  • 依赖图 dependency graph 六步(27:15–47):圈变量→连线→圈方法调用→连声明→圈类实例→连类;从 main() 入口沿连线跳读
  • 状态表 state table(27:49–89):每变量一列每步一行;跟踪=认知编译;Python Tutor(郭伽,UCSD)(27:93)
  • 依赖图管结构,状态表管计算(27:101)

原书第5章 深入理解代码(text/29–35)

  • 变量角色框架 Jorma Sajaniemi(东芬兰大学)(30:7):变量难懂因为缺关联变量的图式;11 种角色描述大多数变量(30:28)
    • 11 角色(30:30–56):固定值/步进器/标志/步行器/最近持有器/最佳持有器/收集器/容器/跟随器/组织器/临时
    • prime_factors 例子(30:13–24):upperbound=固定值,counter=步进器,factors=最近持有器,max_prime_factors=最佳持有器
  • 角色+范式(31):Dog 类例子 name=固定值 age=步进器(31:19);角色助沟通、助新手;「步进器+最佳持有器→搜索程序」(31:25)
    • 打印+图标标记(31:51);变量名中加角色名(31:61)
    • 匈牙利命名法(31:65–81):Charles Simonyi 1976 博士论文;系统型(类型前缀 strName)vs 应用型(语义前缀 rw/col、cColors);Joel Spolsky 解释误传;Petzold《Windows程序设计》传播错误形式;作者认为应用型与变量角色框架神似(t=临时,min/max=最佳持有器)
  • 文本结构知识 vs 计划知识(32):Nancy Pennington(科罗拉多大学)模型(32:9–11):表面理解 vs 作者意图
    • Sillito 4 步(杨百翰,25 位程序员)(32:17):找焦点→以焦点为基础→通过相关实体理解概念→理解多实体概念
    • 代码切片定义:代码行 X 的切片=与 X 相关的所有代码行(32:65)
    • 深入理解 4 步(32:57–79)带具体入口;实体表+概念表可作文档(32:79)
  • 阅读代码≈阅读自然语言(33):
    • 布罗德曼分区 52 区域,1909(33:17);fMRI 测血流量(33:21)
    • Janet Siegmund 2014:编程激活 BA6/21/40/44/47,全在左脑;BA6/40=工作记忆+注意力,BA21/44/47=自然语言处理——变量名已混淆仍激活语言区(33:25–31)★
    • Chantel Prat 36 学生 Codecademy 学 Python(33:37–47):数学能力只解释 2% 方差,语言能力 17%,工作记忆+推理 34%★;语言能力预测学习速度;「学编程语言的能力取决于学自然语言的能力」(33:47)
    • Uwano 眼动:最初 30% 时间扫视 70% 代码行(33:69)
    • Busjahn 14 新手 6 资深:文本阅读 80% 眼动线性,代码 75%;新手更线性、更常追踪调用栈(33:73–74)
  • 7 种文本理解策略用于代码(34:7–23):激活/监测/确定重要性/推断/视觉化/提问/摘要
    • 激活:5–10 分钟分析再回答问题;边读边学新概念加重负荷,先学概念再读(34:51)
    • 监测:打勾打问号;便于求助(34:55–61)
    • 确定重要性:标感叹号;团队意见相左=交流机会(34:81)
    • 推断:列标识符清单;领域名 vs 编程概念名(34:89–95)
    • 视觉化:操作表(zipWith 例子)(34:127–140)
    • 提问:5 个核心概念/决策/假设(34:152–170)
    • 摘要:自然语言摘要可作文档(34:172–176)

原书第6章 更好地解决编程问题(text/36–42)

  • 模型=对现实的简化表征(37:5);显式模型两优点:交流+减负(37:15–19);小鸟火车问题(37:25–31):50 英里/时速 50,鸟 75 mph→30 分钟相遇→37.5 英里,换表征把级数求和变成一步乘法
  • 心智模型 mental model(38):Kenneth Craik 1943《The Nature of Explanation》首创(38:11);文件系统/逐行执行例子(38:15–17);「我认为定义=在工作记忆中创造抽象」(38:13,作者口吻)
    • 多模型共存;旧模型"乱入",高负荷时更易(38:37);雪人毛衣问题(38:39–41)
    • Johnson-Laird 1983:心智模型载体=工作记忆;餐桌布置实验(38:59–63);确定性描述 88% vs 不确定性 58%——越具体越好(38:75)
    • Gentner & Stevens 1983:心智模型存长时记忆(液体流动/树遍历)(38:111–117);心智模型抽认卡(名称/解释)(38:123–141)
    • 90 年代研究:两者都对,LTM 影响 WM 构建(38:151)
    • 构建代码心智模型 3 步:局部模型→列对象与关系→问答完善(38:85–105)
  • 概念机器 notional machine(39):推理计算机如何执行代码的模型;一致性正确抽象 vs 心智模型可能错(39:11–13);内化后成为心智模型(39:13)
    • Ben du Boulay 1970s Logo,工厂工人类比(39:23–27)
    • 替换概念机器:代换心算 vs 逆波兰+栈(39:33–40);4 抽象层面(39:46)
  • 语言描述体现概念机器(40):「打开文件」=允许读取;可组合(盒子→一摞盒子)(40:17);旅行者类比参数传递(40:21)
    • NEMO 科学博物馆 2017 实验:496 位零基础被试,Scratch 入门课,标签组 vs 盒子组(40:29–37):一次赋值盒子组正确率高;两值问题盒子组错得多(以为变量能存两个值)★;结论:别贸然用现实隐喻(40:39)
  • 概念机器与图式(41):盒子比独轮车好——图式强;大象类比印度农村(41:11);语义学≠概念机器:语义要精确完整,概念机器要抽象(41:15)

原书第7章 迷思概念(text/43–46)

  • 迁移(44):学习中迁移(learning during)vs 学习迁移(transfer of learning);影响迁移量6因素:掌握/相似性/情境(IDE)/关键属性/联想(Java vs JavaScript 名字)/情绪(44:35–45)
    • 低阶迁移(无意识 Ctrl+C/V)vs 高阶迁移(有意识)(44:53);近迁移 vs 远迁移(44:57)
    • 正迁移/负迁移(44:67–71);Dijkstra 反 BASIC「摧毁大脑」(44:69);Java→Python 初始化假设(44:71);Java 受检异常 vs C#(44:73)
    • 迁移难(44:83–91):de Groot 随机棋局;象棋知识不迁移给伦敦塔;Gavriel Salomon 1987:编程教育对认知影响几乎可忽略;学新语言选完全不同的领域(乡村音乐→西部音乐比喻)(44:89)
  • 迷思概念 misconception 三条件(45:11–17):不正确/始终存在/坚信不疑
    • 辣椒籽不辣(45:19–25);烤肉封肉汁=负迁移催化的迷思(45:27)
    • 新手认为变量不能重新赋值(数学迁移/文件名唯一性迁移)(45:29–31)
    • 概念转变 conceptual change(45:37):新模型取代旧模型,不是加进图式;忘却学习 unlearning(45:41)
    • 记忆不会消失,靠抑制 inhibitory control(45:49–53);Galili & Bar:学生会退回低级推理(45:51);「稍等片刻」的感觉=大脑在抑制(45:51)
    • Sorva 2012 博士论文:162 种迷思概念(45:61);15 号(total=maximum+12 存方程,Prolog 真如此)(45:63);33 号(while 每行检查条件,英语词义干扰)(45:69);17 号(minimum 只能存最小值)(45:73);46 号(调用和签名要不同变量名)(45:75)
    • 对策:心态开放/对照迷思清单/问同路径学习者/结对/测试+文档(45:88–102)

原书第8章 提高命名的质量(text/47–53)

  • Phil Karlton 名言:缓存失效与取名(48:5)
  • Feitelson 2020:334 位被试,47 个命名对象,两人重名中位概率仅 6.9%(48:7)
  • 标识符重要性 4 点(48:15–29):Eclipse 200 万行,33% 标记/72% 字符是标识符;代码审查 25% 提命名,9% 注释关于标识符(Allamanis);标识符是最常见文档;信标
  • 两派观点(48:43–59):Butler 语法规则清单(下划线位置等,反系统型匈牙利);Allamanis 一致性(糟糕但一致>优雅但不一致)
  • Dawn Lawrie:78 代码库 186 版本,4800 万行,跨 30 年(48:71);今代码更守规范;同一代码库内不随时间改善——「标识符质量在早期定型」(48:77);代码库规模与质量无关(48:75)
  • 认知角度(49):规范化助短时记忆(分块);≤4 个单词合工作记忆 2~6(49:15);Naturalize 工具:18 个 PR 中 14 个获批;JUnit 故事:程序员违反自己的约定,错误版本成标准(49:19–21)
    • nmcntravg vs name_counter_average(49:27)
    • 标识符 3 类信息:领域词/编程概念/命名约定(i,j 循环)(49:35–43)
    • 评估时机:代码审查而非开发时(49:63–65)
  • 缩写研究(50):Hofmeister 72 位 C# 程序员:完整单词比字母/缩写每分钟多查 19% 错误(50:13);Lawrie 128 位 7.5 年经验:完整单词好 ~1 分(5 分制),但长标识符难记(音节数)(50:15–21);前缀后缀要三思(50:23–27)
    • Beniamini:5 语言 200 项目 16GB;单字母联想:s=字符串,c=字符,i/j/k/n=整数;d/e/f/r/t→浮点(意外);x/y/z 整数+浮点(50:31–43)
    • Binkley 驼峰 vs 蛇形:135 人;驼峰正确率高 51.5%,但慢 0.5 秒(50:59);受驼峰培训者识别蛇形更慢(50:63)
  • 标识符与错误(51):Butler 2009:8 个 Java 代码库(Tomcat/Hibernate),命名缺陷与 FindBugs 报告统计学相关,但非因果(51:13–15)
  • 名称模具 name mold(52):max_benefit_amount 等;团队应就模具达成一致(52:23)
  • Feitelson 三步模型(52:35–51):概念→单词→模具;项目词库 project lexicon(52:47);介词 indexOf(52:51);第二实验 100 人,评委盲评 2:1 更优(52:55–59)

原书第9章 代码异味与认知负荷(text/54–57)

  • 代码异味=Martin Fowler《重构》首创(55:5);22 种异味+级别(55:13–37)
    • 上帝类演进例子(55:25);冗赘类(55:27);代码克隆 foo/goo(55:31)
    • Foutse Khomh 研究 Eclipse:上帝类在所有版本都是易错因素;>75% 发行版中有过大类/过长方法的类更易变(55:37–39)
  • 异味↔认知过程(55:51–79):过长参数列表+复杂 switch→工作记忆过载(参数可分块,line() 4 参数=2 组块)(55:63);过大类+过长方法→阻碍分块(multiples()/minimum() 例子)(55:69);重复代码→分块错误("goo()就是foo()"迷思)(55:75–79)
  • 语言反模式(56):Venera Arnaoudova 首创(56:11):语言元素与角色不符(initial_element 存索引;isValid 返回整型;getCustomers 返回布尔)
    • 7 开源项目:11% setter 除设置字段还返回值;2.5% 方法名/注释与功能南辕北辙;is 开头标识符 64% 返回值非布尔(56:19)★;LAPD 检测工具(56:23)
  • 认知负荷测量(56:27–81):帕斯量表(9 级自评,单一问题,受诟病但广泛应用)(56:33);眨眼率(任务越难眨眼越少)/瞳孔(56:51);皮肤;fMRI 局限(不能动);脑电图;功能性近红外光谱 fNIRS(头带,血红蛋白吸光)(56:67–73)
    • 中川尊雄 2014 fNIRS:C 语言算法普通版 vs 复杂版,10 人中 8 人读复杂版含氧血红蛋白增加(56:77–81)
  • Fakhoury 2018(56:85–105):15 位被试,4 种代码片段(语言反模式/结构反模式/都有/都没有),眼动+fNIRS:语言反模式显著增加认知负荷;结构反模式(坏格式)令人反感但没有统计证据表明增加认知负荷★
  • 语言反模式为什么困惑(56:111–113):负迁移留错误印象(retrieveElements)+分块错误(isValid)

原书第10章 提高解决复杂问题的能力(text/58–63)

  • 问题解决三要素(59:9–17):起始状态/目标状态/规则;状态空间(59:19–25);井字棋
  • Pólya《怎样解题》3 阶段(60:9–15);但问题解决不是通用技能(60:17)
    • 回文检测 Java/APL/BASIC 例子(60:21–35):APL 关键字全是运算符,reverse() 不存在
    • LTM 需要具体线索,通用方法给不出线索(60:41);领域迁移难(60:43)
  • 记忆分类(60:53–67):程序性记忆(内隐,系鞋带/盲打)/陈述性记忆(外显);外显再分情景记忆(个人经历)与语义记忆(事实)
    • 资深程序员依赖情景记忆,「重现而非解决」熟悉问题(60:73)
    • 直觉=似曾相识时程序性记忆起作用(60:75);忘却学习:QWERTY→德沃夏克;作者自己 foreach vs for(60:81–83)
  • 自动化 automatization(61):「解锁二段跳」比喻(61:7);3 阶段(61:21–41):认知阶段→联想阶段→自主阶段(程序性阶段)
    • Gordon Logan 实例理论:自动化=完全靠情景记忆不靠推理;从记忆提取比推理快(61:51–53)
    • 刻意练习方法:写大量相似但不同的程序(各种 for);修改程序而非从零写;列表推导式↔循环(61:77–79);间隔重复(61:81)
  • 样例 worked examples(62)★:Sweller 认知负荷理论提出者;Sweller & Cooper 1980s:澳大利亚中学 20 位九年级学生(14–15 岁),两组解同样代数方程,一组带解题口诀(样例),解题速度 5 倍(62:17)★(TEARDOWN 引用段:62:17 搜「5倍」)
    • 迁移测试:用样例组解其他方程仍优于对照组(62:19);样例效应跨年龄跨学科可重复(62:21)
    • 第三种认知负荷 germane(62:33–37):图式构建与自动化的努力;内部+外部↑→germane↓→记不住;加班撸代码后忘掉做过什么(62:37)
    • 「一个人不会因为做了专业的事情就成为专家」Kirschner(62:45);编程实验:阅读代码及解释比写代码收获更多
    • 应用:代码阅读俱乐部(Code Reading Club);GitHub 挑熟悉的仓库;The Architecture of Open Source Applications / 500 Lines or Less(62:53–63)

原书第11章 编程活动和任务(text/64–67)

  • 符号认知维度框架(Green/Blackwell/Petre)分 5 种活动(65:5):搜索/理解/转写/递增/探索
    • 搜索→短时记忆(做笔记)(65:15);理解→工作记忆(模型/重构)(65:27);转写→长时记忆(65:33);递增→全部三种(65:39–43);探索→工作记忆为重(65:53);调试=5 种活动结合(65:57–59)
  • 打断(66):van Solingen 90 年代:每次干扰 15–20 分钟,约 20% 时间应付干扰(66:7);Parnin 85 人 10000 会话:平均每天只有 2 小时不受打扰;微软调查 62% 认为找回状态不易(66:9)
    • 中川 fNIRS:认知负荷峰值在理解任务中段→存在预热期/冷却期(66:17–19)
    • 一刻钟才能重新写代码;改方法时被打断仅 10% 能 1 分钟找回(66:23);路障提醒(故意留编译错误)(66:25)
    • 3 种方法(66:29–78):保存心智模型(注释,Ousterhout「注释获取编写者脑中未体现在代码里的信息」,Brooks)/改善前瞻性记忆(TODO 注释 1.36 亿条,attachables 插件)/子目标标记法(Margulieux;作者写步骤注释的例子 66:71–74)
    • Bailey 2001:被打断组更久更累更烦更焦虑;2006:被打断错误率 2 倍(66:88–92)
    • FlowLight(苏黎世 Züger):449 位程序员 12 国,减少 46% 干扰(66:97–98)
    • 多任务:未到自主阶段无法并行(66:108);Fox 2009:边读边 IM 多花 50% 时间(66:114);Kirschner 2010:200 学生,重度 Facebook 用户成绩低,但自感效率高(66:116);2008 对照实验:自我满意同伴评价低(66:117)

原书第12章 设计和改进大型系统(text/68–71)

  • 符号认知维度(cognitive dimensions of notation):Green/Blackwell/Petre;作者推广为「代码库认知维度」(69:23–25)
  • 13 个维度(69:29–203):易错性(JavaScript vs Haskell;Hanenberg Java vs Groovy 实验:静态类型更快找到错误)/一致性/扩散性(Python for 循环 7 组块 vs C++ 9 组块;列表推导式)/隐藏的依赖关系/临时性(纸笔白板最高)/黏性(难修改;编译慢测试慢增加黏性)/渐进式评估(Smalltalk/Scratch/Idris 坑 hole)/角色可表达性(括号/语法高亮/is_前缀)/映射紧密性(APL↔向量微积分,COBOL↔金融,Excel;findCustomers vs executeQuery;DDD)/艰难的心理操作(记参数顺序;非信息性标识符)/辅助符号(注释/命名参数)/抽象/可见性
  • 设计策略 design maneuver:改一个维度会动另一个(69:219–241):易错性↔黏性(类型);临时性/渐进式评估↔易错性;角色可表达性↔扩散性
  • 维度×活动(70):搜索←隐藏依赖/扩散性不利,辅助符号有利;理解←可见性不利/角色可表达性有利;转写←一致性从有利变不利;递增←映射紧密性/黏性;探索←临时性+渐进式评估有利,艰难心理操作+抽象不利
    • 按代码库生命周期选择优化目标(70:41)

原书第13章 适岗培训(text/72–76)+写在最后

  • 适岗培训问题(73):新人被信息洪流淹没;资深程序员受「知识的诅咒」(73:19)★(TEARDOWN 引用:73:19);「小菜一碟」=受诅咒的信号(73:21)
  • 新手 vs 老手(74:7–9):老手大量记忆+强分块;「数组索引越界」对老手是一个概念,对新手是 3 个元素
  • 新皮亚杰理论(74:13–43):皮亚杰 4 阶段;Lister 模型:感觉运动(无法跟踪)→前运算(只能靠猜,图表无用,最打击积极性)→具体运算(可用组块/注释推理,图表开始有用)→形式运算(抽象推理);学习新概念会暂时退回前一阶段(74:43)
  • 语义波理论(Karl Maton)(74:55–69):波峰抽象→解包(具体细节)→重新打包(回到抽象并入库);3 反模式:高平线(全抽象)/低平线(全具体)/下行扶梯(抽象+具体但不重新打包)
  • 完善流程(75):管理认知负荷;教受训者用认知词汇描述状态(75:5);贪多嚼不烂:新人同时要做 4+ 种活动(75:9);一次只安排一种活动
    • 改善三种记忆:长时记忆(领域概念清单+工具清单,领域学习与代码探索分开)(75:31–41);短时记忆(有针对性的小任务,理解类任务优先于实现类)(75:51–61);工作记忆(培训者画图表,但发现没用就果断放弃)(75:65–67)
    • 代码共读:7 策略用于团队(激活/确定重要性/推断/监测/视觉化/提问/摘要)(75:71–119);摘要可提交为文档(75:119)
  • 写在最后(77):作者同步开发 Hedy 渐进式编程语言;推荐《思考,快与慢》《如何学习》《人脑如何学数学》、Ousterhout《A Philosophy of Software Design》;两篇关键论文:Kirschner 2006「Why Minimal Guidance During Instruction Does Not Work」、Lister 2016「Toward a Developmental Epistemology of Computer Programming」

三个既有引用锚核验(读原文时确认)

  • text/15-ch02-02-2-2.txt:25「4个信息元素」✓(西西里防御组块段)
  • text/62-ch10-04-10-4.txt:17「5倍」✓(Sweller & Cooper 样例实验)
  • text/73-ch13-01-13-1.txt:19「知识的诅咒」✓(73:19 原段「程序员会不可避免地忘记当初学习…」)