题图 | Silicon Valley
导读
近日,互联网大厂的「裁员」话题上了热搜,据说有的公司裁员数量高达总员工数的30%。在目前僧多肉少、行业内卷加剧的背景下,出现这种情况并不意外。但不论怎样,生活还得继续,不管是经历裁员的人,还是在主动寻求其他工作的人,都在观望新的机会。
有人认为,只要是人才,就不怕找不到工作。但是技术水平高也不一定能帮你拿下工作机会。最关键的还是如何闯过面试这一关。今天给大家分享一篇文章,谈一谈程序员面试的技巧,希望对大家有所帮助。
作者:Edward Guiness
译者:石宗尧
通常来说,面试过程和人的行为一样,都是难以预测的,你永远不知道会发生什么。充分的准备是你的秘密武器。虽然面试的过程无法预测,但如果你有所准备,就可以轻松搞定面试。
1
面试前的准备
想要在面试前做到万事俱备,就不要只关注技术类问题。技术类问题只是面试的一部分,还有很多其他种类的问题,有些是有关团队精神、执行力的,还有些用于测试你和企业文化的匹配度。除了技术,面试官可能还想看看你的抗压能力、表达能力,以及面对批评时的反应。
如果面试官只关心你的编码能力,只在网络上做在线测试就足够了。面对面的面试远不止技术能力评估。虽然很多公司都对外宣称只录用“最好的程序员”,但实际情况并非如此,技术最强未必能帮你赢得职位。尽管看起来很不公平,但这就是现实。
图/Silicon Valley
1.1 了解充分
公司的高层人员会决定企业文化的基调。如果公司高层非常随意、友好,这种态度就可能会成为企业文化;如果高层人员非常严肃、认真,那么其他人也会受影响,不论在办公室还是休息室,都能感受到这种氛围。小公司的氛围一般不如大公司严肃,但公司的规模不是决定性因素。
对于微软、谷歌、亚马逊这类大型公司的企业文化,你可能已经非常了解,但对于那些非知名公司的企业文化,你就需要做些调查了。
想了解一家公司的企业文化,最好的方法是和该公司的员工直接对话。如果你很幸运,恰好有朋友在那里工作,我建议你请他吃顿饭,然后一股脑地问他100个问题。如果不认识其中的员工,就要另想办法了。
首先,要上网搜索公司信息。刚开始,你会发现很多有关公司商业形象的信息,但用不了多久,就能找到公司企业文化的线索。如果够幸运,你还能找到公司理念的官方声明,甚至是公司的官方博客。如果你能查到公司高层的名单,就可以搜到他们的新闻。新闻里可能引用了他们说过的话,对你而言,这些话是相当有用的。
如果你委托了招聘中介找工作,那就咨询一下中介,搞清楚该公司的企业文化是什么。好的中介会有第一手的信息资源,虽然不是公司员工,但仍能给你提供一些有用的信息。
如果上述方法都失败了,那就直接给公司打电话。不要觉得难为情,这是个合情合理的咨询电话。
最坏的情况是对方不想帮这个忙,但这一般并不是针对你的,而是出于公司规定的考虑。如果遇到这种情况,那就要求对方把电话转到人事部门,或者直接转到你应聘的部门。请记住,不论对方态度如何,你都要保持礼貌和尊重。
在调查完公司的企业文化之后,你应该把注意力转移到招聘经理身上。同样,向认识的人打听,在网络上搜索,咨询招聘中介。对于直接打电话给招聘经理这件事,笔者持谨慎态度;但如果你想打这个电话,就应该问更多的事情,包括面试流程如何进行。
至少,你应该把面试的安排搞清楚:
- 面试会持续多久?
- 现场面试是一次还是多次?
- 有技术测试吗?如果有,会以何种形式进行?
- 在面试中需要写代码吗?
- 有多少人参加面试?都是什么人?
- 有什么特殊事项需要注意吗?
1.2 做足功课
调查之后,你搜集到了很多有关公司文化的信息,也从招聘经理那里得到了一些面试信息。有了这些信息,你就可以开始练习了。
如果你面试的公司是家技术型公司,就要集中精力练习数据结构和算法,以及如何设计软件的可扩展性。小规模的技术型公司可能会要求程序员具备广阔的知识面,因此你需要复习服务器管理,网络故障排查,数据库配置等相关知识。在大公司,由于有专门的团队负责维护服务器和设备,因此你不需要具备这方面的知识。
有件事你可能不喜欢,但一定要去做:问自己最害怕的问题。
图/insights.dice.com
说实话,什么问题会让你在面试中颜面无存?也许你对排序算法感到非常恐惧;也许你不太理解广度优先搜索算法和深度优先搜索算法的区别;也许你因为顶撞团队领导而不得不辞职;也许你持有一些有争议的观点,例如,觉得代码注释是代码冗余的另一种形式。
如果你平时不去直面这些问题,在面试中就必须面对,明眼人都能看到这点。因此,在面试前就搞定这些问题。
1.3 着装得体
在直面并战胜恐惧心理之后,就是时候选择一套合适的衣服了。
实话实说,我不太喜欢那些铺天盖地的着装建议,但有一点要承认,你的着装的确会影响其他人对你的看法。
首先,看看你目标公司的着装要求是什么。如果不远,可以在午饭时间直接去那里转转,看看人们都穿些什么。如果去不了公司,就问问公司的职员、招聘中介,或者直接打电话过去。
如果你真的不知道该穿什么,那就穿普通的正装吧。对男士来说,穿一件带领子的白衬衫,不要穿牛仔裤和运动装。千万别穿得太张扬。对女士来说也是一样,一套女式衬衫和裙子(不是超短裙)或者裤子。
对男士来说,尽量打上领带。但也要知道,在有些公司,特别是有极客文化的公司,人们都不太把时间花在穿衣服打领带上。如果你不确定面试中要不要打领带,那就先把领带装进包里,在需要的情况下打上领带。
最后,无论你穿什么衣服,都要尽量舒适。你在面试中会遇到很多挑战,不要让衣服增添麻烦。如果你因为外套太厚而满头大汗,就先礼貌地征得同意,然后脱掉它。不要默默忍受,你真的不必要因此而分神。
1.4 搞定不同类型的问题
总体来说,面试问题可以划分为以下几大类。回答问题的方式取决于问题的类别。
(1)技术对话——不要有所保留
在面试过程中,你可能会发现面试官不如你想象的那么擅长技术。不要错误地认为你需要降低对话的专业度,否则面试官将你同其他面试者进行比较的时候,这会置你于不利之地。他可能并不理解你说的每句话,但他对你的印象会被你的用语所影响。
如果非技术背景的面试官问了你一个技术问题,那么他期望的回答就是技术性的。面试官的手中可能有一张“小抄”,列出了所有问题和对应的答案。
如果同技术面试官打交道,更不要有所保留,应尽可能地仔细回答问题。如果非技术的面试官想让你从非技术角度解释一些东西,你可以用比喻的方法。
例如,面试官要求你用非技术语言解释什么是IP地址。维基百科对IP地址的定义如下:
网络协议地址(IP地址)是每个设备(计算机、打印机等)在计算机网络中所分配的一组数字标签,使用网络协议进行通信。
你想到的第一种比喻应该是IP地址很像通信地址。送信需要通信地址,而传递数据包需要有IP地址,因此这种比喻是说得通的。但是,不同国家的通信地址在格式和风格上有所不同,而IP地址则严格遵循全世界通用的一套标准。或许对IP地址更好的比喻是由经度和纬度构成的地理坐标?
比喻能够帮助非技术人员理解一些技术问题,但这种方式并不完美,存在很多局限。因此,使用比喻不要无限度。
图/iglu
(2)行为性问题
理论上,行为性问题是为了评估你在不同情形下的行为模式。
“在你的项目组里,有的人认为代码应该用空格对齐,有的认为应该用tab对齐,你怎么处理这种分歧?”
你的答案应该尽量直接,并且有事实佐证。这类问题是开放式的,没有固定的答案。但在编程技术面试中,回答问题的方式就不能太发散了。
“我觉得用哪种代码格式都没关系,只要保持一致就好。在Acme工作的时候,我们用SpaceMeister来确保代码格式的统一。因此,我觉得我会用采用这个方法来解决团队内的问题。”
(3)设计类问题
想回答设计类问题,就要对分析模式有一定的了解。面试官并不指望你给出一个“正确”答案,因为不存在适用于所有情况的正确答案。他希望你能展示思考的过程,以及设计的可行性分析。
如何辨认出设计类问题?有两种情况:当面试官着重使用“设计”这一字眼的时候;当问题看起来非常难或者含糊不清的时候。如果出现其中一种情况,就很有可能是设计问题。
“请设计一个算法,计算国际援助基金会如何均分资金给受益人。”
回答这类问题的唯一方式是把你自己的疑惑问出来。你需要向面试官证明自己的问题分析能力。如果问得恰到好处,答案就会越来越清晰(或者最后发现根本没有答案),这样就可以继续设计了(或者把得不到优秀设计的原因弄清楚)。
(4)技术突击测试
有些面试官很喜欢进行技术突击测试,你可以很轻易地辨别出这类问题。因为这类问题要么是非常模糊的,要么是非常具体的。
“在.NET4.5中,Tuple.Create方法被重载了多少次?”
这类问题无法提前准备,除非你的记忆力非常好,否则只能尽量给一个相对令人满意的答案:
(5)智力测试
另一种越来越少被问到的问题类型是智力测试。即使是在特定的情境(心理健康评估)下,这种问题也不好辨别。在程序员面试中,则更难辨别。有些面试官热衷于这类问题,希望程序员能顺利通过智商(IQ)测试,以此找出“最聪明”的程序员。
智商测试题的形式都差不多,稍加练习就可以找到规律。如果你知道面试官对这种问题情有独钟,就可以提前作准备,多找些问题勤加练习,以便在面试中轻松应对。
(6)压力面试
每位程序员都应该练习压力面试。压力面测试练习需要一位朋友帮忙,最好是一位咄咄逼人、声音洪亮的程序员。让你的大嗓门朋友找到(或者写下)一系列难题,模拟一次面试。你扮演求职者角色,朋友扮演不讲情面的面试官角色,面试时间为一个小时以上,把所有问题都问个遍。你的朋友需要表现出“残酷无情”的一面。这种练习的目的不是让你给出正确答案(当然,你应该尽量给出正确答案),而是锻炼你对真实面试环境的忍耐力。
图/pabu
2
最重要的事
接下来讨论如何与面试官建立默契,以及你可以在面试中做出的其他努力。
2.1 如何与面试官建立默契?
如果求职者想和面试官建立默契,该怎么做?
让我们从基本要素谈起。默契往往建立在共同目标的基础上。从表面上看,面试官在寻找适合职位的最佳人选,而求职者想说服面试官,让对方相信自己就是最适合的人选。但这并不是一个理想的切入点,因为这让求职者看起来像个推销员,在把自己作为商品推销给面试官。只有面试官和求职者能找到一些共同点,才是一个更好的开始。
其实面试官和求职者有太多的共同点。他们都想知道这份工作适不适合求职者,都想看看求职者的能力和职位描述有多少一致的地方,都想知道求职者在这个职位上能给出什么样的表现。
请不要误会,我不是说面试官和求职者的地位是完全平等的。我只是非常确信面试官和求职者考虑问题的出发点是相当一致的,这对建立默契非常有用。在根本上,面试官和求职者的目的是相同的,但在思考方式上,求职者应该作一个细微但重要的改变:不要口口声声地说自己完全符合职位需求,应该以合作的姿态,和面试官一起看看自己到底有多适合这份工作。这是令面试有效的根本出发点。
用合作的态度同面试官交流,你看到的东西也会不一样。你会真的对职位细节感兴趣,而不是被动等待面试官刁难,这样你就可以评估自己能否胜任这份工作。你不会担心面试官问你各式各样的理论问题,而是会试图了解自己的经验能否适应实际工作环境。你会注意到自己在技术上的弱项,意识到哪些知识需要在工作中加强。
这种态度非常重要,它可以让面试官感到放松。你在降低他们工作的难度,帮他们卸下“审讯官”的负担。尽管有些人并不介意扮演这个角色,但若想同面试官建立有效的默契,这是最快捷的方法。
2.2 其他努力
如果一个态度上的改变就能让面试非常顺利,那未免太过简单。实际上,我们还有很多工作要做。虽然你可能是个天生健谈的人,但如果能遵循以下原则,也会受益匪浅。
(1)用心倾听
永远不要贸然打断别人说话。如果你不得不这么做,至少应该先道歉。
认真倾听不只是安静地坐着。有技巧的倾听者可以用自己的语言复述所听到的内容,这让面试官非常安心,因为他能确认你在认真听他讲话,并且理解他想表达的内容。
(2)学会提问
请记住,面试是个信息交互的过程,你在回答问题的时候也要提出问题。和主动式倾听类似,有选择的提问也会让面试官感到放心,因为他知道你在听他说话,并且对话题的细节很感兴趣。
(3)模仿面试官的行为
有时候,有意识地模仿面试官的某些动作和行为,可能会收到意想不到的效果。他们坐下,你也坐下;他们向后靠,你也向后靠。我并不是让你去演一出即兴的无声喜剧,而是希望你同面试官建立起潜意识里的默契。经证实,这种技巧很有效,可以帮助面试官放松心情。
(4)寻找互动的方式
如果你天生内向,这很正常;许多软件工程师都比较内向,你的面试官也有可能很内向。但请记住,内向并不是腼腆的借口。
寻找共同点,找机会谈论你感兴趣的事物。如果你天生腼腆,至少试着保持眼神接触一到两次,头脑要清醒,吐字要清晰,语速要慢下来,在恰当的地方有所停顿。
3
同样重要的事
如果面试官不认可你作为程序员的能力,再好的默契也是白搭。因此,同样重要的事就是在恰当的时机展示你的才能。
3.1 表达要清晰
正常来说,面试官应该尽量鼓励求职者多说话。但是据我观察,很多面试官的话比求职者还多。如果你碰到一个口若悬河的面试官,那除了打断他,你没有任何机会表达自己的看法。注意听他的说话内容,寻找能把自己的工作经验与职位联系在一起的机会,有礼貌地打断他。如果面试官正在陈述自己的观点,那么最好等他说完。如果你倒霉透顶,碰上一个超级话匣子,那就用他讲话的时间作好准备,保持注意力的集中,趁面试官喘气的间隙打断他,加入到对话中。
3.2 掌控面试时间
通常来说,你会提前知道面试的时间长度。如果面试时间很短,那你就应该集中精力谈论最有价值的工作经验,因为那些经验和职位的关系最大。如果不清楚哪些要求是核心要求(正常来说,应该是清楚的),那你在面试前应该咨询一下面试官:“这个职位最需要的技能都是什么?”
3.3 用事实说话
你应该尽可能地把答案和自己的实践经验、成就联系起来。你可以通过事实来说明你的经验,但不要脱离实际去胡编乱造。如果为了阐述一个观点,而去编造一个故事,这确实可以让人听得津津有味,但问题就来了:面试官会记住你讲的那些事,但那些事是你没有做过的。
图/software guild
4
有效交流
在面试中,如果你想清晰地表达观点,就需要了解一些简单而实用的技巧。这些花招(我并不想这么叫)可以让你的交流变得异常有效。
4.1 用热情战胜紧张
几乎每人都体会过紧张情绪。面对有挑战性局面的时候,紧张是人的自然生理反应。
你需要做的,是分散自己的注意力。如果你因为一些事情而感到焦虑,不妨转变一下思维,想一想那些开心、有趣的事情。这可以帮你赶走紧张情绪。你是一位优秀的程序员,你喜欢编程的哪些方面?处理别人写的代码都有什么烦恼?代码对齐应该用tab还是空格?Vim和Emacs,哪个是更好的编辑器?通过这些问题,转换一下思维。注意这么做的时候紧张感是如何消失的。
4.2 使用手势
有可靠研究表明,肢体语言至少和我们说出的话具有相同的重要性。这也符合人与人交流的规律。如果你像考拉一样有气无力地瘫坐在椅子上,就很难表达对工作热情。你应该坐在椅子的边缘,边说话边用手势强调重点。
4.3 放慢语速
如果语速过快,会显得你很紧张。把语速放慢,可以给人镇静、运筹帷幄的感觉。如果你控制不住语速,那就要勤加练习。多听专业演讲者(特别是知名政治家)的发言,你会发现他们几乎从来不会说错话。他们的呼吸和停顿很有规律,举手投足就像摆放花瓶一样优雅。他们的语速很慢,吐字清晰。
4.4 开始和结尾要清晰
如果你说完话,发现有些含糊,那就多重复几次。你要确认自己能听清,并且理解自己说过的话。如果你不注意口齿,面试官就会没耐心去理解你想表达的主要观点。
4.5 重复主要观点
当公众人物想要确保主要信息传达到位的时候,他们会不断重复想强调的信息,但是不要像鹦鹉那样只重复同样的话。
主要信息可以从不同角度来阐述;一个论点可以用很多不同的论据来论述;在不同的时间,可以用不同的方式来重复。
如果你确实想让面试官记住一些信息,也需要不断重复。同时寻找机会,在重复主要观点时与面试官的话联系起来。
4.6 熟能生巧
在面试中,你需要结合自己的经历立刻给出回答。想让答案脱口而出,我的建议是:把答案的原始资料烂熟于心。这要求你必须对简历的内容细节了若指掌,包括简历里提及的技术,证明你能力的事迹,一些解决过的问题,曾经战胜过的挑战,等等。这样,当有表现机会的时候,你才可以信手拈来。
如果你无法自然流畅地表达,那就需要在面试前多加练习。找个朋友陪你一起练,一定要认真。让你的朋友拿着你的简历随意提问,这相当于模拟面试过程,你可以思考如何把自己的经历同问题联系起来。如果你在练习中遇到了无法回答的问题,这非常棒,因为你发现了一个准备工作的疏漏,这样就能在面试前补救这个问题。
练习,练习,再练习。
本文摘编自《智取程序员面试》