最近整理了一下面试记录,发现这两年我居然面试了一百多个人。

从初级开发到高级架构师,从校招应届生到工作十年的老油条,从前端到后端到全栈,各种背景的候选人都见过。有的面试让人眼前一亮,有的面试让人昏昏欲睡,有的面试结束后我会主动加对方微信,有的面试结束后我只想赶紧忘掉。

这篇文章是一篇随笔,不想写什么严肃的面试指南,只是想聊聊这一百多场面试下来,我观察到的一些现象、总结的一些经验、产生的一些思考。既是给求职者的参考,也是给自己的一个复盘。

简历:第一印象很重要

面试从看到简历的那一刻就开始了。

一百多份简历看下来,我发现简历的质量差异非常大。有的简历一页纸,信息清晰,重点突出,看一眼就知道这个人做过什么、擅长什么。有的简历五六页,密密麻麻全是字,看了半天找不到重点。还有的简历错别字连篇,格式混乱,甚至把公司名和项目名都写错了。

作为面试官,我看一份简历的时间通常不超过两分钟。在这两分钟里,我需要快速判断这个人是否值得约面。所以简历的第一印象非常重要。

我总结了几个简历中常见的问题。

第一个是"职责描述"而不是"成果描述"。很多人的简历上写的是"负责XX系统的开发和维护""参与XX项目的前端开发",但没有说清楚你具体做了什么、取得了什么成果、用了什么技术、解决了什么问题。我想看的不是你的职责,而是你的贡献。"负责订单系统开发"和"主导订单系统重构,将接口响应时间从800ms降到120ms,日订单处理量提升3倍",这两种描述的说服力天差地别。

第二个是技术栈罗列。很多人在简历上列了一大堆技术:Java、Python、Go、React、Vue、K8s、Docker、Redis、Kafka……看起来什么都会,但一问细节就露馅了。我更希望看到的是你真正精通的两三项技术,以及你用这些技术做了什么。广度当然重要,但深度更重要。一个在某个领域有深入理解的人,比一个什么都懂一点但什么都不精的人更有价值。

第三个是项目经历的真实性。面试的时候我经常会追问项目细节,比如"这个项目的QPS是多少""你用的这个中间件为什么选它不选另一个""这个技术难点你是怎么解决的"。如果项目是真的做过,这些问题应该能答上来。如果是编的或者只是打了个酱油,很容易就露馅了。简历可以适当包装,但不要造假,因为面试的时候一追问就知道了。

第四个是错别字和格式。这个说起来是小事,但真的很影响印象。一个连自己简历都不认真检查的人,我很难相信他在工作中会认真。特别是技术岗位,细心和严谨是基本素质。

技术面试:基础比框架重要

技术面试是最核心的环节。面了一百多个人之后,我最大的感受是:基础比框架重要。

现在的前端面试,很多人一上来就聊React、Vue、Webpack、Vite这些框架和工具,但一问JavaScript的基础——原型链、闭包、事件循环、作用域——就答不上来了。后端也是一样,很多人会用Spring Boot、会用MyBatis,但一问JVM内存模型、GC原理、数据库索引原理,就支支吾吾。

我不是说框架不重要。框架是工作中必须用的,当然要会。但框架是会变的,今天流行React,明天可能流行别的。而基础是不变的,JavaScript的语言特性、计算机网络、操作系统、数据结构与算法,这些东西掌握了,学什么新框架都快。

我面试的时候特别喜欢问基础题。不是为了刁难人,而是因为基础能反映一个人的学习能力和技术深度。一个基础扎实的人,即使他没用过我们现在用的技术栈,我也相信他能很快上手。而一个只会用框架但基础薄弱的人,遇到框架解决不了的问题时,往往就束手无策了。

还有一个观察是:很多人会"背题"。现在网上有很多面试题合集,有些人把这些题背得滚瓜烂熟,面试的时候对答如流。但只要我换一个角度问,或者追问一下原理,就会发现他只是记住了答案,并没有真正理解。背题可以帮你通过初级面试,但到了中高级面试,光靠背题是不够的。

