腾讯后端面试经历与经验总结
Tangocc
终于等来腾讯的面试。
4.3号 机试
机试包括选择(30多)、简答(2题)、编程(2)。选择和简答编程分别一小时,选择题考的比较广,概率、Linux 、操作系统、网络等各个方面,
自我感觉比牛客网题有深度和难度,不是那种一看就知道结果的问题,而且都是多选题(这点比较坑),
从面试的整体过来来看,无论笔试还是面试腾讯都注重广度和深度,也就是技术实力。
4.12
接到13号面试的通知,地点安排在某星级酒店,逼格甚高,承包一个宴会厅,面试官在不同的楼层房间里,标间。
腾讯面试官给我的感觉是不像码农的技术码农,穿着时尚,非标准工科男形象,由于我是第一个面试,可能时间比较久,持续一个小时时间。
进门以后,面试官把简历整体扫描一遍,接着开始面试,首先从c++语言特性问题,
一问你对c++的语言特性有怎样的认识,balaba一堆,
二问多态特性有什么用?有没有用过多态特性,
三问多态怎么实现的?
四问虚函数是怎么实现的?
五问虚函数指针有几个?
六问虚函数表存在哪里?
七问有没有遇到过使用虚函数程序宕掉的情况?为什么宕机?
八问memset初始化类对象会出现什么情况?
九问如何调试程序?有没有使用过core文件调试程序?
十问什么情况下引起程序宕机?
十一问对于大型程序,正在运行,且不可停止检错,有个逻辑错误,运行几万次才会复现一次,怎么找出这个逻辑错误?
十二问设计模式几个原则是什么意思?
十三问网络通信TCP UDP 如何选择?
十四问TCP出现粘包怎么处理?自己使用中有没有出现过粘包的现象?
十五问多线程编程如何进行分线程?
十六问网络编程模型区别
十七问如何学习的?看过哪些书?通过什么途径学习?
十八问平时逛什么论坛?
十九问现场手写代码
二十问逻辑推理题。
整体面试下来,感觉面试官技术很深入(面试官很年轻),有些东西会的不一定能说上来,不会的更是不可能说上来,知识的深度和广度同样重要。
在这里强调一点是,当时面试设计模式问到里氏替换原则,我的答案回答正确,但是面试官突然一句是不是说反了?在当时的环境本能反应肯定会认同他说的是对的,面试官一笑而过,
但是后来出来以后,证明我是对的,我意识到当时是不是故意的提出疑问,考验我的扎实程度。
还是一个自己挖的坑,最终把自己埋了的事情是,为了”强调”自己的自学能力,作死提出自己不是科班出身,然后就被面试官抓住把柄,一脸嫌弃的说才学两年编程?
4.14 复试
初试整个一个小时下来,感觉基础知识自己回答的还算不错,但涉及到linux系统大型程序调试经验时还是有所欠缺,特别最后一作,感觉应该与复试无关,但13号晚接到复试通知,
至此,已经心满意足,感觉已经赚到,复试还是原来的酒店,只是人数明显少了,换了一个很小的宴会厅。因为许多同学初试都会被问到项目,而我初试没有问到项目,多次往项目上扯,
都被面试官无情的扯回来,所以在前一天很充分准备了项目经验,然而,,,事实是:
来到面试官房间,也是一个看起来很年轻的面试官,但能感觉到技术气息很浓厚,坐下来以后,递交简历(其实初面面试官的材料他手里都有,包括我的简历),一上来又是基础,
(此处是重点)多态是什么?虚函数表存在哪里?(是不是很熟悉?对,初试时候没有完全答对的问题,又被问了一遍,其实我有点心虚,回去以后我并没有针对这个问题做总结,所以长点心吧)
上次答案是错的,那么这次简单分析一下换一个答案,证明是对的,接下来又问,内存中有几份虚函数表?怎么分布的?懵逼状态勉强回复,二问,客户端往服务器端连续发送10个包,每个包100字节,
服务器端读取一次,问读到多少字节?为什么?这个问题同样是对初试十四问的实际例子。接下来就是噩耗,三问逻辑题,(智商跟不上啊),纸牌类游戏(后来从下一环节的面试知道,面试我的面试官是做游戏开发的,也就是说我应该是被分到腾讯游戏了)
A,B两个玩家
A、B的牌面都是 3 4 5 66 77 88
规则是 斗地主规则一样,但是 对子不能拆开单出,A先出,问什么策略可以保证A稳赢?给出策略。
博弈论?马尔科夫链?心中一万种猜想,面试官倒是很耐心的,说这是逻辑题,提示A的行为都会导致B产生相应的行为?而B的行为又直接导致A的输赢?结果是退到二十分钟也没有推倒出来,现在想想应该是马尔科夫链问题,但是至今不知道答案是什么?
说实话此时有点紧张,面试官安慰说,没关系的,很少人能推倒出答案。四问,源码!!!源码!!!接下来面试官递给我笔记本电脑,展示一段代码,没用过的电脑,没用过的IDE,简单教我几个操作,
然后说,这里是一个完整的工程(这句话有两个含义: 一,这个工程文件是完整的,可以编译运行的,二是 代码量真的是超级大),这里是主函数,你来阅读源码,并尽可能的告诉有更多的信息.
接下来就是一段沉寂,面试官就坐在旁边看着你,而你在看着源码,时不时内心还要注意面试官的举动,加上上一个问题没有回答上来,可想当时的压力有多大,看了二十分钟后,
简单汇报自己的结果,实现的功能应该是游戏换场景的功能,其中是各种综合,单例模式、命令模式、观察者模式,类模板,继承、多态、函数指针 嵌套使用。接下来继续问,指了一个语句,(函数指针调用函数),问这个函数最终执行到哪里?
上一个问题的回答面试官并没有给出明确的对错,心里很是没有底,然后这个问题已经忘我状态(脑袋完全没有一点逻辑可言),然后就按部就班的一步步向下走,最终死胡同是进入到类模板中,此类模板又继承自一个类,
然后进行不下去,面试官倒是很好,在这过程中一直很耐心的给提示给指导,给出提示找到这个类模板的一个实现就找到结果了,再一次提示所有的源码都在这个工程里(这个提示很重要,然而我并没有意识到),就这样持续了很久,无疾而终,
面试大概持续一个小时20分钟,面试结束,自己的面试表现能知道肯定没戏,就让面试官给个评价,很中肯,基础不错很扎实,但是阅读代码能力很欠缺,尤其复杂的代码没有一个完整的思路,需要加强。最后谢谢面试官的指导,离开。
出来以后才发现问题的关键所在,面试官一再提醒这是个完整的工程,也就是说可以编译运行调试的,其实当时最简单的方式是设置断点,单步执行,是肯定可以找到程序运行到哪里的,这也算是一个教训。
总结:
1.面试的失利终归是自身实力不够,平时阅读代码量太少,其实面试官已经做了很大的指导。
2.心理素质太差,遇到一个不会的问题容易慌张,终究是太看重这个面试,面试其他XX公司时,完全抱着学习的态度去,反而表现的很好,所以心态要端正。
3.针对面试岗位准备相应的技能,一面面试官给的建议,报后台就一定要会多线程、linux、网络编程。
4.基础一定要扎实、深入,知其然知其所以然。
5.非典型互联网公司注重你的是业务能力,也就是看重你整个系统实现的思路,并不看重你对某一技术特别的深入,只要你会用,而且基本原理知道;互联网公司看重你的技术深度,因为在大系统中每个人都是一颗螺丝钉,干着自己的精通的工作。
至此,止步。有失落,但没有难过。纵是烟雾缭绕,我必奋然前行。