刚刚收到CSDN发来的人才周刊《听程序员说面试这事儿》(很是对不住CSDN,邮件被filter到Spam里面了),看了几个面试官的经历,还是挺有感想的。
我在公司也经历过不少面试的事情,我不是专职做面试,但经我面试的,也大致也有几十个。总的感觉就是:Experienced的比应届毕业生好(这个比较容易理解),本科生比研究生好,不切实际的大有人在。
前面说了,我也只是普通的工程师。从我最早开始面试别人开始,我都是怀着非常重视、非常低调的态度去面试的。坦白地说,第一次面试我比Candidate还紧张。但最后的结果却是,面试10个,能看得上的有1个就不错了。
从前看简历的时候,总是非常认真,面试前对每个Candidate的建立认真考虑。但后来都是把“精通”变成“熟练”,把“熟练”变成“一般”,把“一般”变成“了解”。事实证明,我就是这么考虑,还都有水分呢。
当初我第一次面试Master的时候,的确挺紧张的。但说实话,Masters里面,真正水平比较高的,的确不多。个别的都是连话都不能正确理解的。以至于我多次在面试研究生和与研究生一起工作的时候,产生了“是不是我没有说清楚?”“是不是我说错了?”之类的幻觉。
我们总是考虑,是不是我们的面试要求过高了,导致绝大多数(9/10 failure不算“绝大多数”吗?)Candidate都不能通过面试。但重新审视一下,感觉并不高。连个排序算法都写不出来,连个基本程序都写不出来——说到这里,我想起一个事儿,一般在面试过程中都让写个代码,其实大多数的意思都是写个函数就行了,有输入、输出参数,但为啥那么多人都写到main里面呢——你说这样的candidate,不让他fail,还有其他的选择吗?
有些Candidate的要求很高,当然个别人的确水平相对高些,对我们的面试也是不屑一顾。我面过的很狂的一个人,我们的面试题就写了一道。笔试前面的表格上,只写了自己的姓名和期望月薪(当然我承认我们公司的笔试表格比较臃肿)。看了一下,这个标准的candidate,我认识的team里面的engineer绝大多数都能做到。
Candidate的目标高是一方面,对自己会的东西不深入,才是真正的致命缺点。坦白的说,我面过的个别研究生、本科生,他们的Coding能力,我就是拉来一个中学生,培训2周,也能达到同样的标准。 比方说,有的candidate里面写着“精通C++”、“精通C#”,行,那我问吧。C++和C#有什么区别?答:C#有现成的类库,C++大部分代码都要手工写。WHAT!就精通成这样了?
另外说一下简历,我其实看了好多好多简历。不少人面试SDE/SDET职位,但简历里面写“熟练使用Word/Excel”。一般碰到这样的,我都不会选择的。如果把Word/Excel也算作一种技能放到简历里面,还冠以“熟练”或者“精通”。Okay,那以此标准,我觉得你的其他工作能力(比如Coding)也非常的一般。为什么这么说?Word/Excel作为工作中常用的工具,不管你是不是做专业的Engineer还是做Office/Admin/HR之类的职位,Word/Excel都要能够熟练使用。如果你把Word/Excel都作为“技能”列在了简历上,那可想而知,别的技能也好不到哪儿去。
最后就是态度问题。我放在最后来说,就是想说,虽然“态度”并不是决定Candidate成败的一个重要因素,但有些情况也是interviewer绝对不愿意看到的。我指的态度问题,并非是Candidate表现得“很狂”,“狂”我不怕,不管是真的有能力的“狂”,还是装大尾巴狼的“狂”。我怀着无比激动、无比认真的心情去面试,却得到了完全不把我放到眼里的举动,这是我厌恶的:
- 在我说话过程中打电话/发短信:手机现在普及了,但面试的时候,手机响了,你会怎么样?反正不管是我作为Interviewer,还是作为Candidate,我在面试前都会把手机设置为静音。即使面试过程中真的响了,我一律关闭铃声,不接听。但我碰到过2个Candidate,一个在我面前打电话,一个在我面前发短信。打电话也就算了,不管是你是有什么紧急的事情,还是不知道怎么关闭铃声,还是有什么紧急的情况;但短信……什么时候回复不行?非要当着我的面?
- 笔试作弊还不动脑子:我们有先笔试后面试的习惯,有一次HR在异地分公司笔试的时候,用了电子笔试(就是在电脑上做答),结果答案就花哨了。有个很过分的:让写个二叉树遍历的代码,结果人家的代码上call了另一个函数,可这个函数,人家Candidate完全没写——明显是抄的啊;还有的写了个代码,里面还有“while(_(1)_)”的代码呢——(我心说,while什么时候增加了这种写法了,还真解释了一下,1=true,(1)=true,那_是干什么用的啊)去网上搜索了一下,“初程”的原题(人家里面的_(1)_是给填空用的,我说怎么没见过while后面有这种写法的啊)。你说你抄就抄吧,连看都不看。完全的不动脑子。
作为软件工程师,应该具备哪些素质呢?我觉得:
- 学习能力:谁也没有要求你一上来就会很多很多,尤其是公司内部用到的东西。但优秀的学习能力是适应不同的开发环境的前提。你可以不会,但你应该很快适应。
- Concurrently working:很多时候,可能需要同时in charge不同的工作,我觉得这也是应该能适应的。合理的安排自己的时间,也是非常重要的。
- 深入项目:以前项目做的东西,你可能做的是很边缘的东西,但你要对自己做过的东西很深入。比方说,你要明白自己做的东西是怎么回事,每个文件干什么用,和其他模块之间的联系,以及为什么这样写,这样写有什么好处,有没有更好的方法实现。另外,对自己的开发环境要有个了解。我碰到过不少人,写代码只会用IDE,别人的代码不会读,只能用IDE去trace。当然我倒不是要求一定不用IDE去写代码,但好歹你要了解是怎么回事。对于新的东西,查查Document,无可厚非,但是,对于你写过的东西,也非要查着document才能做吗?也非要在IDE里面点(.)一下才能知道怎么用吗?
- Trouble Shooting:写代码的人好像不太注意这些,但好歹别人给你的bug,你要能shoot到问题的所在。另外,这里还有个解决问题的能力,无论是SDE还是SDET,都可能遇到代码的问题、产品的问题,或者代码集成在一起后,就会出现问题,但你要有能力解决。
- 最后说一下Bug,好多人以自己的Bug数量作为评价自己开发能力的标准。我倒是觉得Bug并不能说明什么。比方说,你编写一个简单计算器,远比写一个科学计算器产生的bug要少。所以说bug并不能说明你coding多强。我以前接手的一个人写的代码,一点儿毛病没有,就是显示一条数据需要10秒,那谁受得了啊。 我宁可他的代码多一点儿bug。
不过实话实说的是,这几条在面试里面的确很难看出来。有人天生不会面试,自己水平超高,面试却发挥不出来;有人就正好相反,面试表现极好,就是招进来感觉失望。