尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从2015视频研发笔试题看基本功:数组指针、内存与网络协议

从2015视频研发笔试题看基本功:数组指针、内存与网络协议 2015年的视频公司研发笔试和现在动不动就在在线评测系统上做题的体验完全是两回事。那时候很多公司还没普及在线笔试都是约个教室发一沓纸质试卷两个小时从头写到尾。题量不算变态但覆盖范围特别杂C、数据结构、网络、Linux、智力题甚至还有一两道跟视频播放场景相关的工程题。当时好多同学抱着“刷题”的心态去准备结果发现背的那些“面经”根本用不上——这公司考的不只是你会不会写代码而是看你有没有真正理解底层那摊子事。这文章我本来是写给当年一起准备校招的小伙伴的今天把这套拆解思路完整整理出来。虽然标题写的是PPTVIDEO 2015年的题目但我更想把这类笔试背后“到底在考什么、为什么这样考、怎么准备才有效”讲透。对准备面试的人、对想补基础的人、对带新人的老工程师都应该有点用。1. 视频行业笔试的出题逻辑考的不是你会不会写业务而是基本功够不够硬1.1 为什么视频公司这么看重基础功当年视频网站的业务压力比现在大得多。播放卡顿、首屏慢、秒开率上不去、高峰期CDN带宽被打满全是工程问题不是业务逻辑问题。所以招研发工程师的时候笔试题目特别“抠细节”本质上是想筛掉只会在框架里搬砖的人。我印象很深的一点是这类笔试几乎不考业务框架什么SSH、Spring、ThinkPHP这些东西基本不出现。考的是C/C基础、内存布局、指针、数据结构、操作系统、网络协议。原因很简单视频公司的基础组件大量是C/C写的解码器、推流器、播放器内核、CDN节点上的缓存模块都是跟内存和网络较劲的东西。Java的岗位可能少一些但基础题一样不手软数组和指针的辨析题照样满天飞。1.2 笔试的筛选定位是什么笔试不是用来选“最厉害”的人而是用来快速排除“基础不牢”的人。一份卷子从60分到90分可能差距很大但从30分到60分靠的不是天赋而是有没有认真学过基础课。视频公司校招的简历池子极大笔试是性价比最高的初筛手段。所以你会发现笔试题里总有那么几道“送分题”——比如问new和malloc的区别、sizeof一个结构体是多少、数组名和指针到底是不是一回事。这些题你看着简单但错误率出奇地高。正是因为送分题多才能真正拉开认真准备和不认真准备的差距。1.3 题目背后对应的岗位画像我后来带过不少新人回头看当年那些笔试题发现它的出题思路其实很清晰大致对应了几个岗位方向题目方向对应岗位能力考察目的C/C、内存、指针播放器内核、客户端SDK能不能碰底层基础组件数据结构与算法所有研发岗通用代码逻辑和复杂度意识网络协议CDN、服务端、推流/拉流懂不懂数据是怎么传的Linux/系统服务端与运维开发能不能在生产环境里排查问题这个画像放到今天依然成立。做视频相关研发网络和系统这两块永远逃不掉所以笔试里网络题和Linux题的权重通常比普通互联网公司高。2. 语言基础题为什么总围着数组、指针和内存转2.1 数组和指针一个老生常谈但错误率极高的考点网络热词里有“数组和指针笔试题”这确实是当年C/C笔试的钉子户。这种题不是单纯考语法而是考你有没有真正理解“数组名是一个常量地址”和“指针是一个变量”的本质区别。这类题的几种经典姿势我大致归纳一下sizeof一个数组名返回整个数组的字节数但sizeof一个指针只返回指针本身的字节数。数组名作为函数参数传递时会退化成指向首元素的指针这时候sizeof就变了。指针可以做自增自减数组名不行因为数组名不是左值。二维数组的int a[3][4]a、a[0]、a[0][0]、*a这些看起来都是地址实际类型完全不一样。很多人死记硬背“数组名就是指针”一做sizeof题就翻车。其实核心就一句话数组名在大多数表达式中会退化成指针但它是“数组”这个类型本身的时候sizeof算的是整个数组。要真理解这个碰到任何变体题都不怕。2.2 内存管理画图比背结论有用内存类的题几乎必考最常见的几类堆和栈的区别new/delete和malloc/free的区别野指针和内存泄漏结构体对齐这类题真正做得好的基本都是能在脑子里“画内存图”的人。比如给你一段代码问它输出什么char* getString() { char p[] hello; return p; } int main() { char* s getString(); printf(%s\n, s); return 0; }这题就是典型的栈内存悬垂指针问题。字符数组p是栈上的局部变量函数返回后内存已经被回收了打印结果是未定义行为。很多初学者看到“hello”三个字母就以为没问题但懂了函数栈帧的生命周期一眼就能识破。我当时准备这类题有一个笨办法但特别有效遇到任何指针相关代码先画一个方框代表内存标出地址、类型、指向关系。笔试的时候虽然不能真的画图但这个习惯能帮你在脑子里过一遍。不要靠猜一画就清清楚楚。2.3 结构体对齐一个容易被忽略的送分题结构体对齐的题在C/C笔试里出现频率相当高因为它跟实际工程有很强关联——网络协议解析、二进制文件读写、内存映射全都要面对对齐问题。经典题目是struct A { char a; int b; char c; }; // sizeof(struct A) ? 在32位系统、默认4字节对齐下答案是12不是6。因为char a占1字节后要填充3个字节让int b对齐到4字节边界char c后面再填充3个字节让整个结构体的大小是最大成员对齐数的整数倍。这种题第一次做错很正常关键是理解对齐规则的本质CPU访问对齐的内存地址效率更高编译器用空间换时间。理解了这一点再遇到#pragma pack、attribute((packed))这些变体题就知道是怎么回事了。3. 数据结构与算法的分层策略送分题不能丢拉分题有套路3.1 笔试里的数据结构重点分布笔试数据结构题目的分布我观察下来非常有规律链表、二叉树、字符串、排序查找这四个方向占了至少七成。像图、动态规划这些在笔试里有但比重相对低而且通常放在最后作为拉分题。链表为什么考得最多因为它能同时考察指针操作、边界处理和代码手写能力。反转链表、判断链表是否有环、合并两个有序链表这三道题几乎是笔试标配。二叉树是第二梯队考的题型集中在遍历递归和非递归、求深度、判断平衡、最近公共祖先。这里有一个很尴尬的情况用递归写谁都会但笔试为了区分度经常要求你写非递归版。这就逼着你把遍历的栈调用过程吃透而不是只会套递归模板。字符串是第三梯队但性价比很高反转字符串、判断回文、找最长公共子串。这类题代码量不大只要思路清晰不容易写错属于“稳赚不赔”的部分。3.2 时间分配的实战策略我当时给自己定了一个时间分配方案供你参考题型建议用时目标选择填空类基础题20分钟正确率95%以上数据结构编程题第一题15分钟必须完整AC数据结构编程题第二题20分钟必须完整AC算法/智力拉分题20分钟能写多少写多少别卡死检查与补充15分钟捡回粗心丢的分这个策略的关键在于基础题和数据结构题占据了大部分的分值把这些分拿稳已经能保证不落后。最后一道拉分题如果卡了五分钟还没思路果断先做别的回头再来写个暴力解法能得步骤分就赚了。3.3 算法题不是考灵感是考套路积累很多人觉得算法题靠“聪明”其实笔试里的算法题套路化非常明显。举个例子看到“最大子数组和”就该条件反射想到动态规划看到“两数之和”先想哈希表看到“第k大的数”优先队列和快排partition都行。为什么强调这个因为考场上时间紧张没有功夫现想算法。平时的积累就是训练这个“题意转算法原型”的反射弧。我建议准备笔试和面试的人把常见题型归纳成自己的“算法卡片”每张卡片上有题目特征、对应解法、复杂度、手写模板。考前过一遍卡片比盲目刷题高效得多。4. 网络与Linux视频研发岗位的必争之地4.1 网络协议从TCP握手到HTTP缓存视频公司笔试对网络的重视程度明显高于一般业务型公司因为视频的整个链路——上传、转码、分发、播放——全部建立在网络协议之上。TCP三次握手和四次挥手是必考但千万别只背状态名。笔试喜欢考的是为什么是三次不是两次TIME_WAIT为什么要等2MSL这些问题背后是“可靠传输到底靠什么保证”的思考。理解了序号、确认、重传这套机制基本就没问题了。HTTP也是重点尤其是状态码和缓存机制。视频网站大量使用CDN分发静态资源HTTP缓存头Cache-Control、Expires、ETag、Last-Modified直接关系到播放器能不能有效利用本地缓存。当时有一道印象深刻的题客户端请求一个视频分片服务器返回了206 Partial Content让你解释这个状态码的含义和触发场景。这就是典型的视频场景应用题考的就是HTTP Range请求的知识点。4.2 流媒体与CDN的工程常识有些笔试会出几道面向视频场景的开放题这里头是有规律可循的。比如播放视频卡顿你会怎么排查如何提高视频的首屏加载速度CDN节点如何做内容缓存和回源策略这类题不是考标准答案而是考你有没有工程化思维。比如“卡顿排查”这道题好的回答应该是分层的先看客户端网络情况再看是否命中CDN边缘节点再看源站带宽和转码码率是否合理。而不是一上来就说“换一个播放器内核”。我见过很不错的答案是从“首屏秒开”这个方向回答的首帧之前先传关键帧IDR帧或者降低首帧分辨率、使用渐进式解码这些都是视频行业真实在用的优化手段。能写出这种思路的候选者在面试官眼里就完全不是一个层次了。4.3 Linux服务端必备的生存技能Linux题在视频公司笔试里比重高于一般公司因为视频服务端的部署、日志排查、性能分析都离不开Linux。常见考点我列三类常用命令top、ps、netstat、tcpdump、grep、awk、find进程与线程进程地址空间、线程同步互斥锁、条件变量、协程概念IO模型阻塞IO、非阻塞IO、IO多路复用select/poll/epoll、异步IO其中IO多路复用是重点中的重点。当时视频网站的服务端要支撑海量长连接epoll几乎是必用的技术。笔试如果考到“select和epoll的区别”核心就三句话支持的文件描述符数量上限不同、效率与活跃连接数的关系不同、消息传递的机制不同。把这三条讲清楚再补充一些源码级别的理解就很有竞争力了。4.4 当年那道让我印象深刻的Linux综合题这里分享一道让我印象特别深刻、也是当时笔试里区分度很高的一道题服务器负载突然升高但CPU使用率不高列出你的排查思路。这个题目其实考察的是系统性能排查的综合能力。常规思路是先用top或uptime确认负载值再用vmstat看是CPU、IO还是内存问题。CPU不高但负载高大概率是IO等待要么是磁盘IO瓶颈iowait过高要么是进程处于不可中断睡眠状态D状态比如NFS卡住或者磁盘故障。我记得当时自己写满了答题区域列了一整条排查链路后来面试的时候还被面试官特意问到了这道题。这说明什么笔试阶段你如何拆解问题、如何组织答案本身就是被考察的一部分。这也是我为什么一直强调——答案不是背出来的思路要真正理解才能举一反三。5. 从2015年到现在笔试题的变与不变5.1 变的语言栈、考察形式、题型载体这几年很多公司的笔试已经从纸质试卷变成了在线测评系统答题方式从手写代码变成了在线编程。语言选择也更丰富了以前几乎只有C/C和Java可选现在Python、Go都是很常见的选项。考察形式上选择题比重明显下降编程题和系统设计题的比重上升了。现在线上笔试的代码题往往难度更大、更偏向工程实战比如给你一个业务场景让你设计接口或实现一个功能模块。这和行业对工程师的要求变化是同步的不再只看你会不会写代码而更关注你能否独立完成一个完整的工程闭环。5.2 不变的底层原理和基础功但不管形式怎么变核心考察点其实没怎么变。数组和指针的关系、内存分配和释放、TCP状态流转、Linux常用命令和性能排查依然是笔试和面试的高频考点。我每年都会看看新出的笔试题发现很多题目只是换了一层“新业务”的外衣内核还是当年那套基础理论。为什么会这样因为软件开发的基础逻辑从来就没有变过。无论框架怎么迭代数据终究要存储在某种结构里请求终究要经过网络协议栈服务终究要跑在操作系统之上。这些东西理解得越深你换什么框架、换什么语言都能快速上手反之如果只停留在调用层面一遇到复杂问题就束手无策。5.3 给现在准备笔试和面试的人几点实在建议根据我个人后来带团队、也参与过几次校招笔试出题的经验真心建议现在准备笔试的人三件事第一把“背题”改成“画图理解”。遇到指针题就画内存图遇到网络题就画时序图遇到数据结构题就画结构图。你能画明白才是真明白了。第二别忽视手写代码的练习。现在虽然很多是线上笔试但面试环节的白板题依然存在。手写和IDE里写是完全两种体验建议平时就用纸笔或者不带自动补全的编辑器练一练经典的数组、链表、二叉树题。第三留出时间做“复盘”。每做完一套题不要只看对错把每道题背后的知识点本身再过一遍。只有当你理解了出题人“为什么考这个”你才不是在做无意义的题海战术而是在真正积累自己的技术功底。想在面试中走得远底层基本功永远是最值得投资的方向。
返回列表