collabedit面试流程怎么操作

注:以下内容纯凭记忆由于已經过去一个多月,不保证准确性由于面试流程前没有签保密协议,本文透露了比较多的细节如果有不合适的内容,请联系 bojieli AT 开发过程中构造 PHP Sandbox 的几种尝试,以及现在感觉不合理的地方(这个不合理的地方现在还没改,所以大家装插件经常会遇到问题)感觉分量有点不够就补充了做实时磁盘文件系统课程实验的时候尝试的几种优化(嗯,这个是郭家华写的代码所以也不是我的功劳),总结得到“真理”:在做系统的时候要找到瓶颈进行优化如果选择了错误的部分则很麻烦且效果不好。

然后张老师就跟我谈做研究是什么感觉在 MSRA 读博昰什么样,等等接着他问我哪门专业课学得好,我当时只回忆起了操作系统、编译原理(面试流程根本没准备)他说操作系统,好講讲 Linux 的内存管理机制。《Linux 内核源代码导读》是一年前上的了……幸亏前些天读了一篇“手把手教你写 ramdisk” 的文章就先说说用户地址空间和內核地址空间,高端内存的临时内存映射和永久内存映射动态内存分配的伙伴系统和 slab 算法。面试流程官接着问我分页机制我就把计算機组成原理上学的东西大概说了一下。他问了个很奇怪的问题分页是硬件还是操作系统管理?我觉得是硬件查询页表操作系统维护(修改)页表。他问我操作系统什么时候需要查询页表除了缺页异常和修改页表以外我没想到其他的情形,面试流程官对我的答案不置可否

张老师拿来纸笔,让我写个 bcopy 实现 memcpy 的功能我首先写了个最简单的版本,随即改成了4字节一组的版本他说我的程序里有 bug,我这才想到艏尾不是4的倍数(即内存没有对齐)时会有问题于是就在首尾加上了特殊处理。他又说我的程序会 segmentation fault我百思不得其解,他最后告诉我洳果目标地址没有对齐,4字节复制就成了非对齐访问我在32位 x86 上写过非对齐访问的程序,没有 segmentation fault 啊他说你回去试一试,一定会 segmentation fault这场面试鋶程就这样结束了……要是当初说学得好的课程时,说的是计算机网络而不是操作系统估计回答起来就不这么吃力了……

画外音:面试鋶程全部结束后在LUG活动室的32位 Pentium 4 上做了个实验,4字节非对齐读写都不会 segmentation fault而且结果是正确的。郭家华说即使总线不允许非对齐访问,CPU也没莋特殊处理出现的也应该是 bus fault 而不是 segmentation fault。不过由于LUG要贴海报就没回去跟面试流程官探讨。

从第一场面试流程出来等了五分钟,工作人员僦把我叫到了第二个面试流程官的房间里面试流程官是做计算机图形学的童老师。他看了我的简历对 Robogame 盲人阅读器和 freeshell 比较感兴趣。在聊 freeshell 嘚时候我提到 OpenVZ 可以实现热迁移,他就问我热迁移的原理我刚好看过一本云计算的书就答出来了,他问我是怎么想出来的我说这个不昰我想的,是书上的而且 OpenVZ 也是现成的工具,我只是调用了它的API他的结论是,“不说你这些项目结果怎么样单是主动在课外去做这一點,就能说明很多问题”

童老师接着问我,是喜欢做偏工程的研究还是偏理论的研究(具体的问法不记得了)我当时答的是,比较喜歡通过理论推导和系统方法得到的结果不太喜欢通过调参数“凑”出来的结果,顺便扯了扯马毅博士的论文然后他表示没什么可问的叻,我就请教了他三维重建方面的问题(不过他说的那个算法我出来就忘掉了白问了)。这场面试流程比较快20分钟就结束了,至少比苐一场面试流程短一半

过了几天,搞数据挖掘的谢研究员(少院校友)跟我邮件要求面试流程安排在高性能计算中心,是通过 Skype 视频面試流程去了才知道,面试流程地点是网络中心402就是LUG每周小聚的地方啊有木有,工作人员则是跟陈张和我一起做 Linux Software Store 的赵聪师兄(怎么这么巧)言归正传。在自我介绍兼听力试音之后谢研究员就抓住了我数学成绩不好的小辫子。然后就开始问我简历上写的数据挖掘课程上鼡 KDDcup 2009 数据做的实验因为那门课之后再也没碰过数据挖掘,只好硬着头皮编了几句他肯定听出来了,就让我换个近期做的项目于是我把 blog 講了一遍。

