学习者的窘境:程序员如何有效学习才能有成就感

来自:技术琐话(微信号:TheoryPractice),作者:贾智文
作者介绍:
贾智文,转转高级java工程师,中生代程序员。



我是一个程序员,俗话说活到老学到老,程序员更是一个需要持续学习的职业。那么程序员该如何有效学习?这是一个需要不断思考的过程。今天分享一个我思考的模型,主要讲述如何选择学习的知识及有效学习。

 图1是一个学习的通用流程,专家或者熟练从业者从具体的行为或者经历进行总结提炼,形成一些抽象的可以复用的框架或者套路,然后学习者通过文字等媒介进行学习,有意识的或者无意识的转化成学习者自己的抽象层知识,也就是我们通常而言的学习的内化过程,再通过这些知识去解决学习者面对的具体问题。


图1


比如一些技术行业的大牛,最早接触使用缓存,这是他们的具体行为,在操作,使用,总结的过程中,不断地形成他们对于缓存的知识体系,这是抽象层。当他们把这些知识记录表达出来后,我们在学习的过程中会有一个从他们的抽象知识吸收形成我们的抽象知识的过程,这个过程依赖于方式和自身知识结构的不同,会或多或少,然后有朝一日我们再去实践,这又是具体行为了。


除了上面的模式,还有一种较为常见的是我们看到或听到一些具体行为,有意识无意识的从中总结提炼出知识,然后当我们遇到类似的情景的情况时,调用这些知识进行解决。如图2

图2


比如有时候公司出了线上bug邮件通报里面会提到一些解决过程,我就会每次比较关注一下,然后总结下遇到线上问题的排查思路,以弥补缺乏这方面实战经验的薄弱点。


根据以上两个模型,可以很好的帮助我们理解一些场合下为什么会学习效率底下的问题。

在模式一中,我们需要学习他人的知识,然后融合进入自身,再去解决问题。这里有三个要求:

R1. 需要能够融合进去自身,即你可以理解接受

R2. 需要这个知识是能够解决你的问题的

R3. 这部分抽象知识要有价值。



R1---如果你学习的东西对于你而言太过于深奥,比如你对bionioaio丝毫不懂,上手就去学习netty,那么你要么没法学会,要么事半功倍,这就是学习顺序的重要性。从图上看就是抽象层的两个圈特别远。

 R2---工作和学生时代学习的目的有很大不同,学生时代是要学习课本,而工作是需要解决问题。所以往往我们是先有了具体层的任务才需要去找寻抽象层的知识,所以学习应该搜索式,而不应该是推送式。很多你收到的推送的极其有价值的文章并不一定适合你当下。我是后端程序员,有人推荐给我一个css的经典文章,很大程度上不看是我最好的选择。顺带一提,根据你的工作需要,去找对应需要的知识,做中学,学中做效果会更好。从图3看就是你要学习的抽象知识,和你具体的行为之间是断路的。


图3


R3---技术里常说深度这个词,是否有价值就是对你而言够不够深,当然是否深是相对于你而言的。比如我订阅过一个技术专栏,可以说是食之无味,弃之可惜。时不时也会有一些有价值的知识,但是大部分时候会感觉飘飘然不知所云,这种情况下,更好地选择是选择知识密度更高的知识。




如果你是从模式二一些具体行为中,有意识无意识的提炼出了知识然后去解决问题。需要满足两点,第一这个具体行为真的有足够的价值。第二你有这个能力及时间进行提取。比如我在得到听过一个教人高效学习的精品课,有几节老师讲了很多他曾经如何高效学习的例子,但是这对我有用吗?没有。因为都是说他通过刻意练习的方式学习英语的行为故事,刻意练习我曾经听过多次,这些具体行为也很难总结出什么模式来,除非完全相同的场合,否则难以复用。这也就是很多知识付费被批评的原因之一,经常是大段充斥着励志的故事,但是可以对你产生引导的思考却很少。



需要注意的是有没有价值是因人而异的,比如具体行为中蕴含的信息你从未了解过,那么会解决你不知道的问题,比如听朋友说他在leetcode刷题,然后我也去做了很多道,比如知道了tinySpring,解决了我对spring源码入门的畏惧等等。要明白一些情况下知道就是一种价值。另一种情况是你所要面对的场景和他讲述的场景十分接近,那么也是有意义的。

 

通过上面两个模式就是希望能够让大家明白,学习的内容一定要有选择,要建立自己的信息筛子。


图4


我们抽象而成的知识有很多其实是无意识的总结而成的,学会有意识的总结会产生数量级上的区别。你总结的知识会在今后解决其他问题的时候产生有价值的帮助,会在你学习其他知识的时候帮助你理解。比如之前做一个系统涉及了很多设计方面的问题,如幂等,业务建模,一致性等。在学习reids主从同步时,就会把redis用到的很多理解和系统设计结合思考,从redis上学到的新的理解,也会在我之后系统设计时候产生指引。


说到这里不知道是否会让人有一种学习仿佛很容易的感觉,但是为什么实际学习和解决问题如此困难呢。真实场景中的问题总是复杂的,需要用到很多的知识,而你需要经历这个知识是什么,怎么用这个知识,什么时候用这个知识,为什么要用这个知识的各个阶段。比如先知道了mq是什么,然后知道了mq如何配置,如何编写代码,然后还需要去考虑mq在什么场景下使用合适,最后还要考虑如果是需要快速开发的需求能不能不用的问题,这也是你对知识认知提高的过程。

 

图5


在终身学习的基础上,筛选学习的内容,不断总结,在学习中建立自己的知识体系,新手期学习经典教科书加多实践,熟练期看书加去努力解决更多复杂问题,高手期去遍历知识领域。这样学习效率也会越来越好,在面对问题时才能做到不再杂乱无章的思考,而是很清楚需要用到哪些知识,对问题的解决能力也会越来越强。

 

推荐↓↓↓
程序员的那点事
上一篇:北上广:抱歉,这一年亏待你了,过完年还回来吗? 下一篇:互联网年度薪资报告:高开低走,屯粮过冬