Tuesday, January 21, 2014

转mitbbs-民工面试感想

转mitbbs-民工面试感想作者: 王超

说说我当interviewer的一些经历和感想。我是IT写程序的民工,新手工作数年。先声
明一下:这些纯属个人主观印象,和公司无关,不具备普适性。不同公司不同行业不同
interviewer之间的流程是很不一样的。

——————————————

面试有phone和onsite之分,candidate有fresh graduate和experienced之分。但其实
大同小异,面试都是为了评估对方技能。通常我会事先根据对方简历背景准备一些题目
,然后看看其他同事已经问过的题目类型再临时调整。

面试开始的时候,我先自我介绍,让对方放松,然后告诉candidate这几点:
(1)面试的主要目的是为了找出你的长处,而不是短处。没有一个人是全能的,因此
遇到困难不要紧张。
(2)如果我的题目你听了完全没有概念,那么请告诉我,我会直接略过该题,换下一
道题目。(道理同1。略过的意思是不会出现在报告中)。
(3)如果我问的题目已经被我的其他同事问过,请马上告知,我会换题。
(4)如果解题过程中你需要帮助,大胆提出,重要的在于思考分析过程,而不在于最
终的答案。(在一道题上卡住太多时间是没有意义的。道理同1)。

关于上面第三点:interviewers之间有一张纸,每个人写上自己问了的题目,因此一般
而言不会问重。但如果有时有人漏写,或者纸丢了,那么如果后面的问题重复了,我们
希望candidate能够如实相告。有的人说如果我刚才答得不好,现在想出来答案了,重
新给个机会答一下不是更好吗。我的看法是这样的:如果是同一个session,同一个
interviewer在场,那么你告诉他你想出来了想重答,当然可以。否则的话,一是我们
无法衡量你是否真的独立想到答案,二是不同interviewers是独立写报告的,就算你的
新答案让下一个interviewer满意,也无法影响前一个interviewer的评价了。这样对
committee评估所有报告也并没有什么帮助,还不如换个新题。当然如果后面的
interviewer决定用同一个题重新测试,那是他的选择。如果只是同类题目,并不算重
复;如果phone interview问过,onsite继续问同一道题,这是有可能的,interviewer
也许想问得更细,或者问到具体编程。这时candidate也应该主动告诉对方。如果面试
时用时过长,没有答完,那么可以问interviewer留个email,回家后把答案发给他。很
多时候interviewer会答应的。

面试过程:
如果是电话面试,我一般先让对方简要介绍一下背景和当前课题。电面主要考概念小题
,纠缠在某道题目上过长时间对candidate有害无益。一般问5-7道题目,涵盖数据结构
(比如二叉树,链表),算法(比如排序),编程语言(比如面向对象的一些概念),
等等,最后也许加一个简单的设计题。除非是intern或特殊要求,一般不会在电话里直
接编程。每道题重要的是反应速度和答案,因为没法看到对方,难以评估思考过程。打
分GREAT/PASS/FAIL三级。程序员(Software Engineer)和研究员(Research 
Scientist)不一样。RS一般是有某种特长,以后要加入某个组,因此问的问题可能和
个人研究有关,但SE的话主要就是考察CS基本功了。


onsite主要考察编程能力。我一般问2-3题。第一道小题,差不多10-15分钟,和简历里
提到的技能或工作经历很相关的。我会和对方确认一下,问概念,再让对方举个实例,
写个简单的prototype,或者给他一段我事先打印的相关code,让他进行分析或挑错或
改进。这是考察resume内容。有个candidate写着实习项目是用python写的,我问那我
们讨论一下python如何。结果他说他不熟悉了。那么那段六个月的intern经历就很难让
人信服了,不管是他不自信还是真不会,都是不好的印象。因此大家应该把自己列的熟
练技能都磨练准备好,近期工作经历中的内容要熟悉(我们不会问具体的工作项目内容
)。小题之后问一道综合题,设计和编程。onsite时双方的交流非常重要。大题的交互
过程大概是这样的:
——interviewer提出问题,有时给一些例子说明。如果对方明确表示毫无方法,那么
换题,否则开始。
——candidate和interviewer确认自己是否理解题目无误。这是非常重要的,要先明确
对方问的是什么。这也是交流的基础。有时候interviewer会把一些特殊条件先略掉,
看看candidate是否可以先想到,比如内存限制,数据范围,等等。
——思考,找出一个解决方案。这时只是high level solution。candidate需要告诉
interviewer自己的想法。Think loud,把想法及时说出来,一是不会冷场,二是
interviewer有可能及时帮你纠正错误或给予必要的提示。
——解题,有时候是先开始prototype,然后写pseudo code或code。这时如果发现条件
限制并不明确,可以和interviewer交流探讨。写完code要自己检查一下。比如变量初
始化,循环起止条件,等等。
——讨论:complexity,edge cases,testing,optimization。这些都是很重要的部
分。因此在写程序的时候,candidate就应该想到可以如何测试自己的程序。优化一般
是在最后。有时候问题是:如果简化了某条件,那么可以如何优化?如果某个难度提高
,如何修改算法?

