如何拿到大厂 offer——C++ 后台学习路线
一点简单学习和秋招经验,希望可以对后来的同学有一些帮助,特别是对一些找不到学习方向的同学吧。
笔者是211本,985硕,非科班,无实习,无论文,我主要使用的语言是C++,投递的都是后端开发的岗位,拿到的offer有:字节跳动,快手,腾讯云,百度,猿辅导,华为,网易雷火和阿里云。
下面就学习方法,实习和面试技巧三个方面分享一下我的经验
1.学习方法
1.1 看书
我并不是计算机专业的,学习C++大概是从去年年初开始,我学习的主要方式是看书和写代码,先说一下学习流程,书单在最后一起给出:
在刚开始学习的时候,看书的重点在于了解语言基础和数据结构。因为有了这两样技能,就能够做一些算法题了,可以在平时看书累的时候做一些有意思的算法题,也能提高自己写代码的熟练度。
在了解完数据结构之后我看的第三本书是APUE,这本书看起来可能很痛苦,不过根据我的经验这本书上的内容除了一些比较重要的东西,并不需要全部记下来,读一遍,能够理解到书上的系统调用的作用就OK了,对一些重要的接口(fork,select,pthread等),能够理解到内核是怎么实现的就OK了,可以把这本书当做手册来使用。
看完APUE,加上之前的知识其实就具备了在linux端进行C++开发的能力。想要自己直接写出一个好的项目是很困难的,所以我推荐抄,陈硕的muduo是一个很好的学习例子,配合他的书一起食用更佳。吃透muduo库的话,就能够对后端的reactor模型有一个比较清晰的认知,帮助会非常大,看完之后可以自己实现一次muduo,之后可以考虑对muduo进行一些二次开发
在写muduo的过程中因为还遇到了网络相关的问题,所以我还看了计网相关的书籍。
因为在linux端的编程没有合适的IDE,写完之后需要使用G++工具配合makefile文件进行项目的编译链接。为了搞懂这个链接的过程,我又专门看了相关的书籍,《程序员的自我修养》。
到此为止学习算是到了一个阶段。在后面我又对自己的基础进行了一些补充,做软件相关的不能完全不懂操作系统吧。所以我又看了csapp和操作系统相关的书籍,apue中其实也有一些操作系统的知识,可以相互结合。
到此为止,对计算机基础知识的了解就应该不错了,能够有一个良好的语言基础,熟悉数据结构,计网和操作系统,了解编译链接的过程,能够正常使用linux系统,熟悉后端服务器模型。在此之后的学习我感觉就见仁见智了,对什么感兴趣就去学什么。举个例子,对redis感兴趣就可以去看相关的书籍,会发现redis其实就是一个reactor模型,有之前muduo的基础,会更好的理解redis是如何单线程高并发的。对数据库感兴趣的可以去看相关的资料,leveldb的源码等等。对分布式感兴趣也可以去看看各种分布式算法的paper,有兴趣可以自己实现。
下面列一下基础书单:
C/C++: 《C++ primer》
数据结构:《数据结构、算法与应用》《STL源码剖析》
计算机网络:《计算机网络自顶向下方法》
操作系统:《深入理解计算机系统》(强推!!!!神书)、 《操作系统:精髓与设计原理》 《apue》
链接:《程序员的自我修养》
应用:《linux多线程服务端编程》《linux高性能服务器编程》
其他(扩宽眼界类书籍,但深度不足):《图解HTTP》《大型网站技术架构》《大型分布式网站架构设计与实践》《从零开始学架构》
除了这些之外还看过《effective C++》,但是我没有太多的收货。也看了《深度探索C++对象模型》,这本书很晦涩,关于C++内存模型,虚函数,虚表,虚继承相关的其实可以看看博客,基本也就够了。此外也看过《UNP》,感觉也没有特别多的收获,不过还是推荐看一看前面讲TCP和UDP编程的章节。
除去这些之外还看过redis,分布式和微服务相关的书籍,这些学习方向的选择可以很看个人爱好,我就不多推荐了
1.2 刷题
在这个行业越来越卷的情况下,刷题就变得越来越重要了,基本上每家公司的面试必有手撕代码。关于刷题的经验,这个我没有什么特别的心得,有些说按题号刷,有些说分类别刷,看自己习惯吧。
坚持参加你能够明显感觉到自己的进步。
1.3 项目
关于项目,其实根据我的经验,在找实习的时候项目并不是那么重要,更多的面试官会更重视基础,不过有一个让面试官感兴趣的项目也是不错的,因为聊项目是你的主场优势,大概率能够表现得很好(前提是对自己的项目很熟悉)。
在秋招中,没有实习的同学来说,项目就比较重要了,因为一般面试官都是在聊完基础之后,根据项目来展开聊,或者直接根据项目聊。让你的项目能够吸引住面试官就很重要了。
关于做什么项目,其实可以有一些自己的想法,把自己学过的知识和框架用起来,去实现一个自己想做的东西,而不是在网上去抄一个千篇一律的项目。
比如muduo,它本身确实是一个特别好的项目,但是当大家都使用这个项目的时候,你和大家一样,就没法表现出你自己的特点了。如果使用muduo作为项目,其实可以在它的更上层做一些业务逻辑的实现,去实现一个具备特定功能的服务器,比如rtsp服务器,或者实现成为一个微服务的中间件,实现一个服务名字管理系统等。
因为我个人比较喜欢分布式,在看完raft算法后,我对其进行了一次实现,底层的信息通信就是使用muduo(做了一些修改,需要server可以主动发起连接)实现的。如果还有余力,可以想办法对你的raft进行优化,比如使用readIndex算法进行读优化等。
1.4 其他
除了看书之外可以多看博客,关注一些好的技术公众号等,可以和书籍学习的知识相互印证
学习的时候需要多想,尽量能够将知识融会贯通
在完成前期的基础学习后,应该找到自己的学习方向,看完一本书之后去实践,实践之后会用更深的体会,为了解决实践中的问题去学习新的知识,形成这样一个良性循环。
出去底层技术相关的知识可以看一看一些高屋建瓴的书籍,扩展自己的视野,比如《大型网站技术架构》《大型分布式网站架构设计与实践》,看这些书可能不会立刻获得一个技术上的提升,但是可以开阔眼界,了解一些负载均衡,token,cookie,sql注入,csrf等常见的web相关知识。
总的来说:多看多写多想,眼到手到心到。多思考怎么才能学出自己的特点,让自己和别人不一样。
2.实习
在这个越来越卷的大环境里面,有个实习肯定会很好,特别是大厂实习。不过因为某些原因,我并没有实习过。但是我想说的是即使是不能实习的同学也可以参加春招的实习面试,有以下几个好处:
某些公司通过了实习面试,但是不去实习可以在秋招获得优待(阿里和字节某些部门直通终面)
就算没有优待,表现不错混个脸熟也是好的,可能在提前批更容易被捞起来(提前批一般没笔试,看简历捞人来面试)
可以靠面试给自己查漏补缺,找到自己的不足,还可以询问面试官给自己的建议(不管能不能通过都稳赚不赔)
就算挂了,一般春招投递过并不会影响正式的秋招。
能够对自己的实力有一个大概的摸底,对自己的水平有一个清晰的认知。这样在秋招中能够做出更好地选择。
所以极力推荐即使无法实习的同学也可以参加春招的实习生面试,当然能参加实习就更好了。
3.面试
对于秋招,实力是很重要的一部门,但是面试的技巧也是很重要的。其实面试就是和面试官聊天,你俩聊得高兴,很聊得来,自然就更容易过。你学习的知识并不是面面俱到,如何引导面试官在你擅长的领域提问,这些都是需要技巧的。
3.1 从多方面回答问题
对于面试官的问题,可以尽量深入的去回答,不要只有干瘪瘪的几句话,结合自己所学过的所有知识,尽量从更广更深的角度回答。
举个例子:比如经典老问题,进程和线程的区别。一句话总结,进程是资源分配的基本单位,线程是执行流。只有这一句话肯定是不可以的,我们可以结合学过的知识从多方面进行回答,比如系统给进程分配了什么资源,线程又是如何共享进程资源的,线程有哪些自己的私有资源,在编程中多进程和多线程的区别,在linux系统中进程和线程又是如何实现的,进程和线程又是如何创建的,他们之间的区别和联系都是什么。
尽可能从更多的方面回答面试官的问题,只要面试官不说停,你可以一直往下说。当然必须要切题,不要扯得离题太远。
3.2 引导面试官
在我们回答一个问题的时候,按照上述的办法,尽可能的多说,但是在说的过程中可以给面试官抛出下一个可以问的点,这个你主动抛出的点必然是你熟悉的,这样可以引导面试官,一直在你熟悉的领域提问。
举个例子:比如在回答进程线程区别的时候,可能会讨论到进程分配资源,有进程空间,其实可以顺道提一句这个进程空间其实是一个虚拟内存空间,资源存放的地址是虚拟地址,并不是真实使用的物理页面地址。面试官很有可能会接着这个点继续问下去。
3.3 面试过程中态度积极,不卑不亢
对于会回答的问题认真回答,对于不会的问题也不用紧张,毕竟我们没办法面面俱到,告诉面试官自己不了解即可。在解决面试官出的场景题时可以积极沟通,不要一个人埋头苦想让场面尬住,可以让面试官引导自己一下。
面试问题整理:
有C++和计算机相关的问题欢迎大家进群交流
Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、大厂面试题、和热门技术教学视频资料共享在里面(包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等.),有需要的可以自行添加哦!~
希望可以帮到后来的同学们,祝大家新年快乐,新的一年都能找到满意的工作!