Google 的面试流程

在 Google 工作有一段时间了,是时候和大家分享一下 Google 的面试流程,以方便广大求职的同学参考,也顺便给 Google 打个广告。

Google 有一个全球统一的招聘网站:Google Careers。里面不仅有空缺职位的介绍,还有 Google 在世界各地的办公室的介绍,比如这个是我所在的苏黎世办公室

前期准备

在申请 Google 的工作之前,最好对自己想做的工作和对未来的团队有一个期望。比如自己想从事哪个方面的工作,前端还是后端,网络服务还是客户端软件,团队在美国、欧洲或是中国。尽管不论你的目标团队是什么,面试的难度和流程都是统一的,但毕竟将来你要和你的团队长期协同工作,选一个自己喜欢的产品和团队,何乐而不为呢,对吧。

除了选职位之外,面试的基本工也不可少,去 LeetCode 温习一下算法题吧。

递交申请

你可以通过上述的招聘网站递交你的简历,也可以找正在 Google 工作的朋友帮你递交。当然,后者是有好处的,下面会提到。对于应届的同学,也可以留意一下各大高校的招聘活动,应届招聘的人数较多,多数会有统一的线下安排,效率比较高。

面试

面试分为三种:笔试、电话面试和现场面试。

笔试通常是针对应届毕业生,由于人数多,HR 没有办法一个个打电话来面试,只好统一进行笔试。

电话面试,如果你不慎错过了笔试,并且 HR 又看中了你的简历,或是对于社招的求职者,那么你将接到至少一轮的电话面试。电话面试通常需要写代码,如果条件可行,可以通过 Google Docs 实时交流代码;最不济的情况,则是在电话中口述。这个阶段中,HR 也会打电话过来了解一下你的背景,咨询一下你中意的产品和团队,以及你在 Google 有没有认识的朋友。

现场面试,电话面试(或笔试)通过之后,你将会收到现场面试的邀请,地点一般会选在离你最近的办公室。现场面试至少有四轮,每轮一小时,几乎全是技术面试,要求在白板或者纸上写代码。由于内部规定,这些代码会被记录下来交由招聘委员会审阅,所以在白板上写代码的时候,你可能会注意到面试官在积(mang)极(lu)地抄写你的代码。如果面试期间碰到中饭时间,会有面试官带你去吃中饭,顺便感受一下传说中的免费午餐 :P

面试结束之后不会立即知道结果,即使主动询问面试官或者 HR,得到的回复一般都是“等通知”。

审核

所有的面试结果会交给招聘委员会(Hiring Commitee)进行审核。与此同时,HR 会发信给 Google 内部可能是你以前同学或同事的员工,要求他们写评价。这些人的评价也会一起交给招聘委员会作为参考。这时就能体现出之前提到过的内部推荐的好处了,至少有一个人帮你写了评价,聊胜于无。

招聘委员会审核通过之后,结果会交由 Larry Page (和他的团队)过目。是的,你没有看错,CEO 会亲自审阅你的资料。

讨论合同

上述的审核通过之后,HR 就会开始准备发 Offer。它实际是一个套餐(Package),套餐中注明了基础工资,奖金的比例,入职时的股票奖励等。你可以多多少少谈点条件,当然,大公司有着成熟的等级体系,可商量的余地不大。如果你需要搬家(Relocation),Offer 中会包含搬家的补贴,或许会有一个中介(Agent)来协助你完成搬家的过程。

签订合同和入职

最终会有一堆的文件寄给你,一份一份签名之后再寄回(或交予 HR)。

签完合同之后就等着入职吧。这段时间里,你可能需要办签证、搬家等一些琐碎的事情。由于美国签证名额的限制,H1B 签证现在实行的抽签制度,约有三分之一的概率签不出。如果发生这种情况,你可能需要重新签一份合同,并前往另一个地区的办公室,等待最长可能有一年半的时间,再去美国。这个过程称为 Parking。Parking 的地点可以和 HR 商量,比如瑞士、加拿大或者其它地方。为了避免这种尴尬的情况,你也可以不选择美国的职位,其它地区也有很好的办公室和职位。

