目录
正在加载目录...

微软 SDE 面经 |四轮 Loop 全记录,Coding + 系统设计 + OOD

微软的面试在大厂里算流程感很强的:一共四轮,每轮一小时,轮与轮之间有 15 分钟休息,中午还给一小时饭点。节奏固定,基本每轮都是前 1/3 时间 BQ、后 2/3 技术,不会突然袭击。整个 loop 走完人是虚脱的,趁记忆新鲜写下这篇 微软 SDE 面经 ,四轮的题目、追问和踩过的坑都在里面,给正在准备的朋友参考。

微软 SDE 面经 |四轮 Loop 全记录,Coding + 系统设计 + OOD

微软 SDE 招聘趋势

微软这两年在北美的 SDE 招聘一直没停过,从 NG 到 Senior 各级别都有 headcount,Azure、M365、Security 这几条线尤其能吃人。想看最新开放的岗位可以直接去 微软官方招聘页面 搜 Software Engineer,按地区和级别筛一下就能看到目前在招的职位。相比其他大厂动不动冻结 HC,微软的招聘节奏算是相当稳定的,而且他家对 NG 和跳槽候选人都比较友好,流程规范、反馈及时,值得放进投递清单的前排。

第一轮:系统设计

面试官是位俄罗斯大哥,上来先热身问了些 Java 的知识点,然后进正题。

题目是:假设你在经营一家刚起步的创业公司,用户不多,设计一个文件存储系统,要求能存任意类型的文件,并且支持用户通过分享链接访问。

这题的坑在于——题目反复强调”创业公司、资源有限”,所以你不能张口就来一套 S3 + CDN + 微服务全家桶。他想听的是贴合场景的单机方案:单机服务、本地数据库加磁盘存储,先把最小可用的东西跑起来。

然后 follow-up 一个接一个:用户量上来了怎么办?总文件大小超过存储容量怎么办?加了过期机制文件还是太多怎么办?多个用户同时编辑同一个文件怎么避免冲突?缓存策略怎么做、适合什么场景?

我的感受是这轮考的不是你背了多少架构图,而是你能不能根据约束条件做取舍。从单机往分布式演进的思路要顺着讲,每一步升级都要有触发条件,别一步到位。

第二轮:OOD

题目是设计一个宠物店系统:顾客可以预约宠物服务,店员各自有可用时间。

题目本身真不复杂,但这轮我差点栽了。面试官特别在意你有没有先把核心 use case 讲清楚——我列了主要实体和接口之后,他还是一直追问,甚至会反复把题目重复给我听。后来我反应过来,他是觉得我跳过需求确认直接开始设计了。

这轮的教训:OOD 面试千万别急着画类图,先花五分钟把需求边界对齐——谁是用户、核心流程是什么、哪些是本次设计范围内的、哪些不管。不然很容易设计到一半发现方向和面试官想要的对不上,返工的时间根本不够。

第三轮:算法

面试官是位印度籍经理,出的是 LeetCode 原题级别的题。

我碰到的是经典的找字符串中所有异位词:给两个字符串 s 和 p,找出 s 中所有 p 的异位词子串,返回起始索引。

思路是固定长度滑动窗口 + 频度数组:维护两个长度 26 的数组,一个统计 p 中各字母出现次数,一个统计 s 当前窗口(与 p 同长度)内的字母频次,窗口每滑一格就比较两个数组是否相等,相等就把窗口左端点加进结果。

代码

def findAnagrams(s, p):
    if len(s) < len(p):
        return []
    
    need = [0] * 26
    window = [0] * 26
    for c in p:
        need[ord(c) - ord('a')] += 1
    
    res = []
    k = len(p)
    for i, c in enumerate(s):
        window[ord(c) - ord('a')] += 1
        if i >= k:
            window[ord(s[i - k]) - ord('a')] -= 1
        if window == need:
            res.append(i - k + 1)
    return res

但注意,这轮的重点不完全在最优解。面试官明显更看重工程习惯:代码结构清不清晰、边界情况有没有考虑(s 比 p 短怎么办、空串怎么办)、异常怎么处理、会不会主动提测试用例。我代码里其实有个小 bug,但因为整体思路表达清楚、主动补了测试,最后评价还可以。

另外分享一道微软近期高频的算法题——合并区间:给若干区间 intervals[i] = [start, end],合并所有重叠区间。

先跟面试官确认清楚输入输出再动手(这个动作本身就是加分项),然后按左端点排序,遍历时拿当前区间和结果集的最后一个比较,重叠就合并,不重叠就直接追加。比如排序后是 {[1,10], [2,5], [3,11], [13,14]},从 [1,10] 开始逐个吞并,最后得到 {[1,11], [13,14]}。

代码

def merge(intervals):
    intervals.sort(key=lambda x: x[0])
    ans = [intervals[0]]
    for start, end in intervals[1:]:
        if start <= ans[-1][1]:
            ans[-1][1] = max(ans[-1][1], end)
        else:
            ans.append([start, end])
    return ans

第四轮:图 + 心态考验

面试官是位白人经理,风格非常直接,直接到什么程度呢——你答题的时候他会毫不客气地打断和质疑,这轮除了做题还挺考验心态的。

题目是对给定起点的图做拓扑排序,而且输入输出类型都要自己定义,还要自己补测试用例。follow-up 是按节点层级输出结果——其实就是往 BFS 分层(Kahn 算法按层出队)的方向引导。

这轮我的心得就一条:稳住节奏,别被对方的态度带跑。他直接不代表你答错了,把自己的推理过程按部就班讲完,该确认的确认,该写的写。

BQ 部分

四轮里每轮开头都有 BQ,问题不刁钻,基本围绕这几类:简历深挖(某段经历的细节)、做过什么项目学到了什么、你在团队里负责哪块起了什么作用。

建议把简历上每段经历都用 STAR 过一遍,重点准备”你的具体贡献”这一层——微软的面试官很爱追问”这里面哪部分是你做的”,含糊不得。

整体感受

说实话,微软不同面试官之间的水平和体验差异挺明显的,碰到不太会面的,一轮下来会有点憋屈。但反过来说,他家的考察框架是稳定的:算法不超纲、系统设计看取舍、OOD 看需求确认、BQ 看真实性。只要技术准备扎实、行为题提前整理过、沟通时思路清楚,整套流程是完全可以稳稳走下来的。

备考路上我参考了 InterviewShow 整理的微软面试题库和辅导资源,他们家除了题库,还有针对 OA 的专项刷题规划和一对一模拟面试,从笔试到 onsite 全流程都有对应的备考辅助方案,有需要的可以去看看。

END