信锐网科软件开发面经:消息队列、Protobuf与Linux
- 轮次
- 一面+二面+HR面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
一面|经历与动机
- 请做一下自我介绍。
- 快手实习主要做什么?
- 未来想从事 Android 还是后端、系统方向?
- 对互联网、安全、嵌入式等行业方向有什么偏好?
一面|消息队列项目
- 发布订阅消息队列的整体架构和完整消息链路是什么?
- Protobuf 在系统中承担什么职责?为什么选择它而不是 JSON?
- Protobuf 的底层编码方式是什么?为什么编码后更小?
- 为什么选择 SQLite 做持久化?
- 开发过程中遇到过哪些问题?
- 网络断开、ACK 丢失后如何处理重复消费?
- 如何验证广播能到达所有队列?
- 做过什么规模的功能测试和压力测试?
- 项目是否使用 AI 辅助开发?
一面|RAG 与 AI 项目
- RAG 功能的需求背景和链路是什么?
- 入库的 PDF 从哪里来?如何入库、召回并生成答案?
- 项目中哪些部分由 AI 辅助编码?
- 如何审核 AI 生成的代码或产物是否正确?
一面|Linux 与工程基础
- 做过 Linux 相关开发吗?了解 Linux 内核吗?
- 网络方向熟悉哪些内容?
- 用 GDB 排查过什么真实问题?
- 多线程和多进程如何使用?
一面|网络基础
- PC 访问百度涉及哪些协议和步骤?
- 如何在 UDP 上实现可靠且安全的传输?
- 如何把 uint32_t 的 IPv4 地址转成点分十进制字符串?
二面|经历、AI 与学习
- 请用两分钟做自我介绍。
- 快手实习持续多久,主要负责什么,技术栈是什么?
- 项目是个人负责还是多人协作?
- 工作和个人项目中如何使用 AI?
- 最近关注哪些 AI 前沿技术、模型或实践?信息来源是什么?
- 技术博客持续了多久,主要目的是什么?
二面|Linux 与工程诊断
- 用户态和内核态有什么区别?
- 应用程序在什么时机从用户态切换到内核态?
- 什么是守护进程?它和 D 状态是什么关系?
- 服务器卡顿时如何找到高资源占用的进程?
- load average 表示什么?如何判断是否异常?
- Linux 上如何调试 C/C++ 程序?
- 如何检查内存泄漏?
- 如何查看一个进程触发的系统调用?
- 是否系统学习过计算机组成原理等底层课程?
二面|网络与算法
- TCP/IP 的实际网络模型是怎样的?
- TCP 靠哪些机制保证可靠?
- 归并排序和快速排序在思想、复杂度、空间与稳定性上有什么区别?
二面|工程方法与岗位认知
- 是否了解瀑布、敏捷、极限编程、结对编程和 TDD?
- 是否做过前端,是否具备全栈潜力?
- 对岗位和公司还有什么问题?
《参考解析》
消息队列项目:架构、选型和一致性要连成一条线
被问「整体架构和消息链路」时,按角色加数据流讲:生产者推送到 broker 的主题、主题下分队列或分区、消费者组各自认领队列拉取并回 ACK,再说清元数据、持久化和广播分别落在哪一层。Protobuf 的优势在于报文里不写字段名、只写字段号加类型,整数用 varint 变长编码,小数值只占一个字节,所以同样的结构比 JSON 小一大截、解析也不用做字符串匹配;代价是可读性差、必须有 .proto 和代码生成、字段号一旦发布不能复用。SQLite 的取舍要主动说:它是嵌入式单机库,不需要独立进程和运维,单个文件配合 WAL 就能拿到事务与崩溃恢复,非常适合「消息量可控、又不想引入独立中间件」的场景;但写操作是单写者串行,写入并发一上来就是瓶颈,这时该换的是什么心里要有数。
重复消费这题几乎是必问:只要投递语义是至少一次,ACK 在网络上丢失就一定导致重投,正确答法不是「保证不重投」,而是消费端做幂等——用消息 ID 或业务唯一键建去重表、把消费位点和业务写进同一个事务、让重复执行的结果与执行一次相同。验证广播是否到达所有队列,也不能只靠日志:给每条消息带序号,让每个订阅方上报收到的最新序号,再对慢消费者和积压做监控,缺哪个队列一眼能看出来。压测要报得出吞吐、P99 延迟、积压恢复时间和资源水位这几个数,只说「压过」等于没答。
RAG 与 AI 辅助开发:链路要讲清,审核要讲出方法
RAG 这题按链路回答最稳:PDF 从哪里来、怎么解析(有文本层直接抽、扫描件走 OCR)、怎么清洗和分块、用什么模型做 embedding 存进什么索引、检索时是纯向量还是向量加关键词混合、要不要 rerank、最后怎么把召回片段拼进 prompt 并给出引用。需求背景要落到「谁在什么场景下要查什么、以前是怎么做的」,只说技术栈会被追问到底层的动机。分块大小、重叠长度、召回条数这些都是取舍:块太小丢上下文、太大噪声多且挤占窗口,能说出你实测过的权衡比背参数好。
AI 辅助开发的审核,面试官想听的是流程而不是态度。可行的一套是:让 AI 只做可验证的小步产出,人逐条读 diff、补边界用例、对不确定的 API 回官方文档核对,关键路径(内存安全、并发、协议兼容)人工重写或至少逐行复核,再在真实数据上跑一遍对照。回答「哪些部分交给 AI」时把边界划清楚——样板代码、测试、文档这类低风险高重复的适合,涉及正确性与安全判断的不交给它,这比笼统说「提效很多」可信得多。
Linux 与工程诊断:这一轮在验证你是否真上过机器
用户态和内核态本质是 CPU 特权级隔离:用户态不能直接访问硬件和内核内存,只能通过内核提供的接口请求服务;从用户态陷入内核的时机有系统调用、异常(缺页、除零)和外部中断,另外进程调度切换也是在内核里完成的。守护进程和 D 状态是两个不相干的概念,硬凑关系容易被追问穿:守护进程说的是进程形态——脱离控制终端、后台长期运行,经典做法是 fork 后 setsid,现代系统上通常直接交给 systemd 托管;D 状态是不可中断睡眠,进程卡在内核里等磁盘或 NFS 这类 IO,连 kill -9 都送不进去,通常意味着存储侧出了问题。
load average 是 1、5、15 分钟三个时间窗内可运行加不可中断进程数的指数滑动平均,判断时必须除以核数才有意义,还要和 CPU 利用率对照看:load 高而 CPU 空闲,多半是 IO 等待而不是算力不够,这时往下查 iostat、vmstat 才有方向。找高占用进程用 top 排序或 ps aux --sort=-%cpu,再用 pidstat 看单进程的细粒度占用。内存泄漏先看 /proc/<pid>/status 里的 VmRSS 和 pmap 的长期趋势——缓慢上涨且不回落才可疑,之后用 valgrind 或 AddressSanitizer 定位,注意内存增长也可能是缓存或碎片,别一口咬定是泄漏。调试 C/C++ 要能说出 gdb 的常用姿势:带 core dump 分析、attach 到线上进程、断点与 backtrace;想知道进程在做什么系统调用就用 strace 挂上去,性能采样则可以上 perf。
网络与算法:从一次网页访问讲到传输层
「PC 访问百度」这题用来查分层是否清楚:先查 hosts 和本地缓存,再走 DNS 解析出 IP,接着 ARP 拿到网关 MAC,与服务器做 TCP 三次握手(HTTPS 还要叠一层 TLS 握手),然后发 HTTP 请求、经 NAT 和多跳路由到达对端,拿到响应后浏览器解析渲染。在 UDP 上做可靠且安全的传输,等于在应用层把 TCP 那套重造一遍:序号与 ACK、超时重传、滑动窗口、拥塞控制,KCP 和 QUIC 就是这条路线的产物;安全不能直接套用跑在 TCP 上的 TLS,要么用 DTLS,要么像 QUIC 那样把 TLS 1.3 内建进去。TCP 的可靠性本身则摊在几处:序号与确认、超时重传和快速重传(配合 SACK)、滑动窗口做流控、拥塞控制避免压垮链路,外加校验和与连接管理。
把 uint32_t 的 IPv4 转成点分十进制,工程上用 inet_ntop 即可;手写版本要按网络字节序逐字节取值再拼接,别忘了大小端这个坑。排序对比那题把维度列全就稳:两者平均都是 O(n log n),快排常数小、原地排序只需栈空间,但最坏会退化到 O(n²) 且不稳定;归并稳定、时间上界稳定,代价是 O(n) 额外空间,因而更适合链表和放不下内存的外部排序。
HR 面(9 月 29 日)原帖只记了日期,没有留下题目。这类轮次筛的是动机、稳定性与前后一致性——为什么选这家、能什么时候到岗、手上有哪些 offer,和两轮技术面里说过的方向要对得上,回答给确定的日期和范围,比含糊的「都可以」安全。