0 前言
秋招结束,就以一篇博客文章为秋招画上句号吧!这也是我的第一篇博客,也意味着新的开始。
这篇文章的主要内容是以我的亲身经历为基础,总结自己在备战秋招过程中用到的资料和积累的经验,干货满满~
因为女朋友在北京,而且我是内蒙人,图离家近所以秋招面的都是北京的企业,岗位都是后台开发,拿到的有offer如下:诸如腾讯微视(go语言后台开发),百度智能云(C++分布式存储开发),商汤,华为,京东数科等等
本文主要面向想去互联网大厂的非科班同学,文中列出的资料都很通俗易懂,拒绝又厚又难的经典巨著!因为秋招时间短,而且这些大部头不适合入门且极易打消学习的兴趣。我在秋招过程中用到的学习资料都是以通俗易懂为第一标准,也在此分享给大家,希望能够对大家有所帮助。
1 个人基本情况
本人是985自动化专业硕士生,由于较早确定了互联网的求职目标,所以读研期间利用假期找了三份实习:
- 第一份是在一个不知名小公司实习,暂且不表(研一上暑假:两个月)
- 第二份是在旷视做C++代码的并行化优化(研二寒假:两个月)
- 第三份工作是在腾讯TEG做C++后台开发(研三暑假:两个月)
Tips:腾讯每年大概3月份开始招暑期实习生,这时TEG事业群有一个C++引力计划,专门针对非科班的,真正的带薪培训,又有大厂实习经历光环加持,它不香吗!请重点关注
从我的经历也能看到秋招准备要循序渐进,不必苛求第一份实习就是大厂,完全可以曲线救国,当然要保证自己能够不断进步。一份大厂实习经历在秋招过程中绝对是一把利刃,如果能够对实习当中做的东西有较深入的理解,还能够结合所学的基础知识,一定能够迷倒面试官!
只要选择合适有效的学习资料和方法,就能够事半功倍,顺利拿到大厂offer!
2 学习方法
这部分要扯一些虚无的东西,但是却是最最重要的一部分。正如在学习《设计模式》当中,设计原则远远比花里胡哨的模式更重要,而这里的学习方法,也是这篇博客中战略位置最重要的。
我的秋招就是按照这个套路来的,在这里也分享给大家。可能大家会觉得道理我都懂,但是光懂不行,你要做!just do it。现在我就来告诉你怎么做。
我的学习方法总结为三步走策略:
- 第一步:了解新技术的全貌
- 第二步:尝试去使用新的技术
- 第三步:深入挖掘技术细节
注意:这里的第二步使用是一个广义的概念,所有输出的途径都是使用:最简单的写个小demo,或者把你学到的知识讲给别人,而在秋招过程中,应对面试官同样也是一种使用,通过和面试官的交流可以找到自己知识系统中的短板与不足,这样每一场面试下来,你都会有所成长,这样的良性循环下来,想不上天都难。
为了让大家更好地应用我的这套方法,举个例子:
我在实习期间学习brpc框架的经历如下:
- 第一步:看brpc的官方文档,了解是个啥
- 第二步:按照文档中的示例写demo,作一些小改动,和导师探讨,使用brpc框架完成导师布置的任务,如果期间有面试,也可以和面试官扯brpc,看看他关注那些问题,这就是我第三步的方向, 总之就是通过各种途径去使用新技术
- 第三步:上面两步可能大多数人都能做到,最重要的是第三步。为了更深入的理解brpc的工作机制,我用socket编程去模拟brpc的功能。同时brpc当中的一些性能优化思想也能为我的工作提供思路。此外我还会根据面试官感兴趣的话题,比如brpc和grpc的区别啊,brpc性能优化是怎么做得,这些都是需要第三步中需要做的,而正是第三步,加深了你的技术深度,拉开了和别人的距离。
当然上面的三步走策略 并不是一步就位的,而是需要不断循环往复,重复才是学习最底层的方法。
我再次强调这部分学习方法看似扯淡,实则是最重要的,我会在下文中具体的学习过程中继续渗透这种方法如何使用,其实很简单!
3 秋招基础知识准备
3.1 概述
秋招需要准备的知识概述:
- 一门趁手的编程语言
- 算法与数据结构
- 刷代码题
- 操作系统
- 计算机网络
- 设计模式
- http协议
- 数据库相关
乍一看要准备的内容很多,但是不要怕,没人让你把这些内容在入门的时候就要都吃透,掌握这些知识需要时间以及投入,不是说把上面所有的知识掌握了才有资格去大厂(至少在我的秋招历程中),凡事都讲究循序渐进,而且也没有严格的先后关系,边面试边学习,边实习边学习这才是正道。
先来按照我的理解说一下这些知识的比重:
编程语言不必多说,至少要熟练掌握一门,而且这个是基本工具,一定要尽早磨练,并且学习语言相关的特性。会一门语言是一切的基础,再强调也不为过。至于该学哪门语言,不是这里的谈论重点,学什么语言不重要:我学的C++,秋招也拿到了go,java的offer
算法与数据结构是重点,不论是后面刷题,还是工作当中,算法与数据结构都是必修课,啥不会这个都得会,如果你不知道该学啥,就学算法与数据结构吧,后面再讨论怎么学
刷代码题这个也是基本功,面试当中逃不掉,而且感觉代码题答的好,即使面试中基础知识方面答得不太好也没大问题,所以这部分一定要多练,而且要掌握方法,具体后面讨论
上面这些部分是基本功,可以及早锻炼与学习,而且在刷题的过程中还可以不断磨练编程语言的熟练度以及数据结构和算法,不断的重复才不会学了就忘。而且上面的三项不能速成
如果你不知道该怎么入手,就从上面三方面按顺序入手。
下面的操作系统和计算机网络,http,数据库,设计模式这些在临近秋招速成即可,当然这只是权宜之计,能够都学会,学扎实当然是最好的,如果时间不充分,那么可以以应试的态度准备,慢慢再深入学习。
这里强调一点,秋招只是开始,不是结束。我这里提到的方法都是指应对秋招,真正的技术和能力学习没有速成的说法。 可以说速成只是我上面说到的三步走策略的第一步,可以在工作后或秋招结束后再完成第二步和第三步。深入学习可以迟到,但是不能缺席,否则你在技术道路上走不远。
接下来我会按照三步走策略去学习每一部分知识点,也蕴含了我的秋招准备过程。
3.2 秋招准备
3.2.1 第一步:快速入门相关的基础知识
在这一阶段就是以快取胜,能够以最快的速度对秋招的各项必考知识有所了解。
- 编程语言
我当时选择C++有两方面原因,一方面是因为我在本科学过C++,另一方面是我觉得C++既有底层的指针等内容,又有高级语言的面向对象特性,适合打好基础,将来转java,go等语言也比较容易。这部分我也走了弯路,最开始拿着《C++primer》这本大厚书开始啃,立志要在一个寒假把它看完,彻底入门C++,结果失败了,真的太无趣了,虽然内容很全面,很权威,但是我很难理解,也不容易记忆。后来我在B站上找了一门视频课程,跟着视频动手敲代码,记笔记,跟着视频学会更快,更容易把握知识的主干脉络,尤其是跟着视频敲一遍代码,对这门语言的了解就会比较深入。看完这门课程后我回过头来再看《C++primer》,就轻松多了,很快把整本书看完,对C++的理解就更进一步了。所以不要总想着一步到位,从视频入门未尝不是个好主意。至于具体的课程,我不记得了,这不重要,在B站搜C++,看浏览量最高的即可。 - 算法与数据结构
推荐《大话数据结构》,这本书通俗易懂,而且还薄,非非常常适合入门,其中算法复杂度,链表的操作,字符串的操作,二叉树遍历等等一些基本的操作要会,最好自己敲一遍示例代码,以后很多算法题都是以这些基本数据结构为基础,不懂这些数据结构直接去刷题是很费劲的。后面的查找和排序算法更是重中之重,要滚瓜烂熟的掌握,比如其中的二分查找和快排,在面试当中非常常见,学完这本书之后对基本的数据结构和算法就有了基本的认知,可以开始刷算法题了 - 刷代码题
很多人一上来就推荐牛客网,leetcode去刷题,这不是瞎搞嘛,题海战术永远都是最差的招数。其实算法题有套路,先学套路,对整个算法题有个宏观的把控,然后再去刷题。这里入门推荐先看《剑指offer》,看这本书,然后牛客网上有这本书对应的题库,每理解一道题后就自己在牛客网上敲一遍,最后再把要点记笔记,这样这本书的题刷完之后,你的刷题手感就上来了,当然得定时复习,因为有些题的思路真的很难想到,也很难记住 - 其它知识
这一阶段不求全,只求快,对于操作系统,计算机网络,设计模式等等这种内容,有个大致了解就行,这就首推何昊老师出的《程序员面试笔试宝典》这本书,把第八章到第十章全部看一遍就可以了,计算机网络9.1,9.3,9.4是重点,操作系统部分10.1和10.2是重点,另外第七章可以说是宝库,其中包含了很多基础知识和细节,学会这些在面试过程中大有裨益。数据库没有时间可以先不看。
反正我到秋招结束都不会数据库,面试中遇到的概率也比较低(主要是其它方面聊的多,占用了比较多的时间,即使面试官追着问数据库,你说没接触过,如果你其它部分表现ok的话,也不是致命伤,我不学数据库是因为我在实习当中确实没用过,而且我觉得像这种工具类的内容,没有实际应用场景很难学,再加上他被问到的概率不多,也可能是我说不会数据库哈哈)
其实首先要我们准备的内容并不多,关键是开始,然后让自己走进正循环,这就够了。大家可以看看我上面推荐的教程,都是很快能看完的,不会很厚也不会很难
3.2.2 第二步:应用第一步学到的知识
大家可以看到,第一步注重基本能力的培养,包括编程语言,代码能力,算法与数据结构,这些都是最最基本的能力,也是在实习或者面试当中出现频率较高,也比较硬核的东西。有了这些东西,你就入门了,之后的路就好走了。这部分会讲如何去用上面学到的东西。在应用中一方面加强知识的理解和记忆,一方面寻找下一阶段提升的方向。我的应用主要是两个途径,实习和面试
-
编程语言
编程语言主要在实习当中使用,做项目
还有就是在面试当中应对面试官的问题,针对重点提的问题可以自己写demo实现,比如智能指针:sharedptr,uniqueptr,vector的实现等等,这样既可以练习编程语言,又可以加深对STL的理解
可以搜面经,看看自己掌握的知识能否回答面经的问题,这也是一种应用,回答不了的则学习加强 -
算法和刷题
算法和数据结构的基本知识可以在实习中用到,当然最常用到的还是面试当中和面试官对攻
当你被面试碾压过几轮之后,就会发现光靠《剑指offer》不够,还得接着练,具体怎么练往下看哈哈 -
其它项目
操作系统的知识可能不会直接应用到实际当中,但是我们把操作系统看作是一个程序,它其实是一个很完备,强大的一段程序,它也要考虑我们在实际工作中遇到的性能瓶颈,任务调度等等的问题,它的解决方式能够给我们带来启发,计算机网络更常用一些,我在实习过程中明显发现我的知识不够用了,所以需要根据实习内容去激励我学习相关知识,具体的学习方法见下文
3.2.3 第三步:深入学习
前两步打下了基础,通过第一步成功入门并找到感觉,第二步的应用以及面试被怼会找到进一步的改进方向,同时能够在应用中巩固第一步学到的内容, 现在就需要进一步深入学习,根据第二步中找到的方向继续前进。
-
编程语言
通过前两步,应该对语言的基本用法和常见特性有了了解,比如在刷题或者实际项目中多多少少会用到vector,map,unordered_map等容器,sort等算法,但是在面试中面试官经常会问他们之间的区别,以及各自的底层实现。这方面问题,一方面可以通过面经和博客去做针对性的知识补充。更应该去花时间集中去学习。这里推荐两个资源,其一是《effective C++》,这本书写得很好,也比较易读,在你有了一定的C++使用经验后阅读会有一种很爽的感觉。另一个是侯捷老师在B站上的视频课程:STL体系结构.这门课比较系统的讲解了STL使用及底层实现,在你通过博客零零散散学到一些底层实现之后,看这种系统的课程也会觉得很爽(当然我是先看的侯捷老师的《STL源码剖析》,发现书好难懂,也学的很慢,然后发现了B站的视频,看后顿觉清爽哈哈,我觉得正确的顺序是先看视频,再看书) -
算法刷题
我当时是被几轮面试中的算法题虐过之后,痛定思痛,觉得《剑指offer》还不够,于是又找了一个系统课程,是牛客网上左神的算法课。这个是收费的,大家在牛客网上直接搜就好,但是左神的算法讲的是真的好,通俗易懂,很多思路他一说就明白了,他的班分为基础班和进阶班,大家可以先看基础班,再看进阶班,因为已经有了一定的刷题基础,大家在跟基础班的时候可能会有很爽的感觉,但是还是要听,因为大神很有可能有更牛B,更好记的思路。当然刷题这种技术活,光看肯定不行,要在leetcode或者牛客上找视频中的原题写一写,练练手。
感觉跟着《剑指offer》和左神的视频课刷完之后,基本的刷题能力就具备了,剩下的就是多见题型,保持手感,也就是题海战术了,这部分应该有不少教程,我就不赘述了。其实就我感觉来说,通过上面的系统跟练,已经能解决不少面试题了(笔试题不好说,有些笔试题是真的难~~),而且我当时是面试代码题被虐之后用了一周的时间刷左神的课程,每天啥也不干,就是看视频,记笔记,在网上找原题练,感觉这一周刷题能力进步神速哈哈。所以还是要从实际出发,当你知道你哪里需要进步了,再去学,可能效果更好吧。 我当时没在牛客网买课,大家如果钱包紧张的话可以在网上找找资源,但是尽可能还是支持原版哈哈,视频质量绝对值那个价。貌似牛客有时候会搞活动,可以在有活动的时候买。(希望我为左神打广告能洗清我白嫖左神的罪孽~)
- 操作系统
在第一步中只是简单地了解了操作系统的内容,但是还是不够,而且在不断的面试以及实习中,也激发起了我对操作系统的兴趣,操作系统相关的东西我推荐大家看王道老师的考研课程,讲的很好很好,通俗易懂,而且课程PPT十分精良,就这么说吧,你不看课程,光看PPT都能学会,传送门如下:王道考研:操作系统.另外给大家推荐一篇博客,是王道考研操作系统视频课的笔记,只有内存管理相关的,传送门如下:操作系统-内存管理.这篇博客的笔记非常棒,我当时是先搜到的这篇笔记,顺着看完后立马找来了视频课,而笔记中包含的部分,基本就不用看视频了,看其他部分的视频就okay了
这部分还想为大家推荐一个视频课程,是黑马这个培训机构的,B站上有免费课程:Linux系统编程,这门课可以看作是操作系统的实操方面的训练,里面会讲一些linux的原理,还有相当多的代码,跟着过一遍,对操作系统的理解就会更深入,同时也是直接面向就业的技能,学完这个课,就基本具备开发能力了。
这里要diss一下《UNIX环境高级编程》这本书了,这本书被公认为是linux开发领域圣经级别的书,结果也是被甩过来让我入门的,我不是说它不好,我真的是看不进去,书里讲了一大堆api,脱离实际项目我根本无从下手,也不好理解,不好记忆。就相当于是给了我一本新华字典让我去学汉语。所以入门还是从通俗易懂的来,然后再去读经典深入学习。
- 计算机网络
计算机网络真的太枯燥,太抽象了,但是我在B站上(没错我就是B站大学成才的哈哈)找到一门神一样的视频课程:计算机网络简明教程.这个课可以说是化腐朽为神奇,计网最难学的地方在于抽象,这门课程通过仿真软件解决了这个问题!!! 很形象的用仿真实验带我们看到网络的运行过程,而且PPT和讲解真的是一流。看完这个课程,计算机网络在你眼中不再是《计算机网络:自顶向下方法》这种“厚黑”形象了。如果期待的话,快快开始学吧!最好跟着仿真做一做,这样网络的运行过程会刻在你的脑海,挥之不去~
网络编程在互联网公司可以说是最常用的,这是生存技能啊,不然互联网公司中的互联网这个词你觉得他是啥意思?所以计算机网络这块一定不能停留在理论层面,好消息是,这方面的好课程有,而且实操远远比理论好学且有意思,照例B站链接:linux网络编程.这门课程学完,基本有了对网络编程的认识和最最基本的技能,当然面试当中这部分也经常问到,什么epoll啊,线程池啊balabala的,好好学,看完视频,跟着敲代码,打动面试官so easy(广告词乱入?) - 设计模式,http协议,数据库
上面几项是必修课,无论如何都要重视,按照上面的方法来做就好,下面的依我的经验算是选修课,设计模式,http,数据库等等,这其中只有设计模式是我认真系统地看了的,因为我觉得这个更本质,更通用,http和数据库更偏工具化,个人认为还是结合实际应用去学,以应试去学效果不会太好。设计模式我是看得:23种设计模式,以C++语言为基础讲的,大家可以根据自己的语言背景选择合适的入门资料。
http协议没怎么学,只是看了看https的加密过程,数字证书啥的,这部分没有太多要说的
数据库在我的理解看来就是些sql语句,背就好了,如果没有实际应用场景,这些很难学,当然还有一些调优的方法,索引啊什么的,这些倒是可以学学,我觉得这块可以结合数据结构去学,什么B树B+树等等,这些更底层也更本质,不要为了应试去背一些没有价值的语句,记住了也会忘,要背也背更底层的知识。另外数据库这块因为我实习当中接触过一些分布式事务,所以这方面我也较为熟悉,能够顶一顶数据库相关的问题
大家可能发现,我并没有追求完美,把所有知识都学透,而是建立大概框架,然后根据需要去深入,其实这未尝不是好的学习方式,尤其是当前知识爆炸的时代,想要学透一个领域十分不容易。知识也符合二八定律,我们对很多领域掌握20%的核心知识即可,我们在一个领域做到世界的前10%很难,但是在两个领域同时做到前20%,要相对容易很多。当然大家不要太偏激,我不是让大家朝三暮四,也不是让大家放弃深入学习,只是有选择性地深入,并且不要过分追求完美。快速成型,敏捷迭代,这条原则不止适合软件开发!
3.2.4 接下来我该做什么
上面的部分我试图以我的秋招备战经历来制作一个教程,帮助大家入手准备秋招, 我不敢保证大家按照我的这套做法下来一定能进大厂,我更想传递一种方法与思想,还有我这一路走来的经验。我觉得这篇博客最重要的就是起初提到的三步走的学习方法,当然还有我列举的学习资源,这些其实和方法是融为一体的,三步走策略并不只是三步,它更像是一个循环,不断地去重复第二步和第三步才是正道。 第一步让我们认识到整个知识领域的全貌,第二步通过应用加深理解并找到自己的不足,只有这时才是深入学习的好时候。下面对各项知识的我的学习路径为例,解释这种思想并且指出今后要走的方向。
-
编程语言
编程其实是使用的最频繁的,最容易内化为一种能力,这也是我为什么选择C++的原因,因为它底层和顶层都具备,我能更好地学习编程语言设计的思想,而不是局限于方法。C++之所以如此经典,就是因为他的设计思想。当然我们不能一上来就奢求掌握C++的所有设计思想,先学会使用,然后在使用的过程中去发掘,就像在秋招备战过程中,通过不断刷题,你会对编程语言的理解越来越深入,随着和面试官的探讨,你会对各项特性更加感兴趣,或者知道该深入学习哪个方向,比如C++的智能指针,它就解决了内存泄漏这样的痛点,这些只有你在不断使用中切实体会到内存泄漏的痛,才能理解智能指针的强大以及这种设计思想的巧妙。编程语言的学习这里,我有一个小窍门,就是试着去用一句话概括这门语言的设计思想,看看能否解释所有的特性,当碰到不能解释的特性时,就去修改这句话,这时你对这门语言的理解就更进一步了。不断重复这个过程,不断深入学习,会对这门语言理解更加透彻。 -
算法和刷题
算法这块是程序员的基本内功,在刷到一定程度的题之后,我觉得可以尝试去看看《算法导论》这样的巨著了,哈哈我还没开始看,还是有点怂,不知道自己现在的能力配不配的上这本书~
刷题我觉得在秋招之后可以降低它的比重,可以通过看优质的开源项目来提升代码能力,这个我也还没开始,只是设想 -
操作系统
操作系统这里有必要说一下,我觉得操作系统还是很值得深入学习的,我在刚刚备战秋招时,认为想学好操作系统,就要先手写一个操作系统,这样才有资格参加秋招。后来冷静下来一想等我写完可能要参加春招了,所以还是应该先入门,我倒是觉得自己写操作系统应该放到最后阶段,觉得自己操作系统学得不错了再来写。我在备战秋招过程中,到了后期开始对操作系统的源码产生了兴趣(当然也可能是经常被面试官问蒙逼,恼羞成怒所致哈哈),当然我不会直接去啃源码,而是找相关的视频课程,这里推荐一个课程:Linux内核 核心知识全解析,讲linux内核讲的还不错,我看了前面几讲,加深了我对进程切换,内核态用户态切换,堆栈等等的作用机理,也有助于我对各门计算机基础知识的融合理解,其实越往深走会越自信,越能够把握各项知识的联系。 -
计算机网络
哈哈这里还是想吐槽,一直挺瞧不上计算机网络的,觉得有些算法有点“玷污”算法这个名词,比如生成树协议,大概是说几台主机连接起来构成一个圈,这样会产生网络风暴,解决方法是阻塞某些端口,使之不构成一个圈,简言之就是有个圈不好,打破这个圈就行了,这就是一个算法,what!(哈哈当然实际算法会比这个复杂很多,有很多地方需要考虑,只是我可能天生对这些内容比较反感~~)
计算机网络我也不知道该怎么进一步深入学习,可能实际抓抓包会比较好? -
设计模式,http协议,数据库
这些就看个人喜好和时间了,如果实习项目中用到了,那自然要好好学,如果用不到的话,那就等用到了学也可以。最后给大家推荐一个好东西,就是在上面这些步骤都做完了之后,可以看看牛客APP上面主页有个叫“面试宝典”的单元,这里是面经合集,分门别类整理好了,可以用作最后的查漏补缺, 也不长很快就能看完,看着这么多面经自己都能游刃有余的解答,会有一种莫名的成就感哈哈
3.2.5 学习小技巧
我在学习各种基础知识,如操作系统或者算法题套路,实习中用到的技术知识等等的过程中总结了一套学习方法。那就是用onenote记笔记,复习的时候用Xmind整理成思维导图。
onenote可以很方便的管理笔记,还能制作超链接,把自己学的零零散散的知识做一个目录,点击其中的一条即可跳转到相应的笔记,非常方便。我用这个方法做了刷过的算法题的目录,在复习时,或者是某道题忘记了解法,非常方便就能找到哈哈
Xmind则是复习的好帮手,每次面试前用onenote复习太费时间了,要浏览大篇幅的笔记,而用Xmind把知识要点总结成思维导图,一方面知识更加成体系,另一方面复习起来非常的快,遇到忘记的知识点再去onenote查找即可。思维导图一定要简洁,不然费时间而且影响复习速度
电子笔记方便查找,而且可以互相引用,一个超链接直接跳转,alt+左箭头返回,非常方便,十分利于知识迁移以及互相融会贯通,另外电子笔记方便同步,携带,真的是好处多多。
另外给大家推荐一个windows下的电子书阅读与记笔记的好工具,BookxNote, 把pdf电子书导入,即可随意标注做笔记,还能将笔记自动导出为思维导图,便于复习以及检索重要知识点,是阅读电子书记笔记时的好帮手
4 总结
洋洋洒洒好多字,希望大家能够喜欢,也能够帮助到大家。我们在刚开始准备秋招时确实比较迷茫,希望我的这篇博客能够给大家提供一个比较明晰的路线,动起来吧!走一步,再走一步,一共就三步哈哈!最后套一句鸡汤格言吧:种一棵树最好的时机是十年前,其次是现在。
大家有问题可以联系我交流哈哈,邮箱18748103094@163
未来可能还会更新秋招的时间进度以及其它的一些技巧,感兴趣的朋友请持续关注~
更多推荐
非科班程序员秋招准备干货分享与学习路线-计算机基础突击与刷题秘籍
发布评论