我是一个程序员,俗话说活到老学到老,程序员更是一个需要持续学习的职业。那么程序员该如何有效学习?这是一个需要不断思考的过程。今天分享一个我思考的模型,主要讲述如何选择学习的知识及有效学习。
图1是一个学习的通用流程,专家或者熟练从业者从具体的行为或者经历进行总结提炼,形成一些抽象的可以复用的框架或者套路,然后学习者通过文字等媒介进行学习,有意识的或者无意识的转化成学习者自己的抽象层知识,也就是我们通常而言的学习的内化过程,再通过这些知识去解决学习者面对的具体问题。
除了上面的模式,还有一种较为常见的是我们看到或听到一些具体行为,有意识无意识的从中总结提炼出知识,然后当我们遇到类似的情景的情况时,调用这些知识进行解决。如图2
比如有时候公司出了线上bug邮件通报里面会提到一些解决过程,我就会每次比较关注一下,然后总结下遇到线上问题的排查思路,以弥补缺乏这方面实战经验的薄弱点。
根据以上两个模型,可以很好的帮助我们理解一些场合下为什么会学习效率底下的问题。
在模式一中,我们需要学习他人的知识,然后融合进入自身,再去解决问题。这里有三个要求:
R1. 需要能够融合进去自身,即你可以理解接受
R2. 需要这个知识是能够解决你的问题的
R3. 这部分抽象知识要有价值。
R1---如果你学习的东西对于你而言太过于深奥,比如你对bio,nio,aio丝毫不懂,上手就去学习netty,那么你要么没法学会,要么事半功倍,这就是学习顺序的重要性。从图上看就是抽象层的两个圈特别远。
R2---工作和学生时代学习的目的有很大不同,学生时代是要学习课本,而工作是需要解决问题。所以往往我们是先有了具体层的任务才需要去找寻抽象层的知识,所以学习应该搜索式,而不应该是推送式。很多你收到的推送的极其有价值的文章并不一定适合你当下。我是后端程序员,有人推荐给我一个css的经典文章,很大程度上不看是我最好的选择。顺带一提,根据你的工作需要,去找对应需要的知识,做中学,学中做效果会更好。从图3看就是你要学习的抽象知识,和你具体的行为之间是断路的。
R3---技术里常说深度这个词,是否有价值就是对你而言够不够深,当然是否深是相对于你而言的。比如我订阅过一个技术专栏,可以说是食之无味,弃之可惜。时不时也会有一些有价值的知识,但是大部分时候会感觉飘飘然不知所云,这种情况下,更好地选择是选择知识密度更高的知识。
如果你是从模式二一些具体行为中,有意识无意识的提炼出了知识然后去解决问题。需要满足两点,第一这个具体行为真的有足够的价值。第二你有这个能力及时间进行提取。比如我在得到听过一个教人高效学习的精品课,有几节老师讲了很多他曾经如何高效学习的例子,但是这对我有用吗?没有。因为都是说他通过刻意练习的方式学习英语的行为故事,刻意练习我曾经听过多次,这些具体行为也很难总结出什么模式来,除非完全相同的场合,否则难以复用。这也就是很多知识付费被批评的原因之一,经常是大段充斥着励志的故事,但是可以对你产生引导的思考却很少。
需要注意的是有没有价值是因人而异的,比如具体行为中蕴含的信息你从未了解过,那么会解决你不知道的问题,比如听朋友说他在leetcode刷题,然后我也去做了很多道,比如知道了tinySpring,解决了我对spring源码入门的畏惧等等。要明白一些情况下知道就是一种价值。另一种情况是你所要面对的场景和他讲述的场景十分接近,那么也是有意义的。
通过上面两个模式就是希望能够让大家明白,学习的内容一定要有选择,要建立自己的信息筛子。
我们抽象而成的知识有很多其实是无意识的总结而成的,学会有意识的总结会产生数量级上的区别。你总结的知识会在今后解决其他问题的时候产生有价值的帮助,会在你学习其他知识的时候帮助你理解。比如之前做一个系统涉及了很多设计方面的问题,如幂等,业务建模,一致性等。在学习reids主从同步时,就会把redis用到的很多理解和系统设计结合思考,从redis上学到的新的理解,也会在我之后系统设计时候产生指引。
说到这里不知道是否会让人有一种学习仿佛很容易的感觉,但是为什么实际学习和解决问题如此困难呢。真实场景中的问题总是复杂的,需要用到很多的知识,而你需要经历这个知识是什么,怎么用这个知识,什么时候用这个知识,为什么要用这个知识的各个阶段。比如先知道了mq是什么,然后知道了mq如何配置,如何编写代码,然后还需要去考虑mq在什么场景下使用合适,最后还要考虑如果是需要快速开发的需求能不能不用的问题,这也是你对知识认知提高的过程。
在终身学习的基础上,筛选学习的内容,不断总结,在学习中建立自己的知识体系,新手期学习经典教科书加多实践,熟练期看书加去努力解决更多复杂问题,高手期去遍历知识领域。这样学习效率也会越来越好,在面对问题时才能做到不再杂乱无章的思考,而是很清楚需要用到哪些知识,对问题的解决能力也会越来越强。