聊聊后端面试中的一些问题和思考
0.前言
1.修炼心法
不打无准备之仗
面试官什么路子
https://www.zhihu.com/question/60911582
知乎-你遇到过哪些高质量的C++面试?
做个合格的面试者
珍惜机会切忌裸面
理清思路清晰表达
拓展思维勇敢作答
相信自己信心满满
2.实战题目
题目分类
编程语言
数据结构和算法
数据库存储
Linux系统
开源组件
工程设计
题目汇总
编程语言
阐述如何设计一个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++的设计模式,重点介绍下单例模式、工程模式等。
数据结构和算法
求二叉树节点和为N的所有路径。
实现二叉树的镜像。
实现两棵二叉树相加生成一棵新的二叉树。
实现单链表的递归逆置和非递归逆置。
二分查找变种问题。
二叉树的后序非递归遍历。
两个无序整型数组交换元素使得两数组和差距最小。
给定整型数组和目标数输出数组所有两数之和为目标数的组合。
找到带权重二叉树中从根到叶子的最大和路径。
最长公共子序列LCS问题。
二叉树中找到指定两个节点最近公共祖先。
实现堆排序求Top10数据。
实现最小栈。
简述并尝试设计一个布隆过滤器。
外排序的基本实现过程。
常见排序算法的性能对比。
快速排序的非递归实现
数据库存储
谈谈对于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,需要考虑什么。
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是如何解决的?
谈谈对服务治理和服务发现的理解。
微服务接触过吗?谈谈对微服务的理解。
服务异步化编程了解过吗?
开源组件
常用的MQ有哪些以及各自的对比和场景
Kafka的基本原理和实现要点
libevent/libuv的基本原理和使用
Boost.Asio的原理和使用
微信协程库libco原理和使用
DPDK的基本原理和用户态协议栈的概念
Redis和Memcached对比
RPC框架对比:brpc/grpc/thrift
STL源码的理解和阅读分析
Nginx的架构、原理、使用
工程设计
信息流推荐中会生成大量点击率文章,设计一个程序实现即时排序,返回热门文章。
词库每个词都有根据点击率来计算的热度,实现一个系统,支持前缀匹配并且返回Top10的热词。
设计一个支持千万级文章相似度去重的程序,来实现抄袭、洗稿文章的识别,时间ms级,准确率不低于95%。
小内存机器有两个文件A和B,分别存放5亿条均长64字节的url,试着找到A和B中所有重复的url。
尝试实现一个简单的音乐推荐系统,可以不涉及具体算法,主要说明工程部分即可。
设计一个黑词服务实现黄反、指令词、敏感词等过滤功能,耗时ms级。
题目很多并且没有给出解答,除了工程设计题,其他题目在网上都可以找到解答,但是本号会在后续文章中对上述问题各个击破,建立完整分类的体系,敬请期待。
2018下半年以及整个2019一直被认为是寒冬时期,也总能听到裁员或者公司倒闭的一些消息,有校招生比offer也有刚毕业的应届生被裁,有套现离场的也有昨天还在熬夜加班优化代码,次日被裁的,还有甚嚣尘上的35岁失业问题,林林总总。
无论如何作为求职者和在职者都要坦然面对,市场波动在所难免,我们能做的只有:拥抱变化 时刻准备着。
4.推荐阅读
白话布隆过滤器BloomFilter
理解缓存系统的三个问题
几种高性能网络模型
二叉树及其四大遍历
理解Redis单线程运行模式
Linux中各种锁及其基本原理
理解Redis持久化
深入理解IO复用之epoll
深入理解跳跃链表[一]
理解堆和堆排序
理解堆和优先队列
5.关于本公众号