大厂面试:一个多年经验程序员的BAT面经(字节、阿里、腾讯)
字节面经
面试题
自我介绍
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
面试题
一面:
说说你做过的项目
有哪些亮点,或者解决过什么问题
你说引入mq对领取优惠券接口做了解耦,我理解领取优惠券接口比较简单,为什么还需要做解耦这么麻烦,而且异步还会影响用户体验?
(优惠券流程挺长的,而且一次性领取多张,判断逻辑较多,访问压力大,为了减少rt和访问压力,引入mq做异步入库,并且对用户体验不会有影响)
分表为什么要停服?
你们的服务最高多少qps,每台机器,数据库能支撑多大访问量,怎么测出来的?(很麻烦的一个问题)
你说说java线程池吧,怎么运作的,放在队列里的任务是什么时机执行的
你们项目线程池怎么配置的, 为什么这么配
spring bean得生命周期
redis为什么快?你说到支持多种数据结构,为什么这个能提高速度(方便调用原生底层的数据结构)
你还在职吗?(在职,但已申请离职)有其他offer吗?最快什么时候去入职
有什么问我的吗?
二面:
自我介绍
说说你最近做的项目,具体业务是怎样的
你说的那个商城业务是怎样的,你负责哪块
有没有遇到线上问题,怎么解决
你们用springboot是吧,怎么调用微服务的
Feign底层原理看过吗
怎么改负载均衡参数
如果让你设计负载均衡,你会怎么设计
CPU飚高有哪些原因
hotkey有检测过吗?怎么优化的
做一道算法题吧,两个非负整数想加,结果以字符串输出
个人评价:Lazada问项目方面比较多,而且很看重性能优化,包括参数配置,架构设计之类的,八股文的话没什么大问题,总体来说这次面试还是很能考察经验的。
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、心态要好
这一点也算是我对大家最朴实的忠告了,就不管遇到什么情况,尽可能保持心态好,现在大环境不好,很多公司招人的标准其实或多或少在变得更高,有可能你费尽心思准备了很久,但面试的过程和结果还是不尽人意,这也是正常的,毕竟是大厂嘛,要是那么好进就不会那么多人心向往之了。
而且不是一次失败就决定结果了,其实大厂的机会一直都有的,一个岗位没有通过面试最多就锁半年到一年的时间,过了这个时间我们还是可以去重新面试的,而且有时候也不用等待那么长,这个部门没过说不定可以面试其他部门的岗位,只要总结经验,多次尝试,最后结果再差也比啥都不争取强。
最后
*********************************************************