毕业面试心程

毕业面试心程

 

20139月,伴随着秋季招聘号角的吹响,作为准应届毕业生的我踏上了从青岛到西安的校园招聘的征程。虽然心中踌躇满志,但是对于未来的结果却充满着不确定和未知。到我写下这篇文字,在西安这个城市已经驻留了近20天。期间参加过大型公司的宣讲,进行过数次笔试,尝试过霸笔,经历过数次面试,其中有困难和挫折,有惊喜和喜悦,有失望与落寞,有淡定与坦然,个中滋味,或许只有亲身经历过这些方能体会得到。

之所以写下这些文字,除了分享自己的心路历程,也希望借助于此在这个繁忙的工作季给大家分享一下自己的面试经验。我深知自己的文采登不上大雅之堂,那么我就结合着自己的面试过程和大家简单地聊一聊这段时间面过的几家公司(为了避免不必要的麻烦,公司全部采用化名)。无论是从专业知识的准备方面,还是心态的调整定位方面,希望这些内容对大家现在或者接下来的面试有所助益。

一、关于笔试

今年校招面试的第一家公司是国内著名的A公司,该公司这两年发展的很好,出手也很阔绰,待遇在国内当属一指,很自然的也引起大家的激烈竞争。不过该公司的招聘的门槛确实不低,据说在西安今年只招了几十人左右。面对这样出众的公司,人人都有跃跃欲试的想法,但是大浪淘沙。先说这家公司的笔试,由于短信系统的故障,导致很多人没有收到笔试通知,从而不可避免地产生了大量的“霸笔者”,我有幸也是其中之一。想想觉得十分有趣,第一次参加正规的校招笔试,没想到竟然是霸笔!其实笔试之前很多没收到短信通知的人都有一些焦虑,担心不能参加笔试,然而事实证明是:这个世界上大型IT公司的招聘,基本没有霸不了的笔!我也是从这次经验中学习到,原来霸笔是一件很有意思,略带娱乐性质的事情。

霸笔虽然简单,但是想通过笔试却并非人人都能做到。A公司的笔试题在目前国内大型IT公司里,题目质量属于上乘,已经和国外的知名IT的笔试题水平接近了。好的笔试题基本上能很客观地考察应试者的基本素质,比如逻辑思维能力、分析判断能力、数学功底、数据结构和算法、计算机基础知识、创新思维等。如果想顺利通过笔试,那么数据结构和算法的内容自然不能轻易放过,无论是本科时课堂上老师讲过的还是没讲过的,自己接触过的还是刚听说的,都尽力去弄清楚,尽量做到不要有疏漏。甚至有些关键的算法和数据结构要能把源码在脑海里背过最好,比如快速排序、归并排序、KMP算法、最短路径算法等,当然更多的是需要我们能熟练理解,并能灵活运用它的思想,比如堆排序、快慢指针、重要数据结构的增删查操作的实现等。数据结构和算法的题目在一般笔试题里占了将近一半以上的内容,因此是重中之重!

除了数据结构和算法,笔试题其他所涉及的内容基本上要看公司性质了,不过一般局限于操作系统、编译原理、网络原理和数据库,有时会穿插一点软件工程和设计模式的内容。其中操作系统是这里边考察最多,一般局限于进程同步、进程通信、页面置换算法这几个点,有时会涉及体系结构的内容,比如分布式体系结构等。由于我本身就是编译方向的,因此编译原理的内容基本不需要复习。非该方向的主要关注于正则表达式和基本的文法规则即可,文法分析算法一般不会涉及。网络原理和数据库的内容我没有系统复习,所幸的是笔试也很少遇到这类的问题,这会随着公司的不同也业务性质会有差异,如果时间充裕还是简单复习一下最好(一次笔试时让选择IP是哪类地址都选不好了,实在悲催!)。软件工程考察点基本上在设计模式上,只要把三类设计模式大致意思弄明白,不要忘了就可以了,有时程序设计题可能用得着。

