(转载)程序员面试什么最重要?

(转载)http://blog.csdn.net/randyjiawenjie/article/details/8587587

来自 http://www.cnblogs.com/weidagang2046/archive/2013/02/15/on-interview.htmlhtml

 

程序员面试一直是社区乐于讨论的热门话题。我本身从06年实习以来,前后经历了4家软件公司,所有是外企,其中有世界500强的通讯企业,有从事期权期货交易的欧洲中等规模的金融公司,也有为大型汽车制造商开发Android智能汽车的新兴公司。跨入IT行业以来,我在求职过程当中经历过屡次面试,最近两年也有过屡次面试别人的经验。我感受如今到了对这个问题发表本身见解的时候,这篇文章是我站在面试官角度对于程序员面试问题的一个阶段性反思和经验总结。前端

目标

相信和很多朋友同样,有了几年工做经验成为Senior后就开始了面试别人的经历。我在最初这个阶段只是按照本身的想象把”找到基础好的程序员“,”找到算法能力优秀的程序员“,”找到有Android开发经验的程序员“等做为面试的目标。可是,实际的经历告诉我,尤为是按“基础好”,“算法好”这些目标招到的人最终效果并很差。好比,有的面试者基础知识和算法掌握状况不错,进程、线程、内存等概念清晰,基本的Hash,二叉树,快速排序等数据结构和算法也比较熟悉,可是进公司后在实际工做中表现得很糟糕。后来,我才发现原来是个人面试目标出了问题,我原先的面试方法更像是大学的算法或操做系统期末考试,按照这种方法让许多并不合适的人经过了面试,同时也可能错过了许多合适的人。程序员

后来,个人反思是,从公司的角度讲,面试的根本目的是找到"可以干好工做"的人,而“高学历”,“算法好”,“基础好”,“有经验”这些都是表象而不是根本,它们并不能直接和“工做好”划等号。面试

方法

目标明确了,但接下来的问题是假设面试者是一个黑盒系统,“工做好”不是直接可观测变量,你所能直接观测的变量是基础、算法、经验、学历、性格、谈吐、年龄等等。因此,实际上,你只能从“基础好”,“算法好”等能够直接观测的量去推测“工做好”的几率,这就是一个在“X好“条件下"工做好“的条件几率问题:P(工做好 | X好)算法

根据这个模型,面试所应该考察哪些方面就很明显了,那就是选择那种最具备区分性的方面来考察。好比,考察面试者的体型特征没有太大意义,由于P(工做好|高),P(工做好|矮),P(工做好|胖),P(工做好|瘦)的几率都差很少;因此,体型特征不具备区分性,这不是面试所应该关注的内容。数据库

面试官应当结合职位的要求明确哪些因素具备比较好的区分性。好比,若是要招一名技术门槛比较高的3D游戏引擎开发工程师,面试者A具备3D游戏引擎开发的经验,可是在基础知识和算法面试方面表现通常;面试者B相反,基础知识和算法面试表现很好,但没有游戏开发经验,而你只能选择其一。你选谁呢?其实,这就是两个条件几率问题P(工做好|经验好,基础通常,算法通常)和P(工做好|没经验,基础好,算法好)。这个问题就留给面试官来判断了,就我我的而言,对于技术门槛较高须要技术积累的职位,经验更加说明问题,所以,我更倾向于面试者A。编程

下面,我再结合本身的经验谈谈对面试中常见方面的见解。后端

算法

算法是Google和MS等大公司面试所重点考察的内容。我我的很喜欢算法,曾经参加ACM/ICPC拿过北京赛区的13名。可是,就我的经验来看,我所接触过的绝大多数开发职位而言,算法都不适合做为考察面试者优劣的主要因素。对于普通的非算法性开发职位,考察面试者的算法就至关于考察他打乒乓球好很差同样,与目标“工做好”的相关性过低。就我我的的经验来看,差很少P(工做好|算法好)=50%,也就是算法面试没有太大的区分性。服务器

