蚂蚁工程研发岗秋招笔试复盘:题型解析与避坑指南 每年七八月开始秋招笔试就像一场全国巡回的闯关游戏。2024年这一轮我投的是蚂蚁集团工程研发岗投递后大约一周收到了笔试通知被安排在9月中旬第2批。工程研发岗和纯后端研发不太一样它更像一个“全栈底座”的角色既要写业务代码也要碰基础组件、稳定性、性能优化所以笔试考察范围非常宽。这篇不是标准答案也不是试卷复原而是把我在第2批笔试中的真实体验、题目类型、答题策略和踩坑点全部整理出来。如果你也准备投大厂工程研发岗或者是被“工程研发”这四个字搞得拿不准考察偏向的人这篇应该能帮你少走一点弯路。1. 考前准备与整体观察1.1 笔试通知与环境搭建蚂蚁的笔试通知通常提前两三天通过邮件和短信同步发送邮件里会写明考试平台、时间、场次以及一个非常重要的东西考试须知。第2批笔试用的还是牛客网系统这在国内大厂里很常见但不同于部分公司可以自由使用本地IDE蚂蚁这边明确要求使用网页编辑器并且全程开启摄像头监控部分场次还会有第二机位的要求。所以考前那几天我做的第一件事不是刷题而是把设备环境彻底测一遍。这里有个细节容易被忽略牛客网考试页面对浏览器的兼容性比较挑剔Chrome和Edge是推荐选项但自动更新后的版本有时候会触发组件未加载的提示。我提前一天用通知链接里的“模拟笔试”功能跑了流程确认摄像头能打开、麦克风能录音、屏幕共享权限正常。千万别小看这一步在群里已经看到有人因为摄像头权限没开进入答题页后系统一直报“环境异常”最后被迫退出重进白白浪费了5分钟。第二机位的话准备一台手机或者平板放在侧后方角度最好能拍到桌面和双手。我用的是手机支架放到侧后方45度调试了两次才保证画面里既能看到屏幕也能看到手部动作。有的同学习惯把第二机位放在正后方但那样拍不到双手如果监考严格一点可能被判异常所以侧后方是最稳妥的角度。1.2 工程研发岗的考察范围拆解第2批笔试整体时长是120分钟题量比想象中大20道单选题、5道多选题、2道编程题外加一小段开放性的简答题。单选和多选覆盖了操作系统、计算机网络、数据库、Java基础、并发编程、Spring框架还有一些算法与数据结构的基础概念。多选占比不算低而且蚂蚁的少选会给部分分数多选则直接不得分所以答题策略上要谨慎不确定的宁可少选。工程研发岗和纯算法岗最大的区别在于算法题难度天花板没那么高但选择题的广度要求明显更高。像TCP拥塞控制的状态变化、JVM垃圾回收器之间的区别、MySQL索引失效场景、Redis持久化策略这些属于高频考点基本属于送分题。真正拉分的是那些偏“工程落地”的题目比如线上CPU飙升怎么排查、分布式锁怎么设计、某段SQL为什么慢这类题没有标准教材可以直接背需要对业务和技术栈有真实理解。编程题两道分值各占25分和30分剩下的是选择题和简答题。第一道题偏简单第二道题稍难。整体时间分配上我的建议是选择题控制在45分钟内编程题留至少60分钟简答题控制在15分钟以内。编程题至少要保证第一题稳拿全部分数第二题能拿部分分数就绝不空着。1.3 答题顺序与心理预期我采用的顺序是先做编程题再做选择题最后做简答题。原因是编程题在高度紧张的状态下越往后越容易慌趁刚开考脑子清醒先解决大头。不少人的习惯是从头做到尾结果选择题磨了太长时间编程题只剩二十分钟这是最亏的。笔试不像面试代码题是客观分选择题有些还能靠直觉蒙一个但代码题空着就是零分。另一个心态上的预期不要指望所有题目都会。蚂蚁的笔试题目每年都有一定比例的新题可能网上完全搜不到遇到陌生考点很正常。把会做的做对把不会的排除掉错误选项拿到60%到70%的分数已经能进入下一轮。我做完多选题其实心里很没底后来复盘发现大部分不确定的题目都避开了那些过于绝对的选项最终笔试还是顺利通过了。2. 算法题专项复盘2.1 题一贪心与排序的组合题第一道编程题描述得很长但去掉场景包装核心就是给定若干任务和截止时间要求安排顺序使得整体收益最大化。这类题的典型解法是贪心加排序本质很像“会议室调度”或“任务调度”的变体。我当时先按截止时间升序排序再用优先队列维护已选任务每当当前时间超过某个任务的截止时间时就弹出收益最小的任务并累加差值——这是处理带截止时间收益最大化问题的标准套路。写代码时要注意一个细节题目的数据范围可能达到10的5次方所以时间复杂度必须控制在O(n log n)。如果你用暴力法两重循环大概率会有用例超时。我提交第一版时担心边界把任务数做了个特判其实完全没必要因为题面保证输入合法。但有一个值得注意的点任务收益可能有负数处理时要判断清楚“是否应该跳过负数收益的任务”还是“只要任务能完成就一定要选”。这个直接决定答案框架。这里分享一个我实际踩过的坑优先队列里存放的收益值Java默认是小顶堆但如果你存入的是负数弹出的是“最小”实际是“负得最多”的那个。当时我想当然以为是弹出最小的正数结果第一个样例就错了吓得赶紧回头检查。所以用PriorityQueue时默认行为要想清楚不然贪心很容易变成“反贪”。2.2 题二带状态压缩的动态规划第二题是一道基于矩阵的路径统计题——在网格中从左上角走到右下角中间有若干不能经过的障碍点且要求恰好经过某些指定点问有多少种合法路径。由于指定点数量很少大概不超过10个状态压缩就成了关键。思路是把这些“必须经过的点”以及起点终点单独建图预处理它们两两之间的最短路径数再通过状态压缩DP计算经过所有指定点的方案数。这题如果只有障碍物没有指定点就是普通二维DP但加上“必须经过”后必须考虑不同经过顺序所以需要把顺序压缩成状态。当时我先把所有特殊点拿出来编号然后用BFS/DP求两两之间的路径数最后用dp[mask][i]表示已经访问过的点集合是mask当前在点i的方案数。这个思路看起来顺但实现时有一个大坑两点之间路径数可能会非常大题目要求对1e97取模这还好说更麻烦的是如果两个特殊点之间不存在任何合法路径直接置为0但状态转移时不能把它们当作正常值处理否则会污染后面的状态。我还犯了一个细节错误Java里数组初始化默认是0我直接用0表示“不可达”但有些状态本身方案数就是0导致分不清是没算还是不可达。后来改成用-1初始化这才把逻辑理顺。写状态压缩DP时一定要区分开“状态未被计算”和“状态结果就是0”不然debug会疯掉。2.3 算法题的调试与环境适应牛客网这套在线编辑器没有断点调试全靠print和肉眼查错所以建议平时就要养成“小规模验证”的习惯。我这次写完第一题先本地测试了题目给的示例又自造了一个边界用例——所有任务都是负数收益验证了程序不会把负数任务强行加入。第二题则重点验证了所有特殊点不可达的情况发现输出应该是0而不是其他错误值。在线编译器还有一点和IDE不同报错信息给的比较模糊尤其StackOverflowError往往只提示一行看不清是哪里递归爆栈。所以编程时尽量不写深递归如果必须用DFS要把递归深度控制好或者改成显式栈。我这道题两次点之间求路径数用的就是迭代DP而不是DFS避免因递归层数太深导致栈溢出。答完编程题后不要急着做选择题回头检查一下变量命名有没有可能导致编译错误Java的public类名必须和文件名一致如果编辑器默认文件名为Main类名写错了直接编译失败。这种低级错误每年都有不少人踩一定要留心。3. 计算机基础选择题复盘3.1 操作系统与网络高频考点单选和多选里操作系统约占了4到5道。考得比较基础但容易混淆进程和线程的转换、死锁的必要条件、虚拟内存页面置换算法、常见调度算法。印象比较深的是有一道关于LRU和LFU区别的多选题考的是“在哪些场景下LRU命中率会低于LFU”。这种题如果只看概念背答案很容易选错必须理解实现原理。LRU基于“最近访问时间”LFU基于“访问频率”如果一批数据被周期性地快速访问但每次访问间隔超过LRU窗口LRU会频繁淘汰它们而LFU能把它们保留下来。所以场景题一定要动手模拟一遍。网络部分考了TCP三次握手和四次挥手、拥塞控制慢启动门限变化、HTTP状态码语义以及DNS解析流程。其中有一道关于HTTP 301和302区别的单选题——301是永久重定向302是临时重定向这个很简单。但另一道关于HTTP/2多路复用和队头阻塞的题目比较有迷惑性HTTP/2解决了应用层队头阻塞但TCP层仍有队头阻塞所以它不能完全消除所有阻塞。选项里有“彻底解决了队头阻塞”的说法显然是错的。我自己的复盘心得是操作系统和网络这类基础科目不要只看面经最好把《深入理解计算机系统》里关于虚拟内存和进程调度的章节、以及TCP/IP协议栈的关键状态机过一遍。蚂蚁的题目虽然是选择题但选项往往做过模糊化处理只靠背口诀很容易翻车。3.2 数据库与Java基础题目数据库这块考了索引失效、事务隔离级别、MVCC原理、B树与B树的区别。有一道题目给出两条SQL问为什么第一条能用上索引第二条却不行本质是考察“在索引列上使用函数会导致索引失效”的规则。这类题在蚂蚁和阿里系笔试中出现的频率极高建议准备时把所有常见的索引失效场景整理成清单隐式类型转换、左模糊查询、联合索引未满足最左前缀、在索引列上进行计算或函数操作、OR连接的非索引列条件等。Java基础方面第2批笔试对集合类、JVM内存结构、垃圾回收器、线程池参数、Synchronized和ReentrantLock的区别都考到了。有一道多选题问“哪些操作可能导致Full GC次数增加”选项包括MetaSpace空间不足、大对象直接进入老年代、System.gc()被调用、Eden区频繁触发Minor GC。最后一个选项其实是干扰项Minor GC频繁并不会直接导致Full GC除非晋升阈值调整或老年代空间不足。这种题就是考你是不是真的理解GC触发链条而不是只背概念。线程池那块也考得很细核心线程数、最大线程数、队列长度之间的关系以及AbortPolicy和CallerRunsPolicy的区别。我建议复习的时候直接把ThreadPoolExecutor的execute流程画一遍从提交任务到核心线程、工作队列、最大线程、拒绝策略这四步每一步对应什么场景必须一清二楚。这种工程性强的知识点笔试容易考面试也容易考值得花时间彻底吃透。3.3 选择题的时间控制与蒙题策略20道单选加5道多选我给自己设定的时间是45分钟。实际做下来前10道比较顺利后面开始遇到不确定的题目尤其是一些多选题可能要纠结几分钟。这时候千万不要恋战可以先标记出来等做完编程题再回头改。牛客网的选择题支持标记但页面切换比较隐蔽我第一次用了两分钟才找到标记按钮在哪里所以在模拟考试时就应该熟悉界面布局。对于多选一个比较稳妥的策略是拿不准的选项不要选。蚂蚁的多选给的是少选得部分分、多选不得分因此冒险选一个只有60%把握的选项期望并不高。与其赌一个多选的分不如把单选和代码题的分拿稳。我这次五道多选题至少有四道只选了两个非常确定的选项虽然可能少了一些分但保证了有分数入账。再说一个蒙题技巧如果某个选项里出现了“一定”“绝对”“所有”这类词在工程类选择题里通常都是错的反之出现“可能”“通常”“不一定”的选项往往更可靠。这不是绝对真理但用来做最后抉择时的参考还挺有效。4. 笔试题型中的细节与突发情况4.1 牛客网输入输出与本地调试的兼容问题很多人忽略的细节牛客网编程题的输入输出格式和使用力扣刷题完全不是一个思路。力扣只需要实现核心函数牛客网要求自己写Main函数、自己处理输入解析而且输入可能有多个用例需要用循环读取。我这次第一道题给的输入格式是多行每行多个整数我当时第一版代码用了Scanner逐行读结果在第一个测试用例中通过了但第二个用例一直在等待输入因为没有判断是否还有剩余数据。后来改成while(scanner.hasNext())才解决问题。另外在线编辑器对Java的版本可能有影响。我用的是Java 8的语法特性比如Stream和LocalDate如果编程环境默认Java 11以上问题不大但如果为了保险尽量使用最基本的集合和数组操作避免依赖某些只在特定版本才有的API。牛客网一般会标明语言版本考前一定要看一下。还有个小建议输入解析如果很复杂可以多写几行备注方便自己理清数据格式。代码不需要提交给面试官看标不美观实际上他们主要看AC与否但逻辑清晰总归是好事。系统不会因为你的代码丑扣分但如果你自己看得晕就容易改错。4.2 监控规则与异常处理蚂蚁笔试对切屏的检测比较严格。浏览器一旦切出考试页面系统会记录异常行为切屏次数过多会被判作弊。第2批笔试时我突然被一条系统弹窗打扰本意是点掉它但鼠标不小心移出页面边界结果系统弹了一次警告。我当时心都凉了半截还好只是警告不是直接交卷。这里给大家一个很实用的建议考前把所有可能弹通知的程序全部退出包括微信、钉钉、飞书、邮件客户端、浏览器插件消息通知甚至输入法的弹窗有时候也会触发异常。如果用的是Windows系统最好把系统通知关掉尤其是那些偶尔出现的更新提示。有些人为了防弹窗会把浏览器窗口设成全屏但如果你用的是双显示器一定要把另一个显示器关掉或者拔掉因为系统可能检测到多个屏幕会认为你在查找资料。第二机位的稳定性也要注意。有些同学的手机在考试过程中因为屏幕锁屏或者自动息屏导致监考画面中断。我的做法是把手机的自动锁屏时间设为“永不”并且接上电源保持充电状态这样画面可以一直录到考试结束。还有一点手机和电脑要在同一个局域网里吗其实不一定只要两边的网络都稳定就可以但强烈建议在家里用有线网络避免Wi-Fi波动。4.3 考场上的心态崩盘与自救我当时做到选择题还剩最后三道时突然发现自己只剩35分钟写第二道编程题了一瞬间脑子有点空。好在我提前定了规矩每道选择题最多思考90秒一旦超过就随便选一个先跳过去。结果跳过的题有2道最后根本没时间回来改但这没有影响整体结果。考场上最怕的不是不会做而是因为一道题卡住导致后面所有题都仓促应付。如果编程题暂时没有思路有一个自救方法先写一个暴力解能过部分用例就拿部分分再去优化。尤其第二题这种状态压缩DP如果初始没想清楚完全可以先写朴素DFS把经过特殊点顺序的全排列枚举一遍虽然复杂度很高但小规模数据可以通过。牛客网的判分是按用例部分给分的能拿到10分也算不错。最忌讳的是觉得自己不会就空着空着一定零分。还有一个小技巧如果写完代码后编译失败不要慌着删代码。先检查是不是缺了import比如使用Arrays.sort需要一个包但Java的java.util.*默认不包含一定要写全。很多时候编译失败就是这个问题补上import就过了。5. 考后复盘与后续流程5.1 回忆题目的方法第2批笔试结束后我第一时间把自己能记住的考点记在备忘录里尤其是那些不确定的题目。这个习惯帮了大忙。考后第二天牛客网上就会出现不少网友的讨论帖有些会给出样例和解题思路。我拿自己的记忆去对照发现有两道题我当时的答案是错的于是重新动手推导了一遍把知识点补上了。秋招笔试不是考完就结束了而是通过每场考试查漏补缺。回忆题目有几个角度记录考点关键词比如“TCP拥塞控制”“GC Roots可达性分析”“Redis持久化RDB和AOF”记录大致的场景描述不需要完整复述题干记录自己蒙了哪个选项以及为什么犹豫。这些信息足够支撑后续复盘。如果条件允许把编程题的思路和代码在本地重构一遍。我第二道题当时虽然AC了但事后自己又重写了一个版本发现一个状态转移的顺序问题——我枚举状态时先枚举了当前点再枚举下一个点其实应该反过来会导致重复计数。这种问题在考场上不一定暴露但如果在本地多跑几个测试用例就可能翻车。所以笔试通过只代表当时没踩坑不代表代码质量高多复盘才能真的成长。5.2 评估笔试结果与自己竞争力笔试结束后大概一周左右收到了面试通知。从持续时间来看第2批笔试到面试时间间隔并不固定有人早有人晚。那几天很多人会在群里问“有收到面试吗”本质是焦虑。这时要做的不是反复刷新邮箱而是准备面试内容。笔试只是一道门槛真正决定offer的是后续的技术面、项目和综合面。怎么评估自己是否通过笔试一个比较粗略的参考代码题至少AC一道另一道有部分用例通过选择题正确率在60%以上基本能进面试。如果代码题两道都没做出来但选择题全对可能也有机会但不稳。蚂蚁更看重工程能力和编码能力代码题权重还是比较高的。我在等待期间做的事把项目经验整理成讲稿把自己在实习中遇到的一个线上故障从背景、排查过程、根因到解决方案完整复盘了一遍还对JVM调优、分布式事务、MySQL优化几个话题做了专项准备。后来面试时发现工程研发岗面试官确实会追问这些内容而且问得很细。5.3 秋招笔试通用经验总结经历了几家公司的笔试后我发现大厂工程研发岗笔试的底层出题思路是一样的基础题考察你知识体系的完整性算法题考察你代码落地能力简答题考察你面对复杂系统时的思考框架。换汤不换药所以无论投哪家公司一套完整的基础知识体系是通用打底能力。我的做法是把各家的高频考点汇总到一个文档里按主题分类比如“JVM”“并发”“网络”“MySQL”“Redis”“操作系统”“算法模板”。每考完一场就往对应主题追加新的考点和错题。这样复习到后面每家的笔试内容都变成了自己知识库的素材越积累越有底气。而不是背市面上某一份“大厂面经”因为面经往往是碎片化的不够系统。另外合理利用周一早上刷邮箱的时间。很多公司的面试通知会在周五下午或者周末发出如果你一直没收到消息不要慌张。我当时收到蚂蚁面试通知是笔试后第8天第7天晚上刚好有同学收到我当晚失眠第二天一早才看到邮件。其实常规流程就是这样先发一批再补发一批晚几天不等于挂了。最后再说一个我的个人习惯每次笔试前的晚上我不会再刷难题而是把所有常考的基础知识点快速过一遍像TCP状态图、线程池参数、索引失效场景。这些短平快的东西能给你很强的安全感也能在开考后10分钟内帮你迅速进入状态。真正决定笔试上限的是长期积累但决定状态下限的是考前那几个小时。如果你正在准备下一场笔试真心建议把“环境调试”和“时间规划”这两件事提高到和刷题同等重要的位置。设备提前试流程提前走顺序提前定。很多时候一个良好的笔试节奏省下的时间比硬啃一道偏题要值钱得多。希望这篇记录能给你带来一点参考也祝大家在秋招这条路上都能拿到自己满意的结果。