
摄于:19年9月广州飞北京
0.先唠唠嗑
Paxos文章跳票了。
最近总是鸽,写作也鸽,跑步也鸽,更别提摆地摊了,倒是最近标题党的感觉越来越重了,主要是怕各位老铁错过这篇干货...

所以就得反思一下为什么最近总鸽?说到底时间都被我浪费了。
根据以往的经验,工作时找个隔音非常好的耳机,然后把手机扔得远一点,睡前也把手机扔远点,是可以提高时间利用效率的。
想起几年前准备考研的时候,就用只能打电话发短信的手机,充一次电用好几天,自己对时间的把控力也就好很多,现在看还是各种坏习惯太多了,时间也都给浪费掉了。
但是不要走极端,闭门造成更可怕,所以合理利用时间是很重要的,好像闻到了鸡汤的味道。
每次长假回到老家,早上6点多就起来,然后忙很久看时间才10点,瞬间觉得时间被拉长了很多,感觉赚到了,但是一回北京就继续晚睡晚起,但是我还是十分渴望一种健康的田园式作息的。
扯了这么多,只是想当个反面教材,和盆友们共勉一下:早睡早起 远离手机 提高技能 努力赚钱。
所以今天和老铁们聊聊面试的一些问题和观点,为提高收入做点准备,题目基本上都是工作这些年自己遇到的或者身边好友遇到的,所以整理了一下。
先看一张非常有名的图片暗淡蓝点(维基百科):

暗淡蓝点是旅行者1号拍下的有史以来第一张太阳系家族照的一部分。
从距离地球40亿英里,黄道上方32°的地方,拍摄了60幅画面,最后拼接成太阳系照片。
在遥远的旅行者1号眼里,地球只是一个光点,即使在窄角镜头里,也小于1个像素,新月形的地球只有0.12个像素那么大。
很巧的是,地球正好就在靠近太阳的一道散射光线中间。
1.面试心法