对于笔试,如果复习的足够充分,相信通过笔试并非难事。如果场场笔试都能顺利通过的话,相信这是对面试者自信心的很大的鼓励(我一共参加了6场笔试,全部顺利通过,此处勿拍~)。但是即使没有通过也不要灰心,弄清笔试考察中自己虚弱的方面,回去好好复习,绝不要在下次笔试时犯同样的错误了,让自己在每次笔试之后变得更强才是参加笔试根本目的!当然我们也要考虑运气的成分,如果自己非常想去的一家公司没给自己面试通知,而自我感觉能力还可以的话,那么我强烈推荐你“霸面”,笔试本质上是海选,好的公司是会不拘一格降人才的!

二、处女面

不管是霸笔获得了面试资格,还是正常笔试进入了面试,亦或是霸笔参加面试,绝大多数人都会面临处女面的问题。提前声明下,我的处女面是典型的失败案例,想看处女面成功案例的,请绕行~不过正是因为处女面的失败,才让我认识到,怎么样面试才是真正的面试,才是正确的面试。A公司是我第一家面试的公司,前边说过A公司的情况,我个人对A公司的期望值是很高的。但是世事总是无常,很多情况下过高的期望只会带来更多的失望!一般情况,当一个人特别想去一个公司的时候,很容易进入焦虑的状态,担心出这样那样的问题,担心不可能出现的问题,从而导致自己的精力全部消耗在空想上,而非关注于具体事物的准备上。看看博主在处女面犯了什么样的错误吧!

由于我是做操作系统和编译器方向的,而A公司对该方面人才的要求也很高,因此第一个问题就是要我描述Linux内核的进程调度算法。事实上,我只是读过内核关于功耗相关的代码,对内核本身的代码没有过多涉及,这个问题严格意义上讲是超出我的源码阅读范围的。但是我当时犯得最大的错误是向面试官解释这些问题,但是客观上解释对回答这个问题有害无益!面试官需要你给他一个答案,答案的好坏会根据你叙述的程度进行评价,而多余的解释只会让面试官觉得你对这个问题完全不懂!——其实你是本可以说出不少有价值的内容的。面对这个问题,合适的反应是正面地回答这个问题,不要做额外的无意义的解释,而是描述内核进程调度算法的基本思想和过程。虽然后来我要求面试官让我重新回答了这个问题,但是我即使按照上边讲的给出了答案,面试官仍然不会觉得满意,他会反而提出更高的要求,指出你的答案过于理论化,没有给出具体内核代码的细节——比如变量名和结构体名等,为什么?——因为前边多余的解释给他留下了不好的印象,他已经潜意识里认为你在这方面不行了!再加上A公司本身做了很多开源的工作,他们非常关心做OS的人是否给内核提交过patch,很可惜我没有这方面的经历。所有的这些让面试官直接否定了我熟悉操作系统的特长!

既然操作系统被面试官认为不ok,那么编译器总可以吧?我自己做过编译器,应该算是很熟悉编译器了。不幸的是,面试官并非问我项目里如何实现编译器的内容,而是直接发问——你是否向gcc提交过patch?很抱歉,这点我也没有,我只是自己独立开发一套编译系统,并未在开源上工作。好吧,结果是面试官抛下一句话:如果你把自己关在屋子里十年造出一架飞机,你让我说你是牛还是不牛?!其实面到这里,我已经基本确定自己没戏了。因为面试官和面试者的气场完全不在一个维度上。虽然我一直申明自己只读过部分内核代码,但还是被要求用汇编实现spinlock,被问及非工业化编译器开发很少涉及的CPU乱序执行的问题。而我由于前边的追问和紧张情绪,再加上心里的巨大起伏,回答的效果都不太好,虽然事后想想其实可以回答得更好……面试A公司的结果可想而知——Failed

面试结束后我一直反思寻求失败的原因,等我想明白后才发现这次失败其实并非偶然!首先,是自我期望值过高。正所谓井底之蛙,不知天高地厚。如果不是过于把希望寄托于A公司,那么就不会太过于注重面试的结果,也就不会担心问题回答不够完美,这样想反而能让自己正常的发挥,有多少储备就有多少散发,面对问题积极回应,不做多余的解释,也就不会带给面试官负面的印象。其次,是虚荣心作祟。虚荣心是一个害人害己的东西,当一个人活在他人的眼光里的时候,就已经失败了。太在意自己失败了,太不愿意失败,太担心自己失败时别人异样的眼光。直接导致的是在被问到自己不熟悉的问题时顿觉压历山大,担心回答不好不能让面试官满意,丢掉难得的面试机会,嗯对,还有失败后别人的异样眼光!呵呵,其实整个过程都是自己在欺骗自己,因为自己都不知道在干什么——我是为自己找工作,而不是帮别人找工作!最后,是缺乏诚意。什么是诚意——别人提出的建议虚心接受,而不是佯装附和。话说人心隔肚皮,谁能知道我嘴上说的和心里想的一不一致呢?可是作为青涩的学生,在那些在公司历练多年的面试官面前,我们任何伪装的努力其实都是徒劳的!即使你表现的彬彬有礼,礼貌有加,而内心在暗骂面试官为何这么折磨我的时候,你要清楚,面试官对你的想法一清二楚!

