2016秋招面经(百度、华为、腾讯)以及阿里实习的一点感慨
秋招总结:
8月的时候投了网易互联网和360的内推,当时脑子一热都投了计算机视觉岗位,结果网易一面被刷,360二面被刷。其实我觉得我面试时表现已经挺好了,面试官所出的编程题也都完美解决。可能这个岗位需要深度学习的相关项目经验吧,我就一个与视觉相关的项目,而且只用了机器学习,入不了他们的法眼。之后我投的岗位就基本上是开发岗了。一路笔试下来,到9月22日有了百度软件研发岗位的面试通知。
百度一面:
首先面试官说他是做Hadoop的,看我简历上有Hadoop的一个项目,让我讲讲那个项目吧。然后就是问Hadoop相关知识,Hadoop的基本架构,mapreduce模型等等,然后要写一个wordcount程序。这些都算是Hadoop基础知识,我说得还算可以。然后面试官说,我看你使用语言是C/C++,你说说scanf的返回值是什么。这个我还真没注意,最后我只能说,我知道printf返回值是输出的字符数,那scanf返回值是不是输入的字符数?面试官说不是,要分情况...然后问我操作系统的题,进程通信方式,并问了如何加载共享内存,我说windows下用CreateFileMapping创建共享内存,然后用MapOfView映射到某个进程的地址空间。随后他又提了这块内存什么时候会复制的问题,我想大概是“写时复制”这个策略吧。
最后是一道简单编程题,求链表倒数第K个节点。
百度二面:
二面感觉全程在问项目,我简历上写的三个项目都被从头到尾,仔仔细细问了一遍。随后是操作系统题:进程通信和线程通信问题;堆和栈的区别。C++问题:指针和引用的区别。手写编程题是旋转数组中找某一个数。然后一道大数据题,有两个数组,每个数组的数组个数海量,但每个数组中数字都只出现一次,如何求两者重复的数组数字。我说先把数组保存到HDFS上,然后用MapReduce模型去解。他说差不多。二面总共面了大概1个半小时。
二面应该还别的问题,我忘了一些。我那天面试,每次面试完,面试官会拿出一个小纸条,上面写着“XXX,恭喜你通过了面试”,然后由面试官交给hr。然而戏剧性的事情发生了,当天晚上我收到百度hr电话,叫我参加二面,我说我通过了啊,然后hr说那可能是数据库没同步吧。我说通过了的话什么时候三面,hr说周末就会有通知。后来我周末一直没收到通知,而且周末开始忙于腾讯广州面试,就暂时没管这百度。直到9月27日面完了腾讯,我打电话问hr,说担心二面成绩没录入系统,hr说深圳百度面试已经接近尾声了,不过她可以帮我查查二面成绩。然后就没有然后了,既没通知我查询结果,我打电话想询问也拒接。还好那时我感觉腾讯华为的offer已经稳了,就懒得再和百度纠缠。
华为面试:
9月24日面了华为。华为这招聘系统也有问题,我实习生招聘时投了简历也面了试,招聘系统上一直显示面试中。这次校招,新投递了岗位,却没有笔试和面试的任何通知。看到牛客网上也有别的地区的同学是这种情况,但这种情况可以直接去现场霸面,我就问了身边同学华为的招聘地点,赶过去霸面。华为面的岗位是大数据开发工程师。众所周知,华为面试一向很水,基本上都是我在说项目带节奏。总共三面,我就记得问了这么几个C++题目和操作系统题,都是老生常谈了,没什么大的价值。
1. C++11新特性
2. C++内存分配
3. 模板偏特化是什么
4. 进程间的通信方式
然后就是9月25日开始在广州面试腾讯,报了IEG客户端开发岗位。本来以为来面试的人和华为一般多,整个酒店热闹得像个菜市场,结果发现腾讯面试好冷清,一个等待的大厅里没几个人,到了hr面时我就只剩四五个了。每一次腾讯面试都大概40分钟。
腾讯一面:
一面的面试官没让我自我介绍或项目介绍,一上来就连做三题:反转链表,包含min的栈,求二叉树深度。这些都挺简单。然后问了一道智力题,容量10升桶中有10升油,另有7升空桶和3升空桶,怎么把10升油均分到10升桶和7升桶中。
之后问了C++知识:说一下纯虚函数;什么时候需要虚析构函数。知不知道PDB文件。
操作系统问了进程与线程的区别;进程间的通信方式(我也是醉了每次都被问这个)。
问我了不了解渲染方面的知识,我说我学过OpenGL和DX,同时对游戏中相关的一些图形算法的原理有所了解,消隐,光线跟踪,碰撞检测,八叉树,BSP树什么的。然后问我会不会U3D,cocos2D-x,我说不会。
最后问我是怎么学习C++和算法的,我就开始侃大山了,先听课,再看经典书籍比如《Effective C++》,《Thinking in C++》,最重要的是项目中练习云云。
腾讯二面:
二面就比较正规了,面试官让我先自我介绍,然后让我挑一个项目讲一讲。接下来先问了C/C++,问我指针和数组的区别;重载和覆盖的区别; extern ‘ C ’ 声明一个函数有什么用;接着又是操作系统,windows平台下进程通信,线程通信的方式;操作系统的内存管理;算法就让我讲了下快排的过程;然后问了游戏渲染知识,可编程渲染管线的流程是怎么样的;接着让我说了下碰撞检测的方法。会不会U3D...感觉这些我都答得不错,面完我就知道肯定进hr面。
问完后又和我聊天,喜不喜欢玩游戏啊,玩过什么游戏啊等等。这个时候表现出自己的游戏的热爱就行了。
腾讯HR面:
这一面就纯粹聊天了,是个男HR,问了我大学期间个人成长,个人兴趣爱好,实习期间的困难和收获,对腾讯公司的认识,对腾讯游戏的认识,面试官还和我聊了华为和腾讯,阿里和腾讯企业文化的差别,特意提到小马哥是很低调的一个人......最后谈了下个人期望薪金。总之我感觉和腾讯hr聊天十分轻松自在,没有太刁难的问题,可能我之前被阿里hr搞怕了吧......
听说今年腾讯校招名额听说很紧张,一面时没让我自我介绍和项目介绍,我以为面试就走个过场,一面肯定挂了。后来感觉他们也没出很难的题来为难面试者,给我感觉还是想招人的。可能我运气比较好吧.....
经过这几次面试,我也总结了一些面试经验,与各位分享。我觉得面试官很多时候问的问题都是很宽泛的,比如让你说说纯虚函数,如果这个时候只回答一句纯虚函数只是虚函数后面加个 ’’ = 0 ’’ ,面试官肯定不满意。我当时先是说了纯虚函数是如何声明的(就是加 ’’ = 0 ’’ ),然后说了纯虚函数的作用是为子类提供一个接口,而普通虚函数除了为子类提供一个接口以外,还提供了一份缺省实现;其他非虚函数则是为子类既提供了一个接口,也提供了一份强制性实现。然后说了具有纯虚函数的类是抽象类,不能创建类的对象。随后介绍了具有普通虚函数类对象的内存分布情况,以及虚函数的实现机制。感觉这么回答后,关于虚函数一块的知识,或者说是面试官想问的有关虚函数的知识,基本都讲到了。
还有一个例子,腾讯二面时让我讲讲内存管理,这时首先要问清楚面试官重点是想问页式内存,段式内存那些内容,还是说堆,栈这些内容。当时面试官回答我说是堆,栈。我是这么回答的,首先在纸上把进程内存排布画出来,然后简单说一下堆从下往上增长,栈从上往下增长的个人理解;随后就是一些常规内容,比如局部变量用的是栈空间,由操作系统管理;动态分配出来的内存是堆空间,由程序员自己管理;堆上分配空间的缺点(慢,碎片,容易泄露);windows上堆内存管理的相关方法,比如bitmap,空闲链表;针对内存碎片化采用的方法,比如slab系统,buddy system。C++对于内存泄露所采取的一些措施,讲了下智能指针的原理,“以对象管理资源”的编程思想。
另外还可以从一些简单的问题上去挖掘深度。腾讯二面时问了我快速排序的大致思想和过程,我想这个只要稍微有点算法基础的人都会吧。我把基本思路说完之后,主动说了几种快速排序的优化方法,比如枢纽元三数取中,排序数组个数小于一定数目之后用插入排序,元素聚集,用非递归方法去编写快速排序并与递归方法比较。
面试官问的可能是一个点,但我们回答的时候最好从这个点发散出去,回答一个面。可能回答中有些细节地方会说错,但只要大方向是对的,面试官一般不会深究细节。这样的回答可以让面试官觉得面试者基础扎实。总之,我们回答问题要主动,尽可能说全说深。这样做还有一个好处:可以把面试时间给耗掉一些,这样面试官问别的问题的数目相对就减少了,减小自己被问到自己不会的问题的可能性。
此外,即使被问到自己不会的问题或者弱项,也要想方设法引导面试官,尽量把一些自己不会的问题转为自己会的问题。比如腾讯二面时,面试官问我会不会U3D,我说不会,因为我觉得很多计算机图形学的算法都是被U3D封装好的,比如碰撞检测。我现在更想去了解这些算法的原理,有一个扎实的基础,而不是仅仅会使用某一个函数,懂了原理后学着使用这些库是一件非常简单的事情。这时面试官就顺着我的路子让我讲讲碰撞检测算法的原理,而这个算法是我早有准备的,讲得也比较好。
秋招就算是结束了,BAT华为网易360这些大公司差不多都已结束招聘,其他小公司什么的我也不打算笔试或面试了,这过程实在太难熬。这里吐槽一下阿里实习,奉劝以后学弟学妹,如果找实习能找到别的好公司,就不要来阿里实习,因为即使没来阿里实习,阿里实习offer可以转为一个叫做“直通终面”的机会,到时候校招如果想来阿里,可以和实习生一样,只要面个总监面和hr面就可以了。至少对于今年我所在部门来说,阿里实习生在转正方面没有太大的优势。
最后感谢牛客网提供了一个给秋招同学交流的平台,并祝大家都能获得自己想要的offer!
#阿里巴巴##腾讯##百度##华为##C++工程师#