不够“聪明”——记微软PM笔试+面试
前天参加了微软的面试,作为一个整天写代码的程序员,心血来潮选申请的职位是PM(产品经理),结果坚持三轮面试下来,没有收到HR的通知,估计是悲剧了,大学也算是完整了,第一次尝到了被拒的滋味。但是这次面试的经历挺难得的,就像人生中的一节大课,想写下来记录一下。
前一段时间看到学校的微软的海报,于是回去很迅速的提交了中英两份简历,其实我对微软亚太研发集团并没有太多的概念,只是出于对微软的一种崇拜吧,特别是那句经典的windows开机每加快一秒就可以为世界节省10年或者更多的时间,在这样的一个公司工作应该是振奋人心的。
结果很快接到了来自北京的电话,说是要参加笔试。就是蓝桥杯java大赛的那一天,那天上午,真的非常不爽,因为最后三个程序写的一塌糊涂,四个小时下来很疲惫,我本身算法就是个弱菜,一股没参加过ACM的悔意涌上心头。下午回到学校,匆匆忙忙参加了笔试。
笔试的题目全是选择题,全英文的,很有意思,多选的了要倒扣分,满分100,考察的内容主要围绕算法的复杂度分析以及一些常用知识,比如不同的排序算法在不同的情景下的应用,还有就是一些计算机基础的,比如位运算,操作系统,栈操作,字符占位计算等。当然还有一些数学智力的题吧,最后一个题是一段读代码的题,不是很难,但是需要仔细。总体的感觉就是每一题都需要转动大脑。
过了几天,接到了邮件通知,要去香格里拉酒店参加面试(微软很大气,挑选了这么豪华的hotel面试),到了宾馆后,只有5个同学,HR给我们介绍了一下,这次的微软招聘流程,原来是从所有投递简历中,筛选30%参加笔试,然后选取了笔试成绩前30名的同学。突然发现这次面试的机会这么难得。心中也很紧张,其实我一开始就没有抱希望了,因为我申报的是PM,这次招聘的团队是bing研究所的,和别的公司不太一样的地方是,需要先面技术再面PM。
第一面是他们的老大peter,一个有白头发的大叔,开始和我聊了一下篮球(我喜欢打球),之后有谈到了一个以前做的非常水的项目,是一个选取公交线路的,他对我绘制折线公交线路很感兴趣,我和他讲了实现的方法,其实非常的简单就是数组保存了一些点的信息,有一个函数会判断两个站点之间是否需要绘制折线拐点,他说这样只适合小规模数据,有没有想过改进的办法,这个我的确有想过,也查找过google地图的方法,无果。但是google地图的路线应该是在服务端已经生成好的,因为他要快速的响应用户的请求。
之后就开始写代码了,他出了一个题就是说,有一个文件里面有很多汉字表示的数字,比如“五百三十二”,要我写代码,将这些汉字转换成阿拉伯数字,比如532.这个题目我大脑中的一个思路就是“自动机”,就是编译原理中用到的DFA,顺序的扫描一个字符串,一个个调用子函数,于是就按照这个思路写了,用的C语言。但是不知道当时抽的什么风,和peter说从后向前扫描(显然这个很不明智,比如五百二十和五百二十一就会出问题),他及时的提醒了我,我后来想这不是抽风,而是一种僵化的思维定式,因为大脑中要生成一个数字,我总是从低位开始计算。
写完代码后,给他讲了一边,他没有给出评价,而是把我的纸扣住了,跟我说“ok,现在你变成测试人员了,开始测试刚才的那段代码,你现在不知道那个程序是怎么实现的,写出你的测试用例”,这下我立刻尴尬了,每写出一个例子就很纠结,因为写的这些用例每一个都足矣把我刚才的程序搞崩掉,比如“二百一”,“五百一十三”,“二零零零”等等。。。。他笑了,我感觉自己真心悲剧了,但是这个过程让我学习了太多的东西,我的代码只能接收“正确”+“标准”的输入,也就是只能接收我期待的输入,才能有期待的输出。这无疑是一个失败的program。到这里时间大概过去了快一小时,之后又聊了一些关于研究生的事情,后来我才明白为什么。。。。
休息了5分钟吧,HR通知我参加二面,面我的是一个测试组的,很年轻,第一个问题就是用什么IDE,这个就是实话实说了,java用eclipse,C没有IDE,在linux下就是vim,windows下就是notepad++,编译器就是GCC,他问我为什么C不用IDE,我不知道怎么回答了,说了一个现在都觉得很搞笑的答案,我说喜欢代码的颜色,后来回想,把VS完全给忘了啊。然后他问我你知道MVC?能不能详细讲讲,我实话实说了,对MCV的理解就留在能把它翻译过来的水平Model View Controller ,自己没有实现过,都是在已有的模式上开发,比如android比如javaBean比如IOS.
之后又开始写代码,这次的问题是“现在有个很大的文件,里面是英语文章,要我写一个函数选出里面出现词频最高的10个单词,并且算出词频”,我觉得自己就是跪在这个问题上了,这次是用java来写,结果getNextWord上就悲剧了,我直接把所有的字符串读进了一个StringBuilder,然后用空格分隔,错误一:大文件可能会引起内存不足,错误二:空格分词是不全面的,还可能有句号,逗号等。于是改用从流中一个一个的读单词,这个改了以后,然后路就是选10个词的问题,我最初写的就是一个类似于选择排序的算法,这就需要遍历10遍所有的单词数组,很慢,面试官说这样也可以,问还有没有别的方案,于是我又说了一种就是,假定前十个词频最高,然后一次遍历后面的每一个单词与前十个单词中最小的那个比较,这样就形成了一种淘汰的方案,这样只要遍历一遍,但是前十个元素要不断的排序,也不好。最后面试官给我说了一种好的方法,最大堆,顿悟了,但是这个真心没有亲自用过,也想不到,然后我就想这次算是完了。面试继续,他说“现在我们需求变化了,改为查找所有单词中词频处在中间的那个单词”。我想排序肯定不是正确答案了,想了半天挤出来一句话“还是要先进行一趟快排”,这样我们就得到了一个flag,左面的都比他小,右面的都比他大,然后判断flag的位置和数组中点mid,如果小于,则说明目标值在flag的右半部分,然后递归了。。。但是代码还是乱了,我觉得二面真是让自己挫到家了。
休息了几分钟,HR通知我去三面,这次是他们的 产品负责人,我们聊了我以前做的一个东西,让我设计运营方案,一年的时间内,把这个产品卖给一个大公司,这个我就是瞎扯了,什么宣传之类的。答对了一个点,就是一定把基础功能做完善,巩固住核心。下一个问题是“你认为你的产品不会被别的竞争公司立刻学会的东西是什么?”,这个的答案得到了他的肯定,那就是用户贡献,也就是用户贡献的数据,这个是别人拿不走的,典型的是贴吧和SNS社区。之后是解决现在一个现在很关键的问题,比如QQ查找附近的好友,有的好友是两天前在这里,而今天已经不在这了,但是我们查找附近好友的时候还是会显示,让我提出解决方案,我说的是类似DNS查询的时间戳的概念,这个是可以解决的,然后面试官让我画服务器的部署方案,保证实现这个功能。之前有看过百度的数据可服务器部署方案,其实我就是模仿那个来的,但是面试问我为什么要有一个主控制服务器,我答得语无伦次了,但是这个事实上是需要的。
三位面试官都问我有没有问题,当然他们都是bing研究院的,问的都是写bing的问题,比如个性化搜索,和bing的壁纸。。。。
总结起来,发现自己有太多的不足,这次面试给我的收获就是——我还不够“聪明”,做什么事情都缺乏一个深入的思考,直接导致自己解决问题的能力不足,算法基础不够,微软看重的更多的是解决问题,写代码的能力。以下是几点总结,重要性依次递减。
- 因为不善于思考,所以导致了自己的不“聪明”,而这种“聪明”不是天生的,而是一种学习习惯,或者说是一种能力。我欠缺一种解决问题的能力, 写程序就是为了解决问题,显然过去的时间里,我更像一个技工一样,太专注语言语法细节,以及一些API。我更像一个解决方案的使用者而不是一个解决方案的创造者,这让我想起了《人月神话》里的一句话,你手中有了一把锤子,看什么问题都是钉子。我在面试中犯了很多这样的错误。
- 基础不扎实,算法的应用能力薄弱,同时对于产品的理解很不系统。
- 想问题不全面,能力局限在完成了baseline的版本,这个每个程序员都可以实现,你怎么证明你的不同?
- 有项目,但是没有项目经验,缺乏一个工程的概念,设计程序还停留在一个开发者的身份上。
- 最后一个比较尴尬,就是面试完才得知,前面的面试官都把我当成研究生了,我终于明白了peter为什么和我聊研究生,这是我的问题,以为简历 上写了就没有介绍,很没有经验,我实际是大三的。
后记:大脑僵了一个学期,感谢MS让我重新清醒了过来,今天中午在实验室和导师聊了这次面试经历,呵呵,老师说我”你个小本儿去MS面PM胆子挺大的“,其实结果我也预料到了,其实现在结果很好,收获颇多,说道为什么会想去面产品经理,原因有二:一是自己有做产品开发产品的经历,而是有社团经验,和同学们关系非常好~~,哈哈人生就是不断的去尝试啊~
这个学期就不再野了,暑假去腾讯实习,希望能够在自己第一份工作中有大大的收获,能够为团队做出贡献。