我还发现一个有趣的现象:工作年限和技术水平不一定成正比。有的人工作了五六年,技术水平还停留在两三年的水平,因为他一直在做重复性的工作,没有主动学习和提升。有的人只工作了两三年,但技术深度和广度都很不错,因为他有好奇心,愿意钻研。所以面试的时候我不会太看重工作年限,更看重的是这个人的学习能力和成长潜力。

软技能:技术之外的东西

技术面试通过之后,我还会考察一些软技能。这些东西看起来不如技术重要,但实际上对一个人的职业发展影响很大。

第一个是沟通表达能力。面试的时候,我会注意候选人能不能把一个问题讲清楚。有的人技术不错,但表达能力很差,问他一个问题,他说了半天你不知道他在说什么。在实际工作中,沟通能力非常重要。你需要和产品经理沟通需求,和设计师沟通交互,和同事沟通技术方案,和老板汇报进度。如果沟通能力差,即使技术再好,工作效率也会大打折扣。

第二个是解决问题的思路。我面试的时候经常会问一些候选人可能没接触过的问题,不是为了考倒他,而是想看他的思考过程。优秀的候选人会说"这个问题我没遇到过,但我觉得可以从这几个方面来考虑……",然后一步步分析,即使最后答案不完全正确,思路也是清晰的。而差的候选人会直接说"我不会",或者瞎猜一个答案。解决问题的能力比记住多少知识点更重要。

第三个是对技术的热情。我会问候选人最近在学什么新技术、有没有看过什么技术博客、有没有参与过开源项目。不是说每个人都必须搞开源,但一个对技术有热情的人,会主动去学习、去探索、去分享。这种人在团队里往往能带来正能量,也能成长得更快。而那些把编程只当成一份工作、下班就不再碰技术的人,通常成长比较慢。

第四个是团队合作。技术工作不是单打独斗,需要和团队成员协作。我会问候选人在项目中是怎么和同事合作的、遇到意见不一致怎么办、有没有和别人发生过冲突以及怎么解决的。通过这些问题,可以看出一个人的团队合作能力和情商。技术再强,如果不能和团队好好合作,也是不行的。

我招过的最好的人

面了一百多个人,我招进来的大概有二十多个。其中有几个让我印象特别深刻,他们身上有一些共同的特质。

第一个特质是"有好奇心"。他们不满足于"能用就行",会去搞清楚背后的原理。比如用了一个框架,他们会去看源码,理解它的实现机制;遇到一个bug,他们会深挖根因,而不是改到能跑就行。这种好奇心驱动他们不断学习,技术水平提升得很快。

第二个特质是"能扛事"。遇到难题的时候,他们不会退缩,也不会把问题推给别人,而是主动去研究、去解决。有一次线上出了一个很复杂的bug,团队里几个人研究了一天都没头绪,一个新来的同事主动接了这个问题,熬了一个通宵,最后找到了根因并修复了。从那以后我就知道,这个人是可以托付重要任务的。

第三个特质是"沟通好"。他们能把复杂的技术问题用简单的话讲清楚,能和非技术背景的同事顺畅沟通,能在会议上清晰地表达自己的观点。这种人在团队里非常稀缺,因为技术好的人不少,但技术好又会沟通的人不多。

第四个特质是"有owner意识"。他们不会只做分配给自己的任务,而是会主动关注整个项目的进展,发现问题就提出来,看到可以改进的地方就去做。他们把项目当成自己的事情,而不是"这是老板让我做的"。这种人是团队的骨干,是可以培养成leader的人。

反观那些面试的时候表现不错但进来之后不行的人,通常的问题是:只会做分配的任务,不主动思考;遇到困难就退缩,需要别人推着走;沟通能力差,和别人合作起来费劲;学习能力弱,技术水平提升缓慢。

所以面试的时候,我越来越看重这些软技能和个人特质,而不仅仅是技术能力。技术可以学,但性格和态度很难改变。

招聘中的误区

作为面试官,我也犯过一些错误,走过一些弯路。

