4个月没工作,2个月前开始找工作,投了54份简历,18个面试邀请,通过其中的8个技术面,拿到了6个offer,最终入职一家公司。其中5个offer是最后两周的面试拿的。中间有太多的收获和得着。对于一个后端程序员必须要掌握的知识框架,大概有了一个了解和把握,这里梳理一下分享出来。第一篇分享主要讲述框架和大纲,后续会对每一个主题进行详细分享。这里的面试经验分享仅作为有限的参考,真正的技术提升在于平时刻意地积累、大量的阅读和实战。
网络协议
对于网络协议,比较常问的是TCP/IP协议、HTTP/HTTPS协议,如果能把TCP/IP/UPD报文头画一遍、记熟,将会很有帮助。对于问题一定要在理解的基础上,不能死记硬背,很多基础的问题很重要,比如什么是协议?为什么网络通信要有协议?操作系统协议栈是什么?
- 建立和断开TCP连接的详细过程,三次握手和四次挥手的状态时序图要很熟悉(SYN/SYN ACK/ACK FIN/ACK/FIN/ACK )
- TCP和UDP的区别(要尽可能详细)
- TCP协议如何做流量和拥塞控制(窗口滑动、慢启动、快速重传)
- TCP协议如何保证报文时序和可靠性(INS序列号和重发机制)
- TCP报文分片、TCP流模式和UDP报文模式的区别、MTU、MSS的概念
- 网络通信的五层模型
- HTTP和HTTPS的区别,HTTPS连接建立的过程、为什么更安全、解决了哪些问题
- 什么是DNS、DNS解析的过程是什么
- HTTP常见响应状态码及其含义、HTTP1.0、1.1、2.0的区别、什么是幂等性
- cookie和session的区别(经常问,必须掌握)
- 其他的协议了解吗?ARP/DHCP/ICMP/IGMP......
这些问题其实都能用一个问题串起来,那就是在浏览器输入url按下回车后到页面渲染完成,中间都发生了什么
数据库
- 什么是索引,索引有什么作用
- 索引的分类(聚簇索引和非聚簇索引、普通索引和唯一索引)
- innodb索引数据结构(b+树)、为什么innodb要用b+树、索引树叶子节点和非叶子节点的区别
- 常见查询优化手段
- 联合索引的性质,如何给字符串建立索引,最左前缀原则了解吗
- 覆盖索引的概念
- MySQL如何选择索引?哪些情况下会出现索引失效
- 事务是什么、事务的acid原则
- 事务的四种隔离级别、CR和RR分别解决了什么问题(脏读和不可重复读)
- innoDB如何解决幻读(间隙锁)
- innoDB锁的分类(共享锁和独占锁、悲观锁和乐观锁、间隙锁、意向锁、读锁、写锁)、
- 什么是死锁、如何避免死锁
- 知道哪些mysql数据库引擎?innodb和myisam的区别
- char和varchar的区别、int和tinyint的区别、varchar(11)和int(11)是什么意思
- 什么是回表操作
- 了解binlog和redo log的作用和区别吗?innoDB如何实现MVCC,如何实现事务回滚操作
- MySQL主从复制过程是什么
- innoDB如何删除数据(标记删除or物理删除)?页空洞、页分裂、页合并了解吗?如何重建索引?
- 一条SQL语句的执行过程(MySQL的连接器、分析器、优化器和执行器)
- explain命令了解吗?如何分析慢查询日志
- MySQL如何实现group by?如何实现join操作?
Redis
- 知道哪些redis数据类型?各自的应用场景是什么?内部实现的数据结构知道吗?
- 常见redis操作命令
- redis线程模型
- redis为什么速度快
- redis事务了解吗?redis哨兵和集群了解吗
- redis的内存淘汰机制
- redis持久化机制了解吗(RDB和AOF,各自特点)
- redis主从复制的过程是什么
- 什么是缓存穿透、击穿、雪崩?如何解决?
- redis如何实现zset
- 如何解决数据库、redis更新数据不一致的问题
- 如何用redis实现分布式锁
nginx
- nginx的进程模型(master进程和worker进程)
- nginx的反向代理功能是什么
- nginx如何和php-fpm交互的(fast-cgi模块)
- nginx的负载均衡配置了解吗,还了解哪些nginx配置
- nginx如何处理并发请求的(IO多路复用-epoll模型)
操作系统
- 什么是进程、什么是线程,两者有何区别
- 进程间通信方式
- 什么情况下会发生死锁、如何避免
- 了解哪些进程调度算法
Linux
- 尽可能多地说出知道的Linux命令
- 如何查看端口号被哪个进程占用
- top/ps/netstat/tcpdump
- IO模型了解哪些(如异步非阻塞IO/IO多路复用)
- 了解Linux文件系统吗
PHP基础
这个细节很多,列举几个常问的
- 单双引号的区别、定义常量的几种方式(define/const)、require、require_once、include的区别
- 常见的array函数、string函数、排序函数
- COW机制、引用的概念、函数的值传递和引用传递、变量容器(zval)、垃圾回收机制
- ==和===的区别、empty和isset的区别
- 值为false的7种情况:0、'0'、false、NULL、''、0.0、[]
- $_GLOBAL/$_SERVER/$_REQUEST/$_POST/$_GET/$_SESSION/$_COOKIE/$_FILES
- curl、serialize、unserialize、get_memory_usage、json_encode...各种常用函数
- 魔术变量、魔术方法、闭包、生成器、反射、self和parent区别
- PHP运行原理、PHP7新特性、PHP引擎是什么语言写的,结构了解吗
- PHP支持多继承吗?
- PHP连MySQL数据库的方法(PDO/mysqli)
数据结构与算法
这个只了解概念是不够的,一定要做题。leetcode是个好平台。链表 、排序算法和二叉树是最常问的。
- 数组和链表的区别、各自查找、删除、插入的时间复杂度如何
- 了解哪些排序算法,大致描述一下思路,哪些是稳定的排序算法
- hash表的查找时间复杂度是多少,为什么
- 如何实现LRU算法
- 什么是栈、队列?什么是跳表、散列表、二叉树?各自应用场景
其他
- 正则表达式
- OOP编程思想、常见的设计模式
- 微服务了解吗?什么是RPC
- 实现一个秒杀功能(服务的高并发、高可用)
- SQL注入、XSS攻击、CSRF攻击
- 什么是MVC
- 了解哪些Git命令
- 职业规划