分享

如何阅读源代码?

 挑燈看劍r7wtm5 2019-07-15

工程师阅读源代码的本质不在于学会这个软件的制作过程,而是让我们在阅读的过程中掌握无师自通的能力建设上。

我是怎么想的?

从我自身从业经验而来,无论如何变化,都会抽象归结到这主要的两类中,一类是自低向上分析,能够根据软件源代码架构推演出系统架构、部署架构、应用架构、产品架构、业务架构等向架构级靠拢的推演能力。另一类是自顶向下分析,能够根据软件相关的架构图推演出代码架构,设计模式,代码框架等向代码级靠拢的推演能力。而在这些推演过程中,你会不断的深化那些计算机的基础原理性的知识,比如说汇编、计算机原理、数据结构、操作系统。同时会不断补充业务领域的知识,沉淀行业经验。

标准分析体系vs分支方法的实践?

每个工程师心中其实都有自己一套关于阅读源代码的方法论,只是或多或少或全或缺,不够成标准化的分析体系,自然也无法利用标准化分析方法论在合适的场景中裁剪它去解决某一个源码阅读问题。如果一开始我们有一个体系化的标准方法,但是我们很难去自顶向下推演出体系化的方法论是怎么过来的,各个应用场景是怎样的,又将是一本厚厚的书籍。

我有哪些思考?

我们耗费大量的时间无法从体系化的方法自顶向下深入实践与理解,但我们可以做的是通过螺旋式不断的吸收他人的经验与自己的经历实现,不断自低向上去验证体系化的方法论,不断在自己思维里形成一个树木分支,直到有一天豁然开朗,分支关联合并成为一颗完整的大树。

引入一个分支实践

分享一个自己的方法论,或许能给你带来一些参考或思考。

如何阅读源代码?

如何阅读源代码

很多人问过我,如何读代码。因为我在外企里工作的时间较长,所以,我经常接手-些国外团队写的代码。我发现,虽然老外写的代码比国人好一点儿(有 Code Revievw),但依然有文档缺失、代码注释不清、代码风格混乱等些问题, 这些都是阅读代码的障碍。这里,我把我的一些阅读源代码的经验分享给你,希望对你有用。

首先,在阅读代码之前,我建议你需要有下面的这些前提再去阅读代码,这样你读起代码来会很顺畅

1.基础知识。相关的语言和基础技术的知识。

2.软件功能。你先要知道这个软件完成的是什么样的功能,有哪些特性,哪些配置项。你先要读一遍用户手册,然后让软件跑起来,自己先用一下感受一下。

3.相关文档。读- -下相关的内部文档, Readme 也好,Release Notes也好,Design 也好,

Wiki也好,这些文档可以让你明白整个软件的方方面面。如果你的软件没有文档,那么,你只能指望这个软件的原作者还在,而且他还乐于交流。

4.代码的组织结构。也就是代码目录中每个目录是什么样的功能,每个文档是干什么的。如果你

要读的程序是在某种标准的框架下组织的,比如: Java的Spring框架,那么恭喜你,这些代码不难读了。

接下来,你要了解这个软件的代码是由哪些部分构成的,我在这里给你一个列表, 供你参考。

1.接口抽象定义。任何代码都会有很多接口或抽象定义,其描述了代码需要处理的数据结构或者业务实体,以及它们之间的关系,理清楚这些关系是非常重要的。

2.模块粘合层。我们的代码有很多都是用来粘合代码的,比如中间件(middleware) 、Promises模式、回调(Callback) 、 代理委托、依赖注入等。这些代码模块间的粘合技术是非常重要的,因为它们会把本来平铺直述的代码给分裂开来,让你不容易看明白它们的关系。

3.业务流程。这是代码运行的过程。一开始, 我们不要进入细节,但需要在高层搞清楚整个业务的流程是什么样的,在这个流程中,数据是怎么被传递和处理的。一般来说, 我们需要画程序流程图或者时序处理图。

4.具体实现。了解上述的三个方面的内容,相信你对整个代码的框架和逻辑已经有了总体认识。

这个时候,你就可以深入细节,开始阅读具体实现的代码了。对于代码的具体实现,-般来说,你需要知道下面一些事实,这样有助于你在阅读代码时找到重点。

代码逻辑。代码有两种逻辑,一种是业务逻辑,这种逻辑是真正的业务处理逻辑;另一种是控制逻辑,这种逻辑只是用控制程序流转的,不是业务逻辑。比如: flag 之类的控制变量,多线程处理的代码,异步控制的代码,远程通讯的代码,对象序列化反序列化的代码等。这两种逻辑你要分开,很多代码之所以混乱就是把这两种逻辑混在一起了(详情参看《编程范式游记》)。

出错处理。根据2: 8原则,20%的代码是正常的逻辑, 80%的代码是在处理各种错误,所以,你在读代码的时候,完全可以把处理错误的代码全部删除掉,这样就会留下比较干净和简单的正常逻辑的代码。排除干扰因素,可以更高效地读代码。

数据处理。只要你认真观察,就会发现,我们好多代码就是在那里倒腾数据。比如DAO、DTO,比如JSON、XML, 这些代码冗长无聊,不是主要逻辑,可以不理。

