公司动态
运维开发笔试通关指南:核心知识模块与实战策略
那天晚上我在牛客网上答完最后一道编程题系统提交成功的瞬间我靠在椅背上缓了好几秒。网易有道这轮运维开发提前批笔试给我的感觉不像是一场考试更像是在用两小时逼着你把过去几年攒下的Linux、网络、数据库和代码功底全部倒出来。这篇文章没有题目原文我不会去回忆具体考题而是想把这个岗位笔试背后的考察逻辑、知识权重、典型题目形态和踩坑细节拆开聊聊给后面准备运维开发方向校招的同学一个能落地的复习地图。1. 岗位认知先行运维开发笔试到底在筛什么样的人先说个很多人容易误解的事。运维开发很多时候也叫SRESite Reliability Engineering不是“懂运维就行开发是加分项”。从笔试的题目设置就能看出来网易有道这类一线互联网公司要的是两边都硬的人——你得能看懂Linux系统调用和TCP状态机也得能写出健壮的Python脚本去处理几千万行的日志。笔试本身通常分为三个部分客观题单选多选、编程题、以及可能出现的场景简答题。客观题覆盖Linux、操作系统、网络、数据库、缓存中间件、Shell和编程语言基础编程题一般是两道左右难度介于LeetCode简单到中等之间场景题更灵活会给你一个线上故障或者架构需求让你写排查思路或设计方案。提前批的笔试和正式批有个明显区别时间更紧筛人更狠。提前批的目的是抢人面试官会认真看笔试成绩尤其是编程题几乎是一票否决。我身边有同学客观题答得不错但编程题一道都没AC直接被挂了。换句话说编程题是硬门槛基础题是分水岭场景题是加分项。为什么这么设计因为运维开发的日常工作状态就是早上收到告警你需要在五分钟内定位是网络问题、代码问题还是资源问题下午要写自动化脚本把某个重复性的发布操作跑起来晚上还要跟进一个容量评估的需求。笔试筛的就是这几项能力的基本盘一个都不能瘸腿。2. 核心知识模块拆解哪些是必得分哪些是拉分项我按照自己在笔试中实际遇到的题目分布把知识模块分成了几个梯队。第一梯队是Linux和网络出现频率最高几乎每道客观题都在考第二梯队是操作系统、数据库和Shell第三梯队是缓存中间件、容器、编程语言细节。下面一个一个说。2.1 Linux与操作系统这不是“会用”是“懂原理”Linux题目在运维开发笔试里的地位等同于算法题在研发岗里的地位。除了最基础的命令top、ps、netstat、df、grep、awk、sed我建议你把注意力放在这几类问题上进程管理、文件系统、系统调用和性能排查。进程相关的题考察点集中在僵尸进程和孤儿进程的区别、进程状态切换、父子进程关系。比如经常会问你一个子进程退出但父进程没有调用wait()这个子进程会变成什么状态答案是僵尸进程。这种题不难但特别容易在选项里挖坑比如把“孤儿进程”和“僵尸进程”混在一起。系统调用的题也不少fork()、execve()、open()、read()这类基础调用会结合进程、文件描述符来考。核心是要理解文件描述符表、文件表项和inode的关系理解fork之后父子进程共享了什么、拷贝了什么。你要是只背命令不懂底层原理这类题会很吃力。文件系统方面inode耗尽但磁盘空间还有剩余这种经典问题要搞懂。它考察的是文件系统元数据和数据块的分离运维中经常遇到笔试也爱考。还有硬链接和软链接的区别这个几乎是必考题不要只看“硬链接不能跨文件系统”要理解目录项、inode和引用计数的关系。性能排查类的选择题会给一个top输出或者vmstat截图让你判断系统瓶颈在哪。这个需要你真正用过这些工具而不是看文档背出来的。我建议实习或者自己搭环境的时候多跑几遍搞清楚us、sy、wa、st这几个CPU时间片分别代表什么遇到负载高第一反应应该是看哪个指标。对比Linux和操作系统两张皮操作系统的理论题范围会更大一些进程与线程的区别、死锁的四个必要条件、虚拟内存与页表、进程调度算法、IO多路复用select/poll/epoll、用户态和内核态切换。这些是计算机基础理论上科班同学都学过但笔试的考法很细。比如IO多路复用会问你epoll相比select的优势在哪答案要点是“不再需要遍历所有fd而是由内核直接返回就绪事件列表”以及“mmap减少内存拷贝”。2.2 网络基础TCP的状态机必须背到条件反射网络是另外一个重头戏。HTTP、HTTPS、TCP、UDP、DNS、CDN这些基本概念不用多说关键是深度。TCP的三次握手和四次挥手你不仅要会画图还要知道每个状态字段的含义尤其是TIME_WAIT。笔试经常这么出主动断开连接的一方关闭连接后进入什么状态为什么需要这个状态你有没有能力解释清楚TIME_WAIT存在的目的——一个是保证最后一个ACK能够到达对方另一个是让旧连接的报文段在网络中消逝。TCP的拥塞控制也会考慢启动、拥塞避免、快重传、快恢复这四件事的触发条件要区分清楚。UDP和TCP的对比题基本送分但要注意流控制和无连接这两个选项的辨析。HTTP方面的题目除了考状态码还喜欢问HTTP/1.1和HTTP/2.0的区别、Keep-Alive的作用、Cookie和Session的关系。我遇到过一道题是给一串HTTP响应头让你判断是否开启了长连接这就是在考Connection: keep-alive这个字段。CDN的题目在这个岗位的笔试里比其他岗位多因为在线教育业务对CDN的依赖很大。你需要理解回源、边缘节点、缓存命中率、HTTPS证书部署这些概念知道CDN是怎么通过DNS调度把用户请求分到最近的节点的。这里容易出现拉分题因为很多同学只在八股文里见过CDN但不理解实际业务怎么用它。还有一个高频考点是DNS解析过程。迭代查询和递归查询的区别、本地DNS缓存、TTL的作用、DNS的UDP/TCP双模式正常情况下用UDP 53端口响应超过512字节时切换到TCP这些都要能说清楚。2.3 数据库与中间件MySQL的索引原理是必答项数据库的题大部分围绕MySQL展开。索引相关的题目最多聚簇索引和非聚簇索引的区别、联合索引的最左前缀原则、覆盖索引的含义、索引失效的场景。笔试不会让你手写SQL调优但会给你一个带WHERE条件的查询语句问它能不能命中某个索引或者让你判断索引建立的合理性。这种题的关键是理解B树的结构理解为什么最左前缀原则成立。事务和隔离级别也常考。四种隔离级别读未提交、读已提交、可重复读、串行化以及它们分别能解决脏读、不可重复读、幻读中的哪些问题这是数据库选择题的标准套餐。MySQL默认的可重复读隔离级别是如何通过MVCC实现的innodb在可重复读下怎么避免幻读间隙锁这两个问题属于拉分题能答上说明你真的读过源码或者深入过原理。Redis在运维开发笔试里出现的频率不低。基础的数据结构String、Hash、List、Set、ZSet和应用场景要掌握缓存穿透、缓存击穿、缓存雪崩这三个概念几乎必考它们的区别别搞混——穿透是查询了一个不存在的key击穿是热点key过期瞬间大量请求打到数据库雪崩是大面积key同时过期。RDB和AOF两种持久化机制的优缺点也要能对比说出来。Kafka或消息队列的题看公司业务有道这类偏在线教育的公司会考一些基础概念分区partition、消费者组、消息的可靠性投递和消费、消息堆积怎么处理。不深但你要知道这些名词在实际运维中对应什么问题。Nginx的题值得单独拎出来说因为它太常考了。反向代理和负载均衡的常见策略轮询、权重、IP hash、Nginx的工作进程模型master和worker、以及Nginx和Apache的区别这些都是选择题常客。更细一点的会问Nginx的epoll模型是怎么处理高并发的这时候需要你的网络IO知识来支撑。2.4 编程语言与Shell用代码解决运维问题的能力编程语言在运维开发岗位里一般主推Python或者Go笔试的编程题用这两种语言写都行。Python的话装饰器、生成器、GIL、深拷贝浅拷贝、列表和字典的时间复杂度、异常处理、with语句的上下文管理原理这些是按考点来复习的。Go的话goroutine和channel的用法、GMP模型、指针和值类型的区别、defer的特性前三个在选择题里出现率很高。Shell脚本的题不要忽视。给一段Shell脚本让你猜输出结果或者让你写个命令统计日志里某个字段的出现次数这类题非常贴近日常工作。核心是掌握grep、awk、sed、sort、uniq、xargs、cut这些文本处理命令的组合用法以及变量的默认值展开、$?、$这些特殊变量的含义。我印象最深的一道题是问“awk中NF和NR的区别”NF是当前行的字段数NR是已经处理的总行数这两个如果不常用真的会记混。编程题部分结合运维场景来出的概率很大。经典题型包括日志文件解析统计比如统计访问量Top N的IP、超大文件排序去重、模拟CPU/内存监控并输出告警、用脚本来处理某个系统配置文件的增删改查。这些题都不考复杂算法考的是你熟练使用语言的能力能不能写出高效、边界处理完善、能直接跑的代码。刷题重点可以放在字符串处理、哈希表、排序、以及文件读写这些方向上。3. 从真题形态倒推复习策略典型题目这样解笔试不可能靠背题但可以通过分析题目形态来制定复习策略。我挑三类自己遇到过的、很有代表性的题目形态从解题思路上做个拆解。3.1 日志统计型编程题最容易练也最容易丢分这类题有个典型的问法给你一个几十万行的访问日志文件每行包含日期、IP、请求URL、状态码等字段要求统计每个IP的访问次数输出Top 10并按次数降序排列。看似简单但很多人在笔试环境里会暴露出问题。用Python写的话核心就是读文件字典计数排序输出。但有几个细节决定你能不能AC一用with open来读取别忘记指定编码二逐行处理而不是一次性read()到内存否则几GB的文件直接内存爆炸三解析字段时用split()的时候要确认分隔符有时候IP前面有空格有时候是制表符写之前先看数据样例四排序输出的时候注意题目要不要格式化比如每行输出“IP 次数”还是“次数 IP”。from collections import Counter counter Counter() with open(access.log, r, encodingutf-8) as f: for line in f: parts line.strip().split() if len(parts) 2: continue ip parts[0] counter[ip] 1 for ip, cnt in counter.most_common(10): print(f{ip} {cnt})这段代码在笔试里大概率能拿满分但如果你平时不写这种脚本现场容易卡在Counter的用法或者排序上。我建议提前把文本处理类题目练到闭着眼能写因为运维开发笔试的编程题大概率不会脱离这个范畴。唯一要注意的是笔试有时候会把日志字段换成JSON格式让你用json库来解析那就多一个json.loads()的使用。3.2 选择题里的“概念坑”以TCP状态题为例选择题里最容易丢分的不是难题而是看起来简单、实际上到处是陷阱的题。有一类题是给你TCP的状态转换图然后问客户端主动关闭连接发出FIN之后客户端会进入什么状态选项里混着FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT、CLOSE_WAIT。如果你只是背过“四次挥手FINACKFINACK”但没记住每一步的状态名就很容易选错。正确流程是客户端发送FIN进入FIN_WAIT_1服务端收到后回复ACK客户端进入FIN_WAIT_2服务端发送自己的FIN进入LAST_ACK客户端收到后回复ACK进入TIME_WAIT等待2MSL后关闭。这个过程中服务端收到FIN之后会进入CLOSE_WAIT这个状态恰恰是排查连接泄漏时最常看到的。笔试就喜欢把CLOSE_WAIT和TIME_WAIT放在一起让你区分。复习的时候建议把整个状态转换图画一遍标注出每个箭头对应的触发条件和动作而不是只背四条消息的名字。3.3 场景简答题用“黄金五分钟”思路稳住局面场景题在运维开发笔试里出现的概率不低它更像是一个简化版的口头系统设计题。常见的问法比如线上服务突然出现大量502错误你会怎么排查或者某个接口响应变慢请给出排查步骤。这种题没有标准答案但阅卷人想看的是一套结构化的排查思路。我总结了一个万能的“黄金五分钟”排查顺序先看监控大盘确认影响范围和是否有变更再看机器负载和网络带宽排除基础设施问题然后看进程和日志定位应用层异常最后看依赖服务数据库、缓存、下游接口确认是否被拖垮。答题的时候把顺序写清楚每个步骤后面补一句“我要看什么指标、用什么命令”分数就不会低。还有一个容易被忽略的点场景题里提到的技术名词要准确。比如你说“用top看CPU”最好能补一句“看us和sy的占比如果sy很高说明系统调用频繁”你说“查看日志”最好能写一下用什么命令、过滤什么关键字。这种细节会让你的答案看起来像是真正干过活的人写出来的。4. 实战现场记录从进场到交卷的时间与心态管理笔试的过程管理是很多人忽略的拉分项。提前批笔试通常在线进行用牛客或者其他笔试平台摄像头监控全程大约90到120分钟。有几个实操层面的经验我觉得比多刷十道题更值钱。先说时间分配。我的策略是选择题每题的用时上限控制在60秒左右遇到完全没思路的先标记跳过不要恋战。因为选择题分值占比再高也高不过一道编程题AC。编程题一般放在最后做但要预留足够的余量至少60分钟给两道题。如果你选择的顺序是“按顺序作答”很容易在前面纠结太久等做到编程题只剩20分钟心态直接崩。再说平台和环境的准备。提前批笔试一般会允许你选择本地IDE写代码再粘贴上去不建议直接在白板里敲。但要注意本地IDE调试没问题不代表牛客环境没问题特别是Python版本、是否有第三方库、输入输出的格式要求。我建议提前用一个简单的“读一行输入输出处理结果”的模板测试一下平台的IO是不是符合预期。不要以为这是小事每年都有人因为忘记处理多行输入挂掉编程题。多选题的计分规则也需要看清。有的平台是多选错选得0分少选得部分分有的是只要错一个就是0分。这两种规则对应的答题策略完全不同。如果是少选得部分分遇到拿不准的选项就尽量保守只选最有把握的如果错选全扣那更要保守。我在考场上就见过有人因为多选太激进一题扣了所有分后面完全不想做了。场景题的答题框一般比较大但也不是写越多越好重点是逻辑清晰。我习惯用“一、二、三”分条列出排查步骤每个步骤控制在两三行内把关键命令和可能看到的输出写出来。阅卷人一天看几百份卷子结构清晰的答案在印象分上就有优势。还有一点容易忽略笔试过程中会穿插一些行测类的智力题比如逻辑推理、图形推理。这类题在运维开发的笔试里占比不大但会占你的时间预算。我的建议是不要在这类题上花超过一分钟能一眼看出规律就选看不出直接蒙。你真正的角逐场是专业题和编程题而不是行测。5. 笔试之后提前批的下一程才是真正的挑战如果有人以为笔试通过就万事大吉那可能要失望了。提前批的节奏非常快笔试通过后通常一周内会约面试。网易有道的面试一般有两到三轮技术面加一轮HR面技术面会继续深挖笔试里暴露的薄弱点所以笔试结束不是放松的时候而是趁热打铁补短板的时候。面试重点会放在项目经历和系统设计上。你需要准备一两个拿得出手的实践项目不是那种“照着教程搭了个监控系统”的玩具项目而是要能说清楚项目解决了什么问题、用了什么架构、遇到了什么故障、你怎么排查和解决的。我当时准备的一个项目是给一个小型服务做了容器化改造包括Docker镜像优化、Kubernetes部署、以及用Prometheus和Grafana做监控告警。面试官很喜欢追问故障处理的部分因为那是真实工作能力的直接体现。此外提前批的技术面还会手写代码难度比笔试略低但更偏向工程实现。比如手写一个线程安全的计数器、用Python实现一个带过期时间的缓存、或写一个文件内容替换的脚本。这些题目不难但要求你写出来的代码风格好、边界处理完整、能直接跑。我建议在准备面试的阶段把之前笔试做过的编程题用更严谨的方式重写一遍把变量命名、异常处理、注释习惯都调整好。从岗位匹配度来说有道这边做在线教育业务场景里涉及大量视频点播、直播互动、题库系统高并发读取所以CDN、直播推拉流、WebRTC、对象存储这些技术名词如果你在面试中能主动聊起来会是明显的加分项。去面试之前花点时间了解一下具体业务比你多刷十道算法题有用得多。关于简历上的技术栈我建议运维开发方向的简历写清楚这几个维度基础设施Linux、Shell、网络、配置管理Ansible、SaltStack、容器化Docker、Kubernetes、CI/CDJenkins、GitLab CI、监控Prometheus、Zabbix以及编程语言Python为主Go加分。每一项都要准备一个小例子方便面试官深挖。6. 备考路线图给一个月后的自己一个交代如果你离笔试还有一个月左右的时间我建议按下面的节奏来安排。第一周做基础摸底用一套模拟题找到自己的薄弱模块第二周重点补薄弱模块的基础知识搭配刷选择题第三周进入编程题专项训练每天两道日志处理或场景实现类的题目最后一周做整套试卷仿真严格计时模拟考试环境。每天晚上保持一小时的Linux命令实际练习不是光看文档是自己搭个虚拟机或者云主机把命令敲一遍。如果时间更充裕还可以在实习或者自己的实践项目里刻意使用awk、sed、Python脚本去处理真实的数据。我只想说一个朴素的道理运维开发是一个特别吃“手熟”的岗位笔试考的东西和你日常用它做的事情高度一致。你现在花时间在命令行和脚本上的每一分钟都会在笔试那两小时里以分数的方式还给你。我自己的体会是从现在开始每当你遇到一个线上问题别急着百度粘贴命令先把问题拆解清楚再动手。运维开发的工作就是在“开发”和“运维”中间搭桥你写的每一个脚本、配的每一个监控项、排查的每一个故障都是在为这个岗位积累真正带得走的能力。笔试只是一个最基础的过滤网后面的项目和面试才是真正拉开差距的地方。希望这份拆解能让你少走一些弯路祝一切顺利。