想清楚这些后,让我知道在面试时不该做什么,相反也让我知道该怎么做更好。不管在你面前的面试官是来自牛企还是小型企业,他们都是我们潜在的雇主。在没拿到offer之前,谁也无法确定自己会一定到哪一家公司。把姿态放低,尊重对方但不崇拜对方,正面回答每一个问题,不刻意回避,不作无聊的解释,正常地发挥自我,面试就成功了一半!不要太在意面试的结果,因为招聘季机会太多了,多得允许你可以一直失败,但是总有一家会成功!耐得住寂寞,沉得住气,不问结果才会有更好的结果,不报任何期望才会更有希望!最后,记得微笑。有人说过,微笑是人家交往的润滑剂,面试时多微笑只有好处没有坏处,紧绷着脸只会让双方都觉得紧张不舒服,潜意识里留下不好的印象。虚心诚意地接受对方的意见,让面试官觉得你是个有胸怀有气量的人。

三、一波三折

话说好事多磨,古人实不吾欺也!经历了人生第一面的失败,让我认真地反省了自我。当我扭转了心态,摆正了态度,后边的面试大都异常的顺利。紧跟A公司面试之后的C公司在国内也是不错的公司,规模虽然排不到国内前列,但是待遇还算不错(虽然有潜在的大的工作压力),也是我第一次拿到offer的公司。这家公司的笔试题我不敢苟同,几道编程题,难度和C++期末考试相当。面试这家公司时,和一个年级大我不多的面试官聊了下自己的项目经历和专长。最后问了一个算术表达式求值的题目,让我描述了一下算法思想,很轻松的进了二面。二面HR是笔试时我那个考场(当时是霸笔)的监考,聊了聊最近的找工作的情况,还聊了之前的A公司。由于自我心态调整地很安然和淡定,所以就表现的非常随和容易接受。也就是昨天参加了C公司的offer答疑会,算是人生第一个offer

C公司二面结束后收到B公司的面试通知。B公司是国内大型IT公司之一,该公司对招聘者算法的要求比较高,从其笔试题内容可以略见一二。不过令人疑惑的是,该公司的研发的笔试题在难度上远低于系统岗位的题目。但是更令人无法接受的是B公司的笔试卷子太坑了,一道道题目都是挨着,根本没有答题的空隙,这种省钱法真心伤不起!B公司一面是技术面,问了一堆算法问题。由于我做过编译器,于是就让我写C++ class的文法(简化的)。要是搁在A公司的情况,我心里肯定会一哆嗦,因为我做的编译器没有支持面向对象。但是这又能怎样,我们需要正面地回答这个问题,因为问题已经出来了,你无法修改,况且还是自己擅长的呢!于是自己思考了几秒钟就顺利地写了下来。然后又被考察最短路径算法,要求写出伪代码。幸好前段时间用过这个算法,印象还可以,但是我明确告诉面试官没有背过代码,需要一点时间回忆,面试官说给半小时时间,我说足够了!然后顺利的是我只用了十分钟作用就把代码回忆并写了下来。后边面试官看我简历里写了对shell比较熟悉,就考察我用shell统计文件内每行第一个字母出现的频率。说实话,对shell还没达到很熟悉的地步,但是既然问了就回答吧。我的思路是使用grep循环查找abc……开头的文件行,然后分别统计行数,但是悲剧的是我把shellfor循环结构忘了,于是就半shell半伪代码的把结果给出来了。面试官对这个回答貌似不太满意,他给了一个命令组合就完成了该功能!最后被问到一个堆排序的问题,我很快给出了答案,并描述了算法的思想。面试结尾时,问我有什么问题没有,我请求面试官提出一些建议。结果被定位为知识面不够广——原因是对shell不够熟悉!这里的逻辑说实话到现在我也没搞清楚。虽然整体上感觉面试的过程还可以,但是面试官是个不苟言笑的人,很难猜测他的态度。最后就让回去等通知,然后,就没有然后了……