第一个误区是"唯学历论"。刚开始面试的时候,我会比较看重学历,985/211毕业的会有加分。后来发现,学历和工作能力不一定成正比。有些名校毕业的人,眼高手低,基础不扎实,还不愿意做基础工作。有些普通学校毕业的人,反而技术扎实,态度认真,成长很快。现在我看简历的时候,学历只是参考,更看重的是项目经历和技术能力。

第二个误区是"完美主义"。总想找一个"完美"的候选人,技术又好、沟通又好、薪资要求又低、马上就能入职。但实际上这样的人很少,而且即使有,也不一定愿意来。招聘是一个匹配的过程,不是找最好的人,而是找最合适的人。只要核心能力达标,其他方面可以培养,就应该考虑录用。

第三个误区是"只看技术不看文化"。有时候为了急着招人,会降低标准,把一些技术不错但性格有问题的人招进来。结果发现,这种人在团队里会造成很多问题,和同事关系紧张,影响团队氛围。最后要么他自己走,要么被劝退,反而浪费了时间和资源。现在我面试的时候会特别关注候选人的性格和价值观是否和团队匹配。

第四个误区是"面试反馈不及时"。有时候面完试觉得还不错,但因为各种原因没有及时给反馈,等想起来的时候候选人已经接了别的offer。招聘是一个双向选择的过程,好的候选人手上通常有多个offer,你不及时行动,别人就抢走了。现在我要求自己,面试结束后24小时内必须给出明确的反馈,行还是不行,不能拖着。

给求职者的建议

最后,从面试官的角度,给正在找工作的朋友一些建议。

第一,认真准备简历。简历是你的敲门砖,花时间把它写好。突出你的成果和贡献,而不是罗列职责。控制在一页到两页,重点突出,格式清晰。投出去之前仔细检查,不要有错别字。

第二,夯实基础。不要只学框架,要把基础打扎实。JavaScript/Java/Python的语言特性、计算机网络、操作系统、数据结构与算法,这些东西是面试的重点,也是你职业发展的根基。

第三,做真实的项目。简历上的项目一定要是你真正做过的,并且要能讲清楚细节。面试的时候面试官会追问,编的项目很容易露馅。如果项目经验不够,可以自己做一些 side project,或者参与开源项目,这些都可以写在简历上。

第四,练习表达。很多人技术不错,但面试的时候表达不出来,很吃亏。可以找朋友模拟面试,练习把一个技术问题讲清楚。表达的时候先说结论,再展开细节,逻辑清晰,不要东拉西扯。

第五,诚实。不会的问题就说不会,不要瞎编。面试官问你一个问题,不是期望你什么都会,而是想看你的思考过程和诚实态度。你可以说"这个问题我不太了解,但我可以说一下我的理解",然后尝试分析。诚实比装懂更能赢得面试官的好感。

第六,反问环节。面试最后通常会有"你有什么问题要问我吗"的环节。不要说"没有问题",这会让面试官觉得你对这个岗位不感兴趣。可以问一些关于团队、技术栈、项目、发展空间的问题,既展示了你的兴趣,也能帮你判断这个公司值不值得去。

写在最后

面试了一百个人之后,我最大的感受是:面试其实是一个双向了解的过程。

面试官在了解候选人,候选人也在了解面试官和公司。一场好的面试,应该是一次愉快的技术交流,而不是一场审问。作为面试官,我希望能在面试中发现候选人的闪光点,也希望候选人能通过面试了解我们团队和技术。

这一百多场面试,让我看到了各种各样的人,也让我反思了很多关于招聘、关于技术、关于职业发展的问题。我自己也在这个过程中不断学习和成长,从一个不知道怎么面试的新手,变成了一个有自己方法论的面试官。

最后想说:无论是面试官还是候选人,都应该认真对待每一场面试。因为你永远不知道,这场面试会给你带来什么——可能是一个优秀的同事,可能是一份理想的工作,也可能是一次难忘的交流。

愿每个求职者都能找到适合自己的工作,愿每个团队都能招到合适的人。