试用期

和多数公司一样,入职之后的三个月是试用期,试用期内可能会因为能力不行而被解雇。当然这是小概率事件,大多数新员工都可以顺利度过试用期。在试用期满之后,推荐你入职的同学/朋友,可以得到一笔奖金,金额视你的职位高低不同而略有差异。到时候就找他/她请客吧。

完成整个流程之后,恭喜你,你已成为一名 Googler。如有什么问题或者想加入 Google,可以私下联系我。

中文交流中夹杂的英语

如果你经常关注本博客,你可能会发现,超过一半的博文标题中都夹杂着英文。对于英文不太好,或者非业内人士,这样是不太友好的。他们可能一句话都读不顺,看文章很累。我个人不太喜欢这种风格,但作为一名程序员,这种情况又是几乎不可避免的。

大概二、三十年以前,外来语都要先翻译成中文才可以使用的,比如沙发(sofa)、巧克力(chocolate)、坦克(tank)等,连品牌也不例外,肯德基(KFC)、星巴克(Starbucks)、惠普(HP)等。这样人们在交流中不需要用到英文,降低了社会对英文的依赖,也保证了中文的纯洁性。但是近几年,外来语越来越多,已经到了来不及翻译的程度,有一些官方没有给出中文的,比如 H&M、7-Eleven 等,还有一些在年经人中很流行,懒得使用中译版本的,比如WiFi(无线网络)、Cappuccino(卡布奇诺咖啡)等。

而在 IT 行业中,有一点历史的词汇可能大家都习惯它们的中文译名,比如微软(Microsoft)、个人电脑(PC)等,但很多新词都还停留在英文阶段,比如 Java、PHP、HTTPS、Chrome 等。在和同事的日常交流中,总免不了需要涉及到这类词汇,于是谈话中就夹杂着很多英文。举个例子,我以前的一个老板,美国人,号称要学中文,于是约定每周的周五大家都说中文,帮他练习。在测试中有一个常见术语叫“file a bug”,“bug”指软件的缺陷,“file”作动词表示汇报/登记,“file a bug”就是在系统中登记一个“缺陷”的信息,以便让开发人员去修复。但是在实际使用过程中,大家都还是觉得英文比较好用且大家都能接受,于是我老板的中文就说成了“file 一个 bug”……这中文学了等于没学……

这种现象的出现,主要是因为美国输出的技术非常多,不仅是IT词汇,生活工作中的各方面都可能有英语的踪影,比如计算机领域的快捷键 Ctrl+F,对我们来说只是一个按键组合,但实际上它表示 Find(查找)。当然这个是世界性的问题,其它非英语国家也都正在被英语入侵,多数国家要么拿来直接用(拉丁语系),要么粗暴地译成本地语言(非拉丁语国家,如日语)。据我所知,除了法国之外,也只有中国在努力规范外来语。很多年前,我们国家的确有非常优美的翻译作品,比如“若为自由故,两者皆可抛”,但那是诗作,计算机行业就没有那么多文人雅士了,翻译质量低下,比如“鲁棒性”(Robustness)、“句柄”(Handle)、“缺省”(Default)等。译者自然看得懂并理解原文的意思,但看译文的读者和学生们就云里雾里了。又因为那些“经典”译作的销量之高,这些翻译就这么被传下来了。这些拙劣的翻译,影响了计算机学生对技术的理解,也从而阻碍了技术的传播,于是有越来越多的人建议:技术书籍请看原版。看原版固然不错,但这也进一步阻碍了计算机知识的汉化进度。于是就产生了本文开头所描述的现象。

为了解决这个问题,本博客会尽量使用中文写作。当出现无法翻译的情况时:

  1. 如果是品牌名称,且没有官方译名,则保持原名,如 WordPress;
  2. 如果是术语,则使用广泛接受的中文译名,如“电子邮件”,当没有普及的中文译名时,则按上下文选择最合适的一个,并加以原文注释,如“域名转向(Domain Forwarding)”。

