原文在博客园链接:http://www.cnblogs.com/DesignPatterns/archive/2007/07/15/interview.html
前两天跟着项目经理参加了一个面试。虽然不是第一次参加面试,但是还是有点紧张:)
我觉得我们面试的题目已经基本的不能再基本了,但是还是找不到一个合适的人。现在真的成了一种普遍的困境,很多人找不到满意的工作,很多公司找不到满意的人。
闲话不多说了,说说我们的几个题目吧。同时也说说对即将参加面试的兄弟的建议,从一个面试者的角度。
第一个题目:自我介绍。
自我介绍,几乎是每个面试的必备的题目(99%以上)吧。但是,我仍然遇到非常多的人连这个题目都“不准备”。我说的是“不准备”,而不是“准备的不好”。这个题目要准备的出色,是比较难的。我们是外企,我知道很少参加外企面试的兄弟参加外语会紧张,特别是刚开始。所以会出现这样的开头:“Thank you for giving me this oppertunity. It's my honor to talk with you. The following is my self-introduce”。没关系,面试官会理解你,但是,你要背熟,至少要背完。我遇到过好几个连自我介绍都没有背完的,你说怎么会有心情继续!
通常,很难靠自我介绍给你加多少分。但是自我介绍给你减分却非常快,快得出乎你的意料。第一,如果自我介绍没有准备充分,说明你对面试不够重视,当然面试官也会觉得自己不受重视;第二,如果自我介绍没有条理,说明你的总结能力不够;第三,如果自我介绍和简历里面有哪怕一点点的冲突,说明你的人品有问题,不够成熟,或者不够细心。一般来说,说明自己的姓名,年龄,工作年限。再说一下上一家公司就职期间的一两个项目就好了。项目这块是重点,不要云山雾罩,如果你里面有太多的术语,面试官多半是不了解的,除非你们在一个非常相近的领域。说的越简单易懂越好。
第二个题目:你最近在读什么书?或者你毕业后都读过哪些书?
这个是很难作弊的题目。你读过什么就说什么,千万别吹嘘,而且向金瓶梅这类的书就算了。如果真的没读过也就说没读过好了,如果读得一知半解,自己衡量,碰上面试官读过那本书可能会以为你不诚实,或者至少自学能力差。人文类的书也可以说,但是只提一句,看面试官的表情再说。如果面试官一脸茫然,见好就收,不要企图用这个时间向面试官灌输你关于文艺复兴的认识。多说一些经典的书,当然前提是你要多看书。或者你实在没看过什么书,也可以说经常上的网站和论坛或者邮件列表。CSDN这个年头最好不要重点提,因为大抵专心做事的没有多少时间泡在上面。
第三个题目:你认为OO和面向过程的区别是什么?(OO有哪些特点?)进而,多态是什么意思?能不能写一段代码展示一下多态?
这个题目的关于多态的部分是我们项目经理的保留题目,所以别人跟他一起面试通常会跳过这个题目。或者问完了OO的特点,就转过身用期望的眼神看着他?他也就知道该自己了:)。这个问题很基本,OO的特点基本上都能回答上来。至于和面向过程的区别,却比较难回答,但也很难出错:)仁者见仁,智者见智。
多态,我觉得是OO里面一个很基本的概念了,从某种程度上过去我们有些过于强调多态和继承,甚至有说法说理解了多态就理解了OO。写代码的部分,能完全没有错误的很少。不过也减不了多少分,但是要是完全没有体现多态就不好了。
到此为止基本上是个分水岭,如果前三个问题答得好,后面多半不会为难你了。如果答得特别不好,后面的也不会为难你了。
第四个题目:你最熟悉的设计模式是什么?能不能随便找其中一个画个类图或者序列图或者协作图?
这个题目我几乎每个面试都可以问。因为几乎每个人的简历里面都回写上“熟悉OOD”,后面紧跟着“和设计模式”,下一条则是熟悉UML。对于大多数人,所谓的熟悉设计模式不过是Factory(而且是简单工厂,而不是GOF所说的工厂方法或者抽象工厂)、Singleton(千刀万剐的设计模式,被最广泛误用的模式之一)、Observer(因为jdk里面有Observer和listener)、MVC(好有名啊,但是你问到C的几种用法和适用情况就傻眼了,所以我也几乎从来不问)、Visitor(不知道为什么这个也这么出名)。
画类图,绝对不是要求背过GOF的书上的原图。只要差不多能反映模式的含义即可,因为我也记不清楚那么多经典图。顺便会问一下这个图里面的几个箭头表示什么。以经常被选中的Factory为例,要能看出返回的是接口(不管是那种工厂模式,除了简单工厂)。
第五个题目:OO的设计原则能说上几个?随便找其中一个说说。
这个题目用的比较少,一般是前三个题目答的比较好,所以有兴趣继续聊聊稍微深入的话题。或者前面的问题时间太短,用来占用时间:)OO的设计原则有很多,也不要求局限于bob列出的OCP、DIP、SRP等等。像什么面向接口编程啊、封装变化啊等等都可以说。可是就这样能列出一两个的很少,能进一步说两句的就更少了。
说了半天,我希望这是我们公司遇到的特殊情况。如果国内的程序员真的这么不禁面,实在是一个不好的事情。我曾经跟国外的一个实习生一起做一个项目,他所表现出来的素质比我不知道高多少。我们公司虽然在软件行业没有什么名气,但是开发实力在全球还是很靠前的。公司正在把很多的开发移到中国来,但是从我们的面试情况看却很不乐观。
我在软件行业也是一个新手,谁让咱们这个行业吃青春饭呢。建议大家多看书,现在的气氛仿佛过于重实践、轻理论了。要勇于深究理论,理论联系实践。
与大家、与自己共勉。
------------------------------------------------------
我一般都会按照candidate的兴趣来提问题。比如简历里写精通oo,那我们就聊聊oo;写了设计模式,就聊聊设计模式;写爱学习爱读书,就聊聊最近读了什么书。很多人被我pass掉的原因,是他说自己喜欢某某、精通某某,结果根本就不是那么回事。自己喜欢的尚且如此,不喜欢的该怎么办?
------------------------------------------------------
非常不好的一种做法,为什么这么说呢?简历嘛,大家都知道,肯定是有水分的,而且人都有一种心理,明明知道这个人的简历很大的水分,还是想叫过来面试,所以,造就了现在的简历水分很多。根据简历上面所写的较真的去面试人,是否思路偏了一点。当然了有一种情况也许适合,就是公司在招专项人才,那我势必要在这个方向上问的清清楚楚。
另外,我还是那句话,你要知道你要招的什么人,比如我要招的是DBA,哪怕你在简历上说你Java多么厉害,或者怎么样,你只要在专业技能方面db上表现的让我们满意,为什么不要呢,难道一定要他java多好,ruby有多精通?个人觉得完全没必要。
--------------------------------------------------------------------
我也回两句:
漫天只见泛泛的反对和泛泛的赞成,我写这篇文字的目的是最后一句已经完全说明了"与大家、与自己共勉"。
有人说我们的题目全是背诵。我们可不是靠字符串匹配来判断答案是否正确的。在场的是几个有着几年开发经验的工程师,而不是电脑。
有人说现在泡沫行情,而且因此感到题目可笑。我觉得不是可笑是可悲,不过还好我们的面试正是要过滤掉这层泡沫。
至于设计模式是供在心里的说法我才觉得可笑,如果你连阿弥陀佛都不会念是当不好和尚的。
我们的基本策略倒是跟gigix有点相似,你说自己擅长什么才问什么。你说自己的简历有水分所以我就不能问了。我就彻底晕倒了。
总之我发现面试很难满足所有的人,所以首先要满足的是公司的需求。
以我们的项目,你不熟悉常用的设计模式,不要说开发,可能你连原来的代码都看不懂。所以这个我们通常是问的,但是对于应届的则会降低一些要求。
至于多态,我从来都认为这个是OO里面最基本的概念,如果这个完全搞不清楚,还是不要来面,省得浪费大家的时间。
---------------------------------------------------------------
兄弟,不说倒显示不出你的无知,看看你自己说的话,我就知道你没什么经验或者说根本就不知道怎么面试,我倒是觉得你没有过滤掉这层泡沫,而是已经在泡沫里出不来了。
首先我要说一点,不要把gigix扯上,他说的跟你说的根本就是两回事,如果你愿意,我可以把你们两个人的文章对比一下
另外,假设你和gigix的观点一样,你忽略了一点,你太高估现在的简历,想想你的简历是什么样子,现在谁的简历没有一点浮夸,至于你怎么在面试中去验证,这是另外的话题,你说你也是人家擅长什么问什么,那我请问你,你到底要招什么样的人呢?你招人去做ejb,那么我ejb很厉害,我同样说开源的一些东西我也厉害,你是不是一定让我在开源的东东上面说出的道道,我简历上还说我db厉害,你也要追问到底了,你面试就没有侧重点?你在面试之前有没有一定的准则,还是,面试每一个人都会从简历看到什么就追问下去?一个明显的逻辑混乱
最后,我很质疑你是否有这样的水平,在简历上看到什么就问什么,因为每个人都有自己擅长的东西。
--------------------------------------------------------
这是两部分。对于我当前招聘职位最感兴趣的部分,我会深入考核。同时,简历上写到的东西,我会大致了解。如果在简历里提到自己对什么感兴趣,但是连一个简单的、5分钟的交谈都不能进行下去,这反映出的不是能力问题,而是态度问题。我(以及我的公司)对于态度问题是看得很重的。
至于“在简历上看到什么就问什么”,这也分两部分。第一,我自信有这样的能力,并且提问所需的能力并不太高。比如有人说喜欢haskell和erlang,尽管我不了解这些,但我可以请他给我解释这两种语言的特点。第二,如果candidate在简历上写一些我完全没有概念的东西,我认为这样的简历也是有问题的。
最后,我自己的简历,我可以说,完全没有任何的浮夸,倒是为了突出重点而省略了很多东西。
------------------------------------------------
你完全没有概念的东西只能说明你的知识面没到,妄意的猜测别人人品是不好的,也许人家水平远在你之上,接触的东西比你更高级而已.我喜欢让别人说所有简历的东西,即使我不懂,这样对我自己来说也许可以学习新的东西,同时也可以看到候选人的潜力,如果学习能力强,很多东西是一教就会的.
--------------------------------------------------
这个……我工作相关的东西,我一定是了解的;我的公司业务相关的东西,我一定是了解的;candidate申请的职位相关的东西,我一定是了解的;软件行业里流行的、大家经常碰到的东西,我一定是了解的。那么如果一个candidate在简历里写上跟这几块都完全不搭界以至于我都没有概念的东西,那他写这个简历的时候是在想什么呢?他想通过这个简历传达什么呢?最起码,我会认为他没有针对当前申请的职位专门准备简历,换句话说他对这次应聘并没有表现得特别看重。
------------------------------------------------
这里说句公道话,楼主说了那么多观点,一直没有说清楚你们公司到底需要什么样子的人。事实上,招人的方式不应该是一成不变的,面试题也不应该是一成不变的。还是要根据公司的需要进行合理的准备和筛选。
楼主所提的这些面试题,可以考察一个人对待知识的一个学习能力和学习态度。从这点来说,这些题也已经足够考察一个人在某些方面的能力了。不过我认为,你的这些面试题还是缺乏了一些实践力,对于那些成天翻阅网上那些面试技巧的人来说,你这些题根本不是什么问题。但是这些人用来做项目,写代码,却是万万不够的。
现在有许多公司都需要一个人进入公司以后能够以最快的速度掌握公司目前的开发习惯和开发框架,然后上手干活,最好还是一个熟练工。这种情况下,面试应该更针对实际运用的技术多问一些,包括公司里面常用的开发框架,一些框架相关的实践知识等等。
不过还有另外一种公司,他们招的人最好是全能,啥都能干,不需要很精通,但是干上了以后,就能通过各种渠道去获取知识,并结合自己的知识解决问题。这种情况下招人就应该更注重理论知识,针对某些理论知识挖掘得深一点。
这就像剑宗和气宗,各有不同,不能一概而论,所以也没什么好吵的。
-----------------------------------------------------
简历的真实性是非常的重要的,我只以我的切身感受说话。在不久前,半年前吧,我又开始找工作,虽然雇主面试的次数并非太多,大多是中介的面试,但为数不多的几次雇主面试给我的印象都是:一条一条针对你简历里写的来问的。包括项目经验和你上面写的熟悉什么技术的,只要他敢兴趣的都会拿来问的。所以,简历里带水分只会让自己在面试过程中处于劣势。
---------------------------------------------------------
我找什么样的人我自己是清楚的,我找java工程师不会问太多的DBA的问题。至于你在简历上写善于论坛灌水,连面试机会都拿不到的。所以我关心的是简历上面跟要求相关的。我可没说过简历上看到什么就问什么,拜托看仔细。
至于拉上gigix,我觉得你真是很无聊(凑齐三无了:),是不是两回事也要gigix来说。
还说水分的问题?算了吧,没有诚信的人是不会找到工作的,至少在我这里诚信是最基本的条件。
跑步跑题?就更可笑了,帖子是我发的,这个。。。。似乎不是你能判断跑步跑题的。
跑题最远的我觉得就是你了:)
我发这篇文章的目的已经写清楚了“建议大家多看书,现在的气氛仿佛过于重实践、轻理论了。要勇于深究理论,理论联系实践”。
----------------------------------------------
部分同意楼上,的确,很多人会给很多公司投简历。
但是所投的职位无非就那么几个,web开发,企业开发,数据库管理,项目经理等等
可以针对这几个不同的职位写不同的简历,也许大部分东西都一样,但稍微侧重突出一下该职位的重点就可以了。
针对职位写简历而不是公司,当然特别好的公司还是有必要专门准备一份的。我想gigix也是这个意思
------------------------------------------------
经常看到花大把的时间讨论什么什么技术是否应该做面试题,讨论面试题多么多么变态...把这些时间拿来做学问,这点所谓的技术都可以学的很精通了。
OO?AOP?EJB?Spring?Ruby on Rails?AJAX?
上过大学有技术基础的人应该在5天内把上述任何一种所谓的“技术”都做到“熟悉”吧?
----------------------------------------------------
这个说法我很认同,其实这也是我们对于第三第四和第五个问题的切入点。
其实就什么是oo来说,楼主也承认是个见仁见智的问题。这样的问题,其实拿出来讨论,可控制性很差。而且技术人员往往都喜欢较真(不喜欢较真的我觉得也作不好技术),在这个问题上要是展开会很威胁。同时就GOF来说,我觉得就是一本参考手册,没有必要死记硬背。这个问题以前robbin也说过,就把GOF当一本速查手册好了。关键还是要看对方对具体的面向对象的原则有没有一个很好的认识。也就是说其实你们完全可以通过对第五个问题的讨论,对应聘者的OO认识作一个快速简便的认识。对于面向对象的概念和GOF来说,这些基本的原则要实际的多和好发挥的多。
实际上我想说的是,没有不禁面的应聘者,只有不会面的考官,更有不怎么样的公司。说了半天我又要说点敏捷,嘿嘿。其实强调交流,是强调双方的交流,而且是双方平等的交流。而在我看了绝大多数的开发工作,最后技术方面都不会成为问题,关键还是社会能力。而楼主的心态在我看来,有些高高在上。这样不是说不行,而是说如果你准备在一个组织中混,还是夹着尾巴一点好,并且要总是夹着点好。
下面说点关于gigix的方式。记得他还在CSDN的时候,我曾经在边上看到过一次他面试别人。我觉得他做得不错。但是对于他现在说的方法,我觉得大家也要注意。针对性的提出问题,应该以仅仅是能够作出判断为好,而不应该刨根问底的步步紧追。也就是要把气氛作的轻松,让应聘者能够感到惬意一点。当然这个时候也要显示考官的水准,毕竟代表了企业。也就是要双方都能显示出水准,并且能够让应聘者建立起对企业的技术人的能力认同。而一旦在某些方面产生了纠缠,最后就不会有好结果。所以联点到即止都不是那么必要。