你有没有想过这样一个问题,我们从小到大学了十几年英语,为什么最后却只落得一个哑巴英语?
关于英语,我们一定学了很多东西:一大堆单词和惯用法、各种时态等等,然而,真正面对一个外国人的时候,我们往往是不知所措,不知道该怎么用英语进行交流。
我们当然有理由抱怨教育制度的种种问题,但我这里想说的是,之所以我们不能很好地使用英语,根本原因在于,英语是 “学” 不会的。
想要真正理解这句话的意思,我们需要知道 ASK 模型。
ASK 是什么?
ASK 是三个单词的缩写,分别是 Attitude(态度)、Skill(技能) 和 Knowledge(知识),这是在教育培训领域一个常见的模型,它把不同的学习内容做了一个 分类。
什么是态度?态度就是你的选择,你用什么样的有色眼镜看待一个事物。比如,作为一个 Java 程序员,面对不断升级的 Java 版本,你是选择不断追新,还是视而不见,这就是你的态度。
什么是技能?技能就是你以为你知道,但如果没做过,就永远不会真正知道的东西。比如,骑自行车,你可以去学习自行车的运作原理,但如果你不去骑一下,你就永远不会骑车。
什么是知识?知识就是那些已经被发现和验证过的规律,是确定的,不需要你再通过个人的成功或失败验证的东西。比如,1+1=2
,那它不会等于 3,别抬杠,这不是脑筋急转弯。
知道了这些有什么用呢?我们需要知道,不同类型的学习内容要有 不同的学习方法。
关于态度,我能给你提供的只有各种信息,比如,别人是怎么做的,这么做有哪些好处等等,尽可能地摆事实讲道理,至于最终的结果,那就是学习者自己决定的了。当你认为自己已经掌握 Java 世界全部的真谛,别人再说什么,都是无济于事的,而当你打开了心扉,那就有无数的新东西,等着你去学习。
技能的东西,只能通过 做 来掌握,无他,唯有不断地练习,才能真正地习得。骑自行车,只有不断地骑,才能真正的学会。最好的练习是要有反馈的,骑车最初的反馈特别直接,骑不好,就会摔倒。
至于知识,既然是已经验证过有效的东西,我们只需要把它记住就好。对于简单的东西,比如 1+1=2
,直接记忆就好。对于有一些复杂度的东西,就需要一些记忆的方法,比如,面向对象软件有五个设计原则,名字很难记,但如果我们用 SOLID 来记就简单多了。
我们常说的 学习,其实是两件事,学和习。学要有一个理解的过程,理解是帮助我们记忆的,什么样的东西可以学呢?知识是可以学的。而习则是一个大量练习的过程,什么样的东西要靠习呢?没错,技能是要习出来的。
理解了这一点,我们回过头看一开始的问题。
我们“学”了十几年的英语,但我们能掌握的只是知识的部分,而使用英语进行交流,这不属于知识,而是技能。技能则要靠大量的练习,而我们整个的英语教育过程中,这种练习往往是很缺少的,想掌握一门技能,没有足够的练习是不可能的。所以说,英语是“学”不会的。
应用 ASK
现在,我们已经理解 ASK 模型,那我们该如何应用 ASK 模型呢?
首先,区分学习的内容属于什么。
比如,我们常说,算法和数据结构是程序员的基本功。我们要学习各种算法和数据结构,然而,你会发现,有些内容很容易学,比如,理解各种数据结构的特性,链表是什么样子,树是什么样子,但有些东西却不是那么容易,比如,动态规划算法。究其原因,因为它们是两种不同的东西。
我们学习的数据结构和一些算法,都是已经成型的东西,是知识。我们只要了解了它的特性,就可以把这些东西拿过来用,而且,在真实的项目中,我们通常也很少写一个数据结构,大多数情况下,都是把标准库中已有的数据结构拿过来用,偶尔需要找一些开源项目,解决一下特定的数据结构。所以,通常来说,数据结构我们是可以 学会 的。
而像动态规划,它其实不是一个特定的算法,而是一种算法设计的思想。即便你能够理解这种思想, 也不意味着你能写出代码来,动态规划能告诉你的是,解决一个问题的步骤,想要写出代码来,只能靠练习。没错,看上去动态规划是一种知识,实际上,真正掌握它唯有练习,这是一种技能,是要 练习 的。
其次,要规避学习的误区。
一个误区是 把知识当技能。有一些“实战派”,总是愿意相信自己感悟的东西,拒绝接受新的事物,忽视别人已经总结出来的知识。这一点在有一定经验的程序员中尤为常见,很多人总愿意相信自己已经掌握了编程真谛,拒绝学习新东西,比如,谈及设计就会说“高内聚、低耦合”,殊不知,这种闭塞会让他们费尽心力去解决一个别人早已解决好的问题。
另一个与之相对的误区是 把技能当知识。有一些“理论主义者”,喜欢通过阅读来学习。VI 编辑器怎么用,找本书看看,IntelliJ IDEA 的快捷键是怎么回事,找篇文章读读。但是,这些内容能够给你提供的,其实只是一个练习的方法。不去打开编辑器,一点一点地练习,形成肌肉记忆,这些内容是不可能真正掌握的。
最后,态度决定一切。
我们前面讨论的重点是区分知识和技能,采用不同的方式,对待不同的学习内容。但这一切的前提是,态度。
态度,是最难学的,每个人心中都有一扇门,这扇门只能从里面打开,没有人可以真正的教你。
对于一个程序员来说,新东西是层出不穷的,唯有保持开放的态度才能够不断地吸收新的营养,只有这样才能不断地前进,不畏时代的进步。
当然,我并不建议大包大揽地学习所有新东西,没有人有那么大的精力。对于一个程序员来说,最好的做法是,秉持一个开放的态度,构建自己的知识体系,并定期地更新。
对于一个新东西,如果它能够带来新的思想冲击,多花些时间深入它,这会让你对很多事情的理解上一个大台阶。放心,这样的东西并不多。如果它是一个新的工具/框架,就看它与现有工作的互补程度,关系不大的话,知道有这个东西就好了。
小结
学习其实只有三件事:用心学习态度,用脑学习知识,用手学习技能。用一个开放的态度,把知识学以致用,把技能练成艺术。