顺丰AI全栈研发线下面经:初试+复试
- 轮次
- 初试+复试
- 结果
- 已挂
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
初试
- 你怎么理解 AI coding?人在 AI coding 过程中应该扮演什么角色?
- 举一个你在用 AI coding 时遇到的问题,以及是怎么解决的。
- 实习项目里开发最核心的部分是什么?代码都是你自己写的吗?
- 项目里的某两个模块之间是怎么通信的?为什么用那个方案?
复试
- 二分查找的时间复杂度是多少?冒泡排序的时间复杂度是多少?具体是怎么排的?
- InnoDB 的 B+ 树和 B 树有什么区别?索引是怎样的结构?
- 联合索引用过吗?是怎么样子的?
where a = ? and c = ?这种可以用联合索引吗? - InnoDB 的事务隔离级别是怎样的?MySQL 默认是什么级别?
- 一般消息队列阻塞是什么情况造成的?
- 后端的幂等是怎么定义的?
- 其他闲聊:实习有什么收获?怎么理解「AI 全栈」这个岗位?你的职业目标是什么?你的专业后面主要做什么?毕业论文题目是什么?你的优势和缺点是什么?
- 反问
《参考解析》
B+ 树和 B 树的区别:B 树的每个节点都同时存键和数据(或数据指针),B+ 树的非叶节点只存键、数据全部落在叶子节点,且叶子之间用双向链表串起来。由此带来三点实际差异:① 同样一页 16KB,B+ 树的非叶节点能放更多键,扇出更大、树更矮,InnoDB 里三层左右就能覆盖千万级数据,磁盘 IO 次数更少;② 范围查询和 order by 只需沿叶子链表顺序扫,不必像 B 树那样中序遍历回溯父节点;③ 全表扫描只扫叶子层。补充一句 InnoDB 的结构:主键索引是聚簇索引,叶子存整行数据;二级索引叶子存主键值,所以查非索引列要回表,这也是「尽量用覆盖索引」的由来。
联合索引的最左前缀:对 KEY(a, b, c),where a = ? and c = ? 只能用上 a 这一列做定位,c 用不上有序性——MySQL 5.6 之后有索引下推(ICP),能在存储引擎层用 c 过滤掉一部分回表,但仍然是扫描 a 命中的所有记录。想让 a、c 都走索引,可以单独建 (a, c);设计顺序时把等值条件、区分度高的列放前面,范围条件放最后(范围列之后的列用不上有序性)。判断有没有用上,看 explain 的 key 和 key_len。
事务隔离级别:读未提交(RU,会脏读)、读已提交(RC,会不可重复读)、可重复读(RR,MySQL InnoDB 默认)、串行化(Serializable)。InnoDB 靠 MVCC + 一致性读视图实现 RC/RR 的快照读,靠记录锁、间隙锁、临键锁(next-key lock)在 RR 下解决大部分幻读问题;RC 与 RR 在「快照何时创建」上不同(RC 每条语句新建 ReadView,RR 事务内复用第一个),这也是很多「同一事务两次查询结果不一致」问题的根源。
消息队列阻塞(堆积)的常见原因:消费者处理慢(单条耗时长、下游 DB 慢、消费线程数不足)、prefetch / QoS 预取值设置不合理导致单消费者囤积、消费者异常反复重入队形成毒消息、生产者流量突增而队列容量没跟上、broker 触发流控(RabbitMQ 达到内存或磁盘 high watermark 会阻塞 publisher)、队列或分区数太少无法并行消费、消息体过大导致网络和磁盘压力。排查顺序一般是先看队列深度与消费速率曲线,再看消费者耗时分布,最后看 broker 的资源水位。
后端的幂等:同一请求执行一次与执行多次,对系统状态的副作用相同。实现手段:业务唯一 ID(订单号、请求号)+ 数据库唯一索引或去重表;Redis SET key value NX EX 占位,处理完再放行;状态机约束(只允许 待支付 → 已支付,重复回调直接返回成功);乐观锁版本号;提交前先取一次性 token。顺带说清 HTTP 语义:GET / PUT / DELETE 天然幂等,POST 不幂等——这正是支付回调、MQ 重复投递必须自己做幂等的原因。
二分与冒泡:二分每次把查找区间折半,时间复杂度 O(log n),前提是数据有序且支持随机访问;冒泡排序每轮从头相邻两两比较,大的往后冒,一趟确定一个最大值,最好情况 O(n)(加 swapped 标记提前退出)、平均和最坏 O(n²),原地、稳定。对比记忆:快排平均 O(n log n)、最坏 O(n²)、不稳定;归并 O(n log n)、稳定但需额外 O(n) 空间。
AI coding 里人该是什么角色:把模型当成「打字很快、但不了解你系统上下文的初级工程师」。人负责把需求拆小、提供约束(框架版本、现有接口、命名规范、错误处理要求)、审阅方案与代码、写测试兜底、并对最终结果负责。实践上先让它复述需求、给方案和接口,再让它写实现;发现跑偏时给具体报错和期望行为,而不是笼统说「不对」。
给「依旧凉经」的复盘:作者自评基础不过关,这场面试的题目全部落在可预期的八股范围内(排序复杂度、B+ 树、隔离级别、MQ、幂等),说明失分点在准备度而不是题目难度。建议把这几块整理成一页速查(每种隔离级别对应的问题、B+ 树三点差异、联合索引最左前缀的四个查询形态),面试前过一遍即可显著提分。