先说说拿到的offer,从大三下-大四上的暑期开始面试,最终在过年前完成所有面试。
百度: 核心搜索部 后台开发工程师 (毁约) (四轮技术面)
阿里: 蚂蚁金服 JAVA研发工程师 (四轮技术面)
腾讯: 腾讯云中间件 后台开发工程师 (签约) (三轮技术面)
京东: 京东云 C++开发工程师 (两轮技术面)
网易游戏: 大话事业部 游戏研发工程师 (两轮技术面)
字节跳动: 广告系统部 后台开发工程师 (三轮技术面)
商汤: 商汤研究院 AI平台研发工程师 (三轮技术面)
科大讯飞: AI研究院 算法与引擎开发工程师 (三轮技术面)
SunnyKing: 北京研发中心 区块链研发工程师 (三轮技术面)
BIGO: 在线推荐组 后台开发工程师 (三轮技术面)
日志易: 搜索引擎(C++)研发工程师 (三轮技术面 )
深信服: C++开发工程师 (三轮技术面)
面试难度:
百度 == 阿里 > 腾讯 > 字节跳动 > BIGO > 网易游戏 > SunnyKing > 商汤 > 日志易 > 京东 > 科大讯飞 > 深信服
其它公司,玄学
美团: 面了5分钟,面试官说不要C++,只要JAVA,就把电话挂了。。
滴滴出行: 投了简历,没反应。。
快手: 个人感觉表现不错,但是玄学挂。
拼多多: 2轮技术面完成,面试官说通过面试,等hr消息,后面就没消息了。。。
Momenta: 3轮技术面之后,hr说面试官评价很好,但是第二天却说不合适(喵喵喵?)
华为: 暑期在广州网易游戏实习,让回长沙参加提前批面试,但是又不报销路费。。。。(车费太贵,没回。。。)
最后接了腾讯。
大学之前编程零基础
,从大一开始努力敲代码。搞了快2年ACM
,不过水平太菜。
大概从大二开始确定自己的方向就是后台开发,自己一步步摸索总结,问一些学长学姐
,去各大公司找招聘要求
,去知乎,牛客网,谷歌/百度,简书,csdn,github
等搜索面经,经典书籍,别人的经验贴,优秀框架,一些资源等
,然后尝试造一些轮子
,写一些项目
,找实习
,再然后不断面试总结。
我主要投的是c++后台开发的岗位,当然还有其他的一些岗位,所以主要介绍c++岗位该如何准备。其他岗位也差不多。
操作系统 , 计算机网络 , 编译原理 , 数据结构与算法 ,计算机组成原理 , 数据库原理
对于校招生来说,计算机基础是很重要的。在面试过程中,会被问到很多基础知识,有些问题比较常见,比如:
线程与进程的区别,多线程与多进程,tcp三次握手,挥手,tcp可靠性,tcp状态转移,拥塞控制,滑动窗口,慢启动,快速重传,
time_wait状态,http协议,https协议,http状态码,
快排,栈,队列,hash冲突,链表,数据库索引,B+树,数据库事务,事务隔离级别 等等
只列举了一部分,这些问题都是最基础的,经常会被问到,得保证自己一定可以答出来,并且最好可以深入理解,可以通过复习之前学过的知识,也可以去看一些面经来准备。
有些问题是算比较难一点,比如:
tcp协议为何要那样设计?红黑树旋转,虚拟内存,cpu地址翻译,数据库索引优化,sql查询优化,
mysql存储引擎(Innodb 与 MyISAM),
cpu指令优化,汇编语言,链路层协议,路由算法等
这些问题可能会被问道,也可以了解一下。
《剑指offer》 , Leetcode , 牛客网 , ACM训练
算法与数据结构是非常重要的一部分,不管是笔试,面试都会考察。
1 笔试
笔试中一般是以编程题的形式出现,也会有选择题,填空题等形式。可以刷一刷牛客网,一些oj网站
,最好是去搞一搞ACM
。算法都是比较基础的,包括一些排序算法,贪心,动态规划,递归,bfs,dfs,一些简单的数学知识等
,有时候会难一些,比如:图算法,并查集,各种背包问题,线段树,树状数组,KMP算法等
。数据结构的话,一般是链表,栈,队列
之类的,当然还会有一些计算机基础知识
的题目。
2 面试
面试过程中也会考察算法与数据结构,有时候只需要口头的方式回答就行,这个一般不难,重点是代码考核,面试官给你题目,会要求你在规定时间内写出代码,有时候只需写出代码,解释清楚代码即可,这个难度小很多。但是很多时候都是要求你可以运行代码无bug并且可以通过测试,这个还是有点挑战的,容易出问题,字节跳动
等公司就特别喜欢这样考察。 可以看看《剑指offer》
这本书,书中的问题都是比较简单的,快一点,2-3天看完了,慢一点,一个星期。但是最重要的是要熟悉和深入思考,对于书中的问题,得做到20s内有思路,10分钟内写出代码。
推荐去leetcode
刷刷题,很多公司喜欢拿leetcode的题目考察你,题目类型参考笔试中列举的那些。
当然有时候也会有一些ACM算法题
,可以去杭电oj,poj
等网站刷刷题,也可以看看一些算法书籍,系统学习。
算法是一部分,很多公司,例如百度会要求你写一些实际的工程代码,比如我面百度时候,就写了:
通用文件系统,实现LRU,手写web socket,手写线程池。
有时候也会让你写一些库函数:例如 strcmp , strcat , strcpy
,这个比较常见。
很多时候还会问你STL库的相关知识,例如一些底层容器实现原理
。
有时候会让你提交一个项目,这种情况非常少,只有我面腾讯
的时候写过:一周时间内,写一个nginx压测工具
这些问题其实还是有些难度,平时多写写代码,多思考。
ps:
我也搞了快2年ACM,属于ACM校队一员,不过算是特别菜的那种。校队每年秋季学期都会招新,感兴趣的可以去试试,
然后湖大每年暑期有个ACM暑期集训,所有人都能报名。集训2个月,很值得参加。
经典书籍,基础语法,高级语法,新标准,内部机制
一般来说,语言问的东西就是:基础语法,高级语法,新标准,内部机制。
我主要是搞c/c++的开发,所以拿c++语言举例子。
基础语法包括:指针,一些关键字例如const,static等,类的相关知识,4种强制类型转换等
高级一点就是:继承,多态,模板,虚函数等
新标准:比较多的还是C11,比如智能指针,右值引用,Lambda等
内部机制:比如虚函数表,内存管理,多态原理,智能指针原理等
熟悉某门语言,不一定能够答出相关问题,多读一些书,看看面经,多思考,多积累面试经验。
最主要的还是多写代码吧,只有不断写,才能深入理解。
与岗位相关的项目&实习经验
项目经验这个其实是非常重要的,最好是岗位相关的项目经验,有时候项目经历与岗位不是很相关也是不行的,我之前面美团
,面试官看我是搞c++的,5分钟就挂了我,说他们只要java。。。不过也不一定,我面阿里
的时候,就是没有java项目,面试官还是给过了。
实习经验这个非常非常非常重要,特别是大厂实习,有机会去大厂实习,翘课也要去。有大厂实习经验,秋招的时候很加分。
我是做后台开发的,肯定就需要网络编程相关的知识:
1 socket函数:socket等函数是最基础的了,还有其它相关的一些函数
2 线程(进程)模型:单线程(进程),多线程(进程),线程(进程)池
3 事件监听:select , epoll , poll 等知识
4 事件处理模式:reactor , proactor
5 I/O类型:同步I/O,异步I/O,多路复用,阻塞式,非阻塞式,信号驱动I/O
6 并发模式:半同步/半异步模式,主-从模式,领导者/追随者模式
7 通信方式:消息队列,共享内存,管道,信号,信号量
8 linux API: fork , vfork , exit 等
9 网络框架:libevent , memcache , ACE , muduo等
10 其它:定时器(时间轮/最小堆),信号,进程池,线程池,状态机,心跳检测,内存池等,linux相关的知识,分布式系统的知识
linux常见命令,linuxAPI,GDB调试,shell,Linux kernel,分布式系统设计与开发,开源框架,负载均衡技术,一致性哈希算法,
分布式一致性协议,脚本(python/golang),No SQL,MySQL,逻辑问题,海量数据处理,缓存,系统架构,rpc,微服务,大数据相关,
一些机器学习算法,协程等
扩展知识也很重要,可以成为你的一个加分项。
下面是我在面试中用到的一些扩展知识:
linux 内核:比如CFS调度,内核中断,内核同步,tcp网络栈,存储管理,slab缓存,伙伴算法,高端内存,虚拟内存实现
rpc框架:例如grpc,
分布式系统:例如分布式一致性协议,分布式系统架构设计,缓存设计,zookeeper
负载均衡技术:比如各种负载算法,nginx负载,LVS
微服务相关:比如 servicemesh,spring cloud,docker等容器技术
大数据相关:比如spark,Hadoop,hbase
常见机器学习算法:比如决策树,SVM,神经网络,贝叶斯网络,boosting
协程:协程原理,微信开源的libco项目
海量数据处理:分治 + hash , 布隆过滤器,bitmap,倒排索引,外排序等
....等等
你可以多和面试官多聊这方面的知识,突出你的优势。但是一定得是自己熟悉和理解
的前提下,不然容易被怼死。 最主要的就是知识的广度 + 某个方面的深度
。
1 书籍
推荐我看过的一些比较好的书籍和源码
C/C++:
《C和指针》
《c++ primer》
《effective c++》
《深度搜索C++对象模型》
网络编程:
《TCP-IP详解卷一》
《UNIX环境高级编程》
《UNIX网络编程卷一:套接字联网API》
《UNIX网络编程卷二:进程间通信》
《Linux高性能服务端编程》
《Linux多线程服务端编程》
《ACE程序员指南-网络与系统编程的实用设计模式》
数据库:
《MySQL技术内幕(InnoDB存储引擎)》
《Redis设计与实现》
《高性能MySQL》
《Redis开发与运维》
《数据库索引设计与优化》
分布式:
《ZooKeeper-分布式过程协同技术详解》
《从PAXOS到ZOOKEEPER分布式一致性原理与实践》
《实用负载均衡技术:网站性能优化攻略》
微服务与容器:
《轻量级微服务架构(上下册)》
《Spring Cloud微服务实战》
《第一本DOCKER书》
Linux:
《Linux内核源代码情景分析》
《Linux内核设计与实现》
《深入Linux内核架构与实现》
《鸟哥的Linux私房菜》
算法:
《数学之美》
《剑指offer》
《编程之美》
《挑战程序设计竞赛》
《算法竞赛入门经典》
《算法竞赛入门经典——训练指南》
《算法艺术与信息学竞赛》
《算法导论》
其它:
《Git权威指南》
《STL源码剖析》
《大话设计模式》
《HTTP权威指南》
《程序员的自我修养——链接、装载与库》
2 一些优秀源码
Webbench //一个简单的压测工具,c语言写的,很容易看懂
Tinyhttpd //一个超轻量型Http Server,只有500多行代码
libevent //一个开源的事件驱动库,将IO事件,定时器,和信号统一放在事件处理这一套框架下处理。基于Reactor模式。
SGI STL //封装了一些数据结构,一些算法,迭代器,配合《stl源码剖析》食用
Memcached //可用作缓存,重点可以看看线程模型,事件驱动,slab内存管理
Redis //kv数据库,可用作缓存,支持的操作和数据类型比Memcached要多,配合《Redis设计与实现》食用
nginx //一个高性能的HTTP和反向代理服务器,对高并发的支持和高效的负载均衡
Boost asio //一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库
Linux内核 //推荐看早期的源码,现在的源码过于庞大
libco //微信开源的协程库
leveldb //谷歌开源项目,一个持久化存储的KV系统,与redis不同,将大部分数据存储到磁盘上。
muduo //基于 Reactor 模式的现代 C++ 网络库,它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程
grpc //rpc框架
ACE //网络库,重点关注一下线程池,共享内存,定时器,Reactor和Proactor的应用,事件分派处理,线程调度,架构风格
一共参加了差不多几十轮面试,包括电话,视频,现场各种形式,总结了一些经验:
面试和笔试会有必考题&常考题
面试时一定要相信自己,要自信
多看看面经,查漏补缺
一定要诚实,对于不会的东西,要说不会
回答问题时,可以顺便转移话题,转移到你擅长的方面
手写代码的能力 很重要! 很重要! 很重要!
一定要扩展自己的知识面,同时需要拥有一个擅长的方面,知识的广度+某个方面知识的深度。
校招看重的是你的基础和思考问题的方式,看重你的潜力,即使有时候没有相关经验,面试官也会给你通过
如果你想去大厂,算法能力很重要,能参加acm等竞赛就尽量参加,不然就自己刷题,学算法。
简历只能代表你的过去,最终能否通过面试还是得看你的面试表现