行者无疆 始于足下 - 行走,思考,在路上
拿下百度三面!
18日下午拿下百度二面后整个人就处于亢奋状态,晚上回到寝室,问了问学长百度三面的情况,得知三面基本上不会考察技术。于是心里就更亢奋了,觉得这个offer基本上是十拿九稳了,遂出去散步,绕着玉泉走了一圈。买了个大大的柚子犒劳自己。回来后继续了解一下百度三面的情况,还是亢奋,直到夜里两点左右才睡。
19日早晨赖床,十点半才起床。起床后洗漱,出去吃饭,淘宝上买的《On Lisp》也到了,吃完饭后又回到寝室,前前后后想了下三面HR可能会问的问题,比如说百度为什么会选择你、你为什么要来应聘百度、你自己的优点和缺点是什么、工作中遇到了哪些困难是怎样解决的等等,也没有想出具体的答案,1点多上床闭目养神,十分钟,心里砰砰砰砰的跳……半点,出北门,还是打不到车,奔波一段,顺利上车,杀向百瑞大酒店。
面试官很和蔼,跟昨天一样,给我倒了杯水,然后就开始聊天、侃大山。开场就是让我继续自我介绍,不要说前两面说过的,说一些别的。好吧,我承认,吹嘘个人的传奇经历是我所擅长的,于是就从高中开始,把自己6年多的大起大落坎坷的经历吹嘘了一通,包括搞数学竞赛、如何转到化学竞赛、提前保送的浙大、做社团工作、如何又对linux感兴趣,为什么不读研等等,一通胡吹,反正就是没闲着……接下来面试官看我这个人经历确实比较丰富,也还算积极主动,就问一些比较细小的问题,比如说为什么当初从数学竞赛转到化学竞赛而没有坚持下去,我回答说这是一种战略分析,理性的分析后做出的选择;问我对朋友怎么看,怎样才叫做真正的朋友,我就阐述了我的八字方针,好朋友“贵在真诚、幸在投缘”;问我自己有没有做过错误的或者不合理的决定,我就举自己那次去宁海参加比赛丢人现眼的例子;问我的职业规划是怎么样的,我说是两种,一种是一直在互联网公司做些去,另外一种是工作几年后再找机会去深造一下;问我对国内的公司创业怎么看,然后我就开始侃马云、Robin、张朝阳、丁磊、马化腾等等,谈自己对创业对成功的看法;问我这个人是不是比较感性而非特别理性的人,我有点措手不及,就说感性和理性要看具体的情况;问给你一个系统设计任务,描述一下你要怎样解决这个问题……总之各种问题都有吧,技术问的倒不是很多。
整个过程从2点到3点,整整一个小时,感觉今天的面试自己表现还不错,发挥出了自己的气场,把自己优秀的一面都展现出来了。最后冒昧的问一句“如果我这次失败的,今年还有没有另外的机会加入百度”,结果面试官说“你为什么觉得自己会失败呢,你对自己没有信心吗?”,我说“不是这样的,只是我非常想加入百度而已”,然后就拿到的面试官的口头offer:“恭喜你通过本次面试……”
泪流满面……百度终面,拿下。从16号上午的笔试、晚上等不到面试通知的失望、17号晨梦中的面试通知、18号的一面和二面、19号的HR终面,一关一关,都被我顺利地闯过,我自己都不太敢相信——这未免太顺利了点吧!吸引很多ACM大牛、世界冠军的百度就这样给了我offer?
总之还是很幸运的吧,看来我的命确实不错,每到人生关键的关口总能得到比较理想的选择,比如进入唐山一中,拿到保送资格,进入浙大,这次,是拿到了百度offer。
我应聘的职位是百度运维部-运维开发工程师,说到底还是去玩Linux了。虽然我对Linux比较熟,但是我更想在c/c++和算法方面发展一下,只是现在时候未到,自己尚没有应聘百度搜索部门的实力了。正式的offer应该会在月底发下吧,浙大站结束后统一发,应该会很快的,百度的效率还是很高的,期待中。
走出百瑞酒店,迫不及待地给老爸打了电话——因为老爸昨天特别要求一定要先给他打而不是先给妈打……可惜老爸手机关机了,悲剧……打电话给老妈,老妈在那边兴奋地快蹦起来了;然后给妞打了个电话,妞似乎不像老妈那样兴奋,可能她还是希望我能留在杭州吧,原谅我吧,妞;剩下的,就是骚扰同学和朋友了,难得地一次去校内上更新了万年不变的状态……去论坛上发了下三面面经,被别人膜拜称“本科大牛”——我不是大牛,我想如果我说大学三年我挂了10+门的课,我觉得没几个人会相信;给zhzf打了电话,给新加坡的阿黎也打了电话,嗯,祝愿大家都能找到自己的归宿吧。
差不多了……20号,也就是今天早晨5点,玉泉正门集合,上海交大菁菁堂,MSRA“二十一世纪的计算”,会后打算去看看Ouka,然后去妞那里呆几天吧,等offer,顺便想想接下来的计划,看看能不能抽出时间再来一场大的漂泊。
杀进百度三面!
早晨8点半,晨梦中接到了百度的面试通知……立马起床,打起精神,吃好早饭,回来啃书,看《编程之美》和《算法之道》。下午四点半面试,我就琢磨着还有7个小时左右,去掉2个小时吃饭、上网、发呆、上上厕所的时间,大概还有5个小时的时间,抱抱佛脚也够了。
下午3点换了身新行头,又去打印了几份简历,快四点在北门果断打上了出租,直奔者浙江百瑞大酒店。
面试官比较和蔼,还给我倒了杯水,贼感动……先是传统的自我介绍,我就开始耍无赖了:“简历上的东西我就不说了,我就单说说我的潜力和优势吧。您一边看简历我一边说。”然后就开始扯淡,还扯上了电影《The Pursuit of Happyness》的句子……一通胡扯后,感觉面试官有些被我震住了,好了,气场来了就好办了……
接下来就是问简历上的东西,先问实习做的东西,这个比较熟悉,又是一通胡扯,包括Shell、集群、Python、Nginx、负载均衡等等,反正就是有东西扯就行了,别停下来。
然后看我对linux比较熟,就让我写个Shell脚本,要求是输出下面的三角多维数列到一个文件中:
0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5
这个应该比较简单,两分钟完成,没什么大问题。注意下Shell Script中的数据类型就行啦。
然后又给我出了个小题目:给定一个数组A[n],给定一个数字m,求有多少对[i,j],使得A[i] + A[j] = m。这道题目最初的思路肯定是排序,然后大小配对。第二个思路也是数组先排序,然后对[1, m - 1], [2, m - 2]等进行二分查找……不过面试官还不算满意,又问我可不可以不经过排序。我左思右想,说了句那就用哈希表吧,直接线性查找就行了……貌似说对了,pass ……其实我对哈希表不太熟的。
然后就问我了解哪些排序算法,各种排序算法有什么特点,我就把我知道的各种排序算法都吹了一通,单独考了快速排序——其实要让我当场写,我还真不一定写得出来。还有一些小问题,比如linux常用的一些命令(df, free, du),还有OSI七层参考模型,tcp三次握手过程等等,剩下的我就想不起来了。
最后问我有没有什么要问的,我就问了三个问题:
- 百度的中文搜索是全球第一、为啥英文搜索比不过google,这点百度自己怎么看;
- 百度内部用什么开发语言和开发工具;
- 我自己在这次面试中有哪些需要改进的部分。
就这样,然后在HR mm的房间里看了会儿喜羊羊和灰太郎,就进了二面。
二面并没有问太多技术性的问题,感觉主要是聊天为主了,又深入问了我实习期间做的一些东西,然后问我为什么会选择运维而不是搜索算法部门,我就说自己没有竞赛基础,比不过大牛,而且也只是个本科而已,相反自己对linux比较熟,也比较感兴趣。然后他就让我说说对运维的理解,我就balabala地吹了一通。又问我简历是用什么排版的……我说
用LaTeX。问我是不是一个心细的人,具体表现在哪里?我就自卖自夸地说自己是个“胆大如斗心细如针”的人……然后问我工作是否严谨,体现在哪些方面?我就说自己写代码都怎样加注释,为何简历用[tex]\LaTeXe[/tex]排版等等……
后来也给我出了一道题目,感觉有点小学生脑筋急转弯的意思,说甲方乙方做一个游戏,总共是100个球,两人轮流取球,每次只能取走1-5个球,甲方先取,拿到最后一个球的那一方为胜利者。问甲方应该采取的方案才能保证自己的胜利……这个比较简单了,2分钟就有思路了,简单叙述了下,pass。
然后就完了,告诉我回去等三面的通知,说在两天内就会结束,我说周三要去上交听一个会议,很多人应该都会去,他对我提供的这条信息表示了感谢。over。
大概就这样,感觉百度的面试官还是挺和蔼可亲的,不向有道那样,不看简历上来就把你整晕,那就挂了。
明天下午2点三面,希望我自己能早点定下来吧,我的心已经飘到东南亚啦。
百度、腾讯、vobile
血淋淋的两天……
这几天事情实在是很多,以至于三天前发生的事情我已无丝毫印象,说说这两天的笔试吧。
16日上午去听课了,数字电子技术基础,大二时挂掉的一门课,讲触发器和时序电路的,发现自己依然是听不懂,庆幸自己终于没有去读生仪那个博士,否则各种硬件电路、FPGA还不得把我搞死。
下午两点百度的笔试,人很多,大概有20多个教室,算起来应该有5、6百人了。我投的是运维部运维开发工程师,可是linux、script等却没有考,考的全部是算法和c++方面的东西。大概的题目有:
-
根据不同场景选择合适的排序算法,场景有:
- 很少的元素
- 几乎有序的元素
- 关注最坏的情况
- 关注平均性能
- 元素是从一个密集的集合中取出
- 实现尽可能简单,代码尽可能少
-
给你一段哈希表的c++代码:
- 描述内存分布
- 理解代码含义
- 指出代码的逻辑错误和编程规范错误
-
c中的malloc/free和c++中的new/delete有什么区别和联系【考虑到new/delete和构造函数、析构函数之间的联系,以及new/delete是c++关键字而非库函数,可以进行运算符重载等等】
-
单入口单出口的有向无环图,给出一个算法,在已有的节点中插入若干个节点,使得从入口节点到出口节点经过的任意路径的长度都一致【瞎蒙的,记得有个NP的求最长路径的算法,在此基础上胡吹了一通】
-
二重哥德巴赫猜想:每个不小于6的偶数都可以表示成两个奇素数之和,请用你熟悉的语言编写一个函数,输出6-100000内所有偶数可以表示成哪两个素数之和,如果有多种表示方式,输出任意一种即可。要求:给出完整代码,在达到目标的基础上尽量高效简洁【打表法,a[100000],a[i]=1表示i为素数,然后循环】
-
系统设计题(这道题目不同职位不一样,终于算考点运维了):关于系统日志的备份和分析,请你设计一个好的方案,综合考虑网络带宽,系统资源,负载均衡等等……【大概是这样,胡吹的,IO-bounded/CPU-bounded,ftp/ssh/rsync等,负载均衡,想到的都说上了】
百度笔完觉得如果幸运的话应该会给个一面吧,不过也没抱太大希望了,毕竟自己的斤两自己还是心知肚明的。然后去了吃了晚饭,去实验室,打算搞台电脑,装个Linux,架个服务器玩玩,也好亲身实践下DHTML,CMS等;还有一直牵挂的旅行者小网站;架设个ftp,存放一些历史资料;有空还可以挂个论坛模块上去——我太邪恶了。在实验室翻箱倒柜,搬来了一个主机,一个显示器,偷了根网线加上许久未用积满灰尘的键盘,花了一个多小时的时间擦掉电脑上的灰尘,开机启动,123456撞大运地破解了密码,进入系统,得到了系统原先主人的信息——一个已经毕业的女研究生学长,确认后就下载了ubuntu 10.04 amd64版本,刻盘安装。设置好软件源,架好ssh,回到寝室远程登录架好了vsftpd,ftp至此初步完成。呵呵。接下来研究vsftpd详细的参数配置,实现诸如带宽限制、权限限制等高级的功能。
17日上午腾讯的笔试,场面更为火爆,笔试名单上大概有1250+的人数。笔试题目很多,由于试卷上有保密协议,所以这里不方便透露,题目大概是20道选择+代码填空8个+附加题,考点很广,c++的除了语言还有网络和操作系统的一些知识(我觉得这些对通过考研打牢基础的人是很有利的……),考完了感觉还不错,结果晚上面试名单就出来了,悲剧了……版上也有很多人抱怨,说感觉不错为啥一个面试机会都没有。可能找工作有时也靠运气吧,比如我一个百度保底的学长,google笔试直接挂掉,连面试机会都没有;比如很多大牛投了网易号称说要bs网易一下的,结果网易连个笔试机会都不发;比如上个月我的有道机试,260/270的秒杀,如果不是论坛上抱怨下恐怕也因HR的失误变成分母了……
下午回来看了会书,看了看NTP协议,淘宝上买的《ANSI Common Lisp》到货了,简单看了看,再领略了c++的宏伟,Java的臃肿,Shell Script的便捷,Python的Dynamic Typing后,Lisp的functional programming,是我一直所渴望了解的。长期以来Emacs的配置都是在网上找然后copy&paste,搞的自己都不好意思拿出手,趁着有时间好好学一学。海鸥的镜头和包也到了,至此自己花了六百大洋左右搞了一套古董机的单反,Seagull DF2000 + 35mm标准头 + 28-80变焦头 + UV镜 + Seagull相机包,性价比应该还算挺高的吧,用来练手练技术好了。
晚上去vobile笔试打了桶酱油,笔试题目有七道吧,大概如下:
- 写代码求N!中尾数中0的个数
- 写代码求1-N中数字'1'总共出现了多少次
- 估计一下全中国与你同名同姓的有多少人
- 12个蚂蚁站在木棍上,左边6个一队,右边6个一队,一声令下,左队蚂蚁向右运动,右队蚂蚁向左运动,如果两只蚂蚁相撞,则改变运动方向,蚂蚁会从木棍的两边掉落。问经过多少次碰撞后所有12只蚂蚁会掉落?【我的答案是36】
- 多关键字排序【多看看基数排序和字典排序】
还有一两道实在想不起来了……总之题目还是比较基础的吧,不算难。vobile笔试完又去听了IBM研发专场的宣讲会,据说每个人都有包包发——怪不得越到最后人越多,原来大家都是来拎包的啊……不过我不知道,听完招聘安排提前走了,亏了,呵呵。
晚上回到寝室看到88work版,就知道百度和腾讯都悲剧了。百度在意料之中,腾讯有点郁闷,不过算了。现在总结下,Google、百度、创新工厂、腾讯笔试被刷;网易有道止步一面;网易部门杀进面试,尚不知面试时间和地点;华数淘宝由于实习拿到工作保底offer,前景比较光明,正在犹豫当中,所以阿里系列的所有公司也不再投了——如果再受几个打击说不定就签了;微软不太喜欢,微策略虽然是米缸,看中绩点,为我所不耻,索性投也不投了;华为简历审核通过也不知道是啥意思;剩下的还有啥呢?自己的策略是不投游戏不搞硬件不投太小太没有名气的公司不投测试不投Java不投金融,好像也没有太多了。嗯。
其实想想人有时候真的是挺贪得无厌的,欲望是痛苦之源,我一直认为钱是一种手段,但绝不能成为一种目的。
差不多了,我也累了,忙完这阵,过了秋学期考试,争取定下工作,抽出一个月的时间出去兜一圈。加油吧。
百度电面
千呼万唤,数模成绩出来了,校赛二等奖,达到了赛前的预期,还算是不错的结果。之后就是准备自己的简历,开始找实习。
在网上闲逛了一天,看了各种各样的教程,重点推荐《简历制作——step by step》,了解基本原则,然后开始动手。简历的排版有多种方式,最基本的是word版,拉拉表格,搞搞字体即可;花哨一点的可以用ps,indesign,只是有些牛刀杀鸡罢了;我不想弄的那么花哨,因此我选择用[tex]\LaTeX[/tex]排版我的简历。正式动手之前,我扫了一下《LaTeX2e中文用户手册》,进一步熟悉了定制[tex]\LaTeX[/tex]的方法,并找到了以下资料作为参考:
- moderncv:一个漂亮的latex "documentclass"。
- jerry's resume:我觉得这个简历太长了……足足有四五页……
- pluskid's resume:非常简洁清爽的简历
我呢,就仿照着pluskid简历的风格,自己制作了一份,pdf和tex源文件可以在这里下载。然后就去88上找相应的信息,稀里糊涂的投了几家,包括百度、阿里、intel等。百度和阿里的效率很高,邮箱发过去简历,不到二十分钟就有了回音,百度更是在当天中午就打来了电话,问我第二天有没有时间,直接电话面试一下。我说好的。于是在6月13号下午一点,我找工作的处女面就这样献给了百度。
首先是客套的自我介绍,原来面试官是浙大02级的学长,怪不得对我这么“照顾”(至少在投简历时我不期望我的资本能够赢得这次面试的机会)。然后就是正经八百的面试。第一道题目是,给你十个瓶子,每个瓶子里装有白色的粉末,其中有一个瓶子中的白粉放入水中30分钟后可以变成蓝色(姑且把这粉末想像成硫酸铜)。现在给你无限制的水,问,在四十分钟内,最少能用几个瓶子,可以将这瓶特殊的粉末鉴别出来。我的直觉是这个问题与小学生的“天平挑苹果“的智力题类似——比如给你3个苹果,两个重量一样,另外一个比较重,用天平一次就能挑出来。我想到的大体思想还是先确定一个大概的范围,比如确定这个“硫酸铜“在前面五个瓶子中,然后在进一步缩小范围。但是此题的难点在于,所给的时间40分钟只够一次实验的时间,多出来的十分钟倒是没什么用,迷惑人用的。进一步想是不是该采用两个集合求交的方法来鉴别呢。此时时间大概过了三分钟,我的大脑依然在飞速的思索。最后我给出的答案是,将十个瓶子分为四组,分别是{1,2,3}、{3,4,5}、{6,7,8}、{8,9,10},每组三个瓶子都取出粉末放到编号为I, II, III, IV的瓶子里面。如果I, II同时变蓝,那么这个粉末就在第3瓶,如果III, IV同时变蓝,那么就是第8瓶,剩下的情况我们可以肯定这瓶粉末肯定在两个瓶子之中。不过结果不算完美,而我也只能得出这样的结果了。其实这道题目正确的答案是数的二进制表示法。我们将十个瓶子的编号{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}进行二进制编码,这样只需要四位二进制数即可,然后找四个瓶子装上水,对于白粉末,如果其二进制编码的某位上为1,我们就在相应的瓶子里放入该瓶的粉末(这话太绕了……),举个例子来说,瓶子3的四位二进制编码为0011,我们就在第I, II个瓶子中放入瓶子3中的粉末。所有的十个瓶子都这样做,最后,I, II, III, IV的颜色序列(蓝表示1,不变色表示0)就可以指示出“硫酸铜“所在瓶子的二进制编码!
第二道题目是一道概率题。概率是我的弱项,高中就学不好,大学更是一点都没有接触。题目大意是给你一个字符串(可能有几亿个字符),给定一个特殊的字符'a',再给定一个可以产生0和1的随机数发生器,然后让你写一个函数,等概率地返回'a'的一个索引(就是'a'在字符串中的位置,比如字符串为aaba,那么a的索引为{0, 1, 3},等概率地返回0、1或者3)。我说这简单啊,首先用[tex]O(n)[/tex]时间做一个扫描,将'a'的索引位置存储在另外一个数组中,假设为b[length_of_all_a],然后用随机数发生器产生一串0、1,转换成十进制,再做x = '0101000...01' mod length_of_all_a的运算,然后返回b[x]就行了。说完了我就知道肯定有问题,这么简单通俗的方法就是一个没有学过计算机的人也能想得出来。果不其然,面试官开始刨根问底了。先是问了我时间和空间复杂度是多少,我说都是[tex]O(n)[/tex],他说复杂度太高,我说要做扫描线性时间复杂度是必须的;然后他说有没有办法减少空间复杂度,毕竟最坏情况是[tex]O(n)[/tex],比如这个超长的字符串全部都是'a',那么存储索引需要的空间就是[tex]O(n)[/tex]的。我一时语塞,要了五分钟考虑时间。最后想出的方法是类似于二分的方法,首先肯定的是在空间复杂度小于[tex]O(n)[/tex]的要求下,我们不可能存储'a'的所有索引了。于是我想的方案就是看随机数发生器,如果是0,我们就去字符串的左半部分查找,否则就去右半部分查找,依次递归,当递归下去的字符串长度小于某个数值的时候,我们就用线性查找的方法,看看这个小串中有没有'a'存在,存在的话,返回索引值,否则向上回溯一层,去另一半查找。总之是很晕的一个山寨方法,而面试官竟然还能听懂,然后他问我怎么样证明这个就是等概率的呢。我说了几个“应该……“,都是凭感觉。再然后他给了我一个串“aaba“,照我的方法,前面个两个'a'被返回的概率有25%,最后一个'a'却有50%,这下我彻底无语了,只能承认自己没辙了。
第三个问题是关于c++的。问我c和c++的static关键字都有什么作用。我就balabalay的说了一通变量的作用域,c++中static class member和static class member functions的东西,可是面试官总是不满意,不停地问“还有吗……“,然后给个提示,我就继续balabala一痛,直到问地我再也无法balabala的时候才放手。
最后好像让我谈了谈自己做的项目,我就把四月份实验室做的哪个项目鼓吹了一通,然后谈了谈acm比赛,我说我只是了解,选拔赛被虐的很惨,对于进入校队基本不抱希望——暑假有时间实习(希望你给我个offer)。临结束的时候又问了一句“你对异步编程“有没有了解,我愣了,说不了解,只听说AJAX是异步Javascript和XML的意思。然后他问我还有没有什么问题,我就傻傻的问“我想知道这次面试中你对我的评价“。评价结果是“思维比较活跃,基础还算不错,但是接触的东西不够广泛“,大概如此。
整个面试过程约一个小时,头脑风暴,增加了自己的信心,也意识到了自己的差距。革命尚未成功,同志仍需努力,暑假,一定要好好把握。