大家好,我是程序员鱼皮。昨天直播面试了一位 25 届的学弟,暂且就叫他 “阿强” 吧。

阿强非常优秀,不仅有半年的实习经历、有自己的项目,而且还参加过大厂(字节)的面试。

面试开场前,我问学弟:你上次面试字节时,感受如何?

结果阿强的回答差点闪了我的老腰,他说:强度挺大,1 个小时的面试问了我 50 多道题!

这是什么概念?平均 1 分钟 1 道题?这特么机关枪啊?

学弟去字节面试,一小时被问了 50 题。。_系统设计

我开玩笑地问:那你是基本都没答上来么?所以面试官才能问这么多题?

结果阿强说:不是,很多都是追问,就一直答呗~

然后我问了阿强的预期薪资,他表示想进中大厂,拿个年薪 20 ~ 30 万就满足了。

行,看来这次参加我面试的阿强同学,有两把刷子。

  • 你以为的鱼皮内心:看我怎么拷打他!
  • 实际上的鱼皮内心:我别被他给拷打了!

学弟去字节面试,一小时被问了 50 题。。_池化_02

下面我们开始面试,文末会揭晓面试结果,看看阿强能不能拿到他预期的薪资。

本期面试的回放视频在编程导航的直播专区,里面还有几十期真实面试现场的回放:https://code-nav.cn/live

面试现场

整个面试持续了近 2 个小时,从专业技能、到实习经历、再到项目经历,我基本把阿强的简历上提到的内容都问了个遍。

分享一下我问的题目,大家也可以试着答答看,答案可以在我们开发的面试刷题网站 面试鸭 获取:

1)Redis 有哪些数据结构?分别适用于哪些场景?HyperLogLog 有什么缺点?

这题是经典八股文,候选人能力越强,说的内容会越多,优秀的候选人会结合自己的项目去讲,而不仅仅是背诵回答。我还随机挑了阿强提到的其中一个结构 HyperLogLog,作为追问。

2)如何精确统计网站的 PV 和 UV?如何支持百万并发?

这题是系统设计题,可以全方面考察候选人的系统设计能力。刚开始阿强的回答只局限于 Redis,后面在我的引导下,阿强提出了本地原子计数器 + 定期上报的方案;在我的进一步引导下,阿强提出了消息队列 + 日志收集的方案,答的还不错。

3)你对 AQS 的理解是什么?哪些类是基于 AQS 实现的?

这题虽然是八股文,但光背诵是肯定答不好的。阿强的回答还不错,不仅说出了 AQS 的核心思想,还精准地答出了用到了 AQS 的一些技术,比如 ReentrantLock、CountDownLatch 等等。

4)在项目中用过哪些并发编程的类?怎么排查线程池满了的情况?怎么优化?

从上一道题目中,能感觉到阿强在并发编程这块准备地挺充分。所以我就问了这道题,看看到底是 “八股小能手” 还是有在项目中用过并发工具类。阿强的回答中规中矩,答出了自定义线程池、CompletableFuture 等。但是对于连接池排查和优化的追问,答的就一般了。这里阿强坦诚自爆:线上问题处理经验比较少。这也是校招同学的普遍情况。

5)十亿级数据量的写入流程是什么?如何应对数据丢失?

为啥问这道题目呢?因为阿强的实习经历中写到 “他有过十亿级数据量的写入经验”,所以这题我是贴着他的实习经历问的。结果阿强回答的挺不错,把他实习公司的数据处理流程清晰地讲了出来,涉及到 Kafka、Flink、Hive、S3 存储等技术。

6)服务器会自动返回给浏览器 Gzip 压缩吗?

这道题也是阿强实习经历中写到的,他说曾经通过 Gzip 压缩优化过服务器的资源传输体积。但这题我换了个问法,想考察下他是否真的了解 Gzip、了解服务器在什么情况下会返回 Gzip。阿强这题答的也不错,想到了请求头中的 Accept-Encoding。

7)什么是 Apollo?它有哪些功能和优势?一般是怎么发布配置的?

这题考察配置中心,也是阿强简历中写到的,从他的回答中能感觉到确实在企业中用过配置中心,也了解配置的发布流程。问到这里他的实习经历已经是 “铁真实” 了,自己做过的东西掌握的都很不错。有点遗憾的是,配置中心的部分特性没有讲出来,所以我也没有去问他配置中心的设计原理了。

