2016 · 面试季

Published at 02nd May, 2016

不知不觉到了要正式地找一份实习的年龄了。作为一个有追求的 Web 狗(所谓手上写着 JavaScript 但心里想念着 C++),只给 Google Shanghai 和 Microsoft Shanghai 投了研发实习的简历。

我虽然有信息学奥赛获奖背景,但一直以来 Web 相关的工程开发才是我的强项,因此我的经历也许对同类同学有一些参考价值,希望可以帮助到大家 :-)

背景

先说背景。与大多数同学算法非常强不同的是,我最擅长的领域是 Web 前后端开发和设计。另外在信息安全和系统底层开发方面我很感兴趣,至于算法则是业余水平。以下是我自己获奖经历,也许可以帮助你定位自己的能力。

  • 工程能力:Google Summer of Code 2015

  • 算法能力:NOIP 普及组一等,提高组二等

  • 其他:阿里巴巴信息安全竞赛决赛第三名(三等)

PS: 非常推荐参加 Google Summer of Code。它有丰厚的奖金,而且是个人工程能力的很好证明。

PPS: 如果你可以刷穿某些在线题库比如 POJ 的话,去谷歌微软肯定没问题 :P 这已经属于 ACM 很厉害了。

申请

我的简历是内推到 Google 的,而 Microsoft 则是跟随大家通过网上校招渠道。

关于谷歌中国的校招:

  • 听说:获得谷歌中国的实习机会其实比正式工作机会还要困难,因为名额很少,而大家又以为实习很简单,所以都去投实习 :P

  • 证伪:传闻内推的一定会给面试机会,实际上有同学简历直接被 HR 筛了。所以,简历上所表现出的个人能力仍然是很重要的。

  • (2016 年末更新)听说:谷歌中国的正式职位目前对学历要求很高。

关于微软中国的校招:

  • 事实:无论你是不是内推,都一定会被安排参加在线笔试(关于算法与数据结构)。

  • 猜测:如果你的简历上很有亮点,那么在线笔试似乎不需要表现抢眼,比如我在笔试的时候就来不及做完成绩平平。

  • 听说:微软对学历要求不高,更看重能力和技术水平。

Google 实习面试

Google 实习面试一共会有两轮,两轮都是 45 分钟。视情况也许会有第三轮,我没遇到。上海的同学会被安排 onsite 面试,也就是去 SWFC 26#。第一轮过了才会有第二轮,一般第二轮过了以后就是 Hiring Committee 将你的简历和面试表现与其他同学对比选优了,也就是排队。如果 Hiring Committee 过了应该就有 Offer 了吧~ 很遗憾我止步在了最后这个阶段,不过确实能进去的同学各项都比我厉害,输得一点也不意外。嗯其实主要还是算法好久不写了,现场花了好久写不是那么难的算法,表现不佳呢。

吐槽一下,高峰时段(比如三四月)的话 HR 往往不会安排在一天里进行这两轮面试,而是可能隔了一周,等待时间略长。另外这对于要 onsite 的同学比如我来说几乎就是两天没了。

关于面试内容,根据我了解的情况,几乎一定会有一轮或一轮以上的算法面,当然我也不例外… 个人感觉难度是 LeetCode Medium 中上级别,涵盖动态规划、搜索等。如果你的工程能力很强,也许不会全是算法面,像我第一轮就被问了一些和信息安全(含密码学)和分布式相关的比较实际的问题。当然这些问题是在实际场景下的,可以体现你对各种知识的了解程度。当然是了解得越多越好,知道得多一定是没错的。

关于面试形式,算法题是要 show code 的。onsite 的话会要你当场写下来,Google Shanghai 不是所有办公室都有白板所以很有可能给你一张纸要你写代码。听说运气好的话会给你 Google Doc 写代码,这个就相对简单一些了。

务必:时刻和面试官交流你的想法和进度,这样即使写代码时间来不及,面试官也能把握到思路。如果思路没问题的话也许会酌情再多给你一些写代码的时间。

Microsoft 实习面试

过了笔试的话,会收到面试安排。在上海或者周边的同学也是会被安排 onsite 面试,位置是闵行交大隔壁的紫竹科技园,位置略偏远,建议地铁下来 Taxi 过去反正就是起步费的价格。面试先后好像是按照笔试成绩排的 :P 成绩特别好的似乎面试时间比较靠前。

