在刷校招真题这件事上我一直有个体会笔试和面试是两套完全不同的考察逻辑。面试考的是你“能不能说清楚”笔试考的是你在限时高压下“还能不能写出靠谱的东西”。小红书2020校招测试开发后端笔试题卷一就是一套很典型的互联网公司校招笔试卷覆盖面广、基础题占比高、编程题不算偏但很吃熟练度。这篇文章不打算贴原题答案而是把这套卷背后真正想考察的能力模型拆开按题型板块逐个分析出题意图、核心考点和应对策略。无论你是准备测试开发岗还是后端岗只要是想进互联网公司做技术这套卷的复习思路都能直接用。1. 这套笔试卷的定位先筛“基本功”再筛“思维习惯”1.1 从试卷结构反推招聘方的出题逻辑2020年小红书校招的测试开发和后端岗位笔试通常采用线上限时答题的形式题型大致分为四类选择题/填空题、简答题、编程题、场景设计题。和很多大厂一样这套卷子并不是为了考倒你而是为了在几千份简历里快速筛出两类人第一类是基础扎实、写代码不手生的第二类是遇到开放式问题时思路清晰、能给出可落地方案的。我当时拿到这类卷子的第一反应是选择题覆盖面特别广从计算机网络、操作系统、数据库到Java/Python基础都有而且很多题是“看着熟悉但一不小心就选错”的类型。这说明出题人很看重基本功的准确性而不是你对某个框架的熟练度。基础题答得好不好往往决定了你能不能进下一轮面试。1.2 为什么测试开发和后端共用一套卷很多人会疑惑测试开发和后端方向不一样为什么笔试往往共用一套卷或者大部分题目重叠原因很简单在校招阶段公司更看重候选人的计算机基础、代码能力和逻辑思维具体岗位所需的业务知识进组之后可以再培养。尤其在小红书这类业务迭代快的公司测试开发工程师需要能看懂后端代码、定位问题根因甚至直接写接口测试和工具脚本和后端的技术栈交集非常大。所以你在准备这套卷时不要抱着“我只考测试开发后端知识不用看”的心态。TCP/IP、MySQL索引、Java并发这些内容测试开发岗一样会考而且场景设计题里还会让你站在测试角度去分析后端的实现是否合理。两边的知识是打通的。1.3 这套卷的核心考察维度我梳理了一下大致可以归纳成五个能力维度能力维度考察形式典型内容计算机基础选择题、简答题网络、操作系统、数据结构编码能力编程题算法题、手写工具类后端开发基础简答、场景题数据库、缓存、并发、Spring测试思维场景设计题用例设计、自动化思路工程素养开放题项目难点、线上问题排查这套能力模型放到现在的校招里依然完全适用。你可以对照这张表看看自己哪一块最薄弱优先补。2. 算法与数据结构笔试里“性价比最高”的拿分板块2.1 TopK问题堆排序思路是基本功校招笔试的编程题最常见的一类就是TopK从海量数据里找最大或最小的K个数。小红书这套卷子里也出现了类似题目核心不是让你把数组排序后直接取前K个而是考察你对复杂度的理解。排序法的时间复杂度是O(n log n)在面试官眼里基本等于不合格。更优的方案有两个用大小为K的最小堆维护TopK大的数时间复杂度O(n log K)或者用快速选择Quick Select平均时间复杂度O(n)。笔试环境下我建议优先写堆排序实现因为代码模板固定、不容易出错而且面试官一眼就能看出你懂大数据场景下的内存限制问题。// 找前K个最大的数维护大小为K的最小堆 public ListInteger topK(int[] nums, int k) { PriorityQueueInteger minHeap new PriorityQueue(k); for (int num : nums) { if (minHeap.size() k) { minHeap.offer(num); } else if (num minHeap.peek()) { minHeap.poll(); minHeap.offer(num); } } return new ArrayList(minHeap); }注意一个细节如果你用PriorityQueue默认就是最小堆不需要额外传比较器。很多人在笔试时容易在这一步画蛇添足结果写错了比较逻辑。2.2 LRU缓存淘汰手写能力是试金石LRULeast Recently Used几乎是校招笔试、面试的“钉子户”题目。原因很简单它考察的是数据结构组合能力也直接对应Redis内存淘汰、本地缓存设计等真实业务场景。实现思路核心是“哈希表双向链表”哈希表保证O(1)查找双向链表保证O(1)插入和删除。每次get或put都把节点移到链表头部链表尾部就是最久未使用的节点淘汰时删尾部即可。很多人在笔试时图省事直接用LinkedHashMap实现class LRUCache extends LinkedHashMapInteger, Integer { private int capacity; public LRUCache(int capacity) { super(capacity, 0.75f, true); this.capacity capacity; } public int get(int key) { return super.getOrDefault(key, -1); } public void put(int key, int value) { super.put(key, value); } Override protected boolean removeEldestEntry(Map.EntryInteger, Integer eldest) { return size() capacity; } }如果你笔试时间紧用LinkedHashMap是能过的。但如果时间允许建议还是写双向链表版本因为面试官后续追问起来你说不出底层结构会很减分。这块没有捷径就得练到闭着眼能写出来的程度。2.3 字符串与数组的边界条件失分重灾区编程题里还有一类“看起来很简单一提交就报错”的题集中在字符串处理和数组操作上。比如反转字符串、判断回文、合并两个有序数组等等。这类题难的不是思路而是边界条件。我见过太多人在“合并两个有序数组”这道题上翻车题目要求在nums1原地合并有些人没有从后往前遍历结果把nums1前面的元素覆盖了还有人没处理其中一个数组为空的情况。这些都是可以在平时练习中刻意规避的。我的建议是每次写完算法题先自己过一遍边界用例——空输入、单元素输入、两个输入长度不一致、数值为负数或0。养成这个习惯之后笔试时能少丢一半的分。3. 后端基础考点并发、网络、操作系统的高频陷阱3.1 线程池参数设计七嘴八舌里的“标准答案”后端岗的笔试卷里Java并发几乎是必考板块。其中线程池相关的题出现频率极高因为它在实际项目里用得最多又最容易用错。核心考点是ThreadPoolExecutor的七个参数核心线程数、最大线程数、空闲存活时间、时间单位、阻塞队列、线程工厂、拒绝策略。问你“核心线程数怎么设置”时不能只背公式要分场景说CPU密集型任务核心线程数设为CPU核数1主要目的是减少线程上下文切换IO密集型任务核心线程数可以设大一些常见经验值是CPU核数×2因为线程在等待IO时可以让出CPU混合型任务可以拆分成CPU密集和IO密集两个线程池分别设置参数。拒绝策略也是常考点AbortPolicy直接抛异常、CallerRunsPolicy由调用者线程执行、DiscardPolicy静默丢弃、DiscardOldestPolicy丢弃队列里最旧的任务。生产环境一般用CallerRunsPolicy或自定义策略直接抛异常的AbortPolicy容易导致业务中断。3.2 ConcurrentHashMap从1.7到1.8的变化为什么重要并发容器也是选择题和简答题的常客尤其是ConcurrentHashMap。JDK 1.7版本的实现是分段锁Segment数组锁粒度是一段JDK 1.8版本改为CASsynchronized锁桶数组的每个节点锁粒度更细并发度更高。笔试里常见的坑是有人说“ConcurrentHashMap所有操作都是线程安全的不需要额外同步”这是错的。它的单个操作线程安全但复合操作比如先get再put、先检查再更新仍然需要外部加锁否则会出现竞态条件。类似的还有CopyOnWriteArrayList读多写少场景很合适但写操作会复制整个底层数组频繁写时性能很差。3.3 TCP与HTTP选择题里的“必拿分”计算机网络在选择题里占比不小核心考点集中在TCP三次握手、四次挥手、TCP与UDP的区别、HTTP状态码语义等。三次握手考的是状态变化SYN_SENT、SYN_RCVD、ESTABLISHED。四次挥手中TIME_WAIT为什么是2MSL是一个高频简答题答案核心是保证最后一个ACK能到达对端同时让本连接的所有报文在网络中消失避免影响新连接。HTTP这块除了常见的200、301、404、500之外面试官还喜欢考301和302的区别301是永久重定向302是临时重定向以及PUT、POST、PATCH的语义区别。后端岗位考RESTful API设计时这些就是基础知识。4. 存储与缓存数据库和Redis的笔试高频逻辑4.1 MySQL索引从B树到覆盖索引MySQL几乎是所有后端笔试的“重头戏”。选择题爱考索引底层数据结构简答题爱考为什么用B树场景题则喜欢结合慢查询来问。B树相比B树的核心优势有两个非叶子节点不存数据只存索引键所以树更矮磁盘IO次数更少叶子节点通过双向链表串起来范围查询非常高效。你要能把这两点说清楚比背一堆概念有用得多。回表与覆盖索引是另一个常考点。假设有一张用户表建立了索引(age)执行SELECT name FROM user WHERE age 20流程是先通过age索引找到主键id再用主键id回聚簇索引查name这就是回表。如果改成建立联合索引(age, name)那这个查询所需的字段都在索引里不用回表这就是覆盖索引。笔试简答题如果问“如何优化慢查询”覆盖索引是必答的点之一。4.2 事务隔离级别与MVCC一道题能串起整个知识树事务的四大特性ACID是基础但真正拉开差距的是隔离级别和MVCC多版本并发控制。MySQL InnoDB默认隔离级别是可重复读REPEATABLE READ它通过MVCC实现快照读通过间隙锁Gap Lock和临键锁Next-Key Lock防止幻读。你如果能把这条线串起来讲清楚考官会觉得你是真的懂而不是背了面试题。常见简答题是“可重复读和读已提交有什么区别”核心区别在于MVCC生成ReadView的时机RC读已提交是每条SQL语句都生成新的ReadViewRR可重复读是事务第一次执行SELECT时才生成ReadView并且事务内复用。这才是“可重复读”名称的真正来源。4.3 Redis单线程模型与缓存三大问题Redis在笔试卷里的地位和MySQL不相上下。高频考点包括Redis为什么快、五种基本数据结构、持久化机制RDB和AOF、缓存穿透/击穿/雪崩的区别与解决方案。“Redis为什么快”的常规答法是基于内存、单线程避免竞争、IO多路复用。但单线程这句话要注意Redis 6.0引入了多线程IO但命令执行仍然是单线程。选择题如果问“Redis是否支持多线程命令执行”答案是支持网络IO的多线程但关键命令执行仍是单线程。缓存三大问题是场景题常考缓存穿透查询一个不存在的数据缓存和数据库都没有请求直接打到数据库。解决布隆过滤器、缓存空值缓存击穿某个热点key过期瞬间大量请求同时打到数据库。解决互斥锁、逻辑过期缓存雪崩大量key同时过期或者Redis宕机。解决过期时间加随机值、集群高可用。4.4 缓存一致性聊到业务场景的加分项测试开发岗的场景题会倾向于问“如何验证缓存和数据库的一致性”后端岗则倾向于问“如何保证一致性”。不管是哪个角度核心方案是Cache Aside Pattern先更新数据库再删除缓存。为什么不是先删缓存再更新数据库因为并发下容易出现旧数据回填缓存的问题。更新数据库后删除缓存虽然极端情况下数据库主从延迟也会导致不一致但相对可控。你能在笔试里写出这个方案分析出它的优缺点就已经超过大部分候选人。5. 测试开发专项从笔试题看测试思维怎么考察5.1 测试用例设计等价类和边界值是基本功这部分是测试开发岗和其他岗区别最大的地方。笔试卷里一定会出现一道用例设计题考的就是你在有限时间内能不能把用例想全。最典型的一道题是给一个登录功能要求设计测试用例。很多人只会写“输入正确的用户名和密码能登录成功”“输入错误密码提示错误”这能拿到的分非常有限。完整的答题思路至少包含这些维度功能测试正确账号登录、错误密码、账号不存在、密码为空、账号为空、密码大小写敏感、输入框前后空格处理边界值密码长度上限、下限账号长度上限兼容性不同浏览器、不同操作系统安全测试SQL注入、暴力破解锁定、验证码有效期性能并发登录、弱网环境用户体验错误提示是否清晰、按钮是否可重复点击。这里的关键是分维度回答而不是零散地枚举用例。用表格列出“测试类型-测试场景-预期结果”会让阅卷人一眼看出你的测试思维是成体系的。5.2 接口测试与自动化写脚本的思路更重要另一类高频题是“如何对接口进行自动化测试”。它考察的是你对HTTP协议的理解和对自动化测试框架的熟悉程度。接口测试的关注点我总结为四层请求层URL、请求方法、请求头、请求参数是否正确鉴权层是否需要登录态、token是否过期、权限不足是否返回403业务层响应状态码、响应体字段、业务状态码、错误信息性能与兼容响应时间、接口是否支持不同客户端版本。自动化框架方面Java后端常用RestAssured、TestNG/JUnitPython常用requestspytest。笔试卷一般不会让你写完整的框架但会给你一段代码让你指出里面缺少哪些断言或者让你设计一个参数化测试的用例集。5.3 测试开发岗要懂多少后端知识很多准备测试开发岗的同学会问我需不需要会写后端代码我的答案是不需要精通但必须能看懂。测试开发工程师日常要能读懂接口实现逻辑、定位是前端问题还是后端问题甚至要能通过日志排查线上故障。所以这套卷里会出现大量后端题目并不是为难你而是岗位本身需要。实际操作层面我建议你至少能独立完成这些事读懂一个Spring Boot Controller层的代码、看懂MyBatis的SQL映射、会通过curl或Postman验证接口、会写简单的Shell脚本或Python脚本处理数据。6. 框架与项目Spring、Spring Boot与前后端分离的高频问答6.1 Spring IoC与AOP一句“控制反转”背后要说清楚什么后端岗的简答题几乎必考Spring最基础的就是IoC控制反转和AOP面向切面。很多人一句话带过但拿不到满分。IoC的核心是对象创建权和生命周期管理权从程序员手里反转给了容器。为什么需要倒置因为对象之间的依赖关系如果都通过new来创建代码耦合度会非常低可控。用一个生活化的类比以前你自己买菜、做饭、洗碗自己管理依赖有了IoC容器就相当于请了个管家你要吃什么直接说管家把做好的菜端上来容器注入依赖。AOP则适合处理横切逻辑比如日志、事务、权限校验。它的实现原理是动态代理JDK动态代理基于接口和CGLIB动态代理基于继承。Spring Boot默认使用CGLIB代理这是一个容易被问到的细节。6.2 Spring Boot自动配置从“约定优于配置”说起Spring Boot最核心的思想是“约定优于配置”。笔试简答题里经常问“为什么Spring Boot能自动完成配置”答案是EnableAutoConfiguration注解。原理大致是Spring Boot在启动时通过SpringFactoriesLoader加载META-INF/spring.factories文件读取其中配置的自动配置类再通过ConditionalOnClass、ConditionalOnMissingBean等条件注解判断当前环境是否需要加载这个配置类。比如你引入了spring-boot-starter-webSpring Boot就自动帮你配置Tomcat和DispatcherServlet没引入就没配置。能把这个链路描述出来就是高分答案。6.3 前后端分离与跨域后端岗位的必答问题现在前后端分离已经是绝对主流笔试试卷里也经常出现跨域相关的问题。核心是浏览器同源策略限制了跨域请求但后端为了支持前端调用需要正确配置CORS。具体到实现Spring Boot里配置CORS有两种方式在Controller方法上用CrossOrigin注解或者在配置类里实现WebMvcConfigurer的addCorsMappings方法。后者更适合全局配置。笔试时如果你只回答“配一下跨域就行”是不够的还需要说清楚三种跨域方案的区别CORS后端配置响应头、JSONP利用script标签不受同源限制、反向代理前端将请求代理到后端域名。生产环境最常用的是CORSJSONP只支持GET请求且已逐渐被淘汰。6.4 场景设计题短链接与秒杀系统的设计逻辑校招笔试最后的大题通常是系统设计虽然没有面试时那么深但很考察你的工程思维。测试开发和后端岗都会遇到。短链接系统的核心是把长URL映射成短URL需要设计哈希算法生成短码、存储映射关系一般用MySQLRedis缓存、重定向逻辑301还是302、过期策略。这道题考察的是你有没有全局思维能想到缓存、DB、重定向这么多层面的问题。秒杀系统设计题更考验并发功底。核心考点包括将请求尽量拦在上游CDN、网关限流、Redis预减库存、MQ异步下单、接口幂等性、防超卖乐观锁或Redis原子操作。你在纸上画出请求链路然后分节点说清楚每个环节解决什么问题就是一份非常好的答案。7. 备考路线与避坑指南时间有限怎么刷才有效7.1 刷题优先级基础题吃透比刷难题重要结合这套卷子的考察范围我给备考刷题列一个优先级第一优先级数据结构与算法高频题TopK、LRU、字符串处理、二叉树遍历、动态规划入门题。每天至少2道保持手感。第二优先级Java并发、MySQL索引与事务、Redis缓存。这三块是后端高频考点也是测试开发岗需要掌握的知识。每块花2-3天系统梳理。第三优先级Spring框架、Spring Boot自动配置、HTTP协议、操作系统基础。这些以选择题和简答题为主需要细致记忆概念和参数。第四优先级场景设计题、测试用例设计题。这类题需要思路训练不用每天练但考前一定要每种类型写一遍。7.2 三个常见的备考误区误区一只看不写。笔试编程题是要在编译环境下运行的光看题解和光记思路远远不够。很多人“看懂了”但一上手就写不出来就是因为练得太少。误区二只刷难题忽视基础。校招笔试不是一个拉开差距的地方而是一个筛掉不合格者的地方。你把选择题的基础题正确率从80%提到95%比死磕一道困难动态规划题有用得多。误区三不写用例设计就上考场。测试开发岗的用例设计大题分值通常不低但很多同学根本没有专门练过。考前至少把登录、注册、购物车、订单、搜索、支付这几个高频场景各写一遍并对照评分点检查是否覆盖了功能、边界、兼容、安全、性能等维度。7.3 做题顺序与时间分配线上笔试的时间一般在一个半小时到两个小时。编程题如果是3道建议先做自己最有把握的题不要在一道题上死磕超过30分钟。行测类的选择题控制在30秒到1分钟一题不会的可以先标记跳过最后再回来考虑。写编程题时先写注释把思路列清楚再写代码这样即便代码有小bug阅卷人也能看到你的思路。这道题如果只要结果不看过程那也值得花30秒写注释理清思路避免写着写着忘了自己要做什么。我个人的习惯是做完所有题之后如果还有剩余时间优先检查选择题里那些“看着熟悉但不完全确定”的题因为编程题正误相对确定而选择题很容易因为一个小概念记错而丢分。8. 最后说点刷真题之外的个人体会带过几届校招生之后我越来越觉得笔试题本身透露的信息量远大于“能不能通过”这个结果。一套合格笔试卷往往能反映出一家公司技术团队在乎什么。小红书2020这套卷明显更看重复合能力测试开发工程师和后端工程师的知识边界是模糊的因为实际工作里这两类角色经常需要互相补位。所以我建议你在备考时不要把自己框死在“我只投测试开发”或者“我只投后端”的标签里。多花点时间把计算机基础打扎实把编码能力练到位把数据库和缓存这些最强通用的底层知识吃透你面对任何一家公司的笔试卷都会更有底气。题库和面经可以帮你定位重点但不能替代你真正把知识串成体系。拿LRU来说你能手写双向链表版本你就同时理解了LinkedHashMap的实现原理、Redis内存淘汰的基础思想、以及本地缓存设计的常用策略——这就是一道题串起一整片知识点的价值。这套卷子虽然是2020年的但里面的考点放到现在依然有效。把基本功练扎实把算法题的手感保持住把每个知识点背后的原理想明白我相信校招笔试这关一定难不倒你。