去年年末参加了微软的面试. 说来惭愧, 作为拖延症晚期患者, 一直到现在才来 写一写.

最深的感触是, 从接受简历到面试结束, 无论是 HR 还是面试的工程师, 他们都 一直很礼貌和耐心, 交流起来也很舒服. 他们不会问一些个人问题, 也不会质疑 应聘者的能力. 所以整个流程下来, 我觉得他们都会是非常优秀的同事.

不清楚是因为非计算机专业背景, 还是职位要求低一些, 我感觉自己面的内容比 网上很多面试分享都要简单一些. 从一开始给我电话的时候, HR 就一直强调要 刷题, 而实际面下来确实基本都是 leetcode 的原题. 在电话面试前, HR 还特 意找了当初给我内推的工程师模拟了一场电话面试, 我非常感激.

第一场是一个小时的电话面试. 一开始面试官会从简历开始寒暄几句, 然后会挑 出简历里写的一些工作谈一谈. 我运气很好, 讲了一个自己设计的小算法, 对面 也很感兴趣. 大约半小时的时间. 然后在电脑的白板上写一道算法题, 给定一个 数组作为垂直墙壁的高度,问如何选择两面墙壁, 可以装最多的水. 这是 leetcode 上的原题 Container With Most Water. 当然 很快就可以写完. 写完后简单说了一下测试用例. 最后还剩了一些时间, 面试官 即兴把题目改了一下, 问如果一直倒水的话, 一共可以装多少水. 这个感觉比原 来的题目还要简单一些.

后面三场是现场面试. 因为我是提前一天到的, 所以第二天去的比预定时间早不 少. 然后面试官也就提前了. 一开始仍然是按简历说一说背景和之前的工作, 现 在的想法等等. 然后照例是算法题. 把一句只包含空格和单词的英文句子里的单 词倒过来, 比如 “a lazy dog” 变为 “dog lazy a”. 这当然很简单啦. 讨论了 一些边界条件, 比如会不会又连续空格, 空格出现在首尾等等, 然后我用python 写了一个很 naive 的实现. 然后面试官说, 能不能做到 O(1) 的空间复杂度. 我想了一会还没有思路, 面试官就准备和我说, 这里有一个技巧… 我脱口而出, 别急, 让我想想… 然后就想到了解法. 其实这个也是 leetcode 上的原题, 当 然也不难. 可能刷题的时候没有在意直接就放过了吧.

第二场和第一场差不多, 不过是反过来的. 先做了一道题. 很简单的动态规划, 矩形格点上都是数字,从左上到右下求途径所有格点和的最小值. 很快写完, 并 且讨论完之后发现还剩下很多时间. 然后就随意聊了起来. 我主要说了以前做过 的有限元计算里网格匹配的问题. 因为我以前仔细地想过这个问题,所以呱啦呱 啦说了很多, 当然面试官肯定不了解这个啦, 他还是耐心地听完了.

最后一场是 team manager 的面试. 风格果然就不一样了. 仍然是从简历开始, 说了一点以前的经历和想法. 然后他的评论都很犀利, 有时候让我很难回答. 接 着问了一个场景, 在对一个巨大的词库做词频统计时, 如果字典并不足以放进内 存里, 都有哪些优化的手段.

最直接的, 可以横向扩展的话, 可以把词库分块到不同的机器上去做. 当然这个 作弊的方法直接就排除在讨论之外了. 我想了一会, 没什么思路, 面试官提示说 不一定要用内存来存储数据. 然后就开始讨论如何优化对磁盘的读写. 比如用 trie 树存字典, 利用缓存来减少对高频词的读写, 已以及用缓冲区来减少对磁 盘的写入次数. 创建索引文件, 排序等等. 面试官的思路非常清晰活跃, 有一些 方案我并没有想的很清楚, 他都可以立即指出优缺点和适用的场景. 然后我想不 出什么东西了, 面试也就结束了. 结束后, 他把我送了出去, 然后我就飞奔去赶 高铁了. 然后在火车上收到 HR 说通过了的消息, 我也很兴奋.

本来还有一场 AA 面, 不过当时的面试官休假去了, 所以就择日改远程了. AA 面没有问算法题, 基本上就我的背景随意说了一些. 比如 python 程序如何做性 能调优, 写测试和文档的习惯. 然后面试官还专门问, 如果在节假前, PM 希望 赶工写一些 feature, 问我如何处理. 可能是太放松了, 当时我直接说先分清必 要的 feature, 繁重的话需要别人帮忙. 我还不小心把自己节假前不推送代码从 而避免假期修 bug 的偷懒秘诀暴露了. 当然现在看的话其实没有什么, 整个 ms 就是这么做的…

面试结束很快就收到了 HR 的口头 offer. 因为整个流程下来感觉很亲切, 觉得 大家都是很好的同事, 所以就直接答应了. 后来离职之后过年, 疫情爆发, 直到 年后过了一段时间后才入职, 基本上啥都不会,不过同事都很好, 帮我解答了各 种各样的问题. 继续搬砖中.