很多时候,思考过程比答案更重要,因为可以展示能力的很多方面。大部分的面试题目
,解答和编程语言无关,有时写pseudo code即可。很多人在白板上写程序不习惯,可
以理解,但不能作为借口。我觉得就像上中学被老师叫到黑板上做题一样,先要想好怎
么解答,然后再开始动手写,先把框架搭好,然后细化。有些人没有想好就开始动手,
写写改改,就会显得不熟练了。

综合题一般比较大,可以问很多层次很多部分。有的题目比较难,对candidate来说,
如果一时想不起来,那么应该先简化条件。举个例子,比如说要在一个巨大的未知长度
的数组中查找某个成员,那么可以先简化:如果长度已知?如果已排序?先把简单的问
题快速做出来,然后考虑复杂情况:怎么找到长度?排序?内存限制?复杂度?等等。
做题的时候要把这些分析过程说出来,解释给interviewer,这样可以展示你的分析思
考能力。写程序时,就跟实际编程一样,很多时候是模块化的,不要写一个很长的程序
,而是把一些部分先用子函数代替,把整体框架写出来然后再细化,有时候时间不够我
会让candidate略过细化而只是口头解释(当然如果速度够快能全部写出来,更好)。

面试的最后阶段,我会留一点时间给对方问问题。从某个方面说,这也可以显示
candidate对这个面试机会的重视程度。因此去面试前,最好先了解一下面试的公司,
比如当前的热点,然后准备一些你感兴趣的问题。如果你没有很多问题,那么问不同
interviewers同样的问题是可以的(这些具体问题一般不会被直接记录到报告里,但也
可能作为报告总结的一部分)。

面试报告:
一般分三个部分:数字打分,面试详细过程,整体评估。每个人的评分标准不一样,因
此对committee来说详细的对答过程就很重要。面试时candidate一定要think load,把
自己的想法及时说出来。对错其实不重要,重要的是把你懂的展示出来。一般每道题我
会记录这些内容:
——问题,目的是考察哪部分能力,和简历上哪部分相关(因此如果问到简历上写着熟
练但是却FAIL的问题,那么一般减分了);
——candidate的详细解题过程,分析,交流,提示,改进,等等(再次说明交流过程
很重要,很多时候得到提示并不减分,而改进过程却可能加分,这是体现一个人学习的
能力。工作时常常要遇到新问题,不奢求一上来就全懂,但要求不懂的会学懂);
——如果有编程,把程序写上,点评风格和质量,包括速度和清晰度等;
——小题总结:大概什么水平(和其他candidate相比较而言),是否有更优的答案。

在整体总结部分,一般会总结对方的CS基础知识,OO编程,编程风格,理解能力,交流
能力,学习能力,等等。

一般而言onsite面试有几个interviewers,每个都是独立的,风格和问题的难易程度也
自然会有不同,最后的打分方式也可能不一样,但是只要报告是详尽客观的,对
candidate来说就应该是公平的。很多最终被录取的candidate,在面试时已经让一个或
多个interviewers感到impressed。如果每个人的评价只是average,那么机会就会小很
多了。因此如果遇到你熟悉的题目,那么一定要把握住表现出最好的能力来。

——————————————

