跳到主要内容

带新人 — 适岗培训的认知学

这一章讲三件事: 资深程序员为什么天生不擅长带新人(有名词、有机制);新手和熟手差的是「量」还是「质」; 以及一套按认知规律重新安排的培训流程。 这是全书最后一章,也是全书方法的落地场:前面十二章的所有工具,在这里被组装成一个「带人」流程。

1. 全景:失败剧本的三幕,和它的问题出在哪

书里给最常见的适岗培训画了张速写,三幕1:

第一幕:资深程序员把领域、流程、代码库一股脑倒给新人
→ 新人的工作记忆瞬间过载
第二幕:布置一个「举手之劳」的小任务(改个小 bug、加个小功能)
第三幕:新人做不出来 → 主管觉得「这人不太行」,
新人觉得「这项目太难」→ 双输

图说:问题不在人,在剧本。第一幕的「一股脑」违反了本章全部规律,
后面各节逐条换掉它。

病根有个正式名字:知识的诅咒——熟练掌握某种技能后,人会不可避免地忘记当初学它有多难,于是高估新人的接受能力2。诊断信号也很具体:如果你最近对别人说过「没有那么难」「其实很简单」「小菜一碟」——你自己多半正受着它的诅咒,因为你自己掌握那些知识,当时也花了很久3

更深的一层误判(第 17 段原文的观察):主管看到新人卡壳,归因于「不聪明」;新人自己归因于「项目难」——两边的归因都错了,正确的归因是:同时学的东西太多了,工作记忆装不下4

2. 新手不是「慢版熟手」,是「另一种处理器」

带新人最大的认知错误是这幅图景:新手=熟手减去速度。实际差距是质上的5:

  • 熟手的长时记忆里有大量相关存货:策略(「先写测试」)、情景记忆(「上次把机器重启就好了」);
  • 熟手的组块大:看到数组越界的报错——索引,即元素在数组里的位置编号,越界即编号超出了合法范围——熟手读到一个完整概念;新手读到的是三个零件——「数组」「索引」「越界」,得现场组装,组装期间工作记忆全被占用6

所以「新人得到编程能力不强的评价」,多数情况不是能力问题,是知识的诅咒在中间作梗:他收到的每条信息都以零件形态到达,而给任务的人以为发的是成品7

3. 主走查:把一次失败的 onboarding 重新安排

拿一个典型场景走一遍。设定(人物与对话为演示虚构,机制全部对应原书):新人小林入职第一周,导师老周负责带,任务是「给订单列表加个导出 CSV(CSV,即通用的表格文本格式)的按钮」——听起来是标准「新手任务」。

失败版(第 1 节的剧本):
周一上午:老周花了两个小时讲系统架构、领域背景、部署流程、代码库规范
周一下午:发任务「加个导出按钮,应该不难」
周二~周四:小林要同时做——搜索(代码在哪)、理解(订单模块怎么运转)、
探索(报表系统怎么对接)、转写(写导出逻辑)、还要消化周一的领域名词
→ 五种活动同时上,三种记忆全爆(第 12 章的结论)
周五:复盘,老周「这任务我半小时就能做完」,小林沉默。
—— 知识的诅咒双语版:导师比速度,新人比难度,都测错了东西。

新安排:
周一:只讲领域概念清单(订单、SKU、结算周期……配上解释),
领域学习和代码探索分开 —— 老规矩:边读码边学概念两头垮(第 06 章)
周二:任务一(纯理解):「读懂 OrderList 这个类,写一份摘要」
—— 不写任何新代码;摘要以后直接当文档
周三:任务二(纯搜索):「找到导出功能应该挂载的位置,说明理由」
周四:任务三(转写):老周提前把要改的文件圈好、样板代码备好,
小林只写导出逻辑本身 —— 搜索环节被导师预先吸收掉了
周五:代码共读一小时(七步走完),顺带复盘一周
每一步之间:观察负荷,而不是观察进度。

