谷歌(油管)iOS面试

本人背景:美国不知名大学气象博士+1年微型Startup做iOS开发+2年家庭煮夫(等待工卡)

猎头在linkedin上联系了我约了打电话。打电话时我说我最近两年家里蹲,当时明显感觉他有些犹豫,不过在听我说有Facebook的Onsite之后还是决定给我个电面。。。。

电面:白人小哥,迟到5分钟,寒暄了几句,马上开始在google document上做题。题目大意是生成5组Bingo游戏的随机数字组合,每组数字好像是5个,不能重复,而且数字范围是有限定的。由于本人没有玩过Bingo,小哥在说明和解释过程中又非常节省词句,导致一半时间过后我还没有问明白这题要我干啥。小哥实在看不下去就提示我从Swift的rand(range:)函数出发,我就顺着思路往下做,但当时压力已经爆满,大脑懵圈,没有想到最优解法避免重复数字。感觉小哥后面已经受不了了,时间一到赶紧说给你几分钟问问题吧,我就随便问了几个就88了。挂了电话后,我看那个document没关就继续想最优解法,突然就想出来了,赶紧把我之前的code改了下。刚改完就发现那个document被关了。

我心想就我这灾难表现肯定没戏了,但没想到原先那个猎头把我转给了另外一个猎头。新猎头联系我说我的表现不算太糟糕,如果我能找到内推就可以给我安排Onsite,我说我没有和Google里的人一起工作过找不到内推,我又说我刚Onsite完Facebook感觉不错,现在再面Google有点晚了,他一听就说我马上给你安排下周一的Onsite。。。。。

Onsite:5轮,每轮45分钟

第一轮:白人大哥,视频面试。Onsite居然还是逃不过google document。。。面试官让我写一个函数把各种变量(dictionary,array,string,primitives)转为JSON。在面试官的提示下写了两个递归函数完成。面试官又问,能不能用更Object Oriented的设计来做,我说那把这些函数放到Dictionary和Array的extension里。面试官说extension是不错的idea,但是你的数组和dictionary都用到了Any来代表所有可能的类型,能不能用更type safe的设计来做,在他的引导下我说可以自定义一个Jsonfiable的protocol,让所有可以转为Jaon的type都conform这个protocol,然后原来用Any的地方可以用Jsonfiable来代替。

第二轮:ABC或其他亚裔小哥,给一个字符串,如果有连续三个或以上相同的字母,这些相同字母组成的子串就称为这个字母的extension。找出这个字符串里所有extension子串的起始位置。写完后这小哥觉得我写的不对,搞了半天结果是他漏看了一行,耽搁了不少时间。接下来他又问,如果有一个字典,其中的词条全是没有extension的字符串。如果给你一个有extensions的字符串,其中每个extension子串有可能简化为1个字母或2个字母(比如aaaa可能简化为a或者aa),判断是否这个词典里包含这个字符串所能简化成的字符串,比如bbbbaaaa可以简化为ba,bba,baa,bbaa。思路得到认可,但没有写完。

第三轮:疑似印度或斯里兰卡小哥,问了iOS hittest的算法。给一个view,里面有一堆subviews,每个subview还有subviews,返回触摸发生时应该返回的响应view。写完后小哥问,如果有个subview看起来是在top(z index最大),但实际属于较低层的sub hierarchy,当触摸这个subview时会怎么样。我说这时候不会返回这个subview,会返回这个subview底下的属于较高层sub hierachy的subview。小哥又问,在Google他们从backend生成view model,iOS app依赖于view model里的信息显示view,问后端生成的这种view model 应该有哪些properties。我就说每个view model里面会有x, y, width, height 和 view models. 小哥表示认同。

第四轮:疑似国人小哥或ABC,先问了我以前工作中debug过的最难的bug。我说了一个thread starvation引发dead lock的bug,如何发生的和如何解决的。然后小哥问了一个偏设计的题,插入和查找Youtube视频里的字幕。我说用balanced binary search tree,这样操作都是log(N)。小哥认可。然后写码实现插入和查找(假设有现成的BBST可以用)。写的过程中我说了句我写的code不是线程安全的。他就接着问有什么办法保证线程安全,iOS里lock都有哪些,NSOperation和GCD的区别。然后又问多个用户在不同device上同时给同一个视频插入不同时间的字幕,如何在后端保证线程安全而且这些字幕都能被插入。最后一问答得不好,现在想想可以在后端用类似serial dispatch queue的机制一个个执行这些requests。

第五轮:白人大哥,又又又是视频+google document。。。。大哥先问了swift里的inout关键字是干啥的,又问了Swift里的内存管理机制。然后他说开始在document里做题吧,然而他却找不到猎头发给他的document。。。。花了两三分钟找到了,然后出了一个偏设计的题,按照他给的API实现sorted logging system。具体细节我想不起来了,反正我问了两次才大致搞清楚要我干啥,说了思路他没有反对我就开始写。写到中间有人敲门进来说他们要在那个屋子开会,让我另找地方面试。我这面试小白哪见过这种情形,瞬间石化。好在大哥通过视频帮我怼回去,让那人另找地方开会。然后接着写,写完了他看了下说你的算法没有完全实现我的需求,给我解释了下,可惜我还是没听明白,他说时间到了,就88了。

很明显,Google的面试不管Behavior,就考算法+设计,而且特别喜欢follow up。我面完感觉表现一般偏差,心想肯定没戏了。没想到第二天收到猎头邮件说我的面试反馈总体positive,又要让我找个内推来提高过hiring committee的机会。不得不说这个猎头的效率真是杠杠的!当天下午我收到Facebook的offer,然后我就跟这个猎头说我打算签Facebook了不打算继续了。

Freelancer的经历,很多公司很喜欢,尤其是可以自己做成东西的,这说明能力强。这个猎头很赞。

恭喜楼主了

卧槽楼主这波操作six six six six

我却,神奇的经历,牛逼的猎头,这么说突然对找工作了有了一个新的思路啊…屌屌屌

面G之前就已经决定只要有F的Offer就会接F的。最主要的因素是想报答一开始联系我的猎头。她联系我之前我根本不敢想我能去FG这样的顶尖公司面试。很多猎头一听我说在家里待了两年就说不合适,她没有据我反而帮我改简历让我把这两年的经历写成是在家里Freelance做自己的Apps,这样就没有gap了。后面G的面试机会很大程度上是看在我有F的面试才给的。可以说,这个猎头是我的伯乐。