在《构建之法》一书中作者提到了魔方的故事,读完之后脑子里顿时豁然开朗,一下子明白了技能的层次以及自己现在的问题所在。
故事是这样的: 大概在我小学五年级的时候,大家开始玩魔方,我们家也买了一个。我和几个小孩折腾了一会,没搞出什么名堂。我哥哥却很快弄出一面一样的颜色。后来我也琢磨出来了这一步。再后来我才知道魔方有一些模式和一些口诀,按图索骥,依口诀而行,就会从一面玩到一面再加一层,再到加两层,然后把最上层四个角的颜色搞对,然后再按照一两个口诀翻十几下,六面就做好了!我玩着玩着,就把各种模式和口诀都掌握了。上初中的时候,我还在课间表演过,赢得一些男同学的好评,
女同学似乎对此不感兴趣。要在当时,我的简历一定会在“技能”一栏写上:
“精通玩魔方。”
后来我就不玩魔方了,这样过了好多年。不久前我在一个实习生的桌上又看到了魔方。我拿起来,似乎不用想,当年的口诀就在手上。转啊转,一面,一层,两层,那个男实习生露出崇拜的目光……直到最上一层,嗯,口诀是什么来着?我试了几种可能,好像都不行。我看到周围的女实习生似乎不感兴趣,那就算了吧。
看来我的简历要改写成:
“精通玩魔方,只到第二层。”
后来我想,把第二层拼好,我只知道找到某个模式,按照某个口诀执行即可。但是我并不了解为什么这个口诀能把第二层拼好,同时又不打乱第一层的结果。我更不知道如果在执行中走错了几步,如何随机应变,挽回局面。离开了口诀的话,我只能把魔方的一面拼出来。从这点来看,我的魔方技能应该是:
“能够独立地还原一面,其他看口诀可搞定。”
从故事中邹欣老师层层剥析,将自己真实的技能解析出来,从而明白自己真正的技能层次,而不被表面假象迷惑。编程技巧就如同魔方技巧,当你认为你已经掌握了某项技能时,你有没有深入分析过自己所谓的掌握?前段时间,通过一些现成的爬虫代码和教程再经过我的二次修改完成了很多事情,一度我以为我知道了爬虫的技巧。可是深入分析后才发现,自己才了解几个库,对文档格式的处理困难,正则表达式一塌糊涂。充其量只能算是能够独立修改代码,其他看教程可搞定。那么我这真实的水平有什么可骄傲的呢?值得说出来吗?
答案当然是不能,那么什么才是”技能“?计算机科学家bill buxton说技能的反面是”Problem Solving“。完全赞同这个观点,在我看来,技能就是为了解决问题。而且我们不能花费太多的时间在低层次的问题上,要将解决这些低层次问题变成一种机械化错误率低的过程,然后才有时间和脑力解决较高层次的问题,当然做到这种的前提是足够的练习。就如同ACM的刷题一样,在初期刷题的过程中,经常会因为代码的错误书写,符号的缺漏出现问题,浪费大量时间,不能把时间用在ACM真正考察的算法中;但是经过一段时间的刷题后,便能逐渐养成良好的代码习惯已经输入习惯,时间全部用在题目的算法设计上。
我们可以将问题分成三个层次
低层次问题(变成自动操作)精通
中层次问题(花脑力解决)学习中
高层次问题(无暇顾及)不宜号称”精通“
作者在书中又提到魔方的层次:听说过魔方的玩法,理论上了解(已经知道:通过扭动魔方的各个层面,直到六面出现一样的颜色为止)
对口诀知其然,能在实践中根据某种口诀玩成六面(作者达到了这种水平)
对口诀知其所以然,能够根据情况加以变化
同上,唯手熟尔。几十秒就可以搞定的(学校冠军们达到了这种水平)
同上,但是转得特别快,十几秒就能转好的那些人,还能有一些例如闭眼睛还原魔方的绝技的(世界冠军们达到了这种水平)
能够设计出新型的魔方
同理,在我看来对于计算机编程来说同样能分为6个层次,尝试-了解-入门-熟练-变化-创造。只有达到懂得变化,能化腐朽为神奇才能真正称的上精通,至于能够创造新的轮子的便足以称为大师了。作为一个计算机系的学生,我们不能满足于前三个层次,而是要不断追求更高的层次,掌握真正的技能,上的了台面的技能。