百度是我一直很崇拜的地方,也一直非常期待的地方。可能是源于我对网上诸多面经的理解以及她在宣讲会前后的宣传,我一直以为百度是一个只有非常牛X的人才能去的地方,里边的人都是超级大牛,所以像我这种机械专业的菜鸟学生参加她的宣讲会也是去参观参观,娱乐娱乐而已。至于到后面为什么一不小心拿到了百度的offer,可能一半是实力一半是运气吧。
  百度的宣讲会来得非常早,在九月十八号来了,也是我参加的第一个宣讲会,所以记忆非常深刻。大活门外的广告打得非常炫,一个很帅的人,不知是不是李彦宏,头上画了两只牛角,大意是个牛人,期望大家加入百度,在牛人的关注下成长。我显然低估了百度在学生中的影响力,提前半小时到宣讲会现场,发现挤爆了,没办法,只好站在走廊里边,后来保安建议同学们都坐地上,于是大家也不管地上脏不脏,不管是GG还是MM都坐下了。由此可见找工作还是很辛苦的,确实,在这以后的日子中大家为了心目中的企业一直在奔波,无论是精神还是体力上都处于一种极限状态。
  宣讲会之前半个小时一直在放李彦宏参加那啥咏乐会的节目,百度的老总是长得帅啊,据说是中国的知名企业的老总中帅的一个了。果然是才艺皆全,听他的创业经历,看他跳舞,讲述百度名称的来历并吟诗,真是享受啊。百度的宣传片做得也很有气势,百度大厦的漂亮也给我留下了深刻印象。宣讲会正式开始后的内容和其他公司差不多,都是百度公司的介绍,企业文化,内部工作环境,员工发展等等。其中还有一个刚刚入职的华工MM参与了这次宣讲,很PP很活泼的一MM。总之百度的宣讲会持续时间比较长,人数也非常的多,百度给我的感觉非常好,非常遥不可及。
  笔试:
  原先百度网投的时候,我用网易的邮箱注册,老是收不到激活信息,后来换了个QQ邮箱,注册居然成功了。众所周知,在找工作中用QQ邮箱可能会让企业觉得此人太幼稚,印象不好,所以我非常担心,想重新注册一个账号,但是一个身份证只能注册一个账号,所以只能作罢,非常担心我的简历被刷掉了。后来发现这个担心没有必要,因为百度基本也是海笔的政策,而且笔试通知和笔试过程是交给智联招聘的人来做的,整个过程人比较多,也比较混乱,百度和QQ一样,也支持霸王笔,这点同样要赞。百度招聘系统上的状态和实际状态不一定完全吻合,比如我的简历状态一直处于“处理中”状态,而有的人有“笔试”、“面试通过”或“面试未通过”状态。笔试时间安排在十月十多号,和宣讲时间差不多相隔一个月,这个是百度的策略,先在各地宣讲,接下来各地笔试和面试,后汇总,通知结果。笔试是晚上进行的,和支付宝一样,也是全部挨着坐,但是试卷一样,百度不担心你抄别人的试卷,因为你抄不了,2个小时,6道大题,试卷头特地说明解决问题是一门权衡的艺术,如果有可能,尽情发挥,在做试卷前,通篇阅读题目,选择拿手的题目行了。百度的六道题目大致如下:
  1.关于深度优先、广度优先遍历算法及非递归实现的特点
  这道题我索性将深度优先和广度优先便利算法都写出来,然后简单说明了一下其非递归实现的特点,是需要一个堆栈或队列,辅助空间较大等。
  2.一道程序改错题,可能存在错误,也可能存在安全隐患。
  这道题一般对C/C++熟悉的同学都会做,是一些关于指针的指针传递,也有一些数组越界的问题,不难。
  3.一台计算机有1KB内存和1MHZ的处理器,能在该机上运行且确定性终止的所有程序中,长的运行时间是多少,要求写出推理过程,可作出任意假设。
  我假设该机是但用户单任务操作系统,实地址模式,运行的程序是在不断不重复地更改内存状态,程序结束的终止状态为内存的某一确切状态,定义为终止态。于是推理过程如下:
  1KB的内存共有状态:2^(1024*8) 种
  1MHZ的处理器每一秒钟可以更改内存状态的次数为: 10^6 次
  因此,如果一个应用程序,从某个状态出发,遍历了所有的中间状态,终到大终止态后结束,经历的这段时间即为程序运行的长时间。为:
  (2^(1024*8)-1)/10^6 秒
  4.关于编译依赖的问题,大意是一个项目中存在诸多组件,某些组件的编译需要以另外一些组件的编译为前提,问怎样找出一个合理顺序,使得所有组件能够顺利编译。
  该题其实是拓补排序问题,详见清华大学出版的严蔚敏编著的《数据结构》一书。我以一个确切的例子,绘出了一些图形和数据结构,然后以文字形式表述了算法。
  5.编程题。要求在一个字符串中找出长的数字串,如“fafdahruqa12343fa43faf56454354fas”,你需要找出“56454354”即可。
  该题很简单,可以直接写出可以运行的代码。
  6.关于URL的系统设计问题,一个URL分为站点和路径两部分,除此之外还需要维护一些定长的属性和不定长的属性,定长属性如URL被发现的时间,不定长属性如URL的描述文字。要求设计一个系统,可以存储和维护100亿条URL及其属性,支持添加,更新和删除URL,能判定一个站点是否在系统中,如果在,需要给出信息,一个站点可能有多个路径,如果给出一个站点,支持给出站点下所有的路径。
  该题我采用的哈希散列的方法,以站点为关键字进行散列,设计了一个数据结构表达一个站点、定长属性、非定长属性,设计一个路径链表存储所有的路径。然后对各个要求的功能算法进行了一下简单的说明。
  百度笔试的题目较多,体量较大,不要求全部做完,一般说来能写出思路来,并且思路正确OK了,关键是要想好怎样表达。笔试完毕后,我感觉比较好,觉得应该是可以进入第一次面试的。
  技术一面:
  在笔试后的第二天,我收到了百度的面试通知,因为我算法方面不是很在行,不过在Windows编程上还行,于是我报的方向是客户端软件开发。面试地点安排在洛迦山国际酒店,百度的面试都是一对一地面试,百度的技术面试据说非常难,会问一些很难的问题,也会叫当场写代码。当时得到面试通知是又喜又担忧,估计自己是凶多吉少。我被安排在四点半面试,而晚上六点是迅雷的二次笔试,当时都想放弃算了,有点觉得自己是炮灰。后来权衡半天,还是打算去试试,见识一下也好啊。我提前了一个小时来到珞珈山酒店,在二楼,绝大多数房间都是开着的,面试官和面试者一对一,有的房间在谈话,大概说的是项目,或者面试官问,面试者答;有的房间面试官在干其他事,面试者趴在桌子上,应该是在写程序。也有几个面试者等在各自的房间外,费劲地听着里边的谈话内容,我利用先到的时间,迅速和其中几个在我之前的面试者聊了聊,大概了解了面试的内容和形式,过了一会儿,那些先到的面试者都进入各自的房间面试去了,走廊只剩下了我一个人,这是脑袋里边什么东西都想不了,索性我不想了,反正我觉得自己是来玩的,于是我一个人在二楼所有的面试房间外晃来晃去,看里边面试的情况。四点半的时候终于轮到我了。
  面试我的是一个非常好的技术面试官,据介绍是百度客户端业务部的主管,刚开始做了个自我介绍,然后开始问一些项目的问题,围绕项目问了很多很细的问题,包括Windows内核的一些东西,如多线程,进程通信,WM_COPYDATA原理,内存映射文件等。我都一一予以作答,看上去他比较满意。后来终还是逃不过写程序,他出了一道程序题让我写,题目比较简单,我立即下笔,三分钟后我写出来了并且注上了完整的注释,自认为写得很规则。面试官看了一下,没有找出任何错误,饶有兴趣地问了一个关于编程习惯的问题,他问我为什么喜欢把判断一个字符指针是否终结的语句写成if(0x00==*pStr),而不是if(0==*pStr),我说0看上去太单薄了,和数字0差不多,’’写起来太麻烦,0x00写起来感觉好,和字符在内存的存储也符合。技术上边的面试大致是这些,远没有腾讯那么难,面试官也么有过于难为我,估计是因为我是机械专业的学生,非计算机科班专业的缘故。