大家好,我是羊哥~目前在广州微信总部专职打码,这是我的公众号主动输出的第一篇文章,以后我将在这里分享我在工作学习中的一些心得和思考,希望志同道合的你跟我一起成长!这是我的开场白,主要围绕我从大学到找工作的成长路径,特别是中间经历过的一些心路历程,希望读者朋友们不吝赐教。
首先需要指明的是,我只是码农群体中一个普通的个体,不敢称自己为成功者,也有自己成长的焦虑,也得应对生活的重压,特别是房贷的压力。以下的阐述将尽量保证客观真实,当然想学习的朋友一定要带着批判的思维围观我的经历,因为幸存者看待自己的成功极有可能存在偏差,首先他的成功可能会有偶然因素,其次他的成功不仅是因为他所一直坚持的因素,还可能是因为他碰巧没有做错什么。因此光看成功者的自我感受可能是不全面的,向失败者学习也是有必要的。另外,成功者作为守成者,为了守住自己的成就,在向别人输出自己的经历时,会在自觉或者不自觉中夸大自己的努力,他向别人宣扬的成功比实际的门槛更高,因此,大家理性吸取适合自己的经验教训。以上也是我最近学习林正疆的演讲《思辨能力与表达技术》,李笑来的书《把时间当作朋友》的收获与感触。
初入大学
说到成长轨迹,便想起初入大学的时候。那还是2012年,我高中毕业压线考入了华南理工大学应用物理专业。初入大学的我一脸懵,特别不适应大学没人管的生活,对宿舍教学楼两点一线的生活感到分外枯燥。高中的时候我自诩是物理大才,特别是高考物理满分的成绩令我格外自负。但是大学教学的物理内容难度再提高了一个level,艰深难懂,日复一日教我做人。终于有一天,我承认了自己不是学物理的一块料,当不了物理科学家,物理也不是我内心真正想学的专业,于是在内心中将转专业提上了日程。要想转专业,首先要思考转到什么专业。这个问题对于我很简单,因为对于所有工具,我最爱的就是计算机。我自认为天生就喜欢计算机,热爱互联网,在家里电脑面前上网冲浪坐上一天都不嫌累,目不转睛。特别是对于未来,我相信互联网连接一切的趋势不可逆转,选择计算机进入互联网行业工作就是乘上了时代的东风,能够享受时代带来的红利。当时华南理工大学最负盛名的专业是建筑系,分数高,就业前景好,收入高,特别是作为建筑师天生就自带光环,因此广大学霸不约而同争先恐后转专业到建筑系,哪怕需要从大一开始重学,实际学制变成6年也在所不惜,我身边的两位学霸就选择转专业加入了建筑系。最后,事实证明我当时的眼光是没有问题的,因为现在华工计算机系的录取分数线已经比建筑系更高了。当然,我在这里不是对建筑系有什么偏见,有自己的思考,学自己所爱的专业就可以了。能够耐得住寂寞在凌晨2点还在画图的建筑系精英也必定是爱自己专业的,否则也下不了这样的苦功。当然,要想转专业也绝非想想这么简单,是需要凭成绩说话的,偷不了懒。本着大一主要学习基础学科,就算转专业这些基础学科的分数也是可以抵扣学分的自我认知,我决心静下心好好学习类似高数,线性代数等基础课程。具体的做法是在宿舍,教学楼的两点之间又加上了图书馆作为另一点,没事就泡在图书馆,反复演算书本知识和课后习题。努力取得了回报,大一下学期我的绩点就取得了全班第一,最终也以优异的成绩成功转到了计算机科学与技术专业。这里不得不插一嘴,虽然我的绩点不错,但是当时的奖学金级别却不高,这是因为学校的奖学金评选不是只看成绩的,作为干部或者参加活动是有额外的加分的,因此精于这些规则的同学反而比我们这些一门心思学习的人取得更高级别的奖学金。当时的我还非常看不惯这种现象,后悔没有提前钻研这些细枝末节的规则,为奖学金的数额扼腕叹息。其实现在回首看来,奖学金不是我们学习的目的,自我成长才是,和现在的收获相比,当时的奖学金少区区几千元根本不值一提,以奖学金为目的学习就像射门的时候找错了球门。 转专业到计算机系
初换专业的我并非一帆风顺,也是趟过了不少弯路。首先,到一个新的环境学习,不适应是肯定的,特别是计算机专业的学习没有想象的那么轻松易懂。这里不得不说到C++,所有计算机学子入门的第一门计算机语言基础课。我虽然现在是靠C++吃饭的,但是当时对于C++也是十分抗拒的,特别是对于什么类继承啥的。有的人形容的好,C++就像是一把瑞士军刀,语言特性真的是过于繁杂,很容易将初学者劝退。作为一种编译型的语言,稍有拼写错误,编译都无法通过,更何谈运行。当时的我还按照反复看书的方式学习计算机课程,觉得实际应用的时候非常之吃力,找不到学习的窍门,因此不知不觉中就放松了对自己的要求,大作业抱大腿,只注重考试成绩,书本内容,不注重实践,不注重个人理解。虽然考试成绩还行,但是我内心是虚的,因为计算机是实操型专业,我心里明白,自己的水平离光靠计算机技能谋生还差的远。
果然大三找工作的时候,实际面试的时候印证了我内心的不安。当时应聘的职位是腾讯的后台开发,因为基础知识不牢固,项目经验欠缺,连基本的算法题都无法快速的写出答案,面试官只能礼貌地将我挂了。这次面试经历深深地打动了我,用事实证明了我学习的程度远不能达到实际公司招聘的要求。幸好成绩还行的我拿到了学校的保研名额,于是我决定利用研究生的三年时光改过自新,弥补本科的遗憾,拿到大厂的入场券。现在回首看这一段经历,我更加坚信了孙振耀先生提出的一个道理,I hear, I forget; I see, I remember; I do, I learn。作为一门实操型的专业,计算机的学习应该配合实际操作,也就是需要反复打码。凡人刚开始学习的时候总是笨拙的,下苦功夫,可以通过反复用键盘抄写的方式学习掌握不理解的代码,功夫下够了,自然就学会了。
研究生经历
进入研究生学习生涯后,我首先下定了一个目标,研究生毕业拿到进入大厂后台开发的offer。具体学习方向是以后台开发为主,机器学习为辅。为了给自己找到一个实操的学习氛围,在课余我找了一个基金公司实习的岗位。这家基金公司是学校师兄创业成立的一个量化投资公司,平时的主要工作是利用python编写股票实盘回测策略。我在公司中通过实际的业务需求的锻炼,掌握了python编程。python语言为我打开了新的世界,原来可以几行代码就可以完成一些复杂的功能。在学习中,遇到问题,我首先用python写一个简单的demo,没问题了再改写成C++,一下子觉得原来C++也没有想象中的那么难。在公司中,我也在不断尝试转型,为自己的C++实践寻找机会。最终在离开公司前,我为公司开发了一套多线程C++股票实盘交易系统,以及一个支持自动更新的C++股票行情爬虫。当然,我的学习经历绝非这么简单,在课外还学习了很多相关书籍课程。这里不得不提到陈硕编写的《Linux多线程服务器编程-使用muduo C++网络库》这本书。通过这本书,我掌握了如何利用多线程C++ reactor模式进行异步网络编程,第一次领教到了linux提供的epoll配合非阻塞网络编程所带来的性能优势。在具体实践的时候,我也并非一看就懂,在这里,我采用的是笨方法,直接用键盘照着书籍将muduo源代码完整的抄了3遍。通过类似的方式,我又学习了leveldb,redis,libco的源码。最后努力没有白费,通过阐述学习的源码,我成功在毕业季通过了微信面试的面委考察环节。在这里,我推荐几个有用的学习资源。对于算法的学习,推荐《算法导论》,《剑指offer》,需要注意的是,在看书的同时,需要通过实操来验证自己的掌握程度。相关的网站我推荐leetcode与牛客网。我本人参加过大厂的面试,也和面试官交流过,其实大厂面试的算法题没有想象中那么难,常考题包括链表翻转,快排,最长公共字串之类。大厂面试官最关注的是,面试者是否有真实的理解,是否能够快速应用所掌握的语言完成,是否成熟地考虑了所有的corner case。总而言之,talking is cheep,show me the code。对于linux网络编程相关,我推荐《UNIX网络编程》。作为一名合格的后台开发,我们需要掌握进程IPC通信的方式,实际实践,并有自我理解。举例而言,对于异步非阻塞epoll网络编程,只有实际动手实验过,才能真实的明白阻塞网络编程和非阻塞网络编程的差别,理解为什么epoll为什么能提供更好地性能。对于不懂的点,可以进一步深入挖掘,例如epoll和poll的区别,epoll的底层实现,TCP/IP的状态流转等。对于C++,我推荐的书是《C++ Primer》,我自己学习的方式是将书中的案例完整的码了一次。需要注意的是,需要特别留意C++11这一部分,这是现代的C++规范,在大厂产品中已经得到了广泛的应用,极有可能在面试中考察。 陆游说过,功夫在诗外。我非常推崇《异类》这本书中提出的一万小时理论,要完整熟练的掌握一门技能,是需要踏实的付出时间和精力的。虽然作为初学者,我是懵懂笨拙的,用发展的眼光看问题,只要我付出了时间和精力,在可见的未来我一定能成为熟练掌握者。最终,在研二,我如愿拿到了微信实习的offer。总结来说,基础知识+项目+算法+个人理解=offer,缺一不可。
总结
在最终,羊哥作为亲身经历者,在心路历程上做一个小结。首先,每一个初学者刚开始难免都是磕磕绊绊的,成长是需要时间的,我们需要耐得住寂寞,只要付诸了努力,未来的成长可期。其次,对于一门实操型技艺,需要通过实践来进行掌握。I do,I learn,有时候,抄代码也未尝不是一种学习。但是相比方法,我觉得努力更重要。就像学习英语,钟道隆通过逆向法进行学习,俞敏洪通过词根词缀法强化记忆,他们都取得了成功,不是方法决定了他们的成功,他们的共性是都下了苦功夫。只要下功夫,你自然而然就能找到适合自己学习的方式。我觉得树立目标也是有用的,有了目标就有了方向感。你不是孤单的前行者,多向大佬交流学习,你也会在不知不觉中变成大佬!