甚至,还有一种很很差的状况特别多地出如今算法好的面试者身上,我称之为“只磨刀,不砍柴”。什么意思呢?有类人只对什么A*算法,异步编程,JVM类加载机制这种纯技术问题感兴趣,对实现用户需求毫无兴趣。这类人看起来有必定的技术能力,可是对公司来说贡献十分有限,甚至不如技术通常但认真负责的人。因此,一旦遇到面试者算法好,我就特别留意考察会不会是这种“只磨刀,不砍柴”的人。数据结构

另外,虽然我我的不了解Google和MS,但我对于其特别重视考察算法能力的面试策略是持怀疑态度的。即便在这样的世界级大公司,算法虽然重要,但能够想象在项目实施过程所遇到的各类各样问题中,算法问题绝大多数时候不会是主要瓶颈,没有到那种须要每一个人都是算法高手的状况。实际上,绝大多数项目真正难点并非一两个算法瓶颈,甚至也不是单点的技术瓶颈,而是系统性的组织、协调、设计、开发问题,有大量的看起来不是那么有技术含量的脏活累活,也有许多问题是因为信息不足,并非技术能力强就能克服这些困难。一个团队最好优点互补,有人算法强,有人业务分析能力强,有人擅长后端服务,有人擅长前端界面,有人聪明,有人踏实,这是最好的。若是按照“算法好”的单一标准选材,一定会把许多优秀的人才拒之门外。

基础

基础面试是指考察诸如指针使用、进程线程概念等基础知识的面试,十分相似于大学期末考试题。我曾经觉得基础面试十分重要,可是如今不这么看了。在工做中基础的确是重要的,可是在面试过程当中,它必须具备区分性才有意义,也就是说P(工做好|基础好)的几率要高,那么考察指针使用,进程线程区别这样的基础题目才有它的意义。个人实际经验是,基础面试并不具备很好的区分性,和算法同样, 差很少P(工做好|基础好) = 50%。同时,基础面试是最容易准备的,中国人有长期的应试教育经验,要准备几个把玩指针题目太容易了。

我曾经遇到过这样的面试者,他的C语言基础和编译、连接等原理掌握得很是好,给我留下了深入的印象,我给的面试结论是:知识面不宽,只会C语言,但基础很扎实,建议录用。后来的事情证实了那个结论的前半部分是对的,可是”建议录用“错了。他在实际工做中表现得一塌糊涂,不理解需求,不理解总体架构;同时,上班时间不是花在项目上,而是花在阅读诸如《程序员的自我修养》之类的书籍上。最后,这位同事因为长期“不出活”离开了公司。

基础不是不重要,而是“基础好”不足以说明面试者能干好工做,由于基础是属于局部性知识,而实际工做须要综合性能力,两者有天壤之别。C语言、操做系统能考高分,可是不会写程序的人在大学咱们还见得少吗? 软件开发就像盖房子,综合能力是设计和搭骨架,基础知识是码砖。张小龙原先Foxmail是Delphi开发的,他它不懂C#,你若是要招聘一个开发.NET Email客户端的人,你考察他对CLR掌握得好很差有意义吗? 让张小龙来开发一个C#版的Foxmail真的会有困难吗? 你招一个精通C#但没有Email客户端开发经验的人来真的比张小龙靠谱吗?

我说基础知识不重要,和老子说“不积洼步无以致千里”是否是矛盾呢?不矛盾!“洼步”与“千里”是一种可累加关系,但再多的“基础知识”都累加不成“综合能力”。学习软件开发要像持续集成同样,一开始就是一个完整的系统,虽然规模不大,问题不少,但它麻雀虽小五脏俱全,从小系统到大系统,从简单系统到复杂系统逐步演化。

