ARTICLE DETAIL

资讯详情

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

大厂后台开发面经:字节跳动与腾讯面试流程、高频题与踩坑复盘

大厂后台开发面经:字节跳动与腾讯面试流程、高频题与踩坑复盘 这是一段2019年5月的面试经历当时我在字节跳动和腾讯的后台开发岗位面试中走了一整圈现在把当时的题目、思路和踩过的坑整理出来希望对正在准备大厂后台岗位的朋友有些参考价值。文中所有内容基于我个人当时的真实面试经历题目和流程可能与现在的招聘节奏有所不同但考察的内核基本没有太大变化。这篇面经适合正在准备大厂后台开发岗位的候选人阅读无论是校招还是工作经验在3年以内的社招都能从中找到一些值得借鉴的思路和方法。我尽量把每一个环节的具体做法和背后的思考逻辑写清楚而不是简单罗列题目。1. 背景与准备工作我为什么选在5月投这两家2019年5月是我从上一家公司离职后的第二个月手头已经拿了一两个中小厂的offer但我还是想冲一下大厂的平台和业务体量。当时投字节跳动和腾讯主要是因为这两个团队都在北京业务方向也比较匹配——我之前做的是高并发消息处理相关的服务端开发这两家都有大量相关岗位。1.1 简历上我重点突出的内容投递简历之前我把过去两年做过的项目重新梳理了一遍最终只保留了三个重点项目不是因为我只做过三个项目而是只有这三个能撑得住面试官的深挖。第一个是消息推送系统的重构把原先的单机推送改成了基于消息队列的异步架构第二个是用户增长相关的数据采集服务峰值QPS大约在8000左右第三个是一个内部工单系统的全栈开发这个偏向业务完整性。事后复盘这三个项目的选择其实很有讲究。我的经验是简历上的项目要么能体现并发和性能优化能力要么能体现完整的业务闭环能力最忌讳的是简历写了四五个项目但没有一个能扛住三轮深度提问。面经里很多人在简历上写“负责xx系统开发”一问细节就卡住这就是典型的简历与能力不匹配。1.2 刷题和基础知识的准备节奏5月面试前我其实准备了将近两个月。算法方面我把LeetCode按照数据结构分类刷了一遍重点放在数组、链表、二叉树、动态规划和栈队列这几个方向每天保证三道题的量周末翻倍。系统设计方面我重点看了缓存、消息队列、分布式锁、短链服务、秒杀系统这几类常见题目。这里想特别说一句网上很多人问“刷题要刷多少道才够”我的经验是数量不是第一位的能不能用白板讲清楚思路才是关键。我面试前一周专门做了一件事——对着镜子模拟讲题一道题给自己5分钟思考然后按照“暴力解法到最优解”的顺序口头表达一遍这个练习对我帮助非常大。2. 字节跳动面试全流程三轮技术面加一轮HR面字节跳动的面试流程在2019年就已经比较成熟了效率很高从一面到HR面一共用了不到一周时间。整体节奏很快面试官普遍年轻问题密度大而且每一轮都有算法题算法题占了相当的比重。2.1 一面算法与数据结构为主一面面试官是技术团队里的骨干开发开场简单自我介绍后直接出了一道算法题要求在45分钟内完成。题目是给定一个无序数组找出其中最长连续序列的长度要求时间复杂度O(n)。这道题看起来简单但很容易掉进排序的坑里。我当时的思路是利用哈希集合去重然后遍历数组只对连续序列的起点即当前值减1不在集合中的元素进行向后扩展统计。这样每个元素最多被访问两次整体时间复杂度就是O(n)。写代码过程中面试官追问了三个问题为什么用HashSet而不是数组标记、空间复杂度是多少、如果数组中有重复元素会有什么影响。前两个我答得很顺第三个因为紧张差点漏掉了去重环节好在最后代码里写了去重逻辑面试官没有继续追问。一面后半段考察了计算机网络和操作系统的基础。网络方面问了TCP三次握手和四次挥手的过程以及为什么挥手需要四次操作系统方面问了进程和线程的区别以及协程为什么比线程更轻量。这些问题算是后台开发的经典问题我准备得比较充分回答得比较流畅。一面结束后面试官让我等通知大约两小时后收到二面邀请。2.2 二面项目深挖与设计题二面面试官是团队的技术Leader这一轮明显感觉风格不同没有直接出算法题而是先花30分钟深挖项目。他针对我简历里的消息推送系统重构项目问得非常细包括原来的系统瓶颈在哪里、为什么选择RocketMQ而不是Kafka、消息消费失败后如何保证不丢、如何保证消息顺序性、如果消费者挂了消息积压如何处理。这些问题每一个都紧接着追问基本没有思考时间。我印象最深的是关于消息顺序性的追问我当时在项目里用了一个订单ID取模的路由策略保证同一个订单的消息落在同一个队列里从而保证顺序。面试官接着问如果某个消费者处理速度慢导致队列积压怎么办这个问题我当时的回答是增加分区并重新设计路由规则同时引入降级机制把非关键消息优先丢弃或延迟处理。项目深挖之后面试官出了一道系统设计题设计一个短链服务要求支持高并发访问和过期清理。我按照标准思路拆解先讲核心流程短链生成、存储、跳转、过期处理。生成方案我选择了发号器加Base62编码的方式存储用了Redis缓存加MySQL持久化跳转逻辑直接返回302重定向。面试官在设计中穿插了很多追问比如短链命中率和缓存穿透怎么办、单个发号器是否会成为瓶颈、如何统计短链访问量。这些追问考验的不是背答案的能力而是是否真正理解分布式系统里的常见问题。好在我平时做项目时确实踩过缓存穿透的坑回答起来有实际经验支撑。这一轮面完大概过了两天收到HR约终面的通知效率在当时的互联网公司里算比较高的。2.3 三面综合能力与业务视野三面面试官是部门负责人这一轮反而没有太强的压迫感。开场先让我简单介绍项目然后问了一个开放性问题如果要在字节跳动的业务场景里设计一个用户行为分析系统你会怎么做。这个问题没有标准答案考察的是从业务场景出发做技术选型和架构设计的能力。我当时从数据采集、数据管道、存储层、分析层四个维度展开论述。数据采集用埋点SDK加日志上报数据管道走消息队列存储层分实时和离线两种场景实时用Druid或者ClickHouse离线用Hive数仓分析层提供报表和即席查询能力。展开过程中面试官几次打断我追问了事件模型如何设计、埋点数据的质量如何保证、分析系统的数据延迟要求是多少这类细节。这一轮我明显感觉到面试官并不是要考察一个具体的知识而是看候选人面对一个模糊问题时能否结构化地思考和表达。我在回答时尽量用了总分总的结构先说整体框架再说模块细节最后总结关键技术选型。三面大约一小时结束后HR当场跟我约了HR面时间。HR面主要是聊薪资期望、入职时间、业务方向偏好没有太多技术问题但会确认一些基本信息。这里提醒大家一点HR面不要只谈钱也要主动了解业务团队的技术栈和未来发展这些信息可以帮助你判断这个offer到底适合不适合自己对后续的谈薪也有帮助。3. 腾讯面试全流程考察全面但节奏更稳重腾讯的面试流程和字节跳动有明显的差异。腾讯在2019年时更侧重理论基础的全面性面试环节包括两轮技术面加一轮HR面面试官问了大量计算机网络、操作系统、数据库和中间件的经典问题整体给人的感觉是基础一定要扎实项目经验可以慢慢聊但是基础问题的回答必须准确、完整。3.1 一面计算机基础知识的全面考察腾讯的一面更像是一张综合试卷覆盖了计算机网络、操作系统、数据库、Linux等核心领域。面试官是一名工作经验丰富的后端工程师开场没有让我做自我介绍而是直接从HTTP协议开始问。第一个问题HTTP和HTTPS的区别是什么HTTPS的握手过程是怎样的。这个问题可以说非常经典但是回答得好坏和深度差距很大。我当时从端口差异、明文与密文的区别、证书机制、对称加密与非对称加密的结合四个层面回答。面试官追问我对称加密和非对称加密在握手过程中分别用在哪里、为什么不用非对称加密直接传输数据我答了非对称加密性能差但是适合密钥协商用非对称协商出的对称密钥再加密后续数据兼顾安全性和性能。紧接着问了TCP和UDP的区别、TCP的流量控制和拥塞控制、进程和线程的区别、什么是死锁以及如何避免死锁。这些题目我都能熟练作答因为都是我提前准备过的核心高频题。笔试部分有一道关于数据库索引的题让我解释B树为什么适合作为数据库索引结构我答了二叉树退化为链表的问题、B树的扇出更大所以树高更低、叶子节点有指针串联适合范围查询这三点。腾讯一面让我印象最深的一个问题是什么是零拷贝这个问题在2019年前后面试中出现的频率很高而且如果只是背概念很容易被追问卡住。我当时的回答从传统IO流程讲起数据从磁盘到内核缓冲区再到用户缓冲区再从用户缓冲区到socket缓冲区最后到网卡经历了四次拷贝和四次上下文切换。零拷贝通过sendfile或mmap减少拷贝次数我项目里用Kafka时踩过磁盘IO瓶颈所以对零拷贝有一定的实际理解。回答完后面试官点了点头我能感觉到他对这个回答还比较满意。3.2 二面偏重项目与原理结合腾讯二面的风格又有变化面试官来自后台技术组全程围绕项目展开但是问法的颗粒度比字节跳动二面更细。他直接采用“你用了什么技术——为什么选择它——它在底层是如何实现——如果出现问题你会怎么办”这种四层追问的方式。我项目里用了Redis做缓存面试官先问我为什么选择Redis而不是Memcached我讲了Redis支持更丰富的数据结构、支持持久化、支持发布订阅等特性。接着他深入地问Redis的持久化机制RDB和AOF分别是什么、AOF的重写机制是怎么实现的、如果AOF文件损坏了怎么办。这串问题问得很深而且每往下一层我都能感觉到自己在知识边界上试探。关于RDB和AOF的取舍我当时的理解是RDB是某一时刻的数据快照恢复速度快但是可能丢失最后一次快照之后的数据AOF记录每次写命令最多丢失1秒内的数据但是AOF文件会比RDB大很多。生产环境通常两种策略混用用RDB做定期快照保证恢复速度用AOF保证数据完整度。AOF重写机制的原理是创建一个子进程在子进程中将当前内存中的数据转换为写命令重新写一份新的AOF文件这个过程中新到达的写命令会存入缓冲区重写完成后合并。AOF文件损坏的情况Redis提供了redis-check-aof工具修复可以只保留能正确解析的部分把损坏的命令丢弃或截断。项目里还有一个点被深度追问了因为我用了消息队列解耦业务逻辑面试官直接问Kafka的消费者组是如何做分区分配的。我回答消费者组会以组为单位订阅主题Kafka会把主题的分区分配给组内的消费者尽量保证每个消费者处理的分区数量均衡。如果消费者数量超过分区数量多余消费者会闲置。面试官追问我有没有遇到过重平衡问题我承认在生产环境踩过这个坑通过调整session.timeout.ms和heartbeat.interval.ms参数解决。那一刻我意识到真实项目经验的价值远远超过背面试题的价值因为在生产环境踩过坑回答问题时呼吸都是稳的。腾讯二面没有写算法题可能是当时面试官觉得项目已经足够反映编码能力了所以整轮更像是一场技术问答的对话。但这种对话反而更考察综合深度因为你永远不知道面试官会顺着你的回答往哪个方向深挖。3.3 HR面与offer沟通腾讯的HR面和其他大厂类似主要考察求职动机、团队协作、职业规划等软素质。HR会问为什么从上家公司离职、为什么选择腾讯、未来3年的职业规划是什么。这些问题虽然不算难但我见过很多人在这种环节栽跟头原因是回答得过于模板化。我的建议是回答离职原因时要保持客观理性千万不能说前东家坏话也不要说“钱少事多”最好从个人成长空间和业务方向匹配度入手回答职业规划时不要只说“想做技术专家”这种空话要具体到希望在哪个技术方向深耕、在什么时间节点达到什么水平。比如我当时说的是希望在中间件和高并发架构方向深耕未来具备从0搭建一套完整后台系统的能力。offer沟通阶段HR问了我的期望薪资我说了一个比当前薪资涨幅30%的数字最终HR面通过的offer基本达到了这个预期。这里我要提醒大家谈薪时不要轻易报底价最好先让HR说区间然后根据市场行情和自身水平报一个合理且略高的数字。同时也要做好被压价的心理准备大厂一般有固定的薪资体系HR能谈的空间有限但绩效、签字费、股票期权这些是可以争取的。4. 面试题复盘高频问题的分类与应对思路面完这两家之后我花了整整一周时间把所有能记起来的题目整理成了笔记逐题复盘。复盘过程中我发现了几个重要的规律这些规律后来也一直在我的面试辅导中反复提到。4.1 高频技术题分类整理根据两轮的面试题后台开发岗的高频考点大致可以分为以下几类计算机网络类是必考领域TCP三次握手和四次挥手、HTTP与HTTPS、TCP流量控制与拥塞控制是最常见的三组题。我的经验是把TCP握手过程结合握手报文段的状态转换来理解不要死记硬背。操作系统类的考察集中在进程与线程、死锁条件与预防、用户态与内核态、零拷贝、虚拟内存这几个知识点上。考法往往是给一个场景让候选人分析比如“多线程下某个共享变量为什么会出现不可见的问题”。数据库类重点在于索引原理和事务隔离级别。B树索引、聚集索引与非聚集索引、间隙锁、MVCC、redo log和undo log是高频中的高频。中间件与分布式类主要考察Redis和消息队列。Redis的数据结构、持久化、哨兵与集群、缓存穿透与雪崩Kafka的分区机制、消费组、重平衡、消息不丢失不重复这些都是我在面试中实际遇到的题。算法与数据结构类字节跳动明显比重更大腾讯相对较少但算法依然是后台开发面试的基础能力。链表、二叉树、动态规划、栈队列、哈希表是最高频的方向准备时优先覆盖。我把这些高频题整理成了表格放在手机里利用碎片时间随时翻看领域核心考点面试中出现频率计算机网络三次握手与四次挥手极高计算机网络HTTPS握手与证书体系高计算机网络TCP拥塞控制算法中操作系统进程线程协程对比高操作系统死锁条件与避免中数据库索引与B树极高数据库事务隔离级别与MVCC高中间件Redis持久化高中间件Kafka消费组与重平衡中算法哈希表相关题目极高算法动态规划经典题高4.2 开放性问题与系统设计题的通用答题框架面经里常有人吐槽开放性问题不知道从何说起我的经验是结构化表达是最有效的工具。系统设计题常见的回答框架是需求分析、容量预估、核心流程设计、存储设计、性能优化与降级方案、监控体系。按照这个顺序展开既能保证覆盖全面又不会让回答显得跳跃。容量预估是整个环节里最容易被忽略的部分。很多候选人在设计短链服务或者秒杀系统时一上来直接画架构图跳过了数据量和QPS的估算。实际上面试官非常看重容量预估能力因为分布式系统的所有设计决策都依赖于量级。比如设计短链服务时如果知道一年预计生成100亿条短链那么就会推导出存储需求、缓存大小、发号器并发量等一系列指标进而确定技术选型。开放性问题还要注意互动不要一口气把整个方案说完。我习惯在讲完一个模块后停顿一下给面试官追问的空间这样既能让面试官感受到你的表达节奏也能避免自己讲偏方向。5. 踩过的坑与复盘如果重来一次我会调整什么面了这么多轮不可能每轮都完美。复盘时我发现自己踩了几个坑这些经验对准备面试的朋友可能更有价值。5.1 第一个坑项目细节准备不足导致被压着打字节跳动二面深挖消息推送系统时面试官问了一个我没准备到的问题如果消费者处理消息的速度跟不上生产速度你会如何设计动态扩容方案。我当时只能凭平时的经验回答提到了通过增加消费者实例配合分区数扩展来实现横向扩容但忽略了消费者实例增加时分区重平衡带来的影响以及重平衡过程中消费停顿的问题。这个问题其实我在生产环境遇到过但因为没有提前梳理成书面方案面试时回答得不够全面。当时的补救方式是意识到问题后立刻放慢回答节奏承认这部分考虑不充分然后顺着面试官的引导重新梳理思路。面试官并没有因为这个扣太多分因为我最终给出了一个相对合理的路径。但这个经历让我意识到项目复盘不能只停留在“做了什么”还要把“如果重新设计你会怎么做”这种问题提前想清楚。5.2 第二个坑技术深度与广度失衡准备面试时我在中间件和分布式系统方向投入了大量时间但对Linux内核、网络协议栈底层的准备明显不足。腾讯一面问零拷贝如果我当时对操作系统底层没有基本的认知那个环节就会卡壳。面试官考察的不只是你是否知道零拷贝这个概念而是你在磁盘IO瓶颈的实际场景下能不能想到这个优化方案。给后来者的建议是时间有限的情况下优先准备高频考点但在自己简历上涉及的技术方向一定要往深处挖三层。比如简历上写了用了Redis就至少要能解释Redis的事件驱动模型、持久化机制、哨兵与集群的区别简历上写了用了消息队列就至少要知道消息不丢失的实现原理、消费重试机制、以及消息积压的处理方式。5.3 第三个坑心态管理比想象中更重要字节跳动一面结束到收到二面通知的那两个小时内说实话是很煎熬的。等待过程中我反复回忆一面有没有答错的地方甚至还把当时觉得回答得不够好的问题重新查了一遍。后来我才明白这种焦虑完全没有必要。字节跳动的流程很快如果一面挂了通常当天就会通过邮件通知一直没有消息说明还在流程中把注意力放在准备下一轮上才是正确的做法。还有一次印象比较深的是腾讯二面面试官问了一个我完全没有准备过的题目让我说说Kafka的日志存储格式。当时我确实有些发懵因为平时用Kafka主要是API层面的操作很少去读源码看磁盘上的日志文件结构。我快速在脑子里兜了一圈确认自己确实不了解这个层面的细节后坦诚地告诉面试官这个点我没有深入研究过然后补充了我对Kafka日志分段和索引机制的一些有限理解。面试官没有为难我反而简单讲了一下日志的存储设计原理然后继续问下一个问题。这也算是非常实用的一个经验遇到完全不会的问题不要强行编造答案面试官都是技术出身一听就能分辨你是否在硬编。正确的做法是先坦诚承认盲区然后把自己知道的相关知识说出来表现出积极学习的态度。在某些情况下面试官注重的并不是每个问题你都答对而是你在面对知识盲区时的反应方式。5.4 复盘方法用“面试官视角”重新审视项目面完之后我找了一位在大厂做技术面试官的朋友帮忙做了一次模拟面试。这个环节收获巨大因为他能够站在面试官的位置告诉我哪些地方我的回答显得没有说服力哪些地方其实可以体现亮点。比如我介绍消息推送系统时只讲了技术架构和实现细节但没有主动说清这个架构带来的业务收益。朋友告诉我面试官会默认候选人的技术方案都有收益但如果你能用具体数字陈述收益回答会更有说服力。后来我把这段话改成了“重构后推送延迟从秒级降到毫秒级系统支持横向扩展到支撑千万级在线设备同时运维成本降低约40%”这个改动让我的项目表述质量明显提升。6. 对后台开发面试准备的两个重要提醒把整个面试经历复盘完之后我最想传达给正在准备面试的人两个核心提醒。6.1 基础知识的深度理解远比刷面经重要网上有很多面经和题库可以刷很多人刷完之后感觉自己掌握了所有高频题但实际面试时你会发现面试官不会按面经原题提问而是给你一个变形场景。这时候如果你只是背了标准答案很容易被追问卡住。比如背了“TCP三次握手的过程”并不难但面试官问“为什么连接建立需要三次而断开连接需要四次”如果你不理解SYN和FIN所代表的语义差异就很难触类旁通。我建议的准备方法是每道高频题不光要会回答还要能回答“为什么”和“如果不这样做会怎样”。比如TCP就算只握手两次也能建立连接那为什么要第三次如果第二次握手丢失客户端和服务端会各自处于什么状态这些延伸问题才是面试真正的分水岭。6.2 简历上的每个词都要能撑住三连问说白了后台开发面试本质上就是一场围绕你简历的深度审查。你写了“精通Redis”面试官默认你理解了Redis底层实现你写了“做过高并发系统”面试官默认你清楚并发场景下的所有瓶颈和解决方案。所以写简历时不妨用“面试官视角”审视自己的每一句话保证每个技术名词都能回答出三个层次的追问。我当时给简历的每个项目都写了一份补充文档文档里包含技术选型理由、核心流程说明、性能优化过程、踩过的坑、解决方案和业务收益六部分。这份文档帮我撑过了所有项目的深挖环节而且写文档的过程本身就是一次系统性的知识复盘收益非常大。回头看这段面试经历虽然已经过去了一段时间但那些题目和回答思路对我后来做技术决策仍然有影响。面试不只是为了拿offer它更像是逼着你把自己过去几年的技术积累系统性地梳理一遍。如果你也能用这种心态看待面试准备收获会远远超出那张offer。
返回列表