腾讯后台开发一面二面纪实


今天面完腾讯后台开发的二面,本着攒点人品的态度来写这个帖子,顺便等一下面试官大哥更新我的状态,干等真的很焦急。

本人上海四大高校之一的一名软件专业的研究僧,校区坐落在寂寞荒凉的嘉大荒。本科非211重点大学软件工程,有过一年半的软件开发经验。专业课基础相对比较全面,算不上十分扎实,但是基本上数据结构、操作系统、网络、C++这些课程里面有什么,是干什么用的,也都了解,leetcode刷过一些题,但不是那种大神。以上是本人简况。

不知道3月多少号,网上投的腾讯游戏后台开发,怀着一颗拳拳之心想去开发游戏。  4月3号做的笔试题,选择题部分做的比较快,代码题,遇到了leetcode上的原题,比较走狗屎运,基本上做完了就知道,肯定能进面试环节那种。

不知道等了多久,别的小伙伴已经陆续去面试了(后来才知道,是内推的,不是网申的),然后自己的还没有一点消息,内心里其实已经放弃,有点怀疑自己。结果4月15号下午,突然接到腾讯面试的短信,面试时间是4月17号上午11:30,于是内心的火苗一下子燃起。再然后是手忙脚乱开始准备。C++、操作系统、数据结构、数据库、常见设计模式、项目经验这几块开始准备。

C++部分,指针部分我有信心能hold住任何笔试题,C++我比较模糊的地方是后面几章,多态、虚函数、动态绑定这一块内容,于是又好好看了一下。还有C++程序员需要自己写内存管理的代码,于是顺便把智能指针的代码也准备了一下,基本达到100秒能写出智能指针代码的那个水平。

操作系统是我的强项,因为连续两年在带考研辅导班的专业课,这几门的概念我都比较熟悉。但是还是准备了一下操作系统的一些比较重要的概念,包括:进程与线程的区别、进程间通信、进程同步与互斥、死锁、银行家算法、几种常见的调度算法这些问题。

数据结构基本概念我都还记得,没敢大意,认真准备了一下,线性表部分没管,链表的翻转、创建、搜索这些比较基础,没看,直接从树开始准备。树的一些概念,常见算法,四种遍历方式,二叉排序树,平衡二叉树,几种常见的排序算法,快排(一定要好好看)、归并、二分查找,这三个是比较高频的算法了,出现在各大公司基础面试中的概率非常高,又把这些代码看了一遍,基本上能达到100秒内能写出来,不带停顿的,并且没有Bug(这是基本功,一定要好好准备,而且来得及,就那么几行代码,现在临时去刷题肯定来不及,不如把基础搞搞扎实。你想想,一个二分查找那么简单的算法思想,几行代码,你墨迹个十分钟还没写出来,面试官会相信你很牛逼吗)。还有一些常见的算法的效率,复杂度,全部又过了一遍。堆排序这些乱七八糟的东西翻了一遍。

网络OSI/ISO七层协议栈,每一层叫什么名字,各自是什么功能,复习了一下,然后直接从网络层开始复习的。路由器转发规则,一些常见的概念。tcp的三次握手四次挥手的过程,tcp和udp的区别,应用层的常见协议,http协议,长连接短连接,常见端口号,等等。