重要的算法。-,我们的代码里会有很多重要的算法,我说的并不一-定 是什么排序或是搜索算法,可能会是一些其它的核心算法, 比如-些索引表的算法,全局唯一ID 的算法,信息推荐的算法、统计算法、通读算法(如 Gossip)等。这些比较核心的算法可能会非常难读,但它们往往是最有技术含量的部分。底层交互。有一些代码是和底层系统的交互,一般来说是 和操作系统或是JVM的交互。

因此,读这些代码通常需要一定的底层技术知识, 不然,很难读懂。

5. 运行时调试。很多时候,代码只有运行起来了,才能知道具体发生了什么事,所以,我们让代码运行进来,然后用日志也好,debug 设置断点跟踪也好。实际看一下代码的运行过程, 是了解代码的一种很好的方式。

如何阅读源代码?

总结一下,阅读代码的方法如下。

如何阅读源代码

很多人问过我,如何读代码。因为我在外企里工作的时间较长,所以,我经常接手一些国外团队写的代码。我发现,虽然老外写的代码比国人好一点儿(有 Code Revievw),但依然有文档缺失、代码注释不清、代码风格混乱等些问题, 这些都是阅读代码的障碍。这里,我把我的一些阅读源代码的经验分享给你,希望对你有用。

首先,在阅读代码之前,我建议你需要有下面的这些前提再去阅读代码,这样你读起代码来会很顺畅

1.基础知识。相关的语言和基础技术的知识。

2.软件功能。你先要知道这个软件完成的是什么样的功能,有哪些特性,哪些配置项。你先要读一遍用户手册,然后让软件跑起来,自己先用一下感受一下。

3.相关文档。读一下相关的内部文档, Readme 也好,Release Notes也好,Design 也好,Wiki也好,这些文档可以让你明白整个软件的方方面面。如果你的软件没有文档,那么,你只能指望这个软件的原作者还在,而且他还乐于交流。

4.代码的组织结构。也就是代码目录中每个目录是什么样的功能,每个文档是干什么的。如果你要读的程序是在某种标准的框架下组织的,比如: Java的Spring框架,那么恭喜你,这些代码不难读了。

接下来,你要了解这个软件的代码是由哪些部分构成的,我在这里给你一个列表, 供你参考。

1.接口抽象定义。任何代码都会有很多接口或抽象定义,其描述了代码需要处理的数据结构或者业务实体,以及它们之间的关系,理清楚这些关系是非常重要的。

2.模块粘合层。我们的代码有很多都是用来粘合代码的,比如中间件(middleware) 、Promises模式、回调(Callback) 、 代理委托、依赖注入等。这些代码模块间的粘合技术是非常重要的,因为它们会把本来平铺直述的代码给分裂开来,让你不容易看明白它们的关系。

3.业务流程。这是代码运行的过程。一开始,我们不要进入细节,但需要在高层搞清楚整个业务的流程是什么样的,在这个流程中,数据是怎么被传递和处理的。一般来说, 我们需要画程序流程图或者时序处理图。

4.具体实现。了解上述的三个方面的内容,相信你对整个代码的框架和逻辑已经有了总体认识。

这个时候,你就可以深入细节,开始阅读具体实现的代码了。对于代码的具体实现,-般来说,你需要知道下面一些事实,这样有助于你在阅读代码时找到重点。

代码逻辑。代码有两种逻辑,一种是业务逻辑,这种逻辑是真正的业务处理逻辑;另一种是控制逻辑,这种逻辑只是用控制程序流转的,不是业务逻辑。比如: flag 之类的控制变量,多线程处理的代码,异步控制的代码,远程通讯的代码,对象序列化反序列化的代码等。这两种逻辑你要分开,很多代码之所以混乱就是把这两种逻辑混在-起了(详情参看《编程范式游记》)。

出错处理。根据2: 8原则,20%的代码是正常的逻辑, 80%的代码是在处理各种错误,所以,你在读代码的时候,完全可以把处理错误的代码全部删除掉,这样就会留下比较干净和简单的正常逻辑的代码。排除干扰因素,可以更高效地读代码。

数据处理。只要你认真观察,就会发现,我们好多代码就是在那里倒腾数据。比如DAO、DTO,比如JSON、XML, 这些代码冗长无聊,不是主要逻辑,可以不理。

重要的算法。一般来说,我们的代码里会有很多重要的算法,我说的并不一定 是什么排序或是搜索算法,可能会是一些其它的核心算法, 比如-些索引表的算法,全局唯一ID 的算法,信息推荐的算法、统计算法、通读算法(如 Gossip)等。这些比较核心的算法可能会非常难读,但它们往往是最有技术含量的部分。

底层交互。有一些代码是和底层系统的交互,一般来说是 和操作系统或是JVM的交互。

因此,读这些代码通常需要一定的底层技术知识, 不然,很难读懂。

5.运行时调试。很多时候,代码只有运行起来了,才能知道具体发生了什么事,所以,我们让代码运行进来,然后用日志也好,debug 设置断点跟踪也好。实际看一下代码的运行过程, 是了解代码的一种很好的方式。

总结一下,阅读代码的方法如下。

●一般采用自顶向下,从总休到细节的'剥洋葱皮'的读法。

●画图是必要的,程序流程图,调用时序图,模块组织图....

●代码逻辑归一下类,排除杂音,主要逻辑才会更清楚。

●debug 跟踪一下代码是 了解代码在执行中发生了什么的最好方式。

如何阅读源代码?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多