后端社招面试经验 | 本科1年 6个offer
1 背景
个人是2020年7月本科毕业的,工作一年的时候(2021年7月)打算出去外面看机会,这期间收获颇多,在此想给各位牛友分享一下个人的面经和一些感想,希望能够帮助到准备面试或正在面试的朋友。有些人可能会觉得工作一年参加社招会比较困难,这其实是一种偏见,我个人觉得只要自己准备充分了是不存在一年社招就比较困难的说法的。在这里我只记录了技术面的内容,HR面试问题没有进行记录。
2 面试准备
社招一年的考察内容基本上还是以基础知识、算法题和项目经历为主。
2.1 基础知识
基础知识的话是一个持续积累的过程,如果想要达到面试要求的话可以挑着重点的知识点去看,在时间有限的情况下我个人建议是去看一些面试重点考察的知识,不太建议去系统看书,一方面我觉得看一本书籍需要较长的时间,另一方面看书所获取的面试知识点较为有限,系统看书更多的是在时间充裕的情况下去做一个持续的积累。
2.2 算法题
算法题需要准备一定的时间,我个人是工作期间一直保持着刷题的习惯,所以在准备面试的时候基本是做一个复习的过程,将自己写过的题目再白板编写2-3次,这样可以保证手感,也能及时复习遗漏的边界条件等。
2.3 项目经验
项目这一块每个人的情况都不太一样,但是总的来说可以从STAR法则进行项目介绍,从背景、项目任务、个人职责、项目结果4个方面进行阐述,并加上自己的一些项目难点和亮点,这样基本能让面试官明白你究竟做了哪些事情,后续的开展也会顺畅很多。
3 Offer情况
我是从7月份陆陆续续面试了好几家公司,到了9月份最后拿到了这些Offer:
- 字节跳动 - 互娱研发
- 微软 - Windows365
- 蚂蚁金服 - 国际支付
- 美团 - 到店
- Shopee(新加坡)- Shared Service
- 小红书
面经
陌陌(一面挂)
一面
- 介绍你owner的项目,具体做了哪些工作
- 介绍Redis在项目中的用处
Cache Aside
策略会不会导致数据不一致- 让你设计预防数据与缓存的不一致问题,不依靠业务来保证的情况下你会如何做
- MySQL的双一机制
- MySQL的B+树是怎么样的?增加数据或删除数据的时候是如何动态调节的
- writelist和copyonwritelist的区别
- concurrentHashmap和hashmap的区别,有没有看过concurrentHashmap的源码
- 线上出现问题如何排查?
- 线上用的是什么垃圾回收器,为什么用G1?
- 说一下理解的ElasticSearch
- 代码题:实现TrieTree
小红书(Offer)
一面
- 讲一下MySQL优化
- 索引优化的细节
- 前缀索引原理
- MySQL是如何选择合适的索引的,如where里用到字段a,表中有索引a和(a,b)
- 覆盖索引原理
- 如何知道覆盖索引是否生效
- 异步的理解
- 如果同时有3个耗时操作A、B、C,如何异步化
- 如果需要操作完A,再异步操作B、C呢
- Future如何实现caller的
- ForkJoin是什么
- JVM调优经验
- GC了解吗,那你是如何定位Full GC的?有哪些原因?
- 代码题:实现StringBuilder
二面
- 介绍项目的业务场景
- 为什么要用istio呢
- 如果有一个集群,暴露一个域名,用istio怎么转发到后面的分片
- TLS原理
- HTTPS原理
- Java多线程,说一下自己有了解过哪些实现
- ConcurrentHashmap的实现
- volatile Object[] arr,线程T1修改了arr,线程T2看得到吗
- Future的实现有了解吗
- 线程池,说下corePoolSize、maximumPoolSize、BlockingQueue的作用
- BlockingQueue细节,存的是任务还是线程
- 如果使用一个LinkededBlockingQueue会导致什么问题
- 线程T2修改变量,主线程调用t2.join(),可以看到线程T2的变量吗
- Full GC如何排查
- 如果线上有个偶发的bug:一个线程输入之后导致死循环,这时候应该如何去排查
- Spring AOP原理
- 了解哪些垃圾回收器。说下G1和CMS的区别。G1的好处是什么
- 写代码:对称二叉树
- 最近在了解哪些技术
三面
- 介绍你部门的业务情况(开放性题目)
- 介绍做的项目(开放性题目)
- 基本是围绕Istio提问
- 服务治理做了什么事情
- istio的原理
- 如果请求的时间比较长,如何排查是sidecar导致的
- Istio做服务注册
- sidecar转发原理
- 数学题,写出代码
//一个口袋里有两个硬币,一个是正常的硬币,正反不同图案, //另一个是作弊硬币,正反面相同图案。 //你没有看过这两个硬币。现在你从口袋里拿出了一个硬币,把这一个硬币连续抛了5次, //观察发现都 是同一个图案向上。 //请你现在反推你拿出的硬币是正常的硬币的概率是多少。
猿辅导(二面挂)
一面
- MySQL和Redis的区别
- MySQL事务的持久性是如何做到的
- MySQL的MVCC
- MySQL的binlog和redolog区别?使用了redolog有什么好处?
- Redis是完全单线程的吗?
- Redis的单线程模型?
- Redis的数据结构哪个用的比较多?
- Redis在内存中的结果是怎么样的?
- Redis的跳表描述,查询时间复杂度是多少
- Redis Sentinel,进行提升主操作的时候如何决定让哪个Sentiel实例去执行
- Spring MVC 和 Ioc哪个熟悉?我说了两个都懂,讲了一下Ioc是干嘛的,被问了Ioc原理
- 讲一下项目的高可用如何的做?
- 双机房多实例部署是如何做的?
- TCP有哪些问题呢?如拆包和粘包有了解吗?如何解决?
- 编码题:二叉树Z字形层次遍历
二面
- 挑一个项目,最好从STAR四个方面讲一下
- 为什么要做这个项目
- 项目对接的数据都有哪些?
- 项目对接的数据是增量还是存量的?如果是增量的数据那么MySQL优化应该如何保证能够持续有效?
- 项目对接的数据是给谁用的呢?
- 技术选型,为什么用Istio,不用Nginx和Kong这些
- 如何不让微服务中的A服务去影响B服务
- 为什么不用公司内部的网关?使用Istio的好处是什么?
- 为什么用MySQL去存储业务数据?不用HBase等等?
- 讲一下API注册中心的业务逻辑
- 一条慢SQL的排查思想?
- 如果用explain分析出来,索引有用到,扫描的行数也很少,如何排查?一开始我回答继续优化索引,如回表,面试官说这样会让索引成为存储结构,性能不好。我回答说可能是持有锁。(select其实不会被锁)再答了机器性能瓶颈。面试官似乎有所认可,说磁盘、CPU、内存等等都可能成为性能瓶颈
- String str = new String("123") 发生了几次内存分配,分配在哪里
- ArrayList的add,如果让我来实现会怎么做?
- 代码题:先减后增的有序数组,找到最小值所在的下标,时间复杂度 < O(n),写一个可执行的代码,如果有重复请返回相同的最后一个下标
- 最近在看什么书?我回答《从零开始学架构》、《Java并发编程之美》、《JDK源码解析》
- 《从零开始学架构》里比较深刻的点?
- 对高可用的理解?
- Java的多线程设置阻塞队列如何做呢?
美团(Offer)
一面
- 介绍一下项目
- 介绍一下双机房多实例的部署,MySQL只部署在某一机房,出问题的时候如何解决
- 基于机器的性能转发会有什么问题,为什么不直接在Docker里面设置好服务的运行内存
- 说一下服务治理,这个基于机器性能转发的策略会给服务治理带来什么影响?
- 平时有做故障演练吗?MySQL主从脑裂如何解决?
- 故障注入为什么算服务治理
- 机器的内存记得吗?
- 项目服务的QPS、TPS、TP99
- Java服务的内存设置多大
- 高可用怎么做的
- 慢查询可能是什么原因?
- MySQL的limit是如何优化的
- 为什么MySQL会有不命中索引的现象?
- Redis缓存穿透、缓存击穿。布隆过滤器的命中正确性
- Java的HashMap的put是怎么做的
- 看过HashMap的源码吗?算桶的操作里,用位运算如何实现,提示一下
- 你觉得你哪个技术掌握的比较好?我答Java、MySQL、Redis
- 工作以来哪个最有挑战?
- Spring循环依赖
- 代码题:合并两个有序链表
二面
- 介绍项目,挑一个讲我具体做了什么事情,以及遇到的挑战等
- 服务治理,讲一下做了什么事情
- 机器的配置怎么样,项目QPS,MySQL的读写比和读写QPS
- 慢SQL查询的优化
- GC的一个过程,GC Roots有哪些?
- limit优化如何做的?这个id是主键还是索引?
- 慢查询如何定位的,能够讲一下吗?
- 内存分配比例?新生代的比例,对象的一个创建过程
- 手写单例模式,讲一下原理。
- Spring的设计模式
- 熟悉什么技术,我说MySQL。
- MySQL的联合索引、索引结构、B树和B+树
- 线程池有用到吗?线程有哪些状态
- 讲一下Spring有哪些注解?@Autowired和@Resource的区别
- Spring里用到哪些为设计模式
- 写代码:手写快排
三面
- 国际化的项目与国内的有什么不同(因为之前做过国际化和国内的项目,所以被问到)
- 哪些数据存国内,哪些存国外
- 项目的STAR和难点
- 项目的介绍,数据量有多大
- 你是如何接手一个项目的
- 故障演练是怎么样的?如果是对DB层做故障演练,你会如何做?
- 性能优化的思路?在代码层如何定位性能瓶颈?
- MySQL的B+树
- 性能优化的切入点,如果是从代码层呢?自顶向下还是自下向上比较好?
- 基于什么样的场景想要设计记录用户操作的模块
- 代码题:LRU
BIGO(二面挂)
一面
- 介绍项目,做了哪些工作
- sidecar比较耗时,如果不用sidecar这种形式,你会如何做
- 负载均衡会有延时性,你会如何做优化
- 公司内部平台告警的原理是什么?你的机器启动了一个进程,平台是如何感知的
- 使用Istio的原因
- Istio是在哪一层做的工作?
- 鉴权用到了什么?是对称加密还是非对称加密?密钥会有过期时间的吗?
- 服务注册中心是什么
- Redis在项目中用了哪些数据结构
- Redis的持久化
- Redis的内存淘汰策略,从节点需要执行吗
- Redis的集群用的是codis还是tractor
- MySQL做了哪些优化
- B+树为什么能够加速
- RR级别下是如何保证避免幻影读的
- Java对象的equals和==有什么区别
- Java的并发用到了哪些包
- ConcurrentHashMap的原理,底层是用到ReentrantLock还是synchronized
- synchronized的原理?锁升级的机制
- 用的是什么垃圾回收器
- 对象从创建到灭亡的过程
- 线上有对GC做什么监控吗
- 系统设计:如何设计一个7天的排行榜?我设计出来的方案是:队列+定时脚本+zset,面试官说这个方案不具备实时性。
二面
- 介绍项目
- 团队有多少人,什么时候加入项目的,有做组件调研吗?为什么要用Istio?跨语言用nacos为什么不可以
- MySQL优化用了哪些
- Java的CAS如何实现,是如何操作CPU的
- 服务如何实现降级
- MySQL索引的实现,为什么用B+树
阿里巴巴-ICBU(二面挂)
一面
- 介绍项目的情况和技术
- Redis存储和分片
- 有用过哪些微服务框架,Spring Cloud和Dubbo
- 分布式事务用了哪些
- Java的HashMap如何实现
- ReentrantLock的底层原理,AQS有了解吗?
- 动态代理的底层,用了java的哪些技术
- 垃圾回收算法
- ThreadLocal的理解
- 设计模式有了解吗?策略模式如何实现的
- 设计模式在系统设计中有哪些应用
二面
- 介绍项目
- 项目有多少个人?
- 性能优化你是如何做的?
- 用Redis做缓存会有什么坑?如何保证这种分布式并发的正确性?
- 平时遇到线上问题都是如何解决的?我答了Full GC、CPU过高的解决思路
- 乐观锁和悲观锁的理解
- CAS的理解和实现,会有什么问题?
- 熟悉什么设计模式?工厂模式和策略模式的一个使用场景。
- 平时的技术爱好
- 分布式事务的了解。两阶段提交
- CAP、BASE理论。BASE理论应用到实际的场景如MySQL、Redis是怎么样的?
- 设计一个秒杀系统
- JDK8的新特性
- 项目的介绍,如何实现数据去重?最大的挑战是什么?
Shopee-新加坡(Offer)
一面
- 代码题:重排链表
- 代码题:实现HashMap
- TCP和UDP的区别
- TCP的首部
- TIME_WAIT
- 流量控制和拥塞控制,具体实现
- MySQL的B+ Tree结构,优点
- 索引优化有哪些
- 事务是怎么样的
- 事务的隔离级别?可重复读的问题
- MySQL主从的原理
- 主从延迟会有什么问题?如果要求数据一致性要如何做?
- 进程和线程的区别
- 用户态和内核态
- 虚拟内存、虚拟地址
- 进程间通信有哪些
- 项目的挑战,你是如何解决的
二面
- Java线程池底层实现
- CopyOnWriteList的实现,不适合什么场景。(实现答错了)
- volatile
- JDK用的版本,垃圾回收机,CMS出现ConcurrentModeError会是什么原因
- 代码题:实现HashMap(与一面重复了)
- 主键索引和非主键索引
- InnoDB的可重复读实现
- 事务的提交,两阶段提交(5.6和5.7)
- TCP如何保证对方可理解,我回答了通过序号和长度的机制
- cpu高如何排查,top的user和system区别,java里面如何查看线程的运行情况
- 从磁盘复制一个文件,再通过socket传到对方机器,发生了几次内存拷贝
- 系统设计题
系统设计题1: Q: user table has 4 columns (id, name, age, create_time) and 10 million rows, id is the primary key and there is an index on create_time column. How to optimise this query? mysql> select * from user where create_time between '2019-01-01' and '2020-01-01' order by create_time limit 1000000, 10; +---------+--------------+------+---------------------+ | id | name | age | create_time | +---------+--------------+------+---------------------+ | 3724696 | User-3724696 | 81 | 2019-04-03 14:13:24 | | 3724697 | User-3724697 | 61 | 2019-04-03 14:13:32 | | 3724698 | User-3724698 | 10 | 2019-04-03 14:13:40 | | 3724699 | User-3724699 | 25 | 2019-04-03 14:13:48 | | 3724700 | User-3724700 | 57 | 2019-04-03 14:13:56 | | 3724701 | User-3724701 | 52 | 2019-04-03 14:14:04 | | 3724702 | User-3724702 | 80 | 2019-04-03 14:14:12 | | 3724703 | User-3724703 | 24 | 2019-04-03 14:14:20 | | 3724704 | User-3724704 | 53 | 2019-04-03 14:14:28 | | 3724705 | User-3724705 | 25 | 2019-04-03 14:14:36 | +---------+--------------+------+---------------------+ 10 rows in set (3.42 sec)
- 系统设计题2:
/** Design Short Url System. Provide two api: 1.generate(string longUrl) -> shortUrl; e.g. : input: shopee.com.sg/item?id=123&pos=455&spam=al&xxxxx=ab output: shp.sg/AbcDef10000 ([A-Za-z0-9]11) 2.resolve(string shortUrl) -> long Url e.g. : input shp.sg/shp.sg/AbcDef10000 ([A-Za-z0-9]11) ouput shopee.com.sg/item?id=123&pos=455&spam=al&xxxxx=ab 1. High performance 2. Avoid Single point of failure 3. Horizontally scalable */
三面
- 为什么用Istio
- 分库分表的依据
- Ingress代理的是四层还是七层
- 代理的工作机制
- 熔断的实现原理
- 多鉴权支持是什么
- 让你实现鉴权你会怎么做
腾讯WXG(二面挂)
一面
一致性哈希,场景、解决的问题,答到了是存储
代码题::判断链表是否有环
判断一个链表是否为回文结构
给定一个链表的头结点head,请判断链表是否为回文结构。(链表元素为整型) 1->2->1 : True 1->2->2->1: True 1->2 : False 10->2->10 : True
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
这里值得一提的是WXG的算法题看起来很简单,但是如果是做了常规的解答面试官是不满意的,必须做出最极致的解法,比如判断链表是否有环,常规的快慢指针解法是不被认可的
分布式事务,Paxos算法
TCP黏包,如何解决?UDP会有黏包的问题吗,为什么?
数据库的慢查询原因
索引失效场景
awk的NR、NF
Linux的/proc/
poll和epoll,epoll的细节
IO多路复用的模式,场景、解决的问题
网络攻击方式,介绍定义以及规避方法
如何编写面向对象的代码
二面
- 题目1
假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。
- 题目2
总共20个球,两个人轮流拿,每次只能拿1、2、4个球,拿到最后一个球的算输,请问是先走的必胜还是后走的必胜,有没有固定的策略;
- 介绍项目
- MySQL优化
- 性能优化处了MySQL还有做什么
- 故障注入有研究过业界方案是如何做的吗
- 高可用做了啥?多机房同步延迟会有什么问题?如果防止延迟
- 第三方服务如何保证高可用
- Service Mesh做了什么
- Istio的服务注册原理
- Java的多态
- 动态代理的原理,与静态代理的区别?项目中有用到动态代理吗?写一个试一下
- 捡回C++要多久?
微众银行(二面放弃)
一面
- 项目介绍
- HashMap的实现,为什么用红黑树
- 熟悉的排序
- 一致性哈希
- B+树
- 一个int类型占多少空间,引用类型呢?
- Java内存模型
- +MaxMetaSpace、+Xms、+Xmx
- GC算法
- 垃圾回收器,G1的特点、有点
- AOP和IOC
- 多少个微服务
- 动态实现创建类,反射
- Nginx如何配置探活
- Java多线程如何通信
- volatile
- 内存可见性的底层,单核有可见性问题吗?工作内存实际上是什么
由于二面约不到时间,我就放弃了微众的面试
字节跳动(Offer)
一面
项目
异地多活
MySQL的InnoDB、MyISAM,两个引擎的索引有什么不同
SQL语句如何调优
Java的垃圾回收机制、垃圾回收器
Java的HashMap和Hashtable不同
ConcurrentHashmap的实现
什么对象会在新生代、老年代
Redis和Memcache的区别
Redis的rehash
Redis持久化,先写AOF还是写内存
故障注入做了什么
算法题:
给定字符串str1和str2,求str1的子串中含有str2所有字符串的最小子串长度 例如: str1="abcde", str2="ac" 则返回 3 str1="12345", str2 = "344" 不存在,则返回0 str1="adabbca", str2="acb", 则返回3
异地多活只是针对MySQL吗
有什么兜底方案吗
多鉴权支持是什么
异地容灾有没有什么兜底方案
二面
- 介绍项目
- 高可用做了哪些
- Istio的原理,集中式网关和分布式网关的区别
- 项目的数据量和QPS
- MySQL优化的思路
- 多机房的数据同步,如果想要同时写入数据得如何做
- Redis的热key如何解决
- Redis的有序列表底层如何实现?为什么用跳表而不用红黑树
- MySQL主从原理
- TCP的三次握手,第三次请求丢失了会怎么样
- Linux的inode和fd的区别,如果一个进程正在写入,另一个进程删除会有什么结果
- 代码题:判断有效括号,求出最长子串长度
- 设计微信抢红包,你会如何去考虑
三面
- 介绍项目
- 项目的瓶颈,如何优化的
- 故障注入做了哪些?有做混沌工程吗
- 进程调度
- 僵尸进程和孤儿进程的区别
while(true)
和while(true){}
的效率相比较- MySQL为什么用B+树而不用B树
- TCP三次握手,第三次请求丢失了会如何
- 代码题:矩阵的最长递增路径
- 让你设计朋友圈你会如何做
- 你的优点、缺点
加面
- 介绍项目中做的事情
- 项目QPS
- MySQL的join原理
- 中间表的结果数据量不会很大吗
- Istio是如何运维的
- 项目的难点
- 印象比较深的优化工作
- Istio部署到线上会遇到什么问题吗
- Service Mesh和RPC的区别
- 代码题:会议室
微软(Offer)
微软的面试更多是专注于项目和代码题,开放性的题目较多,没有过多的八股文,面试流程为 1轮技术面 + 3轮平行面 + AA面
一面
- 滑动窗口最小值
- MySQL优化有哪些
- 选择Istio的初衷
- 用了Sidecar之后网络耗时用了多少
二面
- 介绍项目
- 多机房部署是如何做的
- 监控探活
- 前缀索引、覆盖索引、联合索引的区别
- 实现代码:为字符串打码
- 树的最大高度
三面
- 问项目
- 通过数组排序链表
四面
- 问项目
- 为什么要来微软
- 代码题:公交车到站时间估计运行车辆
AA面
- 聊人生
- 聊项目
- 代码题:开平方
蚂蚁金服(Offer)
一面
挑两个项目介绍一下
网关介绍一下
有用过其他技术吗?介绍一下。
ThreadLocal理解
动态代理的原理
什么时候用切面
代码题
//评测题目: 无 用户有多种支付方式(余额、红包、优惠券,代金券等),假如每种支付方式通过调用远程服务获取可用性。 在外部资源环境不变情况下,请设计程序以最短响应时间获得尽可能多的可用支付方式列表。 假定支付方式可用性咨询接口定义:PaymentRemoteSerivce 接口方法:ConsultResult isEnabled(String paymentType); 返回结果: public class ConsultResult { public ConsultResult (boolean isEnable,String errorCode){ this.isEnable = isEnable; this.errorCode= errorCode; } public ConsultResult (boolean isEnable,String errorCode, String paymentType){ this.isEnable = isEnable; this.errorCode= errorCode; this.paymentType = paymentType; } /** 咨询结果是否可用*/ private boolean isEnable; /** 错误码 */ private String errorCode; private String paymentType; public boolean getIsEnable(){ return isEnable; } public String getErrorCode(){ return errorCode; } public String getPaymentType() { return paymentType; } public ConsultResult isEnabled(String paymentType) { return new ConsultResult(this.isEnable, this.errorCode, paymentType); } }
二面
- 项目介绍
- 项目里有几个技术人员
- Istio和高可用为什么没有专门的DevOps来搞
- B+树的底层结构
- 为什么设置性能500ms的目标?
- 线上的真实响应是怎么样的?一个接口的过程
- RuntimeException和Exception区别
- Object的hashCode和equals区别
- String、StringBuilder、StringBuffer区别
- 反射机制
- 双亲委派机制
- ArrayList和LinkedList
- Java线程安全用哪些保证?
- Synchronized、ReentrantLock和Atomic的区别
- 获过什么奖项吗
- 在学校里的活动
- 前公司吸引你和你不太喜欢的地方
三面
- 项目介绍
- 如果要不允许线上出现慢查询,你会如何做
- 一个服务推上去线上的时候,如何保证是正确的
- 有开发过分布式服务吗
总结
- 工作一年不存在什么社招只要3年以上的人这种顾虑,很多公司在招聘的时候虽然会写着3年,但实际上是可以招聘1年经验的
- 面试是天时地利人和的事情,不是单纯的哪家公司比较难,哪家公司比较简单
- 面试是一个互相筛选的过程,面试了这么多家公司,什么样的面试官都见过,如果遇到恶意打击的,那我觉得候选人也没必要去这家公司上班
- 面试复习的内容是一个持续积累的过程,可以一边面试一边学习
- 面试失败不需要灰心,每个岗位的要求都不一样
- 讲话语速不要太快,不然面试官很难跟上思路,会反问一些难题
暂时想到这么多,也欢迎各位牛友交流面试或者工作中的事情,也祝大家应聘顺利。
最后打个广告,如果有想来字节跳动的可以扫描以下内推码,或者直接点击https://job.toutiao.com/s/LVQqgoh进行投递,感谢大家。