十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

快手2019工程B笔试卷深度复盘:考点、算法与备考策略

快手2019工程B笔试卷深度复盘:考点、算法与备考策略 复盘快手2019年秋季校园招聘的工程B试卷我最大的一个感受是别把它当成一份早已过期的题库去背要把它当成一张技术地图去读。2019年恰好是短视频行业流量爆发的关键节点快手彼时的工程团队既要撑住亿级用户的内容分发又要应对直播、评论、私信等实时互动场景带来的高并发压力。在这套试卷里你能清楚看到一场校招笔试是如何把真实业务的技术挑战翻译成一道道可以量化考察的题目。如果你正在准备大厂工程岗校招或者想从这份试卷反推快手的工程技术栈与选人标准这篇文章可以帮你省下大量自己摸索的时间直接进入有方向的备考状态。1. 一份早已下架的笔试卷为什么值得反复复盘很多人对往年笔试题的态度是考过了就考过了题目都变了看它还有什么用。这个想法在准备校招的阶段很吃亏。真题会变但出题人的底层逻辑、公司的技术倾向、岗位对候选人的核心期待这些东西的迭代速度远比你想象中慢。一份2019年的试卷拿到今天来看依然能拆出大量仍然有效的考察信号。1.1 老试卷的分析价值出题逻辑比答案更持久一份笔试试卷本质上是一家公司对「合格工程师」定义的具象化。题目类型怎么分布、分值权重怎么倾斜、难度梯度怎么设计这些信息背后藏着招聘团队的判断。比如一份试卷里编程题占了大半说明这家公司非常看重动手编码的硬实力如果选择题里操作系统和网络占了很大比重说明基础知识的扎实程度是硬门槛如果出现了业务场景题说明候选人需要具备把技术落地到具体业务里的意识。这些判断不是靠背答案能获得的而是要靠拆解试卷结构。我在复盘快手这套工程B试卷时先做的是把「考点类型」列了一张表而不是急着去看某道题会不会做。因为一张表能告诉你出题人想考什么而单道题只能告诉你这道题本身。1.2 2019年快手的技术背景短视频爆发期的工程挑战要理解这份试卷得先理解2019年快手在做什么。那段时间短视频产品的用户量和内容量都在高速增长快手的核心业务是短视频发布与消费、直播、关注关系链。这些业务形态对工程团队提出了几个非常具体的要求高并发读写大量用户同时刷视频、点赞、评论后端接口的QPS压力非常大。海量存储视频文件本身的存储以及用户关系、评论、播放记录等结构化数据的存储。视频上传与分发的稳定性用户上传视频后要经过转码、存储、封面截取等多个环节才能被其他用户看到。低延迟的互动体验直播弹幕、评论、私信这类实时互动对链路延迟极其敏感。这些业务特征会直接渗透到笔试的选题偏好里。比如场景题很可能围绕「视频上传」「评论系统」「点赞计数」这类业务展开算法题则经常以海量数据为背景。看到试卷里出现这部分内容不要觉得是巧合那是业务真实需求在考试里的投射。1.3 拿到试卷后先做的三件事我复盘任何一份真题都按同样的顺序做三件事。第一看题型分布和题量估算时间分配。第二把题目按考点重新归类而不是按题号整理。同一类考点的题目放在一起才能看出这个考点被考察的密度。第三把每道题与岗位JD里的能力要求做映射。比如JD里写「熟悉Linux环境」试卷里很可能就有进程、线程、文件系统相关题目JD里写「有高并发经验优先」试卷里大概率会有缓存、队列、并发控制相关的内容。这三件事做完一份试卷在你眼里就不只是题目集合而是一张清晰的考点地图。2. 从「工程B试卷」这几个字反推快手出题人的岗位画像「工程B」这个说法很有意思。它不是一个官方释出的命名规则但我们可以从行业惯例和快手自身的招聘体系里去反推。搞清楚谁是这份试卷的受众比单纯知道题目答案重要得多。2.1 大厂笔试的试卷命名逻辑大厂校招笔试的试卷命名通常有几种逻辑。第一种是平行卷为了防作弊A卷和B卷题目相同但顺序不同或者题目做了等价替换这种情况下「工程B」和「工程A」并没有本质区别。第二种是方向卷A卷面向后端B卷面向客户端也可能是前端、测试开发等方向这种情况下「工程B」就直接对应某一类岗位。第三种是批次卷不同城市的笔试批次不同试卷编号也就不同。所以只看「工程B」三个字不能百分之百断定它一定对应哪个方向但「工程」两个字已经框定了范围这不是算法研究类试卷也不是产品、运营类试卷而是面向工程研发类岗位的。这份试卷考察的是候选人写代码、落地工程方案的能力。2.2 「工程B」的两种可能画像结合2019年快手的岗位设置和笔试组织方式我对「工程B」的定位有两种推测。第一种可能它面向后端或基础架构方向的候选人。快手后端以C为主核心链路包含推荐、存储、消息队列、视频处理等模块这类岗位的笔试会重点考察算法、操作系统、网络、数据库以及一定的系统设计基础。第二种可能它面向客户端方向。快手App的Android和iOS端在当时同样有大量岗位需求客户端工程笔试会更关注内存管理、线程模型、网络请求、UI渲染效率等问题。但无论哪种情况这套试卷的考察核心都离不开「高并发」「大流量」「稳定性」这几个关键词因为这是快手工程团队每天都要处理的真实命题。2.3 从岗位画像推导出的能力要求矩阵把岗位画像翻译成能力要求再看试卷题型如何承载这些能力会得到下面这张矩阵能力项试卷中的载体大致权重倾向编码能力编程题、代码填空题高计算机基础选择题操作系统/网络/数据库中高工程思维场景题、设计类简答题中逻辑与数学智力题、概率题中低这份矩阵并不精确到分值但它能帮你建立备考的优先级。如果你想投递的是快手工程类岗位编码能力是必须过关的底线计算机基础是区分度所在工程思维是拿到好印象的加分项。先明确这个结构再去做针对性准备效率会高很多。3. 算法题占半壁江山从「手写代码」看快手要的编码功底无论哪个大厂的工程卷算法题都是重头戏快手也不例外。笔试中的算法题并不追求偏题怪题而是倾向于在经典题型上增加一点业务色彩考察候选人是否真的理解了算法的本质而不是只会背模板。3.1 笔试算法题的高频考点分布复盘2019年前后的大厂工程试卷算法题的考点高度集中在这几类字符串处理、哈希表、排序与TopK、链表操作、二叉树遍历、DFS/BFS、动态规划、贪心、栈与队列。快手工程B试卷大概率也不会偏离这个范围。其中字符串和哈希表是「基本盘」几乎每套试卷都会出现排序与TopK是「必考题」因为它在海量数据场景下非常实用链表操作因为有指针细节是考察代码严谨度的好题目动态规划和DFS/BFS则承担了区分度的作用出现时通常是压轴题。3.2 真题风格的编码题字符串处理与哈希表举一个典型的快手风格题目形态假设它长这样给定一个字符串请你统计每个字符出现的次数并按照出现次数从高到低输出。这个问题看似简单但它能考察字符串遍历、哈希表的使用、排序或堆三个知识点非常适合笔试。当时如果在考场里用C可以这样写#include iostream #include string #include unordered_map #include vector #include algorithm int main() { std::string s; std::cin s; std::unordered_mapchar, int count; for (char c : s) { count[c]; } std::vectorstd::pairchar, int items(count.begin(), count.end()); std::sort(items.begin(), items.end(), [](const auto a, const auto b) { return a.second b.second; }); for (auto p : items) { std::cout p.first p.second std::endl; } return 0; }这道题的关键在于能不能想到用哈希表做字符计数能不能用自定义排序规则实现按频率排序以及能不能处理空字符串这种情况。很多候选人在测试样例全过的情况下因为没考虑输入为空而丢分这非常可惜。3.3 看似高频的TopK问题堆与快排的边界取舍TopK问题在海量数据背景下几乎必考比如「从10万个整数中找出最大的K个」。这个问题的经典解有两种小顶堆和快速选择。小顶堆的思路很直观维护一个大小为K的小顶堆遍历数据时如果当前元素比堆顶大就替换堆顶并调整堆。时间复杂度是O(n log K)空间复杂度O(K)在K远小于n时非常高效。快速选择的思路是用快排的partition思想将数组划分为两部分期望时间复杂度O(n)但最坏情况可能退化到O(n^2)而且会修改原数组。笔试里如何选择如果题目明确说数据量很大、无法一次性载入内存那就要用堆方案如果题目允许修改数组并且没有海量数据限制快速选择的性能在随机数据下更优。这里有一个容易被忽略的细节笔试环境里数据规模通常不会真的到「海量」所以写堆方案更稳不容易触发退化情况代码也更容易被面试官理解。3.4 编程题的「隐藏分」复杂度和边界处理编程题不是运行出结果就能拿到满分评卷系统通常还会看你的复杂度和边界处理能力。我总结的几个隐藏得分点是多写注释至少把核心步骤的意图写清楚这样即便代码有bug评卷人也能看出你的思路。函数命名要有意义避免vc1、temp这样的命名工程素养从命名就能看出来。主动处理边界情况空数组、单元素数组、全相同元素的数组、溢出风险这些都是常见的隐藏测试点。时间复杂度过大的解法只能拿到部分分比如能用双指针就不要用两层循环。这些细节不会直接写进分数规则里但长期参与校招笔试出题和阅卷的工程师会告诉你它们确实会影响最终评价。4. 计算机基础选择题最容易丢分也最容易短期提分计算机基础是工程卷选择题的主要内容也是很多人觉得「明明学过但就是选不对」的重灾区。这部分覆盖操作系统、网络、数据库特点是考点稳定、规律性强非常适合用短时间集中突破。4.1 操作系统考察点从进程线程到内存模型2019年前后的工程笔试里操作系统考点集中在进程与线程、线程同步、死锁、虚拟内存、页面置换算法这几块。进程与线程的分辨是一个经典选择题考点。进程是资源分配的基本单位线程是CPU调度的基本单位同一个进程内的多个线程共享地址空间但各有独立的栈和寄存器上下文。死锁的四个必要条件互斥、持有并等待、不可剥夺、循环等待几乎是必背内容题目常问「破坏哪个条件可以避免死锁」。还有一类很经典的「分析题」会给一段多线程代码问它可能的输出。比如#include iostream #include thread #include mutex std::mutex mtx; int counter 0; void inc() { for (int i 0; i 1000; i) { std::lock_guardstd::mutex lock(mtx); counter; } } int main() { std::thread t1(inc); std::thread t2(inc); t1.join(); t2.join(); std::cout counter std::endl; return 0; }这道题考察的是加了锁之后counter应该准确等于2000如果去掉锁结果就是不确定的。别看它简单很多人会忽略锁的作用范围甚至把「加了锁就一定安全」当成万能结论忘了锁本身也有性能开销和死锁风险。4.2 网络基础TCP、HTTP与短视频业务的映射网络部分的考点集中在TCP三次握手与四次挥手、TCP vs UDP、HTTP状态码、HTTP vs HTTPS、DNS解析过程。TCP三次握手是选择题最爱考的点考点往往不是握手过程本身而是握手的目的确认双方的接收能力和发送能力都正常。四次挥手里TIME_WAIT状态的意义也是高频问题它保证最后一个ACK能到达对端同时让旧连接的报文在网络中自然消失。结合快手业务去理解网络协议会记得更牢。短视频播放用的主要是HTTP/HTTPS拉流这要求HTTP连接能够支持大体积文件的高效传输直播场景则要考虑低延迟TCP在某些弱网环境下有队头阻塞问题所以很多直播方案会基于UDP做自定义可靠传输。这些业务背景不会直接考但理解了之后看到「直播延迟优化用什么协议」这类题目时就不会只凭直觉猜了。4.3 数据库与缓存MySQL索引和Redis在快手中的角色数据库考点集中在MySQL索引结构B树、聚簇索引与非聚簇索引、事务ACID特性、乐观锁与悲观锁。Redis考点集中在五种基本数据结构、缓存穿透、缓存击穿、缓存雪崩。B树为什么适合做索引因为它的数据都存储在叶子节点且用链表串联范围查询非常高效非叶子节点只存索引键相同页大小下能容纳更多键树高更低磁盘IO次数更少。这是一个常考的核心原理最好能用自己的话讲清楚。Redis在快手业务里的角色是绕不开的。点赞数、评论数、关注关系这类高读写频率的数据如果每次都查MySQL数据库压力会非常大所以通常会先把热点数据放到Redis里。由此衍生出的经典问题是缓存穿透例如大量请求查询一个不存在的key会直接打到数据库上。常见的解法包括缓存空值、布隆过滤器过滤不存在的key。这些知识看起来是「面试八股」但笔试选择题真的会考而且考得很细。4.4 用一套「错题驱动」的方法快速过基础计算机基础的知识点零散直接抱一本大部头啃很容易前学后忘。我的做法是「错题驱动」先拿一套真题做一遍把错题涉及的考点全部标出来然后针对这些考点去翻书、查资料每个错题至少扩展出三个相关知识点。举个例子错了一道关于页面置换算法的题那就把OPT、FIFO、LRU、Clock四种算法全部过一遍顺便把LRU在Redis里的近似实现也了解一下。这样一道错题就能带出一大片知识网络复习效率远高于漫无目的地刷教材。5. 工程场景题笔试里最像「真实工作」的那部分工程卷里偶尔会出现一些开放性的场景题题目不一定要求写完整代码而是让你描述设计思路。这类题目在2019年的校招笔试里已经出现得越来越频繁因为它比选择题更能反映一个候选人的工程直觉。快手这类短视频公司尤其喜欢出这样的题因为业务场景太丰富了随手一抓就是一道好题。5.1 场景题不是系统设计面试考的是问题拆解能力很多人一看到场景题就紧张以为要像系统设计面试那样画出完整架构图。但笔试题受限于时间和篇幅通常更关注两件事第一你能否把一个模糊的问题拆解成清晰的关键环节第二你能否针对每个环节给出合理的方案哪怕只是文字描述。比如一个典型的快手风格场景题「用户上传视频后如何让其他用户尽快看到这个视频」这个问题的起点不是技术选型而是拆解链路。视频上传后要经过哪些环节上传接口接收文件、服务端校验、转码、存储、封面截取、更新用户主页的feed列表、通知关注者。把链路画出来你就已经把问题回答了三分之一。5.2 一个贴近快手的场景视频上传链路拿视频上传这个场景细说。客户端上传视频首先要经过鉴权和配额校验避免匿名用户或超出存储配额的用户一直上传。然后是文件传输大视频文件直接用HTTP上传体验不好而且容易中断所以常见的方案是分片上传客户端把文件切成若干片服务端接收完所有分片后合并断点续传也是基于分片实现的。服务端收到完整文件后会触发异步处理流程。视频转码是一个典型的耗时操作需要把原始视频转成多种清晰度方便不同网络环境下的用户播放。转码完成后提取封面图生成播放地址然后更新数据库记录。这时候视频才会出现在用户的feed里才可能被推荐系统抓取到。这个过程里可以展开讨论的点非常多为什么用异步而不是同步因为转码可能需要几十秒如果让用户上传请求一直挂着等转码完成体验极差且连接超时。异步用的是什么消息队列比如Kafka或RocketMQ。为什么用消息队列因为可以在流量高峰时削峰填谷让下游的转码服务按照自己的处理速度消费任务而不是被突发流量打崩。5.3 场景题答题模板四步走如果笔试里遇到没见过的场景题我建议按照四步来组织答案既不会跑偏也能保证覆盖面。第一步需求澄清。题目里如果信息不足先说明你假设的约束条件比如用户规模、视频平均大小、网络环境等。第二步规模估算。简单算一下QPS、存储量、带宽需求这能让你的方案有据可依。第三步方案设计。按照「客户端到服务端→处理链路→存储与分发」的顺序描述你的架构选型。第四步关键细节与容错。点出可能出问题的环节以及对应的处理手段比如分片上传的失败重试、转码服务挂了之后如何保证不丢任务、缓存失效时如何降级。按这个模板写出来的答案哪怕技术选型不是最优也能让评卷人看到你具备基本的工程思维框架。5.4 场景题里的「分寸感」什么该写什么不该写场景题最容易犯的错误是堆砌名词。有些人喜欢把微服务、熔断、限流、容器编排、Service Mesh这些词全部写上去显得自己懂得很多但实际对问题没有任何助益。评委看这种答案感受不是「这个候选人很厉害」而是「他不知道自己在说什么」。写场景题的正确分寸是每个方案都要能说清楚「为什么」。你说要引入消息队列就要解释清楚是为了解耦还是削峰你说要加缓存就要说明缓存的是什么样的数据、什么场景下能命中、缓存失效了怎么兜底。只列名词不解释动机等于没有回答。6. 备考这一程我踩过的坑和摸索出的有效打法复盘完试卷最后聊聊备考这件事。笔试准备不是刷题越多越好而是方法要对、节奏要对。我经历过从盲目刷题到形成系统打法的过程也踩过不少坑下面这些经验是想给正在准备工程岗校招的读者一些参考。6.1 时间规划按阶段推进而不是天天都做同一件事一份合理的备考计划至少要有三段。第一段是「基础梳理期」用两周左右把数据结构、操作系统、网络、数据库的核心概念过一遍不要追求深但求覆盖面完整。第二段是「专项刷题期」用四周到六周按算法专题刷题比如这周只做字符串和哈希表下周只做动态规划把每一类题型的解法吃透。第三段是「模拟冲刺期」考前两周完全按照笔试的题量和时间限时做题训练自己在压力下的时间分配能力。最忌讳的是全程都在网上随便找题刷今天刷一道链表明天做一道贪心没有体系最后看起来做了很多题实际掌握得很浅。6.2 刷题的正确姿势会讲清楚才是真会我自己的一个判断标准是一道题做完如果你能不看任何资料把这道题的解题思路、时间复杂度和为什么用这个解法讲给一个朋友听对方听完表示懂了这道题才算真正掌握。这个标准听起来简单执行起来非常难。很多题当时看着答案觉得「懂了」过两天再遇到相同类型的题还是写不出来原因就是没有达到「能讲清楚」这个深度。给自己录语音、写题解博客、或者找同学互相讲题都是很有效的验证方式。做题只是输入讲题才是输出输出才是检验学习的标准。6.3 模拟笔试必须提前适应的事笔试和平时刷题是两种完全不同的状态。平时刷题可以随时看题解、可以停下去查资料、可以写一会儿干点别的事再回来但笔试全都不能。我在几次真实笔试中吃亏之后才意识到限时模拟的重要性。模拟时要注意环境尽量还原真实笔试打开一个本地编辑器禁掉所有即时通讯工具给自己定一个倒计时时间一到立刻停笔。不需要用非常复杂的平台牛客网或者赛码网都有历年真题模拟功能按照真实流程走一遍就够了。重点不是做完多少道题而是体验「卡住了一道题该怎么办」以及「还剩十分钟时如何处理未完成的代码」。6.4 考场上最容易翻车的三个瞬间翻车点一是在第一道题上卡太久。笔试的题目难度通常不是按顺序递增的有时第一题反而很难你越想越急等终于跳过去的时候后面简单的题已经没有时间做了。正确的做法是遇到卡壳超过十分钟的题先在草稿纸上记下思路果断跳到下一题做完其他题再回来补。翻车点二是编程题测了样例就以为稳了。样例只能证明你的代码在样例输入下运行正确不能证明你的逻辑没有边界漏洞。提交之前一定要检查空输入、单元素输入、极大极小值等边界情况。翻车点三是选择题凭印象做。有些选项乍一看都对但细节上有陷阱比如「TCP可以保证传输可靠」和「TCP可以保证传输顺序」是两个不同的判断「线程是资源分配的基本单位」和「进程是资源分配的基本单位」也是一个经典的混淆点。选择题做到最后预留几分钟逐题回看不要带着「应该对的」这种模糊感觉交卷。后来我又经历过好几场笔试但每次收拾心情重新备考时还是会先翻一遍这份快手2019年秋季校园招聘的工程B试卷。不是因为它能押中下一年的题目而是因为每一次复盘都会提醒我一件事笔试真正考的从来不是你会不会做某道题而是你在有限时间内能否稳定、清晰、有重点地输出自己已有的知识。想明白这一点之后备考的重点就从「追求见过的题更多」变成了「把见过的知识真正消化」焦虑感也就跟着少了大半。
返回列表