秋招终结贴

一些情况

先说说拿到的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++岗位该如何准备。其他岗位也差不多。

1 专业基础知识

操作系统 , 计算机网络 , 编译原理 , 数据结构与算法 ,计算机组成原理 , 数据库原理

对于校招生来说,计算机基础是很重要的。在面试过程中,会被问到很多基础知识,有些问题比较常见,比如:

线程与进程的区别,多线程与多进程,tcp三次握手,挥手,tcp可靠性,tcp状态转移,拥塞控制,滑动窗口,慢启动,快速重传,
time_wait状态,http协议,https协议,http状态码,
快排,栈,队列,hash冲突,链表,数据库索引,B+树,数据库事务,事务隔离级别 等等

只列举了一部分,这些问题都是最基础的,经常会被问到,得保证自己一定可以答出来,并且最好可以深入理解,可以通过复习之前学过的知识,也可以去看一些面经来准备。

有些问题是算比较难一点,比如:

tcp协议为何要那样设计?红黑树旋转,虚拟内存,cpu地址翻译,数据库索引优化,sql查询优化,
mysql存储引擎(Innodb 与 MyISAM),
cpu指令优化,汇编语言,链路层协议,路由算法等

这些问题可能会被问道,也可以了解一下。

2 算法与数据结构

《剑指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个月,很值得参加。

3 编程语言(C++)

经典书籍,基础语法,高级语法,新标准,内部机制

一般来说,语言问的东西就是:基础语法,高级语法,新标准,内部机制。
我主要是搞c/c++的开发,所以拿c++语言举例子。
基础语法包括:指针,一些关键字例如const,static等,类的相关知识,4种强制类型转换等
高级一点就是:继承,多态,模板,虚函数等
新标准:比较多的还是C11,比如智能指针,右值引用,Lambda等
内部机制:比如虚函数表,内存管理,多态原理,智能指针原理等

熟悉某门语言,不一定能够答出相关问题,多读一些书,看看面经,多思考,多积累面试经验。

最主要的还是多写代码吧,只有不断写,才能深入理解。

4 项目经验&实习经验

与岗位相关的项目&实习经验

项目经验这个其实是非常重要的,最好是岗位相关的项目经验,有时候项目经历与岗位不是很相关也是不行的,我之前面美团,面试官看我是搞c++的,5分钟就挂了我,说他们只要java。。。不过也不一定,我面阿里的时候,就是没有java项目,面试官还是给过了。

实习经验这个非常非常非常重要,特别是大厂实习,有机会去大厂实习,翘课也要去。有大厂实习经验,秋招的时候很加分。

5 网络编程

我是做后台开发的,肯定就需要网络编程相关的知识:

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相关的知识,分布式系统的知识

6 扩展知识

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等竞赛就尽量参加,不然就自己刷题,学算法。
  简历只能代表你的过去,最终能否通过面试还是得看你的面试表现

你可能感兴趣的:(-------面试资料)