8)什么是 LiteFlow?怎么自主实现 LiteFlow?

这题也是阿强实习经历中提到的,他在公司接触过 LiteFlow 规则引擎。前半问比较基础,核心考点在后半问,我是想考察下阿强的架构设计能力,看看能不能想到设计规则引擎的核心,比如规则配置化、规则持久化、规则编排、规则热刷新、上下文隔离等等。这题阿强也流畅表达了自己的思路,只不过视角还是更偏向于应用开发,而不是整体的设计。

学弟去字节面试,一小时被问了 50 题。。_池化_03

9)为什么选择 Dubbo 而不是 Feign?怎么自主实现 Dubbo?

这题没啥好说的,阿强简历上提到了 RPC,我就随便问了问,关键区别也都答出来了。但由于对 Dubbo 了解的不够多,所以不太清楚怎么自主实现。

10)什么是池化技术?怎么自主实现池化技术?

这题的重点依然是在后半问,看看能不能想到池化技术的几个重点,比如实现一个连接池:需要考虑怎么复用连接?怎么控制池的大小?空闲连接如何管理?怎么处理连接超时问题?是否要保证线程安全等等?把 “连接” 换成其他 “资源”,也是类似的。

11)如何设计一款易扩展的 SDK?

这题考察开发经验,由于阿强没有写过 SDK,只写过工具类(utils),所以答的一般。我让他回去了解一下 Java 的 SPI 机制。

12)一般怎么上线项目?怎么实现一个流水线自动部署平台?

这题考察上线项目的能力,阿强 Linux + Jenkins 自动化部署的实操经历,还是不错的,但对于线上 JVM 的参数配置、线上服务的稳定性、线上服务的可观测性、资源的利用率等概念不是很敏感。这也是校招同学的普遍情况。

13)什么是单点登录?怎么实现单点登录?

阿强首先就答出了统一的登录认证中心、以及基于 token 的方案,但反而忽视了基于共享 Cookie 域名的实现方案。这里建议想进中大厂的同学,在学习方案时,多搜索和对比几种,而不是只了解一种方案就完事了。

14)压力测试过程中有哪些注意事项?

15)使用 ThreadLocal 的过程中有哪些注意事项?

16)怎么自己设计一个自动缓存的注解?怎么更高效地使用缓存?

最后这几道题也基本都是考察各方面的经验了,比如对系统性能的测试分析经验、对开发中常用类的实践、编码设计能力等等。

面试建议

先给面试结果,我愿意给他发放 20 - 30w 的 offer。

学弟去字节面试,一小时被问了 50 题。。_池化_04

因为整个面试过程中,我的体验是非常好的,完全感受不到阿强是 25 届的校招生,更像是和一位有工作经验的同学在聊天。基本我问什么,他都能很快地表达,很少有卡壳;而且状态是比较自信的,我故意设置的一些坑点也没有唬住他。直播间的弹幕也都在说:我曹,这是 25 届?

所以其实我也能理解为什么他去字节面试,1 个小时能被问这么多题目了。

最后我给阿强一些建议:面试的准备其实已经比较到位了,重点放在优化简历上。

1)把你自己的项目上线,尽量上线地址、个人博客和 GitHub,向招聘者更多地展示你的经历和能力

2)由于简历只有 1 个项目,可以再补充一个。我给阿强推荐的是编程导航的 手写 RPC 框架和最新的面试刷题平台项目 ,这两个项目涉及了大量市面上大多数同学简历中都没有提到过的技术,写上去能给简历增加不少区分度,而且学习周期也不长,适合秋招快速突击。

学弟去字节面试,一小时被问了 50 题。。_服务器_05

3)之后再回答系统设计类的题目时,可以先思考一下,怎么从整体到局部、有一个线性的思路去回答,比如 “如何设计一个秒杀系统?”,可以先回答秒杀系统重需要解决的关键问题,然后从前后端两个视角去回答;回答后端时,可以按照请求的顺序,依次回答整个链路各个模块(或技术组件)的注意事项。


OK,就分享到这里,大家能否答出这些题目呢?

本期面试的回放视频在编程导航的直播专区,里面还有几十期真实面试现场的回放:https://code-nav.cn/live

更多

💻 编程学习交流:编程导航 📃 简历快速制作:老鱼简历 ✏️ 面试刷题神器:面试鸭