翻到自己2019年秋招的笔经笔记,我盯着“趋势科技 技术岗 客观题”这行字看了很久。那次笔试是我整个秋招里做得最拧巴的一场:说难吧,没有一道题超纲;说简单吧,每一道题都在考察你对知识点“背得出但用不对”的底层理解。后来拿到offer之后跟面试官聊起来,才知道这份客观题不是随便出的,背后对应着趋势科技作为安全厂商对工程师基本功的特定要求。
这篇文章不打算直接丢一份“题+答案”的清单给你,因为客观题这种东西,背答案是最没用的。我会按当年的记忆和复盘,把这份试卷涉及的考察维度、典型题目背后的逻辑拆开讲透,再给出一套可复用的备考思路。无论你是准备安全厂商的技术岗,还是想检验自己计算机基础够不够扎实,这篇都值得你花二十分钟慢慢看。
1. 为什么这份笔试值得逐题复盘:外企安全厂商的选人逻辑
先说大背景。趋势科技在安全圈里的地位不用多讲,老牌终端安全、网关安全、云安全厂商,技术岗招人一直走“基础扎实优先”的路线。2019年秋招这波技术岗客观题,给我最直观的感受是:它不太考察你简历上写了多少项目、你会多少种框架,而是用一套覆盖面很广的客观题,先把“计算机底子”筛一遍。
这套逻辑其实很符合安全厂商的选人习惯。做安全产品的人,面对的是一整个操作系统、网络协议栈、运行时环境,任何一个环节的理解有盲区,都可能在高强度攻防对抗中掉链子。所以笔试阶段不搞花活,就用客观题把操作系统、网络、数据结构、算法、编程语言、数据库这些基础课过一遍,看起来传统,实际上非常有效。
我当时进考场前还有点轻视,觉得客观题不就是选择题吗,刷刷牛客题霸就够了。真坐在电脑前才发现,它的题目风格和国内互联网大厂的常规笔试题有明显区别:题干长、选项接近、很多题要用排除法至少推两轮。说白了,它考的不是“你见过这道题吗”,而是“你真的理解这个机制吗”。
现在回头看,这份笔试的筛选逻辑可以概括成三点。第一,用客观题快速过滤基础薄弱的人,为后续面试节省时间。第二,通过题目分布判断候选人的知识结构是否全面,安全研发不能只懂一个方向。第三,通过一些带有安全属性的题目,提前识别你对“系统底层”和“对抗思维”是否敏感。理解了这三点,你就知道复习的时候不该把精力花在猜题上,而是要老老实实把每个考点背后的机制弄明白。
2. 从岗位JD反推考点范围:2019秋招客观题的知识地图
我拿到试卷后的第一个动作是通览全部题目,标记出考察模块。这份试卷大概覆盖了七个方向,和当年技术岗岗位JD里写的能力要求完全对得上。我把每个模块对应的核心考点列一张表,后文逐个展开。
| 考察模块 | 核心考点 | 大致占比 |
|---|---|---|
| 操作系统 | 进程线程、死锁、内存管理、文件系统 | 20%左右 |
| 计算机网络 | TCP/IP、HTTP/HTTPS、DNS、路由与交换 | 20%左右 |
| 数据结构与算法 | 复杂度分析、树、图、排序、查找 | 20%左右 |
| 编程语言 | C/C++内存模型、指针、Java垃圾回收 | 15%左右 |
| 数据库 | 索引原理、事务隔离、SQL优化 | 10%左右 |
| 安全基础 | 常见攻击原理、加密算法、安全编码 | 10%左右 |
| 逻辑与工程素养 | 场景判断、方案选型、边界条件 | 5%左右 |
这张表不是官方的,是我根据回忆整理的近似分布,但方向不会有太大偏差。从这张知识地图能看出来,趋势科技的客观题非常“科班”,几乎不考框架、不考工具链,全部聚焦在计算机核心课程上。
有意思的是,它的操作系统和网络这两块,占比明显比一般开发岗笔试要高,而且题目切入角度往往带一点“系统视角”。比如同样考进程和线程的区别,多数公司会直接问“哪些是进程独有的资源”,趋势科技可能会把一个场景描述出来:一个多线程程序里某个线程崩溃了,问对整个进程会造成什么影响。这种题其实是在考察你对“地址空间、页表、文件描述符表、信号处理”这些底层机制的整合理解,不是背概念就能答对的。
所以在复习备考的时候,我建议先按这个知识地图做一次自测:每一个模块,能不能不看教材,用自己的话说清楚核心概念和典型应用场景?如果做不到,说明这块是薄弱项,需要优先补。不要一上来就刷题,顺序反了会浪费大量时间。
3. 高频题型拆解:那些看似基础实则挖坑的选择题
这一节我挑几类当年印象最深的题型,每一类都说说它表面上在问什么、实际在考什么,以及破题的关键思路。你要是准备类似笔试,这些都是可以直接拿去用的判断方法。
3.1 C/C++内存与指针:不是考语法,是考内存布局
这类题在试卷里非常扎眼。比如给一段代码,定义一个结构体,里面有char、int、short,问sizeof这个结构体是多少。很多人第一反应是逐字节相加,忘了对齐规则,结果选错。破题的关键是心里始终有一张内存布局图:每个成员变量的偏移量、对齐系数、结构体总大小如何取整。
更进阶一点的题会考察数组名和指针的关系。比如声明char arr[] = "hello"和char *p = "hello",问sizeof(arr)和sizeof(p)分别是多少。前者是数组占用空间,包含最后的\0,所以是6;后者是指针本身的大小,64位系统下是8。这题坑就坑在“看起来都是hello,实际上一个是数组,一个是常量字符串首地址”。
备考这类题,我的经验是别死记“数组名在表达式里退化为指针”这句话,而是要理解:数组名代表一整块连续内存,指针只是一个保存地址的变量。你在做题时画一下内存图,把每个变量的存放位置标出来,基本就不会错。当年我在这个考点上栽过一次,后来养成画内存图的习惯,遇到类似题就稳了。
3.2 死锁与并发:连环场景题最容易翻车
操作系统的死锁考点,常规问法是“死锁产生的四个必要条件是哪四个”。但趋势科技的客观题喜欢给场景:两个线程各自持有一把锁,同时等待对方释放,中间还穿插了一个“请求资源”的操作,问这种情况是否会导致死锁,以及如何破坏哪个条件来解决。
这种题的难点在于,场景里的代码不会直接告诉你“我就是要造成死锁”,而是用看起来很正常的业务逻辑包了一层。你需要快速识别出:资源是不是互斥的、线程是否持有了一个资源又在等另一个、系统是否允许抢占、是否存在循环等待。四个必要条件只要有一个不满足,就不会死锁,这是判断的起点。
另外并发相关的题还会考到原子性、可见性、有序性,会结合Java的synchronized或volatile来出题。这类题考的不是你背过多少并发工具类,而是你知不知道JMM(Java内存模型)里主内存和工作内存的交互关系。复习的时候同样建议画图,把线程、主内存、本地内存、指令重排序这些概念串起来,做题会比死记答案靠谱得多。
3.3 TCP与HTTP细节题:背了三次握手还不够
网络部分的客观题,几乎人手一道“TCP三次握手为什么不两次”或“四次挥手为什么需要TIME_WAIT”。但我印象更深的是一道与HTTP缓存相关的题,题干描述了客户端请求资源、服务器返回304的画面,问这个过程中HTTP头的核心字段是什么,客户端和服务器各自做了什么验证。
这类题已经跳出“背协议状态码”的层面,进入“理解HTTP缓存协商机制”的维度。你要清楚ETag、If-None-Match、Last-Modified、If-Modified-Since之间的关系,也要知道强缓存和协商缓存的区别。趋势科技作为安全厂商,网络协议是基本功,所以在笔试里出现这种题非常合理。
备考网络模块时,建议把协议栈一层一层过,不要只看TCP和HTTP。比如DNS解析流程、ARP协议在工作组里的作用、路由协议里静态路由和动态路由的优缺点,这些都有可能出现。一个讨巧的复习方法是:自己模拟一次“用户在浏览器输入网址到看到页面的完整过程”,把涉及到的协议按顺序写出来,能写全,说明网络基础过关了。
3.4 时间复杂度陷阱:别只盯着循环层数
数据结构与算法的客观题,除了直接考排序算法的时间复杂度,还会出一些需要推导的递推式。比如一个递归函数里做了一次O(n)的操作,然后递归调用两次n/2规模的子问题,问总时间复杂度是多少。
很多人看到T(n) = 2T(n/2) + O(n)就直接写O(nlogn),这是主定理的经典结论。但题目可能变形成T(n) = 2T(n/2) + O(1),这时候时间复杂度就不再是O(nlogn)而是O(n)了。关键在于递归里每次合并的代价是多少。遇到这类题,老老实实画递归树,每一层的代价加起来,比背公式要稳妥。
还有一个高频考点是各类排序算法在特定场景下的表现。比如“一个几乎有序的数组,用哪种排序算法效率最高”,答案通常是插入排序,因为它的最好时间复杂度是O(n)。这种题考的是“算法在不同输入下的表现”,属于复杂度分析加工程判断的综合题。复习排序时不能只背平均复杂度,最好情况、最坏情况、额外空间、稳定性,这些维度都要能说出来。
3.5 数据库索引与事务:从原理到场景
数据库部分的客观题,最经典的是“为什么用B+树做索引而不是用哈希表或二叉搜索树”。这道题背后考的是对磁盘IO和范围查询的理解:哈希表在等值查询下很快,但做不了范围查询;二叉搜索树在极端情况下会退化成链表;B+树的非叶子节点只存键、叶子节点存数据且有序串联,既适合磁盘预读,又适合范围扫描。
事务隔离级别的题也常见。它会给你一个并发场景,比如事务A读取了一行数据,事务B更新并提交了这行数据,问事务A再次读取时会看到什么值,这取决于当前隔离级别。这时候你要能分清楚脏读、不可重复读、幻读分别在哪个级别下被阻止。我的经验是画一张表,把四个隔离级别和三类问题能不能发生的对应关系列出来,考前看一遍就够用了。
3.6 安全基础题:外企安全厂商的“特色菜”
既然考的是安全厂商,客观题里夹带安全考点是必然的。这部分题目并不会直接问你“如何攻击别人”,而是考基本的安全机制和防护思路。比如加密算法这块,会问到对称加密与非对称加密的区别,各自适合什么场景,HTTPS握手过程中两者如何配合使用。你不需要会用OpenSSL写完整实现,但要知道AES是典型的对称加密算法,RSA是非对称加密算法,也清楚混合加密的原因:对称加密快但密钥分发难,非对称加密安全但慢,所以HTTPS用非对称加密协商对称密钥,后续通信走对称加密。
还会出现一类“安全编码”题,比如一段C代码在拷贝字符串时没有做长度检查,问可能导致什么问题。这题其实是在考缓冲区溢出。生产环境里缓冲区溢出是严重的高危漏洞,笔试出现这种题,说明趋势科技希望工程师在工作中有安全编码意识,而不仅仅是“把功能写完就行”。复习这一块时,不需要真的去看渗透测试教程,把常见的安全基础概念,比如SQL注入、XSS、CSRF的定义、成因和基本防御思路搞清楚,就足够应对客观题了。
4. 客观题里潜伏的安全厂商属性:与普通互联网公司笔试的差异
做这套题的过程中,我明显感觉它和同期的互联网大厂笔试风格不同。差异不在难度,而在“出题视角”。普通互联网公司更关注你能不能用框架快速交付业务功能,所以客观题相对偏向语言特性和常用中间件;趋势科技作为安全厂商,更关注你对系统运行机制的理解,因为安全产品必须深入到内核、协议栈、运行时这些层面做防护。
举个例子,普通公司问Linux命令可能是“如何查看当前目录下的文件”,趋势科技却可能问“如何查看某个进程打开的文件句柄”,接近答案是lsof -p <pid>,但题目的场景可能是“排查一个进程为什么无法删除某个文件”。这种题已经不是单纯考命令,而是考你有没有排查真实系统问题的经验。
同样都是考Java,普通公司可能问HashMap的底层实现和扩容机制,趋势科技的题可能会问“写到一半的内存屏障”和“指令重排序对单例模式的影响”。这背后就是安全工程师的日常:要理解并发环境下运行时行为,才能写出既正确又安全的代码。这类差异在复习的时候要特别留意,不要用准备普通后端岗的方式去备考安全厂商。
从复习策略上看,我的建议是:对每一个核心考点,多问一句“如果我在写一个安全产品,这个知识点会用在哪个地方”。这样想一遍,知识就不是死的了。比如学TCP状态迁移的时候想一想,如果我要做一个网络入侵检测系统,是不是需要理解每个连接的状态超时和异常迁移?学文件系统权限的时候想一想,如果是做终端安全产品,是不是要清楚恶意程序如何通过文件权限提权?这种思考方式能帮你在客观题里快速识别出题人想要什么样的候选人。
5. 复盘后的备考建议:如何在有限时间拿下这类笔试
笔试本身只是门槛,过了笔试后面还有两三轮面试。但客观题这个环节刷人特别狠,因为它的覆盖面太广,任何一门基础课有明显短板都可能挂掉。我根据自己的复盘经验,把备考要点整理成五个方面,准备校招或跳槽安全厂商技术岗的同学可以照这个思路准备。
第一,先做知识地图自测,再决定刷题顺序。不要一上来就打开题库随机刷,那样效率极低。你先按第2节的七个模块,每个模块给自己出一套基础题自测,找到最薄弱的三个模块,集中精力先补短板。我当时最弱的是数据库和网络,所以前两周基本都在啃这两块。各模块均衡是客观题拿高分的核心策略。
第二,造一套“讲题笔记”,不要只记答案。每做完一道有价值的题,把这道题涉及的知识点用自己的话讲一遍,写清楚“为什么选这个选项、其他选项错在哪里”。这个习惯能帮你把被动刷题变成主动理解。我当时用飞书文档整理了一份讲题笔记,考前翻了三四遍,效果比二刷题库好太多。
第三,做真题要分析选项的“梯度”。客观题最大的特点是选项之间有迷惑性。你要养成一个习惯:做对一道题之后,把其余三个选项为什么错,也写清楚。这能锻炼你对知识边界的把握。比如一道考死锁的题,选项里可能有一个是“增加锁的粒度可以避免死锁”,这看起来有点道理,但仔细想,增加锁的粒度最多是降低死锁发生概率,并不能从机制上破坏死锁的某个必要条件,所以这个选项是错的。这种分析能力,光靠刷题很难练出来,必须靠“抠选项”。
第四,控制答题节奏,先易后难。这套笔试题量不算少,每道题的分值都差不多,没必要在一道题上死磕。我的策略是第一轮先做有把握的题,把该拿的分拿到手;第二轮再回来啃那些需要推演的题。遇到完全没思路的场景题,先按第一直觉选一个,做好标记,有时间再细想。笔试系统一般没有倒扣分机制,空着一定没分,选了至少还有概率对。
第五,留出时间复习操作系统和网络。这两个模块占比最高,也是最容易通过短期集中复习提分的。操作系统的复习主线是“进程线程->调度->同步互斥->死锁->内存管理->文件系统”,网络的复习主线是“应用层->传输层->网络层->链路层,重点看TCP连接管理、HTTP缓存、DNS解析”。把这两条主线捋顺,笔试的基本盘就稳住了。
还有一个比较容易被忽略的点:读题要慢。客观题里经常有“以下哪项不属于”“最不可能导致”这类否定式问法,一着急容易选反。我见过不少人在这种地方丢分,不是不会,是心态太急。稳下来,题目说“不属于”,你就要先找到“属于”的排除掉,剩下的才是答案。
6. 备考心态与临场经验:拿不到满分不重要,拿稳基础分最重要
最后想聊一聊我在准备这类笔试时的心态变化。说实话,我一开始是冲着“把题目全做对”去的,复习的时候总想在每个模块都做到完美,结果压力很大,反而影响了效率。后来我想明白一件事:客观题的目的是筛选,不是竞赛排名。你不需要所有题都会做,只要拿到足够高的分数,进入面试环节就行。所以复习的时候要有取舍,把高频考点和基础题牢牢抓住,比花大量时间去抠偏题怪题划算得多。
我当年的做法是:给自己划了一条“基础分底线”,也就是操作系统、网络、数据结构这三块的高频题目必须保证正确率在八成以上。这三块占比超过一半,拿稳了,整体分数就不会差。编程语言、数据库、安全基础再各拿一半左右,进面试就很有希望。笔试毕竟只是第一步,面试里表现出来的工程能力和思维深度,才是决定能否拿offer的关键。
临场做题的时候,有个小技巧可以分享:遇到拿不准的题,先看选项之间的差异,再看题干里的限制条件。很多题目的意图就藏在一两个关键词里,比如“单线程”“多进程”“共享资源”“无锁”。把这些关键词圈出来,再对照选项,通常能排除掉一半错误答案。这比凭感觉蒙要靠谱得多。
另外,我真的建议在笔试前找一套真题模拟一下限时作答。不需要是同一家公司,风格相近的安全厂商或外企技术岗笔试题都行。模拟的时候严格按照考试时间来,提前感受一下做题的节奏。我第一次模拟的时候,因为在一道网络场景题上纠结太久,导致后面几道数据结构题没时间细算,白白丢了分。后来调整策略,先易后难,模拟分数立刻上来了。
这份2019年的笔试总结放到今天看,我觉得价值依然很大。因为计算机基础这些内容不会过时,安全厂商对工程师基本功的要求也不会降低。反过来,如果你正在准备类似的岗位,与其到处找题库刷题,不如先静下心来把操作系统、网络、数据结构、数据库这几门课踏踏实实过一遍。把根基建扎实了,不管笔试题目怎么变,你都有底气应对。