首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

阅读大型开源软件的四个技巧

最近的一段时间里,我在研究 Android 配套工具和 Android Studio 相关的实现,以及它们如何配合完成一个 APK 的构建。因为整个系统各个模块之间的关系过于复杂,除此,不同模块之间也包含了大量的代码 —— 无论是从行数上,还是从函数长度上来说。(PS:顺便吐槽一句, @google.com 的一部分人写的代码也是又臭又长)

从总体的思路上来说,在进入代码阅读之前,我们需要:

理解代码背后的业务流程

理解架构设计的思想

从而我们才能理解主流程(脉络)。针对于此,我们会发现一些不同的模式:

借鉴他人。从他人的学习笔记中,理解整体的思路和过程。如 Android APK 的构建,Android 资源如何优化,从中理清代码阅读的思路。

源码学习。

借助测试调试。

fork 主流程。

它们并不是互相独立的,往往是结合一起使用的。

借鉴他人

这种模式,可以实现快速地学习。它存在的一些明显的缺点是:

学到的东西是二手加工过的。

部分的代码可能与真实的情形脱节。

所以,它适用于你想快速了解某一部分的功能,从而了解全貌,随后我们就可以深入某一部分进行了解。

在这种模式之下,我推荐:通过购买、阅读书籍的方式来学习。如果能买到书便是一件幸运的事,因为它已经经过了系统性的加工。唯一的问题可能是上面的代码有些老旧。但是,它更加的系统化、完整,方便我们理解,并减少搜索资料的成本。

为什么不是网上找资料?

找资料需要投入时间成本

资料不一定详细

如果你能直接找到详细的资料,毕竟花费的时间足够短的话,那么也是没问题的。

源码学习

源码学习是一个需要花费大量时间和精力的事情,除非万不得已,否则我也不想用这种方式。因为,我们会缺少大量的上下文,这些上下文可能导致我们理解出现一些误差。

前期准备:

合适的工具。最好是~~收费的()~~能用上的。

合适的存储空间。像 Android 这样的系统,clone 下来就要 120G,编译的话,估计得达到 200G 吧;而像 Android Studio 的源码,clone 下来也要 60G。

寻找阅读的模式。

尝试去构建应用。它不一定可行,但是如果可以的话,会节省你大量的时间。

源码学习是一个非常重的学习模式。我们要花费大量的时间:

在代码间跳转

梳理业务逻辑

所以,还有一些不错的犯懒的姿势:

通过书籍来加强。我一直觉得对于学习来说,阅读书籍是最理想的方式。因为寻找资料需要成本,而多数的书都会起到一个索引的目的。

寻找相似的轮子。一个有意思的技术,必然有很多公司、很多人都研究过。他们都会尝试去创造类似的轮子。唯一的问题是,我们要学习到什么程度,如果只是理解的话,那么看看别人重复的轮子也是可以的;如果是为了深入的话,那么还得回过头去看看源码

借助测试调试

对于调试来说,我们还会面临的一个挑战是:诸如我这样的入门级 MBP 配置,对于大型系统来说编译根本不够用。应对这种问题的一个比较良好的姿势是:通过 IDE 调试测试来完成对部分代码的调试。(PS:这种方式也适用于业务代码的开发)

如果我们可以在应用的入口中创建某一模块对应的测试,那么我们就可以快速调试整个应用了。

fork 主流程

对于我来说,我觉得只阅读源码是一种只为了解决一时问题的方式。同时,像我这样的凡人,对于某些知识和内容,只要不使用,我可能隔个十天半个月,我就忘光了(虽然我一直觉得这是一件好事)。

边阅读代码,边 fork 项目,我们还会有一些挑战:

语言的熟练度和模式。对于熟悉的语言来说,比如日常编写业务代码的时候,我们并不需要理解于诸如类加载器、元编程、字节码这一类的复杂模式。

新的框架、工具或语言的学习成本。比如,我在过程中就遇到需要理解和学习 Gradle 插件的一些构建机制。

代码中大量的、无用的异常处理的代码。

别人的代码都是 。(PS:一个月后自己的代码也是屎)

所以,还有一些模式:

划分模块边界。寻找架构图,通过架构图来划分模块。

切片化运行。一个模块,一个模块来理解整个系统。如 IDEA 插件的编写、IDEA 插件与 Gradle 如何交互,Gradle 插件的原理与编写,Gradle 如何调用其它命令行工具,命令行工具的原理与编写。

通过测试运行。如针对于 ApkAnalyser 这样的工具,我们可以通过单元测试而非构建一个 CLI 的方式来运行。

选择另外一门语言。因为别人用 Java、Groovy、Kotlin 编写的应用,如果你用 Rust、Go 再写一遍的话,那么你就能一次学到两个东西了:一个是新的编程语言,一个是这个开源项目的代码。

README 输出

为了方便我们查阅和其他/她人使用,我往往会把相关的内容记录到项目的 README 上。

相关的文档资料

相似的开源项目

过程中的内容产出

代码简要说明

……

这样一来,其他/她人在学习的过程中还能 GET 到相似的思路。

结论

最后,简单做一些成本对比:

一些结合模式:

阅读二手资料,根据二手资料理解主脉络

编写主流程调用链,理解架构设计理想

借助开源软件的测试调试,理解参数及流程

……

你呢,你有什么好用的模式?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200824A0QZCN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券