后记 Postscript

本书的写作到此就算告一段落了。下面简单记录一下本书写作过程中的一些细节和感悟。

写作的起因与调研历程

开始构思写作本书是在 2021 年的五六月份。最初的起因是 2020 年年底,根据工作安排我需要调研 KV 存储引擎,用于项目方案的选型。在调研过程中,我首先在 GitHub 上搜索了一些开源项目,例如 LevelDBRocksDBBoltDBBuntDBBitcask 等。一开始就是阅读项目文档和源码。在这个过程中,我用了很多“笨”办法来学习和研究,例如使用思维导图来画类结构之间的调用关系等。

除了阅读开源项目源码外,我还搜集了一些书籍和论文来学习,例如前言提到的《数据库系统内幕》《数据库系统概念》《数据库系统实现》《数据密集型应用系统设计》,还有姜承尧所著的《MySQL 技术内幕:InnoDB 存储引擎》、廖环宇和张仕华所著的《精通 LevelDB》、小孩子 4919 所著的《MySQL 是怎样运行的:从根儿上理解 MySQL》等。对上述书籍中的部分章节我反复阅读了好几遍,尤其是《数据密集型应用系统设计》的第 3 章,每次阅读完后都感叹:存储引擎这么复杂的东西,却被作者讲解得如此简单!

然而,虽然有这么多好的学习资料,我还是有几个疑惑:

  1. 存储引擎(尤其是单机的 KV 存储引擎)到底有哪些?它们之间有什么区别和联系?
  2. 为什么很多关系数据库选择使用 B+ 树存储引擎?
  3. LSM-Tree 的结构为什么是这样的?
  4. 除了 B+ 树存储引擎和 LSM-Tree 存储引擎外,是否还存在其他的存储引擎模型?
  5. 这些存储引擎背后的设计理念是什么?是如何做出方案选型决策的?

我发现始终找不到一本书能解答我的这些疑惑。抱着打破砂锅问到底的心态,我一直在搜索资料并进行探索,中间经历了很多波折。在研究 BoltDB 存储引擎源码时,我花了很长时间仍然感到困惑,后来下决心一定要啃下这个硬骨头。在坚持不懈的努力下,我终于攻克了这个难题。其间,我多次结合《MySQL 是怎样运行的:从根儿上理解 MySQL》这本书中的第 6 章内容进行理解。在那段时间里,我常和同事探讨:为什么在读多写少的场景中,MySQL 选择 B+ 树结构来构建存储引擎?得到的答案五花八门,很多答案不太具有说服力。随着我的进一步研究和探索,我慢慢地有了自己的理解和答案。

在当时,我还特意画了很多 B+ 树存储引擎中的内部结构图来分析不同场景下的情况,理解分裂合并过程、数据存储结构等。在自己理解之后,我还整理了一些资料,在团队内和“Go 夜读”社区进行了几次分享。分享之后,我发现有很多和我有相同困惑的小伙伴,通过我的分享,他们解开了一些困惑,并给予了积极的反馈。于是,我将部分内容整理成了技术文章,在公司内部的平台上发表,为此还获得了技术写作奖。同时,我还在 B 站(账号:jaydenwen123)录制了一系列视频,并在自己的公众号上同步发布了几篇文章。

在持续了一段时间后,我觉得自己整理的资料已经相当全面,且发现目前市场上缺乏能解答我之前疑惑的资料。对于有相同需求的人来说,他们也需要花费很多时间和精力来整理、汇总这些内容。于是,经过再三考虑,我决定自己动手写本书,将之前探索、总结、整理、收集和思考的内容分享给更多的读者或爱好者,让他们能够少走一些弯路。有了这个念头后,我整理了一个粗糙的大纲。

有一天,突然出版社的编辑通过我的公众号文章找到了我,问我是否有写作意愿。因为我之前已经有这方面的规划,和编辑详聊了一下后,我爽快地答应了。

回想起来真的很梦幻,虽然之前曾经想过要出版一本书,但没有想到真的实现了。现在看来,写书并不是一蹴而就的,而是一个自然而然的过程。在开始写书之前,我已经做了很多准备和努力,积累了不少资料。但写书是一项漫长且没有边界的工作,需要投入大量的时间、精力和心血。对于自己的信心和耐力来说,也是一次巨大的考验,甚至在写作过程中会出现自我怀疑的情况。

写作过程的阶段与方法

在写作的过程中,每一章的写作分为以下几个阶段:

  1. 梳理写作大纲
  2. 整理搜集资料(书籍、论文、优质文章)
  3. 反复阅读消化
  4. 细化写作思路1
  5. 下笔写作
  6. 画图
  7. 章节校正

其中,整理搜集资料反复阅读消化是非常耗时的。一方面,担心搜集到的资料不全或者不够权威,没有参考价值;另一方面,最害怕的是自己的理解出错,然后把错误的东西传达给读者,误导他们。所以,每当我自己没有理解或者理解得不透彻时,就不会开始动笔写作,这个消化的过程非常痛苦。此外,细化写作思路、下笔写作也是耗时的部分。当遇到比较难的内容和主题时,我经常会陷入困境,冥思苦想很久,内心非常矛盾和纠结。当开始画图和章节校正时,基本上已经接近完成一章的内容,相对会轻松一些。

心理起伏与挑战

在写作的过程中,我有过几次感觉坚持不下去的情况。有些内容本身就很复杂,我自己都很难理解,更别说用简单的语言表达出来,让读者理解了。

  • 第 2 章的红黑树:我反复挣扎了好几次。我看了几本书来理解,发现自己理解得差不多了,准备动手写的时候却迟迟下不了决心,因为我感觉这部分内容太难了,内心非常抗拒。
  • 第 3 章:也面临很大的困难,因为我对操作系统的理解并不够深入,现在要自己来写这部分内容更是难上加难。
  • 第 5 章的事务和异常情况处理:这两章的难题克服后,第 5 章的事务和异常情况处理又是一个非常大的难题。

类似这样的例子还有很多。

克服困难的方法

庆幸的是,我每次都在与自己内心的斗争中取得了胜利。一方面,我强迫自己去做那些让我害怕、具有挑战性、不想做的事情。实际上,往往是自己的内心在作祟,当真正开始做的时候,发现其实也没那么难。在我第一次成功克服困难后,我的自信心得到了增强,原来我也能够完成看似不可能完成的任务。另一方面,当我完成挑战性的工作后,我会及时给自己奖励,比如吃火锅、看电影或者出去散步。

无论如何,在经历了各种波折后我完成了自己的处女作,没有在中途放弃,在怀疑自己的过程中坚定了信心。

总结与致谢

总的来说,通过写作这本书,我收获了很多,也得到了锻炼。如果这本书分享的内容能够帮助到读者,那将是我的荣幸。书中如果有一些错误的理解和观点,我也希望能够得到读者的批评指正。

推荐阅读

推荐阅读

Footnotes

  1. 细化写作思路是指确定每一章分几节,某一节写几部分,每部分写哪几块,每块按照什么思路来写,它们之间的逻辑结构和关联性如何。