ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基础架构岗笔试复盘:底层原理与系统设计硬核解析

基础架构岗笔试复盘:底层原理与系统设计硬核解析 2023年春招季基础架构方向的笔试和往年一样没有虚的全是硬功夫。我参加了第二批笔试整体感受是题量不算大但每道题都在往底层深挖单纯靠刷LeetCode根本拿不下系统设计、网络协议、内核调优这些才是重头戏。这篇复盘我拖了一阵子才写就是想等结果出来结合后面面试被追问的情况给大家一份更完整的参考。如果你是准备投递基础架构岗位的同学或者已经在做业务开发、想往基础设施方向转这篇内容会很对你的胃口。我尽量把考察范围、每题背后的思路、答题时踩过的坑、以及后续面试中被延伸追问的点都拆开讲清楚你可以直接当成一份备考地图来用。1. 基础架构岗笔试到底在筛什么人1.1 和普通后端笔试的区别基础架构岗笔试第一眼看上去和普通后端笔试挺像的编程题、选择题、问答题都有。但细看就会发现它的筛选逻辑完全不一样。业务后端笔试更像是在检查你的代码能力——能不能把业务逻辑写清楚、能不能在限定时间内AC几道题考的是快和准。基础架构岗笔试则更关注工程底子它想验证的其实是你有没有能力去维护一套大规模系统的基础设施。我举几个对比就懂了算法题普通岗位是纯解题基础架构经常会结合LRU缓存设计、跳表、时间轮这些实际组件来出题。操作系统普通岗位可能停留在进程线程区别基础架构会考到协程实现、内存分配器、内核态与用户态的切换开销。网络普通岗位考TCP三次握手就够了基础架构会追到TCP内核参数调优、连接队列溢出、TIME_WAIT对高并发的影响。分布式普通岗位可能不涉及基础架构这部分占比非常大。所以我在考场上最大的感受是这不是一场单纯的代码考试更是一场你有没有认真拆过底层组件的摸底。1.2 这批笔试题量的整体画像第二批笔试整体时长120分钟题量控制在合理的范围内大概单选与多选10题左右覆盖OS、网络、存储、分布式基础。问答题2~3题考的是方案设计逻辑。编程题2题一题偏数据结构和经典算法另一题偏并发/系统建模实现。这个结构对于没有准备的人来说是很容易翻车的。因为如果你只会刷题选择题可能就要被淘汰一半问答题更是很难扯出有深度的内容。倒不如说这批笔试本身就是一个劝退器帮你提前看清基础架构方向对底层功底的硬性要求。2. 核心考点逐项拆解从题目到背后的原理2.1 操作系统与Linux不止是背命令基础架构岗笔试里操作系统是绝对的大头而且考察方式一点都不死板。它不会直接问你进程和线程的区别而是会给你一个具体的场景让你判断应该用什么。我印象里有个选择题是给了一个高并发网络服务要求线程资源开销最小、又能利用多核四个选项分别是多线程阻塞IO、多进程同步IO、协程异步IO、单线程事件循环。这题表面上是考模型选择实际上是在考你对用户态切换、内核态切换开销、IO多路复用的理解。平时如果没有真正写过网络框架很容易凭感觉选错。还有一道关于Linux内存的问题什么情况下会发生swap抖动怎么排查这里考察的是你对free、vmstat指标的理解以及cgroup内存隔离的概念。基础的答案是物理内存不足时触发swap但细致一点的要从swappiness、内存回收机制、页缓存写回这些角度去答。我在答题时给自己的一个提醒是凡是涉及Linux的问题尽量往实际工具和参数上靠。比如遇到如何定位CPU负载高你要能说出top看负载、mpstat看每个核心、perf看热点函数而不是只写一个用top看一下。阅卷人会从这种细节里判断你到底是背过面经还是真碰过线上问题。2.2 网络协议从握手到底层参数的深挖网络部分的考题不会只停留在TCP三次握手。它会往前推一步追问握手队列的问题。比如有一道题问服务端SYN队列满了会有什么现象客户端表现是什么如何定位和解决这个问题我后来在面试也被追问了。正常的答题逻辑是现象客户端connect超时或非常慢服务端丢弃SYN包。定位netstat -s查看SYN dropped计数ss -lnt查看Send-Q大小。解决调大tcp_max_syn_backlog配合somaxconn和应用的listen backlog。这里有个容易漏掉的细节TCP全连接队列和半连接队列是两个东西很多人混在一起谈。全连接队列溢出时表现完全不一样那时候netstat看到的不是SYN丢弃而是accept返回缓慢甚至丢连接。答题时如果能主动区分两个队列并说明各自排查命令会专业很多。还有一道HTTP协议相关的题HTTP/1.1和HTTP/2的主要差异以及为什么HTTP/2可以多路复用。这题虽然不难但想答出深度需要提到队头阻塞的原因HTTP/1.1的问题是同一个TCP连接上的请求必须串行而HTTP/2引入二进制分帧层不同Stream的帧可以交错发送。这种问题如果不理解协议设计动机很容易答成HTTP/2更快这种语文答案。2.3 并发编程与多线程两种经典出题方向并发这块出了两种风格的题。第一种是并发工具的选择题给一个多读少写的缓存场景问用什么并发容器。很多人第一反应是ConcurrentHashMap实际上更合适的答案是读写锁或CopyOnWriteArrayList取决于你会不会容忍读多份快照。这种题目考的是并发工具适用边界不是会用就行。第二种是开放建模题要求你设计一个简单的任务调度系统支持定时任务、延迟任务、周期性任务。需要保证异常重启后任务尽量不丢。这道题其实考察面很广要拆成几个层次存储层任务存MySQL还是Redis为什么触发层怎么判断任务到时间了轮询扫表还是Redis过期监听一致性分布式环境下多个调度节点会有重复执行问题怎么保证其实最多执行一次这道题我花了不少时间原因是它没有标准答案但处处都是给分点。你每考虑一个问题比如DB表要加状态字段和重试次数就离完整方案更近一步。基础架构岗位日常就是在这种约束下做选型所以它想考察的逻辑很简单你面对一个模块时会不会自然地拆分它的数据流和并发问题。2.4 存储与缓存从使用到一致性存储这块考了两类问题索引原理和缓存一致性。索引原理那道题很经典为什么MySQL使用B树而不是B树或跳表大部分人能答出B树矮胖、IO次数少、叶子节点链表适合范围查询但要拿满分还需要点出B树非叶子节点不存数据、磁盘预读友好这些点。有个多选题甚至问到了聚簇索引vs二级索引的回表问题这是MySQL性能分析的必考点。缓存一致性问得比较有陷阱是问先更新数据库再删除缓存方案下如果删除缓存失败会有什么问题很多人会背出最终一致性这几个字但说不清具体流程。我答题时直接分两步描述先更新DB成功后删除缓存。若删除缓存失败则旧值一直留在缓存里后续请求都会读到脏数据。解决办法是引入重试机制或者用binlog订阅异步删缓存。这题考察的不只是缓存知识更是你对数据链路上每个环节失败会怎样的判断能力。基础架构岗位的日常工作很多时候就是在这种看起来对但极端情况会出错的地方做防御设计。2.5 编程题一道算法题和一道系统建模题编程题一共两道。第一道偏向基础算法实现一个带过期时间的LRU缓存。这个题经常考但它的难点在于并发安全——你需要在get时判断是否过期过期要惰性删除还要在put时判断容量满了要淘汰最久未使用的。如果时间允许再加一个定时清理过期项的线程分就更稳了。用Java写的话通常直接用LinkedHashMap加removeEldestEntry再套一个ReentrantLock。不过我不建议在笔试里直接用LinkedHashMap因为这样无法展示你对哈希链表原理的理解。我当时是用HashMap双向链表手写的虽然代码量大但思路清晰阅卷人也更容易给分。第二道编程题是一道系统建模题设计一个多生产者多消费者的无界消息队列要求支持阻塞获取并统计积压量。这个题和第一题不一样它考的是并发原语的组合能力。最简单的实现是ReentrantLock配合两个Condition。完整答题还要考虑到队列无界会不会造成内存膨胀积压量统计是否需要精确是否需要持久化后面两个问题就是面试延伸点笔试时先把核心机制写对扩展问题留给备注说明。3. 答题策略复盘怎样让一份笔试答卷看起来像架构师写的3.1 先表达思考过程再写结论基础架构岗的笔试题尤其是问答题阅卷人不会只看你结论对不对还会看你推导过程是否专业。比如为什么选Redis做缓存如果只写因为Redis快那基本拿不到分。更好的写法是Redis基于内存且单线程模型减少锁竞争支持丰富数据结构适合多种缓存场景支持过期、持久化、集群容灾运维成熟但要考虑缓存击穿、雪崩等防护措施。这种写法会显得你在做技术选型而不是在背八股。其实很多选择题也适用这个思路——排除法时要写清楚为什么排除某个选项因为有些多选是多选少选不得分的你写清理由哪怕最后漏选阅卷人可能也会给部分过程分。我考完以后复盘发现问答题最大的收益反而不是答得多对而是你的答案可以让对方看出你的思维模型。一个习惯做业务功能的人会把方案讲得非常具体比如接口名、表结构都要写出来但基础架构岗位更需要的是抽象模型能力比如对这个模块的核心数据流、瓶颈点、扩展性做分析。笔试题问答题尤其偏好后者。3.2 编程题的核心不是AC而是边界处理大部分同学的误区是编程题只要AC了就万事大吉。但基础架构岗的笔试阅卷人会特别关注边界条件的处理。拿LRU缓存举例普通练习只要考虑容量和访问顺序就够了。但带过期时间的版本你需要额外处理过期key的惰性删除get时发现时间戳过期直接返回-1并删除节点。容量清理时的过期key剔除如果满了优先淘汰已过期项都未过期再淘汰最久未使用。并发下get和expire的安全不能出现get正在判断是否过期清理线程已经删除该节点结果get又把它加回去的情况。这些边界问题如果笔试时没有提前想到后面面试被追问会非常尴尬。我自己的经验是先把一个朴素版本写完然后花时间逐项列出如果发生极端情况怎么办再在代码里补保护和备注。笔试时间有限不用追求完美但你备注里的思考过程能让阅卷人看到你的工程意识。3.3 时间分配120分钟到底怎么切我是这样分配时间的选择题部分控制在25分钟以内不会的题不要死磕先标出来回头再看。问答题部分每道控制在15~20分钟关键是列出框架和关键词不要在一道题上写小作文。编程题部分优先保证第一题完整实现第二题至少写出核心数据结构和并发控制逻辑留10分钟检查边界。这个分配方案的核心思路是编程题不仅看结果也看过程问答题一定要留足时间因为那是展示工程思维的主战场。选择题就算错两三道问答题只要答得有深度总分依然能拉回来。4. 常见丢分点与后期面试延伸的避坑指南4.1 丢分点概念背得熟场景判断却出错选择题部分我丢分比较多的是网络和操作系统这种看起来简单、选起来容易错的题。比如有一道题问服务端TCP全连接队列满了客户端connect会怎样选项里有个connect一定会失败是错的正确的现象是connect成功但因为accept没及时处理后续读写才异常。这个点如果不清楚说明对TCP状态机理解还停留在表面。解法只有一个多用工具观察真实系统的行为。比如你自己写一个server不调用accept再用ss -lnt观察Recv-Q涨到上限然后客户端connect你会发现connect本来是成功的只有数据收发才会出问题。这类实验做一次比你背十遍八股都有效。4.2 丢分点只答结论不展示推导过程问答题最大的丢分点就是一句话结论。比如如果让你设计一个分布式锁你怎么做有人写用Redis setnx这就没了。这题要答好至少要说使用Redis String类型set key value EX seconds NX保证原子性锁的value需要带上唯一标识释放时先判断再删除防止误删别人的锁加锁后必须设置过期时间防止持有者崩溃导致死锁可用Redisson看门狗解决锁超时但业务未执行完的问题还要考虑Redis主从切换时的锁丢失。你把这些写出来阅卷人就知道你是认真考虑过生产环境问题的而不是只会调用函数。4.3 面试延伸笔试内容只是导火索笔试卷子交上去很多题目会变成面试时的深挖点。比如笔试里你写了LRU缓存面试官会追问哈希冲突频率高时链表变长怎么办并发读写时怎么保证性能Redis本身没有用传统LRU而是近似LRU你怎么看这种情况下最怕的就是笔试时只背了答案面试时原形毕露。我的建议是在备考阶段就把每个考点理解透不要指望短期突击。可以给自己列一个清单比如今天我搞懂了TCP全连接队列溢出那么明天就去看半连接队列这样逐个击破。还有分布式事务问题笔试问答题可能只是让你简述方案面试会追问细节TCC空回滚和悬挂问题怎么解决本地消息表如何保证最终一致性这些都是在逼你把听过变成真懂。4.4 整理一份自己的易错知识速查表备考期间我维护了一份自己的易错清单遇到错题就记一笔。给大家截取几条参考知识点易错点正确理解TCP全连接队列以为connect必然失败connect成功读写才可能异常HashMap扩容只关注扩容阈值并发下可能死循环是JDK7问题JDK8改用尾插Redis过期策略以为只有惰性删除惰性删除定期删除组合B树说是为了索引快核心是减少磁盘IO和范围查询高效进程线程以为线程切换不要开销用户态切换也有栈切换和缓存失效开销这份表格的价值在于考前半小时快速过一遍比再刷一套模拟题有用得多。5. 基础架构岗笔试之外长期积累的几个实用方向5.1 动手做一个迷你版基础组件笔试能过说明基础还不错但基础架构岗真正的挑战在面试和入职之后的系统设计。我的建议是不要停留在刷题尝试用一个周末做一个迷你组件。比如实现一个简化版的内存KV存储要求支持简单的SET/GET/DEL命令支持TTL基于TCP的通信协议能处理粘包半包至少有一种持久化策略AOF或快照并发访问安全。这个小项目做完你会发现笔试里考的操作系统、网络、并发、存储全部串起来了。而且这些代码可以变成面试时很好的谈资。5.2 看源码和文档的正确姿势基础架构方向看源码是绕不开的。但不要一上来就啃Spring基础架构岗更多是看中间件源码比如Redis、Kafka、Netty。初次看的时候建议按这个顺序先看官方文档理解核心概念和设计目标再画模块图搞清数据流和线程模型最后才深入源码看关键类怎么实现。以Netty为例先了解Reactor模型、EventLoop、ChannelPipeline如何协作再读NioEventLoop的run方法你对IO多路复用和JDK多路复用器封装的理解会瞬间立体起来。笔试考到这类题你也不再怕。5.3 Linux性能排查能力是隐性考点笔试不会让你现场操作服务器但试题里处处渗透着对Linux性能排查能力的考察。比如选择题问CPU使用率100%了怎么定位问答题问某进程内存持续增长怎么排查编程题问如何用shell统计日志里某个IP出现次数。基本功一定要练top、vmstat、iostat、netstat、ss、perf、strace这些工具至少要熟练两三个。尤其是perf和strace可能很多同学没用过但它们是定位线上疑难杂症的利器。平时不妨在本地起一个高CPU小进程用perf top去看看热点函数长什么样这个手感面试时根本装不出来。6. 最后几件考后想通的事第二次笔试过去之后我最大的感受是基础架构岗要的不是题库型选手而是模型型选手。笔试里的大部分题其实都在反复验证你脑子里面有没有一副关于计算机系统如何协作的完整图景请求到了网卡之后如何进入内核内核如何唤醒线程数据如何从内核缓冲区拷到用户态应用层如何并发处理IO结果如何落盘、如何同步到副本如果这幅图景是完整的那么无论笔试题目怎么包装你都能迅速定位到它考察的底层模块。如果这幅图景是碎片化的那就算背再多面经换个问法也会露馅。备考期间我把自己平时积累的排查笔记、源码阅读笔记都翻出来过了一遍很有帮助。也建议你在准备基础架构岗位时用文档记录每一个你亲手验证过的现象并把它们按照OS、网络、存储、分布式分好类。长期下来你会发现这不是给别人看的笔记而是你思考系统的方式。这批笔试过去就过去了但基础架构这条路上的排查能力和底层理解确实需要持续砸时间。方向选对了剩下的就是一点点把系统打穿。
返回列表