作为程序员,我们应当如何去学习
前言
每个人想去学习一门本领,肯定需要用行之有效的方法,因为不恰当的方法,往往会事倍功半,即使你费尽心思地努力。
记得我还在高中时期,有个很要好的同桌,他那时候非常勤奋好学,晨读来得都是最早而且非常积极地朗诵诗词,但是他的语文诗词还是记错很多,导致成绩总是不理想。不单单是语文的诗词,数学也是一塌糊涂,公式和定理没用对地方,这些是因为他没努力很敷衍地学习吗?并不是,只是因为他并没找到合适的学习方法。作为他的同桌,为了巩固我们之间的友谊,我将自己的学习思路教给了他,让他知晓了学习并非一成不变、死记硬背,要抓住要领,积极实践,后来他成绩一路高涨,考上了他理想的大学。
在IT行业,技术更新迭代,作为程序员,肯定都会面临经常要学习新技术的情形,以保持自己的技术水平,能给老板和需求方一个满意的交付。所以,我们不停地在度娘里寻找答案,阅读技术文章,然后解决自己当下遇到的技术bug问题;我们为了满足老板/需求方/产品经理/上级的要求,去快速学习一门新语言/新技术/新框架;我们为了能更好地完成需求、完成项目,努力改变着自己的沉默寡言,学习着如何跟同事、领导沟通,努力让自己变得健谈起来。但是否有认真地想过,自己解决技术bug问题有没安定下来思考过以后怎么避免再次出现类似问题,有没记过笔记?自己在学习新语言/新技术/新框架的时候,有没最终真正去做过项目,造过轮子?自己在学习沟通技巧的时候,是否有克服紧张的情绪,语言是否连贯,关键时候是否能做到不支支吾吾?
白驹过隙,人生是很快的,一年五年十年后,别人做程序员财务自由了,做架构师了,但自己还在亲自写代码,为什么会这样?
其实程序员的道路,是一条学习之路,”活到老,学到老“,除非你转行或者家里有矿,不然掌握高效率、行之有效的学习方法,至关重要,这篇文章给大家列明了学习的思路,带刚入行或工作逐渐迷茫的人指明一些思路。
学哪些
计算机基础知识
目前的计算机编程语言和技术框架可谓百花齐放,百家争鸣 ,让人眼花缭乱。但 九层之台,起于累土 ,不要被新工具或者中间件迷住双眼,让自己迷失其中,什么都学习,最终全都没学好。基础知识是所有技术的基石,在未来很长的时间都不会变化,应该花费足够的时间巩固基础。
以数据结构和算法为例,大家阅读一下Java的BitSet的源码,里面有大量的移位操作,移位运算掌握的好,看这份源码就没问题。Java同步工具类AQS用到了双向链表,链表知识不过关,肯定搞不懂它的原理。互联网大厂都喜欢考算法,为了通过面试也要精通算法。
1、以python爬虫工程师应该掌握的知识为例,按重要程度排出六个梯度:
- 第一梯度:数据结构和算法、计算机组成原理、网络通信原理;
- 第二梯度:python基础;
- 第三梯度:爬虫框架(scrapy、request等框架);
- 第四梯度:结构化数据库(MySQL)、缓存数据库(mongoDB/Redis)、消息队列(RabbitMQ/RocketMQ/Kafka);
- 第五梯度:设计模式、并发处理、数据处理框架(numpy等);
- 第六梯度:容器化、大数据、AI、区块链等等前沿技术理论。
2、以Java工程师应该掌握的知识为例,按重要程度排出六个梯度:
- 第一梯度:数据结构和算法、计算机组成原理、网络通信原理、操作系统原理;
- 第二梯度:Java基础、JVM内存模型和GC算法、JVM性能调优、JDK工具、设计模式;
- 第三梯度:Spring系列、Mybatis、Dubbo等主流框架的运用和原理;
- 第四梯度:MySQL(含SQL编程)、Redis、RabbitMQ/RocketMQ/Kafka、ZooKeeper等数据库或者中间件的运用和原理;
- 第五梯度:CAP理论、BASE理论、Paxos和Raft算法等其他分布式理论;
- 第六梯度:容器化、大数据、AI、区块链等等前沿技术理论。
这里梯度举了2种语言里一些主流框架和学习内容,其实其他语言也是相似,可以类比带入其中,正常入行要到第二梯度,稳定找工作是第三梯度,要深入学习成为架构师等级起码是第五梯度,第六梯度看个人是否学有余力,可继续学习。
知识面
大多数公司招聘并无对知识面情况进行限定,只需要该程序员岗位需要的特定技能、学历的门槛,但自己所学的知识面,往往在面试期间会体现出程序员的广度和深度。
如何变得更广更深呢?需要我们挖掘自己内心真正的兴趣点,带着好奇心去学习。一段时间里,我看到有人问我:“你的兴趣究竟在哪里?”我笑而不语,我总是答道:“兴趣在网络,在我喜爱的游戏里面。”同样的,我喜爱着学技术,没错就是学习技术这个过程,从0到1掌握技术,并运用在实际中,那是一种既令人愉悦又令人兴奋的事情。
我们要摆脱自己一直是公司里默默无闻的基层,收入只有靠老板给你发的工资,提升只有每个季度或每年甚至每几年的升职加薪。一直这样规规矩矩地依照大多数人一样的方式升级,却没想着多学习提升自己,扩展视野,那肯定是不行滴。所以要给自己培养兴趣,让自己爱上学习,兴趣和好奇心是个人学习前进的动力,不要一味把编程当做赚钱升职的工具,要培养自己对编程的兴趣。可以从自己一直以来的兴趣爱好入手,比如喜欢游戏,那么尝试着自己开发一款游戏,然后把这款游戏分享给同事、朋友、同行,可以写个技术文章专门介绍这款游戏,这样整个过程你都经历了后,你会发现即使没有收获很多好评和关注,你也已经成长了,你会逐渐对技术产生兴趣。
基础学科
这里的基础学科包括英语、语文、数学,没错,就是从你从小学到高中的必学课程,为什么要强调基础学科在工作中还要去学习呢?
首先是英语,我们代码大部分都是英语,文档也是英语,英语是极为重要的基础,学好英语与掌握编程语言一样重要。且不说外企对英语的要求,许多知名博客就是把英文翻译成中文,充当知识的搬运工。如果英语足够好,直接阅读一手英语资料,避免他人翻译存在的谬误。
其次是语文,如果你要分享技术博客,分享自己的心得体验,语文写作是必不可少的,可以说现在的网络世界里,在现如今自媒体爆炸、抖音小红书知乎比比皆是的时代里,处处充饰着作文,我们程序员又何尝不需要写作呢。
最后是数学,不要以为编程就只是CURD,只是复制粘贴,要想深入学好编程,算法是必不可少的,强烈建议养成经常刷算法的习惯,可以经常在leecode里刷题,坚持一段时间你会感谢自己这个习惯的。
如何去学
搭建知识图谱
学习,一定要有自己的体系,搭建自己的知识图谱,可以使用市面上常用的思维导图工具,经常查阅自己的知识图谱,查漏补缺,偶尔也能温故而知新,如下图所示:
温故而知新
高中是我们知识的高峰,每周小考,每月大考,教材堆积如山,地狱般的反复训练强化记忆。复习是对抗遗忘的唯一方法。大脑的遗忘是有规律的,先快后慢。随着时间的推移,遗忘的速度会变慢,遗忘的数量也会减少。有些人总能够把自己一开始看过的东西牢记于心,而且还能融会贯通,但大部分人的记忆都不是永久的,一个人最多可以遗忘10年的东西,重复记忆越多,记忆越能巩固。一个刚入门的linux运维工程师,可能刚开始敲命令都要百度、记笔记,但长期敲打命令后,不用半年就能摆脱笔记和百度,快速手打。下图是艾宾浩斯遗忘曲线,表达了记忆根据时间的保留比率。
每个人的遗忘程度都不一样,建议第二天复习前一天的内容,七天后复习这段时间的所有内容,所以学习还要勤于复习,而且记忆的理解效果越好,遗忘的也越慢。
连续时间与碎片时间
如果要学好一门技术,专注是必不可少的,不少朋友利用碎片时间学习,比如在公交上看公众号的推送。其实我们都高估了自己的抗干扰能力,如果处在嘈杂的环境,注意力容易被打断,记忆留存度也很低。碎片时间适合学习简单孤立的知识点,比如链表的定义与实现。
学习复杂的知识,需要大段的连续时间。图书馆是个好地方,安静氛围好。手机放一边,不要理会QQ微信,最好阅读纸质书,泡上一整天。有些城市出现了付费自习室,提供格子间、茶水等等,也是非常好的选择。
可以在连续时间里全面学习知识,碎片时间巩固知识点,复习知识点。
学以致用
分享
学习后,去主动分享吧,无论是公司里的同事,还是在你的博客里分享,尽可能分享,享受分享。因为分享能教授他人,也能让自己的知识留存,这比自己闷声造车好太多了,学习内容是有平均留存率的,如下图:
准备一份ppt,并与同事分享你的技巧。既复习知识,又锻炼口才。我曾经有一个同事,他说话很匆忙,口头禅很多,比如“对,对”,常常听不清,但他并没有被打动。领导多次让他分享这项技术,观众的反应是可以预见的,所以他充分认识到了缺点。
坚持写技术博客,别在意他人眼光,也别在意类似的文章别人已经写了成千上万遍了。只有当你真正开始提笔,畅享写作的快感,让自己文章更加通顺易懂,尽可能换位思考,给不懂的人保姆式的教程,相信我,你会愈发享受这个过程。而且坚持下去,你会得到更多的支持和粉丝,这会让你更有动力。
实践
实践是检验真理的唯一标准,既然学会了,学通了,就要开始搞项目,搞框架。虽然我们常常强调不要重复造轮子,但为了更好地了解学到的知识,还是有必要造轮子的,可以自己写个demo,去更好熟悉技术,然后将所学的技术运用到实际项目中,让自己真正掌握这门技术,因为只有真正使用所学的技术,才会踩到坑,才会去频繁百度和搜索文档,最终踩了无数个坑后,成功掌握技术,这样的过程经历多了,才能成为技术大神。
本文原创作者:奇想派、一名努力分享的程序员。
文章首发平台:微信公众号【编程达人】