《十面腾讯》本屌现今四年开发经验;前前后后为进腾讯面试十次(阿里旗下——腾讯互娱,腾讯直播的offer都被hr因学历而被拒,最后的腾讯教育面幸运地被录用了,拿到P6offer,真正的“十面”腾讯!)。
本文前半部分主要分享面试总结,后半部分分享程序员我个人架构开发之路的学习经验。
腾讯十面
面试总结
虽然腾讯互娱,腾讯视频,腾讯教育都归属阿里旗下,但每个面试官问的问题都不一样,相同点主要在流程方面。另外顺便给大家推荐一个交流学习群:812--855--908。面试开始会让自我介绍,主要业务架构和技术架构两部分。业务架构一般不会深究,但要面试官听明白,并且一般面试官会顺着问是如何根据这些业务去设计技术架构的。
技术架构部分,会根据自我介绍中提到的技术点问,是为什么使用这些技术,解决了哪些问题,碰到哪些困难,是如何思考和解决的,最后再顺带一些技术本身底层的设计方面的问题:
例如:有redis,会问哪些场景用,解决了什么问题,数据量有多少,用的过程出现过哪些问题,怎么去定位解决的,Redis缓存集群一致性方案,还有没有更好的方案,如何防止缓存击穿。诸如此类的问题。
总结了面试官最喜欢问的方面有网络IO模型,多线程和多进程的模型,比如reactor的设计模式,比如nginx的Master和worker进程设计如何处理惊群问题,是否了解过协程的方案,除了互斥锁方案,还有什么并发方案呢?
不管哪个技术点,能答到面试官无法在这个问题上问下去了,或者能答到计算机硬件上就过了。 有不清楚的可以直接回答,有一些不会的不影响整个面试。
面试准备
架构开发技术之路的学习经验
想要了解架构技术知识点的,可以关注我一下,我后续也会整理更多关于分布式架构这一块的知识点分享出来,另外顺便给大家推荐一个交流学习群:812-855-908,里面会分享一些资深架构师录制的视频录像:有DNS负载均衡,NGINX负载均衡等高并发的处理,TCP、epoll等技术应用,单台百万并发的实例讲解,源码分析,高并发、高性能、分布式、微服务架构的原理,内存池性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多,以下的知识体系图也是在裙里面获取。
一、 阅读源码
阅读、分析源码是程序员最基本的码代码能力也是码农的根本所在,学习经典源码中所用到的经典设计思想及常用设计模式、高并发处理的一些数据结构,能够帮你了解大牛是如何写代码的,从而吸收大牛的代码功力。在腾讯的面试中,libevent,nginx甚至是redis的源码设计也是经常问的。
二、中间件开发
并发或者说并行编程几乎是所有互联网公司面试必问问题,并发编程后台程序员最重要的基础技能之一,多进程之间的通信,线程池的设计,内存池的同步方案,用协程解决阻塞socket为异步通信以此提高并发能力等等,当然还包括常用的一些设计方案,比如C/C++和go等静态变异的程序的热更新方案,比如通过nginx或者etcd做A/B灰度发布等; 比如高并发的的一些方案,NDS负载均衡,LVS+Nginx+Keepalived的方案,LVS的几种工作模式,虚拟IP如何配置等等;除了这些还有网络协议栈的,比如TCP的TIME_WAIT状态是什么意思,如果解决大量TIME_WAIT状态的套接字等,还包括拥塞控制算法等等。
三、集群专题
在解决大数据和可靠性设计的时候,都会进行服务器的集群部署,比热mysql集群后的读写分离和分库分表,binlog的同步机制,还是健康检查等;又比如redis集群后的一致性方案,还有没有比hash一致性方案更优的方案呢,redis的hash槽以及数据移动怎么做?再比如zooKeeper的ZAB算法解决数据一致性,zooKeeper的原子性,利用zookeeper设计的分布式锁等等。
四、Linux系统和内核
应用程序的运行离不开对系统调用的依赖,作为一个架构师或者技术专家,那是必须了解系统调用,比如read、write背后的文件系统提供的pagecache机制,比如malloc和free背后对应的brk和mmap操作的内存管理,比如虚拟内存,虚拟内存与物理内存的映射,比如huage page对内存管理的优化,甚至是NUMA体系结构,NUMA系统结构下的性能优化等等,很多同学可能都知道epoll比起select和poll的性能要高一些,那么epoll在内核层面是如何实现的呢?能不能徒手造个轮子实现epoll呢,以此更加理解epoll。
五、性能优化
性能一直是让程序员比较头疼的问题。当系统架构变得复杂而庞大之后,性能方面就会下降,特别是腾讯这样的一线互联网公司最为注重,因此想进入腾讯,性能优化一定是要去深入学习与理解的一环,本屌在性能优化这一块虽然不能算专家,也可以自信的说是精通了(注意:自己的简历上一定不要写精通xxxx,要不然面试官会怼死你。好在本屌这一块还算自信)所有的应用程序都在操作系统上运行,那么如何优化应用程序性能呢?比如有哪些工具去查看系统性能贫瘠,比如磁盘IO,网络协议栈的优化,甚至是使用KCP协议优化网络传输。甚至是要了解硬件,比如多队列网卡,比如用户态协议栈等等。
六、分布式架构
随着公司业务壮大,架构也会随之改变,常用的一个架构设计方法就是分层的架构思路,除了分层还会引入微服务的设计,这些架构设计里一般都会涉及到API网关,服务动态路由,一致性,可靠性的设计,比如etcd、zk、grpc、thrift、openresty、主备切换、虚拟IP等等。