程序员工作后如何有效的学习

工作三年多了,做技术不能只顾埋头搬砖,也要定期回顾,思考未来,不要让自己成为那种一年经验用了十年的开发者,这点要时刻提醒自己。做IT的很多人都只看到了高薪,其实跳槽的也大有人在,之前的同事,很多有能力的小伙伴都离职了,去百度搞云计算的,去阿里搞AI的,去大疆的,去美团的…对自己有触动吗?那是肯定,没有才是假的,但是自己却在舒适区里天天按部就班的过着,绩效薪水都还不错,但是技术能力呢?本来就不高,还遇到提高瓶颈了,囧~ 反观周围的老同事,好多搞管理了,带版本管项目。。。既然想走技术路线,就该好好想下工作后如何有效的学习了。

工作中积累的局限

从自己的工作谈起,三年多菊厂Linux C/C++通信软件开发,第一年收获最多(可能因为自己自动化出身CS基础太差),工作需要的编程方面技能补齐后,就可以很好的应对业务需求的开发了。「工作后,你只需要比大家多努力10%,回报则胜过50%」,亲身体会真是一点不假。工作后,稍微深入点知识的学习都只能靠自己。观察周围同事,对技术很有热情的并不是很多,除了一些专家大牛,很多老员工单就技术能力而言跟入职两三年新员工的技术能力没什么差距,我思考了下原因,大概如下:

工作所用到的技术知识有限,很多人也没有去深入了解背后的原理; 业务代码对算法的锻炼不太够,时间长了算法能力会减弱;
没有那么多特性会给你架构设计的机会,并且架构都是专家定好的; 不去主动拓宽知识面,去学习新东西,技术栈长期不更新;
基础知识掌握的不够透彻与深入,毕竟经典是需要反复研读理解的;
我工作这三年觉得自己收获的最有用的经验就是:问题定位能力,提前识别坑,快速填好坑。当然,也见识了一些优秀架构的设计,但也仅限于见识与使用。

工作外有效的学习

先说说我自己平时工作之外的学习,基本就是下面的三项:

看看书和网上的文章:工作相关、兴趣爱好、技术热点; 动手实践并总结博客:类似课后题和课程设计,实践总结;
刷刷LeetCode算法题:提升算法能力和写代码的手感;

自己的学习个人认为还是有效的,学习成长自己是能体会的到的,并且工作也做的不错,只要稍微比同事多努力一点,就能有很多回报,工作后真的是这样。但是呢,自己的水平自己清楚,并且自己的努力程度远远不够。看一个大牛的心得《如何成为一位技术专家》:

如何成为一个技术专家?答案其实很简单,努力学习。
从学生时代一路万马奔腾而来,什么时候努力的效果最差,高三的时候,因为大家都是如此努力,工作后,你只需要比大家多努力10%,回报则胜过50%,不止在技术上,其他领域也是如此。
《最牛B的编码套路》一文提到了技术上的训练方法:预期留出时间,集中锻炼,留出技术梯度,时刻关注自己有完成目标,到达瓶颈。
程序员最重要素质是“不断努力学习”,要不断地挑战自身能力之外的东西,运动爱好者们经年的跑步锻炼,可是仍然跑不过刘翔,业余象棋看上几千盘,仍可能被一个初出茅庐的棋院学生杀个大败。不断努力学习,不断训练,在于发现短板,并有针对性的提高。
套路一文提到了很多训练方法,其实我很赞同最后的两个方法:1. 写博客;2. 参与开源项目。
关于写博客,牛人们是非重点不写,自己则没必要非得高大上,还要解释一下,个人感觉刚开始写博客则是要养成定时习惯,有什么写什么,虾米再小也是肉,这个月不写,下个月要补上。当然中间的区别是,现在我是写给自己看的,牛人们是传播知识。
参照大牛的文章反观自己:开源项目没参与过,这点自己有待提高。对于写博客我比较认同大牛的看法,写博客也就是记录总结下自己学习笔记,方便自己回顾查看,没必要想着多高大上,自己也就一水平普通的程序员记录点东西而已。之前在知乎看过一个问题,是关于微软一员工和Facebook一员工PK的,觉得很有意思,我很欣赏里面@古轮木的拖拉机的一个回答,摘录部分:

老乡,江汉臣,他在一个回答里说自己得清华特奖的经历是”下课做很多题目,然后提前看一些考研的题目,然后就超过了同班的同学,可以去帮助他们”,体会一下,特奖诶,清华诶,课下不应该去读普林斯顿数学讲义实现突飞猛进么,考研试题什么回事,太low了吧,清华peer pressure这么弱的么,实际上这一点都不low,这叫”祛魅”,这叫”平实”,你看ZB就从来不说自己是怎么学习的,他说自己是天才嘛,可能用的是记忆面包,所以我们快来膜拜他。
作者要表达的是什么?大牛靠的也是科学的方法和踏实的努力。吹捧神化之类的真的也没必。不盲目崇拜,不妄自菲薄,踏踏实实学习,博客写的东西简单不low,LeetCode题目做不出来也没啥,静下心来学习就是了。天才是极少数,大部分牛人还是厚积薄发一步步积累出来的,靠的还是朴实科学的方法,再加上多一些勤奋。在关于LeetCode刷题难不难时,很多北美FLAG员工也现身说法了,初期都会难,练的多了就好了。自己知道的读书时的大神,工作后的大牛同事,靠的都是平时踏实的努力。

