微软面试记
通过朋友的推荐,我得到了一次和微软全球支持中心接触的机会,全球技术支持中心就是GTEC(Globle Technical Engineering Center),地点在上海美罗大厦二十楼。
三天前,我接到一个微软工程师打过来的电话,要求我找一个座机他打过来,进行电话面试。因为当时找不到座机,我也就告诉对方可以在手机上进行面试。先请我作一个两分钟左右的自我介绍,我说了:姓名,学校,专业,爱好,技能情况,获奖情况。对方没有对我的介绍做评价,直接进入提问阶段。第一个问题是进程和线程的差别。这算一个热身问题吧,我对Windows NT基础掌握得不错,从线程,进程的定义,相互联系情况,线程,进程之间的通信,同步方法作了详细的介绍,我觉得我回答得比较好,是一个很好的开始。第二个问题是heap/stack的差别。嘿嘿,这个问题我在论坛上跟朋友讨论过很多次了,我直接说出他们实质上的一致性和用法上的差别,然后具体到heap管理API,并且结合C/C++中的new/malloc进行了讨论。对方听见到我说到malloc,立刻就要我回答C/C++中heap的管理和系统API之间的关系。其实我要是不了解这两个的关系,我在前面是不会他们结合起来讨论的。我直接切如CRT进行讨论,对方比较满意,然后问了一些CRT的相关问题,比如CRT除了调用系统api,他自己要不要做一些工作等等。以上的问题我自我感觉非常好,因为这些都是我平时关心的话题。接下来的问题是关于COM的,对于COM,我是理论大大多于实践,我对COM的知识完全来源于Essential COM。我讨论了COM的目的,C++的缺陷,COM为什么是better C++,COM的线程模型等等。我回答得有点乱,因为对方没有问COM具体某方面的东西,我就尽我所能,按照章节把essential COM里面的东西说了一遍,基本上抓住了要点。这是对方突然又会过去问内存方面的东西,问Windows 下的内存是如何管理的。我一时没反应过来,本来应该先说内核空间/用户空间的区别,然后说进程空间,然后再深入。结果我直接就开始从分页机制开始说,我说每个进程都有独立的32bits空间,寻址通过分页完成。分页其实不是Windows NT内核做的,主要是IA32 chips做的。然后具体说了32bits地址如何映射成物理地址,GDT/LDT,导致虚存转换的GP异常等等。我说完了对方沉默了几秒钟,我想大概是在考虑下一个问题是什么。果然,下一个问题就是安全性。我平时不太注意安全性,只是在看inside win2k的时候了解了一部分。我说用户登录的时候会带一个token,通过token来对这个用户访问的object做限制,然后对方要我说windows privilige,我不清楚这个权限到底是什么,问他是不是要我说ring 0/ring 3的东西,对方说不是,那我也猜不出这个是要我说什么,我也就只有大概介绍进程独立阿,用户态不能访问内核态阿一些基本的东西,感觉对方不太满意。到这里,面试基本上进行了2/3,接下来有两个问题,介绍.net和.net的安全性。天,我上个星期才开始了解.net,而后来才知道对方是ms GTEC .net方面最牛的。还好我看的是bible: essential .net,我就大概背了一些书上的内容,better com ,具体的优越性是什么,是如何实现的。然后对方问我客户端如何访问.net组件实现web service,我心里在想,调用远程的.net 组件就可以了阿,不知道他要问我什么。于是只有说了说web service跟传统的application的差别。现在想起来对方可能是想问我xml/soap,可惜当时没想到。最后一个问题就是.net的安全性。My God!security是那本书里面的倒数第二,三章,我恰好看到倒数第四章。没办法,我只说了我了解的数字签名保证组件完整性,关键的domin我就没有说,只有承认自己还不太了解。当然,中间还插了一些小问题,比如是否了解Windows DNA阿,可惜我不太了解,只知道是个三层结构.电话面试基本上就到
此为止,对方让我等下一步通知,掐掉电话,一共用了17mins,自己感觉还好,不过太仓促,我是躲在实习公司的厕所里面打的电话,中间还被扫地的大妈赶出来了一次。更寒的是,我还不知道如果我申请的到底是什么职位。
电话面试完后,我才开始整理一下自己的思路,打听微软大概给我提供什么样的职位。结果发现自己的手机居然被打欠费9块钱。立刻下楼买了张卡。中午我了解到微软是不可能提供正式员工的职位的,因为现在微软对正式员工的head count控制得非常紧,招进去的都是有工作经验的。他们可以向我提供的职位是其他公司派驻微软的技术支持,在微软工作,mentor是微软的工程师,只是签约不是跟微软签,而是跟第三方公司签,待遇和福利也没有微软正式员工那么好。不过我还是非常满意,因为在电话面试里面我所听到对方提出的问题,都是非常专业,一针见血的,而且在这几个问题中,的确能够非常好的反映出我的实际技能情况,而且我也通过朋友了解到,在目前情况下,对一个应届生,除了现在正在招聘的微软研究院,这基本上算一个最好的出路,能够学习到很多东西。
两个小时后,我又接到微软的电话,约我星期一上午九点去美罗大厦20楼面试,还问了我什么时候可以开始工作。我感觉对方对.net非常重视,于是在周末看完了essential .net剩下的部分。
星期一来到美罗大厦,走到楼下一看,上电梯都要排队!不过还好,美罗城的电梯是能装20个人的哪种,很快就上去了。因为我只知道我是来面试的,不知道是面试什么部门,也说不出对方的名字,这让前台比较为难。帮我问了二十分钟后,终于领我到了一间会议室,里面有一个工程师等着我。坐下来以后对方也没要我自我介绍,而是在看一份东西。我仔细一看,大吃一惊,这东西是我半年前随手写的一个简历,里面什么具体的东西也没有写,立刻拿出新准备的简历递过去。因为新简历比较有条理,对方看起来也比较快,很快就知道了我的大致情况和技能情况。然后就我简历里面写道的熟悉C/C++编译器实现细节开始提问,问题是虚表是如何完成的,其实这是一个小问题,但是VC里面对于虚表实现的细节非常的多,我也都有了解,所以我还不知道从何所起。整理一下思路后,我先说我是从inside the c++ object model入门的,然后谈了什么情况下有虚表,保存在什么地方,成员函数调用的时候如果访问到虚表,虚函数重写是如何实现的。然后对方问我纯虚函数和虚函数的差别,我直接回答对方除了在语义层面上虚基类不能具现object外,再续表上没差别。然后对方要我说说多重继承下的内存布局,于是我就分普通多重继承,虚多重继承讨论,说到这两种情况下如何修改虚表里面的内容,各个编译器在实现上哪些是一致的,那些是不同的。说完C++,对方就开始要我讨论COM的线程模型。这东西我当初了解得很清楚,不过很久没用,忘记不少,MTA这个名字我都忘记了,只有用中文给他说.我说道为什么会存在线程模型,为什么要列集,散列,进程内的STA通过hidden windows message queue实现安全性,本地通过LPC,远程通过PRC等等.把基本上的说清楚了,具体缓解比如代理,存根接口,我只说了通过MIDL会自动生成标准的.c 文件,更具体的由于我不太清楚,也就没有深入讨论了.然后对方又问道IA32下的分页机制,我还是照着电话面试里面的内容说了一遍,说完以后就问我有没有用过VB,我说我高中用过,大学里面用过VBA,在Excel里面调用COM,还用过ASP.然后还问了我对数据库是不是熟悉,我说我刚刚开始学.然后问我对.net熟悉不,我大致介绍了一下我学习.net的情况.问题就到此结束.整个过程中的谈话我们都是越来越放松,还不时说到一些平时自己如何学习的话题等等,最后对方让我等一等,说让下一个人来面试我.走的时候对我笑一笑,我觉得他对我是比较满意的.
等啊等,过了五分钟没人进来,我就在办公室到处逛.无聊了就坐下来,大约一共过了十二分钟,终于来了一个瘦瘦的工程师,很热情,进来就主动跟我握手.做下来也没有要我自我介绍,直接问我对数据结构了解的如何,我说我了解得不错,于是他就出题问我.题目是:给两个变量,如何找出一个带环单链表中是什么地方出现环的.我看过expert C programming,里面最后有一个短文是介绍微软面试的,第一个题目就是如何判断链表出现了环,里面讨论了四种情况和各自的特点.虽然问题跟这里不同,但是既然我看到了,我就要突出自己一下,于是个他说了如何判定是否有环.他非常满意,但是申明他的问题是要找出环出现的节点,因为受到判定环算法的定向思维,我在一分钟内没有找出一个很好的答案,于是就问了一些"是否一定有环"这样的问题来拖了一下时间.后来我想到对方主要是考验我的思维能力而不是一定要解答出这个问题,我就说了一种不一定行得通的方案,做法就是先找到环内部的一个节点,遍历环一周,把访问到的节点地址相加,然后在第二周,把访问到的节点相减.因为出现环的节点会被多计算一次,所以最后得到的值就是出现环的地方.其实当时我就知道这个方法基本上行不通,但是对方还是对我这种做法感到非常满意,虚惊一场.第二个问题还是IA32,问我在IA32中一共有多少种办法从用户态跳到内核态.这方面的东西主要是IA32 vol3里面介绍的,我只记得Windows 跳入内核态的方法.于是我就开始说,说到一半,我突然想起以前讨论CIH病毒实现方法,就是通过任务门跳进去,想到这个,接下来的中断门,陷阱门也就想到了.好像对方对IA32比较有兴趣,问道我是如何用汇编做的Windows平台下的mp3播放器,于是我就说资料来源主要是网上的,同时用汇编编写win32程序其实跟用c语言调用sdk没什么差别,然后还老实承认mp3解码部分不是自己做得等等.接下来的,还是COM.第一个问题还是COM的线程模型,然后讨论进程内/外组件的差别.我的回答跟一面的回答差不多,回答完以后,对方问我知不知道IUnknown接口!哇,他这不是放我发挥嘛.于是我针对这个接口的三个函数作了讨论,重点是 queryinterface,讨论了essential COM里面强调了三个特性,对方终于满意了.接下来的话题就很轻松了,问我看过哪些原版书,我问他那方面,他说不管什么方面,说出名字就可以.嘿嘿,偶的强项啊!从C++开始说,五本宝典说完了就说windows SDK方面的aw/inside win2k,然后说调试方面的windows debugging,然后说TCP/IP方面的两本bible,我还准备说msj里面的under the hood和看过的ms无错编程这些更专业一点的东西,但是对方笑着把我打断,看来后面的不用说了.最后问我对.net知道多少,.net啊.net,我最不熟悉的东西.他让我介绍process/thread/domin/thread pool的差别,还好,我仔细看了domin,前面两个我本来就知道,thread pool我知道是什么东西,于是说就说了我自己知道的部分.说完了看得出来我也了解我.net的水平很有限,然后问我如果一个class里面只有一个private成员,客户怎么访问,我想了想,实在不知道,一点都不知道,就只有说不知道了,他笑着给我介绍了一下,然后再问了一个.net的名词解释,我还是不知道,他说没关系.总的来说挺不错,他让我等着,然后出去了.
这次等得更久,估计有四十分钟吧.我前面说得好累,好想喝水,不过找不到,也就只有算了.第三个面试官是个女士,估计是他们的专业hr.没有问我技术问题,一来要我自我介绍,我估计他不是搞技术的,于是就大致介绍了一下我的情况.然后他给我说,前面几个工程师对我的印象是,底层掌握得还不错,但是对上层的知识比较欠缺,但是他们主要做的就是上层的支持,所以在考虑我是不是适合这个职位.其实这也是我考虑的问题,因为就我个人来说,我欠缺的是.net方面的东西,但是我对.net是非常有兴趣,所以我有信心做好.于是我就给他说了我的想法,说到我为什么要先深入学习底层的东西,自学能力如何,兴趣如何.但是对方还是担心如果让我做支持,接触到的不是一些sdk开发,我会不会反感,会不会觉得自己大材小用之类的.天啊,在ms里面我敢说我大材小用???!!!!这不是在张三丰面前耍太极嘛!于是赶忙说出自己的看法.对方接着问如果客户老是问一些简单问题,我会不会厌倦.其实我在论坛上有时也挺反感一些重复的简单的问题,但我不能直接这样给hr说啊.我说当年我就是问这些菜鸟问题的菜鸟,所以我不会觉得这些问题是没有意义的.但是对方强调说就算暂时不这样,那你会不会觉得自己的能力没有得到发挥.我接着说,就算一个简单问题,不同的人有不同的回答方法.如果技术好的人,他的回答会有前瞻性,能够从用户的问题和问问题的上下文了解到用户实际上的需求,除了解答当前问题,还能够给出建设性的意见等等.说完这些,对方基本上满意,没有继续问了.然后问我有什么问题,我说我想详细了解这个招聘的流程和我实际的职位.于是她告诉我今天面试完了一个星期后会有通知,看我是否适合这个职位,同时也要看有没有空余职位.然后再给我强调了这个职位不是正式员工等等.看来他是非常了解刚毕业大学生的心态.总的来说,这一轮面试不好不坏,我们双方的印象都一般,但良药苦口,我们双方还是得到了更多的了解.她最后让我等着,说还有面试.天啊,还有???
这次没有等太久.过了五分钟,来了一个pp的年青女士,非常有魅力.一进来就跟我握手,然后说"nice to meet u!".坐下来后,她用英语说这个技术支持的职位可能会是国外的客户,在电话或者email方面都会是英文的,所以要考我的英文能力.我开始还准备问她是不是要我用英语回答,但是自己想想,摆明了是要你用英语回答,你问她她肯定拿你当方脑壳看,于是立刻调整语言习惯.一来就是用英文自我介绍.还好自己心里面有个中文提纲,于是就发挥发挥,用英语开始说.基本上还可以,我说的她都能够挺懂,我自己也觉得突出了要点.接着她要我描述一件自己克服过的难题,于是我就举了一个例子.然后她就简单介绍我会面临的工作,口头英语和笔头英语.问我英语哪方面最欠缺,我说口语,因为书面英语在看资料的时候我就得到训练了,但是口头英语平时是没有机会训练的.她点头表示满意.然后问我给自己书面英语打分会是多少分,满分十分,我开始没听懂,没办法,就只有说could u give me a n example?然后她说比如她觉得他口语一般,她会给自己6分.明白意思后,我说我给自己书面英语8分.开始想谦虚一点的,但想想,说不定她会觉得你会夸大自己,最后她会在你的自我评价上再减个几分,反正平时看资料基本上都是英语,心一横,说了个8分,她听了觉得不错,说我对自己很有信心.sigh,想想自己cet6 62分过的,悬阿!然后开始问道对客户的态度,什么算是good service,什么算是bad service,如果有的用户一直blablabla说个不停我会怎么办.如果用户说的我基本上听不懂我该怎么办等等.整个过程中我说得比较流利,中间只有她的一次问话我没有听懂,用一些中性词代替过去.问题本身比较有难度,英语到不是很难,所以只要自己能想到答案,说清楚还是可以的.同时她会非常真诚的跟你交流,有的时候会帮你补充一些你没有想到的词语等等,我觉得这次英语面试还是听成功的.最后,她说让我等等.算了,麻木了,懒得管后面还有多少轮了...
哪里知道只过了两分钟,第三轮面试我的hr又来了,直接给我说今天的面试结束.我跟她一起出来,开始还以为她要帮我按电梯,那里知道她直接去另外一个办公室.其实ms对我也够好了,面试一共花了两个小时,看得出来还是很重视的。我也尽量发挥了自己的优点,我相信我的能力他们还是觉得不错的,就看他们觉得我是否适合做这个support的工作了。电梯下到一半,我才觉得好累,不过整个过程还是很好,至于结果其实已经不重要的。除了电梯,打开手机,立刻就收到一个短消息,是我朋友发过来的,内容是ms的对我比较满意,获得这个工作有比加大的可能性。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==
1.进程和线程的差别。
线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
2.测试方法
人工测试:个人复查、抽查和会审
机器测试:黑盒测试和白盒测试
2.Heap与stack的差别。
Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。
3.Windows下的内存是如何管理的? 软件开发网 www.mscto.com
4.介绍.Net和.Net的安全性。
5.客户端如何访问.Net组件实现Web Service?
6.C/C++编译器中虚表是如何完成的?
7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。
8.谈谈IA32下的分页机制
小页(4K)两级分页模式,大页(4M)一级
9.给两个变量,如何找出一个带环单链表中是什么地方出现环的?
一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方
10.在IA32中一共有多少种办法从用户态跳到内核态?
通过调用门,从ring3到ring0,中断从ring3到ring0,进入vm86等等
11.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?
用内存映射或全局原子(互斥变量)、查找窗口句柄..
FindWindow,互斥,写标志到文件或注册表,共享内存。.
12.如何截取键盘的响应,让所有的‘a’变成‘b’?
键盘钩子SetWindowsHookEx
13.Apartment在COM中有什么用?为什么要引入?
14.存储过程是什么?有什么用?有什么优点?
我的理解就是一堆sql的集合,可以建立非常复杂的查询,编译运行,所以运行一次后,以后再运行速度比单独执行SQL快很多
15.Template有什么特点?什么时候用?
16.谈谈Windows DNA结构的特点和优点。
17.网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。