微信号:infoqchina

介绍:有内容的技术社区媒体

如何阅读源代码,以及Redis开源文档的故事

2013-03-14 16:09 InfoQ

黄健宏(huangz)是一位90后,喜欢函数式编程。由于对数据库产生了兴趣,就开始阅读Redis源代码。

“阅读 Redis 源码对我来说是一次全新的学习体验。当我刚开始看 Redis 源码的时候,我只会一些基本的数据结构和算法,没有任何网络编程、数据库或者系统编程方面的经验,基本是一边看源码,一边补充基础知识,然后才慢慢理解的。”

阅读的成果可能huangz自己一开始也没想到过:一份从阅读源代码入手来学习Redis的笔记合集——《Redis设计与实现》,在中文技术界引起了大量关注,成为一段佳话。

《Redis设计与实现》主要从高抽象层次在如下的5个方面对Redis的实现进行阐述:

  1. 内部数据结构

  2. 内存映射数据结构

  3. Redis数据类型

  4. 功能的实现

  5. 部分运作机制

同时huangz为了满足大家深入学习的需求,还对Redis 2.6的源代码进行了详细注释。

huangz是如何从对数据库产生了兴趣开始,到读懂了Redis的源代码,还能够给更多人介绍清楚Redis是如何设计并实现的?在跟InfoQ编辑水哥沟通的过程中,huangz分享了一些阅读开源项目源代码的心得:

  1. 自底向上:从耦合关系最小的模块开始读,然后逐渐过度到关系紧密的模块。就好像写程序的测试一样,先从单元测试开始,然后才到功能测试。我在刚开始读 Redis 源码的时候,使用的就是这种方法:先从单独的数据结构模块开始,然后再过渡到高层的功能模块。

  2. 从功能入手:通过文件名(模块名)和函数名,快速定位到一个功能的具体实现,然后追踪整个实现的运作流程,从而了解该功能的实现方式。我在读阻塞列表、数据库这种流程和功能都比较复杂,和其他文件耦合也比较多的模块时,使用的就是这样的方法。

  3. 自顶向下:从程序的 main() 函数,或者某个特别大的调用者函数为入口,以深度优先或者广度优先的方式阅读它的源码。我在阅读 redis.c/serverCron() 、 redis.c/main() 和 ae.c/aeMain() 这种有明显调用者性质的函数时,使用的就是这样的方法。

这三种方法并不互相冲突:在某些函数/模块要用某种方法,而某些函数/模块要使用另一种方法,有时候又需要混合使用多种方法。

目前在Github上也有很多类似的内容,如:Developing Backbone.js Applications、ProGit等,也许这种写作方式将会在技术领域引领一个新的内容创作潮流。

亲爱的InfoQ读者,如果你也在阅读开源项目的源代码,并且有一些阅读心得希望和大家分享,欢迎发信过来!


点击“阅读原文”查看更多内容并吐槽吧。

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 程序员保持健康的7个秘诀。 《谈判天下》:任何事情都可以好好谈 19岁少年震惊科技界,不仅被NASA邀去工作,还被奥巴马请进白宫 Web Animation 制作指南