ASK 模型:为什么有些东西“学”不会?
你好,我是郑晔!
通过上一讲的讲解,我们已经知道了,每个高手都有一个强大的知识体系支撑着自己不断向前。但即便知道我们知道该学什么东西,也不见得能够取得很好的学习效果。
有些东西“学”不会
我们再来看看小李的故事。
在理解了知识体系的重要性之后,非科班出身的小李决定补一下自己欠缺的基础知识。但是,真正学起来,他发现,任何一本专业教科书读起来都让人头疼,学了一段时间,收效甚微。于是,他又一次把困惑抛给了老赵。
小李:我这段时间都在看各种基础知识,但真的很让人头疼,比如,编译原理一上来就给我讲了一大堆各种范式,我都学晕了。
老赵:你是怎么学的?
小李:我买了很多教科书,然后,就开始读。
老赵:你在读教科书?
小李:学习知识不需要读书吗?
老赵:确实需要读书,但有些东西你想仅仅依靠读书可能是学不会的,编译原理就是其中一个。
小李:学不会?为什么?
老赵:因为它需要练习。
小李:练习?
老赵:没错,有些东西是知识,你知道了就好,但还有一部分东西属于技能,需要练习,计算机相关的东西里,有相当一部分属于知识与技能的结合,所以,除了要知道,更需要练习。
小李:这又是知识,又是技能,又是知道,又是练习的,这到底是个啥?
老赵:你可能需要了解一下 ASK 模型。
ASK 是什么?
ASK 模型是一个教育领域常见的模型,这三个字母分别代表了 Attitude(态度)、Skill(技能) 和 Knowledge(知识),其核心想法把不同的学习内容做了一个分类。
- 态度就是你的选择,你用什么样的有色眼镜看待一个事物。比如,作为一个 Java 程序员,面对不断升级的 Java 版本,你是选择不断追新,还是视而不见,这就是你的态度。
- 技能就是你以为你知道,但如果没做过,就永远不会真正知道的东西。比如,骑自行车,你可以去学习自行车的运作原理,但如果你不去骑一下,你就永远不会骑车。
- 知识就是那些已经被发现和验证过的规律,是确定的,不需要你再通过个人的成功或失败验证的东西。比如,1+1=2,那它不会等于 3,别抬杠,这不是脑筋急转弯。
知道了这些有什么用呢?我们需要知道,不同类型的学习内容要有不同的学习方法。
关于态度,我能给你提供的只有各种信息,比如,别人是怎么做的,这么做有哪些好处等等,尽可能地摆事实讲道理,至于最终的结果,那就是学习者自己决定的了。
假如你认为 Java 8 就是 Java 世界的全部,别人再说新版本有哪些新特性,都是无济于事的。然而,当你打开了心扉,那就有无数的新东西,等着你去学习。
技能的东西,只能通过实践掌握,无他,唯有不断地练习,才能真正地习得。就像是骑自行车,只有不断地骑,才能真正的学会。最好的练习是要有反馈的,骑车最初的反馈特别直接,骑不好,就会摔倒。
至于知识,既然是已经验证过有效的东西,我们只需要把它记住就好。对于简单的东西,比如 1+1=2,直接记忆就好。对于有一些复杂度的东西,就需要一些记忆的方法,比如,面向对象软件有五个设计原则,名字很难记,但如果我们用 SOLID 来记就简单多了。
我们常说的学习,其实是两件事,学和习。
学要有一个理解的过程,理解是帮助我们记忆的,什么样的东西可以“学”呢?知识是可以学的。而“习”则是一个大量练习的过程,什么样的东西要靠“习”呢?没错,技能是要习出来的。
理解了这一点,我们回过头看一开始的问题。
正如老赵所说,计算机相关的东西里有一部分是知识和技能的结合,也就是说,有的需要“学”,有的需要“练”。
就以前面提到的编译原理为例,无论你去看书,还是听老师讲知识点,你会很快地对其知识点有个大概地了解,但是,你依然会觉得这些东西不属于你,其中,一个关键的因素就是,我们缺少了练习。想要更好地理解编译原理,写一个编译器是最有效的方式。
估计很多人听到这个想法会吓一跳,写一个编译器太难了吧!其实,相比于过去,现在写一个编译器的门槛大幅度降低了。
一方面,现在有很多不错的资料可以参考,像上一讲提到的《自学计算机科学》,关于编译器,它推荐的材料是《Crafting Interpreters》,其中就是完整地实现了一个编译器,跟着走一遍就可以对编译器有一个完整的了解。
另一方面,我们可以借助现有的工具,无论是前端的 Antlr、Flex,还是后端的 LLVM、JVM,都可以拿过来使用,此外,在 AI 的帮助下,我们把这些工具串联起来的难度也大幅度降低了,比如让 AI 帮助实现前端的语法表达式。
应用 ASK
现在,我们已经理解 ASK 模型,那我们该如何应用 ASK 模型呢?
首先,区分学习的内容属于什么。
我们常说,算法和数据结构是程序员的基本功。我们要学习各种算法和数据结构,然而你会发现,有些内容很容易学,比如:理解各种数据结构的特性、链表是什么样子、树是什么样子,但有些东西却不是那么容易,比如:动态规划算法。
究其原因,因为它们是两种不同的东西。
数据结构和一些算法,都是已经成型的东西,是知识。我们只要了解了它的特性,就可以把这些东西拿过来用。
而且,在真实的项目中,我们通常也很少写一个数据结构,大多数情况下,都是把标准库中已有的数据结构拿过来用,偶尔需要找一些开源项目,解决一下特定的数据结构。所以,通常来说,数据结构我们是可以学会的。
而像动态规划,它其实不是一个特定的算法,而是一种算法设计的思想。即便你能够理解这种思想, 也不意味着你能写出代码来,动态规划能告诉你的是“解决一个问题的步骤”,想要写出代码来,只能靠练习。
没错,看上去动态规划是一种知识,实际上,它的知识部分很简单,而想要掌握它,需要大量的练习,这是它的技能部分。
其次,要规避学习的误区。
一个误区是把知识当技能。有一些“实战派”,总是愿意相信自己感悟的东西,拒绝接受新的事物,忽视别人已经总结出来的知识。
这一点在有一定经验的程序员中尤为常见,很多人总愿意相信自己已经掌握了编程真谛,拒绝学习新东西,比如,谈及设计就会说“高内聚、低耦合”,殊不知,这种闭塞会让他们费尽心力去解决一个别人早已解决好的问题。
另一个与之相对的误区是把技能当知识。有一些“理论主义者”,喜欢通过阅读来学习。VI 编辑器怎么用,找本书看看,IntelliJ IDEA 的快捷键是怎么回事,找篇文章读读。但是,这些内容能够给你提供的,其实只是一个练习的方法。不去打开编辑器,一点一点地练习,形成肌肉记忆,这些内容是不可能真正掌握的。
最后,态度决定一切。我们前面讨论的重点是区分知识和技能,采用不同的方式,对待不同的学习内容。但这一切的前提是,态度。
态度,是最难学的,每个人心中都有一扇门,这扇门只能从里面打开,没有人可以真正的教你。
对于一个程序员来说,新东西是层出不穷的,唯有保持开放的态度才能够不断地吸收新的营养,一个人只有这样做,才能不断地前进,不畏时代的进步。
当然,我并不建议大包大揽地学习所有新东西,没有人有那么大的精力。对于一个程序员来说,最好的做法是,秉持一个开放的态度,构建自己的知识体系,并定期地更新。
对于一个新东西,如果它能够带来新的思想冲击,多花些时间深入它,这会让你对很多事情的理解上一个大台阶。放心,这样的东西并不多。如果它是一个新的工具/框架,就看它与现有工作的互补程度,关系不大的话,知道有这个东西就好了。
学习其实只有三件事:用心学习态度,用脑学习知识,用手学习技能。用一个开放的态度,把知识学以致用,把技能练成艺术。
总结时刻
这一讲,我们讨论了很多人即便很努力地在学习了,依然收效甚微,其中的关键点是缺少对 ASK 模型的理解。
ASK 模型是 Attitude(态度)、Skill(技能) 和 Knowledge(知识)三个单词的缩写,其核心想法把不同的学习内容做了一个分类。
态度就是你的选择,技能就是你以为你知道,但如果没做过,就永远不会真正知道的东西,知识就是那些已经被发现和验证过的规律,是确定的,不需要你再通过个人的成功或失败验证的东西。
不同的内容需要有不同的学习方法。态度由自己决定,技能需要练习,知识需要学习。计算机领域很多的东西看上去是知识,其实有很大一部分是技能,所以,大量的练习是不可避免的。
应用 ASK 模型,首先,要区分学习的内容是什么类型,其次,要规避一些常见的误区,最后是态度决定一切。
如果今天的内容你只能记住一件事,那请记住,用心学习态度,用脑学习知识,用手学习技能。
思考题
我在这一讲里给你介绍了 ASK 模型,我想让你借助这个模型做一个回顾,看看自己在学习过程中,是否有把不同类型的学习内容混淆的情况,以致于影响了自己的进步。欢迎在评论区留言,让我们共同规避问题,一同前进。