面试时聊框架头头是道,一到线上故障就束手无策——这是很多后端开发的真实写照。月薪30K的人和普通开发的分水岭,往往不在于会用多少中间件,而在于是否吃透了底层原理。那些高薪后端,都在偷偷补这几块硬骨头。
一、网络底层:从TCP到epoll
很多人调API很熟,却说不清一次HTTP请求到底经历了什么。30K的后端会深挖:TCP三次握手为什么不是两次?TIME_WAIT为什么是2MSL?滑动窗口和拥塞控制如何影响吞吐?更关键的是IO多路复用——select、poll、epoll的区别,epoll的LT和ET模式,以及为什么Nginx用epoll能扛住十万连接。他们知道,Java NIO的Selector底层就是epoll,Netty的EventLoop也是基于此。不懂这些,调优就是瞎猜。
二、操作系统:零拷贝与内存管理
一次文件传输,传统read+write要经历4次上下文切换和4次数据拷贝。零拷贝技术(mmap、sendfile、splice)能把拷贝次数降到最低,Kafka和Netty的高性能正源于此。高薪后端还懂虚拟内存、页表、缺页中断,明白为什么大页(HugePage)能提升JVM性能。他们知道,所谓的“高性能”不是靠堆机器,而是靠减少CPU和内存的无效消耗。
三、JVM与语言运行时:内存模型与GC
Java后端绕不开JVM。30K的人不仅会设-Xmx,更懂JMM(Java内存模型)、happens-before原则、内存屏障和volatile的底层实现。他们能说清对象在堆中的分配、TLAB、逃逸分析,以及G1、ZGC的回收算法和停顿预测。遇到OOM,能通过MAT分析支配树,定位泄漏点;遇到GC频繁,能通过日志判断是Young GC还是Full GC,进而调整分代比例。这些不是背诵,而是实战练出来的直觉。
四、数据库:索引与事务的物理实现
会用SQL不等于懂数据库。高薪后端清楚B+树的页分裂、回表、覆盖索引、最左匹配,知道为什么联合索引顺序至关重要。事务方面,他们理解undo log、redo log、binlog的区别与协作,明白MVCC如何通过Read View实现可重复读,间隙锁如何解决幻读。他们还能说清MySQL主从复制的原理,以及半同步、组复制的取舍。这些底层知识,决定了你是在“用”数据库,还是在“驾驭”数据库。
五、分布式:共识与一致性
到了30K,必然面对分布式。CAP是入门,Raft和Paxos才是硬功夫。他们能讲清Raft的Leader选举、日志复制、安全性,以及为什么Etcd、Consul都选它。分布式事务的2PC、TCC、Saga、本地消息表,各自适用什么场景,有哪些坑。还有一致性哈希、Quorum机制、向量时钟。这些原理不直接写业务代码,却决定了系统在节点故障、网络分区时能否活下来。
为什么“偷偷学”?
因为这些原理不会在需求评审里出现,也不会在CRUD中用到。它们只在系统崩溃、性能瓶颈、数据不一致时,成为你唯一的救命稻草。会框架的人很多,懂原理的人很少。稀缺,就是溢价。
怎么学?
别只收藏文章。读源码:Netty的EventLoop、JDK的HashMap、MySQL的InnoDB。画图:把TCP状态机、JVM内存结构、Raft流程画出来。做实验:用压测工具看GC日志,用tcpdump抓包,用Explain分析SQL。最后,把原理讲给别人听——能讲清楚,才是真懂。
月薪30K不是终点,而是市场对“能解决复杂问题”的定价。底层原理,就是你解决复杂问题的底气。别人在卷框架,你在卷原理,差距自然就拉开了。