
快手2019年春季校园招聘笔试“工程A卷”在网上流传已经很久了很多准备大厂校招的同学把它当成模拟题来刷。我见过不少人对这套卷子的态度很矛盾——一看题目感觉“好像都会”真动笔却发现哪哪都不扎实最后成绩出来和预期差一大截。作为一个把2019到2023年主流互联网公司工程类笔试题都翻过一遍的人我负责任地说这套工程A卷虽然年份早但它考察的底层能力和现在各家大厂的笔试题高度重合尤其是快手这类短视频公司对工程落地能力的考察在笔试阶段就非常具体。这篇文章不打算给你一份“标准答案汇编”而是从试卷结构、出题逻辑、典型题目拆解、以及我自己实际刷题和辅导同学过程中的血泪教训出发讲讲这套卷子到底在筛什么人你应该怎么用它来准备。1. 工程A卷到底在考什么一张试卷背后的三类人才筛选逻辑先说个可能被很多人忽略的事实快手2019年春招的工程A卷并不是一份全国统一难度的卷子它对应的是“工程类岗位”的基础笔试覆盖后端开发、客户端开发、数据工程等方向。和算法岗的笔试题不一样工程卷的重心不是把数学推导和状态压缩做到极致而是考察“你能不能在一个真实工程环境里把东西做出来、做对、做高效”。我当时拿到这套卷子第一反应是它不考偏题怪题但坑非常多。整体来看这套卷子大致可以分为三类通用编程能力题以数据结构与算法为主但难度控制在LeetCode Medium上限极少出现Hard级别的压轴题。计算机基础题操作系统、网络、数据库这些工程岗绕不开的底层知识往往以选择题和简答题的形式出现。工程实践题结合具体业务场景的代码设计或问题排查题这是快手的特色也是很多只在LeetCode上刷题的同学最不适应的地方。为什么这个分类很重要因为如果你把工程A卷当成纯算法卷来刷你的备考方向从第一步就偏了。快手这类公司招工程师要的不是一个只会写孤立函数的人而是一个能理解业务链路、能处理异常情况、能在系统压力下做取舍的人。笔试只是第一道闸门它筛掉的不是“算法不好的人”而是“不具备工程思维的人”。另外注意一个细节这套卷子叫“工程A卷”说明背后很可能还有B卷、C卷不同的卷子难度和侧重会有差异。A卷一般对应的是技术岗的基础批次和提前批、正式批的卷子不是一套。所以当你拿这份卷子练手时要清楚它代表的是“校招笔试中偏基础、偏常规”的一档用它来查漏补缺非常合适但用它来评估自己能不能进面试参考价值有限。2. 算法题的难度边界看着眼熟动笔就错工程A卷的算法题我印象最深的是那类“你需要二选一但两个选择都可能出错”的题目。这里很考验你对自己代码的理解深度光靠背模板根本过不去。2.1 经典题目背后的变体不从标准输入输出的套路举个例子有一道关于“循环数组中找到比当前元素大的下一个元素”的题LeetCode上有原题但工程A卷把它改成了“循环数组中下一个更大元素且要求如果有多个位置满足条件输出索引小的那个”。乍一看只是多了一个条件但你在单调栈里存索引还是存值遍历顺序是正着来还是反着来结果完全不同。我当时带过的一个学弟在LeetCode上把这道题刷了三遍闭着眼睛都能写出单调栈解法。结果笔试时遇到变体他直接用原模板把“索引小的优先”这个条件忘得一干二净白白丢掉了这题大半的分。这不是他一个人犯的错误很多刷题量不少的同学都栽在“变体题”上。所以用这套卷子练手时不要只盯着题目本身要盯着题目做了哪些条件变化。最有效的办法是把每道题在LeetCode上找到原题或相近题对比原题和快手变体之间多出来的限制条件想一想这个限制条件会如何改变算法的时间复杂度、空间复杂度、边界的处理方式自己重新写一遍而不是直接看题解。这样做一遍训练你看待题目的方式就不再是“这题我见过”而是“这题变化的点在哪里”。2.2 时间复杂度的隐形要求C版本的陷阱还有一个很容易被忽略的考点当笔试系统支持多种语言时同一道题你用Java、C、Python写运行效率是完全不同的。工程A卷里的算法题数据范围往往卡在“O(n^2)超时O(n log n)能过”的边缘。这样的设计意味着出题人并不希望你用Python靠内置函数作弊也不希望你用Java写一堆类结构而是考察你是否能写出“在工程中吃得开”的高效代码。比如在一道Top K问题里如果你用PriorityQueue无脑维护大小为k的最小堆在数据量10^6的情况下Java也是能过的但如果你用快速选择Quick Select写出平均O(n)的解那么你在笔试中节省的时间可以用来检查其他题目。这个时间管理能力刷题时很少有人刻意训练。我的建议是刷工程A卷的题时强迫自己只用一种语言并且每道题都计算自己的代码在最坏情况下的运行时间。不需要真的在OJ上测试心里估算大O数量级就行。坚持做20道题你对自己代码的性能敏感度会明显提升这个能力在笔试和面试里都很有价值。2.3 边界条件笔试里最常见的失分点工程A卷的算法题还有一个特点就是边界条件特别多。它不像LeetCode那样把输入范围说得清清楚楚而是模拟真实业务场景输入可能为空、可能包含重复值、可能数值很大。这时候你的代码是否具备“防御性编程”习惯就会在笔试题里直接体现出来。我总结过一套检查清单每次写完算法题都要对照一遍数组或字符串为空时我的代码会不会越界所有输入都一样时我的算法会不会退化到O(n^2)数值加法/乘法会不会溢出 int 范围如果有多个合法答案题目要求输出哪个是否存在两个指针初始位置就相同的情况这套清单听起来简单但真正能在笔试时逐条过一遍的人寥寥无几。大多数人都是“写完觉得没问题就交卷”然后挂在一个i length的边界上。用工程A卷练手时不要只追求通过示例用例每道题都要强行枚举几种极端输入跑一遍这一步能帮你建立非常扎实的边界意识。3. 计算机基础题工程A卷里那些最容易“凭感觉答错”的知识点工程A卷的选择题和简答题覆盖的知识面其实比很多同学想象得广。操作系统、计算机网络、数据库是三大块我分别说一下我从这套卷子里观察到的考察重心以及大家常踩的坑。3.1 操作系统不是考概念是考“调度和并发”先说操作系统。工程A卷里进程线程的区别、死锁的必要条件这些基础概念几乎必考但真正的分水岭在于并发相关的代码结果题。给你一段多线程并发执行、共享变量的代码问你最后输出的值可能是多少。这种题你能做对吗我见过太多同学把“volatile能保证原子性”这句话当成真理一看到共享变量就选“线程安全”。事实上volatile只保证可见性不保证原子性i这种复合操作照样不安全。工程A卷里就有一道类似的坑题多个线程对一个 int 变量做自增问最终结果的范围。答案是“不一定可能比预期小但不会超过预期最大值”原因就是多个线程同时读取到同一个旧值然后各自加1写回导致覆盖。这类题怎么准备最靠谱的方法不是死记硬背概念而是亲手跑一段Java多线程代码看结果。你自己写一个AtomicInteger对比int在多线程下的表现跑几次就明白了。工程A卷考的不是“你知不知道概念”而是“你有没有真正运行过程序”。这种风格其实很快手——重视实际现象而不是背书。3.2 计算机网络三次握手、HTTP状态码只是开胃菜计算机网络在工程A卷里基础题包括三次握手、四次挥手、TCP和UDP的区别、HTTP协议的状态码含义这些背熟了就还好。但这套卷子真正拉开差距的是以下几点TCP的拥塞控制慢启动、拥塞避免、快速重传、快速恢复这些机制不只要懂概念还要能算。给你一个拥塞窗口变化的场景让你求某个时刻的窗口大小。很多同学认为这道题“很偏”但在实际CDN、直播推流、视频上传场景里这就是工程师每天面对的问题。HTTP和HTTPS的区别不只是“HTTPS多了一层加密”而是要能说出SSL/TLS握手的过程、证书验证的原理、对称加密和非对称加密分别用在哪些环节。DNS解析过程从浏览器输入域名到建立连接中间经历哪些步骤哪些步骤有缓存缓存过期时间如何控制。快手作为大体量内容平台DNS和CDN的知识很多笔试考到一点不奇怪。一个实用的备考方法是拿浏览器开发者工具打开一个视频网站看Network面板里的请求列表。你会发现一个页面加载背后有几十个请求状态码、耗时、请求头、响应头都是实际的网络知识。把“看的视频播放卡顿”这个真实问题拆解成网络层面可能的原因你基本就掌握这套卷子对网络知识的要求了。3.3 数据库与SQL索引失效和高频查询优化是重点工程A卷对数据库的考察主要集中在三块SQL编写、索引原理、事务隔离级别。SQL编写题通常给定一个业务表结构让你写查询。看起来简单但会故意给你设置“坑”比如WHERE条件里对索引列使用了函数导致索引失效比如需要LEFT JOIN和GROUP BY组合使用但不是ON条件里的字段。想拿高分光会写“能跑出结果的SQL”不够还要能够解释为什么这样写性能差。索引原理题也是重头戏。B树为什么适合做索引聚簇索引和非聚簇索引的区别回表是什么覆盖索引是什么这些概念看似八股但工程A卷会用场景来考一张订单表有 userId 和 createTime 两个字段你会怎么建索引为什么(userId, createTime)联合索引比(createTime, userId)更适合这个场景这类题目没有唯一答案考察的是你设计索引时的思维过程。备考建议是不要光刷概念题找一张含百万行数据的表自己试试EXPLAIN各类查询的执行计划观察哪些 SQL 走了索引、哪些走了全表扫描然后把原因想明白。笔试时遇到数据库题你就能用“执行计划会怎么走”来预判答案而不是靠猜。4. 工程实践题的杀伤力没有“标准答案”的题目才是真正的分水岭工程A卷最能体现“工程”二字的是最后那类开放性设计题或问题排查题。这类题没有标准答案但特别能反映一个人的实战经验。很多同学在这类题上一筹莫展或者洋洋洒洒写了一大堆结果完全没踩到点上。4.1 从一道线上问题排查题说起工程A卷里有一道印象很深的题大意是一个在线服务最近经常出现接口超时从监控看CPU使用率不高内存使用率正常但请求RT明显上升让你分析可能的原因并给出排查思路。这题如果只回答“增加机器”或者“看日志”基本等于没答。合理的思路应该包括先确认“接口超时”是全部接口还是某个接口是全部机器还是部分机器如果CPU不高但RT高要考虑是不是出现了锁竞争、磁盘IO等待、网络带宽打满、下游依赖变慢等问题通过全链路追踪系统如链路追踪定位耗时到底发生在哪个环节查看GC日志判断是不是频繁Full GC导致的应用停顿检查线程池状态看队列是否堆积、线程是否阻塞。这道题想要考察的是你有没有真实排查过线上问题。哪怕你没有实际经验也至少要知道排查问题的顺序和常用工具。平时刷题、写业务代码的时候多留意线上告警、日志分析、性能分析的实践答这种题就不会虚。4.2 设计题短链服务或Feed流设计工程A卷里还常见一类系统设计题的简化版比如设计一个短链服务或者设计一个关注功能的数据存储方案。这类题不会让你画出完整的系统架构而是让你回答几个关键问题短链生成算法用什么哈希取模、发号器还是随机字符串如何保证不冲突短链需要支持过期吗过期逻辑放哪里如何统计访问量是异步写入还是同步更新关注关系用什么数据结构存储读多写多分别怎么做我见过很多同学的回答是“用Redis存key-value就行”这完全没抓住设计题考察的重点。设计题看重的是多方案对比和取舍比如发号器方案虽然有顺序ID泄露风险但性能高、简单哈希取模方案不需要发号服务但冲突处理和长度控制更麻烦随机字符串方案安全性好但需要查重。你要能说清楚不同方案的优缺点并且根据题目场景做出选择。备考这类题不需要去看大而全的系统设计资料先从每天在用的产品里挑一个简单功能反推设计。比如你在朋友圈发一条动态这条动态怎么存储、怎么推送给朋友、怎么控制可见范围把这套逻辑想明白再去看设计题就自然有思路了。4.3 代码阅读题给你一段别人写的代码让你找问题工程A卷还有一类独特的题型给一段实际业务代码可能是C或Java让你找出其中存在的问题比如内存泄漏、并发访问问题、资源未关闭、异常处理不当等。这和算法题完全不同考验的是你平时有没有写过、读过真实业务代码。这类题目的失分点在于很多同学只看逻辑是否正确忽略了代码的健壮性和资源管理。比如一个try-catch里打开了文件流但没有在finally中关闭这在笔试中就是一个考点。再比如对一个HashMap在多线程环境下的读写没有加锁这也是一个考点。准备方法很直接把自己工作或练习项目里的代码拿过来故意往里面加入各种“坏味道”然后过一段时间再回头看能不能发现。能发现别人代码问题的人必然自己踩过这些坑。如果实在没踩过就去翻一些开源项目的issue区看看真实世界的代码问题长什么样比看“代码规范书”有用得多。5. 如何用工程A卷反推备考重点一个我验证过四年的训练框架说了这么多题目分析最后落到实操层面作为2025年准备校招的你拿这份“过时”的试卷到底该怎么用我的建议不是刷一遍对答案就完事而是把它当成一个“诊断工具”。5.1 第一遍限时自测不要边做边查按正常笔试的时间要求我当时印象中是120分钟左右完整做一遍这套卷子。做题期间不要查资料、不要翻书、不要看手机。做完之后给自己打三个分算法题的通过率有几道题代码是真正可以直接运行的基础题的得分率选择题和简答题做对了多少工程实践题的内容完整度你对设计题和排查题的答案是否能让一个不懂代码的人看懂这一步的目的不是拿高分而是让自己认清“我以为我会了”和“我真的会了”之间有多大差距。5.2 第二遍逐题溯源建立“错题→知识点→真实场景”的映射把第一遍做错的题逐个整理到表格里表头可以这样设计题号错误原因涉及知识点真实业务场景复习动作算法题2单调栈变体处理错误单调栈、循环数组热门视频推荐流热门值环比上涨后的回看计算重写变体题2遍写边界用例操作系统题5volatile能否保证原子性判断错误Java内存模型、原子性多线程点赞数统计不准写多线程代码观察现象网络题8HTTS握手过程不清晰TLS握手、证书验证视频播放请求安全链路抓包看握手过程数据库题3联合索引最左前缀理解偏差联合索引、回表用户关注列表按时间倒序查询造数据跑EXPLAIN这个表格的核心价值在于把“一道题”和“一项能力”连接起来然后每一项能力又能对应到一个具体的复习动作。我在带人准备校招时要求至少完成30道这样的映射坚持下来知识体系会清晰很多。5.3 第三遍以题带面从单一题目延伸到整个知识网络每道错题不要只看题目本身要强迫自己问三个问题这道题的知识点和哪些其他知识点有关联这题目如果放到真实业务里可能会以什么样的形式出现假如我是面试官我会基于这个知识点继续追问什么问题比如上面那道“多线程自增不安全”的题延伸出去就是synchronized和Lock的区别、CAS的原理、ThreadLocal的使用场景、线程池的参数设计。这样一个知识点就能带出一个知识网络远比刷十道独立的题更高效。5.4 时间分配建议别让算法题吃光你的备考时间根据我从这套卷子里观察到的比例工程A卷中算法题的分值占比大约在40%到50%之间其余是基础题和工程实践题。但很多同学的备考时间分配是90%在刷算法10%在复习基础0%在练习设计题。这正是很多人笔试成绩不理想的原因——算法题按LeetCode标签刷了三百道但基础题靠蒙设计题靠编怎么可能过。我建议的时间分配是算法题保持手感每天1到2道以Medium为主穿插少量Hard基础题用两周时间集中过一遍操作系统、网络、数据库的核心考点重点不是背诵而是理解机制工程实践题每周至少花半天选一个身边的产品功能做简化设计或者找一个线上故障案例做排查演练。这样坚持一个月效果会非常明显。因为笔试筛选的从来不是“你刷过多少题”而是“你在有限时间内展现出的工程判断力”。6. 笔试作答技巧细节决定你能不能进面试最后一个部分聊点非常“土”但是非常实际的作答技巧。这些细节不会让你“多会一道题”但能让你少丢很多冤枉分甚至直接影响你能不能进入面试。6.1 审题是笔试里最重要的一步我见过太多同学试卷发下来就急着写代码结果写了半天发现没看到“要求用链表实现”“不能使用额外空间”“输入数据可能达到10^9”这些条件。工程A卷的题目描述往往不长但每句话都有信息量。我自己的习惯是拿到题目先圈出三个东西——输入范围、时间限制、特殊约束。这三个东西决定了你的算法选型。没有圈完这三个东西之前绝不动手写代码。6.2 不会的题也要写出思路不要空着很多笔试平台支持在代码框里写注释或者在简答题区域写文字说明。如果你遇到一道完全没思路的算法题至少写下你的思考过程暴力解法是什么复杂度是多少可以怎么优化哪一步卡住了只要写了阅卷人就能看到你的思路也许会给你过程分。但如果你直接空白那就真的零分。同样设计题和排查题即使你的答案不完整也要尽量按照“发现问题—分析原因—提出方案—验证方案”的结构去回答。这个结构本身就说明你有工程思维方式哪怕具体方案不够成熟也比写成流水账强得多。6.3 代码题尽量做到“能跑”而不是“优雅”笔试系统看你的答案通常不是人工逐行审阅而是自动跑测试用例。所以代码能编译、能通过示例用例、边界条件处理到位优先级远高于“用上了设计模式”“代码像源码一样优雅”。我见过有同学在笔试里试图写一个10层的抽象工厂模式最后连编译都没过。工程A卷的题目设置默认你写的是“可以运行的工程代码”不是“教学演示代码”。所以一个很实际的建议是优先保证你的解法在主流的本地编译器里跑通再考虑优化和重构。你在LeetCode上刷题时如果习惯只写核心函数笔试时也要记得补全main方法或者处理标准输入输出的逻辑。这个坑每年都有一大批人踩。6.4 善用本地环境不要裸奔上阵虽然很多笔试平台有在线编辑器但功能普遍比较简陋代码补全和调试能力都很弱。建议提前把本地开发环境配好笔试时用本地编辑器或IDE写代码再粘贴到笔试平台。别小看这一步一个熟悉的编辑器能帮你节省至少20%的时间减少“括号配错”“分号漏了”这类低级错误。当然前提是你所在的笔试环境允许复制粘贴有些严格的考试系统是拒绝的。最好提前查一下目标公司的笔试规则准备两套方案一套是纯在线编辑器也能流畅作答的方案另一套是本地IDE辅助的方案。这样无论平台怎么限制你都不会慌。这些作答技巧都不是从工程A卷本身推出来的而是我从多年实际笔试、面试和观察别人笔试的过程中总结出来的。技术能力决定了你的上限但这些细节决定了你能否稳定地发挥出上限。对一份真题来说题目本身的价值固然高但真正拉开人与人差距的往往是这些看不出“技术含量”的细节。如果你正在准备校招建议你把这套卷子做三遍第一遍感受难度第二遍查漏补缺第三遍限时模拟。做完三遍你对这份卷子、对自己的状态都会有完全不一样的理解。