新方案改了四件事,每一件都有出处:领域与代码分开讲(边读边学加重认知负荷)8;一次只安排一种活动(新人同时干四种必然过载)9;理解类任务优先于实现类(「写摘要」既练了理解又留下文档)10;导师预先吸收搜索环节(把会产生高负荷的环节自己消化掉;原文的建议正是「重构当前的类」来省掉新人的搜索——这就是第 04 章认知重构的团队版:这回改代码的不是读不懂的自己,而是替读者扫清障碍的导师)11。任务没变、人没换,一周的体验和产出完全不同。

4. 四个阶段:新人卡在哪一级,就讲哪一级的话

新方案能落地,前提是导师能判断小林现在在哪一级。书里借了发展心理学的框架——新皮亚杰理论(源自皮亚杰的儿童认知发展四阶段,后来被利斯特/Lister 改造用于编程教学)。它对编程最要紧的一条性质:发展阶段是领域特定的——同一个程序员,写 Java 时是老手,换 Haskell 可能立刻跌回新手档;换一个陌生代码库同理12

阶段程序员的样子带法
感觉运动无法跟踪程序执行,给状态表都填不了;逐字啃代码别讲原则,陪他逐行走;讲原则纯属噪音
前运算能跟踪小段代码,但靠猜;图表帮不上忙(注意力全在代码上)抽认卡管够;最打击积极性的阶段,导师要预期反复
具体运算会用组块、注释、标识符推理,只在必要时跟踪;图表从这级开始才有用可以给任务链、给架构图了
形式运算能对代码和自己的思路做抽象推理;更想自己钻给目标和边界,别盯着

13

两个关键提醒。学习新东西会暂时降级:小林本来读普通函数没问题,一碰到可变参数函数(参数个数不定的函数)就可能跌回前一档,要重新跟踪代码——这不是退步,是常态14第二级最容易冤枉人:前运算阶段的典型表现是「猜对五分钟后又推翻自己」,导师看着来气,以为态度有问题——其实这是通往第三级的必经之路15

5. 讲解的波形:语义波与三种讲崩的方式

判断了级别,讲法的理论上限是「语义波」(马顿/Maton 的教育语言学理论):学一个概念,理想的路径是三段——先给宏观认识(它有什么用、为什么值得学),再解包(unpacking:沉到具体细节,语法、参数、示例),最后重新打包(repacking:抽回一般原理,并和旧知识接上、存进长时记忆)16

讲崩的方式恰好有三种,对照着最直观17:

反模式样子听众的体验
高平线全程抽象:「可变参数函数很有用」「所以到底怎么写?」
低平线全程细节:「星号标记参数,参数装进列表」「所以我要不要学它?用在哪?」
下行扶梯先抽象后细节,但不留时间重新打包当场点头,出门就忘——知识没进长时记忆

下行扶梯最隐蔽,因为它前两段都对,缺的只是第三段:停下来问一句「这个新东西和你已经会的 X 有什么像的地方?」——重新打包发生在受训者自己的脑子里,导师能做的是逼那个动作发生18

6. 流程清单:培训者该备的三份材料

把新方案里散落的准备动作收拢成清单,对着第 01 章的三种记忆各备一份19:

  • 给长时记忆:两份清单——领域概念清单(订单、SKU 是什么)+ 工具清单(「我们用 Laravel 开发、用 Jenkins 部署」这句话,对圈内人是一个短句,对新人是一串需要逐个查的名词)20;
  • 给短时记忆:一次一个的小任务(见主走查),任务之间留消化时间;
  • 给工作记忆:图表和模型——但记住图表从「具体运算阶段」才开始有用,而且要随时观察效果,不理想就果断放弃21

外加一个软性动作:教新人用认知词汇汇报状态——「我读这段时认知负荷过高」「我对 Python 代码还分不了块」,比「我听不懂」信息量大得多,导师能对症下药22