因此,基础好自己不足以说明太多的问题,必须进一步考察综合能力。对于基础面试表现很差的面试者,若是时间容许也要进一步考察,有的面试者实际上是有能力的,只是没有进行充分的准备。最理想的状态固然是基础和综合能力俱佳,若不能兼顾,应当综合能力优先。

经验

经验的重要性在于它能说明一我的的综合能力。好比,是否完整地实现过一个软件,或做为主要开发者完成过一个项目。从项目的性质、规模和难度,面试官就能够大体判断出面试者的综合能力。好比,若是面试者一直在大公司负责一个小模块的开发维护,那么基本能够判断他不具有独立或做为主要开发者承担一个项目的能力,只适合在另外一家大公司作相似的事情。

对于门槛较高须要长期技术积累的职位,相关经验更显得尤其重要,好比,Linux内核开发,JVM开发,游戏引擎开发,数据库实现,高级UX等。对于这类职位,没有经验的面试者即便综合素质不错也是须要长时间的学习和积累才能胜任。因此,基本上若是肯定了你的职位属于此类,那么相关经验毫无疑问应该成为首选因素,换句话说,P(工做好 | 相关经验好)的几率是很是高的。

要注意的是,经验也是一个多维度的事物。好比,C++股票交易中间件系统,这就涉及(C++,中间件,股票) 3个维度。假如面试者A作过C++股票交易客户端,面试者B作过C的股票交易中间件。从语言角度看,A最匹配,从项目性质看,B最匹配,你如何选择?这就是在多个维度中,哪一个维度更重要的问题,就这个例子而言,我我的更倾向于B,由于我认为中间件开发经验是主要矛盾,而从C切换到C++并非问题。

因此,面试官须要判断哪种经验是主要的,而哪种经验是次要的。好比,咱们招聘Android应用开发,这个职位的Android技术门槛并不高,它的真正难点在于作出好的用户体验(UX)。因此,若是一个面试者没有Android的经验咱们是能够接受的,可是我但愿他在UX方面有经验,至少作过其余平台的移动应用开发。

性格

如今,我来谈我认为最重要的因素:性格。这多是许多初为面试官的朋友所不可思议的,怎么会是性格最重要呢?说实话,当我意识到这一点时,我本身也很惊讶!说白了,仍是 P(工做好|性格好)的几率最高啊。个人实际经验是,若是一我的的性格好,他能把工做作好的可能性是最高的,性格好远比基础好、算法好要靠谱。

一我的若是技术上有缺陷,经验上有不足,但性格好,在团队中是很容易由其余人来补位的,他本身也很容易逐渐补起来;相反,若是一我的的性格很差,全部的技术优点经验优点都发挥不出来,甚至还会起到负做用,并且性格缺点很难改变。我一直谈到实际工做所须要的是综合性的能力,这种综合能力的发挥中性格是相当重要的。项目中不止会遇到技术问题,要涉及沟通、协调,不一样的人不一样的部门既有合做又有磨擦,如何处理这些事情都须要一个良好的性格。能够说,在开发团队里让你不同凡响的不是你从哪一个学校毕业,也不是你过去的经验,而是你的性格。

固然,性格是一个复杂的东西,它包含了不少的方面,并不是全部方面都是程序员面试所须要关注的。个人经验是能够重点考察这些方面:

1) 态度积极仍是消极。有的面试者在谈吐中就会天然给你一种积极上进的感受,或者你能够在他的经历中发现他积极的因素,这些都不是太难看出来的。相反,有的面试者你能明显感受到他的消极情绪。积极性在工做中是十分重要的,积极的人能给团队带来朝气,也更易于合做。基本上,若是肯定面试者属于态度积极的,他经过我这一关的可能性就会大大增长;相反,若是肯定属于态度消极的,即便技术能力不错我也会十分谨慎。

