这是帅地让一位读者写的一份学习经历,这位读者,算是和帅地关系还不错的读者吧,他大一的时候就加了我微信了,当时还是经常骚扰我的,问这问那,甚至让我直接给他的算法题找 bug。。。。。但是,我看他挺真诚,并且每次都给我的朋友圈点赞,我也就每次都耐心回复他了(实不相瞒,经常朋友圈点赞还是有点用,,)
注意,当时帅地还在上学,并没有那么忙,不过现在帅地太忙了,这种问题基本不回复哈。
不夸张的说,我觉得,我还是给了他挺大的影响的,我一直跟他说,不需要按照学校的来,因为有些学校的学习气氛确实不好,编程这玩意,自学就够了,当时他也一直把我当作榜样,我入职了腾讯,也给了他信心,可能是因为,如果我拿不到大厂 offer,他就会觉得大厂 offer 贼难吧,但是我想说的是,大厂 offer,并没有想象中的难,前提是你从大一/大二就开始规划,把该学的都学了,那么真的不是很难。
这位读者,刚开始,我让他专心学算法,后面提前去学习计算机基础,深入学习一门语言,去做项目,功夫不负有心人,在今年的春招中,第一次投递腾讯,就拿到了 offer了。这位读者也是普通二本院校,所以我想把他的经历分享出来,给公众号的读者打打气,以下是他写的文章 + 帅地排版和修改。
我的春招
Hello,首先自我介绍一下,我是一所普普通通的二本院校的大三学生,坐标江苏。
今年三月份拿到了腾讯实习的offer,人生中第一次面试是腾讯,部门是 TEG 的云架构,并且顺利签约,说实话内心还是挺高兴的,在这里和大家分享一下自己的经历。
该读者后面也拿到了阿里的 offer
我的看法
下手要果断。不要怕自己不够好不够强,我大概是二月底开始投简历。我一开始使用了牛客网投简历的方式,很遗憾,记得牛客网公众号当时给我的等待面试安排直到现在我都没有收到安排,效率过慢,很容易失去机会。不过我的简历是很简单地使用牛客网的模板写的。
有了想法就果断去投,要去官网投!
**帅地注:**平时帅地让大家去牛客网,更多的是大家去那里找内推,查看公司招聘时间,笔试时间,最后还是要进去官网投递的,而不是在牛客网投递。
对于大概的需要学习的知识有:
- 比较牢靠的基础知识
- 计算机网络
- 操作系统
- 语言基础
- 多线程
- 算法
- 数据库
- 项目
对应的书籍可以看这里:
关于简历
我是遵循着越精简越好的做法写的。本来写了两三页,最后删删改改保留到了最后一页内容,无用的可以删掉,比如学生会经历啥的,基本没用,不过很多公司制定的简历都是要必填的话,可以都写上去。
如果是内推直接发简历的话建议写的少一些,把重点和亮点写上去,让 hr 一眼就直接看见,包含了一定需要的信息,比如姓名学校什么的,自己比较擅长的知识,比如说 redis,爬虫,linux,或者对 jvm 理解比较深,也可以强调一下,面试官会针对着你的简历去问。
项目的话不要太大众化,也千万不要造假,最好是自己真的比较熟悉的,面试官会问有没有 github 链接,这个时候如果没有还是比较尴尬的,可以分条写下重点内容、利用的知识点,最后可以总结不足之处,遇到困难如何解决,后期会如何去改进。项目不用很多,我写的是2个,不过越多一般会比较好,前提是比较有价值的。
关于基础知识点
计算机网络
腾讯基本上是必问,特别是 TEG这 些部门,我的三轮技术面每一轮都是从计算机网络开始问的,而且问了还挺久的,一定要重视 TCP 协议,三面面试官让我讲TCP 里面的各种机制,然后我因为时间间隔久,说的就比较乱,这里建议可以自己整理一个大纲,然后好好填充,最后复习,不要抄网上的,一个是各种版本太多,还有的是不一定完全正确。
我是从大一开始就看计算机网络自顶向下方法这本书,大概断断续续读了有两三遍,这本书在本科应付面试还是够了。我也只读了这一本书,我觉得自定向下的方式还是挺好的,和 csapp 不太一样,计网还是举了很多比较通俗的小例子,比如邮递员啊,一家人和邻居的互动这些,看着还是挺有趣的,前六章一定要读懂,记住关键知识点。
在校招的层次上,这本书已经是很详细了。举个例子,面试有一个高频题目,就是 web 页面请求的过程,可能大家看过面经的都会粗略的说什么 DNS 查询啊,三次握手,浏览器解析,但是这个问题其实在书上的 326~331 页上有十分详细的过程,同时也囊过了前六章的非常多的知识点,书中是用Bob用他的便携机在学校查询了 www.google.com 主页来举例。你说的越详细,面试官对你越评分会越高。
操作系统
操作系统是我比较薄弱的地方,我看 csapp 都挺吃力的,经常看的犯困,当时学校教的其实也比较水,就是直接教你怎么算,然后出英文试卷,相当于背题应试。那怎么够呢,我因为看书吃力,于是选择了看 b 站清华大学的操作系统课,老师是向勇和陈渝,对于我这种比较笨的人还是挺友好的,然后对应着 csapp 来看,会好一些。
还有就是 linux,似乎很多面试官会问你平时是不是使用 Linux 编程,我直接就怂,虽然平时项目上线会用 linux,不过我大概只知道一些指令,比如 ps, netstat 这些,然后去 proc 查查 cpu 状态,这个三面面试官也问了,你平时如何查看 cpu 状态,如何查看内存占用情况,如何定位程序出错的地方(大概是)。
然后我就开始扯什么 top 啊,什么利用率负载率啊。最后还算是扯过去了,二面面试官也针对 Linux 问了挺多的,遇到不会的就诚实的说不会,不要强行去解释,也不要逞能,这样会被怼的很惨。三面的时候面试官还问我磁盘问题,RAID1-5,我觉得这个对我来说还是挺深的…
视频推荐:计算机基础三门课视频
语言基础
这里扯下 java 的,二面面试官针对java问的比较多,一和三基本没问。
其实我二面是答得最不好的一轮,很多概念模糊了,也犹豫了挺久的,比如他问我抽象类和接口的区别,我大概还是一年前看的了,当时我努力搜寻记忆中的概念…,憋了好一会才憋出来几个区别,不过事后看看真的很简单,基本上是看了一遍就回忆出来了,大概还有类继承的一些问题,jvm 让我每一块分开来说,面向对象,我每个说的都不太详细,还是挺遗憾的,因为我真的对java太有信心了,一直没去复习看它,结果眼高手低了。
所以千万不要放弃每一个知识点,然后聊了一下 go 语言,我之前有去看过云风 c 语言写的协程,大概了解了一些。java 我看的书是 JAVA核心卷,Thinking in Java,effective Java,其实我觉得这三本书是挺够的了,特别是 Thinking in Java,初看是略看,然后多看几次,就能注意到很多细节,而细节往往可以决定成败。
其实说是三本书,还有很多是不必看的,比如 Swing 编程这些。核心卷对于入门来说非常友好,因为很简单。Effective Java 放在最后看,往往是优化代码,让代码更加安全、性能高、优雅。
多线程
我用的是 java 并发编程的艺术这本书,多线程一定要好好学,项目中一定是常用到的,然后推荐大家看一看并发编程网,里面的内容基本是很优秀的。很多是国外搬运翻译的。
另外可以通过面试题复习:Java面试题必知必会(附答案)
算法
算法靠刷,刷多了有题感,不过腾讯是挺爱问排序算法的,那基本的稳定和不稳定排序算法是要熟悉的,比如我二面问了希尔排序,我本来以为大概率是问快速排序的,然后希尔时间复杂度我还说错了,,,,
好在其他我都记得比较熟悉,堆排序,快速排序(随机选基数,三路快排)等,归并排序(我觉得这个很重要,因为 java 的 sort 就是用的快速排序+归并排序),而且归并排序是稳定排序。基于归并排序的算法题延申的都挺多的,有看到其他大厂的笔试算法题就是归并。
算法的话,如果时间充足,比如我是大一寒假开始写算法,我是每一题自己钻,然后看题解,往往一天只写两三题。目前为止刷题总数 leetcode + 牛客,加上一些 OJ 平台,大概是 600+ 的题量,可惜腾讯的面试里问的算法不怎么多…,这里总结一下必要的算法知识,首先是数据结构每一个都需要很熟悉,比如链表,哈希表,树,图,栈,队列,堆。
(1)链表,什么反转链表,环形链表,链表排序等等算法,比如 LRU,就是用一个双向链表 + HashMap 来实现。别看链表基础,但是很多大厂是挺喜欢链表的,比如字节跳动,再比如跳跃表,是 redis 里的 zset 的底层实现。
(2)哈希表,最好要理解底层实现,建议看源码,一定要清楚如何实现。用处也是非常非常多。比如记忆化递归在有时候数组不适用的情况就是用 map,还有HashSet,TreeSet,这些的源码都建议去看。哈希表的用处还非常广泛,这个基本是最常用的数据结构。
(3)树,树有很多,二叉搜索树,AVL 树,红黑树(旋转不如AVL频繁),字典树(敏感词过滤)等,leetcode 树专题,不要犹豫,直接刷,腾讯这次笔试也有树的题目。而且很容易变种,树基本是以递归,不过也会有题目要求使用非递归,这个时候就要用栈和队列来辅助,比如迭代方式前序遍历。关于树的算法题太多了,有一阵子 leetcode 周赛,每次第三题都是树。
(4)图,图的考察点不如以上频繁,大概是有向图,无向图,BFS 和 DFS,还有拓扑排序,Dijkstra 最短路径,Krusal 最小生成树等等。
(5)栈,用法也是多,感觉很多情况是和字符串挂钩,更难一些的是单调栈,某年京东除了一题很难的题目,就是用单调栈。
(6)队列,用法也是很多,比如拓扑排序,求二进制,BFS 等等。
(7)堆,很多时候有妙用,比如拓扑排序,Top K 问题。
以上数据结构一定要很熟悉,应用实在是太广泛了。我大一的时候,用c语言写动态扩容栈、队列,红黑树,斐波那契堆,二叉堆,有向图(包含各种算法),AVL树等挺难的数据结构,如果时间充足可以这么写着玩,锻炼coding能力。
重要的算法有:二分,递归,记忆化递归,回溯,广度优先,动态规划,数学(有蛮多脑筋急转弯题目的),滑动窗口(双指针),排序算法,程序设计(比如设计LRU,LFU)。
这里推荐一份大佬的刷题笔记:两个月斩获 70k star,前字节大神刷题笔记
把大部分算法都总结了
数据库
如果写后台那大概率是和数据库打交道的,这里推荐大家学习 Mysql,redis,mongoDB。MySQL 可以学习的太多了,首先要写得一手好 sql 语句,这里要注意利用到索引,减少表连接,提高 sql 效率等等,leetcode 上直接就用 sql 练习,刷个几十道足够。
然后深入一点,学习引擎,索引(聚簇索引,二级索引,B+树,Hash索引,最左匹配等),ACID特性等等,索引是重点,三面的时候详细问了B+树,然后就扯到了索引。这里建议重视一下索引,一是它是真的非常有意思,二是它真的很重点…
关于 NoSql,看的出来三面面试官是挺挖掘深度的,对于项目,数据库,操作系统,计网,问的都是挺细节挺深的,他问我聊不了解 MongoDB,我说用过但不是很了解,是以前写爬虫的时候配合用的,可以有什么什么用,扯了一堆。然后 redis 也问了,比如主从辅助,哨兵,选举机制,分区集群,等等。还好我redis学的还可以,都答上来了。
redis是绝对值得认真学习的。
关于面试
我投了提前批,所以直接参加面试。3.5 给了通知,我刚好到南京见到了女朋友,结果傍晚通知就来了,于是晚上一起在南京吃了一顿索然无味的饭,明明菜做的非常好…
帅地注:如果可以,一定要参加提前批。
一面
3.8 在常州初面,面试官很随和,带着耳机,我自我介绍到一半然后网断了,于是接下来的自我介绍他都没听见,笑着叫我重说,我突然也就不紧张了。上来直接问计算机网络,也没紧张,流畅的答完了,记得的问题就是TCP和UDP,三次握手,为啥不能二次握手,浏览器输入URL,还有的也记不得了,问的挺多的计算机网络,然后似乎对其他没什么兴趣就直接问了项目。
问了 nginx,分布式锁实现,分布式限流实现,令牌桶算法和漏桶算法,除了这些算法你还有什么思路,这些算法的优缺点比较,redis做什么用,优点?异步阻塞队列?和kafka比较?聊天系统,为什么两个项目使用的MQ不一样,MQ对比,心跳机制和选举机制。
大概是这些,总的来说答得还可以,也蛮流畅的,最后问面试官优缺点,他说优点是比较帅,我于是开始觉得我说的并不怎么样…然后第二天早上就接到了二面通知。
二面
3.10 晚上 8 点,我一边喝红牛一边等电话,二面面试官声音比较成熟一些,态度也比较正式,不过人超好,认真的介绍了自己,我一开始都没听清TEG部门…,
然后二面其实说的不怎么好,一开始一样是怼了计网,有一个问题一面面试官问过了,于是我告诉他上一个面试官问过了,然后他就跳过了,印象深的是状态码,从1-5我都说了一些,其中我还说错了,我说我项目中经常看见的Method not allowed,我说成了403,结果是400…很尴尬。
然后怼了java基础,jvm, 排序算法,我说的真的不是很好,因为过于自信…,这一面反而项目问的不怎么多。然后了解了我的性格,学习态度,有点像 HR 面,我中间紧张的时候还安慰了我,说没事喝口水。
然后有的记不得了也耐心等待我,然后聊了聊第一个项目中微信支付怎么做的,其实没什么技术含量…还有一些项目点大概忘了,聊了一下 go 语言。然后我做了一件愚蠢的事情,我问面试官我还有下一面吗,面试官告诉我不管在哪个公司问这个都是不好的,我心里凉凉的…
大家切记…最后说我总体来说挺不错的,可能有些基础忘了,但是其他方面还是不错的。结束了以后我还是挺沮丧的,觉得自己肯定挂了。
三面
然后 3.11 下午躺在宿舍床上接到了深圳总部的电话,是一个声音挺年轻的男声,后来才知道是部门主管…,
约了一下三面技术面时间,我选择了14号周日,然后安排了一下上午的时间,于是愉快(煎熬)地等待。
在学校咖啡馆面试,感觉压迫感还是蛮重得,首先考察计网,很多问题还是在面经上没有的,结合了实际场景,感觉也是在挖掘深度,怼了我的项目,问的很详细,从分布式限流,然后solr,redis分区集群,Linux,定位项目问题,查看cpu状态等,主从复制,哨兵等等,B+树,数据库。
然后说我们部门也负责的数据库,然后我哇,好厉害(确实很厉害),然后操作系统,磁盘,我坦白操作系统是我比较薄弱的地方就不往下问了,还问了存储计算分离,锁,定位功能和附近景区附近的人实现,总的来说还是感觉在挖掘深度。
然后问我兴趣爱好,我说弹钢琴和看动漫,进击的巨人你看过吗,他说你咋不说鬼灭之刃呢,恰好我寒假补完了鬼灭…,感觉人还是很亲和友好的,聊的很开心,最后我问是哪个部门呀,他说是TEG,说实话我心里是非常开心的,因为我是真的喜欢TEG。
HR 面
最后 3.16HR面试,不得不说腾讯效率高,基本是隔一天就会进入下一轮。HR面也聊了挺久的,从各方面来问,然后让我讲第一个项目从头到尾的过程,我就说了很多很多,从技术方面和团队方面,解决问题,代码规范,然后讲了一下自己的经历,了解了一下家庭情况等等。
最后过了几天打电话给了口头offer,聊了一下薪资,确定了地点是实习时间,当然是开心的不行了。第二天电子offer就发来了,于是愉快的签约。
三个面试官真的都超好,人非常亲和,腾讯效率是真的很棒,总的来说面试体验非常非常好。
帅地注:不得不说,腾讯的面试官真的好评。
另外可以通过面试题复习:Java面试题必知必会(附答案)
一些想说的话
首先要感谢一些人,一直支持我的家人,给我提供好的条件,关心我的身体。
然后是女朋友,面试是一路陪我过来的,每一轮面试都默默陪着我,在心情不好的时候安慰我,鼓励我,会一直走下去。
接着是地哥(公众号 帅地玩编程),从我大一就一直给我帮助,我有的时候发了一题算法题,过了一会就把详解给我,打的字都超多,平时很忙也没敷衍我,不厌其烦地帮我解答,公众号内容也很赞,干货满满,非常感谢。
然后是我的舍友们,大一是一位舍友,也是兄弟,教了我第一个 C 语言程序,看着小黑框,莫名的成就感油然而生。也是他给了我很多路线上的帮助,我记得大一我学不会指针,他骂了我一顿,然后教我,我还真被给骂会了,我的学习态度也是被他感染的吧,解决一个问题一晚上不睡,吃饭也在思考遇到的问题。
现在虽然人在英国,不过也保持着联系,交流学习,互相帮忙。还有一个搞前端的舍友,我们学校第一前端,和我一起经历了很多时光,一起工作一起玩乐,陪我度过艰难的时刻,感情深厚。
写这篇文章是想告诉一些新人朋友们,不管学校是好是坏,只要自己相信自己,永远不服输,永远认为自己可以,那么你一定可以,学校其实真的不是很重要,重要的是你这个人如何。我以前也很迷茫,觉得一个二本学校怎么可能去大厂,但是事实上不要考虑那么多,人生也是如此,只管不断前进就好了。
最后帅地说几句
无论是春招还是秋招,也无论拿到什么样的 offer,这绝对不是终点,而是人生另外一个重要的起点,为了让我们以后有更多的选择,我们都得持续学习,只有持续学习,我们才能变的更强,当然,所谓学习 ,绝对不局限于编程知识哦。
最后把总结的书籍送给大家:少走弯路,必读计算机经典推荐