一、自我介绍 & 实习经历
- 先做一下自我介绍。
- 你寒假在做的实习,主要内容是什么?详细介绍一下。
- 你说参与了一个数据清洗的流水线,能说一下这个模式是怎样的吗?业务背景是什么?
二、RPC 框架 & Netty
- 我们来聊聊 RPC 吧。这个基于 Netty 的高性能 RPC 框架是你自己搞的,还是学校项目?
- 先介绍一下 Netty 是什么?
- Netty 主要包含哪些模块?它是怎么实现多路复用的?
- 你了解 select / poll / epoll 它们之间的区别吗?
- Netty 的 Selector 和 epoll 是什么关系?Selector 底层是不是基于 epoll 封装的?
- 你了解 epoll 的水平触发(LT)和边缘触发(ET)吗?两者有什么区别?
三、零拷贝 & 操作系统
- 你简历里写了零拷贝。你认为传统 IO 和零拷贝有什么区别?
- 提示一下:零拷贝并不是"数据不拷贝",而是没有 CPU 拷贝,避免了用户态/内核态切换的开销。
- 你有没有思考过一个问题:既然零拷贝这么好用、对调用方也很难感知,为什么操作系统一开始不直接设计成零拷贝,而是后来才补出来的?
- 对于零拷贝来说,它避免了拷贝到用户态、一直处在内核态------这是否会引发别的安全风险?
四、TCP
- 介绍一下 TCP 三次握手。为什么要三次,而不是两次?
- 介绍一下 TCP 四次挥手。
- 最后一次挥手(第 4 次 ACK)如果没有到达服务端,会发生什么?
- 为什么要设计成四次挥手这样一种机制?
- 这套重试机制是 TCP 连接本来就有的吧?
- 场景题:假设一台机器出现大量 TIME_WAIT 状态,可能是什么原因?
五、项目落地情况
- 你这个 RPC 框架有落地吗?上线使用过吗?
- 有没有基于这个 RPC 框架去支持别的项目?
六、智能面试系统
- 再来聊一下你的智能面试系统。这个项目面向什么人群?有哪些核心模块?
- 你用了 Redis Stream 来处理客户端连接------这个 Stream 怎么理解?为什么不用 Redis 的 Pub/Sub?
- 消息队列只要涉及到,消息丢失、重复消费就是绕不开的问题。你是怎么处理重复消费的?
- 追问:在使用数据库自增主键的情况下,重复消费该怎么应对?(不能直接靠数据库唯一性约束报错来兜底)
- 简历里写"接口 RT 优化到 200 毫秒",这里写的是一个调用 AI 的接口------AI 本身的耗时跟接口 RT 优化有什么关系?
- 我理解你的 RT 优化是基于把同步调用变成了异步处理。但站在用户视角,AI 该花的时间还是要花,对用户来说体验真的优化了吗?
- AI 的结果最后是怎么回传给用户的?(SSE / WebSocket 怎么选?)
七、算法题
第一题:区间合并求最大区间
- 给定一组区间
[a, b](左小于右、不重复),定义合并规则:相邻两个区间首尾相接 (前者的右端点 = 后者的左端点)才能合并,合并后还能继续参与合并。要求找出全局最优解 :能合并出的最长区间长度。例:[1,3] + [3,10] → [1,10],再和[10,20]合并成[1,20],最终输出 18。 - 先讲讲思路。提示:有没有做过类似"回溯/深搜"的题?想一想用 DFS 怎么做。
第二题:链表反转(第一题做不出,换题还是没写出来,难崩)
- 写一个链表反转。
- 刚才你用的是递归,那除了递归,能不能用循环(迭代)来完成?讲讲思路。
- 调试时遇到了死循环------能解释一下哪里错了吗?
- 我们一起拆解一下:以
1 → 2 → 3三个节点为例,反转的关键步骤是什么?为什么要先保存"下一个节点"的地址?
面试官最后的反馈
- 知识面广度需要提高:网络、操作系统、数据结构这几块要补齐,不要留死角。
- 学习要多问"为什么":很多关键考点(比如零拷贝为什么不是从一开始就有、零拷贝的额外安全风险、三/四次握手的设计动机)不是书上直接写好的"字典式知识",需要自己往下追问。
- 善用 AI 工具做技术追问:学到一个点就去"折磨" AI------为什么要这样设计、为什么不那样做,把整条技术链路打通,这样比应试式记忆牢靠得多。
这个面试官是我面试体验最好的,但是他的口音和普通话我听不懂,我觉得他本来还挺想要我的,可惜算法大坑了,哎,后续大概是4天后流程结束
挖得很深,我也讲得很深,所以我俩其实聊得还不错,比较适合我,反馈建议可能是因为我对网络协议重试部分得逻辑比较迷糊的原因吧,我们零拷贝聊到了操作系统而不是仅仅Netty的框架部分,很对胃口而且业务方向其实跟我项目也比较相似,还是可惜了,算法水平呀。真的有点无奈了