面试的准备:
先说题目。上面说如果“遇到熟悉的题目”。网上有很多面试题,有时候也许也会重复
被问到。但是其实做练习题的目的并不是为了要撞题。就像大家考寄托一样做往年真题
一样,重点是在于提高技巧,熟能生巧。只要你认真分析一下,很多题目类型是一样的
。如果你遇到陌生的题目,那么想一下是否可以简化,归类到自己熟悉的类型,然后分
层解答。如果恰好遇到一样的题目,别太兴奋。onsite面试时所有的题目都应该是现场
解答,而不是直接背答案。一样的,要先确认题目,然后思考,告诉interviewer自己
的想法,然后解题。只要candidate认真对待,我不会关心他是否准备过(面试的准备
本来就是很重要的一环)。但有时候candidate表现太明显是撞题了,那样要么就很快
换题,考察别的(因为重复的题考不出实际能力来),要么就是往深度问,比如优化(
但有些人一上来就给了最优解),或者逆问题(比如编码和解码)。大家做题的时候,
不光要知道答案,更要知道分析过程,边际情形(edge cases),测试,相关延伸,等
等。

面试时心态要放松自然,这个说起来容易做起来难,尤其是对新手而言,是需要一定训
练的。我的建议是除非时间限制,不然的话不要一开始就申请最想去的公司,而是先多
申请一些其他公司,当作练手。多几次实战训练之后就有经验了,每次面试之后要自己
总结一下,看看有哪些可以改进的。有人也许说申请了很多职位但都没有面试机会怎么
办。两个原因,一是也许真的背景不合适,二是简历准备得不够匹配。

简历当然是很重要的,对我准备面试题目来讲,我会查看简历里的技能和工作经历,然
后准备相关题目。对申请者来说,我给我的朋友的建议是:简历要准备得有针对性,把
工作要求上提到的技能要求(Job requirements/Qualifications)醒目地嵌入到简历
中。一般说招聘有两种方式,一种是有一个hiring manager,也许就是某个组的头,明
确要招人填某个缺。那么招聘者对职位就会有很具体的要求,简历是那个组的专业人士
直接看的,要体现出具体技能才会引起注意;另一种没有hiring manager,比如泛泛地
招聘程序员,有很多空缺,recruiter收到大把简历,然后快速地筛选,看看那些需要
重点考察然后安排专业人士面试。有人开玩笑说recruiter先直接扔一半,剩下的算幸
运儿进入下一轮。虽然是玩笑,但确实很多recruiter不是专业人士,他们对技术并不
熟悉,主要看词语匹配,比如工作要求C++,那么他就可能查找一下C++关键字,不醒目
的直接扔掉。因此简历上一定要体现工作要求,而且要在醒目的位置上体现。我认为不
管是新手还是有经验者,如果是找编程民工的活,那么在简历第一页的上半部分就应该
出现类似Summary/Qualifications/Skills等等的字样,然后里面明确列着编程技能,
把会的和熟练程度写上。从我看到的很多来面试的人的简历来看,大多是这样的。但也
要记住,不要浮夸。我上面说了有人写着用python做过项目,但是却告诉我他已经不熟
悉了。这样当然印象不好。另外我一般建议我的朋友把简历给他们的很多朋友看看,不
管是否同行业同专业的,让别人判断第一眼印象如何。很多时候是当局者迷旁观者清,
看简历也是这样。

关于面试心态还有一点,就是interviewer和candidate双方是平等的,面试目的是为了
交流,一个是考察candidate的能力,另一个是双方都感觉一下是否合适做以后的同事
。我觉得交流应该坦率,直接,比如题目不会的就问是否可以给予提示,实在不会的就
放弃,开始做下一道题找新的机会。如果实在不懂却想糊弄过去的话,效果会很糟糕的
,因为提问的人一般是很熟悉该题的。就像以前大家考试一样,一道题不会没关系,把
其他题尽力答好,一样可能得到好分数。但我不是说轻易放弃,前面说过,遇到难题的
话,先想想是否可以简化,简化的题目是否可以想到答案,把自己的分析告诉对方,然
后对方也许就会给一些提示帮助。不同interviewer的问题和风格相差很大,提问简单
的不一定就是放水的,难的也不一定就是刁难的。就像考GRE一样,题目越来越难,也
许是因为你之前的表现很好对方给你加大难度,而题目太简单,也许是因为你之前表现
的水平不够。

面试心情很多时候和事先准备有关。不关是技能复习,还包括行程准备。有人提议他的
做法是:面试前一天把第二天的行程熟悉一下,条件许可的话也许先去踩点,然后把一
些联系人比如recruiter和front desk的电话记下来(放在电脑里email里是不够的),
如果是自己开车的话查询一下路线估算一下时间,尽量提前一点时间到达。可以和
front desk的人随便聊聊放松一下心情。换人的时候一般interviewer会问是否需要休
息一下,去洗手间或者喝水之类。可以利用这些机会适当放松一下自己(我建议充分利
用),尤其是到了后面,可能会很累,去卫生间洗洗手照照镜子深呼吸之类。有人建议
说可以整理一下仪容,见面握手的时候注意自己手里是否有汗。面试很多时候注重的是
细节。有时候interviewer不会在意,但是candidate自己可能会为一些小错误感到很紧
张。

