我以前写过一篇“”的文章(在囿很多人进行了回复)今天,我想再谈谈关于招聘和面试这方面的东西主要是以下这些原因:
- 近半年来我在进行了大量的招聘工作,對面试有一些新的体会
- 酷壳最近发布了几篇趣味面试题(,),从回复中让我有一些思考
- 我有一个同事最近面试了一家公司,他和峩分享了一个博士专家对他的面试也让我思考了一些。
- 在豆瓣上看到“”(亮点是面试官现身知乎亲自作答)
所以我很想把自己的这些新嘚想法再次写下来的。还是和以前一样这篇文章同样是献给面试官的。我认为面试的好坏完全在面试官而不是面试的人。下面是我对“”一文中的一些加强性的观点(关于一些点评,请参看)
为了让我的文章有连续性请允许我重申一下前文的几个重要观点。
-
只有应聘者真实和自然的表现才能了解到最真实的东西
-
重要的不是知识,重要的是其查找知识的能力
-
重要的不是那个解题的答案而是解题的思路和方法
操作,知识经验,能力
我们有很多的面试官似乎分不清什么是操作能力,什么是知识什么是经验,什么是能力这导致叻我们的面试官经常错误地对面试者下结论,我认为分不清这些事的人是没有资格做面试官的所以,我有必要在这里把这个问题先讲清楚
-
操作。我们的面试官分不清楚什么是操作技能什么是知识,他们甚至认为操作技能就是知识甚至经验比如他们会 问如下的问题,請问Java中的 final是什么意思怎么查看进程的CPU利用率?怎么编写一个管道程序怎么查看进程的程序路径?VI中的拷贝粘贴命令是什么包括面向對象的XX模
式是什么。等等我以为,这些能够通过查况相关操作手册或是能够google到的东西只能说明这个人的操作技术并不能说明他有知识戓有经验。
-
知识知识是一个人认知和学习的体现,可能会是一些基础概念和知识比如这些问题:TCP和UDP的优缺点比 较,链表和哈希表的优缺点的比较什么是堆什么是栈?进程间是怎么通信的进程和线程的优缺点?同步和异步的优缺点面向对象的XX设计模式的主要原则是
什么,等等我以为,“知其然”只是操作技术“知其所以然”才是真正的知识。知识不够并不代表他不能工作会操作技能就可以应付工作,但是知识的欠缺一定会限制你的经验和能力同样会影响你的开发质量。
-
经验经验通常跟一个人的经历有关系。一个人的知识范围一个人经历过的事,通常会成为一个人经验的体现面 试中,我们会问这些问题:你解决过最难的问题是什么你是怎么设计这个系统的?你是怎么调试和测试你的程序的你是怎么做性能调优的?什么样的代码是好的
代码等等。对于工作年限不长的人来说经历囷做过的事的确会成为其经验的主要因素,尤其是业务上的有行业背景的东西但是,我更以为经验可能更多的是你对知识的运用和驾馭,是你对做过事情的反思和总结是你对他人的学习,观察和交流
-
能力。一个人的能力并不会因为知道东西少而不行也不会因为没囿经验而没有能力。一个人的能力是他做事情的一种态度性格,想法思路,行为方法和风格。只要有热情有想法,有好的行为方法以及好的行事风格,那么知识和经验对他来说只是一个时间问题
比如:学习能力,专研精神分析能力,沟通能力组织能力,问題调查能力合作能力等等。所以对于一个新手来说,也许他的知识和经验有限但并不代表他 能力上有问题,但是对于一个老手来说如果其存在知识和经验欠缺的问题,那么通常都是其能力的问题你可能暂时怀才不遇,但我不相信你会长期怀才不遇如
果是的话,那么你必然些问题其让你的能力发挥不出来而此时,“没有经历过”只会是你“没有能力”的一个借口
我不否认这四样东西对于一个優秀的程序员是什么来说都很重要。但是通过上述的分析,我们可以知道能力和经验和知识需要分开对待。当然这些东西是相辅相荿的,你的能力可以让你获得知识你的知识可以让你更有经验,你的经验又会改变你的想法和思路从而改善你的能力。在面试中我們需要清楚的认识到,应聘者的操作技能知识和经验只是其能力的必要条件,并不是充要条件而我们更应该关注于应聘者的能力。
- 如果面试只是考查这个人的操作技能的话那么这个面试完全失败。这是一个没有资格的面试官
- 如果面试只是在考查这个人的知识和经验嘚话,那么成功了一半因为你了解了基础知和做过的事,但这并不代表你完全了解他的真正能力
- 如果你能够在了解这个人的知识和经驗的过程中重点关注其能力(态度、性格、想法,思路行为,方法和风格)并能正确地评估这个人的能力,那么你的面试算是非常成功的
也许用这四个词来描述定套东西并不太合适,但我相信你明白我想表达的另外,我想说的是我们不是出个题来考倒应聘者,而昰要找到应聘者的亮点和长处
不要肤浅地认识算法题和智力题
很多公司都会在面试的时候给一些算法题或是一些智力题或是一些设计题,我相信算法题或是智力题是程序员是什么们在面试过程中最反感的事了很多人都很BS面试官问的算法题,因为他们认为面试官问的这些算法题或智力题在实际工作当中用不到但我想在这里说,问难的算法智力题并没有错错的很多面试官只是在肤浅甚至错误地理解着面試中的难题的目的。他们认为能做出算法题和智力题的人就是聪明的人就是有能力的人,这种想法实在是相当的肤浅
其实,能解难题並不意味着这个人就有能力就能在工作中解决问题你可以想想,小学奥数题可能比这些题更难但并不意味着那些奥数能手就有实际工莋能力。你可 以想一想你们班考试得高分的同学并不一定就是聪明的人也不一定就是有能力的人,相反这样的人往往者是在应试教育丅培养出来的书呆子。
所以我认为解难题的过程更重要,你要主要是通过解题查看这个应聘者的思路方法,运用到的知识有没有一些经验,和你一起交互时和沟通得是否顺畅等等,这些才是你重点要去观察的当然,最终是要找到答案的
我想,让面试者解决一个難题的真正思路是:
-
看看他对知识的应用和理解比如,他是否会用一些基础的数据结构和算法来解决算法题
-
看看他的整个解题思路和想法。答案是次要的他的想法和行为才是重要的。
-
看看他是如何和你讨论交流的把面试者当成你未来的同事,当成你的工作伙伴一起解题,一起讨论这样可以看看大家是否可以在一起工作。
这些方面才是考查应聘者的能力(思路方法、态度,性格等)并顺带着栲查面试者的经验和知识。下面是一些面试的点:
- 应聘者在解算法题时会不会分解或简化这个难题这是分析能力。
- 应聘者在解算法题 时會不会使用一些基础知识如数据结构和基础算法。这是知识
- 应聘者在解题 时和你讨论的过程中你有没有感到应聘者的专研精神和良好嘚沟通。
- 应聘者在对待这个算法题的心态和态度如,面试面是否有畏难情绪
- 应聘者在解题时的思路和方法是否得当,是否是比较科学嘚方法
在解难题 的过程中考查应聘者的能力才是最终目的,而不是为难应聘者不然,你只是一个傲慢而无知的面试官
模拟实际中的挑战和能力
作为面试官的你,你应该多想想你的工作以及你的成长经历。这会对你的面试很有帮助你在工作中解决问题的实际情况是什么?你写代码的实际情况是什么你的成长经历是什么?你是怎么获得知识和能力的你喜欢和什么样的人工作?相信你不难会发现你笁作中的实际情况和面试的情况完全是两码事那么,你怎么可以用这种与实际情况差别那么大的面试来评估一个人的能力呢
所以,最為理想的面试是一起工作一段时间当然,这个在招聘过程中操作起来几乎不可能,因此这就要求我们的面试官尽可能地把面试的过程模拟成平时工作的 过程。大家一些讨论来解决一个难题和应聘者一起回顾一下他已经做过的事情,并在回础的过程中相互讨论相互学習下面举一个例子。
我们知道对于软件开发来说,开发软件不难难是的下面是这些挑战:
- 软件的维护成本远远大于软件的开发成本。
- 软件的质量变得越来越重要所以,测试工作也变得越来越重要
- 软件的需求总是在变的,软件的需求总是一点一点往上加的
- 程序中夶量的代码都是在处理一些错误的或是不正常的流程。
所 以当我们在考查应聘者的代码能力时候,我们为什么不能模拟这样的过程呢仳如,让应聘者实现一个atoi()的函数实现起来应该很简单,然后 不断地往上加新的需求或新的案例比如:处理符号,处理非数字的字母的凊况处理有空格的情况,处理十六进制处理二进制,处理“逗号”等等,我们要看
应聘者是怎么修改他的代码的怎么写测试案例嘚,怎么重构的随着要处理的东西越来越多,他的代码是否还是那么易读和清晰如果只是考查编码能力,一个小时就问这一个问题,足矣真正的程序员是什么每天都在和这样的事打交道的。
如果要考查应聘者的设计能力同样可以如法泡制。不断地加新的功 能新嘚需求。看看面试者的思路想法,分 析的方法和你的讨论是否流畅,说没说在 点上思想清不清晰,会应用什么样的知识他在设计這个系统时的经验是会是什么样的,面对不断的修改和越来越复杂的需求他的设计是否还是那么好?
当然因为时间比较短,所以你鈈能出太复杂的问题,这需要你精心设计一些精制的有代表性的问题
在上篇中,我们说到了一些认识人的方法(操作知识,经验能仂),还有一些面试的方法(算法题实际生产活动中的挑战),下面我们来说说面试的风格,还有一些点评
有些公司的面试官,在媔试过程中问你一个算法题然后等着你解答了,如果你给出一个答案然后就会问你有没有更好的答案,如果你给出了正确的答案他們就会问你一个更难的问题,如此循环下去他们基本上很少给你提示,甚至不停地质问你挑战你,搞得应聘者很紧张
另外,有很多問题是没有标准答案的或者说是,同一个答案的描述方法有多种很多面试官会觉得你没有回答到他想要的答案,因此表现得有对你不屑并表现出你不行的样子,并觉得你的能力有问题真是可笑了。比如我一个朋友在回答什么是异步的问题时举例说明了异步调用就昰不能处理完就返回,并且需要传递一个回调函数给调用方以便完成后回调通知结果这样的回答并没有错,但是这并不符合面试官心里想要的答案面试官对此并不满意,进而认为我这个朋友还需要去多读读书
我相信大多数面试官都会这样干的。我想问问这样的面试官你们有没有用面试的方式对过你的同事?在你的工作场景中你会不会用面试的风格和你的同事进行交流和说话?不妨让我们来问我们洎己下面几个问题:
- 你在工作当中遇到难题时你是怎么解决的你会和人讨论吗?你只用15分钟就能得出最优解吗
- 你在工作当中解决难题時是否会有一个人在旁边质问你并给你压力吗?
- 你在工作当中会为难你的同事吗会让你的同事紧张吗?你觉得在紧张的状态下能做好工莋吗
- 你在工作中觉得同事的回答并不是你想要的答案,不是符合你的答案你会认为你的同事不行吗?
- 你的成长过程是什么样的在是壓力和天天被人质问的情况下成长的吗?
- 大家都知道学校里应试教育的弊端你觉得你的面试是不是一种应试呢?
(看看这么多的应聘者們都在做各种各样的算法题这不就是一种应试吗?)
想一想你的日常工作问自己一下上面这些问题,想一想你自己的成长过程想一想你和你的同事是怎么相处的,想一想你的日常工作中是什么样的相信你自己也能得出结论的。
如果你把应聘者当成自己未来的同事那么你的面试会有下面的收获:
- 面试的气氛会很不错,应聘者会放松表现自然,更接受于真实的状态
- 面试中的交流和互动(而不是一問一答)会让你更全面的考查和了解一个人。
- 非应试的面试会让你了解得更多。
- 真实的了解一个人你才能做出真正正确的结论。
- 面试嘚过程是一个相互学习的过程并不是你为难面试者的过程。
- 一问一答是很一种呆板死板的过程相互讨论相互学习,有良好的互动才是恏的面试过程
- 面试官要证明的不是你有多强有多聪明,而是要挖掘应聘者的优势和能力
- 面试官用为自己的问题预设好一个标准答案,看看应聘者能为你带来什么
- 向来应聘的人学习,而不是刁难
无论你多牛,要难倒你实在是太容易了出难题不是目的,难倒人也很容噫出难题只不过是用来了解应聘者能力的一个手段,而不是面试的全部
我不知道你喜欢不喜欢一些竞技类的运动?比如踢球打篮球,羽毛球下象棋等,你一般想和什么样的人玩是差的,还是强的所以,能够从面试者那里学到东西喜欢和面试者一起工作,这才昰面试真正的目的
对于一个团队来说,如果大家都是一样的想法一样的主张,一样的倾向那么这个团队最终会是一个闭塞的团队,伱如果不能真正接纳不同想法的人不同主张的人,那么你也将失去进步的机会如果你的团队总是在招入和你一样的人,那么你的团队怎么可能会有out-of-box的想法呢世界因为不同而美好。
另外对于公司来说,如果你招进来的人还不如已经有的人作为一个公司,你又怎么能囿更好的人让你的公司进步呢
所以,面试应该是向面试者学习的一个过程当然,如果你从他身上学不到什么那么你就教他一些吧。這样就算是面试不通过,面试者也会欣然接受的不然,让面试者产生一些负面情绪出去说一些不好的话,也有损你和公司的形象
丅面是我根据酷壳的一些后的回复、还有我朋友的经历,还有这篇有关豆瓣的产品经理的的一些点评大家可以看看我从这些地方看到东覀靠不靠谱。
先说酷壳的那篇“”这个面试题其实很没什么意思。主要考查你对代码逻辑的了解程度因为设置了回复可见答案,所以這篇文章的回复量达千把条从回复中,我看到:
- 一些朋友想不出来就直接看答案了我可以看出,有一些朋友习惯获得知识而不习惯獨立思考。甚至有畏难情绪从另一方面来说,可以看出我国的教育还真不是一般的差
- 一些朋友想不全。从这点来看我觉得很正常,尤其是想出两种来的我可以感觉到他们的努力思考了,可能还做了一些尝试挺不错的。可惜我看不到你思考的方式是在纸上画了画,还是编译了个程序跑了跑还是别的什么。这样我会了解你更多
- 一些朋友给出的答案中有错的。这说明了这类朋友可能不喜欢做测试时常想当然,或是做事比较冲动并不足够严谨。这么简单的程序验证能花多少精力呢?
- 还有少数的朋友没有看明白题目要求这说奣了这类朋友太粗心了,在工作当中可能会表现为误解需求和别人的话沟通有问题。
再说说那篇“”的问题这个面试题我觉得主要是看看大家的解题思路,表达能力
- 首先,我很惊喜有人很快就用数学做了解答很不错,这个人的数学功底很不错能用数学解题的人一般来说都是算法比较强的人。
- 有人说抱怨我没有说火车可以调头回去所以没有想到这样的方法。如果是在面试中我会做提示的我不会洇为你不知道调头这个潜规则而否定你的。当然如果你能想到的话说明你的脑袋还是比较灵的。
- 还有很多人说他的方法比较土只运了400噸煤,416吨的或333吨一看就是没有看提示的,我觉得这些人能够通过独立思考找到方法这类的人其实已经不错了。顺着这个思路优化也只昰时间的问题了
- 更可喜的是,我看到了有一些朋友在看到别人的更好的方法后和自己的方法进行了比较并找到了为什么自己的方法不洳他的原因。这样的人我认为是懂得“总结”和“比较”的这样的人总是在不断地学习和改善自己的。
- 还有人说到了动态规划如果是茬面试的时候,我很想向这位朋友学习一下用动态规划来解这题
- 还有朋友说到了火车调头只能在有站的地方。这个朋友一看要么就是搞需求分析的人要么就是较真的人。需要进一步了解但不管怎么样,这样的朋友的观察能力是很不错的
- 还有一些朋友给出的答案是正確的。但是表达方面比较复杂有些没有看懂。可见解题 的能力是有的,只是表达能力还有待提高
再说说豆瓣上的,那篇文章里面試官问了一个比较大的问题,那是仁者见仁智者见智的问题,并且面试官并不满意应聘者给出的答案并在用其主观意识强加一些东西給应聘者,并不断地和应聘者纠缠后来,面试官回复到“重点测了两个问题:一是判别事情的标准和方法;二是在多种PK下产品经理的压仂反应”
- 其一、这种似事而非的仁者见仁,智者见仁一万人有一万个答案。所以这种怎么答都可以的问题是很难有标准的,我认为豆瓣的面试官以这种问题来考查面试者的标准太有问题了更好的问题是:比较一下新浪和twitter这两个产品。
- 其二、多种想法PK的压力反应这點没有问题,如果有机会我想问问这位面试官豆瓣产品经理们的PK各自的想法时是以这种纠缠的方式吗?如果是这样的话那我很为你们擔忧啊。
- 其三、很明显应聘者不知道面试官想说什么,所以应聘者总是给出一些模棱两可的回答回答得很政客,呵呵
- 其四、问的问題都是一些假设性的问题,假设技术人员不可沟通人家说了,还没有见过不能沟通的情况结果还要继续追问。这样你既要观察不到你想要的也搞得大家不愉快。更好的问题的:“请你给一个你和一个很难沟通的人沟通的示例”或是当应聘者说了“坚持己见”的时候,也应该追问“能给一个你坚持己见的例子吗”。
- 其五、整个面试过程完全是在谈一些虚的东西就像天上的浮云,一点实实在在的东覀都没有比如下面这两个实实在在的问题:“你以前设计过什么产品?”“你和你的技术团队是怎么合作的?”
这是一个完完全全失敗的面试这个面试官根本不懂面试,甚至工作方法也可能很有问题也许他只是想找一个能够在工作中附和他的人。
最后说说我那个朋伖的面试我的这个朋友学习能力很强,也很好专研工作中解决了很多很困难甚至很底层的问题。他做软件开发时间并不长但是他对這个行业很有热情,也很执着并有着相当不错的技术功底。这天他遇到了一个面试官根据朋友的描述,这位面试官主要问题了三个問题,一个是关于异步的一个是关于性能调优的,还有一个是关于学习能力的
- 问到异步的问题,我这个朋友说到了多线程中的异步调鼡但是他可能问的是网络或是业务中的异步,要不然就是Linux 内核中的异步当然他也没有说清楚,但他很不满意我朋友的答案并让我朋伖回去多看看书。
- 问到性能调优的问题时我这个朋友说了性能调优分三级,业务级指令级和CPU级,并举例说了使用了一个叫VTune的性能分析笁具面试官却说原来你只懂Windows,有点不屑并说他只会使用商业工具,更不屑
- 当我朋友向他澄清问题时,面试官只是摇头叹气。并在應聘者作答的过程中不断的打断对方
- 对于异步来说,我认为这是一种设计或是一种想法可能会有很多种不同的实现方式,在不同的场景中会有不同的用法面试官并没有考查应聘者对异步方法的理解,也没有考查异步方法可以用来解决什么异步方法的优势和劣势,等等只是觉得应聘者没有给出他想要的答案。
- 对于性调优的问题我认为应聘者的思路和知识都很不错,还有使用VTune的经验无论使用Windows还是Linux,无论使用商业的还是开源的Profiler很多东西都是相通的,怎么能够因为这个东西不对自己的口味而下结论为什么不向人家学习一下VTune呢?使鼡工具只是操作技能啊
- 面试官应该是用微笑来鼓励应聘者的,而不是用摇头和叹气频繁打断对方也是一个相当不好的习惯。看来这个媔试官很不能接受不同的东西
这位有很不错的技术能力的人,看来并不适合做一个面试官因为他面试的东西都只在知识层次,而且这位面试官有强烈的喜好和倾向所以,他必然会错过那些有能力但并不合他口味的人
哎,面对这样的面试官大家伤不起啊!