B公司面试结束后,紧接着是国内另一家大型IT公司T公司的面试。T公司的面试是我觉得最轻松的面试经历,比前边C公司的面试还要轻松那种!相比于B公司,T公司考察的内容更偏向于操作系统的内容。问了进程间通信有哪些形式,如何共享内存,磁盘为何有IO瓶颈,gdb的工作原理,操作系统的启动流程等问题。由于有前边多次的面试经验,回答这些问题时就不再那么紧张了,而是按照自己的知识结构和储备分别给出了自己的理解和正确的解释!T公司的一面的面试官是第一个问我个人博客的人,我当然不能放过这个展示自己的机会,对自己曾经写过的博客内容海侃了一番,还特别说明了我写过关于五线谱的博客,惹来了面试官的好奇心。很自然地一面非常顺利,从面试官的表情可以看出他比较满意。最后令我惊异的是他直接推荐我参加二面,实在是令我想象不到,我只能衷心地向他说句“谢谢你!”了。

T公司的二面时,面试官基本上就不问太多技术类的内容了,而是重点考察面试者的性格。他也是让我做了自我介绍和项目介绍,然后就开始问关于性格方面的问题,比如你最喜欢什么样的工作,最不喜欢什么样的工作,如果公司安排的工作你不太喜欢最久可以坚持多长时间,如果工作一直是自己不喜欢的你会怎么打算。这些问题没有标准答案,结果因人而异,不过我个人的性格属于外向不藏着掖着类型的,所以我回答的很干净利落,也很直接,从没拐弯抹角。最后二面面试官给我一个结论,说如果让我做发散性的工作,我的性格是加分的,反之则是减分的。不过公司接受有个性的人,但是有个性的前提是这个人技术能力必须达到一定程度。对于这个结论我深深赞同,他说会和一面面试官交流,看我的技术能力如何再做评价,然后我就可以回去等HR面通知了。不过依照前边的表现来看,结果应该不会太差,因为一面时要是技术被认为不好也不会被推荐直接二面的。

果然,第二天下午就收到了HR面的通知,当时还在C公司的offer答疑会上,我担心时间来不及,就回短信问是否可以将面试推迟2个小时,对方回答可以,这让我对T公司的感觉变得很好!还没等参加完C公司的答疑会,我就赶紧打车去参加T公司的HR面,匆忙赶到后就和HR开始了。不过HR上来就直接告知我说来到HR面的话基本上offer90%定下来了,他的意思是让我不要有压力。后边就问了一下家庭成员的情况,工作地点,薪资的要求。当然中间要我介绍自己最满意的项目,要求从动机、风险、困难、结果的顺序描述,我就把自己做的编译器的过程和他狂侃了一通,最后就顺利完成了HR面,等候offer通知就行了。说实话,得到T公司offer结果的时候,其实我自己也不清楚为何这么顺利,确实有点喜出望外!不过细想下来,和自己状态的及时调整有很大的关系。如果自己不是从第一次面试的惨痛教训中总结经验,吸收教训,可能后边会接二连三的碰壁,在这里,我真心感谢所有直接和间接帮助过我的人!

回顾这么多天的经历,可谓是一波三折。虽然一直告诫自己为了一个目标努力了6年,虽然知道应该会有好的结果,但是很多时候看似必然的事情都充满着不确定和随机性,因为找工作本身除了个人能力之外,还有很多运气成分,心态因素。虽然刚开始经历了失败,但是却是意义重大,能从失败中总结问题,发现原因,重新站起来面对新的挑战才是找工作过程中最重要的心态。无论何时,做到自信但不自负,不过分追求结果也不轻易放弃机会,注意每一个细节,放低姿态,保持自尊,这样才更有可能得到一个满意的结果,才是真正的给6年努力的自己一个合理的交代!

四、题目分享

