乐于分享
好东西不私藏

我是怎么啃完MySQL、Redis源码的:技术人持续学习的系统方法

我是怎么啃完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 技术持续学习的几个原则

最后说几点我对「持续学习」这件事本身的理解。

原则一:体系化学习 > 碎片化学习

碎片化学习让你知道很多零散的知识点,但很难形成体系。

真正让你形成竞争力的,是把知识点串联成线、编织成网的能力。

所以,不要只看短视频教程,买几本经典书籍,从头到尾系统地学一遍。

原则二:用输出倒逼输入

读了很多源码,学了很多课程,但你真的掌握了吗?

教别人、写博客、做分享——用输出倒逼输入,这是检验学习效果的最好方法。

你自己能讲清楚,才是真正理解了。

原则三:技术广度和深度同样重要

只懂后端,不懂前端和运维,你的视野是受限的。

只懂技术,不懂业务,你的设计是脱离实际的。

技术广度让你有全局视野,技术深度让你有核心竞争力。两者缺一不可。

原则四:持续学习是一种生活方式,不是阶段任务

很多人学习是「一阵一阵」的:换工作了突击学一波,项目结束了就停了。

但技术更新太快了。你不能靠突击,只能靠持续。

把学习变成每天的习惯,像吃饭睡觉一样自然,才能在这个行业持续走下去。


写在最后

很多人问我:每天工作这么忙,还要管家里,怎么还有时间学习?

我的回答是:不是有时间才学习,是把学习变成优先级。

时间永远是不够的,但如果你真的想学,你总能挤出时间。

早起一小时,晚睡一小时,通勤时间用起来,周末少刷一天手机……

这些时间加起来,足够让你在三年内跟大多数人拉开差距。

关键不是时间,是决心。

愿我们都在持续学习的路上,一起加油。