2024年秋招,我投了蚂蚁集团的工程数据岗。本来以为和大多数互联网公司一样,考几道算法题意思一下就行,结果笔试做完我才发现,这个岗位的考察方向比我想象中要“数据”得多,算法题只是开胃菜,后面跟着SQL、大数据组件原理、甚至还有场景设计题,整体强度和业务贴合度都很高。这篇文章我把笔试当天的题型分布、考点逻辑、以及我复习时踩过的坑整理了一下,给后面想冲数据工程方向的同学做个参考。
这篇内容适合三类人看:一是正在准备大厂数据岗秋招的应届生,二是转行做数据开发想补基础的同学,三是对蚂蚁技术栈感兴趣、想了解工程数据岗到底考什么的从业者。我会先复盘笔试的整体流程和题型结构,再把核心考点逐个拆开讲,最后给出备考时间线和避坑建议。全程干货,没有废话。
1. 笔试整体流程与形式复盘
1.1 投递时间线与笔试邀约
蚂蚁的秋招启动时间一般在8月上旬,我是在官网投递的工程数据岗,岗位归属偏向数据平台建设、数据链路开发、数据资产治理这类方向。投递之后大概一周内收到了在线测评链接,测评通过后隔了几天才收到笔试通知,整体节奏不算紧,但也别指望有太长的准备缓冲期。
笔试通知一般会写明时间窗口和考试时长。我当时那场是晚上7点到9点,共120分钟,需要提前15分钟进入系统调试环境。这里提醒一下,笔试系统对浏览器版本有要求,最好提前用Chrome或者Edge打开官方模拟环境试一下摄像头和麦克风,我身边真有同学因为摄像头权限没开,进考场折腾了五分钟。
1.2 笔试环境与题型结构
蚂蚁的笔试系统用的是第三方在线评测平台,支持多种题型混排。工程数据岗这套卷子的结构大致是这样的:
| 题型 | 题量 | 分值占比 | 说明 |
|---|---|---|---|
| 单选题 | 15题 | 约30% | 覆盖数据结构、Linux、网络、数据库基础 |
| 多选题 | 5题 | 约10% | 大数据组件原理、分布式系统特性 |
| 编程题 | 2题 | 约30% | 核心算法+大数据场景模拟 |
| SQL题 | 2题 | 约20% | 数据查询与统计,贴近数仓业务 |
| 简答/设计题 | 1题 | 约10% | 数据链路设计或数据倾斜排查思路 |
单选题、多选题都是客观题,做起来快,但坑也不少,后面我会专门说。编程题需要在线编译提交,支持Java、C++、Python、Go这些主流语言。SQL题是在单独的编辑器里写的,不用提交运行,但必须写出完整可执行的SQL逻辑。
1.3 时间分配策略
120分钟做25道题,看起来时间够用,实际上很容易翻车。我当时的分配方案是:客观题控制在40分钟内,编程题每道25分钟,SQL题每道15分钟,剩下一点时间留给简答题和整体检查。
这里提醒一个关键点,多人多选和单选一旦提交就不能返回修改。我当时先做编程题再做客观题,结果多选题有几道拿不准,最后只能硬着头皮盲猜,心理压力会比较大。建议按顺序做,遇到卡壳的题先标记跳过,千万别在一道题上死磕,尤其是单选题,不值得。
2. 工程数据岗笔试核心考点拆解
2.1 数据结构和算法题:不只是LeetCode
工程数据岗笔试里的算法题和纯后端岗不太一样。纯后端可能喜欢考链表、二叉树、动态规划,数据岗则更关注排序、TopK、海量数据去重、滑动窗口这类和数据处理强相关的内容。我当时遇到的两道编程题,一道是TopK变体,一道是日志时间戳聚合统计,都是能直接联想到大数据处理场景的题目。
准备阶段我建议按这个优先级刷题:排序与堆、哈希表、前缀和、滑动窗口、二分查找、链表基础。LeetCode刷Hot 100里这些标签下的题就够了,不需要啃难题。但有一点必须注意,笔试环境不支持本地IDE调试,代码得在网页里直接写完提交,所以平时就要养成手写代码的习惯,别依赖自动补全。
2.2 SQL与数据仓库:必拿分项
SQL题在工程数据岗笔试里属于送分题,但这种“送分”是相对的——如果你不懂数仓的分层模型和常用函数,很容易写出逻辑正确但效率很差的查询。我印象最深的一道题是“统计每个用户在近30天的连续活跃天数”,这题本质是连续性问题,需要用到窗口函数LAG或者ROW_NUMBER配合日期差值,而不是简单的GROUP BY。
复习SQL时,这几个知识点务必吃透:窗口函数(ROW_NUMBER、RANK、DENSE_RANK、LAG、LEAD、SUM OVER)、日期函数(DATE_FORMAT、DATEDIFF、DATE_SUB)、多表关联时NULL的处理、以及去重和聚合的组合使用。蚂蚁的业务场景里,用户行为分析、交易流水统计都是高频场景,所以SQL题基本不会离开这些背景。
2.3 大数据组件原理:Hadoop/Spark/Flink高频考点
客观题里大数据组件的比例很高,这里可没有“背八股”这么简单,出题人会换着花样考察原理理解。比如MapReduce的Shuffle阶段发生了什么、Spark的宽窄依赖怎么区分、Flink的Checkpoint机制如何保证Exactly-Once,这些都必须能用自己的话讲清楚,不能只记结论。
我整理了一个高频考点清单:
- HDFS读写流程和副本放置策略
- MapReduce Shuffle的排序、分区、合并过程
- Spark RDD的血缘关系和容错机制
- Spark任务提交流程中Driver、Executor的职责划分
- Flink时间语义(Event Time / Processing Time)与Watermark
- Kafka的消费者组和分区分配策略
这些考点内容多、体系大,建议不要靠刷题背,而是找一段完整的原理教程系统地过一遍,做到“知道为什么这么设计”而不是“知道答案是什么”。
2.4 数据工程场景题:业务理解力是分水岭
工程数据岗的简答题一般是场景题,比如“某业务线的数据任务在凌晨出现延迟,你怎么排查”“你如何设计一个实时数仓链路”。这种题没有唯一答案,考察的是你有没有真正做过数据工程,或者至少有没有完整的数据处理思维。
我当时遇到的是一道数据倾斜排查题,题目给了一张表结构和一个MapReduce作业的表现,让我分析可能的原因并提出优化方案。这类题的关键是分维度回答问题:数据分布层面、SQL写法层面、资源参数层面、业务逻辑层面,能想到的维度越多越有条理,得分越高。
3. 高频真题回忆与解题思路
3.1 算法题:求TopK的变体
第一道编程题大概是这样的:给定一个整数数组和一个整数K,要求返回出现频率最高的K个数字,并按频率从高到低排序,频率相同的按数字大小降序排列。这题乍一看就是LeetCode 347的变体,但加了排序规则之后,直接用优先队列就能解决,注意比较器的写法即可。
我给的解法是先用HashMap统计每个数字出现的次数,再用大小为K的小顶堆维护高频元素,最后依次弹出堆顶并放入结果数组。这里有一个细节值得注意,比较器里要先按频率降序,再按数字降序,Java里可以用(a, b) -> freqA != freqB ? freqB - freqA : b - a,Python里可以用sorted(d.items(), key=lambda x: (-x[1], -x[0])),很直观。
笔试时这种题不会考动态规划那种绕弯思路,重点考察的是你能否在10到15分钟内写出正确且无Bug的代码。平时练习时最好计时,因为考场上时间压力下,思路卡壳很致命。
3.2 SQL题:连续登录与用户留存
第二道SQL题是典型的用户活跃分析:有一张用户登录日志表login_log,包含字段user_id、login_date,要求统计2024年9月每个用户的最长连续登录天数。
这类题的标准解法是用窗口函数。先对每个用户按login_date去重,然后用ROW_NUMBER()按日期排序生成序号,接下来用login_date减去序号对应的天数得到一个“分组标记”,相同标记的日期属于同一个连续区间,最后再按用户和分组标记聚合求天数最大值。
WITH t1 AS ( SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn FROM login_log WHERE login_date BETWEEN '2024-09-01' AND '2024-09-30' GROUP BY user_id, login_date ), t2 AS ( SELECT user_id, login_date, DATE_SUB(login_date, INTERVAL rn DAY) AS grp FROM t1 ) SELECT user_id, MAX(day_cnt) AS max_consecutive_days FROM ( SELECT user_id, grp, COUNT(*) AS day_cnt FROM t2 GROUP BY user_id, grp ) t3 GROUP BY user_id;这个解法平时用得非常多,建议彻底理解而不是死记硬背。面试时也经常会被问到类似的“用户连续活跃”“连续签到”问题,写熟这道题能省下很多时间。
3.3 场景题:数据倾斜排查思路
简答题给了一个场景:一张订单表和一个商品维度表做关联,按商品类目统计销售额,运行到Reduce阶段时大部分Task很快结束,但有几个Task卡了很久,明显就是数据倾斜。
这种题,首先要明确倾斜的原因是什么。常见的几个原因:关联键为空的记录被分到同一个Reduce、某个类目订单量过大、小表与大表关联时光放大表。然后针对原因给出解法:过滤空值并单独处理、给热点Key加随机前缀打散、改成Broadcast Join或者Map Join。
答题时还要带上排查方法,比如通过Spark UI查看Stage的Task耗时分布,通过日志找到慢Task处理的数据量,通过SQL执行计划分析是否出现数据膨胀。这样的答案才能体现出你真的在项目里处理过数据倾斜,而不是只会背结论。
3.4 客观题高频坑点:分布式一致性基础
客观题里有一类题考察分布式一致性,我印象很深的是关于“CAP理论中分区容错性”的题目。很多人会把CAP理解成“三选二”,但更准确的说法是:在网络分区发生时,必须在一致性和可用性之间做取舍,而在没有分区时,两者可以同时满足。
这类基础概念考得很细,复习时建议把CAP、BASE、两阶段提交、三阶段提交、Paxos、Raft这些术语的原理和应用场景整理成自己的笔记,不要只看标题。笔试题目有时候会故意把概念交叉出题,比如“Raft中Leader选举需要几个阶段”“两阶段提交的阻塞问题在哪”,这些细节必须掌握牢靠。
4. 备考资料与系统复习路线
4.1 复习优先级建议
工程数据岗笔试准备不建议平均用力,我按投入产出比排个序:SQL和编程题优先练,这是硬通货;大数据组件原理排第二,客观题占比高且容易突击;数据结构和算法基础排第三,但刷题量要够;最后是场景设计题,靠平时项目积累和复盘。
如果时间紧张,比如笔试通知只有三天,那至少要把SQL窗口函数练熟、把TopK和排序相关算法过一遍、把Spark和Flink的原理框架过一遍,再背几个数据倾斜的解决模板。这样虽然进不了高分档,但过线应该问题不大。
4.2 推荐资料和练习方法
- SQL练习:LeetCode数据库题库50题,覆盖常用的窗口函数、聚合、连接、子查询,足够应对笔试。
- 算法练习:LeetCode Hot 100,重点做数组、哈希表、堆、滑动窗口这些标签下的题。
- 大数据原理:找一本体系完整的入门书或一套视频课系统看一遍,重点理解MapReduce、Spark、Flink的架构设计。
- 场景设计:去搜索“数据倾斜”“实时数仓架构”“离线链路优化”这类关键词,找到3到5个真实案例,自己尝试写复盘文章。
有一个特别有效的练习方式:拿到一个场景题之后,不要只看答案,而是先自言自语把思路讲一遍。能流畅讲出“现象、原因、排查步骤、解决方案、优化效果”,这类题基本就过关了。
4.3 简历匹配度的隐藏加分项
笔试虽然看分数,但简历里出现的数据项目也会影响面试官后续聊天的偏好。如果你的简历写过“基于Flink的实时ETL链路”或者“Spark SQL性能优化”,笔试里的场景题大概率就能踩中你熟悉的内容。
我当时在简历里写了一个“数据质量监控平台”的项目,正好笔试简答题涉及到数据任务延迟排查,我就把项目里用到的依赖检查、基线预警、任务重跑机制都写进了答案。虽然不知道阅卷标准,但至少能感觉到答题时有真实经验支撑,思路确实顺畅很多。
5. 常见问题与避坑经验
5.1 笔试系统操作坑
很多人第一次用在线笔试系统,容易在代码提交上出问题。编程题要注意选择正确的语言版本,Java和Python的缩进风格不同,不要复制代码时把格式搞乱了。SQL题没有在线运行功能,写完后一定要自己检查关键函数名和括号是否匹配,少一个括号就是整句错误。
还有,正式开考前一定要测试摄像头,不是所有浏览器默认允许摄像头访问,有些系统要求人脸识别,不开摄像头直接视为作弊。这个看起来像废话,但每年都有人在这里翻车。
5.2 时间管理坑
客观题、编程题、SQL题混在一套卷子里,很容易陷入“编程题写不出来就死磕”的状态。我给自己定的规则是,一道编程题超过25分钟还没AC,就先写个暴力解提交保底,再去做后面的题。分数能拿一点是一点,空题才是最大的浪费。
另外,客观题里单选题拿不准的,不要超过两分钟,先蒙一个标记,后面检查时再回头细想。因为客观题答案固定,纠结太久没意义,不如把时间留给分值更高的编程和SQL题。
5.3 思路表达坑
简答题不要只写结论,一定要把分析过程写出来。比如遇到数据倾斜,不要只说“加随机前缀”,要把“为什么加随机前缀能打散Key”“打散之后如何二次聚合”这层逻辑写清楚。阅卷人看的是你有没有完整的知识体系,而不是会不会用术语。
我当时答题时采用了“总—分—总”的结构:先一句总结可能原因,再分点展开,最后给出推荐方案和预期效果。这种结构能让答案看起来更有条理,也方便检查有没有漏掉维度。
5.4 后续流程衔接:笔试复盘很重要
笔试结束不等于完事,如果笔试表现不错,几天内会收到面试邀约。面试里大概率会问到笔试的某些题,尤其是那道简答题,面试官可能让你现场再讲一遍思路。所以笔试结束后趁热打铁,把每道题的解题思路整理成自己的话,尤其是错题和模糊题,这是非常关键的一步。
我笔试完当天就整理了完整的复盘文档,包括每道题的考点、我的答案、正确思路、以及相关知识点延伸。后来面试时面试官果然追问了一道SQL题的优化方案,因为复盘过,我答得很顺,这也算是笔试给面试的额外加成了。
5.5 心态调整
最后说点心态层面的。工程数据岗笔试的题量不小,遇到一两道完全没思路的题很正常,千万别慌。我当时有一道多选题完全没见过,直接按第一感觉蒙了答案,然后果断跳过去做后面的题。回头看,如果在那道题上浪费十分钟,编程题可能就来不及写完了。
数据工程岗位的核心能力是“用工程手段解决数据问题”,笔试考察的其实不只是知识点,更是你在有限时间内拆解问题、分配精力、做出取舍的能力。从这个角度看,笔试本身也是一道开放题。
我个人在准备这套笔试题时,最大的体会是:工程数据岗的笔试越来越务实了,它不考你背诵了多少个API,而是考你能不能理解数据链路的每个环节、能不能快速定位问题、能不能用代码和数据回答业务问题。如果你平时真的在项目里写过SQL、调过Spark任务、排查过数据问题,这套笔试的难度是可控的。反过来说,如果只是想靠刷题突击,可能客观题能过,但场景题很容易露馅。
最后再分享一个小技巧:笔试前一周,每天花15分钟,把思维导图上的核心考点快速过一遍,然后合上电脑,尝试凭记忆画出某个核心组件的工作流程。别小看这个动作,它能让你在考场上一眼识别出出题人想考你什么,而不是被题目表面的技术名词带偏。