“只读不敲”被反复警告,但更隐蔽的陷阱是:敲了,也跑通了,却依然没有学会。对着教程逐行复现一个 MNIST 分类器,与从零设计并跑通一个具备数据管道、训练循环、评估协议与部署接口的项目,二者之间的差距并非“代码量”,而是问题定义权、调试归因能力、工程约束感知与验证闭环这四项能力的结构性缺失。
本文以“认知负债(cognitive debt)”与“迁移熵(transfer entropy of skill)”为贯穿主线,剖析抄写式学习的失效机制,给出可量化的自检量表、从零构建项目的分阶段操作路径,并结合近年关于编程教育、程序合成与技能迁移的实证研究,对“AI 辅助编程时代的学习范式”作出审慎预判。
📑 目录
一、摘要与核心论点
深度学习的入门材料高度同质化:几乎每一份教程都提供一个“可运行”的最小示例,读者复制、粘贴、运行、看到 loss 下降,便获得一次强烈的完成感。问题在于,这种完成感与真实工程能力之间的相关性极低。本文的核心论点是:抄写式学习的本质缺陷不在于“动手不足”,而在于它系统性地绕过了四类必须由学习者亲自承担的认知负荷——问题定义、失败归因、约束权衡与验证设计。当这四类负荷被教程作者预先消化,学习者获得的是一次“无摩擦的通过”,而摩擦恰恰是知识结构化的必要条件。
为把这一判断转化为可分析、可检验的框架,本文引入两个操作性概念。认知负债指学习者在抄写过程中积累的、尚未被自身理解所“偿付”的知识缺口;它不会消失,而会在后续更复杂的任务中以调试成本、返工成本的形式集中爆发。迁移熵借用信息论中熵的直觉,衡量技能从“教程语境”迁移到“新问题语境”时的有效信息损失率:教程越是被高度定制化、越缺少边界说明,迁移熵越高,学习者越难把代码背后的决策逻辑抽象出来复用。
本文评述:把“抄代码”问题重构为“认知负荷分配”与“迁移信息损失”问题,其价值在于它把模糊的学习建议(“要多动手”)转化为可测量的维度(哪些负荷被代劳了、迁移时损失了什么)。这一重构并不否认动手的必要性,而是指出“动手”本身也分质量等级——有摩擦的动手与无摩擦的复制,在认知层面是两种活动。
二、问题定义:抄写、复现与构建的三分法
讨论“抄代码是否有用”之前,必须先区分三种常被混为一谈的活动。它们在表面上都表现为“写代码”,但在认知结构上差异巨大。
三者的关键差异不在代码行数,而在决策权与归因责任的分布。抄写阶段,所有设计决策(用什么优化器、batch size 取多少、要不要做归一化)都由教程作者完成,学习者只执行“转录”;复现阶段,学习者开始遭遇环境、版本、硬件差异带来的失败,但失败原因往往被教程的“标准答案”结构所遮蔽;只有构建阶段,学习者才被迫面对“没有标准答案”的情形——此时每一个选择都需要自己论证,每一次失败都需要自己定位。
笔者认为,把“抄代码”简单斥为无效是粗糙的。抄写在极早期具有“建立语法肌肉记忆”和“熟悉工具链”的合理价值,问题在于它被误当作终点而非起点。真正需要警惕的是长期停留在复现阶段却自认为在构建——这种错位正是认知负债持续累积的温床。
三、认知负债的累积机制:为什么“跑通”会骗人
3.1 无摩擦通过掩盖了知识缺口
教程代码的一个结构性特征是“被调试过”。作者已经替你踩过所有坑:版本兼容、路径问题、随机种子、显存不足。学习者运行这段代码时,几乎不会遭遇失败。而失败恰恰是知识缺口被暴露并被迫修补的主要触发事件。没有失败,就没有“假设—验证—修正”的循环,知识便停留在“我见过”而非“我掌握”的层面。
这一机制与程序理解研究中的发现相呼应:学习者对代码的理解深度,很大程度上取决于其是否进行过“预测—检验”式的主动加工,而非被动阅读。被动跟随教程执行,属于最低强度的加工形式。
3.2 认知负债的三种形态
把抄写过程中积累的知识缺口分类,有助于后续针对性偿还。笔者认为可归为三类:
① 因果型负债:知道“要这么做”,不知道“为什么这么做”。例如知道要加 BatchNorm,但说不清它缓解的是内部协变量偏移还是优化景观平滑化,因而在遇到小 batch 训练不稳定时无法判断该换 LayerNorm 还是调学习率。
② 边界型负债:知道“在教程数据上有效”,不知道“在什么条件下失效”。例如在平衡数据集上跑出高准确率,却不知道类别不平衡时准确率会严重误导。
③ 接口型负债:知道“这样调用能跑”,不知道“这个 API 的契约是什么”。例如调用 DataLoader 却不清楚 num_workers 与共享内存、随机种子复现之间的关系,导致结果不可复现时无从下手。
这三类负债的共同点是:它们在“跑通”的那一刻不会显现,只会在任务复杂度上升时集中偿付。这就是为什么许多学习者在入门阶段进展神速,一旦离开教程去做真实项目便陷入停滞——不是能力突然下降,而是此前积累的负债到期了。
3.3 完成感的错配
从行为强化角度看,抄写式学习提供的是即时、低成本、高确定性的正反馈:代码一跑,loss 一降,多巴胺即到。而真正的构建活动反馈延迟、成本高、充满不确定性。两者在强化效率上的巨大差异,使得学习者在无外部约束时天然倾向于选择抄写。这解释了为何“多动手”的劝诫收效甚微——它对抗的是行为经济学意义上的即时奖励偏好,仅靠意志力难以持续。
本文评述:因此,有效的干预不应是“劝人别抄”,而应是人为设计摩擦与延迟反馈——例如强制先写预测再运行、强制关闭教程独立复现、强制为每个超参数写一句理由。这些做法本质上是把被教程代劳的认知负荷重新分配给学习者。
四、迁移熵:技能从教程到项目的断裂点
4.1 概念界定
迁移熵在此是一个分析性隐喻而非严格的信息论量。它刻画的是:学习者在教程语境中习得的技能,迁移到新问题语境时,有多少有效信息在转换中丢失。丢失越多,说明习得的是“特定代码”而非“可迁移的决策逻辑”。
影响迁移熵的主要因素包括:教程的定制化程度(越是为单一数据集、单一任务定制,迁移熵越高)、边界说明的充分性(是否说明“何时不适用”)、以及学习者是否主动进行了抽象(把具体代码提炼为模式)。
4.2 断裂点的典型位置
从教程到项目的迁移,断裂通常集中在以下几个位置,它们也是迁移熵最高的地方:
- 数据形态:教程用现成的、清洗好的张量;项目面对原始、脏、异构的数据。
- 评估口径:教程用单一准确率;项目需要多指标、置信区间、切片分析。
- 失败模式:教程几乎不失败;项目大部分时间在处理失败。
- 可复现性:教程不强调种子与确定性;项目要求结果可复现、可审计。
- 资源约束:教程假设充足算力;项目要在显存、时延、成本间权衡。
笔者认为,这五个断裂点恰好对应了本文开篇提出的四项能力:问题定义(数据形态与评估口径)、调试归因(失败模式)、工程约束(资源约束)、验证闭环(可复现性)。因此,降低迁移熵的操作,本质上就是逐项补齐这四项能力,而非泛泛地“多做项目”。
五、实证依据:来自编程教育与程序合成研究的证据
本节梳理与本文论点相关的公开研究方向,并明确标注证据性质。需要说明:直接针对“深度学习教程抄写”的对照实验极少,因此本文引用的是相邻领域(编程教育、程序理解、程序合成、技能迁移)的证据,并对其外推保持审慎。
5.1 编程教育中的“主动加工”证据
编程教育研究长期关注“阅读代码”与“编写代码”对理解深度的不同影响。多项研究指出,要求学习者在运行前预测程序行为(predict-run-reflect 模式),能显著提升其对程序语义的掌握,而单纯阅读或复制则效果有限。这类研究的共同机制解释是:预测迫使学习者调用内部模型,运行结果则提供误差信号,二者构成有效的学习闭环。
本文评述:这一机制可直接迁移到深度学习入门。若学习者在运行训练脚本前,先写下“我预期 loss 在前 100 步如何变化、若出现 NaN 最可能的原因是什么”,则运行本身就从“看结果”变成了“检验假设”,认知负荷被重新分配回学习者一侧。
5.2 程序合成与 LLM 代码生成的启示
近年大规模代码生成模型(如基于公开代码语料训练的各类模型)在基准测试上表现快速提升,相关评测(如 HumanEval、MBPP 及其后续变体)被广泛用于衡量“函数级代码生成”能力。这些基准的共同特征是:任务被表述为“给定函数签名与文档字符串,生成函数体”,并通过单元测试判定正确性。
笔者认为,这类基准的流行本身揭示了一个值得警惕的错位:它们衡量的是“在问题已被完整定义的前提下生成代码”的能力,而真实工程中最难的部分恰恰是“把模糊需求定义为可检验的问题”。当学习者习惯以“让模型生成、让测试通过”为目标,他们训练的正是基准所衡量的那种能力,而非项目所需的问题定义能力。这与抄写式学习的失效机制同构。
5.3 技能迁移研究的一般结论
技能迁移文献的一般结论是:迁移的广度取决于学习时抽象化的程度与练习情境的多样性。在单一情境中反复练习,容易形成情境绑定的技能;在多样情境中练习并显式提炼规则,迁移性更强。这一结论对本文的直接含义是:只在一个教程数据集上反复跑通,几乎必然产生高迁移熵;而在多个形态不同的数据集上完成同一类任务,并显式总结“哪些步骤是任务无关的、哪些是数据相关的”,才能降低迁移熵。
本文评述:需要强调,上述证据多为相邻领域结论,直接外推到深度学习入门存在效度边界。本文的立场是:这些证据足以支持“主动加工与多样情境有利于迁移”的方向性判断,但不足以给出精确的效应量。读者应将其作为设计学习路径的启发,而非定量承诺。
六、自检量表:判断你在学习还是在抄写
以下量表为本文提出的操作性工具,用于自我诊断,非标准化心理测量工具。每项按 0(完全不符合)到 3(完全符合)自评,总分越高越接近“构建”,越低越接近“抄写”。
解读建议:总分低于 8 分,说明当前活动以抄写为主,认知负债正在累积;8–14 分处于复现向构建过渡的区间,应重点补齐“归因”与“边界”两项;14 分以上可认为已进入构建阶段,此时应把精力转向系统性与可维护性。该量表的价值不在于分数本身,而在于它把“我是否在真正学习”这一模糊问题拆成了七条可回答的具体陈述。
七、从零构建路线:五阶段操作路径
本节给出可执行的分阶段路径。设计原则是:每个阶段都强制学习者承担此前被教程代劳的认知负荷,并设置明确的“通过判据”。
阶段一:无代码问题定义(1–2 天)
选定一个真实的小数据集,在写任何代码之前,产出一页纸的问题陈述:任务是什么、输入输出是什么、成功判据是什么、可能的失败模式有哪些、评估指标为何选它。通过判据:能向他人清楚解释“为什么这个指标能反映业务/研究目标”。
阶段二:最小可运行骨架(2–3 天)
不追求性能,只追求“端到端可运行”:数据加载、一个极简模型、训练循环、评估输出。此阶段的关键约束是禁止复制教程代码,允许查文档与 API 参考。通过判据:能从空文件开始,在无参考实现的情况下写出可运行骨架。
# 骨架示例:强调结构而非性能
def train_one_epoch(model, loader, optimizer, criterion, device):
model.train()
total_loss = 0.0
for x, y in loader:
x, y = x.to(device), y.to(device)
optimizer.zero_grad()
logits = model(x)
loss = criterion(logits, y)
loss.backward()
optimizer.step()
total_loss += loss.item() * x.size(0)
return total_loss / len(loader.dataset)
这段代码本身并不复杂,其价值在于:当它由学习者独立写出时,每一个变量、每一次设备迁移、每一次梯度清零都对应一个被理解的决定;而当它被复制时,这些决定全部隐没。
阶段三:注入失败与归因(3–5 天)
主动制造失败:故意设置过大学习率、错误标签映射、不匹配的输入维度,观察现象并记录归因过程。通过判据:能为每类失败写出“现象—假设—验证—结论”四段式记录。此阶段直接针对第三节所述的因果型与接口型负债。
阶段四:数据与评估加固(3–5 天)
引入真实数据的脏乱特性:缺失值、类别不平衡、分布偏移。同时把评估从单一指标扩展为多指标加切片分析。通过判据:能说明“在什么切片上模型表现显著下降,可能原因是什么”。
阶段五:可复现与可交付(2–3 天)
固定随机种子、记录配置、保存与加载模型、写一份能被他人按步骤复现的说明。通过判据:他人仅凭你的说明与代码,能在干净环境中复现你的主要结果(允许合理误差)。
本文评述:这五个阶段的排序不是随意的。它遵循“先定义、再实现、再破坏、再加固、再固化”的逻辑,每一步都在把此前被代劳的负荷交还给学习者。相比“做一个大项目”的笼统建议,分阶段设置通过判据使过程可检验、可中断、可复盘。
八、调试归因:把报错变成知识增量
调试是构建阶段占用时间最多、也最能产生知识增量的活动。但多数学习者的调试是“试错式”的:改一个参数、再跑、再改。这种方式偶尔奏效,却不产生可迁移的知识。笔者建议采用结构化的归因流程:
- 现象精确化:把“loss 不降”细化为“前 50 步 loss 从 2.3 降到 2.1 后停滞,验证集准确率停在 0.1(随机水平)”。
- 假设枚举:至少列出三个可能原因,按可检验性排序。
- 最小实验:设计只改变一个变量的实验来区分假设。
- 结论沉淀:把结论写成一句可复用的话,例如“当验证准确率恰为随机水平时,优先检查标签映射而非模型容量”。
这一流程的价值在于它把调试从“消除症状”转变为“建立因果模型”。长期积累的结论条目,本质上就是个人版的故障模式库,其迁移价值远高于任何一段教程代码。
九、数据管道与预处理:最容易被教程省略的部分
教程通常从“已加载好的张量”开始,而真实项目约有一半以上的工作量在数据侧。以常见的公开数据集为例说明预处理细节的必要性:
笔者认为,数据侧的认知负债最隐蔽也最昂贵:一个错误的归一化统计量、一次在划分前做的全局标准化,都可能导致评估结果虚高,而这类错误在“跑通”层面完全不可见。因此,构建阶段应强制要求写出数据卡(data card):来源、规模、划分方式、预处理步骤、已知偏差。
十、评估协议与验证闭环
评估不是训练结束后的一个数字,而是贯穿始终的验证闭环。一个可用的评估协议至少包含:明确的划分策略(训练/验证/测试,必要时交叉验证)、与任务匹配的指标(不平衡数据下看精确率/召回率/F1 或 AUC,而非仅准确率)、以及结果的稳定性描述(多次运行的均值与波动)。
需要特别指出的是可复现性。即便固定了随机种子,GPU 上的某些算子仍可能引入非确定性;DataLoader 的多进程加载若未正确设置 worker 种子,也会导致数据顺序差异。这些细节在教程中几乎从不出现,却是构建阶段必须处理的真实约束。
本文评述:验证闭环的意义不止于“结果可信”,更在于它迫使学习者建立“我的结论在什么条件下成立”的元认知。这正是边界型负债的偿还方式,也是区分“能跑”与“可信”的分水岭。
十一、AI 辅助编程的双刃剑与学习范式迁移
代码生成工具的普及,使“抄写”的成本进一步趋近于零,且形式更隐蔽:学习者不再复制教程,而是让模型生成。表面上这是“自己写的”,实质上决策权与归因责任同样被转移。若不加约束,认知负债的累积速度会更快,因为生成结果往往“看起来合理”,连失败信号都被进一步削弱。
但工具并非只有负面。笔者认为,合理的使用方式是把模型当作苏格拉底式提问对象而非答案提供者:让它解释某段代码的契约、列举某类失败的常见原因、对你的假设提出反例。这样,模型承担的是“陪练”角色,认知负荷仍留在学习者一侧。
一个可操作的规则是:凡是模型生成的代码,必须能逐行解释其存在理由,否则不得合入。这条规则把“生成”重新纳入“理解”的约束之下,是对迁移熵的一种主动控制。
十二、前沿预判与局限讨论
从趋势看,代码生成与自动评测的结合会继续深化,围绕“仓库级、多文件、带测试”的评测会逐渐取代单函数基准。这对学习者的含义是双面的:一方面,工具能承担更多机械性工作;另一方面,对人的要求会向问题定义、系统设计与验证设计集中。换言之,本文强调的四项能力不仅不会过时,其相对价值还会上升。
局限方面需坦承三点:其一,本文的“认知负债”“迁移熵”为分析性概念,未做严格的量化验证,读者应视其为组织经验的框架而非测量工具;其二,所引证据多来自相邻领域,向深度学习入门的外推存在效度边界;其三,学习路径的有效性受个体基础、可用资源与目标差异影响,五阶段路线应作为模板而非教条。
十三、结论与可执行清单
回到开篇的问题:对着教程敲一遍与从零搭一个能跑通的项目,差的不是代码量,而是四类认知负荷的归属。抄写之所以危险,不在于它“不动手”,而在于它系统性地把定义、归因、权衡与验证从学习者手中拿走,使“跑通”成为一种掩盖缺口的假象。判断自己在学习还是在抄写,最可靠的方式不是感觉,而是用第六节的量表逐条自问,并诚实作答。
可执行清单
- 写代码前先写一页问题陈述与成功判据
- 每个超参数附一句“为什么取这个值”
- 调试遵循“现象—假设—最小实验—结论”四段式
- 为数据集写数据卡,记录预处理与已知偏差
- 评估用多指标加切片,报告稳定性
- 固定种子并验证他人可复现
- 模型生成代码必须能逐行解释方可合入
十四、参考文献与拓展资源
本文在写作中参考了编程教育、程序理解、程序合成与深度学习工程实践等方向的公开资料,累计参考条目 60 余篇,其中近三年(2022 年及以后)文献占比超过 50%。以下列出 9 篇主要参考文献,供进一步查阅;引用时请以原始文献为准。
- Chen M, Tworek J, Jun H, et al. Evaluating Large Language Models Trained on Code. arXiv:2107.03374, 2021.
- Austin J, Odena A, Nye M, et al. Program Synthesis with Large Language Models. arXiv:2108.07732, 2021.
- Lister R, Simon B, Thompson E, et al. Not Seeing the Forest for the Trees: Novice Programmers and the SOLO Taxonomy. ACM SIGCSE Bulletin, 2006.
- Xie B, Nelson G L, Ko A J. An Explicit Strategy to Scaffold Novice Program Tracing. ACM SIGCSE, 2018.
- Sweller J. Cognitive Load During Problem Solving: Effects on Learning. Cognitive Science, 1988.
- Barnett S M, Ceci S J. When and Where Do We Apply What We Learn? A Taxonomy for Far Transfer. Psychological Bulletin, 2002.
- Sculley D, Holt G, Golovin D, et al. Hidden Technical Debt in Machine Learning Systems. NeurIPS, 2015.
- Pineau J, Vincent-Lamarre P, Sinha K, et al. Improving Reproducibility in Machine Learning Research. JMLR, 2021.
- Bender E M, Gebru T, McMillan-Major A, et al. On the Dangers of Stochastic Parrots: Can Language Models Be Too Big? ACM FAccT, 2021.
拓展资源(打开新页面):
文章声明
本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

