ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

运维开发笔试题全解析:从Linux到Python的核心考点复盘

运维开发笔试题全解析:从Linux到Python的核心考点复盘 1. 先搞明白运维开发笔试到底在筛选什么人说实话看到“京东2018秋招运维开发工程师笔试题”这个标题时我的第一反应是这份题虽然有些年头了但它的考察逻辑和知识点分布放到今天依然很有参考价值。运维开发这个岗位比较特殊它不是传统意义上的“运维”也不是纯粹的“开发”而是两者的交叉地带——既要懂系统、网络、数据库这些基础设施又要具备写代码、写脚本、做自动化的能力。大厂在秋招笔试阶段不可能像社招面试那样跟你深聊项目经验所以笔试的核心任务就是在一张卷子里快速筛出那些基础扎实、逻辑清晰、有一定工程sense的候选人。这就决定了笔试题的考察维度非常固定——Linux操作系统、网络协议、数据库、编程语言基础、还有一部分算法和逻辑题。你可能觉得这些知识点“太基础了”但恰恰是这些基础决定了你入职后能不能独立排查问题、能不能把重复性工作自动化、能不能在系统出故障的时候扛得住压力。再说一下这份题适合谁看。如果你是准备运维开发、SRE、全栈运维这类岗位的应届生这份题是你必须吃透的底料如果你已经工作了想跳槽去大厂做运维平台开发或者基础设施方向这套题也能帮你查漏补缺。我会以“做一遍题 复盘知识点 补充背后的原理 给出答题技巧”这种方式来拆解保证你看完不只是背了几道题的答案而是真正理解每道题为什么这么考、考的是什么能力。2. 笔试题型结构与考察逻辑2.1 京东运维开发笔试的整体题型分布从我接触到的京东笔试反馈来看运维开发岗的试卷通常由三部分构成客观题单选、多选、简答题、编程题。客观题覆盖的知识面很广从操作系统到网络从数据库到Python基础都有简答题偏向场景化比如“服务器负载过高你怎么排查”“简述一次完整的HTTP请求过程”这类编程题则主要考查Python或Shell的实际编码能力有时也会出现算法题。这三类题型的权重分配大厂之间其实大同小异。客观题占40%~50%简答题占20%~30%编程题占30%左右。为什么这么分配因为客观题能在短时间内覆盖大量知识点机器阅卷效率高适合海选简答题考察的是表达能力和排错思路能筛掉一批“只会背概念、不会应用”的人编程题则直接检验动手能力运维开发本来就要求写代码这道关过不了后面面试大概率也悬。2.2 核心考点与热门知识点清单根据对历年题目的复盘我整理了一份高频考点清单这些内容反复出现重点程度可以直接按星级衡量考点模块具体知识点热度Linux基础文件权限、软硬链接、进程管理、常用命令五颗星网络基础TCP三次握手、四次挥手、HTTP状态码、DNS解析五颗星数据库索引原理、SQL优化、事务隔离级别、慢查询四颗星编程能力Python语法特性、Shell脚本、正则表达式五颗星自动化运维Ansible、Zabbix、监控体系、CI/CD三颗星数据结构字符串处理、排序、链表三颗星你可能会发现像Kubernetes、Docker这些热门技术在这份2018年的卷子里出现频率并不高。这不奇怪那几年容器虽然已经起来了但校招笔试对于应届生的考察还是以基础为主容器和K8s更多是在面试环节追问。但这不代表你现在可以不学容器只是提醒你基础永远是大头别让追新技术耽误了打底。3. 客观题核心知识拆解每道题背后的原理3.1 Linux进程与文件系统题不只是背命令笔试里Linux相关题目特别爱考两类一类是进程管理一类是文件系统。比如经典的“软链接和硬链接有什么区别”这题几乎每次笔试都会出现。很多人只记住了“硬链接不能跨文件系统、软链接可以”这个结论但没理解背后的inode机制。硬链接本质上是同一个inode的多个目录项引用所以修改任一链接的文件内容其他链接都会同步变化而软链接是一个独立文件存的是目标文件的路径一旦目标被删除软链接就失效了。再比如进程相关的题目“孤儿进程和僵尸进程的区别”也是高频题。孤儿进程是父进程先退出子进程被init进程收养危害不大僵尸进程是子进程退出后父进程没有调用wait/waitpid来回收它的进程描述符导致进程表项残留。运维场景里如果系统里出现大量僵尸进程很可能就是父进程代码有bug没有正确回收子进程资源这时候需要定位到具体父进程去修复而不是简单kill掉。还有一个容易被忽略的点kill -9和kill -15的区别。很多笔试会以情景题的方式出现比如“某个进程无响应你第一反应用什么命令”。正确做法是先kill -15SIGTERM让进程优雅退出给它机会做清理工作不行再用kill -9SIGKILL强制杀掉。直接上来就-9是运维大忌可能造成数据文件损坏。这种细节最能体现一个人的运维素养。3.2 网络协议题三次握手和HTTP状态码是必考网络部分的题目几乎是送分题但也是失分重灾区。TCP三次握手大家都能背出来SYN、SYNACK、ACK但笔试会换个角度问“为什么是三次而不是两次”如果你只回答“确保双方都具备收发能力”那只能算半对。更深的答案是三次握手能避免历史重复连接初始化造成的资源浪费——假设只有两次握手服务端无法确认客户端是否收到了自己的SYNACK可能导致服务端维护大量半连接状态浪费资源。这个解释既体现了对协议的理解也体现了工程思维。HTTP状态码也是必考。304 Not Modified、403 Forbidden、502 Bad Gateway这三个在运维场景里出现频率最高。304意味着资源未修改可以走本地缓存能有效减少带宽消耗502是网关或代理收到上游无效响应排查时先看后端服务是否存活、超时时间是否合理403则要区分是权限不足还是IP被封nginx配置里deny allow指令是排查重点。我印象比较深的一道题是“浏览器输入www.jd.com到页面展示中间发生了什么”这道题从DNS解析、TCP连接、HTTP请求发送、负载均衡转发、后端处理、响应返回一路串联了几十个知识点。答得好不好能直接看出一个人有没有完整的网络请求链路的认知而不是零散地记几个协议。3.3 数据库题索引与事务隔离级别是核心数据库题目中索引考察频率最高。比如“为什么MySQL的InnoDB引擎用B树而不是B树或哈希表”很多人只答“B树查询效率高”但更准确的答案是B树的所有数据都存储在叶子节点并且叶子节点之间有链表指针相连非常适合范围查询而哈希表适合等值查询但不支持范围查询B树的中间节点也存储数据导致单次IO能读到的索引项变少树高增加磁盘IO次数增加。这个知识点算是数据库必背笔试里换个角度反复考都不奇怪。SQL优化题也经常出现比如“有一个查询很慢你怎么分析”基础的排查思路是先用EXPLAIN查看执行计划看是否走了索引、type字段是eq_ref还是ALL、扫描行数大概多少然后分析是没建索引、索引失效比如在索引列上用了函数还是查询本身需要回表太多行。这些思路笔试时会以简答题出现面试时也会追问。事务隔离级别这块重点记住四种隔离级别以及它们解决的问题读未提交脏读、读已提交不可重复读、可重复读幻读、串行化。MySQL默认是可重复读但InnoDB通过MVCC Next-Key Lock解决了部分幻读问题所以实际使用中很少需要升级到串行化。笔试如果问“可重复读是否能完全避免幻读”答案是不能除非你用锁串行化这也是容易踩坑的地方。3.4 Python语法与特性题GIL和装饰器是常客笔试里的Python题不会太难但很细。比如“Python的GIL是什么多线程能充分利用多核CPU吗”GIL是CPython解释器中的一个全局锁导致同一时刻只有一个线程能执行Python字节码所以CPU密集型任务用多线程并不能提升性能但IO密集型任务因为线程在等待IO时会释放GIL多线程依然有效。这个考点延伸出来的问题是“怎么绕开GIL”答案通常是用多进程、用C扩展、或者改用asyncio协程。装饰器也经常考比如“写一个装饰器统计函数执行时间”。这题考察的是闭包和函数式编程的掌握程度代码只要写得清楚就能拿分。但我建议你在笔试现场多写一层——用functools.wraps保留原函数的元信息再考虑一下被装饰函数带参数和无参数的情况。这虽然不一定会被考察到但能体现你写代码的习惯是规范的阅卷人看到会加印象分。还有一种常见考法是给一段代码问你运行结果。比如列表推导式、字典合并方式、可变对象作为默认参数这些“小陷阱”。默认参数为可变对象这个坑几乎每份Python笔试题里都会出现——def func(li[])这种写法连续调用两次后li会累积而不是每次重置为空列表。吃透这类语法细节性价比很高。4. 编程题与脚本题实战解析4.1 用Shell处理文本的经典题统计日志中的Top N笔试里的Shell题经常结合日志分析场景比如“统计nginx日志中访问次数最多的前10个IP”。这个题看起来简单其实考察的是三个能力会不会用awk提取字段、会不会用sort uniq做排序去重、会不会用head取Top N。一个标准答案长这样awk {print $1} access.log | sort | uniq -c | sort -rn | head -10这个管道串联方式非常经典。拆开来看awk {print $1}提取第一列IPsort排序让相同IP相邻uniq -c去重并统计次数sort -rn按次数倒序排列head -10取前十个。很多人会漏掉第一个sort直接uniq -c结果发现统计完全不正确因为uniq只对相邻行去重。这个点在笔试时如果当面考察是个明显的扣分项。如果进阶一点题目会再加条件“统计指定时间段的日志”或者“排除内网IP”。这时用awk加正则和条件判断就能完成大部分工作。Shell题拿分的关键不是背一堆高端命令而是理解文本处理的基本思路提取、分组、排序、截取。这些思路不仅能答题在实际运维中每天也在用。4.2 Python编程题日志分析与简单算法实现有些编程题会直接要求用Python实现一个功能替代Shell比如“写一个Python脚本获取某个目录下所有文件的大小并排序”。这类题考察的是os.walk、os.path.getsize的使用以及字典排序等基础能力。还有一种比较高频的算法题是“字符串转整数”或者“反转链表”。这类题虽然看起来是纯算法但在运维开发笔试里出现的目的是考察代码基本功。建议写这类题时先想清楚边界条件比如字符串里有空格、正负号、非数字字符怎么处理链表为空或者只有一个节点时怎么处理。这些边界条件处理得越周全得分越高。我个人的经验是笔试中的编程题即使你写不出最优解也一定要写一个暴力解法并把思路注释在代码旁边。阅卷不是只看结果的正确性也看思路。你把“先怎么做、再怎么做、时间复杂度和空间复杂度是多少”写在注释里即便代码有点小bug阅卷人也知道你是懂这个问题的。最怕的就是空着不写神仙也救不了。5. 常见易错点与刷题提效方法5.1 笔试里高频出现的失分陷阱先说选择题里的陷阱。有些题会故意把相似概念放在一起迷惑你比如“硬链接和软链接”“进程和线程”“Cookie和Session”“TCP和UDP”。应对这种题最好的方式不是死记区别而是用一个具体场景内化比如“我要传一个大文件但能容忍丢包该用哪个协议”——UDP“我要做一个登录系统用户状态存哪里”——服务端Session存储。场景化记忆比列表对比更牢固也不容易在考场上一紧张全忘了。还有个高频失分点是“命令使用场景匹配”。题目会问“查看端口被哪个进程占用用什么命令”正确答案是netstat -tlnp或者ss -tlnp很多人会写成ps aux | grep虽然也能查到但不直接、效率低。笔试考的是你日常会不会用合适的工具解决合适的问题而不是你背了多少命令。我的建议是做题时给自己一个默认前提——我是一个在终端前排查问题的工程师我自然会说ss -tlnp而不是ps.另外简答题里“排查思路类”的题目比如“服务器CPU飙高你怎么排查”很多人的答案只写了“用top看哪个进程高然后再看”这太粗糙。一个完整的答案应该包括先用top确认是用户态CPU高还是内核态CPU高用户态高用top -Hp PID找到具体线程再用perf或py-spy定位热点函数系统态高需要关注上下文切换是否频繁结合vmstat查看cs列如果是Java应用还要用jstack导出线程栈分析。思路越完整越能体现你的实战能力分数自然越高。5.2 高效的备考方法与时间分配很多同学在备考时犯的最大错误就是“一把抓”今天看网络明天看数据库后天刷算法结果每样都只懂皮毛。我的建议是先把真题做一遍标记出所有错题和不确定的题然后按照错题对应的知识点模块去精准复习复习完再回来做一遍错题。这个过程循环两到三次比漫无目的地刷题有效得多。时间分配上如果离笔试还有两周可以参考这个安排第1至3天集中复习Linux和网络这两个模块题量大、知识点固定性价比最高。第4至6天主攻数据库和Python基础结合手写代码练习。第7至9天每天做一套完整真题或模拟题严格计时。第10至12天针对错题回顾知识点补充Shell和算法的弱项。第13至14天只看笔记和错题不再做新题保持状态。补充一点复习时要多动手敲命令、写脚本不要只看书。Linux命令你不实际敲一遍到考场上真的是“眼熟手生”Python代码更是要写特别是装饰器、生成器、上下文管理器这种语法特性不写几遍靠记忆撑不住。6. 从笔试看运维开发的成长路线如果把这份笔试题当作一面镜子它反映出的恰恰是运维开发工程师需要长期积累的能力矩阵。很多应届生会问“我应该优先学Python还是学Linux”我的看法是Linux是底座Python是工具两者不是二选一的关系。你可以先用Shell解决日常问题慢慢发现Shell写复杂逻辑太痛苦了再自然过渡到Python去写更复杂的自动化脚本、维护平台后端。这个路径我见过太多人走通了比一开始就死磕框架要踏实得多。运维开发这个岗位与纯开发最大的不同在于你会经常面对“没有标准答案”的问题。笔试里那种“服务不可用怎么排查”的开放题其实就是在模拟真实世界里的故障——没有固定的菜单手顺只有知识体系、工具链和排查思路的组合运用。所以平时除了刷题我建议大家多折腾自己搭一套LNMP环境模拟各种故障比如把nginx配置写错、把MySQL的buffer pool调太小然后像侦探一样一点点排查。这个过程学到的比任何培训班都扎实。笔试只是个起点把底层原理用熟、把自动化能力磨利你在运维开发这条路上会越走越宽。
返回列表