最后一步是代码共读:团队一起读代码,把第 06 章的七个策略过一遍——激活(读前先过概念清单)、确定重要性(大家各标各的重点行,分歧即讨论)、推断、监测(定期请新人概括)、视觉化、提问、摘要。共读属于理解活动,别夹其他活动;读出来的摘要直接提交进代码库当文档——新人第一次拉取请求(向代码库提交改动的流程)就献给它,压力小、产出真23

7. 作者的判断与证据

**有实验或文献撑着的:**新手的组块劣势(第 02 章 McKeithen 研究的直接推论);新皮亚杰四阶段(利斯特对编程教学的改造,本书第 10 章推荐过他的论文);图表从具体运算阶段才起作用(利斯特的研究发现);语义波与解包/重新打包(马顿的教育语言学);「会使用子目标规划」(马古利厄克斯,第 12 章同源)。

作者的发挥,要分开看:「第一、二阶段最打击积极性」是作者的教学经验之谈(原话「在我看来」);「以讹传讹」式的归因(第 05 章匈牙利命名法那节同款)在本章不出现,但「培训失败的两大误判」是作者的观察汇总,不是实验数据;主走查的新方案是本拆解把书中各节处方拼装成的演示。

**书的坦白:**作者同时也在开发面向初学者的编程语言 Hedy,本章的教学主张与她的日常实践直接相关——这不是利益冲突,但读的时候值得知道她讲这些话的位置24

8. 边界与局限

  • 新皮亚杰的「阶段」是描述工具不是测量工具:没有量表判定小林「在」第几级,导师只能靠行为表现猜,猜错就换策略再猜;
  • 全章默认的培训对象是有编程基础、缺这个代码库/领域的新人;对「第一次学编程」的人,四阶段的滑落幅度会大得多;
  • 语义波理论来自教育语言学,用在代码教学上没有独立的效度研究——它是好用的脚手架,不是定律;
  • 「一次一种活动」在赶工期的团队里最难执行——它要的不是认知科学,是排期纪律,书里没有处理这个冲突。

9. 可带走的

  1. 说「这很简单」之前先停一秒——那句话是知识的诅咒的心电图;
  2. 给新人的每条信息默认按「零件」算,不按「成品」算——他还没长出你的组块;
  3. 培训任务一次只压一种活动:理解周、搜索周、转写周,别混合;
  4. 领域概念清单和工具清单是两份不同的文档,第一周就给;
  5. 布置「写摘要」而不是「写功能」——摘要会变成文档,功能会变成风险;
  6. 讲新概念按「宏观→细节→重新打包」走完三段,最后一段靠提问触发;
  7. 发现新人「猜来猜去」别急——他在前运算阶段,这是必经之路;
  8. 观察负荷,不只观察进度:「这周认知负荷高不高」是比「进度到哪了」更有用的周会问题。

10. 原文地图

