大厂面试:一个四年多经验程序员的BAT面经(字节、阿里、腾讯)

2,780 阅读20分钟

上次写了篇欢聚时代的面经,公众号后台有些读者反馈说看的意犹未尽,希望我尽快更新其他大厂的面经,这里先说声抱歉,不是我太懒,而是项目组刚好有个活动要赶在春节前上线,所以这几天经常加班,只能工作之余断断续续的编写,如果各位看管觉得本文排版看着有些凌乱的话,还望见谅!

背景

先说一下个人情况,我是17年毕业的,去年年末开始面试,算起来是四年半的工作经验,面试的公司大部分是广州这边的,有欢聚时代,字节,阿里的Lazada,腾讯,网易等公司,最后拿到了欢聚时代和网易的offer,除了欢聚时代还算顺利之外,面试其他的公司都有点磕绊,而且面了不止一次,最后的结果不算很理想吧,但我个人还是挺满意的,毕竟比起之前的自己,这一次的跳槽也算是一次职业生涯的跃迁。

这个过程我也学到了不少经验,面试之后我都会把记得的问题做记录和复盘,事后复习弥补自己的不足之处,也使得自己在后面的面试表现中越来越得心应手。所以,别的段位我不敢说,但如果是社招五年内经验的同学,我相信我的面经对你还是会有帮助的。

说明

下面给大家分享我面试几间大厂的面经,我打算用真题+经验之谈的结合方式来给大家介绍,这里说明一下,因为社招很多题目都跟项目有关,而且几面的面试题难免有重复,所以我下面的真实面试题不会写的那么全,也不建议大家去背这些题的答案,毕竟每个人遇到的题目都不一样,我们需要做的是了解面试考察的大概方向,然后看看那些地方不足,尽早弥补自己的知识盲区,只有自身够硬才不怕钢铁的锤炼(这话有点中二,但我没词了)

字节面经

字节算是我面试最多的公司了,前前后后面了不下四次,实话说,字节的hr小姐姐还是很热心的,一般面完两天内就会微信通知你,咨询问题也是很热情的解答。

这几次面试中有两次我是在技术终面被刷的(吐了呀),一次到了hr面,问的知识范围也都差不多,全部写出来没必要,给大家分享内容有些代表性的面经吧,这是我投递字节国际化电商部门后端岗位的面试题目

面试题

自我介绍

Redis你比较熟吧,说说它机制为什么快

有几种数据结构,底层分别是怎么存储的

Redis有几种持久化方式

多线程情况下如何保证线程安全?

用过volatile吗?它是如何保证可见性的,原理是什么

MySQL的索引结构,聚簇索引和非聚簇索引的区别

MySQL有几种高可用方案,你们用的是哪一种

说说你做过最有挑战性的项目

你具体负责哪部分的东西,哪些最有挑战性,说说你做了哪些优化

秒杀采用什么方案,分表怎么做的,redis挂了怎么办,

分表为什么要停服这种操作,如果不停服可以怎么做

你怎么防止优惠券有人重复刷?

redis数据幂等性是怎么保证的(类似于分布式锁那种,有个key就行了)

设计题:

1、如果让你设计mysql高可用方案的话,你会优先考虑哪些方面

2、抖音评论系统怎么设计,如果加入好友关系呢?(考虑到数据读取的性能,可以采用写扩散的方式)

3、怎么设计一个短链地址,要考虑跨机房部署问题

你说要哈希算法生成短链,会存在什么问题(哈希冲突),该怎么解决?(可以用布隆过滤器,但是不好控制,而且仍存在hash冲突)

有没有更好的方案?(自增序列算法,每次接收一个长链,就分配一个ID,转成62进制再拼到短域后面)

存在的问题?(自增id方案如果用雪花算法,可能存在机器时钟回拨的问题,导致id重复,说到这里,我终于明白那家伙为什么说要考虑跨机房部署问题)

该怎么解决?(用Redis做自增id生成器,性能高,但要考虑持久性的问题;或者改造雪花算法,通过改造workId解决时钟回拨的问题)

算法题:

1、有一个数组,里面元素非重复,先升序再降序,找出里面最大的值(二分法,要考虑只有一个元素和两个元素的边界情况)

2、链表深拷贝

3、统计用户在线最大峰值和人数,要精确到秒(额滴神啊,秒级这个谁受得了,我的思路只能精确到小时,面试官说没问题,后面成功写出来跑过测试用例)

软实力:

1、你怎么评价你自己

2、你怎么看电商这块领域,为什么要选择电商

3、有没有要问我的

总结:很看重算法和场景设计,而且可能是因为投递电商部门,对我之前做过的电商项目考察非常细

腾讯面经

