📜  微软软件工程实习生面试经验 2022

📅  最后修改于: 2021-11-17 09:54:19             🧑  作者: Mango

嘿!我最近在 Microsoft 完成了 SDE 实习生角色的实习过程。通过这个博客,我想分享一下我整个面试过程的经验。这是一个校内机会,我通过 Microsoft 职业门户网站申请了相应的职位 (https://careers.microsoft.com/us/en/job/1081612/Software-Engineering-Intern)。

在一次几乎完美的面试之后被 Oracle 拒绝绝对是一次毁灭性的经历。 Oracle 面试对我来说很重要,因为我花了很多时间准备。第一次拒绝总是很难应付。随着实习/安置季节的进行,我们最终会习惯它。但第一次拒绝会破坏心理和谐,尤其是当你期待一个积极的结果时。锦上添花的是微软入围名单,该名单于同一天发布。我的名字不在那里。这令人心碎。我在 Microsoft 测试中表现出色,并在 15 分钟内完成了这两道题。嗯,结果证明问题太简单了,几乎其他人都很快完成了测试。

我是安置委员会核心团队的一员。为了分散我的思绪,避免过度思考,我为 Microsoft 实习生面试过程负责了上午的工作。

第二天早上我醒来去履行我的职责。我的朋友 Dev 告诉我,微软实习生的安置委员会已经寄给我们一份新名单,幸运的是我的名字在那里。我对这次面试的期望为零,因为我仍然无法消化 Oracle 拒绝了我。嗯,这种态度实际上帮助我冷静下来。今天,我一点都不怕被拒绝。我觉得我通过它的机会很少。尽管如此,我还是向自己保证要尽我所能。

第一轮(技术面试):我的第一次面试准时开始。由于这是在线面试,我必须加入 Microsoft Teams 会议链接。

  • 面试官让我做自我介绍。面试官问了几个建立关系的问题,确保我很舒服。前一天已经面试了好几场,感觉还挺舒服的。之后,面试官问了我一个编码问题。
  • 问题 1:将给定的数字转换为单词(范围 999 千万)
  • 这个问题很简单。我以前从未做过这个问题,但对我来说它看起来相当简单。我给出了解决这个问题的快速方法。我对我的方法很有信心,我看到了一线希望,让我通过。
  • 提示: 好吧,无论问题多么简单,都不要过于自信。在实际开始编写解决方案之前,请花一些时间考虑如何实现它。
  • 嗯,这个问题看起来很简单。但不幸的是,事实证明实现并不是那么简单。你必须处理很多特殊情况。我太自信了,没有考虑特殊情况。因为我没有给足够的时间考虑实现,所以我很难即时编码。但是,我很快就完成了我的代码。
  • 现在是运行代码的时候了。它给出了一些错误的输出。我知道我很接近,但我真的很尴尬,我无法解决这个简单的问题。很多想法涌上心头,让我心惊胆战。在这里,我真的很感谢我的面试官的努力。他确信我的方法和代码是正确的,并开始帮助我调试代码。花了一些时间后,他指出我错过了字符串数组之一中的“十七”,该数组用于输出最终答案。因此,它给出了意想不到的输出。这是一个愚蠢的错误,但很难在我脑中闪过一百万个想法的环境中进行调试。
  • 我的代码终于完美运行了。面试官告诉我,我已经超过了10分钟的时间限制。我为此道歉。他很欣赏我的努力。当我询问反馈时,他说在实际开始编码之前考虑一下实现。这会节省很多时间。我意识到我的错误,并在离开前感谢他的反馈。

第 2 轮(技术面试):我完全没有期待第二轮的电话。然而,结果是他们召集了所有人参加第二轮比赛。当我接到第二轮的电话时,我可能正在看一些国际象棋流。这是一个完美的机会来掩盖我在第一轮中的错误。我觉得我有第二次机会了。

  • 第二次面试耽误了很多时间。两次连续采访之间的间隙充满了很多情绪。在此期间很容易失去注意力。
  • 提示:在两次连续面试之间的间隙,请休息一下。做一些你喜欢的事情,试着把你的注意力从面试上移开。
  • 如果你对自己有信心,你可以在下一次面试之前查看一些笔记或练习问题。否则,试着把你的注意力从面试上移开。
  • 第二位面试官在很长一段时间后才加入会议,并为延误道歉。这次我们没有时间建立融洽的关系。他自我介绍了一下,然后开始了第一个问题。
  • 问题 1:设置矩阵零 (https://leetcode.com/problems/set-matrix-zeroes/)
  • 这个问题很简单。我对这个问题很熟悉。我有信心能够解决这个问题。这一次我没有失去冷静。我从幼稚的方法开始,然后告诉他它的问题。然后我继续寻找正确的解决方案,这不是最佳方法。他确信我的方法是正确的。接下来,他让我在恒定空间中解决它。我花了一些时间来考虑。他暗示要重用空间。我立刻有了这个想法,因为我已经接近它了。但是,我仍然缺少一个角落案例。面试官让我检查一次我的方法。我立即意识到我的错误并提出了纠正它的解决方案。他对我的想法深信不疑。
  • 由于我已经对自己的方法充满信心,因此我花时间编写了带有正确变量命名的简洁代码。
  • 提示:使用正确的变量命名。严格遵循缩进。使您的代码尽可能具有可读性。
  • 微软非常注重代码质量。我确保我遵循了编写代码的所有良好实践。我能够非常快速地编写代码。
  • 由于时间不够,面试官问了我另一个编码问题。这次他让我只解释方法而不是编码。
  • 问题 2:使用合适的数据结构实现 LRU 缓存(https://krishankantsinghal.medium.com/my-first-blog-on-medium-583159139237)
  • 我对 LRU 缓存的工作原理非常有信心。我向他解释了 LRU 缓存背后的想法。我很快就想出了一个解决方案。然而,由于一些误解,我认为我不能使用任何动态内存。所以,我建议使用基于数组的队列实现和哈希图。这个想法是正确的,但在这里我正在修复缓存的最大大小。在所有实际用途中,高速缓存的大小是固定的。但他想要一个更灵活的解决方案。他建议使用基于链表的实现。我改进了我的解决方案并向他解释了我的解决方案模型的全部工作。面试官印象很深。最后,他问我是否有任何疑问。我借此机会问他如何将团队分配给实习生。他回答说我们会根据队伍的要求随机分配到队伍中。最后,我谢过他,离开了房间。

第 3 轮(项目讨论 + 技术面试):我被邀请参加 AA(适当的)轮。这是决定是否向候选人提供报价的回合。我的第一次面试是在上午 10 点,最后一次面试是在下午 5 点左右开始的。我已经筋疲力尽了。

  • 面试官将自己介绍为“Edge PDF 查看器的团队负责人”。采访以正式的介绍开始。他问我的爱好。我告诉他我的运动之旅。接下来,他问了我最喜欢的课程。我告诉他我做过的所有具有挑战性的课程。在此之后开始了项目讨论。我对我的项目非常有信心。我向他解释了我的 GSoC 项目、MIDAS 独立项目和 Color Switch Game 项目。他印象深刻,没有再问任何关于我的项目的问题。
  • 问题 1:给定 N 人的日历,在工作时间之间安排一个持续时间为 d 的会议,例如 s – t
  • 上面链接中的问题是我在网上找到的类似问题。我向他解释了一种我立即想到的方法。当然,他想要一个更好的方法来做到这一点。他给出了一些提示,我为这个问题想出了一个非常优化的解决方案。他指出我的方法有一个错误,需要单独处理。我无法理解,所以我让他重复一遍。他再次解释了问题,但我无法理解。沉默片刻后,我告诉他我听不懂他说的话。
  • 面试官结束面试,问我有没有什么问题。我谢过他,离开了房间。
  • 我对自己的选择没有信心。但是,后来,我意识到他只给了我 10 到 15 分钟的时间来解决这个问题。在其他面试中,我有更多的时间来解决编码问题。也许他打算得到这个问题的完整代码。
  • 结果直到第二天早上才公布。我无法入睡。我问了那天参加面试的其他朋友。他们都有类似的反应。
  • 第二天早上,我安排了一个高通实习生的面试。我希望我不必为此而坐下。我给我的安置协调员发短信说我现在必须参加面试。如果她能告诉我微软的结果,对我来说是有益的。她回复了祝贺信息!我简直不敢相信自己的眼睛!几分钟后,我收到了来自安置委员会的电子邮件。我通过邮件接受了这个提议,派对开始了。

谢谢阅读!