程序员思维修炼 --- 读书笔记(一)
从娄老师的信安系学生书单中发现这本书,书名虽然是“程序员思维修炼”,然而正如作者想要表述的一样,不论身处哪个行业,对大脑进行“重新设计”和“重新连线”都会对你的思考和行动产生扩散性的影响。
一、“德雷福斯技能获取模型”
新手到专家的五个阶段
①新手:
非常在乎能否成功,不知道如何应付错误和变化的情况,需要一个“指令清单”去告诉他们“遇到A了便执行B”,所谓“按部就班”。
②高级新手:
绝大部分人所处的位置,开始具有部分学习自主性(不需要任何事情都由别人给出清单),好比学编程语言开始学会使用API但是却从来不看源代码。看不见事物之间存在的联系,对“认为和自己无关”的事物并不关心。“根据需求学习新事物,但是一定程度上忽略了情境”。
③胜任者:
开始能够建立一些概念模型,能够独立解决自己遇到的问题,并且开始考虑如何解决一些自己没有遇到的问题。然而他们较为依赖经验,对于不了解的事物显得较为困惑。
④精通者:
达到这个阶段最后总要的特征就是开始自我改进,也就是能力反思和自我纠正。
关于精通者的对情境的理解,书上的例子非常形象:极限编程中提到“测试一切可能出错的东西”,这句话对于新手来说,他们不知道指的是什么,是getter & setter 还是所有的打印语句,他们并不能确定。然而精通的测试人员就知道哪些地方可能出错,通过经验和判断力,结合当前的情境,他们理解这句话的意义。
⑤专家:
专家凭直觉工作。专家知道应该关注哪些细节并明白哪些细节可以放心地忽略。他们往往无法语言叙述自己的判断,因此更偏向与直觉感受。
从新手到专家:
①规则→直觉
②考虑各个方面→关注相关方面(树木→森林)
③旁观者→系统的一部分
自己的一些感受
和大部分人一样处于“高级新手阶段”。其实对于学习我时常会陷入困惑。多年以来我有一个复习考试(其实可以称为学习)的所谓“捷径”就是通过结合题目和答案来推测解题过程,而在之后的解题中用上自己“推测”出来的方法。这种方法往往能让我在短时间内学会所谓的“解题”,但是在题目,也就是出发点发生细微变化之后,我便无从下手,更不要提这种方法的学习即时效率不错但是忘得更快了。就好比那会学习数学分析,由于平时的偷懒导致我对数学分析,对微积分没有一个扎实的、整体的概念,所谓的数学题目更像是给你一个A和公式,让你求出B,却从来不去深究公式的由来,导致A的性质变为A'时候我却求不出B'。
关于直觉,我觉得直觉还是建立在多年下来累积的大量经验,加以频繁的思考,使得人对于相应情境能够快速分析。脱离情境谈事情就是耍流氓。平时简单地开门和打开着火房间的门是完全不同的两件事情。
关于学习,有三点是我值得去注意的,一个是避免“被动地学习”,也就是需要什么知识的时候就去学习,但是从来不关心我学习到的知识“处于什么情境之下”,说白了就是把本该动态的东西静态了。比如有段时间我学习了一下设计模式,觉得这个东西非常神奇,似乎能一下让我的程序变得更加严谨,耦合度更低,代码更简洁。然后我迫不及待地想用在我的代码里,甚至一下用多个设计模式,当然结果是失败了,然后认为设计模式并没有什么卵用,也就慢慢地忘记了。当时的我已然明白哪些地方可以用对应的设计模式,然而我缺乏对情境的分析,就好像它告诉我观察者模式应该用在哪里,然而有经验的程序员明白“哪里”是哪里,我却不知道。
还有一点就是我得学会去“知道我哪些东西不知道”。书上有专门的名词“二阶不信任”来表示“不知道自己不知道”。我认为这个东西可以拿一个圆来比喻:
蓝色的一块是我所掌握的知识,黑色的一圈是我接下来一段时间学习到的知识,白色的部分(无限大)则是我所不会,同样也不了解的知识。我需要先突破我的临界圈(也就是黑色),并且同化为蓝色(蓝色部分互相联系)。然而同化为蓝色后,我的园圈外会有新的一圈“黑色”存在。圆越大,我会发现我周围的黑圈面积越大,意识到自己所不会的东西越来越多,正如书中所说,正确自我评估的唯一办法就是提高个人技能层次,这反过来又会提高元认知能力。
最后一点就是我得权衡实践给自己带来的东西。如果说实践给我带来的是固定的公式,我认为我的实践并没有什么意义,因为现实并不是理想化的。而当实践给我带来的是思维的改变,也就是说,一定程度上我具备了发现公式的能力。一年的经验重复了九次和十年的经验完全不是一回事。
当然,德雷福斯模型对于我而言依旧是新知识,理解一个模型和技能获取本身也是一项技能。我希望在以后的学习中,根据具体情况来学习如何学习。