我面试腾讯有两次,两次都是二面挂掉的,除了第二次的二面(有道很刁钻的场景题,有空我会单独写篇文章分享),其他面试的问题都不算难,实话实说我自认为答得还不错,第二面就被刷我也是有点纳闷,算了,不发牢骚了,大家自己看看吧。

面试题

一面:

说说你做这个电商项目负责了哪些东西

基于什么维度分表,如果搜索商品名称怎么办,

为什么不用分区,分区有哪些优缺点

Rocket集群有哪些方案?

如果多主无从的情况下,a,b,c同时可写入,但c挂了,那c的还能订阅吗

Mysql高可用有几种方案,分别有什么特点

redis分布式锁你们是怎么用的(redission),原理知道吗

redis的热key知道吗?一个热key导致单台机访问流量过高,该怎么办?

分布多台redis的话,如果某一台缓存过期了,流量过大该怎么办?

如果有10台机同时失效,那该怎么一次性回源

限流是怎么做的,用阿里云的sentinel,有几种策略(qps,时间)

有几种限流算法,各有什么优缺点

二面:

介绍你在项目中的职责和负责模块

项目的日活量,QPS,压测结果

项目是基于Http还是rpc访问,怎么做容灾的

用到mq怎么做一致性处理的

怎么防止薅羊毛之类的

现有团队人数,你在团队的地位,抛开业务经验来说,你觉得为什么要找你做这个项目的技术负责人

你目前在研究哪些技术,哪些业务方向

未来两三年的职业规划

对go有什么理解,你是基于什么目的去了解go的

总结:问的大多是基于项目和场景,二面的软实力问题有点多

阿里Lazada

Lazada社招的技术一共就两轮,这里不是吹牛,是我跟内推人以及面试官确认过的,当时让朋友内推完隔了半个多月才开始面试,而且是leader先面试第一轮,然后一面的面试官再面试第二轮,过程有点漫长,个人感觉问的还是有点难度的(不过我自认为答得还可以,被刷后郁闷了好一阵,大厂真的不好进啊)

面试题

一面:

说说你做过的项目

有哪些亮点,或者解决过什么问题

你说引入mq对领取优惠券接口做了解耦,我理解领取优惠券接口比较简单,为什么还需要做解耦这么麻烦,而且异步还会影响用户体验?

(优惠券流程挺长的,而且一次性领取多张,判断逻辑较多,访问压力大,为了减少rt和访问压力,引入mq做异步入库,并且对用户体验不会有影响)

分表为什么要停服?

你们的服务最高多少qps,每台机器,数据库能支撑多大访问量,怎么测出来的?(很麻烦的一个问题)

你说说java线程池吧,怎么运作的,放在队列里的任务是什么时机执行的

你们项目线程池怎么配置的, 为什么这么配

spring bean得生命周期

redis为什么快?你说到支持多种数据结构,为什么这个能提高速度(方便调用原生底层的数据结构)

你还在职吗?(在职,但已申请离职)有其他offer吗?最快什么时候去入职

有什么问我的吗?

二面:

自我介绍

说说你最近做的项目,具体业务是怎样的

你说的那个商城业务是怎样的,你负责哪块

有没有遇到线上问题,怎么解决

你们用springboot是吧,怎么调用微服务的

Feign底层原理看过吗

怎么改负载均衡参数

如果让你设计负载均衡,你会怎么设计

CPU飚高有哪些原因

hotkey有检测过吗?怎么优化的

做一道算法题吧,两个非负整数想加,结果以字符串输出

个人评价:Lazada问项目方面比较多,而且很看重性能优化,包括参数配置,架构设计之类的,八股文的话没什么大问题,总体来说这次面试还是很能考察经验的。

经验之谈

以上就是我面试这几家公司的大概题目,怎么说呢,不算很难吧,网易问的其实也差不多,就不具体列出来了,而且都算是常规的面经题,我就不一一列出答案了,大家如果有疑问的上网搜一下,或者加我微信咨询都行。

从我面试这么多轮的情况来看,这几家公司社招面试考察的范围重点在于对求职者过往项目和技术场景方面的考察,八股文的话没有像校招那么全面,只不过每家公司问的知识侧重点有会有所不同。

像字节除了项目场景,还很看重算法,以及求职者在系统设计方面的思考;

阿里Lazada比较看重项目方面的架构设计,以及线上故障的排查过程

腾讯的话问的比较多的是场景方面的思考,比如什么Redis某个key访问量飙高这种较为极端的情况,还有就是软实力方面问的也比较多

下面说说我的心得吧,也算是给分享一下我的个人经验

1、首要条件:准备好基础的八股文

