作为面试官,在面试程序员时,都会关注哪些问题?而程序员应该从哪些方面做好面试的准备?本期话题相信对面试官和程序员都会有所启示。
刘秋伟 深圳市万兴软件有限公司研发总监
与其他岗位相比,程序员相对来说会内向一些,思维也会更严谨、更有个性。企业招聘程序员就是要求他能和团队一起完成既定的开发任务,所以重点从技能水平、学习能力、团队合作及工作心态等几个方面考察程序员。
技术水平是对程序员最基本的要求,很多企业会通过笔试来辅助考察。技能的考察主要看面试者技能匹配度、对技术发展趋势的了解以及自己的职业规划。
1. 你认为自己最擅长的技术是什么?
2. 谈谈你对XX行业/技术发展趋势的看法?对最近XX技术问题发表下你的看法?
3. 在五年的时间内,你有什么样的职业发展规划?
技术快速更替,员工的求知欲和学习能力比他现在的技能更为重要。宁愿招聘一个学习能力很强的员工,也不要一个靠吃老本、不愿学习的员工。
1. 你最近有看哪些书或参加过什么样的培训?有灌技术论坛的习惯吗?
2. 今年有什么学习计划?今年有什么目标?
3. 研究过开源项目吗?有什么收获?
在现在的软件开发中,已经没有所谓的“孤胆英雄”,项目主要靠团队合作来完成,而团队合作能力可以通过考察以往项目,来了解面试者对团队的理解、遇到问题的解决思路等。
1. 你做过哪些项目?最成功的是哪个?为什么?
2. 辛辛苦苦工作半年的项目失败了,你怎么办?
3. 评价下你过去的团队?你喜欢在什么样的团队中工作?
4. 你的业余爱好是什么?
招聘新员工,需要了解面试者对工作的心态和价值取向,并且与他沟通公司的企业文 化。如果你所在企业需要快速发展,有高强度的研发任务,而他想找一份轻松的工作,可能就不是很合适了。
1. 为什么选择离开上一家公司?
2. 有了解过我们公司的产品/服务吗?
3. 你对加班的看法?你家人或朋友抱怨你加班怎么办?
4. 如果在试用期发现你技能不符合要求,该怎么办?
最后,技术人员的有效沟通能力也非常关键,特别是对问题的分析和说明,所以在整个面试过程中你要观察面试者的分析思路,对问题重点的把握以及表达。经常有一些滔滔不绝、 但不知所云的面试者,让人非常头疼!
蒋建华 北方跃龙项目经理,微软最有价值专家(C#MVP)
程序员的能力分为两种:技术能力和非技术能力。技术能力包括编码能力、系统分析与设计能力;非技术能力包括写作能力、沟通与协作能力、组织与管理能力等。而根据程序员的能力水平,可以将程序员分成初级、中级、高级三个级别。因此,在面试过程中我会针对初级、中级、高级程序员三个级别来提出不同的问题。
在技术能力方面,重点考查初级程序员的编程能力、中级程序员编程能力并兼顾系统分析的能力、高级程序员的系统分析与设计能力。在非技术能力方面,重点考查初级程序员的沟通与协作能力、中级程序员的写作能力(主要指编写技术文档,如需求分析文档、用户手册、部署手册等)、高级程序员的组织与管理能力(如指导、协助中级程序员进行问题分析和开发)。
在面试时,程序员首先要将自己的技术能力展现出来,以一种交流的心态去面对,不要紧张,要有自信,即使面试失败自己也要下去总结失败的原因,找到技术弱点加以弥补;其次,面试中遇到不会的问题要讲明自己的思路,因为有些问题不是考你的编程能力,而是逻辑思维的能力;最后,对照程序员能力模型进行自我分析与评价,做好职业规划,不断学习,提高自己的编程能力和抽象思维能力。
以SQL Server为例,我来分享一下面试时常问的一些技术问题。
1. 聚集索引和非聚集索引有何区别?应该怎样使用?
2. SQL的一张表中有一个自增的ID字段,但是现在不连续,写一条SQL语句取出某个位置到另一位置(如50~60)之间的数据。
3. 如何判断和防止SQL注入?
4. 如何对海量数据进行处理?
第1题考查基础知识;第2题考查SQL语句的编写能力和技巧,属于初级程序员的问题;第3题考查SQLServer的安全性,属于中级程序员的问题;第4题考查SQLServer的性能,属于高级程序员的问题。通过这几个问题可以判断出应聘程序员的数据库水平。
毛颖 放过CAPS公司销售工程师
从个人经历来说,我会对以下五个问题比较感兴趣。
1. 请说出3个你觉得至今都没有算法可以解决的问题。
这是一个开放式问题。从回答中我们可以了解到被面试者的思维方式和思维敏捷度,而这两点是一名优秀程序员不可或缺的。我预料一般有两类回答:第一,学术类,比如有人会说一些关于寻找质数之类的现在还无法解决的问题;第二,生活类,我比较期待这一类有意思的回答,如果被面试者可以结合一些现在的社会现象作出回答,也可以从另一个角度反射出其社会属性。
2. 请从技术角度谈一下《黑客帝国》的观后感。
同样又是一个开放式问题,完全没有所谓的标准答案。《黑客帝国》是程序员的必看“教材”,整个故事最精彩的莫过于构思。我觉得能具备这样的构思能力是程序员的最高境界。那么从技术角度,对于这个构思的框架搭建以及实现等,我想听听程序员的不同理解和实现方法,从侧面了解他们的潜在创造能力和对身边事物的建模能力。
3. 你比较偏向于把程序员比作翻译、建筑师还是设计师?
问这个问题的目的是看你怎样理解程序员这个职业。一个人对自己职业的认识以及定位将直接决定其在这个职位上的积极性和创造能力。我的答案是程序员既是翻译,又是建筑师,更应该是设计师。并且随着这三个职业的排序,正是我认为的程序员职业能力升华台阶。
4. 请设计至少两个不同的算法解决将一个蛋糕平均分为6份的问题。
比较实际的专业能力题。这是一个既简单又综合的考验。除了对程序员这个职位的正确认识之外,实际操作能力毕竟是影响今后实际工作的第一要素。这道操作题,考察应聘者对问题的思考,以及分析能力和解决问题的动手能力。
5. 比较一下这两个算法,你觉得哪个更好,依据是什么?
比较算法,还是考察的专业能力,目的是看你怎样判断一个算法的好坏。对这道题,没有接受过专业训练的应聘者应该无法给出全面且科学的分析。并且请他们评论自己设计的算法,也是对自我认识的一种衡量。
李颜杉 某外资人力资源顾问公司猎头顾问
程序员的概念有点宽泛,为更有针对性,我主要分享对“网络程序员”的观点。简言之,我们主要关注面试者的硬条件、软条件两个方面。
硬条件是指学历、技术经验、语言等能直接呈现的能力。技术是实在的东西,有就有,没有就没有,由不得半点浮夸。
我们比较感兴趣的问题如下。
1. 做过什么:是写代码、设计还是架构?
2. 做成功过什么:是大型的平台吗?其特质如可扩展、高并发、交互式。
3. 擅长做什么:使用的编程语言是哪种?使用经验有几年?
4. Debug的经验,遭遇什么复杂的问题(需例证其复杂性)?
技术面试的后续往往是笔试或上机,比如,在所有你使用过的DesignPattern中,请解释对比其中两种,如CommandPattern和VisitorPattern(可以文字回答,也可以画图)?DOMparser与SAXparser的区别在哪儿?什么情况下采用DOMparser而不是SAXparser?大家在面试之前可以Google一下类似的题目。
如果面试外资公司,需要英文达到流利读写的水平。因为项目的完成往往需要协同全球多个国家的同事,如果缺乏英文技能,在外企的发展是比较受限的。计划今后进入外资公司的朋友,一定要加强练习。
软条件是指性格、兴趣、职业规划等非直接呈现的能力。公司对于程序员一般会看重两种性格特质:爱技术、乐分享。
“爱技术”的人才会自发的钻研,不浮躁,也才会在这一行做得长久。对于这点,面试官可能希望了解你工作之外喜欢做什么。我听到过很多分享:经营自己的博客或者技术论坛;尝试新技术、新设备,学习新技术是一种乐趣而不是负担;当然,下次你可以说你平时喜欢阅读《程序员》。
“乐分享”的人才能带动团队整体进步。对于这点,面试官可能希望了解你在团队中是什么角色。有的人可能讲我是Mentor,我们遇到技术问题时要内部讨论,我往往是能给出solution的人,所有人都解决不了,我们会求助于互联网——说明你不只愿意分享,而且有东西可以分享。
以前曾在面试中听说,程序员是青春饭,3~5年之后一定要转做Manager。我觉得职业发展一定要切合自己的性格,并不是每个人都很享受并善于处理人事管理。有的资深开发人员转成Manager几年之后,又转回纯技术(IndividualContributor)。而资深技术人员对于公司是非常宝贵的财富,不管从受重视程度、薪资福利待遇都是非常有吸引力的。
(本文来自《程序员》杂志11年02期,更多精彩内容敬请关注02期杂志)