一个蹒跚学步场景的启发
我们家娃最近在学钱的加减,几元几角减去几元几角等于多少这种问题。在这之前,她已经学会了加减法借位等基本数学知识,但做钱的加减还是不行。
个位的元角减去个位的元角没问题,比如7元8角减去5元9角这种没问题。但是这个10元5角减去8元6角这种题目,他就不会借位了,因为她理解的借位只会像一位数借位,10元这个不是个位数,所以总是算错。
我给她讲道理呢,她就说:听不懂……
这就尴尬了,怎么讲他都不会,那就用我的老招数呗,刻意练习,我自己出了几道类似新题,让她练,还是经常算错。有趣的是,也不是每次都不对,有点六脉神剑时灵时不灵的感觉。仔细观察了一下发现呢,竟然是做过的她背过了一部分表象,比如10元减8元要借位怎么借她背过了,但出的新题里,有的题借位有的题不借位,所以就时而对时而错,不过这道理给小孩子讲了没用……
这种场景我在教毕业生学写程序时候也遇到过,有些学员多做几道题自己就悟出来了,好像开窍了一样;有些学员就背过一些表象,于是就六脉神剑时灵时不灵了。因为编程比元角计算可复杂多了,所以一直也不知道怎么破这个局。
如今这个场景又出现我眼前,以一种噪音更少的方式出现了,我依然不能通过多做同类题目的方式解决,这说明这个方向是彻头彻尾错误的。
最后我没招了,我说,来,我把我怎么解题的说一遍,你背下来。我其实也不知道为啥我要这样干,就是个脑子里突然闪过的想法,纯粹死马当活马医吧。
于是我就说,10元5角减8元6角这个题我是怎么解的呢,我们的计算规则是元减元,角减角,但因为5角减不了6角,所以要跟10元借一位,借完之后呢,10元就变成了9元,5角就变成了15角,然后15角减6角得到9角,9元减8元得到了1元,所以最后答案是1元9角。
我就让她背,背的时候,她就在借位环节问问题了,我也解答了问题,全部过程能背下来之后,她就好像突然开窍了一样,换几个题都会了。
背后的“原因”
这神奇结果让我很意外,赶紧分析了一下,为什么给这个实践会起作用。我感觉,大约的原因是,初学者由于领域知识的缺乏,他对于自己为什么不会这事是缺乏语言描述的。甚至于她到底哪个点不会都说不出来。说不出来就是在瞎做,算不得刻意练习,刻意练习非常强调针对性的专项训练,知识工作者真正需要锻炼的是大脑里思考问题的方式,只是做题,如果思路不对的话(比如中间某几步是蒙的),那真正欠缺乏锻炼的部分根本没锻炼到。但找到这个点很难,因为问题往往是隐藏在思考过程中的。
之前的实践恰恰可以针对这个问题产生影响,我给这个实践起了一个名字,叫背诵解题思路。这两个词拆开正好就是我们这个实践的两个关键点,一就是背诵,如果我们只是听一遍解题思路,会出现听起来很有道理觉得自己学到了东西但实际什么都没带走的情况,跟不明觉厉也没差多少。大家都可以自己测试一下,听起来很清楚的道理自己背一遍总会在某个地方卡壳,那个地方可能就是我们需要锻炼的点。
另一个关键点就是解题思路,这就贴合了我们的标题,什么值得背。我们在谈到教学总会比较迷信所谓循循善诱,觉得死记硬背是不好的(都市传说,背诵会扼杀创造力)。但其实记忆是一切的基础,只是要明确,我们记忆的目的是为了什么?最终的最终是为了应用,为了改造世界。我们经常背一些知识点,定理定律规则,这些东西都是死的,不能改造世界,而较少被人关注的解题思路,尤其是高手的解题思路才是改造世界的出路。人跟人思考的过程差异之大是令人乍舌的,有时即使看起来很简单的题,你看一下高手的解题思路,都会发现很大差别。各行各业的高手都是类似的,之前看过科比的一档节目,叫细节,看完之后才知道,运动员在运动场上处理的信息量有多大。
对程序员的价值
这个实践对于我们程序员有什么价值呢?在编程中,有很多问题是没有标准答案的,比如任务分解、比如软件设计等,前面说的需要学生开窍的场景其实都属此类。虽然没有标准答案,但是我们又想提高自己,就只能去学习高手的解题思路。其实,很多工程实践已经是把高手的做事方式讲给我们听了,但做的时候他们脑子里是怎么想的呢?这只有在自己做的时候自己摸索。而这个自己摸索的过程通常效率是很低的,会有很多只得其形不得其神的情况。这对团队中带人的人,像我这样需要教人工程实践的人都要面临的一个困境,很难大规模的培养出优秀的程序员。究其原因可能有很多,但魔鬼一定是隐藏在细节里,现在我觉得背诵解题思路可能是一个解。怎么解呢?
举个例子,工程实践中,tdd是最难学的一个,tdd就是高手的做事方式。最近在参与熊节的tdd练功房,有位同学就第一道最简单的题写了自己的解法:
https://www.jianshu.com/p/13d7a0a0e5be
这个解法到了后面有点过度设计,但本题练的是编程的手艺,所以重点在过程中的细节,那一个个细小的步骤,我敢说是很多程序员会忽略的。
再举个例子,面向对象封装继承多态,最难的就是封装。我们最近出了一道重构的题目给某公司,在重构的过程中要把分散的基本数据类型的数据封装成对象。分散的数据如下所示:
这个能力其实是最难锻炼的,上面这些数据谁跟谁应该封装在一起,谁跟谁不应该。这也属于没有标准答案的问题。作业结果也证明了这一点。怎么办呢?同样,可以试着背一下高手的解题思路。(想知道这个题的思路吗?等我后面的文章,没错这里是广告)
综上,对于一些实践类的内容,总是会出现不管怎么练也不开窍的情况,比如如何高效的TDD,比如软件设计。这个时候,大家可以试试让被教授的人背诵一下解题思路,说不定会有效果。