本文已在个人GitHub开源项目:forthespada/CSLearning中收录,其中包含不同方向的自学编程路线、面试题集合/面经及系列技术文章等,资源持续更新中..
本文作者:阿秀
前言
最近应邀在牛客网写C++求职专栏,又把以前的秋招总结补充了很多东西,现在想想还是发出来,希望能够帮助更多的新手小伙伴们。
个人情况简介
楼主本硕均读于双非院校(普通二本学校)、本硕都是计算机相关专业,英语六级水平,本科时期辅修了一个水的不能再水的英语第二学位。
本科时期学过很多语言:VB、C、C++、Java、C#都有所涉猎,研究生时期则主攻Python和C++。研二上学期开始系统学习C++,并且不断系统看书和实践,中间崩溃过、迷茫过、放纵过,但从未放弃,始终相信自己,坚持咬牙走下去。所幸天道酬勤,最终也是拿到了一些不错的offer 。
投递经历
笔者从2020.6.15号正式开始投递简历,到2020.8.23号截止一共投递过94家公司,其中既有提前批(2020年6月-7月),也包括正式批(2020年7月-10月)。
小建议:如果说求职者对自身实力不自信,可以多投投一些公司,选择面放宽一些,不要死盯着那几个大厂投。
共计笔试59场(最多一天做了5场笔试,那天天差点去世),54家公司给了面试机会,54家企业中有些企业是免笔试的。
秋招结果:最终成功走到了6家公司的offer环节:字节跳动研发岗SP、华为通用软件开发、百度C++研发岗、B站后端研发岗、深信服C++研发岗以及农业银行研发岗,最后签了字节跳动,也是自己心心念念的大厂之一,十分满意了~
接下来从6个方面对秋招进行复盘和总结,希望能够帮到大家鸭,特别是大三大四的小学弟们。
1、算法
在秋招过程中,算法是极其重要的,再次重申一遍,真的很重要!笔试就不提了,算法不过关,笔试基本凉凉,面试基本都要手撕代码,很多面试过程中算法题具有一票否决权,如果你能够顺利解出来,面试也不一定过。即使面试过了,手撕代码没撕出来,面评估计也是一般般了。但是如果算法题做不出来或者说bug太多调试不通的话,面试上基本上就跪了(个人以及身边朋友经历,不一定准确),在牛客网上也看到过很多基础很好的牛友就是因为面试过程中的算法题没解出来而直接饮恨的,希望大家千万重视算法这一块,千万千万要重视算法。
我大概在力扣上刷了300+,HOT100都刷了,剑指offer刷了3遍,刷完这些基本够用了,自己也有注意总结题型,常见题型就是那些,所以算法题基本没怎么拉过我后腿。一般来说,主要考的就是动态规划、贪心、二叉树、链表、数组、字符串之类的。
推荐资料:
力扣1-300题(前300道题非常经典,建议学有余力的同学都刷一刷)
力扣HOT100(跟上面有不少是重复的,刷的时候要注意总结)
啊哈!算法、大话数据结构(这两本书都是面向新手的图书,图画很多)
剑指offer(这本书不需要多做介绍,校招必备)
挑战程序设计竞赛(这本书属于进阶一点的算法书籍了,作者是ACM-ICPC全球总冠军,可以说是世界顶级程序设计高手的经验总结了,需要慢慢消化,经典题型太多)
程序员代码面试指南(左程云大神的书,我并没有看完,只是看了其中的海量数据处理部分的题目就已经十分受用了,在某大厂三面中就考查到了其中的海量数据集处理的问题)
2、操作系统
操作系统是比较重要的,面试三大要点之一(操作系统、计网、数据库),我是在B站上看过一些操作系统视频,同时自己慢慢看书、看博客学的。其中死锁、虚拟内存、堆栈、进程线程、内存管理、磁盘调度等都是重点,也是面试过程中问的比较多的一些知识点。你如果能够在面试过程中讲出来一些具体的操作系统知识,而不是泛泛而谈,肯定是很加分的,比如常见知识点进程线程区别,在提到线程切换比进程更快时,你如果能够很清楚明白的说出来进程切换做了哪些、线程切换做了哪些以及线程为什么比进程快,毫无疑问很加分的。
推荐资料:
B站哈工大操作系统:https://www.bilibili.com/video/BV1d4411v7u7
B站清华大学操作系统:https://www.bilibili.com/video/BV1js411b7vg
B站美国麻省理工MIT 6.828操作系统神级课程:https://www.bilibili.com/video/BV1px411E7ST
现代操作系统(也是讲操作系统的一本好书,讲的很细)
深入理解计算机系统(大名鼎鼎的CSAPP,被誉为“和金子一样重要的计算机基础书籍” , 很厚的一本黑皮书,需要慢慢看)
现代操作系统:原理与实现(上海交通大学陈海波教授的著作,书中主要介绍操作系统的理论与具体实现细节等,感觉不如CSAPP)
3、计算机网络
计算机网络也是重点之一,特别是HTTP以及TCP/UDP相关知识点,算是校招必备考点了,面试必问,但是难度是逐年上升的,原因可能就在于内卷程度越来越严重了吧。比如说以前对于三次握手四次挥手只问过程,现在直接让面试者画出客户端以及服务器端的各个状态码以及解释各种意外情况,比如SYN请求丢失会怎么样?
建议计网的学习先从视频入手,然后再看经典书籍,毕竟视频中的知识都是别人总结好又给你讲解的,只有自己亲自揣摩、亲自动手实践得来的知识才是自己的,自己学来的才是真,经过实践方知分晓的~
推荐资料:
B站韩立刚老师的计算机网络(韩老师讲课诙谐易懂,让你在哈哈大笑中学到很多知识点:https://www.bilibili.com/video/BV17p411f7ZZ)
图解HTTP、图解TCP/IP(这两本书比较简单,日本人写的,把复杂的知识点简单化)
网络是怎样连接的(这本书紧紧围绕一个问题:输入一个URL,直到我们在网页端看到请求的内容,这中间发生了什么?抽丝剥茧将这个问题逐步细化,带你走完整个网页访问的过程)
计算机网络:自顶向下方法 (也是常见经典书籍之一,重点看第三章传输层TCP/UDP)
4、Linux
C++跟Linux基本是离不开的,特别是后端方向跟网络通信关系很大。在实际工作里,很多成熟的项目都是在Linux上进行开发的。所以有必要学一些Linux以及一些网络通信编程,网络通信涉及到的知识点很多,比如IO模型、线程池、多线程之类的。本人在秋招过程中被问过不少网络通信的问题,最频繁的就是select、poll、epoll的区别以及相关底层实现了。这里也推荐一些资料,都是我个人看过的。
推荐资料:
鸟哥的Linux以及Linux就该这么学这两本书(个人感觉更适合作为一本工具书来使用,当然了,如果你有充足的时间也可以系统的看上一遍,对于Linux也会有更深的认识和了解了)
TCP/IP网络编程(韩国人写的,书中例子很多,适合作为入门,另外github上有很多笔记,可以边看别人的笔记边看书,加深个人理解)
Linux高性能服务器编程(游双老师的书,其中前四五章讲的是计网的东西,后面讲的很好,涉及内容很多,看完就大概明白服务端编程常见知识点和所需要掌握的技能了)
Linux多线程服务端编程:使用muduo C++网络库 (北师大陈硕大神的书,需要很多基本,建议后期再看,我也只是看了一小半)
5、数据库
数据库主要问的都是MySQL以及Redis相关的一些知识,普通研发岗掌握这两个基本也够用了,数据库常问知识点包括索引相关、性能优化、B+树、Redis底层模型、跳表以及缓存击穿、雪崩、穿透等常见问题。有时候也会让你手写一些简单的SQL语句,比如给你一个学生表和课程表,让你找出成绩排名前十的学生姓名之类的。
推荐资料:
MySQL必知必会(一本很薄的小册子,不到一周就看完了,看完基本的SQL语句没什么问题了)
高性能MySQL(建议只看索引以及优化这两章,后续的可以慢慢再看,这本书,真的真的很厚。)
Redis设计与实现(算是Redis入门资料吧,认真看完的话就对Redis有大概了解了,话说Redis这么火爆是有原因的,其中的一些精妙设计真的看完令人大呼过瘾,不得不承认,人与人之间真是有差距的。。。)
极客时间- Redis核心技术与实战 (中科院的研究员开设的Redis专栏,个人已经买了,非常不错)
另外再推荐基本数据库底层的书籍:数据库系统实现(华东师范大学数据学院指定数据库原理书籍)、MySQL技术内幕 -InnoDB存储引擎(InnoDB的详细剖析)
6、C++
C++的知识点比较多,也比较细,其实C++并不容易学好,如果你只是简单学习一下语法比如for循环、变量类型之类的,那么一两周你就可以上手,但是如果想要学好C++还是需要持之以恒的coding,由于个人是C++技术栈,这里也只是推荐C++相关书籍和视频,都是本人自己看过的经典书籍和资料。
推荐资料:
B站黑马C++视频(黑马机构出版的入门级C++教学视频,很不错:https://www.bilibili.com/video/BV1Tb411j7uM)
STL源码剖析视频(C++大师侯捷老师的源码视频,搭配STL源码剖析看效果更佳:https://www.bilibili.com/video/BV1db411q7B8)
C++ Primer 第五版(我愿称之为C++圣经,800页左右,我看了2遍,超级棒!强推!)
Effective C++、More Effective C++(前者2遍,后者1遍,跟C++Primer中很多内容是有重复的)
STL源码剖析(源码方面的好书,看了2遍,现在时不时还拿出来翻翻)
深入探索C++对象模型(重点是虚函数那一章,看完你就会对虚函数有新的认识了)
碎碎念
可能有些人会问,这些书你都看了吗?这也太多了之类的?自己能不能看完?
说实话,看着是挺多,但是其中有很多知识点是一样的,比如你详细了解计网后,游双老师的那本Linux高性能服务端编程中的前四章你大概略过即可,就不再需要细看了,知识是有相关性和相通性的,有了前面的沉淀后期自然就好很多了。
还有就是学会善用目录。有时候,看过目录后就大概知道这章或者这小节讲的是什么了,建议在看一本书的时候先看一遍目录,挑选出自己不懂得或者感兴趣的章节来看,而将已看过的或者暂时不需要的放到后期再去看 。
慢慢学、慢慢看,慢慢的就会有收获了。
如果你像我一样学校不太好,不是什么重点学校或者不是计算机专业的,那么请你笨鸟先飞,赢在起跑线上。上面的书籍资料之类的,我并不是在5个月时间内看完的,自从学C++以来就慢慢看、慢慢学的,我想其他语言,Java/Go之类的也应该如此。
正所谓,天道酬勤,你付出汗水和努力,剩下的交给时间就好!
最近在看汇编语言,王爽老师的那本《汇编语言》讲得真好,以前的那些寄存器、数据总线、地址总线概念忽然变得很清晰明了、活灵活现了,我自己也慢慢学会使用汇编写一些程序,懂得一些指令级程序优化的思路和方法,算是沉迷其中不可自拔吧!哈哈~
一入IT就做好终生学习的准备吧,你既然想要拿别人拿不了的高薪,怎么能不付出比别人多的汗水、时间和精力呢?天上掉馅饼是不可能的,如果你还在想着偷懒耍滑,想要不付出时间和汗水就想拿到好offer,说明你并不是很适合计算机这一行~
结语
如果你没有别人聪明,不如别人条件好,如果你下定决心学习计算机,请你多投入时间、多投入精力、多投入汗水!