主题原书章原文位置
失败剧本三幕13.1 适岗培训中存在的问题text/73-ch13-01-13-1.txt:9(搜「信息的洪流」) · text/73-ch13-01-13-1.txt:11(搜「举手之劳」) · text/73-ch13-01-13-1.txt:13(搜「无法完成培训者交给自己的任务」)
病根与误判13.1 适岗培训中存在的问题text/73-ch13-01-13-1.txt:15(搜「太多内容」) · text/73-ch13-01-13-1.txt:17(搜「不太聪明」)
知识的诅咒 ★13.1 适岗培训中存在的问题text/73-ch13-01-13-1.txt:19(搜「知识的诅咒」) · text/73-ch13-01-13-1.txt:21(搜「小菜一碟」)
新手不是慢版熟手13.2 高级程序员与初级程序员的区别text/74-ch13-02-13-2.txt:7(搜「经过刻意学习的策略」) · text/74-ch13-02-13-2.txt:9(搜「3个独立的元素」)
新皮亚杰四阶段13.2 高级程序员与初级程序员的区别text/74-ch13-02-13-2.txt:13(搜「新皮亚杰理论」) · text/74-ch13-02-13-2.txt:25(搜「领域特殊性」)
各阶段的表现与带法13.2 高级程序员与初级程序员的区别text/74-ch13-02-13-2.txt:29(搜「感觉运动阶段」) · text/74-ch13-02-13-2.txt:33(搜「前运算阶段」) · text/74-ch13-02-13-2.txt:37(搜「具体运算阶段」) · text/74-ch13-02-13-2.txt:39(搜「形式运算阶段」)
第二阶段最打击积极性13.2 高级程序员与初级程序员的区别text/74-ch13-02-13-2.txt:35(搜「最打击程序员的积极性」)
暂时降级13.2 高级程序员与初级程序员的区别text/74-ch13-02-13-2.txt:43(搜「回到前一个阶段」)
语义波与解包/重新打包13.2 高级程序员与初级程序员的区别text/74-ch13-02-13-2.txt:55(搜「语义波理论」) · text/74-ch13-02-13-2.txt:59(搜「解包」) · text/74-ch13-02-13-2.txt:61(搜「重新打包」)
三种反模式13.2 高级程序员与初级程序员的区别text/74-ch13-02-13-2.txt:63(搜「高平线」) · text/74-ch13-02-13-2.txt:67(搜「低平线」) · text/74-ch13-02-13-2.txt:69(搜「下行扶梯」)
认知词汇汇报13.3 完善适岗培训流程text/75-ch13-03-13-3.txt:5(搜「一头雾水」)
贪多嚼不烂13.3 完善适岗培训流程text/75-ch13-03-13-3.txt:9(搜「至少4项活动」) · text/75-ch13-03-13-3.txt:13(搜「逐一完成」)
工具清单13.3 完善适岗培训流程text/75-ch13-03-13-3.txt:35(搜「Laravel」)
领域与代码分开13.3 完善适岗培训流程text/75-ch13-03-13-3.txt:37(搜「分开进行」)
小任务与摘要13.3 完善适岗培训流程text/75-ch13-03-13-3.txt:53(搜「一心多用」) · text/75-ch13-03-13-3.txt:55(搜「更受欢迎」) · text/75-ch13-03-13-3.txt:61(搜「准备好相关代码」)
图表的取舍13.3 完善适岗培训流程text/75-ch13-03-13-3.txt:67(搜「果断放弃」)
代码共读七步13.3 完善适岗培训流程text/75-ch13-03-13-3.txt:87(搜「减轻新成员的认知负荷」) · text/75-ch13-03-13-3.txt:93(搜「激活阶段」) · text/75-ch13-03-13-3.txt:107(搜「理解水平」) · text/75-ch13-03-13-3.txt:119(搜「拉取请求」)

