该篇博客紧跟上一篇关于活跃度的介绍继续展开,根据上文提出的活跃度设计了一种新的上层算法,并希望可以通过该算法来解决活跃度度量存在的一些问题。
这篇文章系统介绍了一种基于全域开发者协作网络的项目影响力评估方法,该方法对于分析整个开源生态有极大的帮助。在一次性评估出所有项目的协作影响力的同时,也可以对项目的协作关联度进行深入探索,并对项目的所属类别进行自动判断。
上图中的 OpenGalaxy 2019 就是基于协作影响力指标构建的。
上一篇中提到了直接基于活跃度这种统计型指标对项目进行分析所带来的一些思考和问题。总体而言,对于特定的项目这种分析方法可以有效的追踪整体项目的运转情况,并且通过一些参数的调整可以影响每个开发者的价值取向,起到一定的引导作用,例如维护者对代码 review 投入更多精力,或吸引更多的开发者参与到社区中。
但事实上,这种统计算法没有考虑到开源是一个完整的生态,GitHub 上的开发者一般不会只在一个项目上活跃。而这种在每个项目上各自独立进行统计的方式不仅没有利用到项目之间的关系,同时也会导致在项目间比较时出现一定的问题。
下面两类项目可以说明活跃度在全域分析时的一些问题:
考虑到上述问题,我们希望可以充分利用开源项目的行为数据来评判项目的协作影响力,故提出了开源协作网络,旨在通过开发者在不同项目间的协作情况来对全域开源生态中的所有项目进行影响力的计算。
开源协作网络的构建思想非常朴素,基本逻辑是:如果有开发者同时在两个项目上都非常活跃,那么这两个项目就存在着较高的协作关联度。在这里我们暂不考虑这种关联产生的动机,只是一种对开发者行为的观察。事实上根据后续的采样,发现基本符合最初的想法。即大部分情况下,是由于项目存在着上下游的关系,或存在某种使用上的依赖或合作关系,才会有开发者同时在两个项目上高度活跃。
最典型的例子就是 VSCode 与 flutter 的高度关联性,最初我们以为是两个项目使用了相同的协作机器人导致了高关联性。通过深入分析发现,是开发者 Danny Tuppeny 把他们关联了起来。这是一名来自英国的开发者,是 Dart 语言的 VSCode 插件 Dart-Code 的作者和 flutter 的贡献者。由于 Dart 语言目前主要用于 flutter 的开发,他的高度活跃度将 VSCode 和 flutter 这两个世界顶级项目给关联在了一起。
也正是协作网络这种数学工具,为我们发现开源生态中这些有趣的关系提供了一种有效的手段。
而协作网络中协作关联度的计算也非常直观,其中每个开发者在项目上的活跃度符合上一篇中对活跃度计算的介绍。假设开发者 $d$ 在项目 $p1$ 上活跃度为 $A_{d,p1}$,在项目 $p2$ 上的活跃度为 $A_{d,p2}$,则该开发者对这两个项目协作关联度的贡献为 $\frac{A_{d,p1}A_{d,p2}}{A_{d,p1}+A_{d,p2}}$。这里使用了调和平均的计算方法,其含义就是只有开发者在两个项目上都非常活跃时,才会对这两个项目的关联度产生较大影响,仅在一个项目上活跃不会导致两个项目的关联度大幅增加。
基于上述构建的开源全域生态中所有项目的协作网络,我们可以利用一些图分析的算法来计算每个项目的协作影响力。这里我们使用了 PageRank 算法,关于这个算法的计算过程,可以在链接中看到,这里就不再赘述。
PageRank 是一个经典算法,该算法被发明并应用于 Google 搜索引擎的网页排名中,收到了非常好的效果。而且这个算法的计算效率很高,它对网页质量的判断并不基于网页本身的内容,而是基于网页之间的引用关系。
即其基本主张是:一个高质量的页面,会被更多的页面所引用;而高质量的页面,其引用的其他页面的质量也是较高的。仅凭借着这样一个基本的价值假设和互联网上不计其数的网页之间的引用关系,Google 就可以很好的给出网页质量的判断和排名。(关于算法开放可能带来的作弊行为我们在这里暂不讨论)
而在开源协作网络的协作影响力中,我们使用了非常类似的思路:即一个影响力较大的项目,会和更多的项目有协作关系;对于影响力较大的项目,与其协作关联度较高的项目影响力也会较大。
凭借着这样一个认识,给出 GitHub 在 2019 年全域协作影响力前 10 的项目如下:
排名 | 项目 | 协作影响力 |
---|---|---|
1 | microsoft/vscode | 1135 |
2 | flutter/flutter | 645 |
3 | kubernetes/kubernetes | 624 |
4 | DefinitelyTyped/DefinitelyTyped | 564 |
5 | microsoft/TypeScript | 544 |
6 | tensorflow/tensorflow | 535 |
7 | gatsbyjs/gatsby | 504 |
8 | golang/go | 448 |
9 | rust-lang/rust | 448 |
10 | facebook/react-native | 426 |
可以看到 VSCode 作为被开发者广泛使用并大受欢迎的 IDE 项目,以极高的协作影响力占据了开源世界的中心位置。通过各种语言的插件项目,VSCode 与这些语言和它们开发的顶级项目之间都建立起了较大的关联性,展示了其在开发者生态中的重要性。
关于整个算法更详细的说明和实验结果,可以参考这篇博客。
总体而言,基于开源协作网络的项目协作影响力解决了基于统计的活跃度指标中存在的诸多问题,对整个开源生态中项目影响力的评估和洞察提供了一种非常有效的手段。但同时也存在一些其他的固有问题,这些问题使得整个模型和指标在可扩展性上存在较大的局限性。
我们希望可以找到一种具有高可扩展能力的图模型,可以引入更多元的开源数据,对开源项目、开发者等可以有更加深刻、准确的洞察和分析,并且也能规避指标刷分带来的一些问题。关于开源生态的价值流网络模型,请继续关注该系列文章。
|