关于LeetCode刷题

单独把刷题拿出来说,是因为刷题真的很重要,而且很有用。作为一名developer,最本质最核心的工作就是:用代码把功能特性给实现,能够使用合适的算法,快速写出尽量bug-free的代码!工作三年来,我LeetCode其实没刷多少,100道都还差的远,真是惭愧。不过公司内部的OJ刷了100多道,因为是转正要求,相比LeetCode水了点,囧~~ 。虽然自己OJ刷的不多,但是仍然可以明显感觉到刷题让写代码的手感提高不少,也可能是因为自己当时太菜,再次囧~~。在知乎上有这样一个问题:刷 LeetCode 吃力正常吗?, 很多答案都写的很好。@Coke Zero的答案是说方法的,我个人很赞同:

不要贪图数量,刷300-400题足以干掉FLAG,每个tag精选5-10个代表题目足矣,没必要每个都刷。
对于精选出来的经典题目,要反复熟悉。反复的意思是能背下来……对,我们智商低的人就是这样的(挺胸抬头)。当然,是背思路,不是背代码。这里推荐用Python刷题,因为Python比较方便把代码直接翻译成思路,Java容易被语言细节缠绕而迷失思路。如果对其他语言能熟悉到思路无缝转换的程度也没问题。 // PS: 个人认为作为一个C/C++ coder还是用C++吧。
怎么背思路呢?推荐一个背单词利器——艾宾浩斯曲线app,比如iPhone上的memory helper之类。把刷过的题号输入进去,每隔一个艾宾浩斯遗忘节点,就提醒你一次,然后在脑中回忆思路,回忆不清楚的拿出来再看一遍。回忆几次以后,有时间就再写一遍熟悉代码。
死记硬背带来理解。背多了,你会发现各个tag的本质,及其之间的联系。比如麻烦的backtracking(Google特别爱出),这东西的本质是什么,跟recursion、dfs、dp之间是什么关系?为什么它的复杂度总是指数或更大,原因是什么?然后你打开算法导论(或stackoverflow)发现了新世界……原来backtracking说的是全部解空间的穷举搜索,既然是穷举当然很慢,但它思路其实非常直观,和linear search一样都是一个一个搜过去而已。所以,下次看到全部解空间穷举类问题,就可以先想到basic backtracking,穷举一遍,然后再想怎么优化。类似的哲学性总结很常见,随便翻开一本面试辅导都能看见一大堆,但不经历自己想自己写并在反复死记硬背中熟练的过程,那些结论是没有意义的,即使记住了,一阵不练也忘了。很多人说死功夫下多了就开窍了就是这个意思。当然,有的人完全没有举一反三的能力,但大部分人是有的,所以反复熟练经典题之后,可以解决掉新题。// PS: 很有同感!
如果有时间还可以联系一下算法题和其他CS知识,绝大部分算法题都来自实际应用。比如Trie, LRU, HashMap,图论这些都是和industry应用联系很紧密的。知道应用背景,就会发现LC上的题都是最最最最简单的浓缩版,心态上就没那么畏难了……
如果有条件,反复刷一年甚至两年是最好的。见过它十遍以上的时候就不觉得它有多难了,即使细节不记得了,心态上不会怕。
尽量不要停止刷题,每天都做一道,实在没时间做也一定要拿出艾宾浩斯app回忆一下。不要一天10道,没有意义。一年,两年,三四年后,就渐渐不拿这东西当回事了,来新题也能马上crack。即使转cs,也有一两年时间来熟悉算法题。我觉得刷题应该piecemeal,尽量早开始,坚持到退休,这个是吃饭的手艺,就像witcher的剑:一个猎魔人可以不吃饭,不睡觉,但不能不时时擦拭自己的剑。
定期刷题,是做的针对性训练,这个是一般项目给不了的。CoolShell博主,前阿里P9,陈皓2018年都还时不时的刷题,更新自己的Github-repo: LeetCode, 让人十分钦佩。

关于学习的时间安排

扫描二维码关注公众号,回复: 3413590 查看本文章

技术的学习,不像是背单词,可以零散着来,需要有完整的大块时间集中注意力去学,尤其是啃硬骨头时。很多难点都是靠长时间专注思考突破的,如算法的学习,一些OS底层知识点,最近大热的机器学习等。

记得自己当时理解函数调用栈的内存布局,寄存器rbp如何一个指另一个,现在看很简单的一个知识点,但是自己当时也是集中思考了很久才彻底搞明白的,关于如何从栈空间连续的二进制内存中还原出调用栈帧结构,也记录了一篇博客《Linux C函数调用栈帧结构》作为笔记。

