
朋友问我寒武纪2019秋招后端岗笔试二的内容我正好翻到了当年整理的那份复盘笔记。寒武纪这家公司比较特殊做AI芯片出身后端岗位跟纯互联网公司的后端有不少差异笔试题里能看到明显的系统软件、性能优化、底层原理倾向。如果你正准备芯片/算力类公司的后端岗位或者对寒武纪的笔试风格感兴趣这篇复盘应该对你有用。我会把笔试中反复出现的知识点、题目类型、解题思路和踩坑经验都拆开讲一遍争取看完能直接上手做类似的卷子。1. 寒武纪后端岗笔试到底在考什么1.1 先搞清楚岗位定位再备考寒武纪的后端岗位跟普通互联网公司的“后端开发”不完全是一回事。做AI芯片的公司后端开发通常集中在三个方向一是芯片配套的软件栈比如编译器、运行时、算子库、性能调优工具二是AI平台服务比如模型部署、推理服务、资源调度三是支撑业务的通用后端比如数据平台、内部系统。2019年秋招这个时间点寒武纪正处于从芯片向“芯片软件栈云服务”扩展的阶段笔试题也反映了这种技术倾向C/C相关的内容占比明显偏高操作系统、并发、内存管理的题目很扎实算法题虽然不特别难但对复杂度和边界条件抠得比较严。如果完全按照互联网大厂的“Java后端八股”去准备可能会吃大亏。我见过不少同学拿着Spring、微服务那套东西去投寒武纪后端结果笔试里几乎没用到。不是说这些不考而是比例很低。核心还是计算机基础四件套——数据结构、操作系统、计算机网络、数据库再加上C/C语言细节。这些恰恰是学校课程里教过但很多人没学透的部分。1.2 笔试的题型分布与整体风格从题型上看寒武纪后端岗笔试一般分为四块选择题、简答题、编程题有时候还会加一两道场景设计题。选择题覆盖面很广但重点在操作系统和C/C内存模型简答题偏向概念辨析比如进程与线程的区别、死锁条件、TCP可靠传输的实现机制编程题一般两道左右难度中等一道偏数据结构一道偏并发或字符串处理。这套卷子的特点可以用两个字概括扎实。没有特别偏难怪的题但处处考验基本功。选择题里的“陷阱”往往不是考记忆而是考你是否真正理解底层原理。比如同样考虚拟内存会问缺页中断发生时CPU的状态切换过程而不是简单问你虚拟内存是什么。这种考法对死记硬背的人很不友好但对真正写过底层代码的人非常友好。1.3 与互联网大厂笔试的横向对比如果把寒武纪的笔试题和BAT/TMD那批公司的后端题放在一起比区别很明显。互联网公司更爱考高并发架构、缓存一致性、分布式事务、微服务治理这类偏业务架构的题而寒武纪更关注进程调度、内存分配、并发同步、编译运行效率这种偏系统底层的问题。这个差异背后是业务形态决定的。互联网后端面对的是海量用户请求核心矛盾是“请求怎么路由、数据怎么分片、系统怎么扩展”AI芯片公司的后端面对的是模型计算任务核心矛盾是“算子怎么高效执行、显存怎么分配、多设备怎么协同”。理解了这一点你就知道为什么要优先复习操作系统和计算机体系结构而不是把时间都花在Spring Boot上。适合参考这套笔试题的人群大概是三类准备芯片/半导体/算力公司后端岗位的求职者校招里投递系统软件、嵌入式软件、高性能计算相关方向的同学以及工作几年后想补一补底层基础的后端开发。如果你是准备纯互联网业务后端参考价值要打折但其中的OS、网络、算法题依然值得做一遍。2. 核心考点拆解每一个模块都在考什么2.1 数据结构与算法不追求难追求写对寒武纪笔试里的算法题给我的感觉是“比LeetCode中等题稍微简单一点但比简单题多一层弯”。考察重点集中在链表、二叉树、字符串处理、动态规划和Top K这类高频题型。不会出特别长的模拟题但会在一个常见题上叠加条件考察你是否真的理解数据结构的本质。举个例子常见的“反转链表”题目笔试里可能会改成“按K个一组反转链表且要求空间复杂度O(1)”。基础差的同学能写出递归版本但一要求O(1)空间就卡住了。这类题目考察的核心其实是两件事能不能在头脑中模拟指针变化以及能不能严格分析时间与空间复杂度。我建议准备这类题时不要光刷题要养成先写伪代码、再验证边界条件的习惯。笔试环境的调试能力往往不如本地IDE一旦思路不清晰写出来的代码很容易在空指针和边界条件上翻车。LeetCode上那些通过率低于40%的简单题值得反复做因为笔试题往往就是它们的变体。2.2 操作系统寒武纪笔试题的绝对重头如果只能选一个模块重点复习我会选操作系统。从寒武纪2019年笔试的情况来看进程与线程、内存管理、死锁、文件系统、用户态与内核态这些基础知识几乎覆盖了选择题的一半。记忆比较深的一道题是考“发生系统调用时进程的状态如何变化”这需要你把“用户态切换到内核态”和“进程从运行态变为阻塞态”两条线串起来理解。很多同学知道系统调用会发生态切换也知道进程可能被阻塞但两者结合到具体场景就容易懵比如read一个未就绪的管道进程到底处于什么状态。另外一道高频题是虚拟内存和页面置换。它会给你一个页面访问序列让你用FIFO、LRU算缺页次数稍微增加难度的方式是问你“为什么LRU在程序局部性好的时候表现优秀但在扫描类场景下可能被FIFO反超”。这种题没有标准计算过程完全看你对原理的理解是否通透。内存分配也是重点。malloc/new背后对应的是堆内存管理涉及空闲块的组织方式隐式空闲链表、 segregated free list、伙伴系统笔试题里很可能让你分析不同分配策略下的碎片情况或者问你为什么频繁的小块分配会导致内存碎片化。我当时把《深入理解计算机系统》里虚拟内存那一章完整过了一遍事实证明非常值。2.3 计算机网络TCP与UDP依旧是核心网络部分的题目总量不如操作系统多但集中在传输层。TCP的三次握手与四次挥手、拥塞控制慢启动、拥塞避免、快重传、快恢复、滑动窗口与流量控制几乎是必考内容。UDP的重点则是无连接、不可靠、首部开销小这些特性以及在实际场景中如何基于UDP做可靠传输。印象比较深的一道简答题是“既然TCP已经可靠为什么还需要QUIC这类基于UDP的协议”。这道题其实考察的是“可靠”二字的代价——TCP的队头阻塞、握手延迟、连接迁移困难在弱网场景下都是痛点而QUIC通过独立的Stream解决了队头阻塞用0-RTT减少了连接建立时间。这类题没有标准答案但你的分析是否能踩准性能痛点直接反映出对网络协议的理解深度。如果你的方向偏AI平台后端可能还会遇到RPC相关的题比如gRPC为什么基于HTTP/2、长连接和短连接各自的优劣、如何设计一个自研的RPC协议。这些没有写在寒武纪的官方考点里但从公司业务来看非常合理建议一并准备。2.4 数据库与缓存索引原理和事务是底线数据库在寒武纪笔试中占比不如互联网公司高但也不会缺席。最常考的还是InnoDB的索引结构B树、聚簇索引与二级索引的区别、回表与覆盖索引、最左前缀原则、事务的ACID与隔离级别。这些是后端工作的基石无论如何都要掌握。有一道题我记得很清楚给你一条SQL问它在联合索引(a, b, c)下哪些条件能用到索引哪些不能。这题表面上考最左前缀实际上还隐含了“范围查询之后的条件无法继续使用索引”这个点。很多人背了最左前缀却忽略了范围条件对索引使用的截断。缓存方面Redis的考察频率不低。常考的有Redis数据结构底层实现SDS、跳表、压缩列表、缓存穿透/击穿/雪崩的区别与解决方案、持久化机制RDB和AOF的对比。面试官如果继续追问会往“Redis为什么这么快”“单线程模型为什么能支撑高并发”这个方向走考察你对IO多路复用和事件循环的理解。2.5 C/C与语言细节想拿高分必须过这一关寒武纪作为芯片公司C/C语言基础在笔试中的权重非常高。指针与引用的区别、const的多种用法、static关键字在不同场景下的语义、内存分区栈、堆、全局区、常量区、RAII与智能指针、虚函数与多态的实现原理这些是最基本的要求。记得有一道选择题问“int* p new int[10]; delete p; 会有什么问题”选项包括编译错误、运行时崩溃、未定义行为、内存泄漏。很多人一看到new[]就想当然认为应该用delete[]但这一题的考察点其实是“未定义行为”和“具体表现取决于编译器实现”正确答案涉及的是C标准语义而不是凭经验判断。此外还会考C11/14/17的新特性比如右值引用与移动语义、std::shared_ptr的引用计数线程安全性、lambda表达式的底层实现。如果你能用“移动语义避免不必要的拷贝但shared_ptr的引用计数操作是原子的指向对象的访问并不是线程安全”这种精准的表达写简答题得分会明显高一个档次。2.6 系统设计与场景题考察全局思维场景设计题通常放在试卷末尾不一定要求写完整代码但需要给出清晰的设计思路。和互联网公司的系统设计不同寒武纪的场景题更偏向计算/推理类比如设计一个AI模型推理服务的资源调度模块、设计一个支持多卡并行的训练任务管理系统、如何优化一个算子库的调用性能。这类题目没有标准答案但有一套通用的回答框架先明确约束条件QPS、延迟、成本再拆解模块接入层、调度层、执行层、监控层最后针对瓶颈给出方案。比如设计推理服务时可以从模型加载、显存管理、请求排队、批处理batching这几个环节展开重点说明如何通过动态batching提升GPU利用率。笔试里的系统设计题一般不会要求你说得很深毕竟时间有限。但如果你能在答案里体现对“性能估算”的敏感度——比如提到“单张GPU单次推理约5ms如果QPS是1000一个GPU实例显然不够需要多副本 负载均衡”——会比空谈架构让面试官印象更深刻。3. 编程题实战复盘三道有代表性的题3.1 实现一个LRU缓存这道题在寒武纪笔试里出现的概率极高而且往往要求你手写完整实现。核心数据结构是哈希表 双向链表哈希表保证O(1)查找双向链表保证O(1)插入和删除。关键点在于每次get和put之后都要把节点移动到链表头部淘汰时删除尾部节点。代码层面的常见坑有几个链表为空时不能访问prev/next删除节点后要同步删除哈希表中的键值put时如果key已存在要先更新值再移动位置而不是重复插入。如果你用语言自带容器比如C的list要非常小心list迭代器的失效问题。实测下来这道题至少需要15分钟才能写得很稳。如果笔试时间紧张建议先用注释写好核心思路再补实现。因为阅卷时除了正确性还会看你的代码结构是否清晰注释里体现的设计思路有时比代码本身更能挽回分数。3.2 多线程交替打印这道题考察并发原语的使用是操作系统和编程语言结合的经典题型。常见版本是“两个线程交替打印奇数和偶数”或者“三个线程循环打印ABC”。前者多用一个互斥锁 条件变量就能解决后者则可以用信号量或者基于state判断的自旋实现。如果笔试环境支持C11可以用std::mutex std::condition_variable注意在wait之前用while循环检查条件避免虚假唤醒。如果用Java可以用synchronized wait/notify也可以用基于volatile的轮询但轮询方案在面试官眼里通常会被追问“会不会浪费CPU”。如果你的岗位偏底层建议用C版本展示你对条件变量和unique_lock的理解。还有一点容易被忽略这道题不仅考并发还考“语义正确”。比如交替打印需要先启动哪个线程有明确的输出要求如果输出顺序反了即便代码能跑通也是零分。所以写完后一定要在纸上模拟一遍执行顺序确认状态转移没有歧义。3.3 求Top K大/小元素Top K问题在笔试题中变体很多从数组中找前K大、数据流中找中位数、海量数据中统计高频词。笔试考的最多的还是数组前K大的经典版本的多种解法全局排序O(n log n)、大小顶堆O(n log k)、快速选择O(n)平均。如果题目允许修改数组快速选择是效率最高的方案但需要写一个partition函数并且要处理重复元素导致的无限递归。我之前就吃过这个亏partition之后没有把等于pivot的元素做边界处理结果遇到全部相等的数组时直接栈溢出。后来养成了条件反射——凡是用快速选择先想清楚数组全相等时怎么退化成O(n^2)但不会死循环。如果笔试明确要求“海量数据”场景那答案就要换成“哈希分桶 小顶堆”并说明每台机器/进程处理部分数据最后归并。这种改版其实不难难的是你能不能主动切换到分布式视角而不是停留在单机算法上。4. 笔试过程中的常见问题与排查技巧4.1 时间分配最容易翻车的环节寒武纪笔试时间一般不算宽裕尤其是选择题和简答题容易让你产生“再想想就能想出来”的幻觉结果编程题时间被严重挤占。我的经验是拿到试卷先花两分钟扫一遍所有题目标注出简单的、中等偏难的、完全不会的三类。优先保证简单题全部拿分然后留出至少30分钟给编程题。如果简答题里有一道想不起来原理的先写几句相关概念不要空着后续有时间再补充。人脑在时间压力下容易钻牛角尖一道选择题卡住超过3分钟就应该标记跳过后面复查时往往会有新的思路。4.2 边界条件写代码时的隐形扣分项编程题最常见的扣分原因不是思路错而是边界条件没处理好。数组为空、链表长度为1、字符串包含空格和空串、输入为负数、目标值等于某个已有值等情况都需要在写核心逻辑前就考虑清楚。我习惯的做法是在代码开头先做几步简单防御数组为空直接返回指针为空直接返回参数范围不符合直接返回错误码。虽然有些人不喜欢防御式编程但在笔试阅卷场景下清晰的边界处理绝对是加分项。另外写完代码后一定要用一组最小输入、一组常规输入、一组极端输入在脑子里演算一遍这比事后debug高效得多。4.3 从出题角度看评分标准跟参与过笔试题设计的同行交流过后我大概了解到这类笔试的评分逻辑选择题靠正确率简答题看要点覆盖编程题看“正确性 复杂度 代码风格”。对于编程题如果你给出的算法复杂度达不到预期比如要求O(n)你写了个O(n^2)即便能跑出正确答案得分也会被砍掉不少。所以笔试答题时尽量在代码注释里写明复杂度甚至注明“此处可以优化为XX方案但为了代码可读性选择了当前实现”。这样即便时间复杂度差一点阅卷人也能看到你有优化意识。简答题的诀窍是多写关键词比如问“为什么TCP是可靠的”把“序列号、确认应答、超时重传、滑动窗口、拥塞控制”这些术语全部列出来比长篇大论容易被提取到采分点。4.4 编程环境与提交前的自检清单笔试平台多数是牛客网或者公司自研的在线OJ这类平台的特点是编译报错信息不够友好而且不支持调试器。写代码时尽量使用简单明确的语法避免依赖IDE的自动补全。提交前把以下清单过一遍是否所有头文件/import都写好是否有未使用变量导致的警告有没有把调试用的printf遗留在代码里是否存在潜在的整数溢出int相乘再赋值给long。C/C环境下还要格外注意数组越界。很多在线OJ的判题逻辑是在数组越界后直接报Runtime Error而不会告诉你具体哪里越界。这时候快速定位的办法是缩小数据规模用最小用例跑一遍或者把循环边界打印出来。如果连打印都受到限制那只能靠读代码时统计好边界所以写循环时用“”还是“”务必仔细确认。5. 从笔试看寒武纪后端岗的技术栈演进5.1 AI芯片公司后端开发的特殊性寒武纪后端岗的笔试之所以偏向底层跟AI芯片公司的业务结构密不可分。芯片设计好之后真正让用户在业务场景中用起来依赖的是完整的软件栈——编译框架比如寒武纪的MagicMind、高性能算子库、运行时系统、模型部署工具。这些模块的开发者都属于广义的“后端”但他们面对的“用户”不是普通终端用户而是另一层级的开发者。这就导致一个结果后端工程师不仅要懂业务逻辑还要懂硬件特性。比如算子融合要理解访存带宽和计算强度的关系显存管理要考虑不同型号芯片的显存大小和带宽差异。笔试阶段可能不会直接考硬件细节但会通过操作系统、内存管理等内容来筛选具备这种底层思维的人。5.2 通用后端能力同样不可忽视虽然底层内容占比高但这不代表通用后端知识可以放弃。随着寒武纪从芯片公司向“云端”平台演进面向用户的业务后端模型仓库、产品管理、用户系统、计费系统也在扩张。这类系统同样需要Spring Boot、MySQL、Redis、消息队列、微服务治理这些技术栈。如果你在准备寒武纪的面试建议不要只盯着一类考点。底层的操作系统、C/C、体系结构是笔试区分度最大的地方值得花70%精力而数据库、缓存、消息队列、业务架构设计也不能零基础至少要能讲清楚自己的项目里的技术选型和性能瓶颈。最好的策略是“两条腿走路”底子扎得深同时有拿得出手的上层项目。5.3 针对寒武纪笔试的备考建议清单把《深入理解计算机系统》CSAPP的虚拟内存、异常控制流、网络编程三章认真读一遍这是理解操作系统题最快的捷径。数据结构复习聚焦高频题LRU、Top K、二叉树遍历变体、链表操作、字符串处理。LeetCode热题100里面中等偏下的题目做两遍。C/C重点复习内存管理、指针、const/static语义、智能指针、多线程。如果时间有限优先掌握语言细节而不是新特性。网络部分不需要抠太偏的协议TCP可靠传输、拥塞控制、HTTP与HTTPS、HTTP/2多路复用这几个必须吃透。找一两套其他芯片/硬件公司的笔试题练手比如海思、联发科、平头哥熟悉这类公司的出题风格考场上会更从容。时间充足的话刷一下剑指Offer虽然题偏老但代码风格和面试导向很契合这类笔试的评判标准。5.4 笔试之后的面试准备衔接笔试只是第一关寒武纪后续的面试往往会在笔试内容基础上深挖。比如笔试考了LRU面试时可能让你把LRU扩展到“并发场景下的LRU”或者问“Redis的近似LRU和严格LRU有什么区别”。笔试考了多线程面试时可能追问“条件变量为什么需要配合互斥锁”以及“wait为什么放在while循环里”。所以笔试结束后的复盘比笔试本身更重要。建议每道错题都整理出对应的知识点并为该知识点准备一条“更深入一问”模拟面试官可能的追问方向。我当时整理了一个表格左边是笔试题右边是列出的追问和答案要点后来确实在面试中遇到了几乎一样的问题。把笔试题目吃透等于准确预测了一部分面试范围这是校招阶段性价比最高的备考动作。