读:假设与证伪——理解任何系统的方式
kqr 在 Understanding Systems 说,他从做家教的经历中琢磨出了一套可以用于理解任何系统的路子,那就是,先提假设,再想办法推翻它。文章从一个数学辅导老师的经历说起,然后讲这一套方法延伸到调代码、查网络故障等方面。
辅导不是讲知识
kqr 说,好家教大概八成精力是花在管理学生状态上的。学生没劲了就换道简单题或者聊点别的放松一下,状态来了就上点难度。两成精力才放到具体的教学活动上,核心就两步来回转,给学生出一道题,然后盯着他做。
选题是个技术活。题目不能太简单也不能太难,得卡在学生当前能力的边界上。更要紧的是,题目得能把学生脑子里跑偏的认知模型引出来(就是你以为某个概念该怎么理解,实际不是那么回事)。所以家教自己得先把题目快速做一遍,想想解题过程中哪些地方容易让人产生错觉,然后专门挑那些最容易让人掉进陷阱的题。
看学生做题的时候,家教其实是在收集信息。解题过程能体现出他脑子里的想法。有时候最终结果对了,但中间某步走得很怪,那可能就是一个跑偏的认知模型在捣乱。家教看到这种可疑的地方,就需要专门出一道题来验证一下是不是这种情况。
学会自己验证答案而不是直接对答案
kqr 特别烦学生翻书后面对答案。他觉得翻答案根本不算学习。他要求学生做完题需要自己去验证答案是否正确。
验证答案的办法有这么三种。
- 换一种方法做同一道题 ,看结果是否一致。
- 做一个合理性检查 ,凭直觉估算一个合理范围,看答案是否落在这个范围内。比如一道物理题算出一辆小汽车重 5000 吨,这显然不对。
- 递归验证 ,在多步骤的解法中,找到最不确定的那一步,单独验证它。然后找第二不确定的,依次推进,直到所有步骤都确认无误。
这三种方法没有一种是靠对标准答案。核心逻辑就一条,自己动手证明自己到底是对了还是错了,而不是靠别人来告诉你。kqr 说他的学生刚跟他学的时候,没一个人会自己验证答案。
这套方法不只适用于数学
kqr 后来在大学当计算机网络课的助教,学生在实验中遇到问题叫他过去帮忙,他都不会直接告诉学生怎么了,而是会先问「你觉得是怎么回事?」学生给出一个猜测后,他接着问「那你能不能做一个操作,让这个操作的结果只有在你猜对了的时候才会出现?」
学生想出一个验证方法,做完发现自己猜错了。然后再来一轮,猜了再验。kqr 说通过这种方法,他从来没教过这些学生任何东西,但他们自己搞明白了。
理解系统的通用套路
这就是老手理解系统的路子,不断对系统的运作方式提出假设,然后不断去验证自己的假设。数学辅导是这样,调代码也是这样。
kqr 把家教的核心概括为一句话:帮学生重新审视自己脑子里的假设,靠的是问对问题,把他们理解中出错的地方逼出来。这句话里的「学生」换成「程序员」,「家教」换成「调试」,照样成立。