2) IQ。个人经验是,整体来看,聪明的人在工做中的表现更为优秀。在面试中要考察一我的是否聪明并不必定要像Google和MS那样找些专门测试IQ的智力题,其实,你只须要看他讨论问题是否是颇有逻辑性,思考和说话是否是反应敏捷就能够作出大体的判断。另外,眼睛是人心灵的窗户,一我的聪明与否,眼睛是会说话的。不过,聪明也不彻底是优势,好比,当公司或项目遇到困难时,每每是聪明人先跑掉了,坚守的每每是IQ通常的人。

3) 语言表达能力。语言表达能力也是程序员十分重要的一项素质,它关系到项目中的沟通是否顺畅。面试官能够看看面试者可否用简明的语言介绍清楚曾经作过的项目,可否抓住要点,可否考虑到听者的相关背景。通常来说,语言表达能力强的人综合能力都不会太差。

4) 是否具备用户意识。有人说程序员是作研发的,哪来什么用户?只有销售、市场人员才会和用户打交道。其实,这是完彻底全的错误认识。你写一个模块,甚至一个API,只要有别人用,他就是你的用户。有的程序员设计一个模块或是一个软件老是习惯于从使用者的角度来考虑,尽可能地方便使用者,这就是一种良好的用户意识。具备良好的用户意识的人更能考虑别人的感觉和总体的须要,而不是单纯地从本身和局部来思考问题。当面试者谈及过去的项目经验时,面试官能够经常站在用户的角度对其进行提问,从这个过程当中观察其是否具备良好的用户意识。

5) 如何应对质疑和压力。面试官应该对面试者的回答以及以往项目进行合理的质疑,看看他如何应对。曾经有一位面试者谈到作游戏登陆服务器的经历,我就问:“若是登陆服务器挂了,怎么办呢”?他说原先虽然没有考虑这个问题,可是能够怎么怎么改进。其实,你们都理解项目中有各类不完美,这里面缘由不少,只要面对质疑和压力能从容应对努力往好的方向思考解决就能够了,不须要掩饰缺陷,更不该该有情绪。我遇到过有的面试者,一旦你对其项目提出质疑,他立刻产生反抗情绪,或不高兴,或不认可有问题,这很容易一会儿看出来他在工做中容不得质疑和批评,这种人要想合做就很困难。

6) 个性特色。许多面试者喜欢在简历上写“精通C++/Linux“,这些字眼看得人麻木,若是有人写”喜欢C++/Linux“,我就会有一种眼前一亮的感受。“精通”是没有感情色彩的叙述,而“喜欢”包含了面试者的个性,我更愿意看到面试者的个性。我相信对某样东西真正的热情远比你当前对它的掌握程度更为重要。其实,N年的经历告诉咱们,同一个班的同窗,同一个项目组的同事,虽然天天所学的知识,所接触的工做都是相同的,但其实每一个人的成绩和表现差别是十分明显的。那么,到底本质的差别是什么呢?其实,就是每一个人的个性。是个性使得有的人业余时间去打球,有的人业余时间去看书,有的人喜欢Linux,有的人喜欢Mac。一我的在团队中扮演的角色也和他的个性有很大的关系。面试官应该引导面试者展示本身的个性,并判断其是否有益于团队。

总结

最后总结起来,个人经验是: 1) 面试官的目标是找到”工做好“的人,必定要围绕这个目标来进行面试,若是把面试当成了算法或操做系统期末考试这就走入了误区;2) 面试过程是经过学历、性格、基础、经验、算法等能够测试的因素去综合判断面试者“工做好”的几率;3) 在各类因素中,性格 > 经验 > 基础 > 算法。性格是最重要的,若是性格很差,全部技术能力都会大打折扣,并且技术缺陷容易弥补,性格缺陷很难改变;经验体现了一我的的综合能力,你能够从面试者过去的经历中判断他能从事哪一种工做,不能从事哪一种工做;基础和算法则主要起到辅助参考的做用,基础好的程序员通常适应性比较强,学新技术更快,可是切忌单纯从基础来判断一我的的能力。

相关文章
相关标签/搜索