缘起
在这个城市(北京)求学,恋爱,工作,生娃,笑过也哭过。十多年最好的青春都扔在这里了,也曾经以为会在这里终老。但丰满的理想最终不敌骨感的现实,帝都的房价和PM2.5完全无视地心引力,新高之后再创新高,无情的粉碎了我对这个城市的最后一丝幻想。
神州虽大,可需要码农的城市没几个,PM2.5和房价都不高的就更没有过了,无奈之下只好放眼海外,盯上了三面环海人少地多PM到100就觉得非常恶劣却需要码农的美利坚。加州硅谷虽然阳光灿烂且有Apple、 Google、 Facebook、Oracle等巨头,但人生地不熟且房价不菲。如果是十年前青春年少且光棍一条还可以考虑,如今娃都快能打酱油了,还是找一个熟人多的地方比较合适。这样就只有微软一个选项了。这些年原来的朋友同事们一个一个的出去,过去倒不愁太寂寞。
去年11月底和微软总部一朋友通过电话,了解了那边的生活状态,两年左右能买上房这一条还是很有吸引力的。至于那句有名的“好山好水好寂寞”我倒不放在心上,反正在国内也是宅男。定了回微软之后就有两条路可走,一条是直接投简历到美国总部,走H1B签证直接出去,另一条是先加入微软中国,呆够一年再通过L1出去。前一条虽然比较快捷,但没有直接面试国外职位和全英语面试的经验,有一定风险。后一条拿offer基本无风险,但等待时间要长一些。但咨询了STC的朋友,据说因为前两年transfer出去的人太多,现在policy规定必须呆够三年才能transfer,不能忍。只好选择第一条路。
简历与电面
于是开始准备简历,强烈推荐lynda.com上的这个课程”Create an Effective Resume”, 非常实用。基本信息哪些需要写,哪些不用写或不最好不写,如何确定简历中的关键字,如何使用行为动词,如何使用PAR(Problem-Action-Results)表述,如何写项目经验,如何格式化等等。
简历写完就托朋友内推。建议大家能走内推的尽量内推。起码能拿到一个电话面试的机会,不至于直接被HR过滤掉.这时已经12月中,正好走上美国圣诞季,一直没有消息。直到1月中才有两个电话面试,一个在collabedit上写代码,问题很简单。然后一直没有下文。问朋友才知道面试的不错,可那个组的lead已经去了facebook,悲催。另一个主要问了些搜索引擎架构方面的问题,没写代码。感觉也还成,2月一整月没有消息,3月初又一个电话面试,problem solving和搜索引擎架构,都不难。然后又一周没消息。已经快到4月1日申请H1B的时候了,我开始着急,发信给几个电话面试官催。最后一个面试官比较nice,帮我催了一下,HR很快出了interview的schedule, skype面试,因为时差原因,不能一天面试 ,要面两到三天,前两天每天Redmond时间16:00-18:00,北京时间8:00-10:00,第三天如果有的话Redmond时间16:00-17:00.
面试
面试第一天最悲催,和HR定schedule的时候美国还没有实行夏时制,北京时间8:00-10:00am对应美国西部的4:00-6:00pm, schedule上也是这么写的。于是我早上虽然5点多就起来,但一直没开电脑连skype,打算到7:30左右才上线。7点过几分被老婆催着开机上线,上了skype就见右下角图标在闪,点开了果然是面试官的消息,当时脑袋就嗡的一声,我还没换正装啊,时间也不对啊。没工夫再想下去了,接通视频对话,先问问schedule的事情,人家告诉我美国夏时制,时间早了一个小时。晕,1/52的机会被我给赶上了,真是好运阿。接着就是自我介绍,项目介绍。面试官对我现在的东西也没太多了解,就问了一下现在我们产品地位肯用户数怎么统计的。然后问了一下有没有machine learning相关背景,汗,搜肠刮肚才想到好多年前写过的一个黑白棋程序对形势的评估是用程序从几万局棋谱里学来的,扯了了一通。接着问Why bing. 其实我很想说在北京呆不下去了,可还是扯了些别的。然后一道problem solving的问题,两三分钟没有思路,突然想起在@陈利人 的微博上看见过一道类似的问题,用堆来解的。用堆试了一下,秒杀!下面是一道简单的编程题,可时间已经不多了,头上有点冒汗,没写代码,给个一个O(n)的解法思路,可是要扫描两遍数组。面试官又问有没有只扫一遍数组的。一时没想出来,就说面试开始的晚,时间不够了,一会儿写晚了发他邮箱。然后是我的提问时间,就用了准备的两个问题,你现在的工作是什么,主要的挑战又是什么,既可以了解将来的工作,表现出对工作和技术的兴趣,第一轮结束。
休息了十分钟,一个mm call进来,直接出题。热身题超简单,和mm澄清了几个疑点后秒杀。第二题是并发相关的编程题,给了个非最优解,优化时涉及到读写锁的实现,脑子有点混,没写出来。
第二轮结束后继续补第一轮的编程题。给了两个解,一个是扫描一遍数组的,加上注释说明了loop invariant,第二个是扫描两遍的。并且说了我偏向于第二个,因为易于维护,不易出错。
第一天面试就这样了,感觉很糟糕。
第二天早上7点第三轮面试,抽样问题,各种形式的变换,复杂度的要求,前面几个都很简单,看过《编程珠玑》的都能秒杀。最后在一个特定的时间复杂度要求下卡壳了,,半天没有思路,向面试官要hint,只说听到了,就是不理我,郁闷,接着自己想。突然想到这个和RMQ(Range Mininum Query)有点类似,就向tree的思路发展,搞定。
第四轮面试,一个简单的字符串问题的并发扩展,不难,只是漏了一种case,在面试官的提醒下迅速修复了。最后一个优化问题居然是改变字符串的存储方式,这个真没想到。不过应当不影响整体面试结果。
第二天面完,感觉比第一天好多了。
第三天早上起来先给HR发了封邮件确认今天还有没有面试,要没有,就是挂了。HR很快回了,说找了老大7点面。心里踏实了。老大通常比较忙,晚了十五分钟左右才开始。还是先自我介绍,然后,老大居然问了一个技术问题……完全没有心理准备。一般老大都是喝喝茶,聊聊三观。好在问题不难,很快给出了思路。老大接着要数学推导,倒也不难。最后代码实现,特别强调了要bug free,十来行代码,检查两遍也没什么问题,通过。然后被问了一个很尴尬的问题,你觉得你哪方面是专家?这些年做的事情太杂,linux到windows, hook API,crack到ASP.NET MVC , RoR做网站,搜索引擎到嵌入式设备,啥都做过,都是蜻蜓点水。说啥可能都会被老大challenge,就挑了一个比较偏门,被挑刺可能性小的crack说了说。老大也没难为我,就问了都用什么crack工具。事后在linked in上才了解到老大居然实现了win8上的memset/memcpy/memmove,比win7上快了一倍,悲催的又撞枪口上了。然后又被问了一次有没有machine learning的经验。接下来就聊签证和入职,尘埃落定。
原文转自:http://blog.jobbole.com/37758/