来微软了!

公子龙

共 2878字,需浏览 6分钟

 ·

2021-11-15 13:31

你好,我是公子龙,上周五应朋友的邀约,去微软溜达,看了里面的办公环境感觉很赞,员工福利也很到位,难怪之前接触过的前微软员工,对公司的感情都比较深厚。

身边不少朋友在微软工作,其中有位前辈:叻道,2013 年加入微软,已经工作 8 年了,前几天他写了一篇自己作为校招面试官的感悟,感觉对于在校生、甚至是社招生,都是很有启发的,转载过来了,大家可以一起看看。

正文

这周参加了今年校招的面试。被安排了两天的面试,本以为每天要面四人,结果第一天安排四人但被🕊了两,第二天只安排了两人,所以强度并不大。
整体看,觉得这一批学生的水平比过去略逊一筹。现在网传今年校招薪酬都开奖了,不清楚这一轮的面试者是不是二次筛选之后的。
我面试的具体题目和方式依旧,绝对难度并不大,主要考察面试者的基础知识的运用和问题解决能力,而不是简单考察对方知道不知道某些具体的知识点。比如,从对方的项目经历方面去考察端到端的技术交付能力和综合技术素质,从设定的题目去考察编程基本功和解决编程问题的系统性思维。过去的文章[1]提过这些,在此不再复述。
本文从项目经历和编程题两个部分简单分享这次面试的感受。简言之,项目经历的深度和代码细节背后的编程基本功依旧是有效的分水岭。自己在校招面试中一直重视这些内容的考察,而且我认为在这些方面表现好的面试者通常能够在面试中甚至职业发展中脱颖而出。注:这仅代表个人意见。
考察项目经历的时候,我主要关注面试者的端到端技术交付能力[2],比如能否能够清楚介绍项目背景、目的,技术挑战以及个人承担的任务,对遇到的具体技术问题能够能够综合不同技术方案来权衡利弊,能否系统地衡量交付的效果等。简单来说,我期待面试者能在讲述why-what-how的时候展示技术深度。
在这个环节,近两三年来多数面试者都能有内容介绍。半数能清楚地介绍项目及自己承担的工作内容,能举例说明所遇到的挑战和解决方案,从中表现对涉及的领域知识和具体技术的熟悉程度。表现优异的人通常能够量化地衡量自己做出的成果,对具体的挑战能清楚介绍不同方案基于项目条件下的权衡利弊,甚至说清楚最后技术方案存在的不足以及后续可能优化的思路。
这个环节里,面试者必须避免让面试官感觉自己只是一个“执行者”,比如只能简单介绍自己做了什么却无法讲清楚为什么做、为什么选择这样做、如何衡量交付的效果等。
缺乏迭代的项目经历是另一种难以体现深度的情况。比如项目只是简单一次性实现了一个策略或机器学习的算法便结束了,多可能是因为该领域问题并没有很大的挑战性,或者面试者并没有深度地解决该类问题目前最困难的挑战。 
考察编程题,我更多关注的是代码基本功而不是特定算法,所以我出的题目并不难,虽然熟练算法能提高解题效率。
我一直用当年微软面试被面到的一道题目。最近看了一下leetcode,里面收录了这道题,难度为medium。今年,甚至近两三年,越来越多的面试者能不需要讨论思路便能快速完成代码。想必学生们在刷题上都做了充足的准备。然而,多数面试者在算法上做足了功夫,却多忽视了对代码基本功的关注。
我考察代码基本功的方式很简单,即代码讲解代码测试
写完代码后,我会让面试者逐行讲解代码,然后提问。
要求逐行讲解码可以有效且灵活地考察和编程语言和技术实践相关的知识点,比如函数参数传递方式,库函数和容器类型,错误/异常问题处理等等。作为面试官,这里甚至不需要刻意准备大量知识点问题。只要有代码,通过问一些通用的问题(为什么这样用,还有什么选择,分别有什么优劣,能怎么改善等)就能快速判断对方的专业性。面试官并不需要什么方面都比面试者更懂(这通常也不现实),而只需要引导面试者展现能力,然后便能够分辨优劣了。
当面试者就实现了一个函数的时候,通常讲解函数定义的时候就能有区分度了。不少人甚至直接略过函数定义就介绍实现代码,似乎函数定义显而易见地合理。然而,具体询问函数定义的细节时总能揭露编程基本功的好坏,比如返回值类型、参数设计和类型选择等。要知道,一个良好的函数定义或者广义上的程序接口定义能避免大量编程中可能出现的问题,比如不必再实现一些输入合法性验证(防御性编程)等。感觉多数面试者在平时编程(感觉多是刷题的时候)没思考过这些问题,因此这里我主要是希望通过提问去考察对方一些函数/接口定义的基础知识和最佳实践,看对方是否能够讲清楚并有针对性地改善代码。
讲解完代码后,我会要求面试者设计合适的测试用例来验证程序的正确性。现在多数人都懂得设计一些边界类的测试用例,来表现自己考虑了“特殊”情况。比如面试者使用二维矩阵结构来描述图,多数人会快速分别列出一个1*1,1*n,n*1,n*n和m*n的矩阵。但当我问“这个3*3的矩阵能代表所有n*n的情况吗?”,对方通常会卡壳,甚至随口而出说再设计一个或多个足够大的矩阵,而并不能考虑清楚测试完备性的关键。在工程中,我们要为自己写的代码负责,总是需要先设计足够的测试数据来验证自己代码的正确性。做好这一步能减少大多数低级错误。
从这些年的面试经验看,通过代码讲解和代码测试的考察还是能够非常有效地区分出编程基本功的优劣。因此,我建议通过刷题准备面试的人还是应该适当重视代码质量相关问题,而不是*只*关注到算法逻辑。
如果对方表现良好,则能够继续考察问题解决能力。时间不多的时候,我会在编程题的基础上增加难度。如果时间还比较富裕,则会单独出另一道题去考察问题解决思维;可惜,今年面试并没有机会问到这道题。一部分原因是这次面试时间缩短到45分钟了。
幸好,在目前校招面试中,项目经历的深度和编程基本功依旧是有效的分水岭。我还不需要提升面试内容的绝对难度。
注意,上述的内容主要针对校招。社招面试的时候对过往经历的技术考察比重会更大;职级越高,比重越大。因为我认为对方的工作经历应该更能体现对方的专业能力,而不是我预先安排的题目。
写在最后
现在许多公司的校招薪酬都开奖了,感觉基本都倒挂往年了。看起来今年依旧是一个暖冬。
倒挂固然不是一个情感上容易接受的情况。别人晚一年毕业却比自己干一两年挣得更多。然而,在一个向上发展的行业里,倒挂似乎是一个无法避免的情况。理性地想,这并不是一件坏事,因为这表明职业的需求和价值还在不断提升。被倒挂了,如果对自己有自信,应该相信自己在下一次调薪中有更大的空间,或者在整个行业里有更大的价值。
哪一年校招薪酬不变甚至下降了,那将是职业的警钟。

你好,我是公子龙,毕业于中科院,前大型计算机竞赛冠军,现算法工程师,拿过九家大厂的 offer 。


北漂七年,从小白到计算机竞赛冠军,读研时通过实习和比赛收入 50 万,点击蓝字查看我的编程之路


同时,我也是 b 站 up 主:公子龙龙龙,日常分享高质量资料,输出面试、工作经验,欢迎围观。


浏览 46
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报