常见设计模式就准备了一下单例模式,因为这个被问到的频率特别高。准备了一下C++下写单例模式的代码,还有单例模式线程安全的问题,怎么防范。
------------------------------------------------------------------------------
然后就去面试了。提前十五分钟到那里,神旺大酒店,2L等候,我去时已经坐满了人。刚好碰到一个面后台开发的,被鄙视了。面试官问他HTTP的原理是什么,他说用TCP,又问他TCP三次握手四次挥手的过程,他估计没答好,后来面试官就在凑时间了。我赶紧把这些问题再想一遍。
等了很久,终于等到我了。拿了一个号码,去了号码所指示的房间。进门之后跟面试官说了一声“你好,我应该把门关上吗?”他说关上吧。然后就把简历给他,他让我自我介绍。我一边自我介绍,他一遍看我的简历。然后让我说了一个我觉得最有自信的一个项目。因为我投的是后台开发,我就说了一个多线程的项目,巴拉巴拉讲完了。他说这是一个典型的生产者消费者模型,问我要不要加锁。我说对消息队列的访问我是加锁了的。之前想过,生产者修改消息队列的头,消费者修改消息队列的尾,有试过不加锁,后来觉得性能没有太大影响,为了保险起见还是加锁了。他又问我能不能不加锁,问我有没有什么办法。我想了一会,我说注册回调函数能不能。注册一个回调函数,不断监视消息队列,有消息过来的时候就通知消费者过来消费。他想了一秒钟,没对我这个想法进行评价。然后让我写一个二分查找,给我一张白纸,我先给他讲二分查找的思想,讲了一半,他似乎听的有点不耐烦,就说让我直接上代码。我憋口气,大概80秒左右写出来了,洋洋洒洒写完了。后来还颇有心机地加了注释,包括函数名,返回值含义,函数参数数目及类型,都写在注释头里了,然后再交给他的。他拿着我的代码,给我出了一道大数据的题目。说给我10亿个QQ号,让我找出一个QQ号是不是在其中,用O(1)的代价。我说O(1)的代价是指空间还是时间。他说是时间,内存限制在2G。我说O(1)的代价,数据肯定要预处理。他说数据预处理的时间不包含在其中。我自言自语说,O(1)的时间,我首先想到的是hash.我又问他,QQ号有范围限制吗,他说是int型的。其实到这里,这个问题我已经想到答案了,大数据的解法无非那么几种,常见的就是hash和bitmap,这个网上都有很详细的帖子讲解,自己去百度这一段。我说让我思考一下,他眼睛盯着我的代码,没抬头,让我思考了一下。大约过了1分钟,我说我想用bitmap来做这个问题。首先对数据进行预处理。定义10亿bit位个int.在32位计算机下,一个int是32位,10亿位的话,就需要10亿除以32个int整数。大概有很多个。第一个int标记0-31这个数字范围的QQ号存不存在,比如说0000001这个QQ号,我就把第一个int的第1位置1。第二个int能够标记32-63这个范围的QQ存不存在,以此类推。把这10亿个QQ号预处理一遍。然后计算你给我的这个QQ号,它是在哪个int里面,然后找到相应的数据位,看是1还是0,就能在O(1)的时间里找到。他给我一个QQ号,随机写的,让我详细地解释一下过程,QQ号12345694,我说先将这个QQ号除以32,他说用除吗?能不能不用除,有没有更快的办法。我那时大脑抽了一下,我说可以用位运算,我记得刷题的时候,有一个算法求一个数的二进制里包含多少个1,我把代码写出来了。我说这片代码能算出这个数里包含多少个1.然后我想想不对,我说求出多少个1没用,我们要求的是它在哪个int里面,以及在这个int中的第几位。他又提示我,有没有更快的办法不用除法。我反应过来了,我说移位,32,右移5位,他表示赞同。然后他似乎理解我要说的了,也觉得我这个办法能搞定,就没再追问了。后来发现,这个问题他问过很多其他同学,有一个同学排在我前面,也是用bitmap作的。又问我线程和进程之间的通信有哪几种方式。我一听不对,似乎是个坑,就没听说过线程和进程之间有什么多少种通信方式,想想肯定是个坑。我说,我先来说说进程和线程之间的关系吧。巴拉巴拉,进程是操作系统中资源分配的最小单位,线程是最小调度单位。进程有自己独立的地址空间,线程没有自己独立的地址空间,一个进程可以有多个线程,同一个进程中的多个线程共享这个进程的地址空间。巴拉巴拉,跟背书似的,很熟练地把自己准备的东西展现给他。然后告诉他,所以,这个问题要分情况,如果线程要和包含自己的这个进程通信的话,很简单,直接访问这个进程的地址空间就行了,什么变量啊,内存区啊,等等。如果这个线程要和别的进程进行通信的话,那就不是线程和进程的通信了,那就是进程和进程的通信了,典型的方式有很多种啊,什么消息队列,共享存储,管道啊等等,我说对于别的进程来讲,它是看不到另外一个进程里面的线程的。他说行了,感觉我没踩他的坑,似乎很不耐烦,换下个问题。问我STL有没有了解,我说刷题时用过,最常用的是vector和list,map,set,dequeue,queue这些也有涉及,但是用的最多的是vector和list,然后就问我这两个有什么区别,我就巴拉巴拉说了,从实现原理到插入删除查找的效率对比都说了,然后我说,要不要给你实现一下,他表示不用了,他知道我知道。又问我一道智力题。一两车,两头长得一样,只有窗户没有门,两头对称,问我这个车往哪个方向开。真不好意思,这个智力题我见过。我就问他,这个车开在哪个国家,他似乎明白了我明白了他的问题。停顿了一秒,就说是在中国大陆。我说中国大陆的车都是靠右行的,所以车门也会在右手边,这个图上只有窗户没有车门,所以车门在另外一边,所以车是往左开的,我一激动,在他的那张纸上画了一笔,我赶紧说,不好意思,你又要重新画一张了,他说没关系。然后又问我,在团队协作中,要确定一个模块接口,问我如何推进这个事。一听团队协作这个问题,我就觉得一面妥了。我说,一个团队的项目,他们的需求的共同来源是软件需求规格说明书以及详细设计文档。如果详细设计文档没有对这个模块间的接口进行定义的话,虽然这很不专业,如果要我来协调的话,我不敢一个人决定这个事。我至少会找另外一个模块的负责人还有我们这两个模块的共同负责人,最好是做详细设计的架构师,我们坐下来开个小会,一起确定这个事。不可能我一方面定了就定了,我至少要明确你需要什么样的功能,什么样的参数,异常处理该怎样,这个事情说小了是我们两个团队的事情,说大了可能会影响很大,所以一定要找这些人坐下来商量一下,定个方案出来。他点头,说他没什么问题了,问我还有没有什么问题,我问了是哪个事业群,如果顺利什么时候二面。他说了自己是什么什么事业群,什么时候会有二面啥的。出门时说再见,问他要不要把门开着。回去之后,大约21:15的时候,发现自己的状态从初试变成复试中。
------------------------------------------------------------------------------
回去过后,我详细搜了一下这个事业群,大概想了一下后台可能涉及哪些技术,然后好着手准备。上网搜了不少相同岗位或者类似岗位的面经,然后把上面列的知识点再回顾回顾,因为听说不同的面试官可能会问类似的问题,巴拉巴拉。然后我觉得至少要等一天才会有二面的通知。因为前一天精神高度紧张,身体浑身酸痛,老早就睡了。18号上午十点半左右开始起来准备这些东西,脸没洗牙没刷,衣服都没穿好坐在床上搜面经,等下好按照面经里涉及的那些东西去准备。结果下午12点50多分的时候,手机来短信了,通知我18号下午16:00去昨天一面的那个地方面试。隔了一会才反应过来,什么?!那岂不是今天下午,三个小时后?!赶紧起床刷牙洗脸。随手拿上简历,昨天的那些资料出发了。
------------------------------------------------------------------------------
到了那里流程跟昨天差不多。
面试官人很nice,我前面那个同学,面完没10分钟,面试官就打电话来说她二面过了,让她别走,可以hr面了,她跟我说,就没问她什么,就讲了一个项目,面试官不停地质疑,不停地提问题。面她大概面了20分钟。临走时要她讲了一下二分查找的逻辑,她说的很混乱,被面试官叫停了。她问面试官评价,面试官说要她以后说话要严谨。但是还是给过了。
终于等到我了。同一个面试官,人真的很nice,很和蔼。我进门,基本的礼仪,招呼,寒暄过后我坐下,放下包递上简历。我问他什么流程,需要自我介绍不要,他说不用。他说先看看我的简历。然后从算法分析的项目开始,一个多线程的项目,一个大数据的项目,一点点跟我探讨,三个项目,无比深入地跟我探讨,还跟我提了很多建议,问我有没有想过这个,想过那个,我们关于很多个计算模型进行讨论,分析它运行速度的理论上限,模型是他提出来的,我们一起分析(他给我提了一个点,我来说分析,他觉得意犹未尽,再补充了一些,基本上都是这样,懂操作系统和计算机网络的底层原理真的很重要,那里面很多很优秀的模型和思想,都能被用在工程项目中去,所以他一提,我就能反应出来这是什么,如何使用,优缺点如何)。关于大数据项目,他还给我建议了几篇论文,给我提供了新的思路,还提了一下自己当年在某家很吊的公司的事(这里我不方便说,方正这家公司很屌)然后愉快地搞完了。我问他对我有什么评价,我面的是不是不好。他说我很好,我能把老师交代的这些任务完成这样,很不错。然后问了有没有后续,他说技术面就是两轮,已经结束了,剩下的是Hr的事,具体HR怎么安排,他也不知道,让我等消息。没说让我留下来直接HR面。这个点,那个面试官直接说二面过了,让HR面的妹子已经睡着了,可能还有鼾声,而我还在这里写帖子,攒人品,焦急地等待状态更新........ 

你可能感兴趣的:(面试精选)