高效阅读源代码指南

最近一年里,我阅读了不少开源项目的源代码,之前也和朋友讨论过阅读源代码时遇到的一些问题。我觉得有必要写一篇博文分享一下自己的经验。

序章:准备工作

通常情况下,我们不会无缘无故拿到一份源代码,我是说,当想要阅读源代码时,一定是抱着某种目的进行下去的,这个目的会贯穿整个研究过程,比如:

  • 想研究某个东西的实现
  • 想学习作者的代码风格和项目组织
  • 想参考实现并用其他语言移植项目

等等。所以在最初的时候,明确自己阅读源代码的目的非常关键。

在明确了目的之后,就可以正式开始深挖代码了。不过在此之前,还是要提醒一下:工欲善其事,必先利其器。

可以用来写代码的工具有很多,如包括Vim、Emacs、SublimeText、Atom等在内的Text Editor,还有包括Visual Studio和JetBrains全家桶在内的IDE。Text Editor在编写代码时有无与伦比的优势,方便的快捷键、一流的反省速度、高度可配置的编辑环境等等,无疑能极大程度上提高程序员的手速,然而这些亮点都不是在阅读代码时候所必须的;阅读代码时,很多时候需要搞清楚函数之间的调用关系,这时候就需要有强大的代码静态分析工具和一个便捷的断点调试工具,这也正是IDE的优势。

因此我郑重推荐在阅读代码时使用IDE,当然如果是较小的项目加之已经调教成IDE的Vim/Emacs,也是没什么问题的。

接下来,就真的可以开始深挖代码了。

第一步:自顶向下理清代码组织关系

代码组织结构

很多时候这一点根本就不是问题,因为项目的构建无非是通过构建工具、框架或最佳实践来做的,实在不行还可以查阅开发文档。

Code Breakdown Structure

这是我认为最重要的一个步骤,然而我也吃惊地发现,并不是每个人都能重视这个步骤并处理得很好。

所谓Code Breakdown Structure的说法,本身源自软件工程中Work Breakdown Structure。WBS把软件需求按照业务的角度逐级下分,而这份产物能够直接影响到项目代码里的数据模型。

当然,项目代码里的结构,不仅仅受到了实际需求的影响,也受到了构建工具和设计模式的影响,比如能够应用在全局的MVC模式,或者应用在局部场景的单例模式、状态模式等等,更会受到程序语言相关层面的直接影响;但不论是怎样的软件模式、怎样的编程范式,阅读源代码时仍旧需要搞清楚不同的代码组织在整个项目里的角色是什么,需要分别知道数据层、工具函数、顶层抽象、抽象实现和具体的功能性代码分别是什么、在哪里。在整理这部分内容的时候,通常会在脑海中形成清晰的思路,但如果可以的话,请把这些东西用纸笔画出来。

如果想要研究的是具体的功能实现,就需要在上面的基础上更进一步,着眼于功能性的代码,对每个功能实现画出活动图和时序图。

总之这一步里包含了不小的工作量,但搞清楚这些东西,是继续进行下去的基础。

第二步:有针对性地深挖代码

这是阅读代码的核心步骤,是最复杂的一个步骤,也是我无法在此篇文章中展开的步骤。因为每个人阅读代码的目的不尽相同,每个人研究问题的习惯也有很大差异。

研究问题的时候,通常会有大量自己改代码、打断点、做编译的机会,请尽情享受解决自己目标问题的思维过程,并且不要忘记以下重要的辅助资源:

  • 开发文档
  • 开发日志(Issues, Mails)
  • 主要开发成员的博客(如果有的话)
  • 相关领域的资料,包括书籍和论文
  • 与同类开源项目产品的实现相比较
  • 与原作者、开发组进行沟通:IRC、Maillist、Gitter等

第三步:自底向上理解局部代码在全局中的重要性

不论是把眼光聚焦在对问题的解决方案上,还是在代码组织、设计模式上,能针对结果做进一步抽象,才是最好的。

这里面蕴含的机会是:

  • 一旦理解了作者的解决方法,对自己理解这种解决方案本身和背后的业务模型都有提升。
  • 一旦发现了更好的解决方案,自己就有机会提PR。

尽管要做好这一步,需要较强的领域技术背景,但如果能坚持尝试这么做的话,会受益匪浅。

接下来的事情

阅读完一份源代码,找到了自己需要的东西,让自己的能力得到提升。接下来的事情当然是:

  • 多运动,让自己大脑放松一下
  • 多陪陪父母妻儿(没有妹子的话就去找)
  • 阅读下一份开源代码
时间: 2024-10-12 03:11:08

高效阅读源代码指南的相关文章

如何阅读源代码(2)

