这次面试其实不算难,但是我由于是第一次面试,加上前期准备的不太好,导致结果凉凉,以此为纪念,后面一定要好好准备,面试笔试加油!!!
3.24刚投了腾讯暑期的实习提前批,3.25中午就给我发短信了,通知我下午四点面试。下午提前十多分钟找了一个安静信号好的角落等着电话,然后四点左右电话来了,一个温柔的带着广州口音的小哥哥说它是WXG开发移动端的部门的,然后先让我自我介绍一下?我就介绍了一下我的基本情况、项目情况、会的技能。然后就开始问问题了:
1.平时开发用的什么编程语言多一点?
C++/C多一点。
2.说一下封装、继承和多态?
之前看过这个问题,但是当时不知道怎么回答,然后回答吞吞吐吐的。
3.说一下虚函数表和虚函数指针?
这个刚看过,巴拉巴拉说了一通。
4.说一下字节对齐?为什么需要字节对齐,有什么好处?给一个结构体分别包含char a[3],int b,char *c;如何排序好一点?
这个也刚看过,结构体的字节对齐,但好处答不太上来?
5.说一下堆和栈?内存泄漏是什么?内存泄漏泄露会造成什么后果?
6.说一下长连接和短连接?长连接不发数据怎样报活?之前开发有用过长连接吗?
7.说一下进程和线程?进程之间如何通信?线程是否可以共享进程内的数据吗?
8.对数据操作需要注意些什么东西?如何同步数据?线程死锁?如何避免死锁?
9.开发时用过加解密算法吗?知道对称加密和非对称加密的常用算法吗?
10.数据库索引的原理?
11.索引的方式有哪些?
12.参加的哪个项目最有挑战,遇到哪些问题?
说了一个问题,之前解决了,但是没弄清具体原理,给自己挖了一个坑。
13.你在项目重点是负责哪一块?
14.然后问了项目的总体结构?服务器端和客户端是如何通信的?通过网络线还是什么连接?
15.数据库优化体现在哪里?
16.UDP丢失数据如何处理?
17.一个包的数据有多大?服务端收到数据是否直接进入DB?
18.在写DB和收到数据是否有缓存吗?如果磁盘IO如果出现卡顿,如何对接收的数据做缓存,时间戳数据是放哪儿?
(估计面试官是想的用redis或者 memcache 来做缓存,我的时间戳估计也有问题)
19.你有什么问题要问我?
问了微信数据如何存储管理,但他说这是后台做的东西,他做的是客户端,感觉这个问题被扣分。
20.问了他们招人主要看重哪些?
他说他们部门主要对网络编程、加解密、理论基础、编程语言C++java,编程基础。
这次总共面了四十分钟左右,其实很多答得不怎么好,但小哥哥还是耐心地从各个方面考察我的知识点,尽量发掘我的亮点,然而我。。。
最后来总结一下这次惨痛的教训:
(1).首先基础知识一定要牢固,不一定要会很多语言,但一定要深入一门,尤其是很多基础知识比如C++的封装继承多态,还有底层实现原理,比如虚函数实现原理等。
(2).网络编程要多了解,TCPUDPHTTP这些很容易问,了解他们的原理,如果项目中用到最好,没用到的也最好能编程实现一下,此外还有加解密算法也要了解一下,至少能说出一两种。
(3).数据库的索引底层原理要能说清楚,如何进行优化,还有就是大数据如何缓存,了解redis或者 memcache 来做缓存。
(4).准备简历时就要考虑好项目中每个知识点和细节,因为面试官可能会问的非常细,重点准备其中一个项目就好。考虑项目中的优化、创新点、问题和难点,以及它们背后的原理,感觉我就是说出了难点和解决方法,但是问题背后的原理却不太了解,结果给自己挖了一个坑,所以没有把握的东西最好不要主动提出来,还有就是平时遇到问题就要弄清问题的原因,不要解决了就不管了,血的教训啊!
(5).回答问题要考虑好再回答,说话不要吞吞吐吐,不知道的问题就说不知道,然后可以合理推断一下,其实回答问题好不好主要还是看是不是准备充分,当你对问题模棱两可的时候回答问题自然很肤浅并且不连贯,给不了面试官期望的答案。
这还只是一个简单的电话面,后面的笔试、真人的面试会考察更多的知识,光我能想到的就有:
C/C++等语言、数据结构和算法、网络编程、数据库、操作系统中的多线程多进程和内存管理等知识、设计模式…
总之,感觉研究生做的项目中接触用到的的知识基本都比较浅显,而且很多时候只考虑了实现功能,并未考虑最优的实现,学的东西更偏实践或者直接参考网上别人的实现,对内部原理和理论知识知之甚少。经过这次面试,我意识到了做事情的时候就要做到知其然,更知其所以然,注意技术背后的原理的重要性,考虑问题是否存在最优解。技术真的是学无止境并且不断更新,所以终生学习是很有必要的。
=
补充======
朋友CSIG面试问的问题?
- 重点介绍一个比较好的项目?
- 视频流是Nginx底层是怎么推送的?RTSP底层如何实现,是TCP还是UDP?(不懂的就说下去了解一下)
- 视频流转码是怎么转的?
- 上万台client的高并发如何处理?
- UDP丢包如何处理?
- 假设接收端未收到数据包或者ask被丢掉了该如何处理?
- 有没有在包里面加设备ID和timestamphe(递增),在server做校验。
- 用链表存端口和IP仍然不能改变TCP一对一连接。
- 你知道linux上的select和epoll
- list遍历算法复杂度是O(n),可以采用map来存,发送消息没必要广播,最好精确发送,比如一万台设备,遍历链表和广播会导致效率很低。
- 假设client和server建立一个TCP连接,三次握手后client什么也没给server发,server就crash掉了,client会看到什么场景?client给server发了一个包会怎样?
- 对MySQL事务隔离理解?
- C++的虚函数如何底层实现?如何判断它是不是虚函数?
- QQ高并发如何处理?
数据库分库分表sharding流量分流,白名单,灰度,负载保护等。