《程序员的自我修养》前三篇主要是写了一些观点类,非技术学习类经验分享。本篇开始会重点讲下学习方向、学习方法等,因为之前的整理过相关的内容,在提及相关内容的时候引用之前为主,本篇重点以学习方法为主。 编者按
学习方式
在之前信息采集中很多小伙伴提及到的问题是,怎么快速学习,找不到方向、动力,怎么才能达到公司的招聘标准。
就单纯的入行来说,基本分为自学和培训两个方式,很多人包括我是通过培训入行的,不过本身我也是通信工程专业的,属于计算机专业,只不过是大学是基本没有正八经听课,然后参加了培训班速成。
之前很多次讲过一些培训班的优缺点,不太过多的赘述,总之一句话,适合自己的就是ok。假如选择培训班,就跟着老师好好学习争取赚回学费。
具体各地线下培训班因为各个培训机构、各个地方的收费不同,有很大的差异,也不能一概而论,我也没法给出具体的推荐那个。如果你要参加培训班的话,可以问问之前当地学长学姐的选择,再者就选择一些互联网上口碑好点的。毕竟很多的培训班一期收费就是两三万,也不是小数目,货比三家在购买。
如果要选择自学的话,很大的困难只是在于选择上。有的内容现在公司生产上已经不用了。像3年前,你就算是不会分布式微服务,会用SSM框架也还能找个工作,但是现在一线公司基本上都是用微服务来构建系统,所以在选择学习的重点上可能会有一些难点,很容易学了一些并不是很常用的内容。
对于是自学还是报班,我个人没有统一的意见,每个人的情况不一样,根据自己的能力和兴趣来选择。
不过需要重点说一点的是,不论是哪种方式,只是带你打开代码世界的大门,你能在这条路上走多远,都是靠自己学习能力,接收新事物的能力,如果不能学会对于技术的自我迭代,就算是詹姆斯高斯林(Java语言之父)亲自来教你,还是很难。
学习方法
确定方向
对于没有目标的人,你往那个方向走都可能是错误的。很多小伙伴说就业的时候迷茫,是不知道怎么选择而已。
选择伴随着一定的机会成本,俗话说,男怕入错行,女怕嫁错郎,说的这就是机会成本。学前端还是后端,学Java还算是Python,工资高不高,好不好找工作等等。你怕选择的并不是收益最高的,而你丧失掉的那个就是你的机会成本。
机会成本就是在于你并不知道你目前做的选择是不是最优解。看着现在Python很火,结果你去培训学习了Python,结果一年后Python不火了,薪水直线下滑,反而Golang火了起来。那么当时你付出的机会成本就是没有选择学习Golang。当然我只是随便举个例子,并不是真实发生的事情。
其次很多已经选择在做测试,做运维的小伙伴想学习一下Python 做一些自动化测试或者运维,而也会仅仅只是停留在我想学习XX语言一样,这个迷茫程度跟我要学英语一样。
在学习方向上,多数人的迷茫在两个点,一个是不知道学啥好,二个是确定了学习方向,不知道怎么去学习。
如果目前的身份是大学生(研究生),有一些充足的时间来学习,那么我个人倾向就是选择一些你感兴趣的方向,参加一些比赛之类的活动,我就读的专业(通信工程)比较有名的电子设计大赛,软件工程的可会有一些数据挖掘方向等等。参加比赛的目的并不在于获得多少奖项,而是在这个过程中锻炼你的动手能力,而且学习哪门语言也并不是很重要。
为什么推荐参加这些比赛,因为我觉得很多人没那么自觉,就像学英语一样,如果大学里不需要四六级就可以毕业,英语可以做为选修学分,你是不是就可能不会去学习英语了。编程语言也是一样,给你自己具体的目标才会做下面的事情。
同样,如果当下的目标是想找一个程序员的工作,那么就调查一下目前市场就业情况,爬取招聘软件的某个岗位的JD,分析下目前需要那个技能,然后一个一个的攻克学习。最后找到工作就是你的目标。
这也是SMART法则中的具体性原则(Specific)。
目标明确后,就开始学习一门具体的语言。本身我是做Java程序员,后来也学习过Python,这在之前已经整理过相应的内容
以上学习路线供参考,有时候会根据你的目的不同,有所删减或增加。
自我驱动
想要在程序员这个行业一直待下来,没有一些自我驱动力还真的有点吃力。自我驱动,就是那种你可以自发的去干某件事情。像是在学校的时候,老师还会盯着你学习,还会有考试。当你没有了任何外界压力的时候,是否还是会付出时间和精力去做认真学习,对于大部分人来说是挺难的。
除了自我驱动,还有外界驱动。我当初从青岛来就是因为青岛软件开发行业工资水平实在是太低了,根本不够还房贷的。迫于现实的压力,选择了去一线城市工作,这样挣一线城市的工资,还二线城市的房贷,压力小一些。那为了能在一线城市找到个工作,我也是从头开始准备了小半年。在青岛的公司还是用一些单体架构,当时微服务已经刚需,所以一边看着视频,一边瞧着代码,突击强制自己学习。
来到上海左右投简历,经过了1个周的面试,拿到一份我满意的offer。自此之后,就开始懈怠了一段时间,就跟完成了一次大考一样。
在去年的时候,觉得Python 挺流行,完全出于业余兴趣,在国庆假期期间,自己动手撸出来一个小demo,就是之前分享过源码的沪漂小窝。
之后靠着帮别人抓取数据,处理数据的小私活,前后挣了大概1w左右,也不是很多,后来觉得性价比太低,就转方向去做的事情,但是这个体验还是给我带来很大的收获。
增加反馈
很多人觉得学习一门语言难,很大的原因是投入到产出太慢了,包括就是上培训班,也需要在3-6个月之后。在这其中的很大的一段的时间是感觉不到自己学习到什么东西,不知道这个能挣多少钱,不知道能不能找到一份工作。
这时候就需要参考一下一款游戏——俄罗斯方块,原因就是反馈太及时了。我只要拼装完整的一行就是消除得分,根本不需要等待。学习到这个方法,学习编程也是一样,把一项很大的任务具象化,把学会一门语言改拆分成每一个可以反馈的动作。
这样能大大提升出自己的兴趣,人好像是只有天生对于玩感兴趣,而其他的是经过后台培养。有时候不是你觉得代码写起来没意思,学不下去,写了忘,忘了写,是找到一个适合自己的兴趣点。
SMART学习法则
SMART法则不仅用在学习编程语言上,包括写简历、做报告上,使用这几个指标制定出相对客观的实现计划。
1.具体性原则(Specific)
你说我要学英语,我要学Python。这么说没问题,但是这个问题关键点就是很虚。目标不具体,你看了这句话,你根本不知道要干啥。换一种说法,我要改善发音,我要学习英文写作,我要学习爬虫,你会发现,哎,现在感觉有入手的点。
模糊的目标是一团干草,当你扔出去的时候,就散了,花点时间把干草变成石头。
2.可衡量性(Measurable)
很多人学习编程的目标是:学会Python。怎么样才算是学会,会写HelloWorld?会写Airflow框架,还是会写源码。学会某一个语言是自己的主观感受,自己的感受不能依照客观的事实来评判。
实现一个目标一定是可衡量性的,可量化的。比如学习爬虫,完成某某网站1W条数据。衡量的一定客观可以评价的,真正的把代码写出来,bug修改到位,才可说这个知识点我掌握会了。
3.可实现性(Attainable)
很多人经常问我的是怎么快速的掌握一门语言。先不说的别的,就单从学习技能角度是遵循着能量物质守恒的客观规律。
在制定相应的目标时,一定会遵循着可实现的原则,不是上学的时候,老师问,你们的理想大学是什么,班里的人一半是清华,一半是北大。还有像问我如何一个月内学会XX,也是让我无从回答,问问题也是一样,问对问题,你就已经有了一半的答案。
计划的可实现性,不仅仅在于不能超出实际,也不能说范围太小。如果只是想学习一个月,会输出个Hello World就行,少儿编程也不会这么简单。
4.相关性(Relevant)
我有一个很奇怪的问题就是,很多人问我问题的时候,我在简介里很明确的说了,我是做Java的,偶尔也是搞搞Python,很多问我前端的问题,C 的问题,嵌入式的问题,我只能说这不是我的能力范围内,给不出具体的解答。
学习编程是一样,所有的计划要跟自己的目的相关。就跟自己出发的时候定下的目的地一样,有些人走着走着,不知道当初要去哪里,更不知道当初要为何而出发。
5.时间限制性(TIME)
有木有时间限制,是目标和梦想最大的区别。
给自己时间紧迫感,这点在培训班上胜过自学的,不过我们更希望是自我驱动去学习,而不是因为被动的任务而去学习。
核心技能点——动手写
编程语言学习思想跟使用的语言是一样的,当初我们学说话,学英语的时候,是父母老师一遍一遍教着读写。换到编程语言时候,怎么就不会了呢?
如果说,让我讲三个字怎么学习一个编程语言。
那就是,动手写。只看不写,只是在安慰自己在学习,一点效果的没有。
多做技术分享
从下面这张图我们可以看到,教授他人是知识留存率最高的方式准备PPT和演讲内容,给同事来一场技术分享。
不光复习知识,还锻炼口才。曾经有个同事说话又快又急,口头禅也多,比如“对吧、是不是”,别人经常听不清,但是他本人不以为然。领导让他做了几次技术分享,听众的反应可想而知,他才彻底认清缺点。
经常写技术博客,别在意你写的东西在网上已经重复千百遍。当自己动手的时候,才会意识到眼高手低。让文章读起来流畅清晰,需要呕心沥血的删改。写作是对大脑的长期考验,想不到肯定写不出,想不清楚肯定写不清楚。
最后,我所总结分享的点,并不足以覆盖整个编程语言的学习,仅供参考使用。
我是马拉松程序员,可不止于代码。