【Redis 源码日志】— 简介

作者:郑思愿

出处:http://daoluan.net


源码日志

在大学实习的时候,用到了 Python 里头的一个小模块 ulrilb2,是一个简单的爬虫,这个模块出错的时候,会抛出各种异常,突然想知道为什么会抛出这些异常,而且 Python 自带的模块都是开源的,能拿到一手的源码,于是把它读完了。这也是第一次知道最简单的爬虫是怎么样的。

接着,实习项目中用到了 Python 的 Web 框架 Django,非常强大。Django book 看完后,就能写出一个简单的网页。Django 是典型的 MVC 框架(?),那时对 Web 的知识很少,是知道有 HTTP 协议这些东西,但 Django 里每个模块之间是如何协同工作的呢,MVC 又是怎么体现的?这些对当时的我来说都非常的感兴趣。当 Django 收到一个 HTTP 请求,到浏览器展示一个页面,Django 里头到底发生了什么。带着这些简单的问题,开始翻阅 Django 的源代码。之后的 Libevent, Memcache 和 Redis 都一样。

阅读代码是很好的锻炼耐心和毅力的机会。看别人代码的过程,即针对一个疑问,收集线索,有点连成线的过程,所以中间肯定有一段时间非常难熬与枯燥;而当读完所有的代码,所有的线索都连成一条线,就能体会柳暗花明了。

一些优秀的开源项目里有些很值得新手学习的地方,譬如框架,设计模式等。但并不是说阅读了大量的代码就能写出很牛的代码,写代码需要对当前需求的把握和清晰的逻辑思维,这是我们在实践中可以慢慢培养的。千万不要读得太多,而写得太少。

从哪里开始读起,怎么读

这个问题简单,程序从哪里开始就哪里开始读起。譬如,C 代码,当然是从 main(),其他语言也是类似的。但阅读的时候,要带着问题去读。

带着最简单的问题,开始阅读源码。

拿到一个别人写的代码,或多或少,细节有很多,不可能一开始就能把所有的细节都吃透,所以需要一个简单的问题先把整个代码系统的阅读一遍,知道里面的整体框架是怎么样的。譬如 Memcache/Redis 这种 key/value 系统,当它们收到一个 set/get key 请求,是如何做相应的呢?整个服务是如何运作起来的?譬如 Django,当它拿到一个 HTTP 请求,是如何做相应的呢?带着这些简单的问题,浏览源代码能更快了解它们的代码框架是怎么样的,对于之后继续阅读里面的模块,也是非常有好处的。

读源代码,框架才是最先需要了解的,细节才是最重要的。

看到一个函数, 首先要做的是知道这个函数到底做了什么, 而不是他底层是怎么实现的。这有点类似于英语中的阅读理解,遇到文中陌生的单词,首先是根据上下文来判断它是什么意思,到最后真的不能理解再回头拿字典去查单词。

忽略变量声明。好的开源 C 代码会将所有变量提前声明,即放在函数的开头。实际上,没必要例会这一大坨的变量,等遇到用到这个变量的时候自然就能懂得这个参数是用来做什么,而不用我们首次见到就猜测它的用处。 画出函数的调用链,用自己认为最合适的图表说明问题。有时候 Redis 里面的调用链比较长,经常画满一张 A4 纸。在每个函数旁边都标注它所完成的事情,这是收集线索的一个过程,可能会非常的枯燥。

我会在小册子的最后推荐几款源码阅读的软件。

不在浮沙筑高台

并不推荐一上来就是看源码,一般是当你在某个方向上有一定的基本知识积累了才开始去尝试阅读。譬如c 服务器的后台代码,当然是需要对 linux 下的网络/系统编程有一定的认识,甚至读过 W.Richard Stevens 的几本经典之作。譬如 Django Web 框架,当然是需要对 Python 和 Web 方面有一定的认识。不然,完全的新人去阅读代码,只会信心受打击。

推荐每一位初学者在某一技术方向上有基本的积累后,可以找一个优秀的开源项目,并试着阅读。不懂没有关系,既然是优秀且开源的项目,网上必定会有很多的资料以及文档,这些都能为你读懂源码提供很多的帮助。你会有很多的收获,首先可以见识业界的编程规范如何,这是程序员的基本素质;可以接触到一些优秀的框架或者模式,这些是前人在大量的实践中总结出来的,必定是行而有效的,夯实你在某个技术方向上的认知;最后,就是练就你的耐心和毅力了。阅读源码本身是枯燥乏味的过程,我经常看一个模块一两天,来来回回往往复复,假使心浮气躁,容易浅尝辄止,半途而废。

什么样的源代码适合阅读

一般是“麻雀虽小五脏俱全”的项目适合阅读,在这里 C/C++ 方面的可以推荐几个供读者参考:

  • TinyXML
  • cJSON
  • Libevent
  • Memcached
  • Redis
  • Leveldb
  • Nginx
  • Lua
  • ……
  • Python Web 框架方面:
  • Flask
  • Django

JavaScript 方面:

  • jQuery

这些都能在网络上找到一手的源码,有兴趣的可以试试。

赞(3) 打赏

如未加特殊说明,此网站文章均为原创,转载必须注明出处。Java 技术驿站 » 【Redis 源码日志】— 简介
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

关注【Java 技术驿站】公众号,每天早上 8:10 为你推送一篇技术文章

扫描二维码关注我!


关注【Java 技术驿站】公众号 回复 “VIP”,获取 VIP 地址永久关闭弹出窗口

免费获取资源

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