字节跳动飞书后端开发三面面经(已拿意向书)
一面(7.26):约 52 min
- 自我介绍
- 问了一下浙大那个PAT考试是啥,简单说了两句
- Unicode 和 ASCII 码的区别?(我只知道编码长度区别,扯了两句)
- UTF-8,汉字几个字节?,英文几个字节?
- 进程和线程的区别,关系?
- 进程之间通信方式?(答了教材上那四种,共享内存、消息队列、管道、C/S模式)
- 死锁解释一下,死锁的必要条件?(提了有四个条件,但是只答出来两个😅)
- 进程的优先级?(Linux优先级没答出来,说了下 Java 的线程优先级)
- Java 的原子操作?(说了一下 CAS)
- Java volatile 关键字
- 读写锁
- 栈和堆的区别?(说了下 JVM 的内存区域划分)
- 进程栈和线程栈有什么区别?(没答出来……面试官后来提示了一下“可增长”,我就猜着回答说线程能够申请到的空间大小有限制blabla)
- 匿名映射、具名映射,mmap?(不知道……)
- 物理地址、虚拟地址、逻辑地址的区别,怎么实现虚拟地址到物理地址的转换?(前面那个大概说了下,后面的没答上,只是依稀记得有个地址变换机构)
- 交换机和路由器各自在哪一层?
- 10网段的广播地址是(当时瞎蒙了一个全1,后来一查发现蒙对了)
- IP、UDP首部有哪些字段
- SYN 攻击(不知道……)
- TCP 滑动窗口解释一下作用?
- 慢开始解释一下(我说是滑动窗口大小线性增长,后来一查发现不对……)
- MySQL,事务的ACID特性说一下(A:undo log,D:redo log 两阶段提交)
- CAP 定理说一下,一般选择牺牲哪些特性?(CP, AP)
- 手撕算法:LeetCode 160
- 口撕算法:LeetCode 543
- class,abstract class,interface 区别?
- 类加载机制(双亲委派模型)
- ReentrantLock 介绍一下(说了一下底层基于AQS,状态数对应重入次数;显式锁的高级特性:中断响应、超时等待、条件对象绑定)
- 插问,synchronized 是可重入的吗?
- GC 大概说一说(说书环节……具体就是背诵《深入理解 Java 虚拟机》)
- C/C++ 和 golang 了解过吗
- 反问环节
- 我的知识储备还有什么地方需要查漏补缺?
- 我还有下一次机会吗?(肯定答复)
- 总结一下:一面基本没问项目,注重考查的是知识的广度,OS,网路,语言特性,其他知识都有涉及到。另外面试官人也很 nice,面试体验相当不错
二面:约 50 min
- 一面结束后很快就约了二面,在一面三个小时之后
-
自我介绍
-
聊项目,主要是 Kafka connect 相关,还提了一下项目中 Redis 的应用场景
-
Redis 数据结构?
-
Redis hash 数据结构说一下(提到类似 Java 1.7 的 HashMap)
-
Java 1.8 之后的 HashMap 结构,为什么要这么设计?
-
Redis list 底层是什么数据结构?
-
Java int 和 Integer 区别?使用场景?
-
final 关键字
-
并发编程有实践过吗?说一说乐观锁,Java 的乐观锁底层怎么实现的?
-
Java 的异常体系(说了一下类/接口的继承结构,免检异常和受查异常的区别这些)
-
数据库索引(说了一下 InnoDB,聚簇索引,B+树,还有哈希索引)
-
B+树索引和哈希索引的区别?
-
只走索引就查询到全部数据的这种叫什么?(覆盖索引)
-
重点来了:短网址解析到长网址的设计题
- 长网址怎么映射到短网址(我说的是用哈希函数,提到了 MD5)
- MD5 生成结果是几位的?多少字节?对应多少个字符?
- 怎么解决哈希冲突?(这里没答上来)
- 短网址怎么解析到长网址(瞎猜是 DNS,后面一查居然对了,不过说的没那么细)
- 插问:HTTP 报文结构
- 如果短网址用自增 id 行不行呢?(这里应该是可以,看了一下成熟的设计使用的是类似自增id的设计,当时我说不行,因为可能会被攻击者试出某一个特定 URL,然后面试官提示我说哈希生成的也可以被字典穷举攻击,于是就只好说自增 id 会面临用完的情况)
- 分布式服务提供自增 id 怎么设计(瞎猜了一个每个节点分配一个增长的区间)
-
手撕代码:给定一个数组,求区间和等于某一个值的子数组有多少个,数组元素可正可负
在面试官提示之下做出来了,大概就是第一次遍历用一个数组记录前缀和,同时用一个哈希表存一个前缀和的值对应的下标位置,即HashMap<Integer, List<Integer>>,然后第二次遍历,对于每个下标,我们用目标值减当前下标对应的前缀和,在哈希表里查找所得差值对应的下标(可能需要遍历对应list),如果下标大于当前下标就是一个合法解。如此可以在线性级别的复杂度内得到结果
- 反问环节
- 技术栈
- 知识储备的补足
- 还有下一次机会吗?(HR会联系你的)
- 二面个人是觉得最难的一次,主要就是短网址的那道设计题,即考查知识广度,也考查深度,同时也在考量对具体问题的分析和判断能力,算法题倒还好,一开始还是有点懵逼,但是面试官很 nice,主动引导我,还是顺利做出来了
三面(7.28):约 50 min
- 聊项目
- 聊 Kafka(说书环节)
- Kafka 架构 (zookeeper + broker + producer + consumer)
- Topic & partition & Replica
- Leader / Follower,ISR / OSR,脏选举
- Producer 的发送机制,acks 的设置
- followers 和 leader 之间的消息同步
- Kafka 的消息分发(这里我说的是 Consumer Group 和 consumer)
- Kafka 是否能保证消息一定可以被 consumer 消费到?(我觉得不能彻底保证,提了重复消费和漏消费)
- 重复消费和漏消费有哪些具体场景
- at most once, at least once(这里我记得答歪了……)
- kafka 有序性怎么实现
- 项目中的难点?
- 手撕代码:LeetCode 300 LIS,输入从数组变链表(其实不难,但是当时有点慌,只写出来平方级别的算法,后面的优化没想出来)
- 反问环节:问了点入职培训之类的话题
7.30 收到意向书
总结
- 面试体验很好,基本上没有被压力面
- 感觉运气也是很重要的一环,一面二面都有运气好蒙对的问题
- 算法这块,感觉DP这类题目出现的频率比较高,一方面是代码量不大适合面试,另外一方面是更容易考查思路