今天遇到的问题,专心的跟进源代码中.... 第二章: 基本编程元素 ++++++++++++++++++++ 19.第一次分析一个程序时, main是一个好的起始点. 20.层叠if-else if-...-else序列可以看作是由互斥选择项组成的选择结构. 21.有时, 要想了解程序在某一方面的功能, 运行它可能比阅读源代码更为恰当. 22.在分析重要的程序时, 最好首先识别出重要的组成部分. 23.了解局部的命名约定, 利用它们来猜测变量和函数的功能用途. 24.当基于猜测修改代码时, 您应

如何阅读源代码

总结一 阅读别人的代码作为开发人员是一件经常要做的事情.一个是学习新的编程语言的时候通过阅读别人的代码是一个最好的学习方法,另外是积累编程经验.如果你有机会阅读一些操作系统的代码会帮助你理解一些基本的原理.还有就是在你作为一个质量保证人员或一个小领导的时候如果你要做白盒测试的时候没有阅读代码的能力是不能完成相应的任务.最后一个就是如果你中途接手一个项目的时候或给一个项目做售后服务的时候是要有阅读代码的能力的. 收集所有可能收集的材料 阅读代码要做的第一件事情是收集所有和项目相关的资料.比如你要做

高效阅读文章的“三步曲”

高效阅读文章的“三步曲” 通读杨春玲老师的两篇博文“我科研过程中走过的弯路及纠偏探索 ”.“如何有效阅读文献(图) ”及其中链接的文章How to Read a Paper http://blog.sciencenet.cn/home.php?mod=attachment&filename=howtoread.pdf&id=47254,现给出自己对于这一问题的思考,以下没有标注的引号里的内容均来自杨老师的两篇博文中. 一.认真研读自己专业的经典教材,“教材是一个领域里最佳参考,研究之前先查

Emacs和它的朋友们——阅读源代码篇(转)

正如那本<Code Reading>一书中指出的那样,源代码阅读一直没有被很好的重 视:你上大学的时候有“代码阅读”这门课吗?相信没有. 1 Source Insight 谈到阅读源代码,不得不提一下很多人都用过并且现在也还用着的一个工具: Source Insight.很多年前我最早接触的源代码阅读工具就是这个.不可否认, 它有很多优点:非常直观,非常容易上手,该有的功能基本上都有… 但是,它也有一些缺点: 是商业软件:要花钱买或者使用盗版是Windows软件:在Linux下用的话需要用 W

菜鸟好文推荐(二十三)——成为一名更好的程序员:如何阅读源代码

阅读源代码有许多益处.你会发现新的架构(construct)和库,与其他的代码维护者产生共鸣,但最重要的是学会如何组织代码,避免因内部极其复杂而变得不可维护. 但是也有一个不好的地方,那就是阅读源代码太困难了.每当我看到一个新的代码库(code base)时,这种让人眩晕的感觉就充斥了我的大脑.我的内心告诉我压根不想趟眼前这趟浑水. 这是(希望是)正常的反应.当我们的大脑接触过多的新东西,就会产生排斥.造物主赋予我们的这台强大的模式匹配机器根本找不到规律.所有的抽象(abstraction)都是

程序猿如何高效阅读

从读书谈起 一開始我的问题是:"程序猿应该如何读书?" 假设把程序猿去掉,问题就变成"读书的方法或者做笔记的方法". 这个问题有非常多大家已经给出了回答: 张五常:读书的方法:理解比记忆或做笔记更重要,学会提问与抓重点. 李敖介绍他的读书方法:对书籍进行"拆卸",留下自己想要的素材和观点,再归档.分类为我所用. 杨绛:钱钟书是如何做读书笔记的:广泛阅读,多语言,多学科.勤做笔记,每读完一些内容都会把感想和心得记录下来. 阅读本身是有一些有用技巧的

程序员怎样高效阅读

从读书谈起 一开始我的问题是:"程序员应该怎样读书?" 如果把程序员去掉,问题就变成"读书的方法或者做笔记的方法".这个问题有很多大家已经给出了回答: 张五常:读书的方法:理解比记忆或做笔记更重要,学会提问与抓重点. 李敖介绍他的读书方法:对书籍进行"拆卸",留下自己想要的素材和观点,再归档.分类为我所用. 杨绛:钱钟书是怎样做读书笔记的:广泛阅读,多语言,多学科.勤做笔记,每读完一些内容都会把感想和心得记录下来. 阅读本身是有一些实用技巧的,比

[转]Linux下阅读源代码:(g)vim+Taglist+ctags

Linux下阅读源代码的方法很多,聪明人从标题应该就可以知道,需要(g)vim+Taglist+ctags.3者配合,真是珠联璧合,功力无限啊! vim/gvim什么是vim/gvim,如果看官连vi都不知道,那就别往下看了.一些对Linux一知半解的人说,vi不就是一个和Win下的note pad一样的工具吗?其实大错特错了,如果仅仅是和note pad一样的功能,那它早就不叫vi了. TaglistTaglist是一个vim的源代码浏览插件,具体功能介绍还烦请各位看官自己google一下.很

阅读源代码之“那是我的青春”

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.