从7月中旬回武汉之后开始系统的复习,到9月下旬正式开始找工作,最后到10月中旬结束,前后历时三个月,从前期的职业定位,到中期的复习准备,最后到后期真枪实弹的笔试面试,个人感觉找工作就是个系统的工程,是个很复杂的事情,至少对于我是这样的。经历了感触颇深,在这里,我想将我这几个月,尤其是最后半个多月笔试面试的经历与感受记录下来,一来祭奠我那些由于高强度笔试面试牺牲的脑细胞,二来希望能给学弟学妹们半点借鉴。

       下面主要从三个方面来记录这段经历:职业定位、复习准备、实战经历。

一、职业定位

       我想大家在找工作之前应该会给自己定个目标,或者是职业范围,比如想到哪个城市去工作;想加入到什么行业,比如互联网、通信、传统软件、游戏等等;想进什么样的企业,国企、民企、外企或者考公务员;最后想从事什么职业,是搞研发还是搞测试,是搞Web前端还是搞后台开发,这些都是要考虑的。只有定位清楚了,才能有针对性的复习和准备,才能有的放矢,增加命中率。

        就拿我自己来说吧,本来我对去哪个城市是没什么特殊要求的,不过我想进入互联网行业,国内好一点的互联网公司,深圳有一两家,广州有一两家,杭州有一两家,上海有一两家,其它的基本就全在北京了,所以从概率上来讲,我多半要去北京了。然后,国内互联网公司基本属于民企。所以,综上,我多半要去北京进入到某个民企从事互联网行业。当然,除了这个,知名外企我也想试试,只为一试,只为一死,因为我自己实力我了解,即便技术关过了,英语口语这关肯定也是要死掉的。

         最后,也是最重要的一点,打算从事什么职位,一般的互联网公司都会有这些职位:前端开发、后台开发、windows开发、手机软件开发、测试,运维等等。我以前虽然搞过web开发,不过那已经是几年以前了,现在已经丢的差不多了,所以前端我没有优势;windows开发没做过,手机开发没做过,测试没做过,运维也不熟,这些都排除就只剩下后台开发了。大部分公司后台开发都要求linux c/c++语言,我近一年来做的项目主要用的就是linux c,所以最基本的平台和语言还算吻合。我注意到大部分互联网公司,尤其是知名一点的互联网公司都有这样一个职位:数据挖掘/机器学习工程师。然后联系到我近两年的学习经历,论文牵线,我和数据挖掘结下了不解之缘。除了项目之外,其它时间,我基本都在学习数据挖掘的相关知识,包括数据挖掘相关算法,推荐系统,搜索引擎等。综上,我给自己职位的定位就是,大的方向是后台开发,细分下来就是数据挖掘、推荐系统、搜索引擎相关。

二、复习准备

        从七月中旬到九月下旬,系统的复习我花了两个多月,别说我复习的时间长了,高考只决定了未来四年,我们要花最少一年来复习,考研只决定未来三年,我们要花将近一年时间来复习,找工作决定未来多少年,我不好说,因人而定,总之是跨入社会的一个新的起点,新的平台,我觉得花多少时间来准备都不为过。当然,这个也是因人而定,有的人基础好,可能不需要怎么复习就可以直接扛着枪上战场,我不行,我没考过研,所以什么数据结构、操作系统、计算机网络什么的都丢的差不多了,如果不复习就去笔试面试,我估计等着我的只有一个结果:go to hell。

         复习我主要围绕四个方面:基础知识、具体职位相关知识、技术博客、项目。

1.基础知识

        计算机涉及的知识太广,我们不可能面面俱到,不同的公司考察的重点也不一样,不过也有一些共同点,尘埃落定之后,回过头来看一看,个人觉得《程序员面试宝典》就是一个很好的知识框架。总结下来,就是一句话:一个中心,两个基本点。一个中心是数据结构和算法。大一点的公司都会或多或少的涉及这方面的知识,不管是笔试还是面试。先说笔试,至少会有一道算法设计题。变态一点的像百度,基本都是编程题和算法题。面试最少也会考察一道算法题,逐步优化并且代码实现。这一块是重重之重,最好是找两本数据结构和算法方面的书系统的复习一下。两个基本点,一个是语言,一个是操作系统、数据库、网络相关知识。语言选择最熟悉的一种语言即可,个人觉得如果语言有项目基础,面试宝典上面涉及到的语言知识就可以应付一般的笔试。至于操作系统、数据库、网络相关的,基本考到的也都是小题,本科阶段的积累应付笔试应该没多大问题,如果要应付面试中面试官就某个知识点的追根究底,恐怕还是逃不过对某些知识点的系统复习。比如经常会问到的,操作系统中的进程和线程的区别,进程通信和线程同步,tcp/ip相关知识等等。

2.具体职位相关知识

          因为我投的是数据挖掘、推荐系统和搜索相关职位,所以这一块我主要复习这方面的知识。这个看具体职位吧。具体职位具体复习,就不详谈了。