所以,对于技术的学习,要做到长时间的专注。如果不能做到长时间的专注,那么学习的效果就要大打折扣了,知乎上一个问题:如何做到长时间(4 个小时以上)精神专注?,里面@Will Zhang的回答我非常赞同。PS: 赞同来自己的经历和亲身的体会,而不是因为这个答案本身的高票。摘录部分:

我听闻番茄工作法已久。但是我自己从来没用过。我很好奇的是,无数的人赞同他的时候自己是否用过。对这个问题我有很多疑问,要是打断的时候正好是我精力最集中的时候,怎么办?不停地这样中断,每一次中断我就要保存一次现在看到哪儿了,然后下一次开始的时候我再去进入状态,接上思维,这个开销可以忽略不计吗?还有不停的设置时间提醒自己,不嫌麻烦吗? // PS: 这个我用过,发现不适合技术学习和编程练习,每次时间太短!
让你的注意力聚焦在你所做的事情上,你的处理速度趋近于你的接收速度,你的思维跟上你所做的事情的发展。然后保持,就OK了。
你就很难两小时精神专注于教科书上,首先,你就不一定感兴趣或者不想看教科书的内容,注意力就集中不了,其次就算你集中注意力开始看,你的处理速度是跟不上你的接受速度的,因为教科书的知识密度大,一页书包含了可能很多的信息,你大脑处理不过来。 // PS: 学有点难度的新东西,我一般适当放慢速度,笔记演算,反复看!过快是没有效果的,还容易注意力降低走神懈怠。
举个阅读的例子。阅读长篇英文的时候,大家是不是会有经常看着看着就不知道看到哪儿去了的经历?这时你的大脑就不是在积极主动工作,而是被动工作的。事实是,如果你一边读一边想这段文字的他在表达什么,和上一段是什么联系,和文章主题是什么联系,说完这一段,下一段你预期他应该讲什么,到了下一段是否符合你的预期,如果符合的话你可以加快处理速度,如果不符合你就去修正你的预期。这样去阅读的话,那么你会发现你就不容易走神了。

保持运动、充足睡眠。保持运动是为了睡眠质量高,身体健康,醒着的时候精神状态好。精神状态好,你的机体都能发挥正常的功能,大脑能够正常处理它接受到的信息,眼睛能够正常地阅读。
要对自己诚实

认清自己的不足,坦诚面对不逃避。自己过得好不好,工作开不开心,能力有没有提高,技术怎么样,自己最清楚,千万不要自欺欺人,混混沌沌的过日子。一个前Google 程序员@lucida的文章写得很好:2018,从对自己诚实开始,摘录部分:

现在回看以前自己的博客,悲哀的发现自己已远没有当年对技术的热情,或是对人生目标的清晰——上学时自己的想法很单纯——写最好的程序,然后以此作为基石找到一份好工作。现在看这个目标是实现了:找到了一个对应届生而言还不错的工作,自己还写了一篇现在看起来十分可笑的 心路历程,当时那篇文章被各种转发,自己的虚荣心也得到了极大满足。
可笑的是,我在 Google 里工作不顺,并没有自己想办法改变现状,而是在工作以外的地方寻找慰藉,以填补自己的虚荣心。在这段时间,我创建了自己的独立博客 lucida.me,并花费大量业余时间撰写了诸如 Sublime 教程和程序员必读书单之类的质量长文。这些文章的反响很好,我因为这些文章也成为了读者口中的大牛。虚荣心再次得到满足。
然而与网络的“成名”相比,自己在现实工作中毫无进展。自己在 Google 3 年始终停留在入门级别(一般来说,正常表现一年半到两年就可以升一级),尽管有换组和项目被砍这些因素,但无可否认,自己前三年的工作(也许是最宝贵的三年),彻底的 doomed。在 Google 时有不少人通过我的博客找到我,想和我约饭聊天(他们可能认为我真的是大牛吧),都被我自己的偷偷的躲掉了——我并不想让他们看到现实中的自己。
2017 这一年中,我在 FB 写了不少东西,也结识了不少新的朋友。读了一些书,也获得了一些新的技能(开车,摄影,举重)。最大的收获,是终于可以诚实的面对自己,不会因为自己在线上和线下的不一致而产生自我认知矛盾。
与其在网络上打扮成自己希望别人所看到的自己,不如对自己诚实,在现实中成为自己希望的自己。希望这篇文章可以终结我自己的浮夸,终结我 5 年前写的那篇文章的“诅咒”。Stay hungry, stay foolish, and be honest to myself。这是 18 年的第一篇文章,但不会是最后一篇。希望我可以通过写作,锻炼自己的思考能力,总结自己的收获,清晰自己的目标,让自己对自己更诚实。
真情实感的故事,总能引起共鸣。想成为自己期望成为的自己,首先要坦诚面对真实的自己。改变不是一蹴而就,而是从每天的一点一滴做起,谨以此文督促自己的改变!

猜你喜欢

转载自blog.csdn.net/ZZQHELLO2018/article/details/82666684