基础,这点不用多说了,所有的面试都会问到的知识体系,虽然社招方面对基础的考究没有那么全面,但基本的八股文还是要尽可能掌握的,这部分八股文包括但不限于:

  • Java基础语言特性(面向对象、抽象、继承、多态、反射等)
  • Java集合(HashMap必问、常见如数组转链表过程、1.7和1.8扩容机制区别、为什么线程不安全、hash索引计算这些都必须掌握,还有ConcurrentHashMap的底层结构,跟HashTable的区别类似的也都要熟悉)
  • 并发编程,不用多说,基本也是必问,毕竟线程安全是所有语言开发都会遇到的难题,也是实际项目开发中非常重视的一点(Synchronized升级锁过程,和AQS的区别、Volatile关键字的原理和特性、如何保证线程安全,多线程实现生产者消费者之类的)
  • JVM(不用多说,社招必问,垃圾回收算法,JVM调优,CMS和G1区别都是要了解的)

除了Java语言外,基本的计算机网络基础是必须要去重视的领域,务必要掌握这几块内容,如

  • 计算机网络协议及作用
  • TCP和UDP的区别
  • 三次握手和四次挥手过程,顺便了解下像为什么不能两次握手那种稀奇古怪的问题
  • TCP如何保证可靠性,哪几种机制,以及原理都要清楚
  • HTTPS原理(三次握手,验签,加密解密那些)
  • 浏览器输入一个网址执行的全部过程

网络的话掌握这几块也就差不多了,然后操作系统相关的也有必要准备下,不用太复杂,就常见的那些面试题就可以,基本上只要按照上面所说的几点准备,基础八股文这块也就差不多了,当然,不排除有些面试官会问一些刁钻又冷门的问题,对此我也只能说四个字了,

祝你好运!

2、常用的中间件一定要多做准备

像常用的中间件如Redis、MySQL、MQ这些是基本必问的,我们不仅要会用,对其原理还要有一定的了解,更重要的是,我们面试前要尽可能准备这些中间件异常场景的解决方案,

比如Redis某个key访问飙高了,缓存出现穿透了怎么做,Redis挂了怎么保证跟MySQL的一致性;

MySQL索引失效怎么排查解决,怎么做好sql调优;

MQ出现消费异常怎么办,如何保证从生产者到消费者三端的高可用,消息堆积了怎么办等等;

这些异常基本都是面试中经常问的,网上很多大佬也都有分享过对应的解决方案,在我眼里,这些知识点都算是八股文,只要事先准备充足,拿个中间件熟练分基本没什么问题。

3、简历上的项目是最需要花精力准备的

项目这方面我就可以吹下牛13了,毕竟被问了这么多次,都快成机械记忆了。

从我个人的经验上看,面试官对简历的考察大概分这么几个维度,

  • 项目的整体架构,包含分多少个服务,多少个节点,调用链是怎样的
  • 你做过的最有挑战性的某个模块功能
  • 这些功能的业务设计,包含数据表有哪些,用了哪些中间件,怎么跟其他服务做数据联动的
  • 你在项目中做了哪些优化,有没有什么效果,比如RT减少200ms,压测数据增加了5倍之类的,有数据支撑的话更有说服力
  • 你遇到过哪些线上问题,怎么排查故障的
  • 项目的QPS相关指标,你觉得还能怎么优化,假设有多加10倍的流量过来,你觉得怎么设计才能支撑得了这么高的访问量

大概这几点吧,大家从我上面写的具体面试题目也可以对应的上,基本上问的东西都包含在这几个维度里,从项目的全局到某个具体模块,一些重要的数据指标,以及整个架构的扩展性,还有异常情况的处理等等,这些东西如果你没有事先做好准备,我敢说不可能在身经百战的大厂面试官面前胡混过关。

除此之外,项目中很多时候会有场景异常方面的考察,比如什么Redis挂了怎么办;微服务调用前面的服务调用成功,中间的服务调用失败,怎么做数据回滚;某台服务宕机了怎么处理等等,这些类似异常场景也是经常在项目中被问到的,看官们如果有意向面试的话,在这方面可以需要多做点准备,只要结合项目的实际业务做好应急和预防措施,这些异常情况的出现概率是可以有效降低的。

(顺便说一句,上次写的欢聚时代面经里也涉及到异常场景的内容,然后有读者留言希望我介绍下有哪些解决方案,很朴实的请求,但很可惜,限于篇幅和主题我没法在这里详细介绍了,日后针对这些场景方案我会整理出来在其他文章分享的,这里先说声抱歉)

继续项目的话题吧,总的来说,项目这块是最值得大家去花精力准备的,而且从我个人的经历来看,社招面试项目方面的考核时间比例至少在一半以上,很多的八股文知识点最后都会落实项目中的实际使用场景,比如Lazada的一面面试中,面试官一开始也是从八股文出发,问了一大堆Java线程池的东西,包含基本参数和运行原理那些,但最后目的还是要考察我实际项目中对线程池参数是如何配置的,又是如何考虑拒绝策略的,这些都是需要跟实际业务结合起来才能设计的更加周全,没有银弹的方案,毕竟总不可能一个百万日活的系统和一个一千日活的系统都配置一样的参数吧。

