尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从字节后端真题看校招:核心考点与备考路线全梳理

从字节后端真题看校招:核心考点与备考路线全梳理 每年都有不少准备后端校招的同学来问我“2018年字节跳动那批后端真题还要不要刷”我的答案很明确要。尤其是后端方向第三批虽然年头不短但里面的考点几乎覆盖了后端校招必须掌握的所有核心模块——算法、网络、操作系统、Java基础、数据库、系统设计。放到今天来看它非但没有过时反而因为题量大、基础密集很适合拿来当一面基础能力的自测清单。这篇内容不打算逐题贴答案而是从这套真题出发拆解每一类考点背后到底在考察什么、面试官会怎么追问、你该怎么准备才能像“有经验的人”而不是“背书机器”。文章适合正在准备后端校招的同学、想转行做后端的人以及那些基础不牢想系统补一遍的在职开发者。如果你能把这套题吃透后面再遇到其他公司的面试题大概率不会慌。1. 整体考点分布这套题到底在考什么1.1 从第三批真题看后端面试的底层逻辑字节这类大厂在校招时有一个很明显的特征不会只盯着你会不会写某个业务接口而是把精力花在考察“底层基础”和“解决问题的潜力”上。后端方向第三批的题目看起来东一块西一块实际上可以归成几条线算法与数据结构、计算机网络、操作系统、Java基础与并发、数据库与缓存、系统设计与项目落地。为什么这么安排因为后端开发日常要面对的是高并发请求、数据一致性、系统稳定性这些复杂问题而这些问题的解法几乎全部建立在对基础原理的理解之上。比如你只有理解了TCP握手和挥手的过程才能解释为什么接口偶尔超时、为什么连接会处于TIME_WAIT只有理解了数据库索引的B树结构才能解释为什么某条SQL在数据量大了之后突然变慢。所以这套题表面上是在考知识点实际上是在选人。面试官希望你具备的不是刷完一百道题就忘的短期记忆而是一套能支撑你快速学习、定位问题、做技术决策的底层框架。这也是为什么当年这批题虽然时间过去了几年但放在今天的校招面试里依然不过时。1.2 这套题的难度梯度与备考优先级从难度上看第三批的题目有明显的梯度。一面通常以算法题和Java基础为主这部分题量大、节奏快主要筛掉代码基本功不行的同学二面会深入网络、操作系统、数据库和项目面试官会顺着你的回答一直追问到你说不出为止到了三面或终面往往会出现系统设计题比如让你设计一个秒杀系统、一个短链服务或者一个消息推送系统。这个梯度其实也给备考指明了优先级。算法和Java基础是入场券必须做到肌肉记忆网络、数据库、操作系统是区分度最高的部分决定你能不能从一大批候选人里冒出来系统设计是加分项决定你能不能拿到SSP Offer。很多同学一开始就抱着Spring Boot的源码啃或者天天刷项目反而把最基础的网络和操作系统丢到一边这是很危险的。字节第三批真题里基础题占比相当大基础不牢项目吹得再花也撑不过三连问。我把备考优先级排一下供你参考优先级模块重点内容面试占比P0算法与数据结构链表、二叉树、动态规划、贪心最高P0Java基础与并发HashMap、JVM、线程池、锁高P1计算机网络TCP、HTTP、HTTPS、DNS高P1操作系统进程线程、死锁、内存、零拷贝中高P1数据库索引、事务、MVCC、SQL优化高P2系统设计秒杀、缓存、消息队列、项目部署中2. 算法与数据结构手撕代码的三类高频题2.1 链表与二叉树老题不旧边界是分水岭字节的后端面试算法题不会出那种偏题怪题更常见的是把链表、二叉树、动态规划这些经典题型换着花样考。第三批流传出来的面经里链表反转、判断链表是否有环、二叉树层序遍历这类题出现的频率非常高几乎可以视为“必刷清单”。以反转单链表为例别看这道题简单里面其实藏着不少面试官喜欢追问的点。我建议你不仅要会写迭代版本还要能解释递归版本// 迭代版本 public ListNode reverseList(ListNode head) { ListNode prev null; ListNode curr head; while (curr ! null) { ListNode next curr.next; curr.next prev; prev curr; curr next; } return prev; }面试官常见的追问是递归版本怎么实现如果链表很长递归会有什么问题如果你能答出“递归栈深度可能达到N有栈溢出风险工程上更推荐迭代”这个印象分会加得很明显。二叉树更是如此。层序遍历用队列做BFS是标准解法但面试官会继续问如果要求Z字型遍历怎么办如果二叉树深度很大递归会有什么问题这些追问都在考察你对数据结构和递归底层机制的理解而不只是背模板。准备这类题时建议把每道题都做三遍第一遍写标准解法第二遍尝试空间复杂度优化第三遍把递归改成迭代。2.2 动态规划从状态定义开始讲清楚动态规划在校招算法题里几乎是必考的第三批也不例外。常见题型有最长公共子序列、最长递增子序列、编辑距离、背包问题等。这类题最大的难点不是代码而是“状态定义”和“状态转移方程”。很多同学做题时喜欢直接看题解认为看懂就算会了但面试现场一旦题目稍作变形就懵了。我常用的办法是拿到一道DP题先别急着写按下面四步走明确状态这个问题的子问题是什么用什么维度表示子问题写状态转移方程当前状态能从哪些更小的状态转移过来确定边界条件初始的dp[0]或者dp[0][0]等于什么确定遍历顺序是正着遍历还是倒着遍历是二维三层循环还是滚动数组。拿最长递增子序列举例状态dp[i]表示以第i个元素结尾的最长递增子序列长度转移方程是dp[i] max(dp[i], dp[j] 1) 其中 j i 且 nums[j] nums[i]面试时不要一上来就写代码。先把状态定义讲给面试官听对方点头了再动手这个沟通习惯非常加分。因为面试官想看的不只是代码正确而是你的思维过程是否清晰、遇到复杂问题能不能拆解成子问题。2.3 刷题之外的4个手撕习惯除了题目本身面试现场还有一些习惯能让你表现得更专业。我总结了四点第一步是读题确认。拿到题先复述一遍确认输入输出和边界条件避免理解偏差导致全场崩盘。第二步是举例子。随手画一个小用例手动走一遍逻辑既能帮自己理清思路也能让面试官看到你在思考。第三步是复杂度预估。写完代码后主动说明时间和空间复杂度如果面试官要求优化再尝试空间换时间或时间换空间的方案。第四步是自查边界。空链表、只有一个节点、数组长度为0、元素全相等……这些边界最容易出错主动说“我来检查几个边界情况”会让面试官觉得你工程素养到位。说实话很多水平差不多的候选人差距就拉在这几个细节上。代码写得快的人不少但能把思路讲得清清楚楚、边边角角都照顾到的人才是大厂真正想要的人。3. 计算机网络与操作系统八股背后的工程逻辑3.1 网络必问的五个点握手、挥手、HTTP与HTTPS计算机网络这块第三批真题的覆盖面很广但真正的高频考点集中在TCP三次握手、TCP四次挥手、HTTP与HTTPS的区别、HTTP请求报文结构、常见状态码这几个点上。每一题都不难难的是你能不能答出深度。比如TCP三次握手最简单的回答是“客户端发SYN、服务端回SYNACK、客户端再回ACK”但这只能得基础分。面试官紧接着就会问为什么不是两次握手如果你能答出“两次握手无法防止已失效的连接请求突然传到服务端消耗资源”这个关键点说明你是真懂而不是背的。更进一步的加分回答是三次握手的本质是让双方都确认自己和他人的收发能力正常。四次挥手也一样。除了描述FIN和ACK的交替过程还要能解释为什么客户端最后要进入TIME_WAIT状态为什么TIME_WAIT要等2MSL。如果你能补充“为了确保最后一次ACK能到达服务端同时让旧连接的报文在网络中消失不会干扰新连接”这就已经超过多数候选人了。HTTP和HTTPS的区别不要只答“HTTPS更安全”要展开到非对称加密交换密钥、对称加密传输数据以及证书的作用。最好能画一个简要流程客户端请求证书、服务器返回证书、客户端用CA公钥验证证书、提取服务器公钥、协商对称密钥、后续用对称密钥加密通信。这个流程虽然简单但把密码学和HTTP协议结合起来了面试官会眼前一亮。3.2 操作系统四个高频考点进程线程、死锁、内存、IO操作系统在后端面试中占比不低字节第三批真题里同样出现了不少。核心考点集中在四个方面进程与线程的区别、死锁的必要条件、虚拟内存和缺页中断、零拷贝技术。进程与线程的区别几乎是必问。除了“进程拥有独立地址空间线程共享进程的地址空间”这种标准答案之外面试官还会追问线程切换为什么比进程切换代价小。如果你能答出“进程切换需要切换页表、刷新TLB线程切换只要切换栈和寄存器”这才能显示出你对操作系统底层有一定了解。死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待是经典八股。但更重要的是你要能结合实际场景给出解法。比如用锁的顺序来破除循环等待用超时机制来打破不可剥夺。如果能结合Java里的synchronized和ReentrantLock的差异来分析那就更好了。虚拟内存和缺页中断是理解数据库和缓存的基础。面试官如果问“为什么进程能使用比物理内存更大的空间”你要能答出页表映射、缺页异常、页面置换算法这些内容。零拷贝在消息队列和文件传输场景里很常见比如Kafka通过sendfile系统调用减少了数据从内核态到用户态的拷贝次数这个知识点如果能在项目里提到是很加分的。3.3 用“协议状态机”把八股串成体系我复习网络和操作系统时有一个心得不要一条一条背题而是把每个协议想象成一台“状态机”。TCP连接有状态CLOSED、LISTEN、SYN_SENT、ESTABLISHED等线程也有状态NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。你把这组状态转换牢记在心任何题目问到其中一环就能顺着状态机展开不会卡壳。比如面试官问“端口为什么出现大量TIME_WAIT”你顺着状态机一想就知道这是主动关闭连接的一方在处理完最后一次ACK后进入的状态。再往深想可能是短连接请求量太大、连接复用没做好实际项目里的调优措施就来了开启TCP复用、调整MSL参数、改用长连接等。这样你的回答就有了从原理到实战的完整链路而不是干巴巴的“调OS参数”。用状态机思维学习还有一个好处这些状态彼此之间有因果联系你不需要死记硬背。TCP从建立、传输、释放的整个生命周期是连贯的进程从创建、就绪、运行、阻塞到结束也是连贯的。把知识串成体系面试时才能举一反三。4. Java基础与并发回答要“有场景”4.1 HashMap、JVM与类加载原理和参数要能自圆其说Java是很多后端岗位的主力语言字节当年这批校招题里Java基础的分量相当重。HashMap几乎是必考中的必考但很多人的回答就停在“底层是数组加链表JDK 1.8之后是数组加链表加红黑树”。这个答案只能说明你看过八股不能证明你理解HashMap。我建议你按这个层次去答先讲数据结构数组的每个槽位是一个链表头哈希冲突时用链表存再讲红黑树的引入条件链表长度超过8且数组长度大于等于64时转红黑树接着讲扩容机制默认初始容量16负载因子0.75当元素个数超过容量乘负载因子时扩容为原来的两倍最后讲线程安全问题HashMap不是线程安全的并发场景应该用ConcurrentHashMap而ConcurrentHashMap通过CAS加synchronized对桶加锁粒度更小。JVM部分重点要能画出内存区域堆、虚拟机栈、本地方法栈、方法区/元空间、程序计数器。能解释哪些区域是线程共享的哪些是线程私有的。GC方面要能说出常见的垃圾收集器比如CMS和G1的特点以及它们各自适用的场景。如果你能结合CPU密集和IO密集型任务来聊JVM参数调优比如-Xms和-Xmx怎么设置、为什么初始堆大小和最大堆大小通常设为一致面试官会觉得你有实战概念。类加载问题同样高频双亲委派模型是什么、为什么这么设计。核心答案是“避免类被重复加载保证核心类库的安全性”。如果继续追问Tomcat为什么破坏双亲委派你要能说出“Web应用需要加载自己版本的类为了实现隔离才打破”。4.2 synchronized、volatile与线程池怎么答并发编程是后端面试的重头戏。第三批真题里synchronized、volatile、线程池这三个知识点出现的频率相当高而且经常被串在一起问。先说volatile它保证两个特性可见性和有序性。要能解释为什么不能保证原子性并举出经典的例子——两个线程同时对count执行自增操作即使count是volatile的最终结果也可能不正确因为自增操作不是原子操作。如果面试官继续问JMM可以进一步说volatile通过内存屏障禁止指令重排保证写操作立即可见。synchronized要从三个层面答用法上可以修饰实例方法、静态方法、代码块底层实现上JDK 1.6之后有偏向锁、轻量级锁、重量级锁的升级过程和ReentrantLock对比synchronized是JVM层面的锁ReentrantLock是JDK API层面的锁后者更灵活支持超时、可中断、公平锁。线程池里的七个参数——《ThreadPoolExecutor的corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler——建议背得滚瓜烂熟。但光背不够还要能说出任务提交后的执行流程核心线程不够用就进队列队列满了创建新线程线程数达到最大值就执行拒绝策略。常见的拒绝策略有AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy面试官喜欢问“什么时候用CallerRunsPolicy”如果你能答出“不想丢弃任务又希望放慢提交速度让调用者线程自己去执行任务”这就是实战经验了。4.3 把答案讲成故事场景化表达示例面试时最怕的就是“背题感”。同样一个问题有的候选人像在背课本有的候选人像是在讲自己踩过的坑后者明显更有说服力。我建议你在准备Java并发问题时尽量用场景去串。比如面试官问“你了解volatile吗”你可以这么说“之前排查过一个并发问题有个配置项被多个线程读取每次配置变更后总有一些线程拿到旧值。后来我加了volatile修饰问题就解决了。但当时我并没有直接用synchronized因为配置读多写少用volatile保证可见性就够了代价更小。”这个故事既回答了volatile的核心作用又展示了你对性能和并发安全之间的权衡。再比如线程池你可以说“我负责的服务入口流量波动比较大如果每次请求都new一个线程系统很快就会被拖垮。所以我用了固定大小的线程池队列容量设为500拒绝策略选了CallerRunsPolicy这样流量高峰时调用线程会被迫去执行任务相当于起到了背压效果。”这种表述方式明显比单纯背参数更打动面试官。面试考察的从来不是记忆力而是你能否在真实场景里做出合理决策。5. 数据库与Redis优化从索引和缓存开始5.1 索引为什么能快B树与回表数据库在后端面试里的地位怎么强调都不为过。第三批真题里MySQL相关题目集中在索引、事务、SQL优化上。先说索引回答要能覆盖这几个层次InnoDB的索引是B树结构聚簇索引的叶子节点存整行数据二级索引的叶子节点存主键值根据二级索引查询时如果查询列无法覆盖就需要回到聚簇索引查完整行这个过程叫回表为了减少回表可以用覆盖索引。面试官经常会问“为什么用B树而不用红黑树或哈希索引”。哈希索引适合等值查询但不支持范围查询红黑树是二叉树随着数据量增大树高会明显变大磁盘IO次数增多B树是多路搜索树叶子节点之间有链表连接既支持范围查询又能保证较低的树高。记住面试时一定要提到磁盘IO这个角度因为索引设计本质上是在减少磁盘访问次数。索引失效的场景也几乎必问。比如对索引列使用函数、隐式类型转换、模糊查询以%开头、联合索引不符合最左前缀原则等。面试官问这个是想确认你在真实项目里有没有靠索引优化过慢SQL。你可以结合一个例子订单表里按用户ID和创建时间建了联合索引查询时如果只按创建时间过滤索引就会失效因为不满足最左前缀原则。这种小案例比抽象的描述更有说服力。5.2 事务隔离级别与MVCC事务这块四个隔离级别的区别要会背读未提交、读已提交、可重复读、串行化。MySQL默认是可重复读。但只背名字肯定不够面试官会用经典问题追问“可重复读是怎么实现的”答案核心是MVCC多版本并发控制。MVCC可以这样理解每一行数据在更新时不会直接覆盖旧值而是生成一个新版本并记录创建这个版本的事务ID。读操作根据事务的可见性规则找到对自己可见的版本。具体来说InnoDB通过隐藏列trx_id和roll_pointer维护版本链配合Read View来判断版本可见性。可重复读隔离级别下事务在第一次读时生成Read View后续读都基于这个视图所以同一查询多次执行结果一致。关于MVCC还有两个容易混淆的点。一是当前读和快照读select是快照读不加锁update/insert/delete是当前读需要加锁。二是幻读在可重复读下怎么解决InnoDB通过next-key lock记录锁加间隙锁来解决。如果你能在回答里把这些串起来面试官基本就认可你的数据库功底了。5.3 缓存穿透、击穿、雪崩和Redis使用要点Redis几乎是后端项目标配第三批相关的问题也绕不开缓存。三个经典问题必须熟练掌握缓存穿透查询一个根本不存在的数据缓存和数据库都查不到请求直接打到数据库。解决方法是缓存空值或者用布隆过滤器判断key是否存在。缓存击穿热点key过期瞬间大量请求同时打到数据库。解决方法是互斥锁或者让热点key不设置过期时间只做逻辑过期。缓存雪崩大量key在同一时间过期或者Redis宕机请求全打到数据库。解决办法是过期时间加随机值或者使用Redis高可用方案比如主从加哨兵、Cluster集群。这些知识点光背不行一定要结合项目讲。比如我在一个秒杀类项目中就说“我们把热点商品信息提前放入RedisTTL设置成基础时间加随机秒数避免大批key同时过期。同时查数据库的逻辑加了分布式锁防止缓存过期时多个线程同时打库。”另外还有一个容易被忽略的细节Redis持久化。RDB和AOF的区别、怎么选面试官也爱问。RDB是快照恢复快但可能丢数据AOF是追加日志数据更安全但恢复慢。生产环境通常两者结合使用这个思路放在项目描述里会显得很真实。6. 项目经验与系统设计题从“会写代码”到“会做系统”6.1 前后端分离项目怎么讲才不虚现在问项目几乎绕不开前后端分离。无论你是用Spring Boot加Vue还是用若依框架搭的后台管理系统都要能把这几个点讲明白前端怎么和后端交互、跨域问题怎么解决、项目怎么部署。前后端交互的核心是HTTP接口前端通过Ajax/Axios发起请求后端提供RESTful API返回JSON。这个过程中面试官经常会问“前端为什么拿不到数据”这个问题背后通常关联着几个常见原因接口地址写错、返回格式不是JSON、后端报错被全局异常处理器拦截、跨域未配置CORS等。你要是能在自我介绍环节就提一句“处理过跨域问题后端加了CORS配置”后面面试官大概率会跟进追问CORS的原理。部署环节也不容易被忽略。如果你是手动打包上传服务器要能说出Spring Boot项目用Maven或Gradle打成Jar包再用java -jar启动的流程如果你用过Jenkins可以补充流水线构建的过程“代码推送到GitLab之后Jenkins自动拉去代码执行mvn clean package构建然后把制品部署到服务器这一步用了一个Shell脚本完成。”哪怕只是很基础的部署方式也比你只说“项目能跑起来”强得多。面试官想看的是你对自己项目的掌控程度。6.2 如果让你设计一个秒杀系统面试官想听什么到了二面、三面系统设计题是个绕不开的坎。第三批面经里“设计秒杀系统”属于经典题型。遇到这类题千万不要一上来就Redis加MQ堆技术栈而是先把问题和边界问清楚再给方案。面试官考察的是你的分析能力而不是技术名词的堆砌。我建议用这个思路去答先分析瓶颈秒杀系统在瞬间会有极高的读请求和写请求核心瓶颈是数据库扛不住再讲应对策略前端做按钮置灰和静态页面Nginx做动静分离和限流Redis做热点数据缓存和库存预扣MQ做异步下单最后再异步落库最后讲数据一致性库存扣减用Redis的原子操作异步写库失败要用补偿机制或者把消息投递到MQ后由消费者处理。整个回答里如果能加入一个细节会更出彩秒杀接口需要隐藏地址用户在进入秒杀页时向服务端请求一个随机token真正下单时携带这个token服务端校验通过才放行。这个细节说明你考虑到了刷单和恶意请求这是在普通教程里学不到的实战经验。6.3 后端项目的隐性问题部署、日志、限流系统设计题之外面试官还会从项目里挖一些“隐性考点”。比如线上服务挂了怎么排查——你要能说出看日志、查监控、看线程栈、分析GC日志这些手段。日志非常关键项目里如果用了Logback或Log4j2要能说出日志级别怎么配置、为什么线上一般用INFO而不用DEBUG。再比如限流除了Nginx层限制IP连接数之外应用层也可以用Guava RateLimiter或Sentinel如果你能说出令牌桶和漏桶的区别面试官对你会刮目相看。这些内容别看零碎实际上面试官是想知道你有没有“线上意识”。一个只写过Demo项目的候选人和服务挂过、流量突增过、数据库被慢查询拖垮过的候选人回答同一道题时表达出来的状态是完全不一样的。所以做项目时别只满足于“能跑”一定要去思考如果线上出问题了怎么办这个接口被刷爆了怎么办多问自己几个“怎么办”面试时才不会哑口无言。7. 三个月后端备战路线这套题怎么用7.1 第1个月基础铺路如果距离校招还有三四个月我建议第一个月把精力全部放在基础扫盲上。算法每天刷三道左右的高频题链表、二叉树、动态规划优先Java基础看一遍HashMap源码、JVM内存模型、并发编程知识边看边画思维导图计算机网络和操作系统跟着脑图梳理一遍争取每个协议、每个状态都能用自己的话讲出来。这个阶段不求快但求踏实因为后面所有东西都要建立在基础之上。7.2 第2个月刷题与项目并行第二个月开始项目要提上日程。找一个真实的项目练手不要只做CRUD要有数据表设计、接口设计、缓存使用、异常处理、日志记录这些完整环节。前后端分离项目可以自己用Spring Boot写后端接口再用Vue搭一个简单前端虽然工作量不小但做完之后对整体流程的理解会特别深。如果时间不够用若依这类开源框架跑一个后台管理系统也行但一定要花时间搞懂每个模块的代码逻辑否则面试官一问就露馅。这个阶段的算法题不能停每天至少保持两题重点练习DP和并查集这些容易卡壳的题型。7.3 第3个月模拟面试与错题复盘最后一个月的核心就是模拟面试。可以找同学互相提问也可以自己对着镜子录音。每次模拟后把没答上来的知识点记录下来第二天集中补漏。这套2018年第三批的题正好可以用来做整套自测限时两个半小时做完然后逐题复盘。复盘的重点不是“答案是什么”而是“为什么这么答”“面试官追问的下一层是什么”。把每个问题往深挖两层你会发现自己对系统的理解会越来越立体。提示刷完真题不要只做一遍。隔一周再答一次相同的问题如果依然流畅且能延展出新的例子说明这个知识点真正变成了你的东西。最后再分享一点自己的体会我帮不少人准备过面试也当过几次模拟面试官最大的感受是能把题目背下来的人很多能把知识讲成体系的人很少。这套题里的每一个知识点都不是孤立的TCP状态流转和线程状态流转有相通之处B树索引和Redis跳表都在解决“快速查找”的问题JVM的垃圾回收和数据库的MVCC都在解决“多版本数据管理”的问题。面试官层层追问本质上就是在看你有没有把这棵知识树长起来。如果你现在正处在焦虑的复习期请一定记住面试不是比谁背得熟而是比谁在遇到陌生问题时能稳住思路、顺着原理去推理。这套2018年的真题也许不会原封不动再出现在明天的考卷上但只要你能把它背后的原理吃透、把回答里的场景讲清楚任何一套新题对你来说都只是这棵知识树上长出的新枝叶。
返回列表