在2012年11月份的时候,通过和师兄的交流和指点,突然有了要找一份实习的想法。归结于我自身的因素,我想可以暂时总结为以下几点:
以上都属于self-convincing. 其次就是师兄列出来几家不错的公司:微软,百度,触宝。刷了几天的水源以及joinms.com, shixisheng.baidu.com,感觉有几个职位还是蛮理想的,于是就投了简历,很快百度和微软都有了回应,触宝以及其他的比如ebay都杳无音讯,可能是觉得方向确实不怎么match吧,另外就是简历上面货比较少。
百度:
我投的是百度商务搜索部,软件研发工程师。这是我第一次面试,而且是电面,心情算是比较紧张的。面试官直接跳过我简历上面的内容,问我C++怎么样?我坦白的说平时写代码都是用C,C++仅限于一些书面上面的理论知识,然后他说,那我就来考察一下吧,问了几个C++的基本问题,我都比较囧,没能回答的很好,由于比较紧张,思路更是比较混乱。大概过了10分钟左右,进入算法题环节。都是和大数据处理相关的基本东西,一题是海量数据寻找k大数,第二题是求海量数据中多于一半的一个数字。第二个问题我回答的不是很好,没能给出Best solution,看来还是准备的不够充分啊,编程之美上面的原题。接下来又问了C语言指针相关的问题,这个是我的强项,没有问题。
最后面试官和我确认了每周可以去几天,实习多久的问题。然后我又犯了一个比较致命的错误,太诚实的回答了一周只能去3天,可是招聘要求上说必须是4day/week。
第一次面试,再加上细节上面处理的不够完美,1周后,杳无音讯,于是可以确定一面failed,导致我的百度之行止步于此,内心还是比较沮丧的。下定决心,要练好算法。
微软sde:
事前从师兄那了解过,微软的面试题不会太难,但是很注重细节。于是我也是作了一些准备,把剑指offer上面的题目都刷了一遍,临阵磨枪吧。
虽然是hr面,但是这是我的第二次面试,内心未免有很多惶恐之处。很准时,下午1点整电话响了。首先是问了我学校专业的情况,实习时间。然后就是让我说说至今为止做过最满意的项目,正好我最近把我大三写的一个程序放到了Google code上面,balabala说了一堆。没什么问题之后问了我擅长什么语言,写过多少代码云云,最后突然问了一句:我们这里平时办公都是要有英语交流的,那么下面请你用英语自我介绍下。瞬间我表示很囧,但是没有办法,赶鸭子上架,口语糟糕的一塌糊涂,说到了自己如何对ms感兴趣,平时学习情况之类的。然后她又问:why are you so interested in microsoft?我大概说了下以前接触过WRK,微软为教育作出的贡献之类的。然后10分钟到了,寒暄了一番说如果有结果就会及时通知我。
果然没过几天,hr打电话过来,要和我预约时间,问什么时间空闲,做一次电话技术面试。大概3天后的样子,接到了面试官的电话。首先也是自我介绍,只不过这次是中文的,然后是project,我详细的介绍了自己放在Google code上面的源程序,中间他觉得有问题的地方会打断,让我说明,最后他觉得没问题了之后就问:平时算法学的还可以吧?我说还行,接着他说,那就来一题简单的:有序数对中和为sum的数。我说了思路之后他又根据这个问题深入探讨了关于这个问题的扩展,一些特殊情况之类的,在所有的细节都讨论完之后,他让我自己再完整的叙述下方案。长舒一口气之后,他说good,今天的面试到此为止,有结果了我会进一步通知你的。大约过了3个小时,hr打电话和我预约时间,这次要进行2轮现场面。
晴朗的周一,骑着自行车提前半个小时到了紫竹园微软办公楼签到,然后可爱的hr MM把我领到了面试地点,面试的地方就是一个小隔间,和MS员工平时办公的是一个地方,出乎意料的是:桌子旁边没有像其他面经所提到的各种水果饮料 :) 二面的面试官看起来和蔼透着严肃,自我介绍加上闲聊下简历方面的东西,突然话锋一转说:那闲话就不多说了,我们开始做题吧。然后接下来的2个半小时将是对我骤雨般的洗礼,各种code,各种细节探究。首先他说做个简单的:字符串转换成整数。在我确认考虑到各方面细节之后,他又让我写了test case,中间并且他还出去了一趟。回来便和我讨论为什么要这么设计,如果用户调用我这个函数不细心应该怎么办?我无力吐槽,他接着说:其实这个问题也没有一个通用的解法,但是在实际的工程中这些问题都应该会碰到,关键看你有什么思维去处理。
第一题貌似他挺满意,然后开始第二题,他说来个难点的,平时他面FTE都是拿这个题:是关于单词划分的,给他一种划分方案。并且接着说,给我一个大的提示:这一题要用到动态规划,可能会想一段时间。我笑着说:嗯,确实是蛮大的提示。现在还记得我当时的心情算是比较紧张和复杂的,因为我知道这将是我面试成败关键的一个点。很快,大约5分钟不到,我提出了自己的思路,要和他探讨,他表示赞同我的想法,但是还可以继续优化,接着又给了我一点点提示,让我写出来完整的动归方程。当我写出来给他看的时候,他说:没问题,你的方程是对的,那把完整的代码写出来吧,顺便也把路径打印出来。接着他又出去了,说给我10分钟时间,我讨价还价说:好难啊,太短了吧?面试官幽默的说:不难,怎么能难呢?最多不超过15分钟噢。我嗯了一声他就出去了。他回来的时候我们又共同探讨了我代码的思路,并且还指出我路径打印时的问题,我慌忙说对对,感叹这点细节最终还是忽略了,有点点小遗憾。最后面试官说:由于时间关系代码就写到这吧,你的思路总体表现还是不错的,我去喊下一位面试官。
此时我拿出手机看了下时间,已经过去一个小时多了,有一点点累,但还是比较紧张的等待第二位面试官。
三面的面试官听口音就可以辨别出来是我电面的那位。然后他也直奔主题说:我们之前了解过,所以就不多说了直接开始做题吧。囧。他敲了敲脑袋说,这次出什么题呢?有了,那先从一个简单的开始吧(又是这个套路?)。题目很简单,Excel里面关于列值计算的问题,可以划分为进制转换嘛。大约5分钟左右,我写完了代码,交给他看。他注意到了我处理边界的地方,然后继续深入探讨说(果然是套路):这个地方你用64位int来处理32位int溢出的情况,如果我给你的数很大呢?你应该怎么处理,针对这个case你能给出一个special的方案吗?我当时第一反应是把这个数定义为大数类,然后再处理+ - * /,他不是怎么满意,继续耐心提示我说:你给的是一个general的方法,如果仅仅处理我们这个case,有没有什么special的方案?说到这里我的脑子已经有点懵了,突然感觉很累。我对着天花板思考了一会说:可不可以用移位的方法来特殊处理,大概阐述了一下我的思路。他又针对接口的易用性,效率上面否决了我。这个时候我想:怎么没有第二个题目啊,这个题目我实在是没有思路了。但是想归想,我还是镇定住了和他讨论有没有其他的一些可行方案。最后他说:那我就给你一个hint吧,balabala把大概的思想说给了我听,这个时候我就有筋疲力尽的感觉了,已经没有心思在听他叙述思路,想尽快结束掉这场面试。只是在一边说:嗯,对对。谁知道最后他又话锋一转,问我:明白了吧?那把代码写出来吧。我当时有点愣,但是瞬间清醒了过来,意识到这是我本次微软面试的最后一次机会了,再不抓住可能就failed。稍微回忆了一下他刚才说的内容,意识到这个问题其实是一个技巧性非常强但是代码写起来比较轻松的问题。平时积累的编码功底在此时再一次体现,我尽着自己的最大所能把代码飞快的写了出来,确认没啥大问题之后,他又和我探讨了我自己的代码思路,还算比较清晰,同时他也指出我代码中一个比较不妥当的地方。我急忙应声:对对。
筋疲力尽之后,他说这次面试就到这吧,hr有没有给你安排下面应该做的事情?我说没有,他说那我送你下去吧。中间我试探性的问了下:您觉得我这次面试表现的怎么样?结果他什么也没说,反倒问我一周可以来几天,实习多久之类的话题。当时心情蛮沮丧的,可能是我表现比较糟糕,他也不好直接表达吧。总之感觉这次微软之行结果55开吧,一半归结于自身,一半交给了上帝。
中间隔了一天,也就是面试完的第二天早上,接到了hr的电话说,首先恭喜我通过了面试,然后说给我安排时间报道,稍后给我发offer letter到邮箱。总之我心情还算比较淡然,即是failed我也找到了自己今后应该努力的方向。最近看了一本书叫做《游子吟》,让我快从一个无神论变成有神论者了:上帝虽然不会随时眷顾你,但是却在一直指引我们前行。
从面试的过程中可以看出来微软的办事效率还是非常高的,从头到尾没有一点的拖拉。而且非常注重coding,只要是现场面一定让人代码写到手酸。另外是算法,这更是programmer的基本功之一了。
算法和数据结构依然是今后2年不断修炼的主题,中间肯定会涉及到很多计算机方面的数学知识。基本功一定要非常扎实才能够有希望冲击一流的互联网公司,其次才是C++和programming。我一直在内心提示自己:剥离冗余,内筑修为。只是感叹以现在的角度才明白了这个道理,多走了一些弯路。不管怎么样,都还是需要调整和改变的。Best wishes to myself。