
“趋势科技2017校招开发岗试题B”这个标题放在今天看已经算是一份“考古资料”了。但每年到秋招春招总会有不少学弟学妹翻到这类往年题目跑来问我同一个问题安全厂商的开发岗笔试到底在考什么和互联网大厂的题有什么不一样先说结论这份B卷最大的特点不是难而是“杂”。它不追求让你在算法题上一锤定音而是把C/C基本功、操作系统、网络、数据库、编程题、甚至智力题全部塞进一张卷子里要求你在90到120分钟内稳定输出。说白了它筛的不是谁最聪明而是谁的计算机基础最扎实、谁在压力下不容易掉链子。这篇文章我按参加过同类外企笔试的选手回忆把B卷中几类高频题型做了还原和拆解每道题都补上了考点分析和答题思路。不管你是准备安全厂商、外企研发中心还是想看看传统开发岗笔试的风格都值得花二十分钟过一遍。文章最后我还会聊一下为什么这些2017年的老题目放到今天“极兔Java开发岗卷吗”这种话题下面依然有参考价值。1. 先聊聊这份笔试卷子考什么1.1 趋势科技开发岗笔试的总体画像趋势科技是做安全产品的厂商终端防护、邮件网关、数据中心防护这些方向都有涉及。开发岗笔试的风格也明显带着安全厂商的影子重视底层、重视内存、重视网络协议同时对代码的严谨性要求极高。很多人以为外企笔试会全英文其实不是。试卷前半部分会有不少英文题干的选择题但真正拉分的编程题反而给的是中文描述。这和国内互联网大厂的笔试风格差别挺大大厂更爱考动态规划、图论这些偏算法的题目而趋势科技这类安全外企更喜欢考指针、内存布局、进程通信、TCP状态转移这类“工程师每天都要面对”的知识。另一个明显特征是多选题占比高。多选就意味着少选、多选、错选都不得分这对知识掌握的精确度要求很高。比如给你四个关于static关键字的描述你得能准确判断出哪两个是对的而不是凭感觉排除一个选项。1.2 2017年B卷的模块分布与时间分配我根据能回忆起来的同学描述把B卷的模块大致做了个还原。整体可以分成四个部分模块题型大致题量建议用时基础选择单选多选覆盖C/C、操作系统、网络、数据库20-25道30-35分钟简答/填空概念填空、写出程序输出、找代码错误5-8道20分钟编程题手写代码一般两道2道40分钟智力/逻辑数学逻辑题和编程无关2-3道10分钟这个时间分配是我后来复盘时觉得比较合理的方案。当时不少人栽在选择题上一道多选纠结五分钟最后编程题只剩十几分钟代码草草写了个框架自然拿不到分。我的建议是拿到卷子先把两道编程题扫一眼如果发现有一道是你熟悉的链表反转或字符串处理先把它做掉然后再回头啃选择题。编程题的分值密度远比一道纠结半天的多选要高。2. C/C与内存管理笔试的重灾区2.1 指针、数组和sizeof的经典坑B卷的选择题里C/C部分基本是送分题和陷阱题各占一半。送分题长这样问sizeof(int)在32位系统下的值答案是4。陷阱题就阴险多了专门挑你“自以为知道但其实掌握得模糊”的知识点下手。比如这道高频题char str[] hello; char *p str; printf(%d %d, sizeof(str), sizeof(p));str是数组sizeof(str)计算的是整个数组的长度字符串“hello”加上结尾的\0一共6个字节所以结果是6。而p是指针在32位系统下sizeof(p)是4在64位系统下是8。很多人第一反应把str和p都当成“指向字符串的变量”直接写了6和6这道题就错了。安全厂商这么爱考指针和数组不是没有原因的缓冲区溢出、数组越界、指针悬空这些恰恰是安全漏洞最常见的源头。考官想看的不是你会不会背sizeof的语法规则而是你有没有形成“数组名和指针不是一回事”的底层直觉。2.2 内存分配、悬空指针与常见错误B卷简答题里几乎必有一道和动态内存相关的题目。比较典型的是给你一段代码让你找出内存问题char* getString() { char str[] hello; return str; }这段代码的错误在于str是局部数组存储在栈上。函数返回后栈空间被回收返回的指针指向的内存内容是不确定的。这就是典型的悬空指针问题。面试官真正想听的回答是应该用malloc在堆上分配内存或者返回静态存储区的指针再或者把缓冲区作为参数由调用方传入。另一个高频考点是内存分配配对。malloc对应freenew对应delete用混了就是未定义行为。曾经有一道选择题专门问new[]分配的内存应该用什么释放答案是delete[]。不少人只知道delete忽略了方括号这就踩了坑。实际操作中C题如果允许直接用vector和unique_ptr这类RAII容器能省掉一多半内存问题。2.3 字节对齐与位域外企笔试的特色题国内互联网大厂的笔试很少考字节对齐但B卷里确实出现过类似的题。我记得还原版中有一道问一个结构体包含char a; int b; char c;在默认对齐方式下sizeof是多少如果把三个成员直接相加是1416但正确答案往往是12。原因在于编译器会按最大对齐数这里是4字节对结构体进行填充。char a占据第0字节接下来三个字节是填充int b从第4字节开始char c在第8字节最后再补三个字节让整个结构体对齐到4的倍数总共12字节。如果写成char a; char c; int b;大小就会变成8。这类题看着冷门却真实反映了工程师对内存布局的敏感度。在做网络协议解析、二进制文件格式处理时字节对齐直接影响数据读取的正确性。一个经验丰富的开发者在遇到结构体时第一反应就是画内存布局图而不是背规则。3. 操作系统、网络与数据库基础决定上限3.1 进程线程与同步机制考的不仅是背概念操作系统部分B卷的考点非常集中进程与线程的区别、fork的执行流程、死锁产生的条件、进程间通信方式。这些都是“大学课本上划了重点、但很多人没真正理解”的知识。有一道很经典的fork选择题int main() { fork(); fork(); printf(hello\n); return 0; }问打印几次“hello”。答案是4次。第一次fork后变成两个进程第二次fork时两个进程各fork一次变成四个进程。很多人只记得fork会创建子进程却忘了调用fork的进程本身也会继续执行所以漏算了数量。死锁相关的题也是一样不仅要背出“互斥、占有且等待、不可剥夺、循环等待”四个条件还要能判断一个具体场景是否会产生死锁。比如两个线程分别持有锁A和锁B然后互相等待对方释放锁这就是典型的循环等待会产生死锁。面试官希望看到的回答是能进一步提出解决方案按固定顺序加锁或者用trylock超时机制。3.2 TCP/IP与HTTP核心考点安全厂商的重点B卷网络部分的难度比普通互联网公司笔试要高半档。这也很正常安全产品天天和流量、协议打交道网络基础不扎实根本没法做数据包分析、攻击检测这类工作。TCP三次握手和四次挥手是必考。我印象比较深的是一道关于TIME_WAIT状态的题主动关闭连接的一方在发送最后一个ACK之后进入TIME_WAIT状态为什么需要等待2MSL报文最大生存时间标准答案有两点一是确保最后的ACK能到达对方如果丢了可以重发二是让旧连接上的所有报文在网络中自然消失避免影响新连接。这还不够好的回答要加上一句在实际高并发短连接场景下TIME_WAIT过多会占用端口和内存可以通过调整内核参数或开启SO_REUSEADDR来缓解。HTTP状态码也是选择题常客。问404代表什么几乎人人都知道。但问到302和307的区别不少人就卡住了。302是临时重定向多数浏览器会把POST改写为GET307则严格要求保持请求方法和主体不变。这种细节题考的是你对协议规范的理解程度而不是“用过就忘”。3.3 SQL与事务隔离开发岗的底线要求B卷数据库部分题量不大但每道都踩在开发岗的底线上。事务的ACID特性、四种隔离级别、索引失效场景这三类题轮流出。有一道多选让选出会导致索引失效的写法比较典型的有四个选项对索引列使用函数、隐式类型转换、左模糊查询、条件列参与运算。正确答案是前三个。WHERE age 1 20这种写法也是坑因为对列进行了运算优化器无法使用索引。真正有经验的开发者会习惯把条件改写成WHERE age 19让索引能够命中。事务隔离级别那道题核心是理解脏读、不可重复读、幻读分别在哪个级别下会被解决。读未提交会有脏读读已提交解决了脏读但会有不可重复读可重复读解决了不可重复读但MySQL默认级别下依然可能产生幻读串行化全部解决但不能并发。如果能在答案里写一句“MySQL的InnoDB通过MVCC实现可重复读通过间隙锁在部分场景下额外解决了幻读”印象分会明显不一样。4. 算法与智力题能不能写出可运行的代码4.1 编程题的做题顺序与手写规范B卷编程题一般两道难度介于LeetCode Easy和Medium之间不会考复杂的动态规划。最常见的是链表操作、字符串处理、二分查找。但题目简单不等于容易拿分手写代码的状态和规范往往比答案本身更影响成绩。先说链表反转。这道题就算没刷过题也能靠硬推理写出来。关键是写之前要和自己确认清楚用迭代还是递归迭代需要几个指针我当时习惯用三指针法pre指向已反转部分的头cur指向当前节点next暂存下一个节点每次让cur-next pre然后三个指针整体后移。再比如字符串去重或字符统计这类题考察哈希表的使用。C语言写起来稍微繁琐要自己处理ASCII数组C直接用unordered_map或固定大小的int[256]就行。B卷通常允许选择C、C或Java建议优先选择自己最熟悉、标准库最顺手的语言不要在考场上挑战新语言。手写代码时有个容易被忽视的细节先写思路注释再写实现。阅卷人一天看几十份卷子看到一份代码开头有“// 反转链表pre指向已完成反转的头cur指向待处理节点next保存后续”的注释会下意识认定这个考生是有工程习惯的印象分直接拉满。4.2 智力与逻辑题外企笔试的隐形加分项智力题在前几年外企笔试里非常流行B卷里也有。比如经典的赛马问题25匹马5个赛道最少比赛几次找出最快的三匹马答案是7次。思路是这样的先分成5组比赛记下每组排名这是5次。然后把每组第一名拉出来比一次假设结果为A1B1C1D1E1这是第6次。此时A1一定是总冠军。要找出第二和第三名只需要考虑A2、A3、B1、B2、C1这五匹马再比一次就够所以第7次解决问题。这道题考的完全是逻辑推理和编程无关但能快速判断一个人的思维是否清晰。这类题不需要专门刷题但值得掌握几个常见套路二分淘汰、分组淘汰、信息论下界。遇到没见过的题先想“我至少需要哪些信息才能确定答案”再反推该怎么做实验思路就不会乱。5. 实战复盘从一份典型试卷看答题策略5.1 我当时拿到B卷的答题顺序写到这里我可以把一次比较典型的B卷答题过程完整复盘一遍。假设你刚坐下翻到第一页选择题前五道是C语言输出题其中第三道就是数组名和指针那类题第五道是结构体字节对齐。此时心里应该有个判断这份卷子基础题占比高陷阱集中在“你以为你懂”的知识点上。我的策略是先用10分钟快速扫完所有选择题有把握的直接涂卡拿不准的在题号上画圈不恋战。接着做简答题因为简答通常是对错判断加理由说明不需要太多思考时间。真正的大头是编程题我会在完成简答后立刻切换到编程题宁可选择题留几个不确定的也要保证编程题写完、写完整。编程题完成后如果还剩时间再回头处理画圈的题。这时候心态完全不一样编程题已经占住了基本盘选择题蒙错一题也不会慌反而更容易冷静推理出正确答案。5.2 时间分配与心态管理两个真实教训关于时间分配我听过一个特别典型的失败案例。有个同学C基础很好但拿到卷子后从第一道选择题开始逐题精读遇到一道英文题干的多选单词都认识但选项拿不准硬是花了八分钟纠结最后编程题只来得及写一个函数签名自然挂了。这不是能力问题是策略问题。还有一个教训来自我自己有一年我做编程题时想一步到位写出最优解结果卡在边界条件上半小时最后交了一份没编译过的代码。后来我学乖了笔试不是面试没人要求你一次写出零缺陷的代码先把能跑的版本写出来再优化也不迟。比如反转链表就算不用三指针用一个临时数组把所有节点存下来再重建链表功能上也是对的至少能拿一半分。6. 高频失分点与避坑清单6.1 你以为你会但其实不会的知识点这些年看了不少校招生的笔试复盘发现有几个知识点是“高频翻车点”值得单独列出来自检。第一个是volatile关键字。很多人知道它和“多线程可见性”有关但再往下问就答不上来了。这道题的完整答法应该是volatile告诉编译器该变量的值可能被外部因素改变不要把它缓存到寄存器中每次读写都从内存获取。在嵌入式开发、硬件寄存器访问中非常常见。但要注意它不保证原子性不能替代锁或原子操作。第二个是static在不同场景下的含义。修饰局部变量时变量生命周期延长到程序结束但作用域不变修饰全局变量或函数时限制为当前编译单元可见修饰类成员时表示属于类而非某个对象。笔试如果出多选问“哪些描述是正确的”这四个场景都要能准确分辨。第三个是位域bit field。结构体中连续几个成员共用一个整型存储单元可以节省内存但可移植性差、访问速度可能变慢。考试时只要会算sizeof大小就够了实际工程中除非做协议解析否则尽量避免。6.2 答题中容易犯的低级错误技术之外的坑其实更多。这里整理一份“交卷前检查清单”每一条都是真实踩过的检查项说明编程题是否写了返回值手写代码经常漏掉return语句尤其是非主函数边界值是否处理链表为空、字符串为NULL、数组长度为1这些分支必须写上变量是否初始化局部变量不初始化默认值是随机的这是运行时崩溃的高危因素循环终止条件是否正确i n写成i n导致越界是最常见的低级错误是否用了不确定的库函数比如C语言的gets已经被废弃写了会扣分函数参数是否检查空指针入口处加一句if (p NULL) return;成本极低印象分极高还有一条针对英文题的提醒外企笔试试卷里有不少英文题干看不懂不要慌优先抓关键词。比如“Which of the following statements about TCP is correct?”核心就是“TCP correct statements”用已有知识去匹配选项不要逐词翻译。7. 结合当前市场再看这类笔试题的价值7.1 安全赛道开发岗的岗位方向回到开头说的趋势科技如果你今天再去投这类安全厂商的开发岗大概会面对比2017年更宽的岗位方向终端安全引擎开发、防火墙规则分析、云原生安全、数据防泄漏客户端甚至还有一部分做机器学习检测模型落地的岗位。但笔试的核心逻辑并没有变依然是“基础为上”。安全产品需要直接处理网络流量、解析恶意文件、监控系统行为任何一个细节出错轻则误杀重则放漏攻击。所以这类厂商宁可招一个基础扎实、能老老实实写C的人也不愿意招一个只会调框架、但连指针和字节对齐都搞不清楚的人。7.2 从趋势科技到极兔Java岗笔试内卷的观察最近“极兔Java开发岗卷吗”这个词条挺热不少人在问物流快递赛道的互联网技术岗是不是越来越难进。我看了下他们的面经发现笔试内容其实和趋势科技B卷高度重合Java基础、并发编程、MySQL索引优化、Redis、一道算法题。底层逻辑是一样的——公司要的不是你背了多少框架而是解决问题时脑子是否清楚。所以我的建议是不要因为目标公司不同就只看“针对性”的题库。2017年的老题放到2026年依然有效因为C/C内存模型没变、TCP/IP协议没变、事务的ACID没变。真正变的只是语言和框架的外壳。把这份B卷吃透了无论去安全厂商、去快递公司的Java岗还是去任何一家重视基础的开发团队你都能少踩几个坑。回顾我自己当年准备笔试的过程收获最大的不是刷了多少题而是强迫自己把“差不多知道”变成“精确知道”。比如sizeof和strlen的区别、TIME_WAIT存在的原因、索引为什么会失效这些问题以前都是模模糊糊的。直到我对着试卷一道一道画图、查资料、写验证代码才真正把盲区补上。如果你现在也在准备校招建议按这个顺序来先拿一套往年真题做定时模拟严格按照90分钟来做完后不要只看对错把每道题涉及的知识点写下来找到自己最薄弱的两个方向集中补一周再重新做一次。这个方法我带过几个学弟学妹试用过效果比盲目刷题好得多。最后再分享一个小技巧把常见考点的内存布局、执行流程图亲手画一遍比看十遍笔记都有用。