最后呢,我就把这段时间来自己被问到的,以及别人在同个公司被问到的面试题目整理出来,和大家一起分享。部分题目给出了我个人的理解,有的是当时回答的情况,有的是自己回来查阅资料给出的,大家可以作为参考,毕竟每个人知识背景不同,被问到的问题绝非千篇一律。这些题目类型都是软件开发、算法、系统岗位的面试问题,希望对有意向申请这类岗位的人有所帮助。

一、A公司

1、描述Linux内核进程调度算法。(从内核源码角度)

2、使用汇编语言写一个spinlock

spin_lock()

{

1:

       lock dec [flag]

       je 3

2:

       rep;nop

       cmp [flag],0

       jle 2

       jmp 1

3:

}

spin_unlock()

{

       mov [flag],1

}

3、描述一下CPU的指令的乱序执行。

CPU允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理。

4、用C++描述二叉搜索树的构造,并按照递增顺序输出所有节点。

5、求两个字符串的公共子串。

复杂度O(m+n),借助KMP思想。

6、常用的排序算法有哪些。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

二、C公司

1、求解算术表达式的运算结果。

先转为后缀表达式,然后使用栈计算表达式。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

三、B公司

1、写出C++/Javaclass的文法。

只需要考虑成员变量和成员函数的声明。

2、常用的排序算法有哪些。

3、写出Dijkstra算法的伪代码。

4、使用shell脚本求文件内每行第一个字母(a-zA-Z)出现的频率。

awk ‘{print substr($0,1,1)}’ a.txt | sort | uniq -c

5、文件内每行存储记录(名字,身高),求身高Top10的人的名字。

使用最大堆,然后删除堆顶元素10次,即Top10。描述堆构造/删除算法。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

1、描述一下SIMD的概念及SIMD X86上的指令集。

SIMD:单指令多数据流,指令译码后多个执行部件同时访问内存,获得所有操作数进行计算。

x86AMD3DNow!IntelSSE

2、什么是netfilter,描述netfiler框架。

网络层hook,包过滤、NAT等。

3int*p[10](int ) int *p[10]int(*p)[10]int(*p) (int )int *p (int)int *pint**p 中的p各指什么?

4、操作系统中的同步机制有哪些,适用于什么场合。

5、自旋锁的特点,自旋锁中可以用于中断上下文吗?

6、中断处理过程。

中断服务程序、上半段、下半段、tasklet等概念。

7、写个程序实现字符串逆序。

8、线程、进程区别。

9TCP三次握手。

10、程序改错。

#define ABS(a) ( (a) > 0 ? ( a ) : ( -a ) )

int sum_array(int *x,int n)

{

       int sum=0;

       for(int i=0;i<n;)

       {

              sum+=ABS(x[i++])

       }

       return sum;

}

宏参数中不能使用++操作,ABS(x[i++])展开为( ( x[i++]) > 0 ? ( x[i++] ) : ( -x[i++] ) )

11、描述一下操作系统中的文件系统。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 

四、T公司

1100个台阶,从第一个台阶向上走,每次可以走一个或者两个台阶,问走完100个台阶有多少种走法。

递归问题,斐波那契数列,f(n)=f(n-1)+f(n-2)。将递归算法修改为循环形式。

2、进程间通信有哪些?

信号量、自旋琐、互斥量、消息、消息队列、共享内存、socket

3、两个进程怎么共享内存。

页表映射,虚拟地址与物理地址映射。

4socket通信中,send后返回状态ok,是否可以确定数据包已经送达?

5、连续两次写入相同数据到磁盘,第二次的操作为何更快?

6、磁盘访问的延迟主要是因为什么?

磁头的寻道、旋转、定位。

7、你的博客都涉及哪些内容,为什么写这些内容。

8gdb的工作原理是什么?

TF陷入、单步执行指令。

9、系统启动的流程是怎样的?

10、你期待什么样的工作,最不喜欢什么样的工作,经历最大的挫折是什么,如果工作不如自己的期望作何打算等。

12、了解大数据吗?说说你的理解。

13、谈谈你做的最有拿得出手的项目,从项目的出发动机、风险评估、遇到的困难和解决方式以及最后的结果这几个方面说。

14、说一下家庭情况和个人情况,工作地点要求和薪资要求。

15、你认为对于申请的岗位,你所拥有的优势和劣势。

posted @ 2013-09-30 16:31  Florian  阅读(2645)  评论(13编辑  收藏  举报