因为公司最近招聘的力度很大,所以最近公司的面试很多,加之很多同事项目紧,所以让我参加了一些技术面试。不论是作为面试官还是应聘者,参加工作以来我参与的面试的次数我自己也记不清了,所以在此想从面试官和应聘者的角度来谈谈我的面试经历和感受。
作为面试官
因为上周的事情比较近,我就先从公司最近的面试谈起。我所在的公司面试是分为四轮的,前两轮是技术面试,第三轮是英语面试(因为是外企,所以对英语要求相对较高),第四轮是人事的面试,因为应聘者分布范围很广,所以我们的面试以电话面试为主。因为我本身就是技术人员,所以我只会参与前两轮的面试。
首先公司负责招聘的工作人员会从招聘网站收集一些相关技术领域的应聘者信息,在这里做一些初步的过滤,比如学历、工作年限、工作经历等等,在这里的过滤没有任何技术人员的参与,仅仅是负责招聘的同事根据自己以往的经验来工作,这一步骤我没有参与,所以我也不知道具体细节。通过了简历过滤这一步之后,应聘者会得到电话确认通知,确认是否真的有意向来本公司工作。
经过了简历过滤之后,就进入到正式的面试流程,也就是第一轮技术面试。这一轮的技术面试有点像“超女”的海选。在这一轮中我们会对应聘者的技术广度和深度做一个较为全面的测试。对于技术人员,我个人有这样一种看法:技术的深度是决定是否录用的充分条件,而技术的广度是决定你的薪水高低的充分条件。注意我在这里用的词语是充分,而不是充要或者必要,因为有些偏才、怪才不属此例,如果你自认为不是偏才或者怪才,那么就要在技术的深度和广度上下功夫,最好是遵循先深度再广度的过程。所以在第一轮的技术面试中,我们会首先通过一些基本的问题来了解应聘者的所掌握技术的广度,然后再通过一些基础题来测试应聘者所掌握技术的深度。如果应聘者在某些面上达到了我们的深度要求,就会进入到下一轮面试。
跟第一轮面试有所不同的是,第二轮面试提问的面不会那么广,而是根据应聘者在上一轮中的表现突出的部分再深入详尽了解测试一下他所掌握的技术的深度,除此之外,可能还会有一些问题来测试他的思维反应能力,比如针对某一个框架中已经实现过的功能要求应聘者尝试另外一种实现,比如如何写一个Web服务器或者某个框架等等,在这里并不是要求应聘者真的去实现这样一个功能,而是借此来判断他对陌生问题的思维反应能力。如果通过了这一轮面试,算是通过了技术部分的面试了。
在这里我想纠正几个错误的观点。
第一个观点就是很多初中级开发人员经常会想一些类的基本用法一查帮助手册或者在网上一搜就能得到答案了,为什么还会问这样的问题?这个观点是错误的。我承认很多问题确实可以通过查找帮助手册或者在网上搜索就能找到答案,但是作为开发人员掌握一些基本知识是必须的。就像通过查字典我们能阅读所有的书籍一样,但是你见过哪个作家认识的字还没有一个小学生认识的多就能写出一部长篇小说来?开发人员是创造者,如果脑子里实现没有一些基础的知识,他怎么能够天才般地想到这个问题改用那个类的那个方法来实现?这就是为什么所有的针对初中级技术人员的面试一定少不了问基础知识的原因。对于同一个功能的实现,可能在类库中有不同的实现,这些实现之间的差别我并不认为是类似“茴香豆的茴字有几种写法”那样迂腐可笑,相反它们可能分别适应于不同场景下。
第二个观点就是很多应聘者总感觉面试官是一定要难倒应聘者才会获得心理上的快感,或许有这样的面试官,但是大部分面试人员没有这种心态。有时候会提一些刁钻、偏僻的问题,这是出于了解应聘者的掌握的技术的广度的需要。在大部分情况下,某些问题你回答不上来没有关系,没有人指望你会获得满分——当然,如果你获得了满分,在你和HR谈薪资的时候你会更主动、底气更足。在某些情况下,面试官在某个地方深究可能是出于项目的需要,比如希望招聘进来的人将来从事某个项目的开发,而这个项目对一些领域要求比较高。
第三个观点是关于面试官与应聘者的技术高下的,很多人认为面试官一定比应聘者技术高,其实未必。当然在大多数情况下可能是如此。我有看到有人在写面试经历中写到自己曾经问过面试官一个问题,结果面试官回答并不理想,于是就得出面试官技术不咋地,甚至还会说面试的那个公司全部技术不怎么样的结论,其实这个结论未必是正确的。所谓术业有专攻,你所掌握的知识未必就一定是别人所需要的,你在某一个点上胜了别人未必代表你在所有面上都超过了。当然也存在你在某一个面上真的胜出了别人——这很可能就是别人要招聘你的原因。总之,面试官不是处处都比你牛,他能代表公司来面试你可能是他在另一个你并不擅长的方面很突出所以就进入了公司并且代表公司来面试你。
作为应聘者
前面周公说过,周公做过面试官,也做过应聘者,在这里周公也谈谈周公作为应聘者的一些经历和感受,在简历中我的应聘岗位从C#高级程序员到项目经理及技术总监。为了避免不必要的麻烦,在下面的叙述中列出的公司名称都是随意取的代号,请大家不要对号入座。
从山西太原回湖北武汉之后,周公在一家挂着美资旗号的台资企业WSW工作(台资企业最典型的代表就是FSK了,最具有台资特色的就是所有窗户外面都有安全网),这类的台资企业还有WC和QS等等。因为台资企业的变态管理制度和无福利措施,所以在那家公司时周公去过武汉一些软件公司面试。在这里周公谈一谈一些印象比较深刻的面试。
第一家印象比较审核的公司就是QS。这也是和WSW一样,这也是一家挂着美资旗号实行台企管理的软件企业,里面有很多不违反法律法规但是让人觉得非常不舒服的措施,其中之一就是让你拿着二线、三线城市的薪水去一线城市出差(有些台企如WSW更恶劣到以“培训”的名义让你出差,这样连差旅费都省了)。在这家公司里我被问及到很多技术和管理方面的问题,大多数我都回答得比较好,所以就没有什么印象了。我至今仍有印象的就是一道关于单元测试题,题目就是有针对一个大型项目的单元测试,全部测试用例有16万个,做完全部测试的时间大约需要8小时。现在的情况是如果一次性全部测试就会有用例测试不通过,如果只测试一半(前1/2或者后1/2)就能通过,问如何解决这个问题。说实在话当时对这个问题我就没有思路,一般开发者在项目中也不会遇到这样数量的单元测试用例,我当时的思路是再测试前1/4至3/4部分的用例看是否会全部通过,或者继续类似于修电脑式的故障排除法(就是通过分段的方式)来查看问题所在,不过仍被否定。至今这个问题我仍没有想出比较好的办法(这也是为什么我至今仍没有忘记的原因),现在想到的可能就是是否在单元测试中有未来得及释放的资源,在少量用例测试中并不会出现,在大量用例测试中就会因为没有来得及释放所导致(比如大量对数据库访问导致数据库连接池中没有可用连接导致等待超时等等)。
第二家公司是在汉口的一家公司。去了之后被告知公司总部位于深圳,武汉分公司成立不久,公司现在目前还没有技术人员,唯一懂技术的总经理当时正在出差,在出差之前总经理留下了一套题。等HR把这套题拿过来之后,我一看真的是傻眼了!在这份8页的试题上写满了题,所涉及到的编程语言有Delphi、C\C++、Java、C#及PHP,所涉及到的数据库有SQLServer、MySQL及Oracle,除此之外还有一些算法题,什么灰度算法之类的等等。说实在话,这些编程语言和数据库我都使用过(广度还算可以吧,当然有些只是在业余学习并实践的),但是不能在每个编程语言和数据库上都能达到相同的深度,花了两个半小时做了我所能做的部分就交卷了。事后的感觉是,在应聘过程中我遇到过不少要求广度和深度的公司,但是如此要求的真的是平生第一次,到最后我都不知道这家公司主要用什么变成语言开发。
第三家公司是曾经位于中南的WC公司。进去之后也是发了一堆面试题,有中文描述要求中文作答的,有英文描述要求英文作答的,有技术的,也有考逻辑思维能力的,也有个人要求填写个人隐私资料的。在技术面试部分有考编译原理的,也有考汇编语言的,尽管学的不是计算机专业课,但是为了拓展眼界我曾经自学过这方面的知识,所以大部分勉强回答得上来,不过最终我没有做完全部的试题,因为我在试题中看到了很多设计个人隐私问题,比如是否得过乙肝(这个好像国家禁止用人单位打听并以此拒用应聘者吧),还有在过去三年是否得过重大疾病以及对祖上的调查等等,并且公司说如果不如实回答公司如若发现就会立即辞退,考虑到这样的公司不可能会对员工有所尊重,所以我决定半途退出(事后我有同事去了这家公司,完全证明了我的推测)。
第四家公司是位于珞瑜路上的一家公司,总部也是位于深圳。在一个大学纷飞的冬天,我去了这家公司面试。头一次遇到没人给倒杯水的经历(我当时真的很想喝杯热水暖暖身子,特别是我后来知道整个面试过程持续了三个半小时时)。这家公司的面试题也很厚,前半部分是非技术测试,题目很像公务员考试的逻辑推理题目(周公曾有一次公务员考试的经历),后半部分是技术题,让我吃惊的全部是C和C++的题目。术业有专攻,对于C和C++方面的知识我确实不熟悉,只能回答一部分。最后来了一个技术人员和我聊天,我们谈了各种数据库的记录数达到何种级别就需要采取集群或者负载均衡措施,之后的全部时间都是在围绕着数据库方面的知识进行。事后周公的感觉是,可能这家公司的HR把C#当做C++,因为他们要招聘的是高级C++开发人员而不是C#,估计是看到都有C,觉得差不多所以让我过去参加海选。
第五家公司,这家公司是我进入到当前公司之前的最后一家公司,这是一家创业型的公司,所以对技术要求比较高。在这家公司里面试过程中,基本上都是围绕C#和ASP.NET进行,中间曾有过Java和C#的对比,对于Java和C#我一直都在用并且也都在关注技术趋势,所以回答得比较顺利。有两个问题印象比较深刻,一个是一个方法,在C#的循环里执行1000次和在Java里执行1000次(忽略语法上的区别),它们在执行过程中甚至在运行时有什么区别没有;另一个问题是在ASP.NET中实现URL重写,这个过程是在对用户身份认证之前还是之后?在这家公司干了三个月最终离开了,并且在现在的公司认识了以前也同样在那家公司干过的同事(我进去之后正好坐在该老兄的位置上),大家的感觉是这家公司劳动强度太大,一周上班六天也就罢了,还每天工作12个小时以上,真的是受不了。
最后谈谈我现在公司对我的面试。在没进去之前我也经历过四轮面试,前两轮同样是技术面试,在技术面试中问到了IIS各版本之间的差别、命名管道、ASP.NET页面生命周期、ASP.NET1.1和ASP.NET2.0之间的区别(aspx页面部分就有区别,前为extends,后位partial,编译处理也不一样)等等考察广度和深度的问题。最终通过了面试而入职。
在入职现在的公司之前,还受猎头推荐跟上海的一家移动互联网公司接触过,应聘的岗位是技术总监,在这家公司面试时主要是谈及高并发下的处理问题,比如如何使用负载均衡,如何使用Memached等第三方工具等等,本来在这方面我还是有一定经验,并且对方很也看中我的技术和管理经验,只不过周围的人都不太赞同我再次离开武汉,所以最后只好作罢。说真的,心里感觉有些遗憾,但为了父母和家人,只好放弃。
感触和体会
在面试过程中遇到不能回答的问题不必太过于在意,特别是面试官在考察你掌握的技术的广度的时候,最忌讳因为一两道题回答不上来而紧张,从而影响了个人能力的发挥。对于个人来说,一定要尽量在深度上下功夫,在满足深度的前提下拓展广度(用逻辑思维能力,举一反三)。最后要说的是,心态很重要,你有选择公司的权力,公司也有通过各种手段来来考察你的能力的权力,在不涉及隐私和影响个人福利的情况下尽量作答,能进去自然皆大欢喜,不能入职也没有必要自暴自弃。可以继续寻找适合你的公司,也可以继续准备,为再次面试做准备。
周公
2011-08-15
如有这方面的问题,可以在博客下方留言或者异步到周公的微博(http://weibo.com/zhoufoxcn)参与讨论。