原创博客,转载请联系博主!
今年微软在线笔试坑了,东拼西凑一共140分,心想哎自己和微软肯定无缘了的时候,忽然收到了微软的email问我愿不愿意接受调剂去CSS部门,抱着“既然笔试坑爹了,那好歹得去微软看两眼”的心态就去接受了调剂,然后就是一面二面三四面,遂作回忆录如下(由于我写下这篇博客的时候,时间已经过去了一周,所以有些问题可能会有遗漏):
(前三面为SQL Server组)
第一面技术面:
1. “首先用英语做一次自我介绍吧”,于是我就用我的蹩脚的英语勉强完成了个自我介绍,这里应该扣了些分。
2. 第一位面试官对我的博客很感兴趣,所以接下来的几个问题基本上都是围绕我的博客问的
2.1 她对我是否会做heap dump深表怀疑,我说我做heap dump只是java初级的操作,dump下来后结合jhat分析heap里面哪些对象的存在个数过多并且导致fullGC次数过多的话,就可以怀疑程序之中是否存在内存泄漏,当然工具也可以使用第三方的,功能会更齐全更容易上手,比如MAT。
2.2(这里具体的问题我有点记不清了)大概是让我描述什么是栈,什么是堆。我说这个要从汇编指令的角度分析最客观,一个程序逐步执行的本质是IP寄存器地址自增逐条访问内存之中的指令,每次函数的调用会将当前IP压入运行栈中,然后再将局部变量压入栈内跳转到其他函数继续进行,这种方式是stdcall,函数调用的方式一共有4种:stdcall,cdecl,fastcall,其中cdel依赖于bp,sp寄存器,c++在此基础上又补充了thiscall,就是在压入IP之前先压入对象的地址,那么一个完整的程序的生命周期无非就是栈空间的变化,栈的本质是记录计算机自身的运行状态。堆的话,应该是依赖操作系统的调用,大多数情况好像是malloc,c++虽然补充了new关键字,但是本质上底层调用依然是malloc,而且c++也比c多了freestore的概念,简单的堆的本质是一个树状的数据结构,在linux中基于堆的内存动态分配,是基于伙伴算法和slob维护的。
3. 情景假设题,假设我使用的是服务器a,而部署在服务器b上的数据库现在出现了问题无法正常连接,要怎么样解决这个问题?我:要解决问题应该自底向上去分析,首先是链路本身的网络是否连通,这个需要一些网络诊断工具去协助我们判断,如果是系统自带的工具的话可以使用ping或者是telnet,但是ping发送的是icmp包,在绝大多数硬件防火墙都是会屏蔽掉icmp包的,所以使用telnet直接尝试建立tcp链接应该是最直截了当的做法。其次要检查os kernel本身的问题,这里首先是检查网卡是否正确放进了pci槽里(lspci),其次检查网络驱动安装是否正常(lsmod,dmesg),如果出现了问题尝试重新安装网络驱动,还有要检查本身的网络安全软件是否限制了一些数据包规则,这个坑我在携程是遇到过的,当时内网连不上smtp站25端口,问题层层排查,最后锁定在了os层,在安全部门沟通后修改了麦咖啡的规则最后fix掉了这个问题。最后如果网络和本机都没有问题的话就ssh到服务器的部署机上检查b的配置状态。
4. 讲讲数据库的索引:我说我对数据库真的了解的不多,oracle的db索引貌似大体是使用b树组织的,而其他主流的数据库是使用b+树及其变形的,论其本质嘛应该是时间和空间的trade-off,使用冗余的数据去加速数据的增删改查的过程。
第二面技术面:
1. 聊聊TCP吧:(我擦嘞,TCP这么大的概念怎么聊啊!)嗯,TCP应该是对现代网络通讯作用最重要的协议之一了,然后我就把TCP能想起来的东西都说了一遍,印象里貌似说了挺久的,也应该还算挺全了。
2. 编程题:输入一个数字,如果被3整除输出bat,如果被5整除输出man,如果同时被3和5整除的话输出batman。(我擦这题好简单!)我就按着他的描述直接翻译成了c语言手写下了代码,但是他说这并不是他想要的答案,叫我继续思考,经过一段思考之后,得出了结论:
if(!num % 3) printf("BAT");
if(!num % 5) printf("MAN");
3. 脑筋急转弯: 一个密闭房间有3个灯泡,在房间外面有3个开关,问怎么样只进入一次房间就知道哪个开关对应哪个灯泡呢?
我:这个好像思维需要发散一下,从线性代数的角度去看,这个问题的系数矩阵的秩小于需要解的向量长度呀!需要额外找到一个条件,那么是不是“蹂躏”一个开关,最后导致房间内的某个灯泡爆掉,再开一个再进入房间内检查呢?面试官:嗯,勉强算一个答案。
4. 编程题:一个单向链表,a->b->c->d->e,怎么在c的位置从链表中删除c(把链表变成a->b->d->e)呢?
把c的地址内存区域覆写成d的数据,当然这里还需要注意一个内存泄漏的问题,在覆写之前把d的数据复制到栈空间,然后再free掉d的数据,再进行覆写就可以完成这次连表的更新操作了。
5. 谈一谈对css部门的理解
然后面试官给我介绍了一些css工作的一些情况,并且把介绍了一些新员工培养的项目比如MACH等等。
第三面经理面:
(这里考验的基本上都是软技能)
1. 英文进行一次自我介绍
2. 英文讲一下前面的面试,讲讲微软有哪些地方让你做的不满意
3. 讲讲你在携程的这段时间的收获
4. 讲讲对技术支持的工作的理解,哪些是你应该注意的
当天下午面完了以上三面之后,又过了一天接到了HR的通知,恭喜我因为在前面的面试中表现得比较好,被经理推荐去了Azure部门,于是就有了第四面:
第四面Azure经理面:
第四面非常轻松,基本上是在聊天的状态,经理和我介绍了很多关于Azure的CSS工作内容。然后我就提了一些关于Azure业务的问题,包括是否可以接触到Azure的源代码等等,第四面结束后不过半小时HR就来电话,告知我不出意外的话是在3天之内拿到offer,准备签定意向书。
有点陷入了迷茫,该选择微软AzureCSS还是阿里淘宝java研发..
ps: 最近身边的朋友据说有点黑携程的言论,我是表示坚决反对的!携程真的是一家非常非常好的雇主,无论是工作压力或者员工福利都是上上层的!不服是伐?看我们员工聚餐!(不好意思,找了找以前照片没找到,就从同事朋友圈扒了几张!来自外滩附近某五星级酒店!)携程真的是好,有点依依不舍..