谢研究员问我前面两个面试流程官分别是做什么的我如实招来。他接着问你是喜欢做系统研究呢,还是做理论研究呢好潒跟童研究员问的问题差不多。他说看起来我比较喜欢做系统下面的问题比较狠,如果在系统、计算机图形学和数据挖掘之间选择你哽喜欢哪个呢?其实就我个人而言是比较喜欢人工智能的在学校的实验室也是做智能机器人的,所以我就说是比较喜欢偏智能方向的系统也不错。图形学里全是数学我估计玩不转。他说我的想法比较矛盾喜欢系统研究,但数据挖掘属于理论研究20分钟固定时间面试鋶程就在矛盾中结束了。

出来的时候在电梯门口正好遇到一个来参加面试流程的妹子,她特别紧张担心被问到跟上次面试流程不一样嘚问题,我就安慰她内容都差不多的跟面对面面试流程的形式完全一样。似乎紧张会影响人的发挥我高中的时候本来没想来科大,面試流程的时候特别放松结果面试流程成绩挺好的。这次又是本来没想去微软也许不准备就是最好的准备……

最后一场面试流程是张老師实验室的一个台湾人进行的电话面试流程,我坐在电脑前面在 collabedit 上现场写代码。心想这个老师真有意思面对面的时候就让写代码,还給安排了一次专门写代码的面试流程而其他面试流程官都没让写一行代码。面试流程题是他临时想的我写程序的时候,他也在写同一個程序

第一题是不用递归,用 O(1) 的空间复杂度实现二叉树的遍历二叉树的每个节点有 parent 指针。由于一开始我没想清楚写了又改,改了又寫中间电话还断了一次,折腾了一个小时才勉强交上去

第二题是求一个 n*n 的黑白点阵图中,黑色连通片的个数(上下左右相邻视为连通)我觉得 floodfill 法太简单了,于是就写了个每个点只扫描一次的贪心算法按照行列顺序扫描,当前方格为黑色时若左边上边都是黑色,编號相同则复制编号不同则复制左边的,并增加 merge counter;若左边是黑色或上边是黑色则复制其编号;不然,新开一个编号最后的连通片数就昰 (分配出去的编号数 – merge counter)。过了好几天我才想清楚这个算法是错误的,问题出在左边上边均为黑色且编号不同时无论复制左边的还是上邊的编号都不行。如果对编号改用并查集上述情况下将两个编号合并,以后判断编号相等时从并查集里找好像就没有问题了。

这么简單的两道题一共刚超过100行代码,竟然耗了1小时45分钟……到底是多年不搞OI也没参加ACM,老了……当天晚上面试流程官发邮件(当然是英文)跟我说:我能理解你的基本思路但程序里有很多 bug,尤其是第二题不过不要担心,这样两道题本来就不是在短时间内能轻松解决的

鈈知怎么的,MSRA 的面试流程就水水的过了我觉得要是碰上几个 ACM 大牛,再碰上几个 GPA 神牛我肯定不会被选中的。人力资源部的人跟我确认 check in 的時间当时我正在去 LUD(Linux User Dinner)的路上,没听清她跟我说是“入职”,我想我又不是到微软工作怎么变成“入职”了?后来才打听到我们實验班是跟微软实习生一样的编制。

哇……总结超过3000字了我们实验班的18个人就要开始新的征程了,也祝愿学弟学妹们在来年的MSRA面试流程Φ沉着冷静展现个性和风采!

      面试流程程序员很困难Jeff Atwood 抱怨找┅个会写代码的候选人是如此艰难。在技术媒体发布的那些“最佳”面试流程题中很少有能让我提起兴趣的——尽管我很喜欢IKEA的这个面試流程题。 Codility和 Interview Street这样的创业公司从这个具有挑战性的课题中看到了机会与此同时,Diego Basch 呼吁我们停止逼迫求职者进行白板编程

对此我没有什麼更好的建议。我同意IQ测试和刁难人的问题非常糟糕在最好的情况下,它仅仅能测试候选人的一项素质;在最坏的情况下它完全不能說明候选人是因为曾经遇到过相同的问题,还是靠着自己的能力找到了解决方法编程题对于一个一整天的工作内容就是写代码的人来说昰更好的面试流程方法,但是传统的方法不论是电话还是面对面交流,都不是最优的测试编程能力的方法同样,人们也不是很清楚编程题应该是以怎样的形式呈现——直接解决问题还是仅仅把一个算法翻译成可执行的代码?

      面对着如此多的挑战我想到了一个为我以忣其他在Endeca、 Google 和LinkedIn工作的同僚们服务了多年的面试流程题。我带着沉重的心情解这个题原因我会在结尾中解释。但是首先让我描述下这个问題并且解释为什么它如此有效。

我把它叫做“分词”问题并解释如下:

给定一个输入的字符串和一个包含各种单词的字典用空格将字苻串分割成一系列字典中存在的单词。举个例子如果输入字符串是“applepie”而字典中包含了所有的英文单词,那么我们应该得到返回值“apple pie”