因此我也很建议大家在美化项目的时候,要尽可能结合业务体量去思考具体的优化点,如果你把体量吹大了10倍,那么也要考虑好支持当前体量的技术方案,从参数配置到服务器节点都需要去预先思考,而且最好要思考与体量相配的一些重要指标如QPS、RT这些,这也是面试官很看重的一些点。没有完善的技术方案支撑,吹出来的高并发,大体量也只不过是皇帝的新衣罢了。

4、算法和系统设计题也许是你增强竞争力的关键点

算法这玩意怎么说呢,很多人谈之色变,因为掌握的门槛很高,而且需要持久的刷题,不过也没办法,为了进大厂,这玩意我们还真要去下点功夫准备,但也不用太担心,把常见的题型刷多几道题就行,我遇到的算法题无非都集中在几种数据结构,像什么链表、二叉树、数组,其他的暂时没碰到过,大家把这几种结构相关的热门算法题多刷刷就差不多了,如果能针对将要面试的公司去准备会更好,这种面试真题也不难找,牛客网和LeetCode上一大堆,关键是要持久多刷,别做二天题放三天假这种操作,没点时间和毅力算法这玩意是积累不了的。

还有系统设计方面平时大家也可以多积累一下,像什么常见的设计秒杀系统、设计大流量热榜之类的,基本是涉及到高并发大数据量相关的常见设计题都可以了解一下,一般来说,这种系统设计题不会考察的很详细,主要是看你的设计思路和对异常场景的应变方案,这两方面临时发挥的话很难有说服力,还是很需要平时的积累和思考,大家没事的时候可以设想下异常场景之类的,然后多跟同行讨论下可行性,茶余饭后,也算是有趣的一种交流方式。

5、软实力方面不难,但也需要准备

软实力这方面其实没什么大难度,每个人按照自己的情况回答就差不多了,一般是终面的技术面试官会比较考究,目的上是想了解你工作中的处理能力和未来规划之类的,至于有没有作用我就不做评断了,一般来说,软实力的题型也不会太刁钻,面试这么多年无非都是问这么几个:

  • 你未来三到五年的职业规划是什么
  • 说说你的优缺点,你跟同龄人比优势在哪里
  • 你工作中遇到的最大难题是什么,不局限于技术方面,你是怎么协调的
  • 如果你来我们这边,你想得到哪些收获

这些题目没有固定答案,因人而异,按照自己的想法去表达就可以,但我还是建议大家在面试前可以准备下这方面的话术,不为别的,至少在面试过程能做到表达流畅清晰,能提前准备的点尽量别走到临时发挥的那一步。

说到这我想吐槽一下,技术性的面试不是不可以问软实力的东西,但在我看来,这玩意最多算是个辅助考察作用,毕竟没什么回答门槛,很多人都能答出来,如果不从技术性的问题出发,而是问一大堆这玩意东西筛选人,那对于背景较差的求职者来说,恐怕就没什么优势了吧。(个人浅见,不喜勿喷)

6、心态要好

这一点也算是我对大家最朴实的忠告了,就不管遇到什么情况,尽可能保持心态好,现在大环境不好,很多公司招人的标准其实或多或少在变得更高,有可能你费尽心思准备了很久,但面试的过程和结果还是不尽人意,这也是正常的,毕竟是大厂嘛,要是那么好进就不会那么多人心向往之了。

而且不是一次失败就决定结果了,其实大厂的机会一直都有的,一个岗位没有通过面试最多就锁半年到一年的时间,过了这个时间我们还是可以去重新面试的,而且有时候也不用等待那么长,这个部门没过说不定可以面试其他部门的岗位,只要总结经验,多次尝试,最后结果再差也比啥都不争取强。

最后

淋淋洒洒写了这么多,用真题结合经验总结,前后花了一周的时间,我也算是给大家分享了很有价值的面经了,如果看官们觉得写得还不错的话,还望能给鄙人三连支持一下,没有三连,举手之劳点个赞也行啊,我都受用的,哈哈。

过几个月就是金三银四的求职旺季了,如果你也正在找机会,并且也是几年工作经验的话,我想我的文章或多或少能给你些许帮助,这里也衷心祝愿想跳槽的各位看官,希望你们都能拿到理想的offer。

作者:鄙人薛某,一个不拘于技术的互联网人,喜欢用通俗易懂的语言来解构后端技术的知识点,想看更多精彩文章的可以关注我的公众号,微信搜索【鄙人薛某】即可关注