
小红书2020校招笔试题卷三测试开发后端复盘考点拆解、解题思路与避坑实录每年校招季都有大量同学被测试开发和后端这两个方向的笔试题卷搞得焦头烂额。我手上正好翻到一份小红书2020年的校招笔试题卷三虽然时间过去几年但这类大厂笔试的考察逻辑和知识点范围其实年年都差不多换汤不换药。这份卷子既考后端的基础功底又考测试开发的业务思维对于准备校招的同学来说复盘价值很高。这篇文章我就从岗位差异、核心考点、典型题型和备考策略四个维度把这份卷子拆开揉碎结合我自己的刷题和面试经验聊聊一份合格的笔试答卷到底该怎么写适合正在准备大厂校招的测试开发、后端岗位候选人参考。1. 试卷背后的考察逻辑与岗位差异1.1 为什么一份卷子同时覆盖测试开发与后端把测试开发和后端放进同一份试卷是很多大厂的常见操作。小红书这类以内容社区和电商为核心业务的平台技术团队需要同时保证后端服务的稳定性和业务质量的可控性两类岗位在笔试题上会有交集但侧重点完全不同。从出题逻辑来看后端岗位更看重对系统设计、数据结构、数据库、网络协议等底层功底的掌握程度核心是“能不能把功能做出来、做稳定”。而测试开发岗位除了要具备一定的代码能力还要额外考察测试思维、用例设计、自动化框架理解、问题定位能力核心是“能不能把质量守住、把问题找出来”。所以你会发现一份卷子里会有共用题目比如基础算法、数据库查询也会有针对不同岗位的附加题或选做题。1.2 测试开发与后端考察维度的核心差异我在辅导学弟学妹的过程中经常被问到“测试开发是不是比后端简单”。其实不存在简单的说法只是考察维度不同。后端岗位的题目往往更偏重深度比如让你设计一个高并发下的缓存方案或者在限定资源下优化某个接口的性能。测试开发岗位则更偏重广度加工程化思维比如给你一个功能模块让你列出完整的测试用例或者让你设计一套自动化测试流水线。以这份试卷为例共用的编程题部分后端和测试开发都需要完成但针对测试开发的附加题可能会考察你对接口返回结果的断言能力、对异常场景的覆盖能力而后端的附加题则可能是让你分析一个线上问题的排查思路。这提醒我们备考时必须锚定自己的目标岗位不要用一套思路去应对所有题目。1.3 大厂笔试题的通用出题原则大厂笔试的出题原则基本可以归纳为三个基础扎实、思维清晰、工程落地。基础扎实指的是数据结构、操作系统、网络、数据库这些计算机基本功这是所有岗位的必考题。思维清晰指的是面对开放式问题时能否条理分明地给出分析和方案而不是想到哪写到哪。工程落地则是看你能不能把理论转化为可运行的代码、可执行的测试计划而不是只会背概念。小红书2020校招笔试题卷三整体上遵循了“由易到难、由基础到综合”的节奏前面部分是选择题和基础问答题后面是编程题和场景设计题。这种设计其实很考验时间分配能力很多人栽在前期小题上纠结太久导致后面的大题没时间写这个坑我后面会单独展开讲。2. 测试开发方向核心考点拆解2.1 测试用例设计题的答题框架测试开发笔试卷里几乎必考的就是给你一个功能让你设计测试用例。这份试卷里出现的登录功能测试用例设计是个特别经典的题目几乎所有大厂都考过。很多同学答题时只会写“输入正确账号密码能不能登录成功”这一条显然拿不到高分。完整的测试用例设计应该覆盖功能测试、接口测试、兼容性测试、安全测试和性能测试几个维度。功能测试里又包括正常场景、异常场景和边界场景。以登录为例正常场景不仅仅是正确账号密码还包括记住密码、自动登录、切换账号等衍生功能。异常场景要覆盖密码错误、账号不存在、账号被锁定、验证码过期。边界场景则是密码长度的最大最小值、账号含特殊字符、输入框前后空格等。接口测试维度需要关注返回码是否正确、错误信息提示是否准确、并发登录时是否有竞态问题。兼容性测试要覆盖不同操作系统、不同浏览器、不同分辨率下的表现。安全测试要关注是否有SQL注入风险、密码传输是否加密、是否支持暴力破解防护。性能测试则要关注高并发下登录接口的响应时间和成功率。把这些维度展开来写一份测试用例设计题就能写出十几条高质量的测试点得分自然就上去了。2.2 自动化测试与测试框架的高频考点自动化测试相关题目在这份卷子里也有不少主要集中在Selenium的使用、接口自动化测试流程、断言的设计原则这几个方向。Selenium的考察点主要是元素定位方式id、name、class name、xpath、css selector的优劣对比以及显式等待和隐式等待的区别。很多同学容易把Page Object模式忽略掉实际上在大厂笔试中问“如何设计一个可维护的UI自动化测试框架”时Page Object几乎是标准答案的核心。接口自动化测试的考点则更接近后端工程实践。请求方法的选取GET和POST的语义区别、鉴权方式token、cookie、签名、断言设计状态码断言、业务码断言、数据校验断言这些都是必考内容。值得一提的是断言设计有一个重要原则就是“断言结果而不断言过程”不要只检查HTTP 200就认为接口没问题要深入到业务返回码和数据字段层面校验。做接口自动化测试时数据构造和数据清理经常容易被忽视但在笔试中写出来会加分。每次跑完测试后如果测试数据没有清理干净会影响下一次执行的结果所以规范的自动化框架里必须有数据准备和数据清理的钩子函数。在答题时主动提到数据管理方案会让面试官觉得你确实有实践经验。2.3 常用Linux命令与日志排查必考题测试开发日常工作中大量时间花在环境部署和线上问题排查上所以Linux命令是笔试中不可避免的考点。这份试卷里涉及的考点包括查看进程ps -ef | grep java、查看端口占用netstat -tlnp、日志查看tail -f、grep、awk、sed、文件权限管理chmod、chown、定时任务配置crontab等。很多同学容易忽略的知识点是awk和sed的高级用法。比如在日志中统计某个接口的请求次数和平均响应时间用awk可以一行命令搞定这类场景在工作中几乎天天碰到。另外查找大文件和清理磁盘空间也是高频场景du -sh *、df -h、find / -size 100M这类命令组合要熟练到不用思考。日志排查类题目通常会结合具体场景比如“线上接口超时如何从日志入手排查问题”。完整的排查思路应该是先确认现象哪个接口、什么时间段、成功率多少再查看应用日志有没有异常堆栈、慢查询日志接着查看依赖服务数据库慢查询、下游服务响应时间、缓存命中率最后查看系统资源CPU、内存、磁盘IO、网络带宽。把这个排查链路写清楚比背多少命令都管用。2.4 测试开发的数据结构与算法侧重点测试开发岗位的编程题通常不会特别难但也不会白送分。常考的题型包括字符串操作反转、去重、最长子串、数组操作排序、查找、双指针、基础的递归和动态规划、LRU缓存设计、单例模式手写。这些题目的核心不是考察你能写出多高级的算法而是考察代码规范性和边界处理能力。以字符串反转为例多数人能写出来但能考虑到null值处理、空字符串、包含空格、包含Unicode字符的边界情况的就少了一大截。以LRU缓存为例不少测试开发同学会被这个题目卡住但其实只要用LinkedHashMap在Java里几行就能实现关键是要理解LRU本身的淘汰策略内核再延伸到Redis内存淘汰策略这样答题时既有代码实现又有理论深度。我建议测试开发方向的同学刷算法题时不需要死磕太难的数据结构但常见题型的代码要写得又快又干净因为笔试时间有限编程题往往是决定能否进入面试环节的关键。3. 后端方向核心考点拆解3.1 Java基础与并发编程的必考内容后端方向在这份试卷里以Java技术栈为主考察内容最集中的就是集合框架和并发编程。集合框架的高频考点包括ArrayList和LinkedList的区别、HashMap的底层实现原理、ConcurrentHashMap在JDK 7和JDK 8中的不同实现方式、HashMap在并发场景下的死循环问题。这些内容几乎属于必答题没有太多技术含量但需要理解底层原理而不仅仅是背结论。以一个常见考法为例问“HashMap为什么线程不安全”如果只回答“因为多线程同时put会导致数据覆盖”只能得基础分。要拿高分得说清楚JDK 8之前头插法在多线程扩容时可能出现环形链表导致get死循环JDK 8改为尾插法后死循环问题解决了但put时如果两个线程同时检测到需要扩容一个线程的数据会被另一个线程覆盖丢失。把底层机制讲清楚才会让面试官觉得你是真懂。并发编程方面synchronized和ReentrantLock的区别、volatile的可见性和指令重排、ThreadLocal的原理和内存泄漏风险、线程池的核心参数和执行流程都是高频考点。特别是线程池考察概率极高。核心线程数、最大线程数、阻塞队列、拒绝策略这四大参数的组合逻辑以及不同业务场景下如何选择参数一定要形成自己的答题套路。例如IO密集型和CPU密集型任务的核心线程数设置策略差别很大笔试里把这个分析透会比较出彩。3.2 MySQL索引原理与SQL优化后端笔试题里的MySQL部分几乎不会绕过索引这个话题。这份试卷中考察了B树索引结构、聚簇索引和非聚簇索引的区别、联合索引的最左前缀原则以及explain执行计划中type字段的含义。看起来很常规但能写全写透的人其实不多。最左前缀原则是我见过最多人背了但理解不到位的内容。举个例子联合索引(a, b, c)查询条件只用了b和c就完全用不上这个索引。但如果查询条件用了a和c那么只有a能走索引c是走不了的因为跳过b之后索引就断了。很多人误以为“条件里有a就算走索引”其实要区分“走索引”和“索引覆盖”两个概念这在答题时是明显的分水岭。SQL优化类的题目本质上考的是能不能先分析再动手。面对一个慢查询第一步不是加索引而是先用explain看执行计划确认是全表扫描还是索引失效再针对具体原因做优化。常见的索引失效场景比如在索引列上做函数运算、隐式类型转换、like以通配符开头、使用or且一侧无索引每一条都要能举出实际的SQL例子。事务隔离级别、MVCC机制、乐观锁和悲观锁的实现方式也是后端笔试的常客需要串联起来形成一个完整的知识体系。3.3 Redis缓存与高并发场景设计后端岗位笔试中Redis的考察重点是缓存穿透、缓存击穿、缓存雪崩三大经典问题及其解决方案。这三个概念极其相似但本质上完全不同。缓存穿透是查询一个不存在的数据请求直接打到数据库缓存击穿是某个热点key过期瞬间大量请求同时打到数据库缓存雪崩是大批量key同时过期导致数据库压力骤增。把这三个场景当成同一件事处理是很多人在笔试中丢分的主要原因。针对缓存穿透常见的解决方案是布隆过滤器或者缓存空对象两者各有优缺点布隆过滤器节省空间但有误判率缓存空对象实现简单但需要设置较短的过期时间。针对缓存击穿最佳方案是互斥锁即当key过期后只允许一个线程去查询数据库并重建缓存其他线程等待该线程完成。针对缓存雪崩解决思路是过期时间加随机值、多级缓存、熔断降级这些方案可以组合使用。后端笔试还有一类常考的高并发场景设计题比如设计一个秒杀系统设计一个短链接服务设计一个排行榜功能。这类题目考察的是系统设计的全局观。秒杀系统的核心难点在“减库存”的原子性和“限流”策略思路一般是将请求尽量拦截在缓存层通过Redis原子操作扣减库存再异步落库。答题时如果能画出一个请求链路图并标出每一层的作用和瓶颈会显得非常专业。3.4 网络协议与Linux系统知识网络协议方面重点考察TCP和UDP的区别、TCP三次握手和四次挥手的过程、TIME_WAIT状态的含义和处理方式、HTTP和HTTPS的区别、HTTP状态码的语义。这些知识点需要达到的条件反射级别因为在面试环节几乎必问。TIME_WAIT状态是一个特别容易被深挖的知识点。主动关闭连接的一方在发送最后一次ACK之后会进入TIME_WAIT状态持续2MSL时间。原因有两个一是确保最后的ACK能被对方收到如果丢包可以重发二是让旧连接的数据包在网络中完全消失避免影响新连接。在线上高并发场景下如果服务器主动断开大量连接可能会出现TIME_WAIT连接过多导致端口耗尽这时候一般通过开启tcp_tw_reuse和调整tcp_timestamps来解决这个从原理到实践的链路是面试官最喜欢的考察方向。Linux系统知识在后端笔试中主要考察进程线程模型、孤儿进程和僵尸进程的区别、IO模型阻塞、非阻塞、多路复用、异步、零拷贝技术等。其中epoll相对于select和poll的优势是常考题目重点要讲清楚epoll的三个关键操作epoll_create、epoll_ctl、epoll_wait和就绪列表机制以及为什么epoll在大规模连接场景下性能更好。4. 高频编程题型的解题思路与代码模板4.1 大数相加与大数相乘的实现思路校招笔试的编程题经常考大数处理因为Java的基础类型和常用库不能直接处理超出范围的大数运算。这份试卷中的编程题部分也出现了大数相乘的变体。核心思路是用数组模拟手工乘法先把两个数按照位拆开存成int数组然后用双重循环逐位相乘并累加最后统一处理进位。以字符串形式给出两个数字字符然后相乘为例算法复杂度是O(n*m)n和m分别是两个数字的长度空间复杂度是O(nm)。我在答题时习惯用一个长度为两者长度之和的int数组保存中间结果因为两个数相乘的乘积位数不会超过两个因数位数之和。然后从后往前遍历数组处理进位最后把数组中前导的0去掉再转换成字符串输出。在笔试现场写这道题时有两点特别容易出错。一是字符转数字的细节字符0转成整数0需要减48或者减0别在细节上翻车。二是处理进位的顺序一定要从低位到高位逐步处理而且要记得最高位可能还有进位。写完代码后建议手动跑一个用例比如99乘99验证结果是否为9801这是最保险的自测方式。4.2 最长不重复子串滑动窗口的标准写法滑动窗口是校招笔试中出现频率最高的算法技巧之一最经典的载体题目就是求字符串的最长不重复子串长度。这道题看着简单但很多人在笔试现场写不出bug-free的版本主要原因是窗口边界的移动逻辑没想清楚。标准解法是维护一个窗口用HashMap保存每个字符最近一次出现的位置用右指针遍历字符串每次遇到新字符时更新左指针的位置为当前左指针和该字符上一次出现位置加一的较大值然后更新结果和字符位置。这个思路的关键在于左指针只会向右移动不会回退所以整体时间复杂度是O(n)。我在刷题过程中总结了一个自查清单字符串为空时返回值应该是0、字符串长度为1时返回值应该是1、全重复字符时返回值应该是1、全不重复时返回值应该是字符串长度。把这几个边界场景在草稿纸上跑一遍函数返回正确就不用担心了。笔试时如果时间紧张完全没有思路的话可以采用滑动窗口和哈希表这套组合拳来应对大量字符串类题目。4.3 手写单例模式与线程安全的取舍后端和测试开发同样经常考到手写单例模式因为单例模式本身不难但可以顺带考察并发知识、类加载机制和反射知识。最常要求写的是双重检查锁DCL版本代码并不复杂但要求解释为什么使用volatile关键字。volatile在DCL单例中的作用是禁止指令重排序。new Singleton()这一步在JVM层面不是原子的包含分配内存、初始化对象、将引用指向内存地址三个步骤如果另一个线程在这三步执行到一半时判断instance不为null就会拿到一个初始化未完成的对象。volatile可以保证对instance的写操作对其他线程立即可见并且禁止重排序这保证了一个线程看到的要么是null要么是完全创建好的实例。在答题时除了DCL版本主动提到静态内部类方式和枚举方式会让面试官印象更好。枚举方式是最推荐的因为枚举天然防止反射攻击和序列化破坏而反序列化可以破坏其他单例实现。虽然笔试手写代码时写枚举可能感觉不太常见但我建议把三种方式都准备好并且能说清楚为什么枚举在安全性和简洁性上更胜一筹。4.4 数据库手写SQL的经典场景笔试中的SQL手写题出现频率最高的是这几类分组统计、多表关联、排名取TopN、行列转换。这份试卷里考察了一个电商场景下的订单统计要求查询每个用户的最新订单和累计消费金额核心考点是子查询和窗口函数。窗口函数在这类题目中非常高效使用ROW_NUMBER()按用户分组、按时间排序把每个用户的最新订单标号排为1然后外层过滤。累计消费金额则用SUM() OVER(PARTITION BY user_id)实现。在面试时用窗口函数通常比传统GROUP BY要好因为窗口函数能同时保留明细数据和聚合数据代码也更易于阅读。很多人在笔试时容易忽略的一个细节是SQL执行顺序。WHERE在GROUP BY之前执行HAVING在GROUP BY之后执行所以在WHERE中不能使用聚合函数但HAVING中可以用。ORDER BY在最后执行可以使用SELECT中的别名。如果笔试时发现在条件里用了聚合函数且报错大概率是把WHERE和HAVING用反了。5. 备考策略与笔试题实战经验5.1 笔试时间分配与答题节奏我见过太多同学在笔试中因为时间分配失误而失败的案例。大厂笔试的核心考察点不只是“你会不会”还有“你在压力下能不能输出”。以一份90分钟的试卷来看我建议的节奏是前10分钟浏览全部题目标记出会做、半会不会、完全不会三类题目然后优先做完全会做的题保证基础分不丢再做半会不会的题尽量多拿步骤分最后有时间再去啃完全不会的题。选择题和填空题不要犹豫太久一道题超过2分钟还没思路就先蒙一个标记好等全部做完再回头看。编程题至少要留出40分钟因为编译运行、调试边界条件都需要时间。很多人倒在做题顺序上先扎进编程题里死磕一道结果其他简单题全都没时间碰。更理性的做法是先把简单题做完心里有底了再集中火力攻难题。5.2 错题本与刷题路线的搭建方法准备大厂笔试不建议拿一本算法书从头啃到尾那是低效的复习方式。我的建议是以“高频题型刷题验证”的方式搭建知识体系。先把笔试题中最高频的主题梳理出来比如字符串、数组、二叉树、动态规划、LRU、手写SQL针对每一个主题刷20道左右代表性题目刷完总结出一套模板的写法。错题本是备考过程中最值的投资。每道错题不用抄完整代码只记录三样东西题目类型、我的错误点、正确的解题思路关键词。考前复习时只看错题本效率比重新刷一遍题高得多。我当年备考时错题本大概积累了200条记录考前用两天时间全部过了一遍相当于把最容易犯的错误系统性地清扫了一遍。对于测试开发方向的备考除了算法题之外一定要额外花时间准备测试用例设计题和自动化框架设计题。这部分没有统一的标准答案但对考察者来说“答题是否有结构、是否考虑全面、是否结合了实际测试经验”是最核心的评判指标。从现在开始拿一个你熟悉的APP功能模块试着用我前面提到的维度列一份完整的测试用例清单这个练习比做十套模拟题都管用。5.3 面试简历中的项目经验与笔试的呼应笔试和面试是连锁环节笔试中表现出的知识漏洞在面试中会被进一步追问。我在准备校招时总结了一个经验笔试结束后立刻把自己没有把握的题目全部复盘一遍把正确的思路和答案整理下来因为在面试时很可能被问到“笔试中某道题的思路再讲讲”。同样地简历上写的项目经历一定要和你笔试中涉及的技术点保持一致性。如果你的简历写了熟悉Redis但笔试中Redis相关的题目做得不好面试官会盯住这个矛盾点深挖。简历中每个技术点都要准备好一个能讲清楚的真实应用场景并能把场景背后的技术原理闭卷讲出来。5.4 一些值得反复咀嚼的实践体会说几个我自己刷题和笔试过程中反复体会到的教训。第一代码不是写出来就完事了自测一定要在草稿纸上做一遍。我吃过太多次亏写完认为对一运行就发现数组越界笔试现场调试时间非常宝贵。第二不要只刷题不复盘刷100道题不复盘不如刷30道题每道都吃透。第三遇到不会的题千万不要空着能写多少写多少。笔试是在有限时间内展示你掌握的知识哪怕是部分思路或者伪代码也能向考官传达你的思考过程空着就一点分都没有。最后再分享一个我近年来辅导备考时的观察笔试只是起点面试考察的是你有没有持续学习和自我迭代的能力。一套2020年的笔试题放到今天来看核心考点其实没有本质变化。能把这些基础功扎扎实实掌握好的同学即便遇到没见过的题型也能凭借稳定的底层知识做出合理推断。考前的焦虑都来自准备不充分把该刷的题刷透把该总结的坑总结完上考场时自然就有底气。