揭秘BAT面试成功:C++后台开发学习全攻略

发表时间: 2021-08-04 15:36

前言

本人学历硕士,专业是电子通信,秋招拿下BAT,字节等多家offer,其中多数为SSP级别offer;

2020年对我而言必定是人生当中最重要的一年。因为实习的原因,我第一次体验了北京和上海的生活,匆匆且忙碌。这一年生活当中充斥着各种求职咨询,面试,做题,仿佛一夜回到了高三。不过,我是幸运的。从寒假实习开始到暑假实习再到秋招,一路以来我并没有体会到太多的挫折,一路高歌,最终也收获了我自己认为还不错的offer。也许是因为运气,也许是因为坚持,但是硕士这2年来我也经历了种种心酸和波折。我起初走过很多弯路,在无数个深夜里苦恼自己的无知和弱小,曾跌入低谷,连续数天的低沉,最终慢慢调整,告诉自己不能松懈,直到现在... 我希望可以把我从实习到秋招这一路以来的体会和经历分享给大家。作为一个还没有正式进入公司的在校学生,我在技术上还是一个实打实的”菜鸟“,但是作为一个应届求职者,我是"专业的"。本节我将从面经积累,价值观以及学习路线这三个角度介绍我的经验。

面经积累

我有一个习惯,就是记录和整理知识。从春招实习开始,我每一次面试都会录音,事后都会复盘。所有的面试记录,面试官问的问题,手写的算法题以及我个人面试的感受我都会记录下来。看过《深入理解计算机系统》的小伙伴都应该知道程序的执行是有空间局部性和时间局部性,其实面试官考察的知识点的范围也是如此。当你多次遇到同一个问题的时候就应该去把它记录下来。与其面对茫茫多的知识,不知从何入手,不如将自己遇到的问题一个一个”缓存“起来,建造一个属于自己的知识”字典“。当你的知识"字典"足够系统和完善,你就足以收获理想的offer。我的积累方案如下:

1.面试录音,及时复盘

2.事不过三,重复出现的问题单独归纳和整理

3.知识串联,通过关联的方式加强对琐碎知识点的记忆

价值观

我认为没有最好的学习方案,只有最适合自己的方案。

学习路线

实习和秋招的面试过程都是一场又一场的持久战,我在2年前也和大家一样对面试畏惧,对学习恐慌,非常迷茫。很庆幸自己走过了这2年,在此我会将我自己的学习方法和面试经验总结给大家。

编程语言千万种,到底该学哪一种?

我认为语言不分优劣,只分喜好,只看需求。本硕这几年我学过C/C++,JAVA,Python,Matlab,Golang,Javascript,用来用去还是C++和Golang适合我,但是我也不排斥去使用其他语言。

学习编程语言第一步:上课。如果你是刚入学的小白,那就去好好上课吧,计科老师说的一定比我好。如果你已经错过时机或者没办法天天去教室里上课,那么网课是我最推荐的。

在哪里可以搜索合适的课程:

Coursera:我最开始使用的渠道,当时看了很多北大的C++入门课程(比较简单现在只记得有个喜欢扔水瓶的老师)

B站:B站是非常好的渠道,如果你知道课程名直接去B站搜吧,如果大家是学习LinuxC++后台方面的,这里推荐一个UP主,后台各方面的知识都有

Linux集结地的个人空间_哔哩哔哩_Bilibili

3.腾讯课堂:虽然大部分机构都是想要你买课的,但也有一部会在免费课程上面讲些干货,这个就需要你自己去判断,这里我也推荐一家专门讲LinuxC++后台方面知识的课堂

C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

我个人主要使用的语言是C++,所以我以C++学习为例:C++不容易学好,如果仅仅是学习语法或者写个算法题那一两周可能就可以上手。但是想用好C++还是需要很长时间的coding和源码阅读积累。我个人的方案是先看书,再实践,再看书这样的不断循环。道理大家肯定都懂,但是能够坚持做下来的太少了。

给大家推荐我看过的几本C++相关的书籍:

《C++语言的设计与演化》:可以用来理解C++的设计思路,知其所以然

《Effective C++ 》:很多关于C++方面面试问题的出处

《C++ Primer》 :很多人推荐看完这本书,但是这本书内容太多了,我建议当一个字典,遇到问题去查。

《STL源码剖析 》:C++代码的典型案例,还可以帮你理解数据结构的标准实现

C++项目那么多,到底该看哪一个?

只看书不coding永远都是空中楼阁,而且C++的知识点非常多且琐碎,一种需求可以有多种实现,如果不实战真的很难发现其中不同之处。所以需要一些项目练手。如果大家和我一样是后台开发方向,那么可以去找一些网络服务器相关的项目去练手,一方面可以加强对Linux操作系统的理解,又能增加网络知识,同时也可以锻炼C++ coding能力,一举多得。那么有哪些值得做的项目呢?

1.做别人推荐的好项目:

WebServer

我在实习前看的是大佬 (牛客id:健康成长天线宝宝啊 )的个人项目
WebServer:https://github.com/linyacool/WebServer。基于他的项目和我后续看书的总结,在1-2个月的时间里我也实现了一个web服务器,这个项目是我简历上除了实习项目之外被问的最多的项目。

