原文链接地址/knowledge/articles/544715d00cf27c5766bac829
IT行业发展如日中天,每个程序员都想进入好的公司以实现自己的价值。那么,IT公司的面试官们又是如何选择应试者的呢?乔布小编专门整理出了这篇IT公司面试官谈他是如何对应试者进行面试,以及是如何筛选优秀应试者的文章,也希望对各位IT程序员进入优秀IT公司有所帮助。
雇佣合适的人对于IT公司来说是非常关键的。在IT领域,有三类人可以挑选。一个极端, 是那些混进来的, 甚至缺乏最基本的工作技巧. 只要问这类人两三个简单的问题,再读一下他们的简历,就可以轻易地剔除他们。另一个极端的类型是:才华横溢的超级明星。这些人仅仅为了好玩就用汇编语言为Palm Pilot(一种手掌电脑)写了一个Lisp(一种人工智能编程语言)编译器。在这两种极端类型中间的是一大群不能确定水平的候选者,也许他们中的某些人能干些什么?这里的关键是明白超级明星和那一大堆属于中间类型的人的区别,因为软件公司只雇佣超级明星。下面我要介绍一些找出超级明星的技巧。
软件公司一般来讲,其最重要的雇佣标准是:
有头脑, 并且完成工作
就这两条,符合这样标准的人就是IT公司需要的员工了。公司的目标之一就是雇佣拥有这样潜质的人,而不是雇佣懂某些技术的人。任何人所拥有的某些具体技术都会在几年内过时,所以,雇佣有能力学习新技术的人,要比雇佣那些只在这一分钟知道SQL编程是怎么回事的人对公司更划算一点。
有头脑确实是一个很难定义的品质。但是让我们看一些在面试时能提问的一些问题,通过这些提问,我们也可以找出拥有这种品质的人。
有头脑但是没有完成工作
完成工作非常关键。看起来有头脑但是不能完成工作的人经常拥有博士学位。他们在大公司工作过,但是在公司中没有人听他们的建议,因为他们是完全脱离实际的。比起准时交活儿,他们宁愿对于一些学院派的东西沉思。这些人由以下特性而可以识别出来。他们总是爱指出两个根本不同的概念间的相似性。例如,他们会说“Spreadsheets是一种特殊的编程语言”,然后花一个礼拜写一篇动人的,智慧的白皮书。这篇白皮书论述了,作为一个编程语言,spreadsheet关于计算语言特性的方方面面。聪明,但是没用。
完成工作但是没有头脑
现在,我们来谈谈完成工作但是没有头脑的人。这类人爱做蠢事。从来也没有考虑过将来得靠他们自己或者别的什么人来亡羊补牢。通过制造新的工作,他们成为了公司的负债而不是资产。因为他们不仅没有为公司贡献价值,还浪费了好员工的时间。这些人通常到处粘贴大堆的代码,而不愿意写子程序。他们是完成了工作,但是不是以最聪明的方式完成工作。
面试官为了作出雇佣或者不雇佣的决定,他一般只要在面试过程中不停地问自己:这个人有头脑吗?这个人能完成工作吗?因此,作为被面试者,你需要作出正确的回答,在面试时你必须回答对问题。
现在我们要谈到有趣的部分了:面试时面试官会提哪些问题。基本程式如下:
介绍
应试者参加过的项目
无法回答的问题
C语言函数
你满意吗?
设计问题
挑战
你还有什么问题?
介绍
作为面试步骤的第一步,介绍的目的是面试官让应试者放轻松。基本上他们会要求你通常花30秒钟,讲一下自己是谁,接下来面试会如何进行。我作为面试官,总是要使得应试者确信,我们关心的是他(她)如何解决问题的,而不是他(她)的最终答案是对还是错。顺便说一下,面试时,你不要和应试者隔着一个桌子坐着,否则在你和面试者之间就有了一个障碍,并且暗示着一种比较正式严肃的气氛,这样应试者就很难放松了。更好的办法是把桌子靠墙放着,或者和应试者坐在桌子的同一边,这样有助于应试者放松。只有应试者不会因为紧张而表现失常,你才能更有效的进行面试.
最近做了些什么项目
第二步的内容就是问应试者最近做了些什么项目。对刚毕业的学生, 如果有论文就问问论文, 没有的话, 就问问他们做过什么很喜欢的大作业.例如,有时候我会问一下,“你最喜欢上学期哪门课程?不一定要和计算机相关的。”事实上,如果应试者回答的课程和计算机没有关系,我会比较高兴。有时候你会发现这个计算机系应届生选择了尽可能少的计算机相关课程,但是却选修了很多和音乐相关的课程。但是他(她)却说最喜欢的课程是《面向对象数据库》。哼哼,不错啊. 不过如果你直接承认你喜欢音乐胜于计算机, 而不是在这儿胡说八道的话, 我会更高兴一点。
当面试有工作经验的人时,你可以让他们谈一下前一份工作。
面试官问这个问题的目的是在寻找一样品质:热情。在应试者谈到他(她)最近做过的项目时,你观察到以下迹象都是不错的:
谈到他们做过的项目时变得热情洋溢;他们的语速更快,语言更生动活泼。这说明他们对某些东西有兴趣,有热情(因为现实中有许多人对所做的项目根本漠不关心呢)。即使他们激动地表达对做过的项目的负面感情,这也是一个好的信号。“我曾经为上一个老板安装Foo Bar Mark II,但他是个傻瓜!”表现出热情的人就是我们要雇佣的人。差的应试者对工作根本就不关心,所以根本不会激动。一个非常好的信号是当应试者很激动地谈论上一份工作,以至于暂时忘记了他们正在被面试。有时候应试者刚开始面试时表现的很紧张 — 这是很正常的现象,所以面试官对这种现象通常忽略不计。但是当他们谈到单色计算艺术(Computational Monochromatic Art)时,这个家伙变得极端兴奋, 一点都不紧张了。不错,面试官们就喜欢这样的应试者,因为他们关心他们做的事。
能认真地去解释事情。某些人被面试官拒掉的原因就是他们不会用普通人能明白的语言去解释他们做过的项目。很多工科专业的人总是以为所有人都知道Bates理论(Bates Theorem,一种经济学的理论)或者Peano公理组(Peano’s Axioms,数论中的一些定理)是什么。当应试者开始满口行话了之后,根本没法让人明白他们在说什么。
如果这个项目是一个团队项目,看看他们是否在有承担领导责任的迹象?一个应试者可能会说:“我们用的是X方法,但是老板说应该是Y,而客户说应该是Z。”面试官会问,“那么你怎么做的?”一个好的回答可能是“我设法和团队中别的人开了个会,然后一起搞出个办法…”坏的回答看起来象,“嗯,我什么也不能做。这样的问题我解决不了。”记住,聪明并且能完成工作。要搞清楚某人是否能完成工作的一个办法就是看看他(她)过去是否倾向于完成任务。事实上,面试官会主动要求他们给自己举个例子证明他们能担任领导作用,完成任务。-例如克服公司的陈规陋习。
无法回答的问题
现在我们谈谈清单上的第三款,无法回答的问题。这很有趣。这个主意的关键在于问一些不可能有答案的问题,就是想看一下应试者怎么办。“人民英雄纪念碑有多重?”、“上海有多少加油站?”、“杭州有多少钢琴调音师?”……
聪明的应试者猜到面试官不是要测验他们的专业知识,他们会积极地给出一个估计。“嗯,上海的人口是二千万;每个人平均拥有1.5辆轿车…”当然如果他们的估计完全错误了也没有关系。重要的是他们能积极地试着回答问题。他们可能会试着搞清楚每个加油站的储量。“嗯,需要四分钟给一个储油罐加满油,一个加油站有十个油泵每天运行十八个小时…”他们也可能试着从占地面积来估计。
不聪明的应试者则被难住了。他们目瞪口呆地望着面试官,好像你他来自火星。所以面试官很无奈地不得不提示:“嗯,如果你想建立一个象上海那么大的城市,你需要建立多少个加油站?”你还可以提示他们:“加满一个储油罐要多长时间?”不过,这些榆木疙瘩脑袋还是只会坐在那里发呆,面试官得拖着他们往前走才行。这类人不会解决问题,软件公司可不要这样的人。
编程问题
关于编程问题,面试官通常要求应试者用C语言写一些小函数。以下是他们通常会出的题目:
将一个字符串逆序
将一个链表(linked list)逆序
计算一个字节(byte)里有多少bit被置1
搜索给定的字节(byte)
在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的
字符串转换成整数
整数转换成字符串(这个问题很不错,因为应试者要用到堆栈或者strev函数)
注意,通常面试官们不会希望他们写的代码多于5行,因为没有时间理解太长的代码。
现在我们来详细看一看其中几个问题: 第一个问题: 逆序一个字符串。我这辈子还没有见过那个面试者能把这题目一次做对。所有的应试者都试图动态生成缓冲区,然后将逆序的字符串输出到该缓冲区中。问题的关键在于,谁负责分配这个缓冲区?谁又负责释放那个缓冲区?通过这个问题,我发现了一个有趣的事实,就是大多数认为自己懂C的人实际上不理解指针和内存的概念。他们就是不明白。这真叫人吃惊,无法想象这种人也能做程序员。但他们真的就是!这个问题可以从多个角度判断应试者:
他们的函数运行快吗?看一下他们多少此调用了strlen函数。我曾经看到应试者写的strrev的算法竟然只有O的效率,而标准的算法效率应该是O,效率如此底下的原因是因为他们在循环中一次又一次调用strlen函数。
他们使用指针运算吗(译者按:原文为pointer arithmetic,指的是加减指针变量的值)?使用指针运算是个好现象。许多所谓的“C程序员”竟然不知道如何使用指针运算(pointer arithmetic)。当然,我在前文说过我不会因为应试者不掌握一种特定的技巧而拒绝他。但是,理解C语言中的指针不是一种技巧,而是一种与生俱来的才能。每年一所大学要招进200多个计算机系的新生,所有这些小孩子4岁就开始用BASIC语言在Atari 800s写冒险游戏了。在大学里他们还学Pascal语言,学得也很棒。直到有一天他们的教授讲了指针的概念,突然,他们开始搞不懂了。他们就是不能再理解C语言中的任何东西了。于是90%的计算机系学生转系去学政治学。为了挽回面子,他们告诉朋友,他们之所以转系是因为他们计算机系英俊貌美的异性太少。许多人注定脑子里就没有理解指针的那根弦。所以说理解指针是一种与生俱来的品质,而不是一种单纯的技巧。理解指针需要脑子转好几个弯,某些人天生不擅长转这几个弯。
第三个问题可以考考面试者对C的位运算的掌握,但这是一种技巧,不是一种品质,所以面试官在这里可以帮助他们。有趣的等他们建立了一个子函数用来计算byte中为1的位的数目,然后面试官会要求应试者优化这个子函数,尽量加快这个函数的运行速度。聪明的应试者会使用查表算法(毕竟这个表只有 256个元素,用不了多少内存),整个表只需要建立一次。跟聪明的应试者讨论一下提高时间/空间效率的不同策略是十分有意思的事情. 进一步告诉他们你不想在程序启动时初始化查询表。聪明的面试者可能会建议使用缓冲机制,对于一个特定的byte,只有在第一次被查询时进行计算,然后计算结果会被放入查询表。这样以后再被查询时直接查表就行了。而特别特别聪明的面试这会尝试有没有建立查询表的捷径,如一个byte和它的置1的bit数之间有没有规律可循?
不可避免的,面试官会在应试者的程序中发现bug,于是我们现在来到了第五个问题:你对代码满意吗? 我们知道所有的程序员都会犯错误,这不是问题。但他们必须能找到错误。对于字符串操作的函数,他们通常会忘记在输出缓冲区加上字符串结束符。所有的函数,他们都会犯off-by-one错误(译者按:指的是某个变量的最大值和最小值可能会和正常值差1)。他们会忘掉正常的C语句结尾的分号。如果输入是零长度字符串,他们的函数会运行错误。如果malloc调用失败而他们没有为此写好错误处理代码,程序会崩溃。一次就能把所有事情做对的程序员非常,非常,非常地少.不过要是真的碰上一个的话, 提问就更有意思了. 你说,"还有Bug"。他们会再仔细地检查一遍代码。这个时候, 观察一下他们内心是否开始动摇了, 只是表面上勉强坚持说代码没有问题。总之,在程序员写完代码后,问一下他们是否对代码满意是个好主意。
设计的问题
关于设计的问题。让应试者设计某样东西。Jabe Blumenthal,Excel的原始设计者,喜欢让应试者设计房子。Jabe说,曾经有一个应试者跑到白板前,画了一个方块,这就是他的全部设计。天哪,一个方块!立刻拒绝这样的家伙。你喜欢问什么样的设计问题?
好的程序员会问更多的信息。房子为谁造的?软件公司的政策是,我们不会雇佣那些在设计前不问为谁设计的人。通常,我会很烦恼我得打断他们的设计,说“事实上,你忘记问这个房子是给谁设计的了。这个房子是给一群长颈鹿造的。”
笨笨的应试者认为设计就像画画,你想画什么就画什么。聪明的应试者明白设计的过程是一系列艰难的权衡。一个很棒的设计问题是:设计一个放在街角的垃圾箱。想一想你得做多少权衡!垃圾箱必须易于清空,但是很难被偷走;易于放进垃圾,但是碰到狂风大作,里面的垃圾不会被吹出来;垃圾箱必须坚固而便宜。在某些城市,垃圾箱必须特别设计,以防恐怖分子在里面藏一个定时炸弹。
有创造力的应试者会给出有趣而独特的设计。我最喜欢的问题之一是为盲人设计一个放调味品的架子,通常许多应试者的建议是把布莱叶文(一种盲人使用的文字)刻在放调料的罐子上,这样文字会卷起来而变形。我碰到一个应试者,他的设计是把调料放在抽屉里,因为他觉得水平地感知布莱叶文比垂直地做更方便。(试试看!)这个答案这样有创意,使我震惊!我面试了有一打得程序员,从来没有人想到过类似的答案。这样有创意的答案确实跃过了普通人考虑问题的条条框框。仅仅因为这个答案太有创意了,而且应试者别的方面还过得去,我雇佣了这个应试者,他现在已经成为Excel团队中一个优秀的项目经理了。
总是争取一个确定的了结。这也是完成工作的特质的一部分。有时候应试者会犹犹豫豫不能作出一个决定,试图回避困难的问题,留着困难的问题不作决定就直接向下进行,这很不好。好的应试者有一种推动事情自然地前进的倾向,即使你有意把他们拖回来。如果关于某个话题的讨论开始原地打转变得没有意义了,好的应试者会说,“嗯,我们可以整天谈论这个,但是我们得做点什么。为什么我们不开始…”
挑战
于是我们来到了下个部分,挑战。这部分很好玩。在面试中留心一下, 当面试者的回答绝对的百分之百毫无争议时, 你可以说: “ 嗯, 等一下等一下.” 然后花上两分钟玩一下魔鬼代言人的游戏(devil’s advocate,魔鬼代言人指的是违背自己的良知,为错误邪恶的观点辩护). 记住一定要在你可以肯定他正确时和他争论。
这个很有意思.
软弱的应试者会屈服。那面试官就只能和他说拜拜了。
坚定的应试者会找到一个办法说服你。他们会以坚定的口才来说服你,“也许我误会了你的意思,”他们这样开头,但是正文仍是坚定地站稳立场。这样的人我就雇佣。
不得不承认,面试双方的地位并不是平等的。有可能应试者由于害怕你的权力而不敢于你争辩。但是,好的应试者有足够的热情和勇气坚持正确的观点,他们由于热切希望说服你而会暂时忘记正在被面试。这样的人就是我们要雇佣的人。
最后,面试官会问一下应试者有什么想问的。一些人喜欢看看应试者这时是否会问一些聪明的问题。这是市面上流行的面试书籍的标准技巧。我个人不在乎应试者问什么,因为这时我已经做了决定。麻烦在于,应试者也许已经见了5、6个人,进行了好几轮面试,他们可能很累了,以至于不能为每轮面试都准备一个聪明而独特的问题。所以如果他们没有可问的,没关系。
如果觉得《我们需要什么?——IT公司面试官经验谈》对你有帮助,请点赞、收藏,并留下你的观点哦!