微软面试

@2013-03-26

今天去STC面试了,说说自己的感受吧。

这次面试加上电话面试者的话,就一共有6个interviewer了。但是我觉得interviewee真的不用担心人多这个问题,因为每个人问的问题之间基本上没有关系,不是像我开始想象的那样问题难度逐渐深入。每个interviewer基本上都是从头开始问问你的项目,然后深入项目问问一些具体细节,然后让你做两道算法题目。除了最后面试我的大大,这个细说。

接受face2face面试之前会先做一道offline的算法题目(我觉得就是两个排序链表去重,反正非常简单的那种),然后电话面试因为空间原因没有办法让你写代码,也只能聊聊项目,稍微深入地了解一下细节。

第一个面试官是接待我的人,一个年纪比较大的叔叔。和我扯扯项目,让我说说我的itachi(注:一个自己写的玩具网络框架)有啥出彩的地方。注意一下 ,这个问题会经常问到,通常来说项目要不就是帮助别人解决了什么问题,要不就是自己觉得有什么亮点。聊了一下异步编程,线程模型,锁,然后让我做了两个题目。一个是permutation的实现,好歹我还是有点基础的。我的代码面试官没有看懂,但是好彩他觉得自己理解了并且认为我是对的。一个是写一个Stack ADT(这个简单)。

第二个面试官是一个小胖,不断折腾自己的surface和wp。上来就给我出了一道比较麻烦的 查找非重复数字 算法题目,一开始这个问题我解决出来了,但是他稍微扩展了一下之后我卡壳了,不过好在他的指点下我摸索出来了。然后他又给我一道看上去有点像ACM的算法题目 水池最大蓄水问题 , 我按照自己思考的方式给出了一个O(nlgn)的算法,在他的稍微提示下面给出了O(n)的算法。然后小胖问我了一个indexserver如何partition url这个问题,工程问题觉得难不住我,range-based 以及 consistent-hashing partition 各自给出了优劣对比,我觉得小胖应该还是心满意足的。

第三个面试官是一个姐姐,是在docid indexer工作的,她先接我去西餐厅吃了个饭,然后回来面试我。我先和解决说了自己infpack项目是如何比protobuf节省存储以及带宽的之后,姐姐看了我的itachi轻松跑满网卡,便向我咨询她们一个组件中网卡没有跑满的问题。他们用的是单线程从disk中读取文件传输到网络,同步协议,你说怎么能跑满?我便给她计算了一下这种工作方式做好的传输效率是多少。姐姐继续问我要是修改需要多少代码,我说1k-2k左右,如果有框架大概500左右。然后姐姐又问了我一个手机键盘输入法的问题如何来组织存储结构,最后结论是使用按照数字组成的trie-tree, 然后对于30w的短语完全可以保存在内存中。然后姐姐又让我写了一个递归算法问题,比较简单所以不值得说。这个程序姐姐又没有看懂,但是也是好彩她觉得自己理解了并且认为我是对的。

第四个面试官是一个比较大的叔叔,上来让我又做 查找非重复数字 的扩展问题。因为之前已经被小胖问过两次这样的问题,寻思思路应该八九不离十吧,所以按照之前的思路思考(思路完全错了),给了叔叔两个错误的方案都被叔叔发现了。我觉得几乎都快放弃了,还好我坚持了下来。最后我盯着那一串bit,终于找出正确的算法了。看上去叔叔也很高兴。之后叔叔又聊了一些项目的事情,就去叫大大了。这件事情给面试者最好的教训就是:“面对困难,坚持不要放弃”。

大大出来了,把我叫去自己的办公室了。去他的办公路上,我心里就在想,这么一个open环境有自己办公室的人,肯定就是大大了。满心欢喜地以为大大叫我进去告诉说:“你今天表现不错,能力也很强,我们需要你” 这样激动人心的话,可是我错了。要是大大真的说这句话,我觉得今天面试一半的价值就没有了,是大大让我这次面试感觉体会很深。

该说大大了=D。大大来的第一个问题就是“你觉得为什么有MapReduce?相比SQL它有什么好处?”,对于我来说,我觉得这根本就不是一个问题。MapReduce和SQL根本就是两个层面的东西(未来的我:我估计大大希望你说说MR和MPP的关系),MapReduce是executtion engine, SQL是declarative engine. SQL可以说是atop of MapReduce, 对于SQL来说底层完全可以换成Shark或者是Spark,或者是Storm这样的执行引擎,而对于MapReduce来说上层完全可以替换成为Pig,Hive,Sawzall这样的描述语言,这根本就是两个东西有啥好说的?所以我就随便说了说MapReduce这个东西就是一个计算引擎适合用于并行完成,并且是一个比较通用的计算模型。很明显大大不满意,大大开始给出列出了SQL起源,然后给出4个维度programability, performance(latency,throughput), scalability, accurancy(我觉得这个几乎没有意义啊?) ,然后分别产生MapReduce是如何在这写tradeoff上面产生出来的。大大觉得自己说得很舒服,并且讲到了point上了,可是我觉得大大等于没说。大大来的第二个问题就是”你在单位和别人有过技术上比较大的分歧吗?有过什么比较大的争执?“,很明显这个问题是接上面一个问题的,这个东西我也没啥说的,我是觉得很多设计上大方向是没有太大偏差的,讨论的都是一些相当细节的问题,而这些细节的问题完全只是personal taste罢了。看得出来大大非常失望,两个问题之后就没有什么问题。我也了解到,问到这个份上,也没啥好问了。在他看来我是一个不会站在high level看big picture的人,并且在technical point上面也不善于做argument的人,而这是大大需要的(??)。面试就这样结束了。

其实这次面试我不care结果,比较享受这个过程,主要是为了能够给自己定位更好的方向,找到自己的弱点。很明显这次面试对于来说是很有收获的,我觉得我找到了自己的弱点。面试之后我和原来同事(现在在STC)出来聊聊,他说在MSFT里面做人比做事情重要,而且中国现在和美国现在争夺资源比较严重,因此英语好并且善于争论的人是稀缺资源。同事这句提点更加坚定了我对自己未来的看法。多谢同事,也多谢这次大大指点。