2424 字
约 8 分钟
21
S19-A18 · 练习的设计:把输入变成动作

读了三十篇关于缓存设计的文章,遇到线上缓存问题还是先想到"重启一下"。这不是阅读量不够,而是输入没有变成动作——读的时候在"理解别人的推理",用的时候需要"自己发起推理",这两件事之间缺了一层练习。

练习的价值不在于重复次数,而在于它是否要求你做出判断并对结果负责。看十篇文章是被动的,做一次带反馈的尝试是主动的;前者积累的是印象,后者积累的是判据。


1. 练习的四个层级

层级 形式 留下什么
阅读 看文章、看代码 印象与术语
复述 用自己的话讲一遍 结构化理解
改写 在示例上做修改 局部判断
从零做 面对真实约束做决策 判据与手感

四个层级的耗时递增,但收益不成比例地集中在第三层。原因很实际:从零做需要真实的约束与场景,而多数人日常拿不到这种机会;改写只需要一个现成示例,成本一小时以内,却能触及"为什么这样选"的核心。

第三层是性价比最高的一层:在别人的示例上改一个条件,看他为什么那样写、改了会怎样。成本很低,却要求你真正理解每个选择的作用。

第四层最贵也最有效,但它需要真实场景,不能凭空制造。所以日常练习的主力应当放在第二、三层。

2. 有效练习的四个特征

特征 说明
有明确判据 知道自己做得对不对
有反馈延迟 结果不是立刻可见
有条件变化 换一个约束再做一次
有失败可能 可能做错,且错误有代价

条件变化这一项的练法可以固定下来,避免每次临时想:

// 四个常用变式,轮流套用
量:数据量/并发 ×10 或 ÷10
时:改成实时、或改成按天批量
一:把"最终一致"改成"强一致"
败:让依赖不可用,看方案还剩什么
// 每篇学过的方案,至少套用一个变式再讲一遍

第二项反直觉但重要:立刻能看到结果的练习,学到的是"试错",不是"判断"。真实工作里,一个决定的后果往往在几周后显现,所以练习也应当包含"在看不到结果时做出判断"。

第四项是练习与阅读的根本差别:阅读不会失败,练习会。失败带来的记忆强度远高于顺利,这也是为什么"做错一次"比"读对十次"更有用。

3. 复述练习的具体做法

做法 成本 效果
合上原文讲一遍 5 分钟 暴露理解的空洞
写成一段话 15 分钟 强制结构化
给别人讲并接受提问 30 分钟 暴露边界认识的缺口
写"什么时候不该用" 10 分钟 建立失效条件

复述还应当录音或写下来:只在脑子里讲"感觉讲清楚了",落到纸上才会发现断点。这个断点往往就是理解的空洞。

第四项是最容易被跳过、也最有价值的:能说出"什么时候不该用",才算真的掌握。多数阅读材料只讲适用场景,不适用场景要靠自己补。

// 复述练习的四个问题(每读完一个主题问一遍)
1. 它解决的是什么问题?(不是它怎么实现)
2. 没有它会怎样?(代价是什么)
3. 什么情况下它会失效?
4. 我现在的项目里,哪里可以用上它?
// 第 4 题答不出来,说明这次阅读还没有变成动作

4. 改写练习:改一个条件

改什么 会暴露什么
数据量放大十倍 方案在哪个环节崩
去掉一个依赖 哪部分是关键路径
增加一致性要求 代价在哪里
换成只读场景 哪些设计是多余的

改写练习要记录"改前与改后"的差异,否则会忘:

// 改写记录:三行,够用来复盘
原:SingleFlight,同 key 并发只回源一次
改:允许最多 3 个并发回源,降低锁竞争
代价:热点 key 回源压力 ×3;收益:尾延迟下降(实测约 40ms)

第三项最有效:加一条更强的约束,看原方案还能不能成立。能成立说明它足够稳健,不能成立则暴露了它真正依赖的前提。

// 改写练习示例:把 SingleFlight 的并发保护改成"允许少量重复"
// 原实现:同一 key 只有一个线程回源
// 改后:允许最多 3 个线程同时回源(降低锁竞争)
// 练习问题:这样改之后,什么场景会出问题?(答案:热点 key 的回源压力放大 3 倍)

反馈周期也可以人为缩短:给练习设一个"到期复查"。比如改写练习做完后,记一条"两周后回看这段代码还成立吗"——两周后的自己就是最诚实的评审者,而且不用约人。

5. 反馈从哪里来

来源 及时性 质量
自动化测试 立刻 只覆盖已想到的情况
生产指标 小时到天 真实但有噪声
同伴评审 天 高(能指出盲区)
事故复盘 月 最高(有代价)

还有一个低成本的高质量反馈来源:请一个不了解上下文的人读你的方案。他提出的第一个问题,通常就是你没写清的前提。

第四项质量最高,因为它带着真实代价。把事故复盘当作练习材料,是性价比最高的学习方式——它把"别人付过的代价"变成自己的判据。

// 复盘材料的用法:不要只读结论,先自己判一次
1. 只看事故现象,写下"我认为的原因与处置"
2. 再看真实原因与处置,对比差异
3. 差异点就是你的判据缺口

难度设计还有个具体做法:从"能在一小时内做完"的规模开始。一个下午做不完的练习,多数人会中途放弃,而放弃带来的挫败感会让人不再开始第二次——这比"练得太浅"的损失大得多。

6. 排错:五种"练了没长进"

现象 成因 处理方向
看过就忘 只输入没输出 加复述
会讲不会做 缺动手环节 在示例上改一处
做了但不知对错 无判据 先定"怎样算对"
只在熟悉场景能用 缺条件变化 换约束再做一次
越练越没兴趣 难度不适配 从能完成的规模开始

第五项与难度设计有关:太难会放弃,太简单会厌倦。合适的难度是"需要想一会儿,但能做完"——这与工作中的挑战区间基本一致。

7. 边界:什么情况不必设计练习

场景 为什么 做法
一次性信息(命令用法) 用时查即可 不练
已有大量实践经验 判据已成型 复述即可
与当前工作无关的领域 无应用场景 不投入
纯记忆性内容 靠工具 用检索代替

最后一条与坚持有关:练习要有可交付的产物。一段改写后的代码、一张对比表、一条"不该用它"的判断,都比"我读过了"更可能在半年后被想起——因为产物会被看见,印象不会。

还有一条与场景有关的边界:纯工具类知识(某个命令行参数)不必练,但"什么时候用哪个工具"需要练。前者用时查得到,后者是判断,查不到。

判断口径一句话:这次学习之后,我会不会做出一个与它相关的决定。会,就需要练习;不会,读一遍就够。


8. 自测

  1. 练习的四个层级中,哪一层的性价比最高?为什么?
  2. 为什么"结果立刻可见"的练习学到的是试错而不是判断?
  3. 复述练习的四个问题里,哪一题答不出来说明阅读没变成动作?
  4. "改一个条件"的练习中,为什么"增加一致性要求"最能暴露代价?
  5. 为什么事故复盘是性价比最高的学习材料?正确的用法是什么?
  6. 判断"是否需要设计练习"的那个问题是什么?
S19-A18 · 练习的设计:把输入变成动作
https://www.clxhxhhr.top/posts/6437/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。