2019年底面经
虽然已经临近年末,但是还是萌生要看新机会的想法,主要的原因是觉得在目前的岗位上技术增长遇到的瓶颈,因此想去做一些更有挑战的工作。因为仍然准备继续在深圳工作,因此选定了三家公司,腾讯、字节跳动和 shopee,考虑的岗位方向仍然是后台开发(其他岗位也面不上呀,伤心)。虽然年底跳拿不到年终奖了,但是我觉得和自己个人整个职业生涯的发展比起来算不了什么,最好的时机永远是当下。
准备
敲定了方向和目标后就开始系统准备,主要分为以下几个方面来准备。
算法题
事先已经看过别人的社招面经知道头条每轮技术面都有算法题,而这一块平时练习的比较少,校招时刷的题也忘记了很多。因此系统复习的时候算法题还是花了比较多时间的。先是快速刷完了剑指 offer,这个校招时已经刷过两边了,因此现在刷起来会相对快一些。然后就是啃 LeetCode 的题了,LeetCode 的题比较多,想在短短几周内刷完基本是不可能的,因此我主要按照类型去刷,每个类型刷几道就会比较有感觉了。比如链表的题优先考虑递归和双指针来解决,栈和队列的题优先考虑用两个栈或队列来解决,树的题基本都是递归等。不过数组和字符串的题一般比较灵活,这种题只能尽量多刷了。平时要上班刷题也不方便,我采用的方法就是看题,用手机打开 LeetCode 的网站,看完题目后直接想解决方案,脑子里大概捋一下代码怎么写,能想到的就过,想不出的就看看别人的解法,用这个方法刷起来就很快。用这种方法你可能会担心面试时题写不完整,其实不用太担心,因为面试的时候面试官看你写的核心思路是正确的,边界处理是对的基本就过了,面试时间比较有限。
理论基础
基础这一块主要以快速复习为主,主要是语言(我主要用C++,所以复习C++)、操作系统和网络编程。校招这一块会问题的比较多,社招这一块问的比较少,但是如果这一块打不上来就比较尴尬了。语言就不说了,这一块大家应该都知道会考些什么,校招的时候毕竟都疯狂准备过。操作系统就看内存管理、进程管理和文件系统,一般虚拟内存问的多。网络编程这块就包括 TCP/IP 协议,HTTP协议,网络安全三个方面。TCP/IP主要就是三次握手,四次挥手,TIME_WAIT 的作用等这些常考的题了。HTTP 协议考察 HTTP 协议的返回码、HTTP 的方法等。需要特别指出的是 HTTPS 加密的详细过程要非常透彻,不然容易产生一种感觉好像都清楚了,但是一问就有点说不清楚。最后就是网络安全,主要考察也是 WEB 安全,包括XSS,CSRF,SQL注入等。
后端技术
这里的后端技术主要指工作中要用到的一些基础组件,一些常见的后端架构设计。主要准备了MySQL、Redis、消息队列、zookeeper、分布式系统架构设计和docker。MySQL 主要看了极客时间的 《MySQL 45讲》,关于事务、索引、锁以及 binlog 和 redolog 都讲的非常好,也是面试最爱考的,除此之外对数据库的读写分离、分库分表也要掌握。没有任何利益相关,决不是打广告。Redis 主要看了《Redis 的设计与实现》,然后自己再总结了一下 Redis 的使用场景,以及 Redis 实现分布式锁基本 Redis 就没有问题了。消息队列的开源软件比较多,我主要选择 Kafka 来学习,主要看官网文档,极客时间的《Kafka 核心技术与实战》,和一些技术文章等。不过极客时间的《Kafka 核心技术与实战》,我觉得讲的比较一般,不是很建议。分布式系统的就准备CAP理论、BASE理论、限流、熔断、一致性选举算法、主从架构、集群架构、异地多活、负载均衡、分层架构、微服务等。
深挖项目
没有参与开源项目的经验,工作中做的项目也很一般,项目这块我实在没什么太多拿的出手的,不过还是要挖掘一下,毕竟这一块是逃不掉。我说几个我思考的点吧:
找项目中相对而言具有亮点的地方。比如我用 redis 实现了一个延时队列,然后对这个延时队列我通过分片来解决瓶颈,通过分发来加快处理速度。可以看我的《基于REDIS实现延时任务》一文。这个虽然不是什么复杂技术,但是可以将其考虑全面可以展示出自己具有一定的架构能力。
找项目中复杂的地方。如果你做的项目中有复杂的地方,即使不是你做的,也可以拿来说,前提是你要搞得非常清楚来。
量化指标。一个接口原来有性能问题,比如你做了一个小的优化,将其 TP99 的耗时从原来的 500ms 优化至多少 200ms。
赋能整个团队。在开发业务的过程中肯定会遇到一些重复的工作,或者可以复用的服务。你可以开发了某个工具或者服务化了某个功能推广到了全组使用,给公司创造了价值。
Shopee
一面
mysql 有那些存储引擎,有哪些区别
mysql 索引在什么情况下会失效
innodb 与myisam 的区别?
mysql 的索引模型
mysql 主从同步怎么搞的?分哪几个过程?如果有一台新机器要加到从机里,怎么个过程。
乐观锁与悲观锁的区别?
binlog 日志是 master 推的还是 salve 来拉的?
redis 持久化有哪几种方式,怎么选?
redis 主从同步是怎样的过程?
redis 的 zset 怎么实现的?
redis key 的过期策略
hashmap 是怎样实现的?
tcp 的握手与挥手
select 和 epoll的区别
http与https的区别,加密怎么加的?
raft算法和zk选主算法
Kafka 选主怎么做的?
kafka 与 rabbitmq区别
kafka 分区怎么同步的
kafka 怎么保证不丢消息的
kafka 为什么可以扛住这么高的qps
http各种返回码,401和406啥区别?
redis 哨兵和集群
kafka partition broker consumer consumer group topic 等都是啥关系?
两个单向链表,返回求和后的链表结构,例如2->3->1->5,和3->6,结果返回2->3->5->1
二面
二面没什么好说的,和面试聊人生去了,我以为是要凉的节奏,但是却拿到了offer。
三面
HR 面
腾讯
腾讯面试提前1天和提前一个小时都会发短信提示。去的腾讯滨海大厦面试,大楼的现代化程度很高,不过需要提醒一下的是,腾讯的滨海大厦分为南塔和北塔。我去的时候就上错楼了,需要下到4楼重新换成电梯。
一面
笔试
微服务的特点,如何实现服务发现和负载均衡
c++内存管理
time_wait在哪一端产生,作用是什么
程序crash如何定位
服务性能问题如何定位
两个排序数组找中位数
就数字n的平方根
设计一个算法,抽奖次数越多中奖概率就越高
MySQL 如何分析一条语句的执行过程。delete from t1 limit 3和delete from t1的区别?
面试
问项目
跳台阶
数组中奇数个元素
一栋楼有n层,不知道鸡蛋从第几层扔下去会碎,用最少的次数找出刚好会碎的楼层
动态规划与贪心有什么区别
redis数据结构的底层实现
redis如何实现高可用
负载均衡算法有哪些
服务发现是怎么实现的
熔断是怎么实现的
id生成器怎么实现的,如何实现全局递增
协程和线程的区别
进程间通讯方法
平时逛哪些论坛,研究哪些算法
paxos算法,这个算法我说不清楚,然后说了raft算法
gdb怎么切换线程
如何判断一个图是否有环
介绍一下缓存
查看 CPU 的命令和磁盘 IO 的命令
二面
项目的系统架构画一下
如果用户量上涨怎么优化
负载均衡的加权轮询算法怎么实现
背包问题
贝叶斯的概率学原理
分词算法
连续整数求和(leetcode 第 829 题),要求时间复杂度小于O(N)
总结
腾讯二面面完我就知道凉了。动态规划非要写出递推公式,因为我一直都是用动态规划表的思路来解题,所以这个地方没有答好。后面又问贝叶斯和分词算法,一点都不会(我的内心:我是来面后台的,又不是面算法的)。最后一道算法题只能想出 O(N) 复杂度的,面试官一定要小于 O(N) 的,答不上来。这道题是 leetcode hard 级别的难度,所以没有刷。不过后面去看可能也没有那么难,只是这种通过数学公式的特点来解题往往容易被忽略了。总之,腾讯的一面算是中规中矩,二面确实让我有点手足无措。之前看网上的说法是腾讯算法题考的比较少,可能还是要分部门吧,我这次面试的是腾讯视频,二面基本上全是考算法。还有大部分面经都说,算法题很少考 leetcode hard 级别,这个我也要表示怀疑了,因为腾讯和后面的头条都考了 hard 级别的。所以刷题时不能完全跳过 hard 级别的题。那有什么题不会考呢?我认为是描述起来很复杂的题面试时不会考,因为面试时间比较紧,如果光时把题看懂都要解释半天的,这种是不太会考的,比如那个 LeetCode 上买股票的题。
字节跳动
一面
问项目
任务系统怎么保证任务完成后发奖一定成功
zset 延时队列怎么实现的
redis 数据结构有哪些?分别怎么实现的?
redis 的持久化
mysql 的索引
一个无序数组找其子序列构成的和最大,要求子序列中的元素在原数组中两两都不相邻
二面
Redis 的 ZSET 怎么实现的?
尽量介绍的全一点,跳跃表加哈希表以及压缩链表
Redis 的 ZSET 做排行榜时,如果要实现分数相同时按时间顺序排序怎么实现?
说了一个将 score 拆成高 32 位和低 32 位,高 32 位存分数,低 32 位存时间的方法。问还有没有其他方法,想不出了
MySQL 事务的四个隔离级别?
先说了四个级别的区别,然后说了每个级别可能产生的问题
binlog 日志和 redolog 日志清楚吗?
说了两个日志的作用以及两阶段提交
C++ 的动态多态怎么实现的?
C++ 的构造函数可以是虚函数吗?
缺失的第一个正数(leetcode第41题)
linux 系统里,一个被打开的文件可以被另一个进程删除吗?
一个 10M 大小的 buffer 里存满了数据,现在要把这个 buffer 里的数据尽量发出去,可以允许部分丢包,问是用TCP好还是UDP好?为什么?
一个完整的 HTTP 请求会涉及到哪些协议?
三面
问项目
redis 的 ZSET 是怎么实现的?
让你设计一个限流的系统怎么做?
令牌桶
让你设计一个延时任务系统怎么做
说了两个方案,一个是使用 redis 的 ZSET 来实现,考虑分片来抗高并发,使用 redis 的持久化来实现落地,使用 redis 的哨兵实现故障转移。
一个是使用时间轮的方法。
现有一个随机数生成器可以生成0到4的数,现在要让你用这个随机数生成器生成0到6的随机数,要保证生成的数概率均匀。
有 N 枚棋子,每个人一次可以拿1到 M 个,谁拿完后棋子的数量为0谁就获胜。现在有1000颗棋子,每次最多拿8个,A 先拿,那么 A 有必胜的拿法吗?第一个人拿完后剩余棋子的数量是8的倍数就必胜,否则就必输。
给出一棵二叉树的根节点,现在有这个二叉树的部分节点,要求这些节点最近的公共祖先。
四面
HR 面
总结
头条4轮面试都是视频面的,视频面试体验其实还是挺好的,坐在家里面试我会更加放松一些,这样脑子也灵活一些。人一紧张脑子就转不动了。头条的3轮技术面都问了zset的实现,ZSET的实现可以好好看看源码怎么实现,这样说的时候有更多东西可以说,不是说一个跳跃表就完事了。还有一点就是遇到不会的逻辑题或者算法题不要放弃,问问面试官可不可以提示一下。如果能在面试官的慢慢提示下能完成这道题,也是会被认可的。