3.技术博客

          这一块主要是拓宽自己的知识面吧,或者说把前面复习的知识在这一块灵活运用,因为面试中大部分也不是考死知识,也是给我们一个问题,然后让我们分析解决并且逐步优化。这里有大量的面试题分析以及海量数据处理问题总结,很久以前我就开始跟踪这个博客,里面海量数据处理问题总结的很到位,基本可以应付绝大部分笔试面试中遇到的海量数据相关问题,我经历的搜狐和腾讯的笔试以及百度的面试都涉及到了这方面的问题。第三个:编程之美,这是微软的一帮工程师总结出来的一本面试心得,其中,对于每个问题如何解决如何优化都讲解的非常到位,建议大家务必把这本书好好看看,如果时间不够,可以只看第二部分数字之魅和第三部分结构之法。其中“寻找发帖水王”问题大众点评网考到了;“1的数目”问题微软考到了;“寻找最近点对”问题创新工场二面的时候问到了;“求数组的子数组之和的最大值”问题腾讯考到了;“链表相交”问题创新工场一面的时候问到了…

4.项目

         主要是因为我有个项目做了有两三年了,有点陌生了,但是我简历中写到了这个项目,避免面试官问到而我谈不出来,所以我把之前做过的两个项目的相关文档都看了一下,思路整理了一下。这一块也是因人而异,需要复习就复习。面试的时候有东西谈总是好的。

三、实战经历

           下面谈谈我的面试经历吧。主要谈谈四次印象最深的面试:最烂的一战——搜狐;最爽的一战——创新工场;最累的一战——微软;最成功的一战——360.

1.最烂的一战——搜狐

           搜狐是我笔的第一家公司,也是我面的第一家公司。为什么说是最烂的一战呢,因为我满怀希望的去,结果伤痕累累的回来。面试官三十岁的样子,亲和力比较强,我先做了下自我介绍,介绍到项目的时候,围绕项目聊了一下,因为我简历里面提到了hadoop,所以又聊了一下hadoop可靠性相关的问题,这些都没什么,因为都是我简历里面的东西。然后,面试官问设计模式熟不熟悉,我只了解少数几个模式,所以说不熟,然后面试官就没再问了;然后面试官又问我数据库熟不熟悉,数据库我简单的复习了一下的,没把它作为重点,以前的项目也用过,基本的sql语句我还是了解的,但是我担心我说熟悉,他会深挖,所以我说不熟,然后他也没问了;然后他又说,“我看你第二个项目是用java做的,我们研发部这边也主要用java”,我本科的时候确实一直用java,不过研究生阶段没怎么用过了,有些api不太熟了,我就实话实说了,然后他又没问什么了。我简历上写了熟悉linux开发,然后他说能否说一下你熟悉的linux命令,我说了几个,然后提到以前做项目的时候用crontab做过任务计划,然后他抓住这一点,给了我一个任务,叫我写出任务计划,天啦,都几年没写过了,我哪还写的出来,命令里面几个时间的顺序都记不得了。最后,他说做个数学题吧,叫我求出1到1亿的和,我拿到这个题就开始想应该是个什么算法,从头至尾就是按照计算机的思维在解这个题,又是循环,又是递归,又是溢出,甚至在往位运算方面想,总之,最后没给出他想要的结果。最后,聊了一下链表、hash相关的问题。面完了,我问他,我今天面试有些什么问题,方便我改进,他总结了几点:1.项目经验不足,意思就是我linux相关的开发工具不熟;2.数据库设计模式这些基本的知识掌握的不好;3.数学比较弱,他说那个数学题高中生的水平都可以做出来。不过,最后他加了句,你数据结构还是学的比较好的,伤感。回来的路上,我又回忆了一下,他说那个数学题高中生都可以做出来,不会就是求和公式吧,晕,我把它想复杂了。

          总结一下搜狐的面试,整体来说,面的东西都比较基础,没有什么太深的东西。不过毕竟是第一次面试,经验不足。第一,我太过保守,没有十足把握的,我都说不熟,给他得印象就是我不会,比如数据库、设计模式、java;第二,把水想的太深,其实水并没有那么深,比如那道数学题,我怎么就没注意他说的是数学题,不是算法题啊;第三,不知道的东西千万不要主动提,比如那个crontab,我以为我知道,但其实我已经忘了,悲催。