注意,我故意没有解释或者漏掉了一些细节从而给候选人一个弄清楚问题的机会。 这里我举一些候选人可能会问的问题以及我会如哬回答

问:如果输入字符串本身是一个单词怎么办?

答:可以把它看作一个特殊情况

问:我只用考虑分割成两个单词的情况吗?

答:不但是可以从这种情况开始。

问:如果输入字符串无法被分割成单词怎么办

答:返回null或者类似的东西。

问:有变位或者拼写错误怎么办

答:只需要严格分割成字典中有的单词。

问:如果有多种分割可能性怎么办

答:只需要返回任何一个正确的答案。

问:我在想将字典鼡前缀树后缀树,Fibonacci堆实现…

答:你不用实现字典只需要假设它已经被合理地实现了。

问:字典支持哪些操作

答:字符串查询——这僦是你所需要的全部

答:假设它远远大于输入字符串,但足够装入内存

观察求职者如何讨论这些问题,能帮助你了解求职者的沟通技巧囷对细节的关注以及求职者对数据结构和算法的基本理解。

题目介绍的足够多了我们接着看看解法。一些求职者从问题的简易版入手即只考虑把字符串拆分成两个单词。我把它看作一个“傻瓜”解法并且期望任何有竞争力的软件工程师可以给出任何等价于下面解法嘚代码。在我的解答中将使用Java实现

我面试流程过无法给出上面解法的求职者——其中一些甚至通过了Google的技术面。如同Jeff Atwood所说傻瓜问题是避免面试流程官在那些根本不会编程的求职者身上浪费时间的好办法。

当然这个问题的精华在于它的一般情况,即输入字符串可以被分割成任意数量的单词有很多方法可以解决这个问题,但是最直接的是递归回溯这是一个典型的建立在上个解法上的版本:

许多申请软件工程师职位的候选人无法在半小时内得到相当于上面解法的方法(比如一个用显式栈实现的算法)。我可以肯定他们很有竞争力并且很會写代码但是我不会把他们安排到有关信息检索或者机器的职位上,尤其像那些开发大规模搜索功能的公司

但是等一下,问题不仅于此!当一个求职者走到了上面这一步我会让他研究这个算法的最差运行时间,用字符串的长度n表示我听过从O(n)到O(n!)的各种各样的回答。

我通常会提供以下提示:

考虑一个想象中的字典它只包含”a”,”aa”,”aaa”,…,这样仅由字母”a”组成的单词。如果输入字符串是由一长串”a”囷最末尾一个”b”组成会发生什么

求职者最好能发现这样的话递归回溯将会寻找每一个可能的分割,于是问题就变成了举出单纯分割字苻串的所有可能性我把这个问题作为练习留给读者自己思考,答案是时间复杂度O(2^n)

如果求职者能走到这一步,我会问他是否可以做得更恏许多求职者意识到这是一个负载问题,更厉害的那些意识到可以用动态规划来完成这是一个用了存储的解法:

同样的求职者需要进荇时空分析。关键点是SegmentString方法只需要在输入字符串的后缀中执行并且只有O(n)数量的后缀。我把这个作为练习留给读者这个解法的时间复杂喥为O(n^2)。

有非常多的理由让我喜欢它我说几点:

  • 这是一个在现实的软件开发过程中会遇到的问题。我曾经为Endeca开发搜索词重写这个问题会茬拼写检查和同义词扩充时出现。
  • 它不要求任何特殊的知识——仅仅是字符串、集合、表、递归和动态规划的简单这些都是本科一二年級的基础内容。
  • 写出这些代码并不容易45分钟的时间会很紧凑,不论面试流程是电话进行或者用Collabedit这样的工具
  • 这个问题很有挑战性,但不昰个故意难倒你的问题它需要一些有条理的分析以及对基本工具的使用。
  • 候选人在这个问题上的表现不是非对即错的最糟糕的候选人甚至不能在45分钟内想出第一个解法。最好的候选人能在10分钟内实现带存储的解法这使得你有机会问一些更有趣的问题,比如他们如何处悝一个大到难以放在内存中的字典多数候选人的表现在这两种之间。

不幸的是所有好的东西都有尽头。我最近发现有人把这个题目放箌了Glassdoor上那里的解法没有我这篇讲的这么深入,而我认为像这样好的题目应该体面“善终”

想出一个好的面试流程题很难,保守秘密同樣很难秘诀是保守更少的秘诀。一个理想的面试流程题应该尽量不涉及更高端的知识我和我的同事们正在像这个方向努力。一旦我们囿所进展我自然会分享更多。

同时我希望每一个经历过分词问题的人能够感激它带给我们的价值。没有完美的题目同样一个人在一個面试流程题上的表现无法说明他在工作中的表现会怎样。尽管如此这个题目仍然很棒,我知道很多人会怀念它

加载中,请稍候......

我要回帖

更多关于 面试流程 的文章

 

随机推荐