我是一名大三学生,因为这几天有企业来学校招聘,所以今天,不对,应该是昨天(2011.5.26)下午从14:00-19:00一直在两边的面试中周转着。这是我人生的头2次面试,全部集中在同一天的下午(因为两个企业安排的面试在同一个时间段),全部是如此的悲催,但也让我因此想明白了一些东西,在此写出来,作为一种纪念也好,一种总结也罢,希望对己对人都能起到一点点帮助也就达到了本文的目的了。
面试的第一家企业是花旗(一家银行公司,大家可以百度下),从2:00-3:00一直听着花旗高管激情澎湃的宣讲,总的来说就是三点:
一、花旗很有钱,业务遍布全球;二、花旗员工待遇和发展都不错;三、欢迎你来花旗。
接下来3:00开始面试,由于我们大部分是大三学生,所以全部是找实习(Internship)。总共有大概64个人提交了简历,所以面试被安排为8场,每场面试8个人,一组一组去面试。我被分在了第二组,在第一个小组面试期间,我顺便去第二家公司—上海华腾公司(大家可以百度下,貌似不咋样)招聘现场参加笔试,匆匆忙忙地在半个小时内解决了笔试(因为试卷实在很水),然后又回到了花旗公司招聘现场等待面试。大概半个小时后,终于轮到第二组面试,我们一行8个人被叫到那个教室,开始进行的是群面,相信有过面试经验的人肯定知道这种形式的面试,我以前虽然听过,但是这次真正遇到了也有点小吃惊。
群面的题目是:假如要你设计一个银行系统,你会怎么设计?从你擅长的部分考虑,比如你擅长数据库,那你可以从数据库设计方面阐述。可以单独(Solo)思考,也可以几个人一起讨论,不限人数。时间10分钟。
我当时一听,心想好歹也听说过群面,这个群面考察之一应该是所谓的团队合作能力(Teamwork)和交流能力(Communication Skill),所以肯定不能独自一人思考。所以当即和另外3人组成讨论组,开始讨论。首先四个人稍微分了下工,一个人负责讲界面,一个人负责讲数据库设计,一个人负责讲服务端设计,一个人负责讲测试。我讲的是服务端设计。然后大家达成一致:大致将银行业务分为存款、取款、转账、查询四项。接下来就由负责界面的同学阐述他的观点。很简要的将界面分为登录界面、存取款界面、转账界面和查询界面以及各个界面的大致用户场景。然后就是我讲服务端了,当时可能是对问题比较困惑(其实现在也不是很清楚),所以就简要的说:一、必须采用分层架构,分为数据访问层和业务逻辑抽象层,因为业务逻辑是经常变动的,所以不能和数据访问层混在一起;二、考虑银行业务要求的安全性,服务端不能直接对数据库操作,必须借助视图来间接对数据库操作;三、必须配置冗余服务器,且冗余服务器必须与正常服务器保持数据一致性,在工作服务器崩溃时,马上启用冗余服务器;四、为了应对可能出现的访问高峰情况,如节假日、黄金周等时间段的高并发访问,我觉得应该先对过去几年的业务数据作分析,然后根据分析得到的曲线,得出业务高峰出现的时间段,然后针对这些时间段(高峰期)相应增加服务器来保证吞吐量。再接下来就是负责数据库的同学讲了下分几张表,各自保存的字段情况。最后就是负责测试的同学简要说了几句。然后10分钟时间就到了。整个讨论过程面试官都在旁边观察的,并用笔在记录着什么。
接下来就是8个人轮流将刚刚的讨论陈述,当然是陈述各自负责的部分。此处我觉得最大的悲剧就在与我只局限于陈述自己的观点,而没有顾及其他人的观点,我一上来就直接讲我那部分,讲完为止。我现在想想其实我应该先总结下前面讨论的大概情况,至少必须粗略讲下前面的讨论流程,这样面试官就会认为你有Teamwork,因为你会为其他人考虑(我自己的揣测,人心很微妙,面试官的心也一样)。8个人每人一分钟的陈述很快结束了。接下来面试官用英文说了一段话,大概就是问我们对自己的未来发展抱什么看法。一听问题用英文问的,自然明白也必须用英文作答,当时又是一愣,心想:我的天哪,偏偏平时不太注重英语,一直吃着高中的底子,虽然四六级都过了(四级625,六级567),但是口语和听力却一直是自己的软肋。于是乎我问了个我迄今都觉得愚蠢至极的问题(希望各位看在我这么坦诚的份上不要笑我),"Can I speak it in Chinese?",然后面试官用很坚决的语气说不可以。我当时就郁闷了。又过了半晌,终于有人带头发言了,具体内容也记不太清了。然后我是第二个发言的,支支吾吾地说我对软件架构设计这方面比较感兴趣,而且我认为一个优秀的架构师同时也必须精通一门或多门编程语言,然后就讲我对Java相对熟悉,而Java是一门非常powerful的语言。然后本来还想说因为Java是开源的,而且有众多的开发者、中间件、优秀API支持。Java正变得越来越流行了。无奈当时一紧张,一结巴,就没词了,只好说了句"That's all!"。现在想想都汗。接下来另外一个同学的发言我认为就更加是触犯了招聘公司的禁忌了。他说他想在公司做几年,积累点资金,然后自己创业。很明显这样的回答会让面试官很不爽。再接下来就是其他几位同学的英文陈述了,因为记不太清此处略过不表了。
最后面试官提了个很常见的问题:讲下Servlet的生命周期?当然也是自由发言。于是有一个同学就讲了下Servlet主要有init方法,blabla,然后又说JSP其实也必须转换为Servlet再执行。其实我当时也在揣摩面试官这个问题的意图?我心想:Servlet不就是init、doService,doService中调用doGet、doPost、doHeader等方法,最后调用destory方法结束整个生命周期。另外Servlet在第一次被调用时才会被转换为字节码文件,此后如果再被调用的话就直接调用不用再转换。这样某种程度上Servlet具备高性能的特点。当然我那个时候还忘了Servlet的单线程、多线程问题。其实我面试前几天一直在写Servlet、JSP方面的练习(因为今年有一门J2EE的课程)。不过因为之前那位同学提到了,也就不好意思重复了。(不过至今我觉得这个问题问得没什么水平,虽然再问深点难点我肯定一句话也不知道说了)
然后第一轮面试就结束了,我们到外面等了大概3分钟的样子,面试官就出来宣布通过一面通过的人,有3个人通过了,我属于被淘汰的5个人之一。好在我还比较达观(略带了点体验的意思来面试),也没做过多停留,就跑去华腾招聘现场了。
那个时候大概5:30的样子,那边已经在进行面试了(前提是参加了笔试)。参加面试的有其他学校的,也有其他院系的,当然也有大四学生和研究生。等到6:30的时候,终于轮到我了,我被叫进去。面试官叫我坐在他对面,最先他叫我介绍下自己,这个我回答的很失败,虽然这个问题很老套,我简单地自报家门,然后说我对Java很感兴趣,然后就没话了。面试官看我没话就对着我的简历上的项目经历栏目一项项边看边问了。他首先叫我“解释下MVC架构”,然后我就说MVC是一种分层架构,主要是为了系统的可维护性和扩展性,本来我还想继续阐述下MVC的M、V、C之间相互关系的。面试官打断我的话问我“MVC和Servlet有什么关系?”我当时又是一愣,心想“这不是坑爹么,MVC是体系架构,Servlet是一种技术,完全不同概念啊,有毛关系啊?”所以也就照心里想的说了。后来我想他可能是希望我这样答:MVC的控制模块可以通过Servlet实现。(不过这不是很自然的事情,这个也要说?那C也可以实现面向对象,难道C的特点里也要带上OO。这只是我的心中所想,其实是面试中的一个忌讳,后面会总结)。
再然后他就问我application和request的区别(也许是因为我的简历上的项目经历大都是基于Java SE,而对Java Web开发方面只是说了解,所以整个面试过程基本全问这方面的问题,其实我是多么希望他问几个Java SE方面的问题,囧)。因为之前做的练习中都基本使用request对象,基本没用过application对象,虽然记得它们都是JSP页面的隐含对象)。所以大概就说了下application对象是针对整个Web应用,而request则默认是针对当前page和负责处理他的JSP页面或Servlet(当然也可以设置request的scope,注意括号中的全部是我的心中所想,没有在现场说出来)。回顾了下,我觉得这个问题我不应该回答得太匆忙太草率,应该先给自己10秒-20秒的时间思考和组织语言(因为面试官出的问题都很基础,所以基本每个问题都是一问完马上作答,但是基本都是两三句就结束,然后欲言又止,不知道如何继续),平时思考的时候我们可以天马行空,但是面试的时候你必须保证思想的清晰流畅,因为你要把你的思想传达给面试官,让他知道你不但有这个能力,而且能够表达出来,而含含糊糊或者混乱组织的语言或许说中的内容相同,面试官也会认为你基础不牢或者是猜的,或者甚至认为你逻辑能力差,我想我这个亏是吃大发了。
接下来他又继续问我一个Java Web方面的问题:如何统计一个网站的访问人数。我当时一听就立即答道:“我会使用监听器来实现,因为以前一个作业中实现过相似功能统计在线人数和游客数,采用的是定义一个Servlet实现HttpSessionListener接口,....”。不过还未待我说完,面试官又问是否可以用application对象来实现。我当时没听清楚,问了面试官几次,才隐约搞懂了,不过最后这个问题也不了了之了。现在想想这个问题告诉我至少2个道理,一是注意揣摩面试官的言外之意,比如这道题,面试官暗示是否可以用application对象来实现,可能的原因是面试官本人平常做这个功能时习惯用application来做,其实当然可以,application对象中设置一个count计数属性,只要服务器没有关闭,count属性就有效,每当用户访问一次count就增1,不过这个就不知道服务器关闭以后下次重启服务器count值还能否保留。另外当然也还可以用cookie来做,也是相当简单。其实我知道这么多方法,但是我只说了一个,而且不是面试官想让我说的那个,这虽然可惜但是也在情在理。如果我能稍微思考组织下,然后说:“这个至少可以用3种方法实现。首先,...其次,...,第三,....。那么结果会大不相同。
再然后他问我“BS和CS有何区别?”我又一次很急地回答。CS是服务器客户端架构,而BS是服务器浏览器架构,CS的客户端又称为胖客户端,因为很多业务逻辑会放在客户端处理。而BS的客户端是浏览器,是瘦客户端,因为大部分逻辑都在服务器端处理。然后就没有然后了。面试官看我没什么说的了也不好说什么。其实这个问题如果我稍微考虑下,组织下我的语言,我完全可以这样说:从名词解释上看,CS是服务器客户端,BS是浏览器服务器,但是浏览器本质上也是客户端;从客户端承担的职责来看,CS客户端是胖客户端,BS客户端是瘦客户端,因为CS客户端要处理相当一部分的业务逻辑,而BS的业务逻辑出来基本全在服务端,从这点上看BS架构比CS架构安全性高点,因为BS架构业务逻辑封装完全在服务端;从用户角度看,CS架构应用的升级比较麻烦,可能必须更新和替换整个程序,而BS应用的更新和升级则非常方便,只需要服务端更改,客户端使用相同的URL就可以访问升级过的应用(一般URL不变的,SEO考虑,心里话)。
问完上面那个问题,他终于不再纠缠那些Java Web细节了,开始问我一个数据库SQL相关问题,可能是看到我简历上写着大二有一个项目专门负责数据库CURD模块吧!题目是这样的:有2张表,A和B,A中有4条记录,B中有3条记录,且B中有一个对A中字段引用的外键。问A和B连接,结果集的记录条数?
这个问题我没有立刻回答。想了5秒左右,我问了句”你这里的连接是指外连接还是内连接?”面试官一愣(我当时想估计他不知道内连接和外连接,现在想想也有可能)。然后他答道:”左连接吧。”明显的答非所问,不过我也没有顺着他的话答,而是回答:“如果是外连接,那么记录条数就等于笛卡尔积结果的记录行数12条;如果是内连接的话,就等于3条。”其实我是正确的,因为最近一段时间抽空专门研究了下Oreilly出版的SQL语言基础,所以对这段还是挺熟悉的。虽然MySQL表之间的连接默认是内连接,但是也可以指定为外连接(outer join)。如果是外连接,是不考虑表与表之间字段约束关系的,结果集中记录可以重复。而内连接则必须考虑。这个问题也给了我2点体会。一、面试官可能对你所讲的东西不熟悉,因为每个人都不可能对每一门都精通。可能面试官无意提到数据库SQL方面的问题,而你对SQL颇感兴趣,称得上SQL专家,然后你非常全面非常严谨地从各个角度回答了这个问题,然后面试官可能一脸茫然,当然因为他不知道,所以他不会再深问下去,但是他可能会认为你在瞎扯。这时我们该怎么办呢?我觉得应该娓娓道来整个问题的前因后果,先给出结果。然后阐述原因。然后如果看到面试官发愣的表情,就得稍微解释下概念了。这样也能显示你在这块的功底,至少是超过了面试官预期的标准,而不会被冤枉地认为在胡扯。二、即使一个问题不能完全答出来,也可以给出你的思考过程,能解决部分问题也是好的。关键是思路要清晰。
这之后就是面试官给我机会问他几个问题了。总体觉得这位面试官还不错,眼神挺温和,所以面试过程基本没压力,想到什么就说什么,不知道的也不乱说。然后这悲催的人生头2次面试经历就结束了。第一家花旗是果断没戏,不过也至少见识了传说中的“群面”和“英文作答面试”。从面试官角度看群面的一篇文章见http://bbs.yingjiesheng.com/viewthread.php?tid=122267。第二家公司还不知道结果,可能也没戏。不过我也不想计较这么多了,5个小时的折腾换来这些实战经验,值了。
下面分条总结概括:
① 群面时注重与他人的合作交流,群面总结时稍微陈述整个讨论过程。这样显得你比较考虑别人的感受,更加有teamwork精神。
② 踊跃点,但是不要太强势,注意给别人留发言机会。这点在自由发言期间非常重要,也许大家都知道一个问题的答案,但是别人抢先说了,那么无疑你就稍微占了点劣势。不过也不要太激动,面试机会满世界都是,犯不着为了一次面试伤了和气。正所谓“留得青山在,不怕没柴烧”。
③ 默认知识也要讲出来。不要以为一些你认为很常识的东西就没必要讲出来,可能面试官要的就是你回答这些常识性东西。因为这些常识性东西能体现你的基础。
④ 回答问题前思考和组织你的语言,时间20-30秒为宜。如果是很难的问题,可能面试官会明确说给你多长时间,或者你自己根据情况思考,我想面试过程必要的思考时间面试官还是舍得给的。回答按点,力求清晰。
⑤ 给每个问题的答案都尽量给出你的理由和思考过程,即使你不能够完全解决这个问题。
⑥ 在面试官对你回答的某些东西不熟悉的情况下,耐心解释下概念(当然如果面试官非常固执和刚愎自用,那就不管用了)。
⑦ 表达要清晰,紧张或许不可避免,但是尽量保持吐字清晰,面试前充足休息也是必须的。这点我就吃亏了,中午玩了一个中午的游戏,下午折腾了4个多小时,然后再去面试头脑昏昏沉沉的。
⑧ 学好英语,尤其是口语。现在一般的公司笔试题都是英文的。有的公司还要求英文口语面试。这点我得吸取教训,要开口说了,而不能只知道阅读和写。
⑨ 最后关于简历上的项目经历说几点,尽量保持简洁真实。你会说如果要真实可能没啥内容可写,那就开始做项目吧,否则面试过程也会原形毕露的。另外最好对某个方向的大范围技术都有所涉猎。比如我的简历上关于Java Web方面提的很少,所以面试官就一直问这方面的问题,的确有点痛苦。好在我也不是一无所知,而且也扎扎实实地练过一些,所以没出太大洋相。面试官可能对你有些内容一点都不关心,比如我简历上还写我非常关注软件设计和软件工程管理,我完整阅读过《人月神话》,阅读过部分《代码大全》、《设计模式》、《修改代码的艺术》等等(真实的),但是面试官却对此只字不提,这也不是我能掌控的。
不管结果如何,至少我努力过而且还在继续努力中,虽然我知道我的目标离我还很遥远,但是只要奋斗即有可能。希望大家都能从这篇拙文中获得点帮助。
最后第二家公司给了offer,七月份可以去实习。