2.最爽的一战——创新工场

          一面面试官是个年轻的小伙子,比我大不了多少。同样先做自我介绍,然后聊了一下项目,然后他看我写的了解hadoop,就问我多长时间能把hadoop的平台搭起来,就是单机模式的,这个我之前搭过好几次了,还写了相关的技术博客,我说半个小时就可以搞定,他很满意,说之前公司来了一个实习生,给他一天的时间,硬是没有搭起来。然后叫我写一个判断单链表相交的代码,这个我之前看过,很快就写出来了。然后就是一个开放性的问题,因为我简历上写了搜索引擎,所以他问我,搜索引擎的搜索框里搜索词的提示和纠错怎么实现的,这个我首先想到的就是trie树,开放性问题嘛,当然方案越多越好,我又想到了贝叶斯分类。一面结束的时候,他说我挺不错的,问我明天什么时候有时间,晕,都不用等通知,已经给我安排下一场面试了。二面主要围绕两个问题,一个是k-means聚类基本算法和优化,还有一个简单的算法题,不记得了。二面完了,下午就收到了参加创新工场双选会的通知。

          创新工场,整个面下来都是很轻松的,可能是因为面的都是简历里面的内容,不管是hadoop还是搜索还是聚类。所以,面试也看运气吧,碰到这样的面试官,爽死了。

3.最累的一战——微软

          微软不愧是软件业的老大,他的面试给人的感觉就是正规严谨,面试官也是从头到尾都很严肃,个人感觉从头到尾大脑都是高负荷,不过也是最受益的一个。第一个面试官三十多岁,首先做了一下自我介绍,然后简单的聊了一下hadoop,接着,就给我一段代码,让我指出其中的错误,我每找出一处,他都追问,“你看看还有没有”,最后,我大概找出五处左右的错误,实在找不出来了,他就没问了。然后,他说,我们来写段代码吧,叫我写了段memcpy的代码,这个代码之前写过,主要要注意拷贝边界。写完之后,他看了看,说,“你看看你的代码有没有什么问题”,天啦,我听到这个,我当时就凌乱了,因为我确定这段代码是没问题的,因为之前写过好几次,最后他提示我,循环可能永远不会停止,我才恍然。这个问题结束之后,最后的重头戏来了。最后一个问题是,一辆车有无限大的油箱,围绕一个环形跑道走,跑道上总共有k个加油站,每个加油站m升油,每两个加油站之间的距离为a[i],先回答,这辆车能不能从某个加油站开始走完跑道,回到起点,如果能,从哪里开始。大致的问题就是这样子的,具体的我记不清了,我最怕的就是这种题了,最开始,我题目都没搞懂,他解释了半天,我题目才搞懂。搞懂之后,先给他讲思路,在他一次次修正我的思路并且确定思路是最优的之后,他说了句“问题听懂了吧,OK,开始写代码吧,我出去坐坐,10分钟之后进来”,然后他端着咖啡走出了房间,去外面大厅去了。再一次凌乱,什么都要写代码,这就是微软。OK,没办法,写呗。不过,好歹是写完了,他进来看了之后,还是那句“你看看你的代码有没有什么问题”,我硬是没看出来。后来,回来的路上我才想起来,忘了加判断,先要判断能走完,然后再找从哪里开始走才有意义,我忘判断了。唉。

           第二个面试官大概40多岁,从头到尾就面了一个问题,二叉树的序列化存储,也是先给他讲思路,每提供一个思路,他都说能否继续优化,直到最后时间复杂度和空间复杂度都达到了他的要求,然后就说“那好,你实现一下吧”,好吧,我已经习惯了,实现这个代码花了我将近半个小时,他看了看,也是那句“你看看你的代码有没有什么问题”。怎么微软的面试官都是一个模式。

         微软面了两个面试官,从下午2点面到4点多,整个的感觉就是累。感觉面试官就是一步步逼着你,直到发挥你最大的潜力,好几次我都想说,这个我做不出来了,咱能不能换一个,没好意思说,不过最后还是被他们逼着把题给做出来了,不过,我终究离他们的要求还是有一定距离。

4.最成功的一战——360

          之所以说是最成功的一战,是因为,360我是霸面的,而且面上了,我生平第一次霸面,也是最后一次霸面。那天面完百度,我没有直接回学校,而是去了360面试的咖啡厅,我中午去的,我问门口的hr能不能霸面,hr说要等前面名单上的人都面完了之后才行,ok,我就等呗,谁叫我那么中意360呢。等到下午差不多5点,我这个岗位的人才面完,面试官终于空出来了,给了我一次面试机会,非常感谢360的hr和面试官,给我一次机会,这也说明360是个非常开放的公司。面试细节,我这边就不提了,因为投的是数据挖掘工程师,所以面的主要是数据挖掘,推荐,算法相关的东西。

         最后,做个简单的总结吧,通过前面的描述,我想大家也看出来了,我们这专业的想找个好工作完全靠技术。当然,首先要选好自己的职位,选择最匹配自己的岗位,然后夯实自己的基础。只要坚信自己的技术够厉害,总会有适合自己的工作在那儿等着你。被拒很正常,被拒了不是说明你不够优秀,只是不适合你而已。就像找对象,不找最好的,只找最合适的。

         Ok,就这些吧,希望大家看完不要觉得这是在浪费大家时间才好,希望还在找工作的童鞋们早日找到适合自己的工作。另外,学弟学妹们,你们也加油吧,期待明年战场上你们的传奇。