当然,那些劣质的翻译要尽量避免,比如 Robustness 可以译成“强壮性”、Handle -> 操作符,Default -> 默认等,希望这样能逐渐提升中文技术词汇的普及程度。

程序员是如何约架的

近日知乎上有人问起谭浩强的口碑如何,然后引来一群人黑他,然后又引来一些人说他老人家年纪都这么大了,能写本书也不容易云云。再然后就两个人程序员因为这事吵了起来,吵到要约架的程度了。详见下图。普通约架去公园,而他们约架……去GitHub……

科普一下,谭浩强的一本书《C 程序设计》是C语言入门的经典读物,大学里教C语言全靠它。

再科普一下,GitHub是一个在线的代码托管的服务,由于大多数程序都是由多人合作完成,这种在线的分享协作模式在程序员中很流行。

不过据说后来吵架的一方怂了,没有去GitHub创建repository,原作者也关闭了评论,后事如何还真不知道了……不过这件事也开创了用GitHub约架的先河,已经有人建议开发相关程序了……

Windows还是Linux

先交待一下背景,大学期间,除了课程需要和比赛之外,我基本没有用过Linux。对Linux可以算是一点都不了解。狗屎运的是,毕业后第一家公司对Linux也没什么好感,第二家公司是做广告的,对Linux知识要求也不高。于是就这么稀里糊涂地混了好几年。所以以下言论你可以认为是一面之辞。

言归正传,在大学里需要学习Linux吗?或者再深入一点,需要用Linux来替代Windows吗?

简单来说,完全没必要。除非你打定了主意以后开发Linux软件,或者从事Linux相关行业(我也不知道有没有这类的行业),那可以从大学的时候就开始准备起来。如果你还不确认以后会做什么,或者根本不知道Linux和Windows有什么差异,那基本可以不用专注于Linux,因为两者没什么本质差别,而日常使用显然是Windows有优势,比如国内的网银客户端。

那么为什么似乎身边的同学都对Linux情有独钟呢?我刚进大学的时候,有个同学一脸羡慕地跟我说,"某同学可以自行编译并安装SuSE"。好吧,当年我连SuSE是什么都不知道,装个Windows也需要光盘而不是用硬盘启动那么高深的技能,就更别说“能编译一个OS”那么牛逼的举动了,要知道有一票人连"Hello World"也编译不过……不过回过头来仔细想一下,会装个系统有什么了不起,安装程序是别人写好的,那同学只是按着说明书操作一下罢了。真正牛逼的不是跟着说明书走一遍,而是发现说明书中不合理的地方,然后尝试去改进它。多数人只是止步于如何使用,而不进一步研究一下内部的状况,从何想想如何改进。

回到Windows和Linux的问题上,从操作系统的角度来说,这两者没有本质的差别。操作系统发展了这么多年,该有的大家都有,就大学期间需要掌握的程度,学Windows和学Linux的效果是一样的。只是Windows对于日常使用更方便,所以没有必要在艰难困苦中自欺欺人,大学生活有很多更有意义的事情等着你。

为什么学计算机的同学都讨厌修电脑

基本上每个专业的同学都会碰到类似的问题吧,比如学英语的同学会碰到“不看字幕能听懂吗”“听不懂”“这么多年都在读什么书”之类的问题,只是电脑在日常生活中比较常见,所以计算机专业的同学碰到这类事情的机率比其它专业要多得多。

这个问题的原因,简单来说是术业有专攻,不是所有计算机专业学生学的都是“修电脑”,大多数同学在读完本科之后,依然不知道如何修电脑。

所谓“修电脑”,多数是指电脑出现问题了,无法正常使用的时候,尝试解决所出现的故障。故障的原因不外乎三大类,硬件问题、软件问题 和 软硬件结合的问题。

