学弟去字节面试,一小时被问了 50 题。。
大家好,我是程序员鱼皮。昨天直播面试了一位 25 届的学弟,暂且就叫他 “阿强” 吧。
阿强非常优秀,不仅有半年的实习经历、有自己的项目,而且还参加过大厂(字节)的面试。
面试开场前,我问学弟:你上次面试字节时,感受如何?
结果阿强的回答差点闪了我的老腰,他说:强度挺大,1 个小时的面试问了我 50 多道题!
这是什么概念?平均 1 分钟 1 道题?这特么机关枪啊?
我开玩笑地问:那你是基本都没答上来么?所以面试官才能问这么多题?
结果阿强说:不是,很多都是追问,就一直答呗~
然后我问了阿强的预期薪资,他表示想进中大厂,拿个年薪 20 ~ 30 万就满足了。
行,看来这次参加我面试的阿强同学,有两把刷子。
-
你以为的鱼皮内心:看我怎么拷打他!
-
实际上的鱼皮内心:我别被他给拷打了!
下面我们开始面试,文末会揭晓面试结果,看看阿强能不能拿到他预期的薪资。
本期面试的回放视频在编程导航的直播专区,里面还有几十期真实面试现场的回放: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 规则引擎。前半问比较基础,核心考点在后半问,我是想考察下阿强的架构设计能力,看看能不能想到设计规则引擎的核心,比如规则配置化、规则持久化、规则编排、规则热刷新、上下文隔离等等。这题阿强也流畅表达了自己的思路,只不过视角还是更偏向于应用开发,而不是整体的设计。
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。
因为整个面试过程中,我的体验是非常好的,完全感受不到阿强是 25 届的校招生,更像是和一位有工作经验的同学在聊天。基本我问什么,他都能很快地表达,很少有卡壳;而且状态是比较自信的,我故意设置的一些坑点也没有唬住他。直播间的弹幕也都在说:我曹,这是 25 届?
所以其实我也能理解为什么他去字节面试,1 个小时能被问这么多题目了。
最后我给阿强一些建议:面试的准备其实已经比较到位了,重点放在优化简历上。
1)把你自己的项目上线,尽量上线地址、个人博客和 GitHub,向招聘者更多地展示你的经历和能力
2)由于简历只有 1 个项目,可以再补充一个。我给阿强推荐的是编程导航的
3)之后再回答系统设计类的题目时,可以先思考一下,怎么从整体到局部、有一个线性的思路去回答,比如 “如何设计一个秒杀系统?”,可以先回答秒杀系统重需要解决的关键问题,然后从前后端两个视角去回答;回答后端时,可以按照请求的顺序,依次回答整个链路各个模块(或技术组件)的注意事项。
OK,就分享到这里,大家能否答出这些题目呢?
本期面试的回放视频在编程导航的直播专区,里面还有几十期真实面试现场的回放:https://code-nav.cn/live
更多编程学习资源