本文为 Grank(Github Rank)的简介及相关思路的介绍。
在深圳刚刚结束的 CosCon 2018 大会上发布了《中国开源调查报告》,Grank 作为其中数据篇的部分数据提供者,构建了一个 Github 项目活跃度、社区化的模型,并以 Python 实现。
项目地址: https://github.com/lctt/grank/
Grank 模型
我们认为,一个健康的开源项目应该体现为以下两个方面:
- 项目的活跃度趋势
- 项目的社区化(去中心化)程度
而这两个方面分别有多个因素组成:
活跃度和活跃度趋势
项目的活跃度,我们定义为项目的提交数、 拉取请求数和贡献者数(其它数据,如代码行数、文件数、issue 数、 fork 数、star 数,要么是权重相对低得多,要么是代表意义不够确定,此处忽略不计入模型)。
但是,对于不同的项目,其横向比较其活跃度,或有不同的活跃度形态,或不具备可比性。很难说一个项目比另外一个项目的提交数高,而拉取请求(PR)数低代表的确切含义。因此我们不认为对不同项目的这些数据进行绝对值的比较有太多的科学意义。
所以,我们认为一个项目本身的活跃度变化的趋势和幅度,会更有项目间比较的意义。
如果以三维空间来描述一个项目的活跃度,以提交数、拉取请求数、贡献者数为三维,可以确定在某个时间点某个项目的坐标,那么计算一段时间内,该坐标点的移动轨迹和速率,可以真实的反映该项目的活跃度趋势。
考虑到按周工作的作息时间的普遍影响,我们以一个工作周作为一个时间采样点,然后计算连续的几周内该坐标的移动速率。这反映了该项目的发展速度。
社区化程度
开源诞生于社区,繁荣于社区,根植于社区,虽然现在大型组织、商业公司也纷纷投身于开源生态,但是我们认为,开源项目的生命力仍然在于社区。我们并不否认机构、商业公司对开源的巨大贡献和影响力,但是如果一个开源项目变成了一家或几家大企业的私人游戏,其必然失去开源项目的生命力,它或许会在商业上取得成功,但是那个成功不是开源项目的成功模式。
因此,我们认为需要有一个评估开源项目的社区化(去中心化)程度的指标。项目(尤其是软件项目)的一个重要属性是开发人员的社区化身份,因此,我们以实际向项目贡献了代码的人员的社区化离散程度来评估项目的社区化程度。
每个参与项目开发的人员均有其身份属性,这个身份可能是企业雇佣身份,也可能是社区志愿者身份。我们通过对项目的提交中的提交者数据进行收集,然后根据开发人员的身份信息、邮件后缀等依优先级来判断其所属身份。然后对这些信息进行聚类,以一个离散评估模型来评估该数据集的离散程度。
虽然项目越中心化,其发展风险越高,但是,并不是社区化程度越高的项目就越健康,过于离散的项目也容易出现项目分裂、迭代缓慢等问题。这显然是存在一个适当的区域。
Grank 的结果长什么样子?
多项目活跃度:
多项目社区化:
单项目社区化及活跃度:
使用方法
- 使用 pip 安装项目
pip install grank
- 获取 Github 的 Personal Access Token
- 使用
grank login
设置 Token - 使用
grank config
设置社区化企业关键词 - 使用
grank analy <owner> [<repository>]
来分析特定用户 /组织和项目,比如grank analy lctt grank
,分析结果可以在执行命令目录的 result 目录中找到。 - 使用命令行模式操作,如
grank --token=XXXX --start=2018-01-01 --stop=2018-05-21 --askrule=0 --rule=inc analy <owner> <repository>
其中 token 必须指定,其他可以使用缺省设置
Grank 是如何实现的?
Grank 使用 Github 的 GraphQL 来完成数据抓取的工作,抓取项目的所有提交和拉取请求来进行分析,并使用 Pandas、numpy、pandas 进行数据的分析,最终得出结果。
此外,Grank 目前为命令行工具,采用了 Click 来编写命令行的支持。
Grank 能够为你带来什么?
- 评估自己的项目情况
- 学习 Python 项目编写
- 了解 Click 的使用
- 了解 pytest 的使用。
项目地址:https://github.com/LCTT/Grank
Pypi 地址:https://pypi.org/project/Grank/
江湖再见