硬件的知识,在计算机专业课中涉及得非常少,除非自己有兴趣研究,一般学生和普通人一样,是不懂这方面知识的。即使辛辛苦苦读了四年大学,还是不懂。而电脑硬件故障的时候,即使懂一些硬件知识,也是很难维修的,因为电脑硬件的复杂程度已经远远超过用电烙铁、万用表能修的范畴了。通常能做的事情只有重新插拔一下、换一个新的部件试试之类的方法,这种方法一般人都会。

软件故障,听上去像上计算机专业所学的内容,其实也不然。全世界有成千上万的软件,一个人不可能每个软件都熟练使用,即使是最常见的Windows,多数人也只处在一知半解的状态。软件故障的原因,通常是由之前的误操作导致的,这样就不仅需要维修人员有软件的知识,还要有一定的交流能力,从而分析出可能的故障原因,才能对症下药。所以出了故障,除非之前碰到过同样的问题,一般都需要花至少几个小时才能解决。这还是只在能接触到电脑的情况下,更别说那些只是电话求助或者网络求助的了,解决的概率非常之低。

软硬件结合的问题是指,比如硬件是A,而软件认为硬件是B,其实软件和硬件本身都没问题,只是它们之间没法交流了。这类问题出现的机率比较少,也通常可以搞定,但也需要在能接触到电脑的情况下。

总之,修电脑没有多数人想象中那么容易,请对身边修电脑的同学好一点。

最后引用一句经典的回答:如果你是萌妹纸,大多数同学都不会介意帮你修电脑的。

在家工作是怎么回事

这个要从最近一件闹得沸沸扬扬的事情说起,就是Yahoo禁止员工在家工作,不能遵守这项规定的员工会被要求离职。

在家工作(Work from Home,简称WFH),是指员工可以看照实际情况,选择在家里工作,以提高工作效率。由于行业的特殊性,部分IT企业的员工在家里和在公司可以完成同样的工作,也就是工作不受地点的限制。于是公司允许员工在特殊情况下,可以在家里工作,并不会受到处罚。我的老东家新东家都是很开明的公司,我有幸体验到了这一非常吸引人的待遇。

需要在家里工作的原因有很多,主要是因为去公司不方便。举个例子来说,在上海,你家住在五角场,而公司在闵行外环外20公里的地方,上下班乘地铁单程就要2个小时,公司班车可以把时间缩短到1个半小时,来回就是3、4个小时。如果早上发生了一些事情,比如煤气坏了等人来修啦、一大早电话会议啦、儿子生病了要去医院啦、老丈人从外地来上海要去接个机啦……等等之类的事情而导致没赶上班车,而又不高兴搭车公共交通去公司,就可以申请在家工作。道理很简单,做完上述的事情可能半天就过去了,而去公司在路上又要花费4个小时,如果拿这个4个小时来工作,能完成更多的任务,这样老板也会满意的。在日常生活中,这类阻碍员工去公司的事情很多,于是在家工作就成了习以为常的事。

在家工作有它好的一面,通常来说家里的环境更舒适,早上可以睡个懒觉、用不着去食堂排队并且忍受口味恶劣的食物、可以获得一定程度的隐私权,等等等等。对于提高员工的工作效率有积极的效果。

当然它也有不好的一面,简单来说,在图书馆看书要比在家里看书的效率高(这是为什么图书馆会有很多座位的原因),类似地,在公司工作要比在家里工作的效率高。在家里工作,舒适是舒适了,但也有了很多使人分心的东西,比如电视啦、游戏机啦、猫猫狗狗啦、隔壁邻居啦等等等等。另一方面,公司里提供了更有利于工作的设施,比如更快的网络、更强大的机器等。这样的差距就使得在家里工作的效率可能连工作的一半都没有。

在把效率作为业绩评估准则的公司,多数员工会想着尽量提高自己的工作效率,于是体验过一两次在家工作之后,肯定会尽量去公司工作,从而赚到更多的工资和奖金。但是,人都是会变懒的嘛,在家工作毕竟是舒服的,于是就会有一部分员工热衷于在家工作,于是也就有了Yahoo的新规定。

至于这项规定的效果如何,让我们拭目以待……

