莫名其妙获得了一个 Microsoft 的面试机会。好啊,去看看那是个什么场景。毕竟只是上午给我电话说下午面,我也就没什么好准备的。

总体感受:「没啥。」

面试分两步。有两个房间,每个房间里有一个面试官。其一是技术的,另一是其他的。两个应试者同时接受面试,分处两个房间。因此,应试者自然也就分为「先面技术的」和「先面其他的」。我属于先面技术的。

技术面试

话茬是比较无聊的:他问我今天如何、有什么课、学什么。然后提出了 agenda: 他给我一道题目,让我解;他「将留意我处理问题的过程」。没有什么意外。我说「就是 "think out loud" 是吧?」,他说是。

给我的问题是:「对于给定的整数,判断其是否为 2 的某次方。」

我当然首先想(并且说),应该可以通过某种 bit shift 来解决,不过我不熟悉,所以先不那么想。于是我很快提出了「对 2 的某次方取对数的结果总是整数」这个答案。自然,出现了这个答案:

boolean isPowerOfTwo(int x) {
    return log(2, x) == floor(log(2, x));
}

我说,我不是很熟悉 Java, 不知道对数的函数叫什么;"floor" 也是乱编的。

他引导我说让我想想有没有更「计算机地」解决的方法。于是我表示认可:「我这完全是数学方法;我当然也可以迭代之类地解决之。」于是我提出了用递归来解决这个问题。

我说,「首先我们说 1 是 2 的一个次方。然后对于后面的数,如果数的一半是 2 的某次方,则该数本身为 2 的一个次方。然后得想想另外的边界条件。」

他没有多问,而是指引我向使用位运算解决。首先他指引我考虑那些数的二进制形式是怎样的;当然,就是「开头是 1, 其余是 0」。然后他说,「我们知道我们可以一直 right shift, 但是那样太慢了。应该有类似你的方法那样,能够 hit it in one go 的位运算方法。你想想?」

他询问我懂不懂位运算。我说知道啊, bitwise and/or/xor 之类的。我说「情况应该是这样的,我们找到一个特殊的数,使得这个数和参数进行某种位运算之后是很特别的结果。」

他令我写出开头几个 2 的次方的二进制形式。我就写了 16 的。然后我们就开始想,是怎样的特殊的数才能算出特殊的结果呢?一开头随便想了个 \x. x && 11111 这个运算,不过被拍醒了,发现这函数压根就什么都没干嘛!

他很直白地提问,「如果我们取参数的 inverse 呢?」我说「哦可以试试参数的 complement」。他说「如果取否呢?」

剩下的就很直白了。手持 bitwise and 以及 bitwise not 两个工具,答案顿显。

boolean isPowerOfTwo(int x) {
    return x && (x - 1) == 0;
}

并且被优化为 "return !(x && (x - 1));". 至此,题目大致宣告完毕。

看来我是提早完成了,于是他不紧不慢地问我有没有什么问题问他。我随口问道「啊我就随便问些典型的问题吧,比如你做什么啊,你的团队多大啊之类的?」从那里我们讨论到说 FPGA 可以支持将算法烧进芯片里,直接提供某抽象的功能。我说 FPGA 我不是很熟悉,我们只是在课上提到过这个概念罢了。

虽然不知道面试官怎么想,但是我反正是不觉得这有什么难的,尤其是在他给出那么多的提示的情况下。而关于我一路的思路,我也不太担心对方不明白,因为我的确 think out loud 了 —— 连 "OK so now I'm pretty much stuck" 也出来了。

聊到我穿着的 UCB jersey, 我说我从中国来到 NZ 不太久,但是学位是 4 年压缩成 3 年的,并且解释了一些开头刚见面时之所讨论——「为什么我上过线性代数却又在上」;我也说「从一个工程学位毕业出来的竟没有做过微积分」是极其不合理的。

另一位面试官

她开头就先问道了我穿着的 UCB jersey… 我说我有个同学在那里学习,但我本人没有去过。

她问了一些元信息,然后问我参与过的项目。「项目」是第一个大问题。我说「没有什么 significant 的项目」,不过有个并不 significant 的的故事可以跟你讲讲。于是我说了当时饭堂统计器的项目,以及用 Android 制作的一个小工具,给自己的团队使用。当然,这部分完全是编的啦,因为该项目一直拖延至今尚未着手。我说「本来我们是那样那样手动算的,不过觉得太麻烦了。鉴于我懂得一点 Android 开发知识,我打算做一个小应用来完成这个事情。」「手动重复 (human repetition) 总是不怎么好的事。」我说「我有一些本事;如果不拿来使用的话属于浪费。」