1.1 不打无准备之仗
知己知彼百战不殆,面试之前需要在拉勾、BOSS直聘上大致了解一下招聘岗位的工作描述,不排除一些公司虚张声势写些个根本用不着的玩意,所以如果觉得岗位对口却匹配度低,也不必紧张试试再说。
内推是了解岗位要求的重要渠道,不过从经验看如果不是内推人本组的招聘岗位,很难做到深入细致的了解,总起来说这样的内推和在线投递差别并不太大,不要以为内推就稳了,否则笔者内推奖金早拿到手软了。
另外相同岗位不同级别考察的侧重点也有很大区别,因此要根据意向岗位级别在深度和广度上进行差异化准备。
1.2 面试官什么路子
一百场面试就有一百种侧重点,但并不能都算得上高质量的面试,知乎上有关于高质量面试的话题,感兴趣可以看看。
https://www.zhihu.com/question/60911582
作为主导者的面试官,个人认为最重要的原则是:明确在招岗位的职责内容,并以此为出发点对候选人进行考察,一般来说候选人过往经历和在招岗位很相似的情况比较少,在此情况下就要从候选人的基础是否扎实、学习能力如何等方面来衡量候选人快速适应新岗位内容的能力。
举个例子:"并不一定要把1TB的硬盘装满才能证明这个硬盘是1TB的"
因此很多时候面试就像是一场证明500GB硬盘具备1TB空间的过程,至于测试手段是否科学就是面试官需要拿捏的了。
如果面试官都不清楚自己问这个问题究竟是为了考察什么,那么这就是一场低质量的面试,所以对于候选人来说成败与否都不用在意,毕竟这种糊涂面试官如果以后作为同事也是件很糟糕的事情。
1.3 做个合格的面试者
珍惜机会切忌裸面
理清思路清晰表达
拓展思维勇敢作答
相信自己信心满满
我对此深有体会,笔者本硕都非CS专业且有一定跨度,遥想当年校招隔壁实验室一起打球的CS硕们收割大厂offer,我这边就算小公司也会被鄙视一通,所以无论现境如何,坚定信念、找准方向、持续发力、总会有所斩获。
2.实战题目
2.1 题目分类
数据结构和算法 数据库存储 Linux系统 开源组件 工程设计
2.2 题目汇总
2.2.1 编程语言
阐述如何设计一个C++类?实现String类。 谈谈对C++虚函数机制的理解。 STL的Vector原理及迭代器失效的理解。 设计一个C++HashMap类。 使用C++实现一个堆的模板类。 写一个宏定义比较函数并解释宏展开过程。 谈谈std::move的理解和使用。 malloc的内存可以用delete释放吗?原因? 简述C++11的新特性以及解决了什么问题。 STL的Map原理、插入和删除复杂度分析。 STL的Map基于红黑树实现的原因,为什么不选择哈希表? 为什么需要虚析构?虚析构和普通析构函数的区别是什么? 说明C++对象的内存布局模型。 聊聊C++临时对象和右值引用,写个例子。 使用C++写一个高效的多维矩阵乘法。 谈谈对智能指针的认识并实现一个智能指针类。 STL中Map的查找时[]和find区别是什么?哪个更快? 实现memcpy函数效率尽可能高。 尝试实现C/C++中常用字符串库函数。 谈谈C++中强制类型转换的原理和使用,写个例子。 谈谈C++的设计模式,重点介绍下单例模式、工程模式等。
2.2.2 数据结构和算法
求二叉树节点和为N的所有路径。 实现二叉树的镜像。 实现两棵二叉树相加生成一棵新的二叉树。 实现单链表的递归逆置和非递归逆置。 二分查找变种问题。 二叉树的后序非递归遍历。 两个无序整型数组交换元素使得两数组和差距最小。 给定整型数组和目标数输出数组所有两数之和为目标数的组合。 找到带权重二叉树中从根到叶子的最大和路径。 最长公共子序列LCS问题。 二叉树中找到指定两个节点最近公共祖先。 实现堆排序求Top10数据。 实现最小栈。 简述并尝试设计一个布隆过滤器。 外排序的基本实现过程。 常见排序算法的性能对比。 快速排序的非递归实现
2.2.3 数据库存储
谈谈对于Redis的底层数据结构的理解。 跳表了解吗?Redis的zset实现原理以及为什么不用红黑树。 Redis哨兵原理以及集群版故障转移过程。 基于Redis实现分布式锁。 Redis渐进式Rehash的实现原理。 Redis和LevelDB的区别以及LevelDB的LSM树和WAL原理。 Redis主从同步的实现原理和过程、产生数据丢失的原因。 MyISAM和InnoDB的区别。 MySQL索引原理和优化。 Redis集群版如何实现一致性Hash算法的。 Redis的单线程网络框架原理和混合持久化机制。 类Redis数据库Pika了解吗?基本设计架构是什么? 如何设计一个缓存系统以及缓存击穿的解决方案? 一致性协议raft/paxos/2pc/3pc基本原理。 Redis的Gossip协议原理。 Redis4.0+版本的BIO线程原理和使用。 简述如何自己实现一个NoSQL,需要考虑什么。
2.2.4 Linux系统
LVS实现负载均衡的原理。 简述Linux内存管理原理以及伙伴算法和Slab算法。 select和epoll的对比以及epoll实现的底层原理和数据结构。 epoll的LT模式和ET模式下读写操作,实现一下ET模式的read/write。 使用C++简单实现一个生产者消费者模型。 Linux虚拟内存和物理内存的区别与联系 如何使用gdb调试多进程、多线程程序。 谈谈C10K和C10M问题及大致实现思路。 Linux地址复用和端口复用的使用。 谈谈Reactor和Proactor模式区别与联系。 尝试基于epoll实现一个高并发网络框架。 Nginx的基本原理以及负载均衡实现方法。 谈谈Linux服务器内存/cpu/磁盘/网络带宽的监控命令和问题排查。 谈谈CAP理论以及分布式一致性算法。 了解CpuCache吗,如何据此来优化代码。 读写锁、RCU锁、自旋锁的对比以及设计读优先/写优先的读写锁。 自己设计实现一个简单的读写锁。 谈谈grpc的使用以及brpc的对比。 对比协程和进线程,重点说明系统开销差异和各自优缺点。 谈谈对线程同步和多线程安全的理解。 Https的C/S交互过程、http1.0/2.0/3.0的对比。 多进程通信的方法和对比。 多线程同步的实现和线程安全。 实现一个基于LRU的本地缓存。 TCP/IP的拥塞控制原理和缺陷、BBR算法对比。 使用Python实现多进程和多线程以及谈谈对GIL的理解。 网络攻击有哪些?简述DDos、CC攻击。 对比内存分配malloc/tcmalloc/ptmalloc。 Protobuf协议的简单原理和使用。 Coredump的常见原因。 死锁的原理以及写一个死锁。 MapReduce的基本原理、写个简单的map和reduce的程序。 同步异步阻塞非阻塞IO的理解。 git的基本原理以及常用命令。 局部性hash算法simhash的原理。 服务端长短连接的区别、优势和场景。 如何避免多线程的虚假唤醒问题。 实现简单的线程池和连接池。 实现一个可以完成C10K+的TCP网络框架。 尝试多种方法实现一个守护进程,2 magic fork了解吗? 惊群问题知道吗?Nginx是如何解决的? 谈谈对服务治理和服务发现的理解。 微服务接触过吗?谈谈对微服务的理解。 服务异步化编程了解过吗?
2.2.5 开源组件
常用的MQ有哪些以及各自的对比和场景 Kafka的基本原理和实现要点 libevent/libuv的基本原理和使用 Boost.Asio的原理和使用 微信协程库libco原理和使用 DPDK的基本原理和用户态协议栈的概念 Redis和Memcached对比 RPC框架对比:brpc/grpc/thrift STL源码的理解和阅读分析 Nginx的架构、原理、使用
注:开源组件的问题一般都比较宽泛,因此没有列举太多具体问题。
2.2.6 工程设计
词库每个词都有根据点击率来计算的热度,实现一个系统,支持前缀匹配并且返回Top10的热词。 简述如何设计一个支持千万级文章相似度去重的程序,来实现抄袭、洗稿文章的识别,时间ms级,准确率不低于90%。 小内存机器有两个文件A和B,分别存放5亿条均长64字节的url,试着找到A和B中所有重复的url。 尝试实现一个简单的音乐推荐系统,可以不涉及具体算法,主要说明工程部分即可。 设计一个黑词服务实现黄反、指令词、敏感词等过滤功能,耗时ms级。 设计一个类似于微信运动的功能,包含占领封面/七日排行榜等。
工程设计题目一般会是面试官日常遇到的典型问题,类型很多,但是系统设计类问题经常和海量数据问题、堆排序等一起出现。
对于此类问题,重要的是明确功能点、找准解题方向、拆解子问题、分步骤合并、各个击破、先实现再提优化方案,以此原则来解决工程设计问题,基本上就很接近答案了。
这类题目其实还是很考验架构能力的,所以平时要多思考产品模式和技术点,算是个好习惯吧。
3.小结和感慨
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼
如有收获,点个在看,诚挚感谢

