如何探索大型开源软件库( 二 )


如果你还没有克隆项目并在本地运行 , 请确保在计划阶段之前完成这项工作 。 按照项目上的安装说明(通常在DEVELOPMENT.md中)把它运行起来 。 通常 , 当你可以运行项目的测试套件并通过所有(或大部分)测试时 , 我们就认为此步骤已完成 。
研究规范是理解大型代码库的另一个具体步骤 。 例如 , Runc(一个用于生成和运行容器的CLI工具)有一个SPEC.md文档介绍了libcontainer组件 , 其中包含文件系统、运行时和init进程、安全性等方面的详细配置 。
使用工具帮助理解
了解代码中什么东西在哪里 , 通常会很有用 , 在这方面 , 类似UML图之类的东西可以提供帮助 。 许多项目的文档中都包括这样的高级架构图 , 因此 , 一定要看看项目中是否有这样的图 。
这是因为它们是整个项目最简洁的表示方法 , 一个好的架构图可以告诉你很多关于信息如何在代码库中流动的信息 。
你的项目没有UML图?不用担心 , 因为有工具可以使梳理大型代码库变得更容易 。 pyreverse就是这样一个工具 , 它可以针对你提供的代码库自动生成UML类图 。
你还可以使用调用图(callgraphs)了解哪些函数被调用了 , 以及它们被调用的顺序 。 它们是运行时函数执行的可视化表示 。 例如:PlainTextclassWhatNumber:definit(self):self.odd_counter=0defcheck(self , number):ifnumber%2==1:self.odd(number)elifnumber%2==0:self.even(number)defodd(self , number):print("{}isodd".format(number))self.odd_counter+=1defeven(self , number):print("{}iseven".format(number))ifname=="main":obj=WhatNumberobj.check(2)obj.check(1)

如何探索大型开源软件库
文章图片
WhatNumber的代码调用图
调用图还可以包含其他有用的补充信息 , 比如每次函数调用所花费的时间 。
GitLog使用技巧
对应的命令如下:PlainText#最常编辑的10个文件gitlog--pretty=format:--name-only|sort|uniq-c|sort-rg|head-10#文件名/目录名中包含单词NAME的最常编辑的50个文件gitlog--pretty=format:--name-only|sort|uniq-c|sort-rg|head-50|grepNAME
搜索
一个人要想有效地思考 , 必须愿意忍受焦虑 , 经受搜索之苦 。
——J.Dewey
搜索工具在导航大型代码库时尤为重要 。 如果代码是在Github上公开的 , 你可以导航到它的存储库 , 按/启动Github的搜索工具 , 输入查询 , 并得到高亮显示的即时搜索结果 。
对于本地存储库 , 使用一个简单的grep命令就可以达到大多数目的:
PlainText#对于下面的命令#r-递归搜索目录#n-打印行号#i-大小写敏感搜索grep-rni$"PATTERN"#搜索具体的扩展名grep-rni.--include.EXTENSION
例如:

如何探索大型开源软件库
文章图片
使用ctags并将其与vim集成是另一种搜索大型代码库的方法:
对于许多流行的编程语言 , UniversalCtags都可以从源文件中找出语言对象 , 生成一个索引(或标签)文件 。 这个索引文件可以方便文本编辑器和其他工具找出索引项 。
发现问题
在发现阶段 , 你的目标是找出一系列你想要解决的好问题 。 一个好的问题应该满足以下条件:
你对这个问题感兴趣你已经具备解决这个问题所需的技能 , 或者在编程的过程中通过适当的学习就可以习得 。务必在分配给你的项目中找问题 。 MLH导师建议 , 开始的时候搜索带有helpwanted、goodfirstissue、MLH或hacktoberfest标签的问题 。 导师们还建议 , 在开始的时候先从比较简单的小问题开始 , 然后在整个学习过程中逐步解决比较复杂和困难的问题 。
总之 , 选择3到5个符合上述标准的问题 。 把它们写在你可以做笔记的地方 , 并在此基础上进行展开 。
计划
互联网上有一则奇谈就是源自HenryFord的工厂 。 故事的背景是围绕工厂里一台发生故障的大型机器 , 迷惑不解的工程师 , 以及一个来拯救世界的超级天才 。 故事是这样的:福特工厂的一台大型蒸汽机开始出现故障 , 福特的工程师都不知道发生了什么 。 但当这个天才——通常是NikolaTesla或CharlesProteusSteinmetz——介入进来 , 他将问题隔离到一个无足轻重的部分 , 只需要稍加修正即可 。 最后账单只有1万美元 。
当然 , 福特表示怀疑 , 因为这个人所做的只是在受影响的区域画一个差号 , 所以天才做了分解说明:
1美元用来指出位置;9999美元用于让工程人员知道如何将问题隔离到系统的一个部分中 。故事就是这样 , 当你面对一个庞大的代码库 , 想要添加一个小的修复时 , 你可能会发现自己像ikolaTesla一样 。 不要害怕 , 你不需要成为天才 , 你只需要一些基本的原则 , 让你可以把问题限制到代码库的一个小的、可控的部分 。