
2018年秋招那阵字节跳动后端岗的笔试和面试被不少同学当成国内大厂后端考题的风向标。我当时帮学弟系统整理过一套后端校招的复盘笔记恰好覆盖到第四批。四年多以后回看这批题仍然觉得很有代表性算法题不算难到离谱但基础题覆盖面极广技术面试又特别喜欢沿着一条问题链层层追问。这篇文章就把我当时整理的考点、踩坑点、答题思路以及如果放到现在重新准备一次我会怎么学一并写出来希望对正在准备后端校招的同学有实际帮助。1. 2018年第四批后端校招为什么这一轮值得拿出来复盘1.1 招聘节奏与批次背后隐藏的信息字节跳动的校招后端方向在2018年分了多批进行第四批大致处在秋招中后期。很多人以为批次越靠后岗位越少、难度越低实际情况恰恰相反第四批和后面的批次反而容易出难题和偏题因为前期已经筛掉了一大批人出题团队有更大空间去做“区分度测试”。这批笔试投递链路大概是官网投递简历、在线笔试、三轮技术面试加一轮HR面试。我身边的样本里笔试环节会刷掉六七成候选人能进入面试的基本都是算法基础比较扎实、计算机基础没有明显短板的同学。也正因为如此第四批的面试官普遍默认你已经具备了基本的编程能力不会在简单题上放水而是直接把问题往底层原理和工程场景两个方向深挖。1.2 这一批笔试面试的整体风格复盘下来第四批后端方向的笔试题有非常明显的三个特征。第一重基础、轻框架。笔试里不会直接考Spring Boot怎么用、MyBatis的XML怎么写而是考Java基础、操作系统、网络、数据库原理这些“八股”背后的理解深度。框架可以突击但基础原理短期补不上来这是面试官最想筛掉的一类人。第二算法题以经典题型为主但边界条件抠得很细。笔试两道编程题难度大约对标LeetCode Medium偏简单但如果你平时只刷题、不care代码规范很容易在空指针、数组越界、大数溢出这类细节上翻车。第三技术面试喜欢“连环追问”。一个问题不会止步于“你知不知道”而是会顺着你的回答一直往下问直到问到你不会为止。比如你说知道HashMap那面试官就会追问JDK 7和JDK 8的底层结构差异、扩容时链表插入顺序、为什么线程不安全、ConcurrentHashMap是怎么优化的。这种问法考察的是你知识的深度和边界感。2. 笔试环节的两个大坑编程题思路和基础选择题的边界2.1 编程题的高频类型与应对策略第四批笔试的算法题从当时参与过的同学复盘来看主要集中在四个方向字符串处理、数组与链表操作、DFS/BFS搜索、简单动态规划。没有特别偏门的计算几何、数论或复杂图论这也就意味着只要你有针对性地刷过剑指Offer和LeetCode Hot 100笔试编程题是能拿到不错分数的。拿一类出现频率很高的题型举例最长无重复字符子串。这类题在LeetCode上是Medium难度暴力的做法是两层循环枚举所有子串再判断每个子串内部是否有重复字符时间复杂度是O(n^3)在笔试环境下非常容易超时。比较标准的做法是用滑动窗口加哈希表右指针不断右移扩张窗口左指针在发现重复字符时跳到上一次出现位置的下一个位置这样整体复杂度只有O(n)。我建议你在笔试前把这类“看似是字符串题实际上是双指针题”的题目整理成一份清单重点练滑动窗口、双指针、前缀和三种思路。因为字节笔试的判题环境比较严格不会给部分分如果暴力写法超时整道题就是零分。平时练习时每道题做完之后至少再想一遍“最坏情况是什么、有没有更优解法”这会比单纯刷题量大要有效得多。2.2 基础选择题里最容易翻车的四个知识模块笔试不光有算法题还有一批基础选择/填空题。这些题单看每个知识点都不算难但它们经常组合起来考一不留神就掉坑。我根据当时的复盘把翻车率最高的四个模块列在下面。Java基础值传递与引用传递、String不可变性、equals和hashCode的契约关系、ArrayList和LinkedList的适用场景。操作系统进程与线程的区别、死锁的四个必要条件、虚拟内存与分页、上下文切换开销。网络TCP三次握手与四次挥手、TIME_WAIT状态的作用、TCP与UDP的区别、HTTP与HTTPS的握手过程。数据库MySQL索引底层为什么用B树、事务的ACID特性、四种隔离级别分别解决什么问题。很多同学会忽略操作系统这个模块觉得后端开发用不上。但实际上字节这类重视基础的公司校招笔试里操作系统题目占比不低。你至少要能解释清楚为什么线程切换比进程切换开销小死锁产生的必要条件是哪四个虚拟内存解决了什么问题如果你现在时间紧迫我建议优先把网络和数据库两块吃透这两部分在笔试和面试中出现的频率最高而且它们和生活直觉比较接近容易快速上手。操作系统可以放到第二优先级Java基础则是必须达到“张口就能说清楚”的程度。提示笔试时遇到不会的选择题不要慌。大多数基础选择题的选项之间有明显层级关系比如“进程是资源分配的基本单位线程是CPU调度的基本单位”如果你记住这些关键定义很多题都可以排除两个以上错误选项。3. 技术面试的三种追问链并发、缓存、系统设计都是连环炮3.1 从HashMap到ConcurrentHashMap并发基础怎么准备才不会被追问打穿第四批后端方向的面试第一轮技术面往往从一个非常“日常”的问题开始HashMap的实现原理是什么如果只听你回答“底层是数组加链表”面试官会继续追问直到把你问到墙角为止。我梳理了一条当时出现频率很高的问题链。HashMap底层数据结构是什么JDK 7和JDK 8分别是什么结构为什么JDK 8要把链表转成红黑树阈值为什么是8HashMap的扩容机制是怎么样的扩容时元素的索引如何重新计算HashMap为什么线程不安全put操作并发时会出什么问题ConcurrentHashMap是怎么解决线程安全问题的JDK 8里的实现和JDK 7有什么不同分段锁和CAS加synchronized各自适合什么场景如果你只是背了结论没理解设计动机很可能会在“阈值为什么是8”这个问题上卡住。其实这个数字来自泊松分布的统计结果在随机哈希码的情况下链表节点数达到8的概率已经非常低约为一千万分之六所以用8作为链表和红黑树的转换阈值是为了在时间和空间上取得平衡。准备这类问题时我的方法是画一张“问题链地图”把每个核心知识点写成节点用箭头连接“为什么会问到下一个问题”。比如HashMap为什么线程不安全自然引出ConcurrentHashMap而ConcurrentHashMap的实现又引出了锁粒度和CAS的概念。面试前按着地图自己给自己讲一遍录音回听你会发现很多地方其实讲不清楚这些讲不清楚的地方就是查漏补缺的重点。3.2 Redis缓存穿透、击穿、雪崩区分概念只是第一步第二三轮面试中缓存几乎是必考话题。面试官通常会抛出一个业务场景让你设计缓存方案然后顺势考察你对Redis的理解深度。2018年第四批后端面试中Redis相关问题出现得尤其多可能是当时的业务量增长对缓存依赖越来越重的映射。绝大多数同学都能说出缓存穿透、缓存击穿、缓存雪崩的定义但面试官真正想听的是你如何应对以及为什么这样应对。缓存穿透查询一个不存在的key请求直接打到数据库。应对方案是缓存空值或者用布隆过滤器在缓存层前置判断。需要注意缓存空值的过期时间不能太长不然大量不存在的key会占满内存。缓存击穿一个热点key在缓存过期瞬间大量请求同时打到数据库。应对方案是互斥锁或者把热点key的过期时间设置得更长甚至设置为永不过期由后台任务主动更新。缓存雪崩大量key同时过期或者Redis实例宕机导致请求全部打到数据库。应对方案是给过期时间加随机因子做集群部署还可以在应用层做熔断限流保护数据库。我见过不少候选人能背出这几个概念但当面试官追问“布隆过滤器误判怎么办”或者“互斥锁加在哪个层面”时就开始支支吾吾。所以准备时不要只背名词要默认自己是一个架构师正在设计一个线上系统。可以自己问自己如果布隆过滤器判断key不存在但实际存在会发生什么如果互斥锁等待时间过长如何降级3.3 系统设计题从秒杀场景看面试官真正想考察什么第四批面试中系统设计题通常是压轴的。常见题目有设计一个短链系统、设计一个排行榜、设计一个秒杀系统。这些题目没有标准答案面试官考察的是三个能力需求拆解能力、技术选型能力和边界权衡能力。以秒杀系统为例一个典型的回答思路是首先明确核心诉求瞬时流量巨大但真正成功下单的请求占比很低。因此系统设计的目标是“挡住大部分流量而不是让所有请求都走到最后一步”。然后拆解技术方案前端层通过按钮置灰、答题验证码等方式拦截人工重复提交。网关层基于令牌桶算法做限流超出的请求直接返回“已抢完”。缓存层把商品库存提前加载到Redis用Lua脚本保证扣库存的原子性。消息队列下单请求先写入MQ由消费者异步处理订单削峰填谷。数据库层最终一致性保证库存扣减和订单生成可以不在同一事务里。这个方案的每一步都会引出追问。比如面试官可能会问Redis扣库存时如果服务宕机了怎么办MQ消费失败如何保证订单不丢这时候你要能说出持久化策略、ACK机制和重试幂等这些概念。整体来看系统设计题不需要你有真实的大厂高并发经验但需要你具备“分层设计”的思维知道每一层该干什么、会出什么错、怎么兜底。4. 简历里的技能栈取舍前后端分离、框架和“数字后端”的迷惑项4.1 项目经验怎么写框架会写和能讲清楚是两回事从当年的简历来看很多同学都会写“熟悉Spring Boot”“了解Vue前后端分离开发”这些技能在热词里也频繁出现。但面试官对这类表述其实已经免疫了。他们真正关心的是你在项目里实际做了什么解决了什么问题有没有遇到过难点。我当时帮学弟改简历时最常给的建议是不要写流水账而要写“动词加结果”。比如“使用Spring Boot开发RESTful API实现了用户登录和权限校验功能”就太普通了可以改成“基于Spring Security实现JWT无状态鉴权解决分布式场景下Session共享问题接口平均响应时间降低约XX%”。哪怕数据是自己压测出来的也比空泛的“熟悉”要有说服力。如果你简历里写了前后端分离项目面试官很大概率会问前后端如何交互跨域问题是怎么解决的登录状态是怎么保持的这些问题的答案其实并不复杂无非是HTTP协议、JSON格式、CORS、Token这些概念。你只要做过真实项目并且复盘过代码基本都能答上来。怕就怕只用了框架生成器自己没有梳理过请求从前端到后端的完整链路。4.2 容易被名字误导的方向软件后端 vs 数字后端热词里出现了不少“数字后端”“芯片后端”“Innovus数字后端”这样的词这里专门提醒一下这类岗位在芯片设计流程里指的是布局布线、时序收敛、物理验证这些环节和互联网公司的后端开发服务端开发完全是两个方向使用的工具链也完全不同。每年都有同学因为没仔细区分投错了岗位等到面试时才发现面试官问的问题自己完全没准备过。所以投递简历前一定要仔细看岗位描述里的技术栈关键词如果出现Spring、Redis、MySQL、分布式这些就是软件后端如果出现Verilog、布局布线、时序约束、Innovus、Virtuoso这些就是芯片后端。求职方向不要跑偏准备也要跟着岗位走。4.3 工程化技能点到为止Jenkins、Maven和Node.js的正确打开方式2018年的校招候选人普遍在工程化工具上比较薄弱。大多数人只会在IDE里点击运行没有命令行打包、部署的经验。我当时在简历里看到“熟悉Maven”的人不少但被问到“Maven的生命周期有哪些阶段”就答不上来。其实这个问题不难哪怕没有系统学过只要用Maven打包过几次项目就能说出validate、compile、test、package、install、deploy这几个主要阶段。对于Jenkins这类CI/CD工具我的建议是不需要精通但至少要有一个“会搭一条最简单的流水线”的经验。你用Maven构建一个Spring Boot项目然后通过Jenkins拉取代码、执行构建、部署到服务器这一套流程跑通就足够在简历里写“了解持续集成基本流程”。Node.js的情况也类似如果你在后端项目里用过npm管理依赖写过简单的Node.js服务完全可以写进简历但要诚实地标明“了解”而不是“精通”。5. 如果让我重新准备一次基于第四批考点整理的学习路线5.1 按模块拆解的时间规划表如果你现在距离校招还有3到4个月可以参考我整理的这条路线。它并不复杂但每一步都需要产出“可展示的成果”。时间段核心内容复习目标与产出第1-2周Java基础理解String、集合、异常、IO、反射能画出ArrayList和HashMap的底层结构图第3-4周并发编程掌握synchronized、volatile、Lock、AQS、并发容器能画出线程状态转换图第5-6周计算机网络与OS默写TCP三次握手四次挥手能解释TIME_WAIT掌握进程线程、死锁、虚拟内存第7-8周MySQL与Redis能解释索引为什么用B树掌握事务隔离级别能描述缓存穿透/击穿/雪崩解决方案第9-10周框架与项目完成一个高质量后端项目使用Spring Boot、RESTful API、JWT鉴权、Redis缓存第11-12周模拟面试与刷题LeetCode专题刷题数组、链表、字符串、树、DP每天对着镜子/录音复述原理这个表格不是死规定但整体逻辑遵循“先语言、后系统、再数据库、最后项目”的顺序。有一个常见错误是很多同学一开始就扑在Spring Boot上结果问到底层原理时暴露得很快。框架可以让你简历好看但真正让你通过面试的是计算机基础。5.2 刷题到底刷多少、刷什么关于算法刷题第四批笔试给我们的启示是与其追求刷题量不如追求“每道题都能讲清楚思路”。我当时给学弟的标准是剑指Offer的五十多道题每道至少二刷LeetCode Hot 100至少一刷热门专题数组、链表、字符串、二叉树、动态规划的正确率要稳定在七成以上。刷题时养成一个习惯每道题做完用几句话总结它的核心思路。比如“这道题用了双指针因为数组有序”“这道题用了动态规划状态转移方程是XXXX”。总结得清楚说明你真的理解了。面试官手写算法题时其实更看重你的解题流程先确认题意、再讨论思路、最后写代码。很多人一上来就闷头写写到最后发现思路不对反而印象更差。5.3 表达训练原理讲得清楚比背得熟更重要我见过不少简历很漂亮的候选人却被一场面试打回原形原因只有一个会做不会说。比如你问他进程和线程的区别他说“进程是资源分配的基本单位线程是CPU调度的基本单位”然后就没了。这其实只能算“知道”不算“理解”。更好的表达方式是加入类比和场景。我会这样讲进程就像一家餐厅有自己的厨房、餐桌和仓库线程就像餐厅里的服务员他们共享这些资源但各自负责不同的客人。如果两个服务员同时改一张订单就可能产生数据不一致的问题所以需要加锁。这种表达方式更容易让面试官相信你真正理解了概念而不只是背了定义。练习方法是每周挑3个知识点用“是什么、为什么、怎么做”三段式给自己讲一遍有条件的话找个一起准备秋招的同学互相提问。当你发现自己已经能把并发、缓存、事务这些话题讲得顺畅而不打磕巴时面试的把握就会大很多。6. 最后聊点实在的这批面试题给我的三点启发面试结束后的复盘比面试本身更重要。我当年见过不少同学面完就觉得自己“挂了”不愿意去回想题目和答案这其实非常可惜。第四批这批题目给我最大的启发是后端面试并不会追问所有细枝末节它只会在几个核心知识树上不断加深所以与其追求知识的广度不如在关键知识点上挖得足够深。第一点启发是原理永远比API重要。你会用Redis的set命令不算本事能解释清楚Redis为什么快、单线程模型解决了什么问题、持久化怎么保证不丢数据才是面试官真正想听的。第二点启发是项目经验的关键是“真实”。哪怕你只是做了一个课程设计级别的项目只要你把每一步都吃透了面试官其实能感受到。最怕的是简历上写了五六个项目面试官稍一追问就露馅。第三点启发是面试中的沟通能力是可以练习的。面试不仅是考试也是交流你讲得清楚、问得主动面试官对你的印象分就会高很多。如果你正在准备后端校招把这篇文章里的考点清单当成一面镜子对着查漏补缺。不用焦虑自己还有多少没看按着知识模块一个一个啃每天能讲清楚一个核心知识点三个月后的你会比现在强非常多。祝顺利。