面前准备
敲定了方向和目标后就开始系统准备,主要分为以下几个方面来准备。
算法题
事先已经看过别人的社招面经知道头条每轮技术面都有算法题,而这一块平时练习的比较少,校招时刷的题也忘记了很多。因此系统复习的时候算法题还是花了比较多时间的。先是快速刷完了剑指 offer,这个校招时已经刷过两边了,因此现在刷起来会相对快一些。然后就是啃 LeetCode 的题了,LeetCode 的题比较多,想在短短几周内刷完基本是不可能的,因此我主要按照类型去刷,每个类型刷几道就会比较有感觉了。比如链表的题优先考虑递归和双指针来解决,栈和队列的题优先考虑用两个栈或队列来解决,树的题基本都是递归等。不过数组和字符串的题一般比较灵活,这种题只能尽量多刷了。平时要上班刷题也不方便,我采用的方法就是看题,用手机打开 LeetCode 的网站,看完题目后直接想解决方案,脑子里大概捋一下代码怎么写,能想到的就过,想不出的就看看别人的解法,用这个方法刷起来就很快。用这种方法你可能会担心面试时题写不完整,其实不用太担心,因为面试的时候面试官看你写的核心思路是正确的,边界处理是对的基本就过了,面试时间比较有限。
理论基础
基础这一块主要以快速复习为主,主要是语言(我主要用C++,所以复习C++)、操作系统和网络编程。校招这一块会问题的比较多,社招这一块问的比较少,但是如果这一块打不上来就比较尴尬了。语言就不说了,这一块大家应该都知道会考些什么,校招的时候毕竟都疯狂准备过。操作系统就看内存管理、进程管理和文件系统,一般虚拟内存问的多。网络编程这块就包括 TCP/IP 协议,HTTP协议,网络安全三个方面。TCP/IP主要就是三次握手,四次挥手,TIME_WAIT 的作用等这些常考的题了。HTTP 协议考察 HTTP 协议的返回码、HTTP 的方法等。需要特别指出的是 HTTPS 加密的详细过程要非常透彻,不然容易产生一种感觉好像都清楚了,但是一问就有点说不清楚。最后就是网络安全,主要考察也是 WEB 安全,包括XSS,CSRF,SQL注入等。
后端技术
这里的后端技术主要指工作中要用到的一些基础组件,一些常见的后端架构设计。主要准备了MySQL、Redis、消息队列、zookeeper、分布式系统架构设计和docker。MySQL 主要看了 《高性能MySQL 第三版》,关于事务、索引、锁以及 binlog 和 redolog 都讲的非常好,也是面试最爱考的,除此之外对数据库的读写分离、分库分表也要掌握。Redis 主要看了《Redis 的设计与实现》,然后自己再总结了一下 Redis 的使用场景,以及 Redis 实现分布式锁基本 Redis 就没有问题了。分布式系统的就准备CAP理论、BASE理论、限流、熔断、一致性***算法、主从架构、集群架构、异地多活、负载均衡、分层架构、微服务等。
深挖项目
没有参与开源项目的经验,工作中做的项目也很一般,项目这块我实在没什么太多拿的出手的,不过还是要挖掘一下,毕竟这一块是逃不掉。我说几个我思考的点吧:
找项目中相对而言具有亮点的地方。比如我用 redis 实现了一个延时队列,然后对这个延时队列我通过分片来解决瓶颈,通过分发来加快处理速度。
找项目中复杂的地方。如果你做的项目中有复杂的地方,即使不是你做的,也可以拿来说,前提是你要搞得非常清楚来。
量化指标。一个接口原来有性能问题,比如你做了一个小的优化,将其 TP99 的耗时从原来的 500ms 优化至多少 200ms。
赋能整个团队。在开发业务的过程中肯定会遇到一些重复的工作,或者可以复用的服务。你可以开发了某个工具或者服务化了某个功能推广到了全组使用,给公司创造了价值。
腾讯面试
腾讯面试提前1天和提前一个小时都会发短信提示。去的腾讯滨海大厦面试,大楼的现代化程度很高,不过需要提醒一下的是,腾讯的滨海大厦分为南塔和北塔。我去的时候就上错楼了,需要下到4楼重新换成电梯。
笔试
微服务的特点,如何实现服务发现和负载均衡
c++内存管理
time_wait在哪一端产生,作用是什么
程序crash如何定位
服务性能问题如何定位
两个排序数组找中位数
就数字n的平方根
设计一个算法,抽奖次数越多中奖概率就越高
MySQL 如何分析一条语句的执行过程。delete from t1 limit 3和delete from t1的区别?
一面
问项目
跳台阶
数组中奇数个元素
一栋楼有n层,不知道鸡蛋从第几层扔下去会碎,用最少的次数找出刚好会碎的楼层
动态规划与贪心有什么区别
redis数据结构的底层实现
redis如何实现高可用
负载均衡算法有哪些
服务发现是怎么实现的
熔断是怎么实现的
id生成器怎么实现的,如何实现全局递增
协程和线程的区别
进程间通讯方法
平时逛哪些论坛,研究哪些算法
paxos算法,这个算法我说不清楚,然后说了raft算法
gdb怎么切换线程
如何判断一个图是否有环
介绍一下缓存
查看 CPU 的命令和磁盘 IO 的命令
二面
项目的系统架构画一下
如果用户量上涨怎么优化
负载均衡的加权轮询算法怎么实现
背包问题
贝叶斯的概率学原理
分词算法
连续整数求和(leetcode 第 829 题),要求时间复杂度小于O(N)
HR面
1.询问了除腾讯以外,还在看其他工作机会么?分别是什么
2.腾讯、XXX公司、XXX公司,你的优先级是什么,为什么?
3.之前薪资待遇是多少?你期望的薪资是多少?
4.平时有什么爱好?
5.了解职位需求吗?
6.有没有想问的?
腾讯二面最后一道算法题只能想出 O(N) 复杂度的,面试官一定要小于 O(N) 的,答不上来。这道题是 leetcode hard 级别的难度,所以没有刷。后来又跟面试官探讨了一下自己比较擅长的方面,比如协程与TCP方面的,因为自己也比较喜欢在GitHub上面钻研这些东西,
wangbojing/NtyCogithub.com
wangbojing/NtyTcpgithub.com
我个人在这里学到的东西比较多(/狗头)
技术知识学习路线
【文章福利】小编推荐自己的linuxC/C++语言交流群:832218493!整理了一些个人觉得比较好的学习书籍、视频资料共享在里面,有需要的可以自行添加哦!~
一、 数据结构与算法、设计模式、工程管理
排序 (11种排序) 与 KMP
红黑树 证明
B树与B+树
Hash与布隆过滤器
责任链模式
过滤器模式
发布订阅模式
工厂模式
Makefile/cmake/configure
git /svn与持续集成
Linux系统运行时命令
二、代码实现、方案分析
网络io与select/poll/epoll
reactor的原理与实现
http/https web服务器的实现
websocket协议与服务器实现
服务器百万并发的实现(c10K,c1000k, C10M)
redis/memcached/Nginx网络组件
Posix API与网络协议栈
UDP可靠协议 QUIC/KCP
三、池式结构、高性能组件、开源组件
线程池(手写)
内存池 ringbuffer
异步请求池 性能优化,异步mysql 异步dns 异步redis
mysql连接池
redis连接池
原子操作 CAS
消息队列与无锁队列
定时器的方案 红黑树 时间轮 最小堆
锁的实现原理 互斥锁,自旋锁 ,乐观锁,悲观锁,分布式锁
服务器连接保活 keepalived
try/catch的实现
libevent/libev框架
异步日志方案 log4cpp
应用层协议 protobuf/thrift
openssl加密
json与xml解析器
字符编码unicode/gbk/utf-
四、协程框架的实现、用户态协议栈 NtyTCP (tcp/ip)
协程的原理与工程案例
协程的调度器实现
滑动窗口 拥塞控制 满启动
tcp定时器的实现
epoll的源码实现
五、Skynet、ZeroMQ、DPDK
skynet高性能网关
actor实现与cluster/负载均衡
skynet网络与热更新 数据共享
ZeroMQ Router-Dealter模式
源码分析:消息模型与工程案例
源码分析:网络机制
dpdk PCI原理与 testpmd/l3fwd/skeletion
kni数据流程
dpdk实现dns
dpdk的高性能网关的实现
半虚拟化 virtio/vhost的加速
六、 MySQL、Redis、Nginx、mongodb、dfs
SQL语句 索引 存储过程 触发器
2.数据库连接池与sql解析剖析
存储引擎原理 MyISAM与Innodb 事务隔离
自己实现一个存储引擎 MySQL源码
MySQL集群与分布式 高可用高并发
Redis相关命令与持久化
Redis连接池与异步操作
源码分析:存储原理与数据模型
源码分析:主从 原子模型
redis的集群方案
Nginx使用conf配置
nginx模块开发 过滤器模块
Nginx模块开发 handler模块
源码分析: Nginx Http状态机
源码分析:进程间通信与Slab共享机制
Mongo接口编程与MongoDB命令使用
MongoDB的集群方案
ceph
fastdfs
七、Linux内核进程管理、内存管理、文件系统
进程管理与调度
锁与进程间通信
系统调用 如何自己实现一个syscall
物理内存 伙伴算法
2.进程虚拟内存 mm_struct
页的回收与页交换
虚拟文件系统
Ext2/3/4 文件系统
无持久的存储
八、性能分析
工具 wrk/ webbench/ loadbalance/valgrind
Google gTest/Memtrack
火焰图/热图
九、分布式架构篇
腾讯的Tars
虚拟化的docker
分布式注册中心etcd
P2P 网络穿透 打洞 去中心化的网络