答题的时候表达要清晰,不要太急,紧张的话自己控制一下,想好了再说(但要think 
load,多交流)。一般全天面试的话中午吃饭会有人陪,我们很多是phone 
interviewer陪同,这个不会写报告打分,你可以问一些感兴趣的和公司有关的问题,
比如项目热点方向,技能要求等等,但避免问一些私人的问题比如工资高低股票多少之
类(可以问general benefits和perks),也可以随便聊聊天气体育股市等等,不需要
太拘束。公司里遇到的那些人以后都可能是你的同事,因此要相互尊重,不卑不亢(没
有什么人喜欢和高傲或者孤僻的人共事)。面试是抱着学习的态度而来,因此不要夸夸
其谈。

关于面试着装问题,我没有注意过,因为我们平时着装很随便。不同公司不同职位有不
同的dress code,要自己先了解一下。如果不了解的话,IT公司一般business casual
就可以了,大体说就是大方得体,男生要穿长裤,女生不要化浓妆不要有太重的香水味
,这些都是不难做到的常识(还有比如中午饭后上洗手间看看别把菜夹在牙缝上)。

关于内部推荐。有的人说内部推荐成功机会高很多。这个我个人是这么看的:对于面试
来说,一般interviewers不会因为是某个人推荐的就给开个小灶,尤其是对大公司来说
,很多同事之间也许都不认识。推荐的优势主要在于公司信任自己的同事对被推荐人的
初步评价,有时推荐人会填个表格评价一下对方的能力。因此这个需要熟人推荐,因为
只有熟人才能给比较详细客观的评估(当然可以美言)。而如果是陌生人推荐,那么顶
多就是递一下简历而已,详细的推荐意见和初步评估无法填写。因此如果大家要找内部
推荐,首先要找的是朋友,或者朋友的朋友。一般来讲如果朋友之间互相帮助,有机会
是会乐意推荐的。如果他不了解你的情况,你可以向他解释,然后征询一下职位要求,
看看是否有哪些需要准备(和怎样写有针对性的简历)。

有的人说我已经有了一个offer,准备催另一个公司安排面试,已有的offer是否会有帮
助。一般来说你已经拿到一个offer,说明你确实有实力,而且对待面试也有一定的经
验了,而且心态也许也会很平和,所谓骑驴找马心里不慌,这些综合起来,对你的新面
试发挥也有促进(面试是短短时间内的发挥,很多时候心态对发挥有很大的影响),因
此拿到offer的机会大一些。但这并不等于另一个公司会降低录用标准来抢夺你,关键
还是看你的面试发挥。如果你真的有实力而且面试发挥得好,自然会得到机会,但如果
面试发挥不好,那么也可能失败。那么有offer了要不要告诉另一个公司?这个因人而
异,我觉得坦诚相告没有问题,有时可以让对方加快处理速度。

有人说如果在该公司做过实习生,申请起来是否希望很大。一般是的。很多时候实习生
对该公司比较熟悉了(如果不熟悉的话说明实习没有收获),包括需要的技能和面试流
程等等。实习生转正,面试是一部分,另一部分更重要的,是你在实习期间的表现,这
是你所在的组给你的评估。因此如果有实习机会,好好努力,另外多学习一些公司内部
的技能。

关于面试后是否要写感谢信。我觉得这并不重要。一般说面试是recruiter安排的,面
试后发信感谢对方的安排,是礼貌的表现。至于给interviewer写感谢信,如果你没有
对方email,不写没有关系,不要在意。很多时候在candidate回家之前我就已经把报告
提交了。如果面试时因为时间关系意犹未尽,可以面试结束时要个联络方式告诉对方你
回家后告诉他详细答案。

面试就像考试一样,很多时候是临场发挥,也有很多运气成分。如果失败了,当然不开
心,但不要气馁,而是总结经验,继续下一个,失败也许只是运气不好而已。前面我说
了不要一开始就申请心仪的公司,因为失败后短时间内再申请一般是不行的。先积累经
验,然后再主攻你想要的。

个人拙见。祝大家都找到自己理想的工作。

No comments:

Blog Archive