我是怎么啃完MySQL、Redis源码的:技术人持续学习的系统方法
很多人问我:你是怎么把Netty学透的?源码应该怎么读?为什么你学技术总是比我快?
今天认真写一篇,讲讲我这几年是怎么学习的。不讲道理,只讲方法。
01 学习的第一个问题:为什么要读源码
先说清楚一件事:不是所有技术都需要读源码。
CURD、调接口、用框架——这些不需要读源码。文档够了。
但如果你是认真想做技术这行的,以下几种情况,源码是必须读的:
第一种:理解框架的底层原理
你用Spring Boot用了三年,但不知道它的自动装配是怎么实现的?不知道Bean的生命周期是怎么管理的?
这不是「会不会用」的问题,这是「理不理解」的问题。前者决定了你的下限,后者决定了你的上限。
第二种:排查线上疑难杂症
线上突然出现一个诡异的问题,文档里查不到,Google上也搜不到。
这时候你能怎么办?读源码。顺着调用链一路追下去,找到根因。
不会读源码的人,遇到这种问题只能干瞪眼;会读源码的人,三下五除二定位到问题。
第三种:设计高性能系统
当你需要自己设计一个高性能的组件时,你不知道业界顶尖的框架是怎么处理并发、怎么管理内存、怎么做优化的,你的设计大概率会有问题。
读源码,就是站在巨人的肩膀上设计自己的系统。
02 我的源码阅读方法论:四步法
说了为什么要读,再说说怎么读。
我啃过MySQL、Redis、Spring、Kafka的源码,总结出了一套自己的方法论:四步法。
第一步:先会用,再去读
很多人一上来就打开IDE开始读源码,读了三天发现不知所云,放弃了。
这是方法错了。
正确的做法是:先用起来。
你用Redis做个缓存系统,熟悉了Redis的基本操作,对它有了一个整体的感知之后,再去读它的源码。
你会带着问题去读:这个命令是怎么实现的?这个数据结构是怎么存储的?
带着问题的阅读,效率是漫无目的阅读的十倍。
第二步:从入口开始,顺着调用链走
读源码最难的地方,是不知道从哪下手。
我的经验是:从入口开始,顺着调用链走。
不要试图一次性读懂整个系统,先找准一个入口。比如Redis执行一个SET命令,你就从SET命令的入口开始,一步一步跟下去。
先搞清楚一条完整的调用链,再慢慢扩展到其他分支。
不要贪多,一次搞懂一个点就够了。
第三步:画图、做笔记、反复回顾
源码阅读是长线工作,不是今天读了明天就能记住的。
我的做法是:
-
画图:用Draw.io或者Xmind,把核心流程图画出来。类之间的关系、数据结构的组织、方法调用的顺序……画一遍,思路就清晰了。
-
做笔记:在Notion或者Obsidian里记录核心代码片段和自己的理解。不需要写得多完整,关键是记录思考过程。
-
反复回顾:隔几天翻出来看看,每次看都有新的理解。这是「慢即是快」的典型例子。
第四步:动手写demo验证
读懂了是一回事,写出来是另一回事。
我读完Redis的跳表数据结构之后,自己用Java实现了一遍。不需要完美实现,只需要验证自己真的理解了对不对。
写demo的过程中会遇到各种细节问题,解决这些问题的过程,才是对知识理解最深的时候。
03 以MySQL为例,我是如何啃完InnoDB存储引擎的
光讲方法有点虚,我用一个具体的例子来说明。
我啃MySQL的InnoDB存储引擎,用了大概三个月的业余时间。
第一个月:熟悉基本操作,理解整体架构。
我先用了大量的时间熟悉MySQL的各种操作:建库建表、索引操作、事务控制……同时看《MySQL技术内幕:InnoDB存储引擎》这本书,对InnoDB的整体架构有了一个认知。
重点理解三个东西:InnoDB的内存结构(缓冲池)、磁盘结构(表空间、redo log、undo log)、以及两者之间的数据流转。
第二个月:从一条SQL的完整执行链路入手,顺藤摸瓜。
我选了一条最常见的查询语句,从Parser开始,顺着优化器、执行器,一路追踪到InnoDB的存储引擎层。
这个过程花了很多时间,但让我真正理解了SQL在MySQL内部是怎么流转的。
第三个月:深入具体的机制:事务、锁、索引。
事务的ACID是怎么保证的?MVCC是怎么实现的?Buffer Pool是怎么管理内存的?索引是怎么存储的?
每个点单独研究,遇到不懂的就去查资料、翻源码。
04 通勤时间是我最重要的学习时间
很多人说:我也想学习,但我没时间。
这就是借口。
我以前每天通勤单程100分钟,来回200分钟,一年就是700多个小时。按每天学习2小时算,相当于365天每天学2小时。
通勤时间的特点:碎片化、容易被干扰。
所以我的做法是:用iPad看视频课程、听技术播客。不需要深度专注,但需要持续积累。
极客时间的课程我听了600多小时,架构师培训课程300多小时。都是碎片时间积累出来的。
关键是:不要让通勤时间白白浪费。带上耳机,打开课程,这200分钟可以是学习时间,也可以是刷手机时间。
区别在于你自己的选择。
05 技术持续学习的几个原则
最后说几点我对「持续学习」这件事本身的理解。
原则一:体系化学习 > 碎片化学习
碎片化学习让你知道很多零散的知识点,但很难形成体系。
真正让你形成竞争力的,是把知识点串联成线、编织成网的能力。
所以,不要只看短视频教程,买几本经典书籍,从头到尾系统地学一遍。
原则二:用输出倒逼输入
读了很多源码,学了很多课程,但你真的掌握了吗?
教别人、写博客、做分享——用输出倒逼输入,这是检验学习效果的最好方法。
你自己能讲清楚,才是真正理解了。
原则三:技术广度和深度同样重要
只懂后端,不懂前端和运维,你的视野是受限的。
只懂技术,不懂业务,你的设计是脱离实际的。
技术广度让你有全局视野,技术深度让你有核心竞争力。两者缺一不可。
原则四:持续学习是一种生活方式,不是阶段任务
很多人学习是「一阵一阵」的:换工作了突击学一波,项目结束了就停了。
但技术更新太快了。你不能靠突击,只能靠持续。
把学习变成每天的习惯,像吃饭睡觉一样自然,才能在这个行业持续走下去。
写在最后
很多人问我:每天工作这么忙,还要管家里,怎么还有时间学习?
我的回答是:不是有时间才学习,是把学习变成优先级。
时间永远是不够的,但如果你真的想学,你总能挤出时间。
早起一小时,晚睡一小时,通勤时间用起来,周末少刷一天手机……
这些时间加起来,足够让你在三年内跟大多数人拉开差距。
关键不是时间,是决心。
愿我们都在持续学习的路上,一起加油。
夜雨聆风