2.看STL源码:

STL源码,有各种C++高级技能的实现。推荐大家去看看STL里的快排实现源码,第一次看到真的很有意思。

3.开源项目:

下面是几个还不错的开源项目,如果当前有不错的基础可以去通过源码学习:

libevent:Libevent是一个轻量级的开源高性能网络库,采用事件触发,封装了以下三种事件的响应:IO事件,定时器事件,信号事件。

Memcached:Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态数据库驱动网站的速度。

Redis:Redis是一个基于纯内存的存储系统,虽然是C写的但是值得一看。

切记,项目当中实现功能只是一方面,测试和文档整理也很重要,项目的每一步都需要文档和数据的支撑。

【文章福利】小编推荐自己的linuxC/C++语言交流群:832218493!整理了一些个人觉得比较好的学习书籍、视频资料共享在里面,有需要的可以自行添加哦!~



整个学习路线分为以下几个部分,这里细分出了一些知识点,大家参考学习

一、 数据结构与算法、设计模式、工程管理

排序 (11种排序) 与 KMP

红黑树 证明

B树与B+树

Hash与布隆过滤器

责任链模式

过滤器模式

发布订阅模式

工厂模式

Makefile/cmake/configure

git /svn与持续集成

Linux系统运行时命令

二、代码实现、方案分析

网络io与select/poll/epoll

reactor的原理与实现

http/https web服务器的实现

websocket协议与服务器实现

服务器百万并发的实现(c10K,c1000k, C10M)

redis/memcached/Nginx网络组件

Posix API与网络协议栈

UDP可靠协议 QUIC/KCP

三、池式结构、高性能组件、开源组件

线程池(手写)

内存池 ringbuffer

异步请求池 性能优化,异步mysql 异步dns 异步redis

mysql连接池

redis连接池

原子操作 CAS

消息队列与无锁队列

定时器的方案 红黑树 时间轮 最小堆

锁的实现原理 互斥锁,自旋锁 ,乐观锁,悲观锁,分布式锁

服务器连接保活 keepalived

try/catch的实现

libevent/libev框架

异步日志方案 log4cpp

应用层协议 protobuf/thrift

openssl加密

json与xml解析器

字符编码unicode/gbk/utf-

四、协程框架的实现、用户态协议栈 NtyTCP (tcp/ip)

协程的原理与工程案例

协程的调度器实现

滑动窗口 拥塞控制 满启动

tcp定时器的实现

epoll的源码实现

五、Skynet、ZeroMQ、DPDK

skynet高性能网关

actor实现与cluster/负载均衡

skynet网络与热更新 数据共享

ZeroMQ Router-Dealter模式

源码分析:消息模型与工程案例

源码分析:网络机制

dpdk PCI原理与 testpmd/l3fwd/skeletion

kni数据流程

dpdk实现dns

dpdk的高性能网关的实现

半虚拟化 virtio/vhost的加速

六、 MySQL、Redis、Nginx、mongodb、dfs

SQL语句 索引 存储过程 触发器 2.数据库连接池与sql解析剖析

存储引擎原理 MyISAM与Innodb 事务隔离

自己实现一个存储引擎 MySQL源码

MySQL集群与分布式 高可用高并发

Redis相关命令与持久化

Redis连接池与异步操作

源码分析:存储原理与数据模型

源码分析:主从 原子模型

redis的集群方案

Nginx使用conf配置

nginx模块开发 过滤器模块

Nginx模块开发 handler模块

源码分析: Nginx Http状态机

源码分析:进程间通信与Slab共享机制

Mongo接口编程与MongoDB命令使用

MongoDB的集群方案

ceph

fastdfs

七、Linux内核进程管理、内存管理、文件系统

进程管理与调度

锁与进程间通信

系统调用 如何自己实现一个syscall

物理内存 伙伴算法 2.进程虚拟内存 mm_struct

页的回收与页交换

虚拟文件系统

Ext2/3/4 文件系统

无持久的存储

八、性能分析

工具 wrk/ webbench/ loadbalance/valgrind

Google gTest/Memtrack

火焰图/热图

九、分布式架构篇

腾讯的Tars

虚拟化的docker

分布式注册中心etcd

P2P 网络穿透 打洞 去中心化的网络

写在最后

最后我想说:秋招 = 心态 + 实力 + 面试技巧 + 运气

心态:建议大家保持一个积极的心态,不轻视自己也不高估自己,脚踏实地做好自己;

实力:建议大家加深自己某一个方面的深度,拓宽技术面的广度,只有深度+广度才能脱颖而出;

面试:建议大家多参考面经,哪些岗位需要考什么,自己多提前做好准备

运气:作为求职者我们没有足够的信息,无法预知某个公司岗位的难度,不要嫉妒别人的轻松,机会只给有准备的人,努力的人运气一般都不会差;

我目前还在慢慢的职业摸索阶段,也还是一个菜鸟而已,如果有任何错误的地方也欢迎大家指正修改。我的方法和经验不一定适合所有人,如果这篇文章真的可以帮助到未来求职的你也就达到我的目的和初衷。愿大家一起进步。