我说「相比起做项目,我更想先了解一下我手头上都有些什么工具。我说我想给自己避免类似于 "having been using a shoe to bash nails for a long time, just to realise there is such thing as a hammer" 的情况。自然地,她问「那么你学些什么呢?」我当然就说「函数式编程吧。哇,一个新的编程 paradigm 喔!怎么人家都会你自己却不会?赶紧去学啊~」我说我在网上找了一本某个斯洛伐克人写的 Learn You a Haskell, 自己通过读该书来学习;因为用的是 Linux, 所以安装各种编程环境都很方便,于是自己就弄起来了。不过到一半的时候被一些典型的 Haskell 东西给卡住了—— Functor 啊, Monoid 啊,之类的。我说「就在这个时候,开学了,于是我就一直卡在那里了,以至于至今还卡着」。

另一个大问题是「描述你解决一个问题的步骤」。我说「这个很笼统啊,你所期望的答案是怎样的呢?」她说比如你在课上学的某个项目啊,作业啊。我说「说不定是 AVL 树的作业吧?」不过我关于这个话题只是随便扯了一下。我 当时/现在仍 不太清楚她指望得到什么样的答案。所以这题基本上答痨了。

我觉得这题应该答得痨到一定程度了,因为连之前在隔壁的技术面试的问题都请求作为例子解释解决一个问题的过程了。我回答了一些问题的细节,不过没有抽象的回答。

她问 "Are all programming languages expressive?" 我打趣地回答说 "All programming languages are expressive; some more expressive than others", 并且指出可能 Lisp 是最 expressive 的语言。她问我我最熟悉的语言是什么,我回答说 Python. 我指出称「Java 次之」。我说,「Python 让我很方便地将自己的想法转述称代码」、「当然,我也知道 Java 十分适合软件工程的目的」。

她问 "on a scale from 1 to 10, with 10 being the best," 我的编程能力如何。我说 "Pretty good. Maybe 8 or 9." 但是我立即说「不过没有一个 metric 这个数字是没有意义的,所以为什么我这么自我认定呢?」我说「一个原因是貌似我不怎么觉得课上的编程问题有多困难…… 二是我觉得编程语言也是 expressive 的语言,可以用来描述想法。」我还说,"programming is actually the easy part; the hard part is solving the problem."

接着话茬,她问道「那么说不定明年你就可以自我认定为 9 或 10 了?」我明确地表示「不,这很难讲」,并且介绍了整个学位的组成:貌似二年级的时候做了最多的编程,而后来的编程甚少,所以学习到的不会特别多。我说「这个学期的课很奇怪——到现在竟一行代码也没有为功课写过。」

这个时候是我提及「我在网上上 UCB 的课」的很好的机会。我说「如果我不自己不去学习一些东西的话,我就会落下来了。」我说 UCB 的课是公开的,我的朋友给了条链接给我,于是我就去学了。「不过我学到三分之一的地方又卡住了,这又是开学的时候。」我说「不过我学到了很多 Python 的知识,颇有收获」。我还说,其实那门课正是 MIT 的 SICP 的一个模仿;而「SICP 正是我打算用来学 Lisp 的材料」。

最后我还讨论了一些尤其嘎的问题,比如由于我的所谓 CV 压根就不是一个 CV 的样子,所以我刻意问道她的看法。她的看法是否定的。我说「就我那个所谓的 CV 来讲,我知道人们不是这样写 CV 的;不过我不知道有什么好写的。你有什么评价呢?」她的建议是「去遵循典型的 CV 的模板」。我说「啊,不过论 education? 我只是个还没毕业的 undergrad; 论工作经验?我没有从事过任何 relevant 的工作;论 teaching assistance 或者什么社团的头目之类的?我也没有做过。」于是我得到了有用的回答:「可以写堂上的项目或者话题啊,或者上过的课的话题」。

她问「为什么来 MS 呢?」我说因为我想了解你们的一些软件工程的工序是怎样的。「我相信 MS 是个靠谱的公司,」所以人们从事的也是靠谱的活动。「对我来说将会是很好的经验,也可以学到许多更现实的东西。」

面试中途,我确认了我的确是在「面试一个 internship 」;将结束时确认了「四月中旬给答复;若通过则五月初要去悉尼进行一系列的技术面试;若通过则南半球暑假时去实习」。

总评

我的态度十分儿戏;这很大程度上是故意的。就仿佛我来面试压根就不是求着他们收下我似的。我只是感到很高兴,一来经历了第一次面试,二来经历了微软的面试。可以说我是持学习态度而来的,并且鉴于我了解我在这趟面试中的对手(即我的同学们),在「技术」方面我实在是挺有 show-off 的信心 —— 我也的确有意偏向之了。

总的来说,感觉良好。不过一踏出房间,我几乎立即就意识到,「艹,我该开着手机给自己录音的!」