腾讯广州后台开发一面 面经
第一次参加现场的面试,现在把面试经历写下来,总的来说是被虐的很惨。
之前一个微信事业群后台开发的听说我想去后端,还说叫我不要报,说后端没有女生,结果我还不相信,今天经历后才知道后台开发的要求很高
短信上说11点在大学城的某个酒店面试,天气不好,下着大雨,十点左右的时候收到面试官的电话问我今天会不会出席,说我可以早点过来
我到酒店的时候不到十点半,很多人在一些房间里坐着,还有房间写着笔试区,看了一下各种岗位面试的都有,之前还以为今天只是面后台开发,结果好像是所有技术和非技术的都是在今天面试。
去签到后,马上就有人给我了张纸条,叫我上去某某房间。然后我就上去了,里面坐着一个面试官,大概26,7岁,我把简历给他就开始面试了。
一开始简单介绍自己,我说的太长了,被面试官打断了,他问我高考多少分,家在哪里,然后说先来做一道笔试题,给半个钟时间
题目回忆如下:
腾讯每天上班有员工和主管签到。主管有权限查看签到情况,可以获取的信息有:总共有多少人签到,按照员工的id或者签到顺序查看员工的签到情况,得到倒数n个签到的员工。
要求:1)使用oo设计
2)排序的时间复杂度为O(nlogn), 最差的时间复杂度也不能达到O(n^2)
我不太懂什么是oo设计,刚上来就蒙了,我的理解是面向对象编程。然后就写了一个类。里面有成员变量和成员函数。排序用归并排序
结果面试官看到写的代码,问为什么只有一个类,然后就追问我什么是oo,oo设计的原则是什么。
他说是找名词,然后一个名词一个类。我写的只能叫封装。
然后叫我解释我的想法,我就说了一下。然后他说我没注意到细节,说只用主管才能有权查看签到情况,问我怎么实现权限
我真的不懂oo,就说我不会oo,他就说那就换其他的问吧
然后他说我简历上没写编程技能,问我会什么语言,我说c++, 他问掌握到什么程度,我说会用到熟练之间。不敢说自己熟练
然后他让我解释虚函数的作用,
我就说了多态,动态联编和虚函数表,然后他追问了多重继承的情况,我说了多张虚函数表,这里答得还算他满意。
之后他涉及了各个基础中又比较深入的问题来问我,基本就是先问我懂吗?懂到什么程度,我都说自己只是了解
c++: new 和 malloc的区别,要说的很全面,不然他会一直追问还有什么
linux:系统调用里面有一个sleep()函数,还有一个usleep()函数,然后usleep()函数号称自己是微秒级,你相信它真的能达到这么快吗?或者说系统调用可以达到微秒速度吗(这道题我没理解是什么意思);进程间的通讯方法,我说了管道,有名管道,信号量,套接字,消息。他一直追问我还有一个是什么,让我仔细想一想,我想了好久说不记得了。后来才想起来是共享内存,不知道这是不是在试探我的抗压能力?
操作系统: 说一下操作系统的几种进程调度算法
我说了先来先服务,短作业优先,时间片轮转,基于优先级的调度,他追问linux的进程调度方法,我不知道
数据库:用过哪些数据库? mysql。
说说它的几种引擎,以及各自的特点。innodb和myisam,特点说不上来,就记得myisam是default的,会存三个文件,但是面试官好像不太认可;听说过nosql吗,什么是nosql,nosql的几种产品。我说nosql不是基于关系的数据库,特点是不是严格的一致性,维持最终一致性,有mongdb和redis。他追问用过这些吗?我说没有,只是了解;
什么是事务,事务的作用是什么?我说事务有四个特性,原子性,一致性,持久性,隔离性。但是关于概念答不上来,当时是想到了全部成功或者全部失败,但是说不出来;
网络:TCP为啥挥手要比握手多一次?因为被动关闭方发送ACK和FIN需要两次,发送ACK的时候还没有传完自己的数据;
TCP三次握手有哪些漏洞,有没有被攻击的可能,怎么被攻击。答不上来,后来查了一下,是有漏洞的,主要是如果收到一个恶意攻击的ip一直请求连接,然后服务器会发送ack确认,但是永远等不到回复,就会导致服务器的NIC,内存,cpu占用率超载,这种攻击方式叫做基于TCP半开回话的洪水攻击
数据结构和算法:说说排序算法:插入,冒泡,希尔,选择,归并,快排,基数。说说常用的数据结构:数组,链表,队列,堆栈,优先队列,hashtable,map。
他说我怎么说的都是stl的?(这里我不太懂,这些数据结构虽然stl都有实现,但是不能这么表达吗?他想让我说什么呢)
然后给我了道算法题,给我5分钟,然后说思路。题目如下:双向链表,需要你按顺序输出,要求如下:1)时间复杂度不能超过nlogn,最坏也不能退化成n^2
2)空间复杂度 o(1) ,他让我说思路,我说我首先排除了快排,因为会退化成n^2,
然后排除归并和堆排序,归并要额外空间,因为是链表所以堆排序也不是nlogn,然后他就说那你不是说这道题无解了吗。我说我想不到。然后他问我堆排序的底层结构,我说是一个二叉树,然后说链表的数据结构,我说是数据域和指向前后的两个指针,然后他说他都提示到这里了我还想不出来了。
最后还是他告诉了我答案,说是把双向链表一个个拆出来组合成一个二叉树,然后中序遍历就是输出。(后来面试完的时候他说他拿这道题问过所有面试的人,只有10%能说出来)
然后他说我对数据结构和算法只是了解,但是不深入。感觉他评价我的每个回答都是我对很多东西都只是了解,而不是熟悉
他还问了什么是原子操作,问a+b怎么实现原子操作。我说给a和b上锁,他好像不太满意。我又说放到critical
section,保证一次只能被一个线程处理。他还是不满意。他说看我简历本科是学硬件的,应该学过cpu,半加器的吧,怎么这个不知道?
他说答案应该是关中断,然后问我怎么关中断,我记得是有一个寄存器,他说差不多。
最后还问了我一个智力题,一桶有10L的油,以及3L和7L的空桶,问怎么分出5L和5L,给三分钟。我还是没有在时间内推导出来。其中还有一些其他的问题的,我记不得了。
最后他问我,怎么评价我笔试和面试的表现。我说对于笔试还满意,但是面试感觉不太好。主要是我一上来那个编程题就因为不会oo直接跪了,然后之后一直很紧张,不自信。他说我主要的问题就是没有什么工程经验,很多都是偏研究的,做的项目都是单点式的,不系统。建议我找一个不像腾讯要求那么高的公司增强一下自己的工程能力。我说平时都是在学校,做的都是偏理论的东西,他反问那别的同学是怎么会有呢?
他说腾讯招人对本科和研究生的要求不一样,对于本科生就是基础知识够扎实,会灵活的用算法,但是对于研究生就要求你不仅要基础知识够硬,然后还有有一些实际的工程经验。
最后他问给一定的时间,我更喜欢跟机器打交道还是人打交道。感觉这个问题怪怪的,我说要看我是需要停下来和别人讨论还是继续写代码就好。他说不要有这种假设,就说一段时间你是拿来写代码还是和人交流。我说我会拿来写代码,他反问我真的吗?说我的表现看起来没有在利用机器花很多时间钻研啊。我觉得好无语啊。他说做研究做的多不是坏事,但是做工程做的不多就是坏事,腾讯招人85%都是要拿来干工程的,做基础研究的很少很少,而且基本都要求是领域内的大牛。我问他怎么看国内面试注重考工程细节,而国外注重考算法核数据结构,他说国内竞争大,腾讯是个很实际的公司,所以希望招的人有实际经验,但是国外压力没这么大,国外企业也不希望员工加班,员工做的更多是小螺丝钉的工作。他还说他面试的一些有海外大公司工作背景的人,觉得他们的能力还没有国内的人强,主要是在国外负责的项目太小了什么的
最后我问他我是不是挂了,他说不能告诉我,但是我的表现不是很好……
出来的时候看了看表,十二点20,面了快两个钟;
这次面试给我的感觉是腾讯面试偏难,只是招一个实习生也要求很高,和之前面其他公司的感觉很不一样。算是一次难得的经验吧,认识到自己的短板,才能更好的提高自己啊……
更新:下午5点已经查到面试结果了,意料之中挂了。
谢牛客网还有我身边朋友的鼓励!这次的经历很宝贵,也让我有了今后努力的方向,我会继续加油,提高自己的能力的
最后,希望大家都能收到好的offer