百度之星 2010 题目篇

今年的百度之星改进了许多,比如可以使用百度的 ID 注册,而不需要另外再注册一个 ID。可能已经受到高层关注了吧,因为之前的几次有传言说公司高层并不重视,组织比赛的人员只能在业余时间加班加点,比赛的质量也有所下降。不过今年依然没公开测试环境的具体参数,没公开复赛的具体成绩,虽然这些数据不重要,但我依然希望有“知情权”。另外中文数据还是用 GBK 编码,好像从第一届开始就这样,而不是用 Unicode,公司内部标准?

废话不多说了,直接说题目吧:

初赛是一个对战类的游戏,给定一张地图,双方各用 5 辆坦克来争夺资源,先抢到一定资源的一方获胜。坦克有 3 种类型,Sniper、Striker 和 Pioneer:Sniper 血少但射程长,比自身视野都要大 1,于是就产生了一种策略“盲狙”;Striker 攻击力强,射程一般,比较中庸;Pioneer 血硬射程短,适合快速突破对方防线。常规的思路是计算坦克与资源点之间的二分匹配,在最短时间内抢到尽可能多的资源点,并沿路攻击敌人。这种模式配合 Striker 的攻击力,加上一点点优化,可以达到比较优的抢资源速度,但这样就用不到 Sniper 的射程优势了。于是有人提出了预测的算法,简单来说,大家都用二分匹配(或者某种贪心算法)的话,坦克都是以最短路径去资源点的,一旦知道敌对坦克的坐标和时间差,就可以猜对敌对坦克的坐标,只要进入了 Sniper 的射程,无论看见与否,可以直接射击。于是为了反预测,就要在行进过程中加入一些随机扰动,或者在预测到下一步会被击中的时候停止移动,不过这样会进入僵持状态,在落后的情况下,这样是很致命的。

由于初赛是前 2000 名晋级,并且我没多少时间可以用来调试算法,就简单写了一个二分匹配交了,心想应该没 2000 个人能写出预测的,果然晋级了……

复赛是传统的百度之星模式,两场,每场 5 题 8 小时前 20 名晋级。题目在这里:/

复赛第一场:

  1. 蜗牛:简单的 DP,递推天数累加就行了,要注意的是结果有可能是大数。
  2. 午餐聚会:当时没想出来怎么做,随便猜了一个规律-_-
  3. 猜猜你在哪儿:一道交互题,随便搞了个带阈值的随机投点,效果一般。
  4. A+B 问题:在这题上消耗了起码三个小时,中文数字和阿拉伯数字互转实在太麻烦了,这题基本没难度,就是看细心程度。
  5. 并行修复:没想法,也没时间写了,直接交样例-_-

复赛第二场:

  1. 内存碎片:我的算法是把请求按长度排序之后,划分成 K 部分,使得总数最小。纯递推的复杂是 N*N*K,显然太大,观察了中间结果发现有单调性,可以化简成 N*logN*K,不过只拿了 25 分,不知道哪里错了-_-
  2. 购物搜索调研:具体的推理忘记了,好像是要找出一段子序列中的最小值,于是想到了 RMQ,不过只拿到 30 分-_-
  3. i-Doctor:据说是 Bayes 公式,概率学得不好,随便写的-_-
  4. URL 规范化:纯模拟题,考细节的,辛辛苦苦写了三个多小时,0 分>.<
  5. 玉树驰援:题目很长很复杂,就没怎么看,也没做……

复赛依然延续着我做 Astar 的规律,不管怎么做,第一场的分数总是比第二场好,下次不参加第二场了-_-

决赛是植物大战僵尸的简化版,题目在这里。时间 8 小时。我上手就选错了方法,尝试去写一下模拟器,然后通过遗传算法找最优解,事实证明时间完全不够,理解题目用了 1 小时左右,写模拟器用了 4 小时,而且模拟器 bug 很多,修完 bug 就差不多快结束了,真正的算法没来得及写>.<

最终就拿到一只熊,任务完成,咱也不奢望什么:P