记阅读大型项目源代码心得

为什么要阅读源码

要想成为一名出色的书法家,需要时常研究大师们的经典碑帖,然后练习、临摹,不断重复。那么想要成为一名优秀的程序员,我觉得也应该学习研究大牛写出来的代码。所幸有很多优秀的开源项目可以给我们学习。我在前两个月花了一些时间阅读了一些开源数据库源码,现将自己暂时的一些心得体会记录下来,有新的体会我会及时更新。

如何阅读源码

一、准备阶段

下载源码

毋庸置疑,要学习项目源码,前提是关注的项目是开源项目,这时就不能下载编译好的安装包了。一般有两种途径获取源码:

1、 直接去官网下载:

知名的开源项目一般都会有自己的官网,例如:MySQL、PostgreSQL等,只要找到Source Code项下载即可。

2、Github

总所周知,Github是程序员最大的相亲网站,开源项目一般都会在上面托管。(Tip:Issues里面有很多AQ,因此当你有啥问题,可以逛逛该项目的Issues

初识项目

好的项目都会有README文件,该文件通常是对项目的一个整体介绍,可能会包括以下方面的内容(项目不同有异):

  • 目的:介绍该项目主要解决了什么问题
  • 结构:项目的功能模块及其简单说明
  • 安装:如何通过源码编译安装(或者单独的INSTALL文件介绍)
  • 使用:简单的使用教程

编译安装

源码下载之后,是需要进行编译的。为了能够探究程序运行细节,当然需要选择以Debug形式编译。

我们知道,通过gcc或者g++要以debug模型编译,需要增加-g选项。例如debug一个main.c代码,形式如下:

gcc  -g main.c -o main

但是,其实在多文件编译中,为了编译的方便,将编译项加入了Makefile文件中。关于这一点,好的项目都写好了Makefile,通过READ里面的编译介绍,在运行make函数时,添加debug需要的参数选项即可。

二、阅读源码

对于一个成熟的大型项目,其代码量是相当大的,例如PostgreSQL的代码已超过100万行,所以,如果我们想要一上来就研究其所有的程序细节,那是完全不可能的。但是,如果不能粗略了解其代码的组织结构(包括模块划分、文件结构、主要流程等),那么你可能感觉会无从下手。

我觉得阅读源码应该遵循一个原则:先高屋建瓴,再深入细节。(感觉其他事好像也是一样,嘿嘿)

因此一开始很有必要弄清项目里的各个文件夹下都是哪一块儿的功能代码。可通过以下方式解读:

  • 在README里面可能会说明功能模块都存放于相应哪个文件夹下
  • 好的命名规则会大大增加代码可读性,所以通过文件夹命名意义推测(该准则也适用于解读代码文件、函数、变量等)含义。通常来说:以src命名的一般是包括所有代码的主文件夹;config下通常是一些配置文件(与Makefile文件在编译时使用);doc下一般是文档类文件;test下是测试性代码;tools下是工具类代码;bin下是放置编译后能生成可执行文件的代码;include是头文件;lib下是库文件;copyright是版权信息文件;带有main命名的通常就是包含了整个项目的入口函数代码。
  • 参考各路大神源码笔记博客(不止在了解代码结构,俗话说:前人种树,后人乘凉。也许前辈的一篇博客总结,胜过你花费半天时间的闭门研究)

接着,可以尝试让代码运行起来。

关于调试工具,这里推荐使用GDB(苹果系统下使用LLDB,两者功能几乎相同,命令对照参考:http://lldb.llvm.org/use/map.html)进行调试。它可以帮助我们理清很多的运行细节,包括函数调用堆栈关系、运行线程数、实时变量值等。由于目前我也是刚采用LLDB进行大型项目的调试,所以等过段时间使用更加娴熟之后,会以实际的例子介绍如何有效地使用。在这里附上GDB官方在线文档http://sourceware.org/gdb/current/onlinedocs/gdb/

灵活运用调试工具,能够极大程度地帮助我们深入到程序执行细节(这是我目前认为研究源码最有效的手段!)

有一点很重要,我们看源码是有目标的,因此,要有选择性地阅读代码,过滤掉不相关的粗枝末节。

以我这两个月看数据库源码来说,我的目的是为了弄清楚数据库的客户端与服务器的通信协议细节,因此我首先会定位到代码中服务端代码模块中,并且通过调试时获取的函数调用关系,绘制一幅服务端函数调用流程图。这很重要,因为可能今天你看懂函数执行流程了,过两天就会忘掉,因此一幅自己绘制的流程图能够帮助你随时记起程序逻辑。

当然,仅通过调试器也是不够的。很多时候,我们需要将函数抽离出来,合理利用项目里的测试样例(自己也可以写),并适当添加一些输出(例如print),进行小范围的代码运行,这样能更有助于理解到细节。

三、笔记

其实这一点是最容易被忽略的,因为存在惰性思维。多做笔记,适时总结,这是一个非常好的习惯。

ok,先写到这。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章