您好,欢迎访问三七文档
微软面试分享:开篇前两天一个朋友帮着推荐了一个微软的职位,先参加了面试,然后周三收到了offer,在这里把面试的过程和如鹏网的同学们分享一下。因为我是有工作经验的人,所以走的是社会招聘的流程。如鹏网的同学们大部分都是在校生,和校园招聘比起来,社会招聘的流程少很多,招聘的形式也有一定的差异,但是相信我的面试经历也会对大家有一定的帮助。在听到这个职位的机会的时候,我第一时间准备了一份简历,就像我在《软件方向应届生求职面试指导》这个视频教程中讲的那样,我根据这个职位的特点对我的简历进行了个性化的修改,将职位描述(JobDescription)中强调的技术放到了明显的位置,并且进行详细的说明,将招聘人员最关心的信息放到了他们第一眼就看到的位置,做到“三秒之内吸引招聘者”。收到我的简历以后,微软给我安排了面试,因为从通知面试到最终面试还有几天时间,我就按照我简历中写的内容把简历中写到的自己的技能、项目经验重点复习了一下,并且对于JobDescription提到的、而我不具备的技能也稍微了解了一下。面试之前我提醒自己:“一定要和面试官谈笑风生!像平时和同事交流一样,这样不紧张了,那么就可以超常发挥”,我做到了。面试一共分为四轮。第一轮面试侧重于专业基础知识,第二轮面试侧重于具体技术,第三轮侧重于软件测试和其他技能,第四轮则是BOSS面试,侧重于职业规划、项目经验、待遇等。每轮面试1小时,共持续约4个小时。第一轮面试。面试官首先问“你最熟悉的语言是什么”,我回答“很多语言都用过,最近两年最长时间用的语言是C#和Java,不过自己并没有明显的语言偏好,毕竟语言只是表达想法的工具”,我这样回答的目的是让面试官知道我有比较强的适应各种语言的能力,同时也将这个职位中会重点要求的C#放到了明显的位置;由于这份工作和高性能计算相关,因此面试官接着又问了“什么样的程序可以并行化”,由于之前做了充分的准备(以前对高性能计算了解不多,但是在面试之前突击了一下关于高性能计算的东西,这叫“不打无准备之仗”),因此回答“任务之间互相依赖的就不能并行化,而任务之间不依赖的则可以并行化,比如计算斐波那契数列,由于各步之间互相依赖,因此无法进行并行化,而用累加的方法计算1到N的和,由于可以分成若干组独立的运算,然后运算结果再进行汇总,因此可以进行并行化”;接着面试官又问了“一个进程是运行在一个CPU上效率高还是运行在多个CPU上效率高”,由于我对多核编程不是很熟悉,本着“不懂得就说不懂,不要不懂装懂”的原则,我首先向面试官说明我对多核编程不熟悉,但是还是说出了自己的一些理解,说“一个进程在多个CPU上运行的话,由于系统需要在多个CPU之间进行时间片的分配、切换、调度,因此比在一个CPU上效率低”,面试官纠正了我的说法,他说“一个进程在多个CPU上的话可以让多个CPU的原件都充分运转起来,因此比运行在一个CPU上效率高,还有一些进程漂移的问题”,这个问题我的回答虽然不是正确的,但是我“不懂得就说不懂,不要不懂装懂”,而且也谈了自己的分析,也表明自己对“时间片”等计算机原理的东西有一定的了解,没有给面试官带来不好的印象,同时问到这个问题面试官也了解到我对多核编程了解不多,因此也就不会继续问这方面的问题,而会更多向其他我可能熟悉的方向问,这相当于“引导面试官”;我的简历中写了做过WMI方面的开发,因此面试官接着问“WMI不能做什么”,一般的人都会问“WMI能做什么”,这样的话一般就回答“WMI能做性能的监控、资源的管理等”就可以了,而这个面试官问“WMI不能做什么”的目的很明显,就是让我进行更深层次的阐述,因此我就回答“Windows能做到的WMI就能做到,Windows做不到的WMI也做不到,因为WMI只是对WindowsAPI、COM对象等的包装,只是一个胶水”,这样回答基本把我对WMI的深层次理解说了出来;接着面试官问“我在用WMI的时候碰到过这个问题:有时候执行一个查询的时候第一次很慢,以后就快了”,我说“WMI的架构是这样的:WMI中有一个CIM做为类似于数据库的东西,然后有Provider向CIM中提供数据,然后WMI查询器去CIM中查询数据。第一次慢的原因是因为LazyLoad,第一次调用的时候Provider先去进行数据的准备,把找到的数据放到CIM中,然后再查询,这样以后再执行WMI查询的话就快了。这只是我的猜测,我没做过验证”,我认为这样回答是比较好的,首先我将我了解的WMI的架构说了出来,然后说了我对于“第一次慢”的理解,但是这个理解是我推测出来的,没有得到验证,因此我强调“只是我的猜测,我没做过验证”,那么及时我的推测是错的,面试官也不会因此而降低给我的打分,反而会因为我善于进行分析、推测而给我加分。接着面试官把他的笔记本电脑放到面前说“我给你出一个很简单的题,你把它用程序实现出来”,他的题是“有一个字符串是用空格分隔的一系列整数,写一个程序把其中的整数做如下重新排列打印出来:奇数显示在左侧、偶数显示在右侧。比如‘2783229’显示成‘7392822’。要求在30分钟只能运行起来”。说实话拿到这种题,我也懵了。虽然我经常和咱们如鹏网的同学们说“要学好数据结构、算法这些基础知识”,但是工作很多年了,编的很多软件使用的都是语言、第三方提供好的函数库、类库,突然让自己写这种算法的题目也一时无法适应过来。不过很快我心态就调整过来了,就像我在《软件方向应届生求职面试指导》那个视频教程中提到的“面试官让当场写程序的时候不是只有‘写出来’与‘写不出来’两种结果,而是面试官是想看你怎么思考、解决问题的”,而且我也提到过“面试时写代码一定要把边界条件、异常情况考虑到,并且和面试官解释在做什么、为什么这么写”。我定了定神,想“具体算法怎么实现不管,但是要先检查特殊情况,也就是给出的字符串是否是‘用空格分隔的一系列整数’”,因此我先编写了如下的校验代码:Stringinput=”7392822”;String[]items=input.Splits(‘’);foreach(Stringiteminitems){inti;if(!int.TryParseInt(item,outi)){thrownewException(item+“不是合法的数字,给出的字符串格式错误”);}}很显然,这段校验代码的时间复杂度为O(N),那么整体的复杂度不可能比O(N)更低了,因此下面要写的代码的复杂度只要不高于O(N)就可以了。然后想了几种可能的解答思路,包括根据字符串的特点直接进行操作、排序等,但是都没想到非常好的方法。因为有一段时间没写C#程序了,程序调试了几次才编译通过,而且也不太习惯面试官的笔记本电脑的使用,把上面的代码调试通过并且进行刚才的下一步的筹划已经过去10分钟了,我打算在20分钟之内把这道题做完,这样就能有更多时间和面试官交流自己擅长的领域。既然没想到更好的方法,那只能写“老土”的代码了,毕竟能够运行起来是第一位的。我写了下面的代码:ListintlistEven=newListint();//奇数队列ListintlistOdd=newListint();//偶数队列foreach(Stringiteminitems){inti=int.ParseInt(item);if((i%2)==0){listOdd.Add(i);}else{listEven.Add(i);}}ListintlistResult=listEven.Join(listOdd);//将偶数队列拼到奇数队列之后原理很简单,就是建一个奇数队列、一个偶数队列,从前向后扫描各个整数,依次判断整数,如果是奇数则将将整数放入奇数队列,否则放到偶数队列。最后将偶数队列拼到奇数队列之后形成最终的“奇数在做,偶数在右”的队列。接着我发现在校验合法性和判断奇偶的地方我遍历了两次items数组,因此我又把这两部分代码合并,这样就只用遍历一次,虽然没有降低复杂度,但是还是降低了执行的步数:Stringinput=”7392822”;String[]items=input.Splits(‘’);ListintlistEven=newListint();//奇数队列ListintlistOdd=newListint();//偶数队列foreach(Stringiteminitems){inti;if(!int.TryParseInt(item,outi)){thrownewException(item+“不是合法的数字,给出的字符串格式错误”);}if((i%2)==0){listOdd.Add(i);}else{listEven.Add(i);}}ListintlistResult=listEven.Join(listOdd);//将偶数队列拼到奇数队列之后写完这个程序调试通过。又想到这个职位要求有一定的测试能力,因此又写了一个单元测试用例。一看表用了15分钟。因此把这个程序给面试官看,给面试官解释了我的思路。面试官说“不错,能在面试的压力下写出可以运行的程序已经很不错了,而且还对异常条件进行了校验,编写了单元测试用例,也用了List、Linq等C#中的高级技术。这道题确实只能将时间复杂度最多优化到O(N),但是你这里用了两个额外的队列进行存储,空间复杂度为O(N),我最期望的解答结果是你能用交换排序等排序的思路进行解决,这样最多占用一个中间变量就可以实现这个程序,无需消耗额外的内存空间。”因此在这里提醒如鹏网各位同学,很多像我这样的人写程序的时候总是想着降低时间复杂度,却忘了空间复杂度也是要去尽力降低的。不过据后来面试官说,他当时对于我在那么大的压力下能写出可以运行程序比较满意,因为这题主要就是想考察我在将近一年没有写C#程序的情况下会不会“手很生”。接着,面试官又出了一个题“编写一个区间类,并且编写一个进行区间加运算的算法”,由于距本轮面试结束仅有15分钟了,因此面试官说“大体体现你的思路就可以”,因此我首先编写了一个区间类Region,并且为它添加了MinValue、MaxValue两个属性和一个构造函数。接着我想进行加号的运算符重载,这样使用Region类的人用r3=r1+r2的方法使用了,但是我忘记C#中运算符重载的语法了,因此我就和面试官“我想写一个运算符重载方法,但是忘了C#中运算符重载的语法”,面试官说“没关系,不用关心具体语法,把想法表达出来就可以”,因此我写了一个Add方法:publicRegionAdd(RegionanotherRegion){//…}然后就和面试官交流这个方法实现的细节,包括怎么表示开闭区间、怎么考虑边界条件等问题,而且在面试官说道“区间中的值可能有整数、浮点数、枚举等很多类型”的时候,我抢在他之前说出了“可以用范型来解决,这样实现了IComparable接口的类都可以使用这个Region类”,这向面试官表示我知道范型、IComparable接口等知识。面试最后面试官说“刚才问你的问题中你没有完全回答出来也没关系,我们只是想从各方面了解你”。第二轮面试这轮面试主要侧重对于具体技术点的考察。问了很多技术问题,由于这些技术问题可能大部分咱们如鹏网的同学都没接触过,因此我这里只讲具体的对应届生求职有用的信息。下面列的问题我的回答并不是正确答案,只是对当时面试时我回答的一个真实记录而已。问题1:看你用过Powershell,能说说Powershell的运行过程吗?我的回答:Powershell其实也是编译执行的(这句话一出来,面试官的眼睛就亮了,问了一句“是吗?”),然后我就将我分析的为什么Powershell也是编译执行的分析过程讲给他。从这个问题开始我把面试官引导到自己擅长的各个技术的原理、运行机制的层面上。问题2:说一下netframework程序的工作过程。我把CLR、mscoree、mscoree的main、JIT编译等讲了一通,唾沫横飞,基本把面试官“喷晕了”。问题3:在以太网中怎么优化网络通讯的效率?我的回答:改用UDP
本文标题:微软面试 经历
链接地址:https://www.777doc.com/doc-1051419 .html