Microsoft 会在一天内安排三轮面试(视情况可能有第四轮)。三轮都面完后,个人推荐继续在等候室等待,因为可能在半小时内就能知道各个面试官给出的评价了(是否 hire)。你就可以知道你是一定不会收到 offer,还是可能过几天收到 offer,或者是当场收到 offer。如果三个面试官都是给出 hire 评价的话,你就有很大几率拿到 offer 了。

为什么不是「一定会收到 offer」呢,因为可能有很多个 candidate 都是 3 个 hire,那么在名额有限的情况下最后还是会优中选优的。这个时间似乎是一两周左右,与谷歌的走 hiring committee 情况类似。当然如果你有一轮或两轮表现不好,大概就没机会了。

有一点不好的事,MS 只对给 offer 的同学发通知(HR 解释说因为人太多了忙不过来)。因此我猜,如果两周后还是没收到 offer ,大概就没戏了吧。不过我是当场获得 offer 了 :P

面试内容因人而异。我同学四面全是算法,据说面了高精度计算和链表之类的问题,我猜测就是网上那些很经典的裸的算法面试题吧,比笔试简单。而我则是两面工程+简单算法,算法简单到都是模拟题,让我很意外很开心 :P

这个故事告诉我们,如果你的算法不是很厉害,千万别在简历中表现出算法拔群。当然,如果简历上除了算法获奖就没有其他可以写的了,那还是写上比不写好。我由于简历中写了「对中型网站架构有一定经验」,前两轮被轰炸了好多涉及到分布式、可靠性、架构方面的工程问题。这个在我的意料之外,看来我之前对于“中型”的理解不正确,差点坑了自己,幸好没写“精通”。

面试时候写代码当然也是要写的,微软有一点好就是办公室都有玻璃板,所以可以很方便涂改 :-) 时刻和面试官交流想法仍然是很重要的。我觉得这种形式的写代码(同样适用于谷歌)都是以可读和准确为目标的。准确不用说了,需要做到 bug free。面试官都是很厉害的,可以一眼看出问题。写出有 bug 的代码没关系,如果能在面试官提出之前主动指出问题也很好。

可读性是我想特别强调的,比如一些很琐碎的没有什么很大价值的实现细节就可以写一个函数名替代。这样做有几个好处,一是提高了可读性,二是节约了时间(这些函数不是很关键,所以时间来不及的话可以口头叙述给面试官而不需要具体地写出来,反正就是多写几行代码的事情,大家都懂)。一切的基础是面试官能在有限时间内读懂你代码。

结论

准备走算法路的同学可以不用看我写给偏工程同学的结论了 :P

虽然我的 Web 前端是最得心应手的,但我发现这俩公司的几轮面试都没问到,当然主要原因还是因为招的不是前端工程师吧!(谷歌是这样的:虽然进去以后也许会安排做前端的工作,但面试是按统一标准来的,所以不会管你前端什么的好不好)当然这还是个追求问题。比如说作为一个前端狗,不要只懂前端,不要只懂轮子怎么用,这种纯粹的搬砖能力我觉得是没什么值得赞扬的。掌握很多领域的知识一定是有益的,这对综合能力有非常大的帮助。并不需要样样精通,但至少要了解,要有眼界,这对于写出高质量的代码非常有帮助。比如,用 MongoDB 的时候,你了解过它的分布式实现吗?用 nginx 时候,你了解过它的高性能网络模型吗?对密码用 MD5 散列的时候,你了解过密码学其他算法吗?用 PHP 时候,你了解过 HHVM 是什么吗?用 NodeJs 时候,你了解过它的异步机制吗?不知你对这些问题是否感兴趣,反正要是有足够多的时间我想学个遍 :) 以及从 fact 来说,这些“扩展性的”,“琐碎的”知识在面试中几乎全用到了。

我不推荐临时“应试”面试,实在要应试的话就多分配时间。比如微软面试前一天我还在欢快地写其他项目没做什么准备,面试就这样自然而然地过了。比如我知道谷歌会面算法而自己算法是薄弱项,于是面试前刷了一周的 LeetCode ,然而其实没什么用,这对能力提升是有限的。当然如果准备几个月来刷题应试,是能起到一定作用的。

最后,祝大家收获如意的 offer!

Comments