Footnotes

  1. 出处:「13.1 适岗培训中存在的问题」第 9–13 段(text/73-ch13-01-13-1.txt:9,搜「信息的洪流」)。三幕为对原文第 9–13 段的概括。

  2. 出处:「13.1 适岗培训中存在的问题」第 19 段(text/73-ch13-01-13-1.txt:19,搜「知识的诅咒」)。原文:熟练掌握某种技能或知识后,程序员会不可避免地忘记当初学习时遇到的困难,从而高估新成员接受新事物的能力。

  3. 出处:「13.1 适岗培训中存在的问题」第 21 段(text/73-ch13-01-13-1.txt:21,搜「小菜一碟」)。

  4. 出处:「13.1 适岗培训中存在的问题」第 15、17 段(text/73-ch13-01-13-1.txt:15,搜「太多内容」;text/73-ch13-01-13-1.txt:17,搜「不太聪明」)。

  5. 出处:「13.2 高级程序员与初级程序员的区别」第 7 段(text/74-ch13-02-13-2.txt:7,搜「经过刻意学习的策略」)。

  6. 出处:「13.2 高级程序员与初级程序员的区别」第 9 段(text/74-ch13-02-13-2.txt:9,搜「3个独立的元素」)。

  7. 出处:「13.2 高级程序员与初级程序员的区别」第 9 段(text/74-ch13-02-13-2.txt:9,搜「知识的诅咒在从中作梗」)。

  8. 出处:「13.3 完善适岗培训流程」第 37 段(text/75-ch13-03-13-3.txt:37,搜「分开进行」)。

  9. 出处:「13.3 完善适岗培训流程」第 9、13 段(text/75-ch13-03-13-3.txt:9,搜「至少4项活动」)。

  10. 出处:「13.3 完善适岗培训流程」第 55 段(text/75-ch13-03-13-3.txt:55,搜「更受欢迎」)。

  11. 出处:「13.3 完善适岗培训流程」第 61 段(text/75-ch13-03-13-3.txt:61,搜「准备好相关代码」)。

  12. 出处:「13.2 高级程序员与初级程序员的区别」第 13、25 段(text/74-ch13-02-13-2.txt:13,搜「新皮亚杰理论」;text/74-ch13-02-13-2.txt:25,搜「领域特殊性」)。利斯特(Lister)为澳大利亚学者;本书「写在最后」亦推荐其论文(text/77-fm.txt:13,搜「Toward a Developmental Epistemology」)。

  13. 出处:「13.2 高级程序员与初级程序员的区别」第 29–39 段(text/74-ch13-02-13-2.txt:29,搜「感觉运动阶段」)。各阶段表现见第 29 段(感觉运动)、第 33 段(前运算)、第 37 段(具体运算,含「图表才能起到促进思考的作用」)、第 39 段(形式运算);「带法」列为对各段内容的操作化概括。

  14. 出处:「13.2 高级程序员与初级程序员的区别」第 43 段(text/74-ch13-02-13-2.txt:43,搜「回到前一个阶段」)。可变参数函数的例子同段。

  15. 出处:「13.2 高级程序员与初级程序员的区别」第 35 段(text/74-ch13-02-13-2.txt:35,搜「最打击程序员的积极性」)。

  16. 出处:「13.2 高级程序员与初级程序员的区别」第 55–61 段(text/74-ch13-02-13-2.txt:55,搜「语义波理论」)。解包见第 59 段,重新打包见第 61 段。

  17. 出处:「13.2 高级程序员与初级程序员的区别」第 63–69 段(text/74-ch13-02-13-2.txt:63,搜「高平线」)。三种反模式依次见第 63、67、69 段。

  18. 出处:「13.2 高级程序员与初级程序员的区别」第 69 段(text/74-ch13-02-13-2.txt:69,搜「重新打包这个概念」)。原文建议培训者明确询问受训者新概念与初步信息之间的共同点。

  19. 出处:「13.3 完善适岗培训流程」第 31–67 段(text/75-ch13-03-13-3.txt:31,搜「改善长时记忆」)。三种记忆各一份材料的结构为对原文三小节的概括。

  20. 出处:「13.3 完善适岗培训流程」第 35 段(text/75-ch13-03-13-3.txt:35,搜「Laravel」)。

  21. 出处:「13.3 完善适岗培训流程」第 65、67 段(text/75-ch13-03-13-3.txt:67,搜「果断放弃」)。

  22. 出处:「13.3 完善适岗培训流程」第 5 段(text/75-ch13-03-13-3.txt:5,搜「一头雾水」)。

  23. 出处:「13.3 完善适岗培训流程」第 87–119 段(text/75-ch13-03-13-3.txt:87,搜「减轻新成员的认知负荷」)。七策略清单见第 73–85 段,摘要提交见第 119 段。

  24. 出处:「写在最后」第 7 段(text/77-fm.txt:7,搜「Hedy」)。作者在写本书期间同步开发面向初学者的渐进式编程语言 Hedy。