ARTICLE DETAIL

资讯详情

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

思科校招软件笔试复盘:C语言、网络与操作系统备考全攻略

思科校招软件笔试复盘:C语言、网络与操作系统备考全攻略 思科2019校园招聘软件类笔试我前前后后准备了小两个月考完出考场那会儿脑子里就一句话这笔试跟外面那些靠刷题就能过的厂子真不一样。你要是打算投思科的软件岗或者正在准备网络设备厂商的校招这篇复盘值得你认真看完。先说说这场笔试是什么定位。思科的软件类岗位覆盖的范围比一般互联网公司的软件工程师要宽从嵌入式、底层驱动到网络协议栈、系统平台都有所以笔试不会只考LeetCode那套纯算法而是在算法之外藏了大量网络、系统和C语言基本功的考察。我记得当时考场里不少人拿到卷子先懵了五分钟感觉像是“怎么还有这么多网络题”其实是没搞清楚思科笔试的本质——它不是在筛“做题家”而是在筛真正能理解网络设备软件栈的人。这篇博文我按考点模块拆开讲每个模块怎么复习、考场上怎么分配时间、有哪些容易被扣分的细节我都会结合自己踩过的坑说明白。1. 笔试整体形态与考察思路1.1 笔试形式与时间安排思科2019校招软件类的笔试形式和大部分外企校招类似是在线笔试统一时间开放题目限时完成。整体分为几个部分第一部分是客观题包含单选和多选覆盖网络基础、操作系统、C语言、数据结构第二部分是编程题一般是二到三道需要在给定时间内写出可运行的代码部分岗位批次还会有简单的英文技术问答或者逻辑推理题。关于时间分配这是我一上来就要强调的。整场笔试的时长看起来不算紧张但实际做下来会发现时间根本不够用原因在于客观题里网络和系统部分的题目很耗时间尤其是多选题你要对每个选项都判断清楚才能下笔。我当时给自己定了这样一个节奏客观题最多用一半时间必须留出至少四十分钟给编程题如果编程题有两道以上每道题只看最优解的时间不能超过十五分钟。考场上一旦在客观题上恋战编程题基本就废了而编程题在评分里的权重远高于客观题。1.2 思科软件岗的画像与笔试筛选逻辑在讲具体考点之前有必要先把思科软件类岗位的画像说清楚因为笔试是照着这个画像设计的。思科的核心业务是网络设备软件类岗位主要分布在几个方向网络操作系统IOS-XE / IOS-XR相关开发、网络协议实现如BGP、OSPF、LACP这些、设备管理平台、以及可观测性和自动化工具链。这意味着即便你投的是偏平台的岗位笔试也会默认你具备网络基础知识因为整个业务上下文就是网络设备的软件体系。筛选逻辑上思科笔试想看到的是这样一个人C语言功底扎实到能写底层模块理解操作系统原理进程、内存、并发对TCP/IP协议栈有认知同时具备一定的算法能力解决实际问题。这跟互联网公司“算法为王”的风格明显不同——你不会遇到特别偏难怪的算法题但你会遇到大量“看似基础、实则要求你真正理解”的题目。比如给你一段C代码问输出是什么表面考语法实际考左值右值、存储期、未定义行为这些底层概念。2. 核心知识模块拆解2.1 网络基础思科笔试的“隐藏门槛”网络基础是思科笔试最鲜明的特色也是很多非网络方向的同学最容易翻车的地方。这里我先把考察范围圈出来再讲复习思路。从实际考点来看思科软件类笔试的网络题集中在几个层面第一个是TCP/IP协议栈包括三次握手、四次挥手、TCP状态迁移尤其是TIME_WAIT、CLOSE_WAIT的区别和产生条件、拥塞控制慢启动、拥塞避免、快速重传、UDP与TCP的对比第二个是HTTP相关但深度不深主要考察常见方法、状态码分类、Keep-Alive机制第三个是VLAN、链路聚合、生成树这些交换技术的基本概念第四个是路由协议的基础比如OSPF的区域概念、BGP的路径属性一般不考很深的配置细节更多是考察你是否理解这些协议解决什么问题。我当时复习网络部分的思路是这样先不用去啃思科认证那种深度的内容——那是网络工程师的范畴不完全是软件岗的要求。我建议所有准备思科软件类笔试的同学把《计算机网络自顶向下方法》这本书的传输层和网络层章节精读一遍然后把TCP状态机完整背下来再配合抓包工具看一遍常见的TCP连接过程。这个过程不复杂但你一定要做到“理解”而不是“背答案”。比如TCP为什么需要TIME_WAIT很多人只背了“保证最后一个ACK到达对端”但笔试可能会追问“那TIME_WAIT持续多长时间为什么是这个值如果服务端大量进入TIME_WAIT怎么处理”这种递进式的追问只有真正理解设计原因才能答得稳。还有一个容易忽略的点是网络字节序和字节对齐相关的问题。思科的软件大量运行在网络设备上数据包解析必须处理字节序所以笔试中偶尔会出现给你一个结构体问在x86小端机器上某个字段的值是什么。这类题考察的不只是网络知识还叠加了C语言的内存布局知识我在后面C语言部分会再展开。如果你对网络基础完全没有概念这块要从“数据包长什么样”开始看至少要知道以太网帧头、IP头、TCP头的关键字段和作用。2.2 操作系统从进程到并发全是高频考点操作系统在思科笔试里的分量在软件类笔试中仅次于网络和C语言。考察的方式以概念理解代码分析为主不太会出现“请描述LRU算法”这种默写题而是给你一段代码或者一个场景让你判断进程状态、分析死锁条件。高频考点我整理了一下主要集中在进程与线程区别、上下文切换开销、进程间通信方式、调度算法先来先服务、短作业优先、时间片轮转、多级反馈队列、同步互斥信号量、互斥锁、条件变量、生产者消费者模型、死锁四个必要条件、银行家算法、如何避免、内存管理分页分段、虚拟内存、页面置换算法、快表。这里我特别想提一点把并发相关的内容作为复习重点中的重点。思科的软件岗位涉及大量多线程编程比如网络数据面的包处理、控制面的协议计算都需要处理并发。笔试中对这块的考察很灵活最常见的是给你一段多线程代码问你“最终输出的x是多少”或者“是否会有数据竞争”。这种题有个共同点就是你必须心里清楚“可见性”和“原子性”这两个概念在C语言里是如何保证的通常靠锁和原子操作而不是停留在Java里synchronized那种记忆层面。建议复习时把《操作系统概念》或者《深入理解计算机系统》的并发章节认真看一遍并且亲手写几个带多线程的小程序用ThreadSanitizer或者valgrind跑一跑观察数据竞争的真实表现。这个动手过程会极大提升你对并发问题的直觉。还有一类操作系统题很容易被忽略boot过程、中断处理、内核态和用户态的切换。这些在普通互联网公司笔试里很少见但思科因为做设备软件时常会涉及。不用复习到能写驱动的程度但至少要明白设备启动时固件到操作系统的交接流程、中断上下文和进程上下文的区别以及为什么网络数据包处理要关心中断。我当时在这部分吃过亏因为复习时完全没把“中断”当作考点结果遇到一道关于“网卡收到数据包后中断处理流程”的题只能靠常识来猜。2.3 数据结构与算法不追求难但追求快和稳思科软件类笔试的算法题整体难度比头部互联网公司低但这不代表你可以裸考。从我看到的题和身边同学的反馈来看考察重心集中在数组与链表操作、栈与队列的应用、二叉树遍历与常见性质、哈希表、排序算法的时间复杂度与稳定性、经典动态规划和贪心。这里我给出一个我认为最务实的算法准备清单。第一所有基础数据结构的实现要能手写尤其是链表——创建、反转、删除、找环这些操作要能不动脑子就写对。第二二叉树的前中后序遍历、层序遍历必须熟练非递归写法也要会因为笔试环境有些语言没有内置树结构你需要自己定义节点并实现遍历。第三动态规划掌握常见的几个模型就够最长公共子序列、最长递增子序列、背包问题、编辑距离这些刷明白基本可以覆盖九成的笔试场景。第四排序要能讲清楚快排为什么平均是O(nlogn)、最坏是O(n²)还得知道归并排序的稳定性和额外空间。关于算法题在思科笔试里的特点我的感受是“工程化味道更浓”。什么叫工程化味道就是题目往往会套一个稍微现实一点的场景比如“实现一个IPv4地址池管理支持分配和释放”这本质上是个数据结构设计题但在普通互联网笔试里很少这么考。所以你在复习时不要只刷LeetCode上的原题可以尝试把一些经典数据结构题往“网络设备场景”上套一套比如用LRU缓存来管理MAC地址表项、用前缀树来做路由前缀匹配。这不是为了押题而是为了训练自己看到场景时快速抽象数据结构的能力。时间分配上我的建议是如果编程题有两道先做自己最有把握的那道不要按题目顺序做。先把能拿的分稳定拿到再回头啃难题。笔试环境通常没有IDE的自动补全和调试器你写代码就要格外注意边界条件、指针空值和数组越界这类问题尽量一次把代码写对。提交前如果时间允许先在脑子里代入三组测试数据正常输入、边界输入空数据、单元素、大输入看是否超时。2.4 C语言深度思科软件笔试的“隐形大头”C语言在思科笔试里怎么强调都不过分。网络设备操作系统的绝大部分代码都是C语言写的这个背景决定了笔试题对C语言的考察绝对不只是“语法会用”而是要求你理解C语言在底层是如何工作的。我把C语言相关的考点分成三个层次。第一层是基础语法与内存布局指针与数组的关系、结构体对齐与填充、大小端、静态变量与全局变量的存储位置、堆与栈的区别第二层是进阶语义指针数组与数组指针、函数指针、二级指针、位运算技巧、typedef与define的区别第三层是工程实践内存管理malloc/free的正确使用、内存泄漏检测、字符串处理的安全版本strcpy与strncpy、sprintf与snprintf、头文件包含与宏定义陷阱。考场上最容易丢分的我觉得是结构体对齐和大小端这类题目。很多同学做这类题时会“觉得很简单”但一旦实际写出答案就会发现和编译器行为对不上。原因在于对默认对齐规则理解不够精确。我给你一个通用的解题套路先确定每个成员的偏移量按“成员自身大小对齐”的原则再看结构体总大小按“最大成员对齐数”向上取整。如果你在面试或笔试前拿不准建议在本地编译器上跑几个不同的结构体组合观察sizeof的输出建立直观感受。另外思科笔试环境中明确说明按C11标准的话结构体对齐不会加packed指令如果有packed会明确标注所以你就按默认规则计算即可。关于位运算我要多说一句。网络协议解析和报文处理大量依赖位运算所以笔试中会出现“给定一个IP和掩码计算网络地址”或者“给定一个16位的flags字段判断某一位是否为1”这类题目。这类题没有难度但要求你非常熟悉与、或、异或、移位操作的语义以及如何构造掩码。建议把“取一个数的第n位”“把第n位清零”“把第n位置1”“交换两个数不用临时变量”这几个基本操作练熟。还有一类C语言题是“读代码说输出”这类题往往包含未定义行为比如i i i或者对同一变量在序列点之间多次修改。这里我提醒大家笔试考未定义行为往往不是让你背答案而是考察你是否知道“这是未定义行为、结果不可预测”。如果你在某个选项里看到“编译器会报错”“运行结果是某个固定值”这种绝对化描述大概率就是陷阱。3. 高频题型与解题策略3.1 客观题多选题的“少选扣分”规则要摸清思科笔试的客观题部分网络、操作系统、C语言会混合出现题型以单选和多选为主。这里我重点说说多选题的策略因为很多人在这里白白丢分。不同批次的规则可能有差异有的多选是“少选得部分分多选错选不得分”有的是“完全匹配才得分”。我建议你在开考前看清楚题目说明如果允许少选得分那么不确定的选项尽量不要选保住基础分如果不允许那只能凭实力硬做。我当时参加的那场规则是少选得一半分多选零分这就意味着“犹豫的选项宁可不选”。客观题还有一种情况值得注意部分题目会混入“选择所有正确项”的英文表述题目本身不难但如果你对英文不敏感可能会漏看“all that apply”导致只选一个。外企笔试用英文出题的概率不低建议复习时把TCP、OS、C语言相关的英文术语过一遍确保看到关键词能立刻反应出对应知识点而不是浪费时间翻译题目。3.2 编程题手写代码的边界感决定生死编程题是整场笔试区分度的核心也是我最想展开讲的部分。思科软件类笔试的编程题一般不会特别长但要求你写出的代码能处理完整边界情况。我见过的一道典型题目是“实现一个IPv4地址池的分配和释放”输入是一系列地址段需要支持申请一个可用IP、释放一个IP并处理地址耗尽的情况。这道题本质上是用一个有序结构维护空闲区间但很多人在边界处理上翻车比如释放一个已经被释放的IP、分配时跨越区间边界。做这类题我建议你养成一个习惯不要急着写代码先在草稿纸上把输入输出想清楚然后设计数据结构。还是上面这道题你可能想到用布尔数组标记每个IP是否被占用但如果是/8这种大地址段布尔数组的大小是否还合适这时候你可能需要用区间合并的方式来做。笔试考的不是你能不能AC所有用例而是在有限时间内给出一个逻辑正确、复杂度可接受的方案。所以你做编程题时第一优先级是“正确性”第二优先级是“复杂度是否合理”第三优先级才是“代码是否优雅”。还有一个很关键的实操点提交代码前用两三分钟做一个“边界清单”自测。我每次做笔试都会快速检查这几个点——链表操作是否处理了头节点为空和单节点递归函数是否可能栈溢出整数运算是否可能溢出数组索引是否越界字符串操作是否漏了\0使用malloc后是否检查了返回值。这些都是老生常谈但考场上因为紧张最容易丢分的恰恰是这些问题。3.3 综合设计题如果出现画清楚数据流比堆名词更有效部分批次的思科笔试会有一道综合设计题形式可能是“给出一个场景要求设计系统模块”或者“给一段代码要求指出问题并提出改进方案”。这类题网络上的参考资料比较少很多人遇到时容易蒙。我提供一个通用框架。如果你遇到“设计一个功能模块”的题我建议按这个顺序组织答案先说清楚核心数据结构和模块间接口然后描述数据流输入从哪里来、经过什么处理、输出到哪里去再讨论并发和异常处理最后简单提一下测试策略。这套框架的好处是它能证明你有工程思维而不是只会写零散的功能函数。比如让你设计一个设备配置管理模块你可以先说用树形结构存储配置项再说配置变更时通过版本号控制并发写最后说配置校验放在写入口处避免脏数据落到运行态。如果能把每一步的“为什么”也写出来那这个答案就很有竞争力。如果你遇到的是“代码评审”类的题那就按照“正确性—并发安全—内存安全—可维护性”的顺序来找问题。这个顺序很重要因为笔试阅卷基本是采点给分你先说最好发现的问题再说深层次的不会因为顺序乱了而失分。我建议你在平时看别人的代码时就有意识地做这种“挑刺训练”给自己三分钟找出尽量多的问题时间长了你的代码审查能力会明显提高应付这类题也就从容了。4. 实战记录与常见问题排查4.1 一套可复用的做题时间分配方案前面已经提到了整体节奏这里我给出一个更具体的示例时间表方便你套用。假设整场笔试120分钟题目分布是30道客观题加2道编程题。前40分钟做客观题其中网络和C语言部分优先因为这部分如果你会就能很快选完不会的话磨再久也白搭操作系统题如果有场景分析类的可能稍慢但每题不超过两分半。做客观题时遇到多选题直接按“保底策略”来不确定的选项一律不选。40分钟到90分钟做编程题先花两分钟看两道题的题干快速判断哪道更有把握先做容易的每道编程题留5分钟做边界自测。最后30分钟回头检查客观题——但这里我有个个人建议除非你发现了明显的看错题否则不要轻易改答案因为第一直觉的正确率往往更高。我认识的几个同学都吃过“检查时改错答案”的亏。4.2 常见扣分点与避坑清单我把笔试中常见的扣分点和避坑经验整理成一个清单这比单独看知识点更直观。每一个都是实际考场上容易忽略的细节。第一个坑是“多选漏选”。前面提过这里再强调一下多选题的规则直接影响收益务必读题。另外还要注意有些题带有“选择错误选项”的表述这种反向题很容易因为惯性思维而做错。第二个坑是“结构体对齐和大小端配合考察”。有时候题目会先定义一个结构体然后说“该结构体在内存中以小端方式存储”然后让你算某个字段的数值。你在算的时候不能只算对字节顺序还要先确保算对了结构体成员的偏移量否则字节序算得再对起始位置错了也白搭。第三个坑是“编程题运行超时”。有些同学的代码逻辑正确但用了嵌套循环导致大数据量下超时被扣分。所以看见数据范围比较大的题目先想一下有没有O(n)或O(logn)的方案哪怕稍微复杂一些也值得写。第四个坑是“KMP、红黑树这类结构的过度准备”。我理解很多同学刷题时会想准备“高级写法”来展示能力但思科软件类笔试考察偏工程如果你在编程题里手写红黑树大概率是浪费时间。笔试的三个小时里稳定完成可读性好、边界正确的代码收益远高于只写了一个炫技但没时间调试的复杂结构。第五个坑是“英文题干的误读”。外企笔试有英文题是常态有些题目的关键在“select the incorrect statement”这类反直觉表达。我建议读题时如果遇到英文题先把关键词圈出来再用自己的话翻译一遍再作答。4.3 实战心得编程环境与代码风格在线笔试通常提供一个简易的代码编辑器没有自动补全也没有编译错误提示。这个环境对很多人来说是个障碍因为习惯了在IDE里写代码突然回到“记事本编程”会非常不适应。我建议你在准备阶段就刻意练习在没有IDE辅助的情况下写代码可以用本地编辑器加命令行编译器把常用数据结构和算法手写一遍。关于编程语言的选型如果你对C和Python都比较熟我的建议是看题目类型选择。如果是偏向数据结构和算法的题Python写起来快尤其是处理字符串和链表这些内置类型比较方便如果是偏向内存操作、位运算或网络协议的题C/C更贴合题目的考察方向。但不管你选哪种一定要用自己最熟练的语言不要在考场上尝试使用一个不熟悉的语言“挑战自己”。另外有一点即便你用C或Python作答也要注意代码风格变量名命名清晰、缩进统一这虽然不会直接加分但万一笔试后面有面试官翻阅你的答卷一份干净整洁的代码会留下更好的印象。5. 备考路线与资源建议5.1 时间线与优先级排序如果你还有四到六周的时间准备我推荐这样分配。第一周和第二周主攻网络基础和操作系统因为这两个模块内容多、遗忘快需要最先开始。网络部分重点看TCP/IP操作系统重点看进程和并发第三周集中突破C语言把指针和内存相关的知识点彻底过一遍配合大量代码练习第四周刷算法和数据结构以“常见题型速通”为目标不用追求难题最后一周做整套模拟严格按120分钟计时适应考场的节奏。如果你只有一周时间那就做减法C语言基础尤其结构体对齐、指针、位运算、TCP/IP核心概念、常见并发问题、LeetCode简单和中等题各十几道。这些是性价比最高的内容能保证你拿到基础分不至于崩盘。5.2 资料清单与使用方式资料方面我不推荐贪多有几本经典的吃透就够。网络方面首推《计算机网络自顶向下方法》重点看传输层和网络层操作系统方面《深入理解计算机系统》的并发和内存章节非常实用如果时间充裕再看《操作系统概念》。C语言方面我强烈建议把《C专家编程》里的“指针”和“内存布局”相关章节看一遍这本书对理解C语言的底层语义帮助很大而且内容不枯燥适合在刷题间隙调剂。算法方面不用买太多书把LeetCode上“Top 100 Liked Questions”里的简单和中等题刷一遍加上《剑指Offer》里的经典题基本就覆盖了。我特别提醒一点刷题时要按“能不能手写出来”为标准而不是“看懂了答案”。很多同学看题解觉得自己会了到笔试现场写不出来就是因为没有形成“从题目到代码”的肌肉记忆。另外既然你准备的是思科我建议你把思科的官方技术文档浏览一下比如Cisco DevNet上关于IOS XE、网络可观测性、自动化工具的介绍。笔试不一定会直接考但它能帮你在综合设计题中说出更贴合业务背景的术语和思路。面试阶段也能展现出你对公司技术方向的真实兴趣一举两得。6. 对后续面试与个人成长的建议笔试通过之后紧接着就是面试。思科的面试通常包含几轮有技术面也有行为面。技术面会进一步放大笔试中考察的底层能力尤其是C语言、操作系统和网络你不妨把笔试当成一次“体检报告”看看自己最薄弱的模块考完立刻查漏补缺。我个人经验是笔试里做错或者蒙对的题面试官十有八九会换个马甲再问一遍。从个人成长的角度看准备思科笔试的过程本身就很像一次“系统能力”的补课。你会发现它与刷LeetCode准备互联网公司面试的路线有重叠但更有自己的特色——更贴近操作系统和网络的真实运行机制。这种知识结构不论未来是做网络设备、嵌入式、还是云计算基础设施都会非常有用。所以就算你最后没有进入思科这个备考过程对你整个技术基本功的打磨价值也是实实在在的。
返回列表