笔者之前在LinkedIn做技术工作同时,也花了不少时间在招聘上,成为了当时LinkedIn前三的面试官,包括挖掘候选人,参与校园招聘,草拟面试题,电话面试,Onsite面试,填写反馈,和最后决定是否发放Offer,都有完整的流程和经历,我就按问答形式给大家借鉴。这里也推荐一下我的新书:程序员面试白皮书(An Ultimate Guide to Coding Interviews),有任何建议意见,请不吝赐教:)
问题:硅谷公司的招人的渠道有哪些,跟国内有何不同?
一般公司都有自己的Refer和面试系统,HR人员寻找候选人,在LinkedIn上就有丰富全面的简历库,通过对毕业学校,就职公司的过滤去挖掘潜在员工。还有一些高水平的学术会议,工业界愿意支持和参与,像SIGMOD,VLDB顶级数据库大会;也喜欢举办公开技术讲座,邀请社会各界参加,注册时留下联系方式。或者写一些技术博客,开源产品,通过他们做的有意思的项目来间接吸引人才。有时也举办一些hackathon比赛,24小时做出一个小产品原型,欢迎各类技术人才挑战。当时我也参加LinkedIn的编程马拉松,每人发一件T-shirt,写着 Eat, Code, No Sleep。我记得内部统计表示,2/3的人都是通过内部推荐进来的。
其实国内的思路更厉害,比如最近雅虎北京一裁员,忙坏了各路IT公司,某创业公司也凑热闹一起去抢人,派出2个高级工程师去面试,结果,负责面试的2个员工都被人挖走。还有一些无节操HR,伪装成下面这个,我接触过的妹子不多,你们不要骗我。
问题:硅谷公司招聘流程是什么,跟国内有和不同?
我刚好在国内外都工作过,我可以做个对比。
国内:如果是在校生,一般都要有个笔试,通过率也不高,可能就百分之几,然后在校园里面试3轮左右,分别对技术,基本功,价值观的考察。然后就会大规模发offer,一些大公司如百度,阿里一年招上千人是很常见的。
硅谷公司:一般是没有笔试。如果HR发现简历的一些关键字和背景符合职位需求,简单介绍公司,安排1,2轮电面,如果通过,邀请onsite面试,里面会有4-7轮,里面涉及到不少白板编程,虽然很多人争议,参见附录,但目前为止还是有些无奈的选拔手段。
How to Conduct a Better Coding Interview « Eric Elliott
LinkedIn会花很大代价去组织,包括报销来回机票,吃穿住行,赠送小礼物,给候选人一种非常受尊重的感觉。比如附带礼物中有一个inMap, 把你在LinkedIn上面的联系人聚类可视化呈现出来。非常酷。
这里面成功率非常低,真的是千里挑一,虽然代价很大,但很多公司都是强调人才是第一位的,在宣传企业文化和价值上也是起到积极作用。然后就是收集反馈,一般是2个面试官back to back同时给出评价,按1-4打分,最后取平均分,Yes =3.0; Very Yes =3.5; No =2.5招聘委员会通过投票和辩论来确定是否发放Offer。
上图是LinkedIn内部招聘流程图
我记得印象深刻的面试:面试者岁数大些,当时我面的时候也没出众,我准备给他一个一般的分,但他回去马上给我写了一篇长信,解释当时我问的问题,给出详细参考,我对他的回答非常佩服,至少态度很积极,也许是当场没有发挥好,我立马改变了印象,给他很高评价,但其中有个初级面试官居然给他1分,什么概念(if you hire him, I will go), 这样就把他平均分给拉下来,我觉得这样不公正,就在招聘会议上为他说话,最后他也拿到Offer顺利来到公司,事实证明这是一个挺优秀的技术人员。
问题:简历怎么写才能规范并吸引人呢?
下面这个是很有趣的程序员是如何读简历的:
问题:硅谷公司是如何选拔技术人才的?
硅谷公司对基础架构很重视,注重基本功,员工素质和价值观认可。技术人员还是需要关注生产力的,其实也很难短时间考察,公司也考虑过是否通过一些做小项目,直接上机模拟真实环境来评价。但真正实施又难度很大,LinkedIn 有个专门负责招聘Staff EngineerJacob Kessler写过文章阐述面试理念:Interviews are not Exams主要是想保持自然,一起应对一天工作中场景。
我总结成3C (Culture, Communication, Curiosity),下面也展开一些重点。
技术:平常扎实的技术积累,包括系统知识点,不同编程语言,开源工具,团队合作工具,比如, Restful架构有哪些特点,动态语言的优劣。我在知乎上也给出了硅谷跳槽工具箱指南
基本功:代码简洁优美没有bug,常见算法的应用,优化技巧,比如如何把一个O(n^2)的算法优化成线性。好的编程习惯一定要坚持,格式:缩进可以良好排版,括号要对齐,变量名起的有意义。边界检查,参数检查,异常处理,单元测试。主动写出合理的Test case,一些常见的null检查。不管你之前做过多少年,只要申请工程师职位都要经历过编程的基本考核。
交流:实技术人员用到的英文都比较浅显,听和读应该问题不大,但最好在说和写方面下大功夫,这能突破一些天花板,更多融入团队交流。
系统设计:包括设计大型系统的架构选型,各种不同组件的tradeoff,数据库系统,网络系统,分布式系统。比如什么时候适合用NoSQL,如何做一个推送系统,缓存系统如何搭建。
问题:您在面试中会重点考察面试者除了技能之外的哪些点?面试者身上哪些特点往往会是各公司认为不能接受的?
首先,看背景是否符合职位的需求,比如做分布式计算的工程师,对系统底层,大数据架构就要有一些涉猎。
第二,聪明,如果我交流的时候发现他们能很快意识到我说的意思甚至补充我心里想的,这种人非常讨喜。如思路异与常人,很快给出最优解,能挑战一些难度大的问题。
第三,好奇和热情,如果面试者说不清为啥要申请,或者没啥主动提问的,我会觉得对公司兴趣不大,没有好好做功课,态度上不够积极,而就算最后技术很出色,在评价上也是要打折扣。另外如果他技术面很狭隘,技术兴趣不广泛,可能也要考虑是否能胜任创业公司不断变化的环境。
不能接受的
不愿意学习,对他说的或者写的很自大,但却不虚心接受其他人指出的问题和建议。
企业文化不合,对公司的使命和价值观有一些偏差,这个比技术功底更致命,主要是找志同道合的。
给大家附录中推荐的,Coursera的CPO分享的 “像谈恋爱那样去招人”说的很有启发。
问题:对于初级程序员的面试,最难的部分可能就是所谓的设计题。这部分是什么流程?
设计题可以分成两个部分,系统架构设计和利用面向对象编程原理进行程序设计。前者所涉及的技术往往包括数据库,并发处理和分布式系统等等,对于经验要求和知识要求比较高。系统面试的流程如下:
1. 题目描述
往往非常简单,如:设计一个XX系统。 或者:你有没有用过XXX,给你看一下什么界面和功能,你来设计一个。
2. 阐述题意
面试者需向面试官询问系统的具体要求。如,需要什么功能,需要承受的流量大小,是否需要考虑可靠性,容错性等等。
3. 面试者提供一个初步的系统设计
4. 面试官这对初步的系统中提出一些Follow-Up的问题:如果要加某个功能怎么办,如果流量大了怎么办,如何考虑Consistent怎么办,如果机器挂了怎么办。
5. 面试者根据面试官的Follow Up逐个解决问题
总体特点是以交流为主,画图和代码为辅。
问题:从面试官的角度给出一些系统设计上的考量标准是什么?
我先给一个内部培训面试官的方法,大致说了考量环节。根据我的经验,也列出一些关注点Adapt to the changing requirements (适应变化的需求)
Produce a system that is clean, elegant, well thought (设计干净,优美,考虑周到的系统)
Explain why you choose this implementation (解释为何这么实现)
Be familiar with your experience level to make decisions (对自己的能力水平很熟练)
Answer in high level of scale and complexity (在一些高层结构和复杂性方面有设计)
其实大家大可不必追求完美,在真正的面试中,没有人能对答如流,往往面试官也会给出善意的提示,就算你没回答某个子问题,在面试后的评价中也会综合衡量,跟其他的面试者比较,最终打出一个分数。很多人在2到3分左右,目标是尽量在3分以上。
问题:我不是算法大牛,不是ACM队员,听说Google,Facebook有很多牛人才能进,那我怎么能拿到好Offer?
首先要是要有信心,算法不是想象那么难。
第一:因为面试常见的算法就那么几种。只有你努力去总结归类相似题目,才能只做很少的题就可以会很多的题。不要盲目关注数字。做题质量非常重要。标准是:你做过的题目,让你再做一次,你就能“完美解决”。
第二:即使你知道一题的解法,你未必能写好。因为你可能每次写出来的程序都很随性,这样会漏洞百出。程序员是一个非常讲究严谨性的职业,如果你在总结题目的时候能够找到这些题目的模板,你把模板提炼好,碰到类似的题目,可以一边写模板,一边想想怎么在模板上做一点简单的改动。这样节省时间又保证不会出错。
问题:如果本科不是学计算机的,又想转行该怎么准备?
1. 让自己更Professional。比如你的简历只能放和计算机有关的东西,其他东西再牛也不能发挥用处(比如学生会主席)如果Resume还是很空,就多去做项目。在Github上面多去follow项目,然后参与到感兴趣的当中。
2. 在某一方面达到工程师实力。临时转行时间短,找一个容易入手的准备,如果你以前做的事情跟数据有关,就申请Data Analyst。本来就会一些基本技术的,可以做前端,JavaScript, HTML, CSS,去真正做一个自己博客。如果对产品感兴趣,就玩Django, ROR这样的网站框架,了解一个网站是怎么搭建起来的。如果对Mobile感兴趣,就用IOS或者Android写2个APP。这样做的好处是,简历不空,如果问到,可以驾轻就熟。如果不相关,坦诚相见,说由于我是转行的我这方面不熟悉,可以尝试猜猜看。也可以直接告诉面试官,我是转行的,我对计算机很感兴趣,做了这么这么几个项目。于是面试官不会问你难题。结果你早就准备好了,超出面试官预期,就是一个高分!
问题:面试时候如何表现自己体现沟通能力?
首先你要站在面试官的角度,面试官招你进去当同事,他希望同事怎么样的人就决定了他的立场。学会换位思考。
让面试官时刻明白你的意图,不要闭着眼睛不停写。对于面试官来说,他根本不知道你的解题进行到哪一步了。你可以反复和面试官交流自己的想法,得到面试官认可以后再动手写。可以讲讲你怎样想到这个思路的。记住,你并不是要说服他接受你的想法,而是要把你的想法解释给他听。面试官提出质疑的时候,第一,不要觉得面试官什么都不懂,怎么这都不知道(其实他只是看一下你是否真的懂),第二,面试官比你经验丰富得多,很有可能就是你犯错了,赶紧想想是不是真的有问题。
问题:面试中出了Bug怎么办?
BUG Free很重要,这个需要我们平时不断的练习,按照我们方法的准备,还是可以避免一些坑。但碰巧你可能不在状态,写出了BUG被面试官指出,是不是就挂了呢?
别担心,出BUG很正常,也许面试官来面你之前正在DEBUG:( 衡量一个程序员能力的标准,并不是他能想出多牛的算法(那为什么还要面算法题?)而是当遇到问题的时候,程序员去分析和解决问题的能力。而出BUG的时候,正是展现你是否是一个合格程序员的时候。
DEBUG流程:
1. 通过TEST CASE定位BUG所在位置
2. 不要立即修改代码,重新梳理逻辑。因为很有可能还有其他BUG。
3. 走完所有逻辑之后,心里有数怎么改了,再动手开始改
4. 用TEST CASE再走一次新的代码。
5. 在整个过程中,不停的告诉面试官你在干嘛(在不影响正常写程序的情况下)
这样,成功排解BUG,不但不会减分,还会因为你优秀的DEBUG能力和与此同时展现出来的沟通能力而加分。
问题:面试中不同人考察的内容都有哪些?
给一张表大家可以了解:
最后希望大家在找工作方面能有所收获,不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰~想想还有点小激动呢,嘿嘿~~ 同学,梦醒了么,该去搬砖了。
参考资料
How to Conduct a Better Coding Interview « Eric Elliott
网友评论