111

GitHub 上 82% 的代码是重复代码 !

 6 years ago
source link: https://zhuanlan.zhihu.com/p/31385127?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

GitHub 上 82% 的代码是重复代码 !

云头条负责人

加州大学欧文分校、捷克技术大学、微软研究院和美国东北大学的研究人员组成的一个团队最近开展了一项调查,结果发现,GitHub上托管的大多数源代码文件实际上是以前所创建的文件的复制版。

八名研究人员组成的这个国际团队起初倒不是想研究GitHub的重复现象。最初的目标是试图定义代码复制的“精细度”(即不同的复制版之间多少文件发生了变化),但后来他们发现了“高得惊人的文件重复率”,于是他们改变了研究方向。

研究人员查看了450万个原创(非分支)的GitHub项目,这些项目共有4.28亿个不同的文件。他们发现,只有8500万个文件是独特的,在所有分析的文件中约占17.63%。

JavaScript项目含有的重复文件最多

该研究团队只查看了用C++、Java、JavaScript和Python编写的源代码项目。在这四种项目中,JavaScript项目所含的重复代码最多,94%的文件是与GitHub上托管的另一个文件百分之百相同的克隆版(基于文件哈希)。

研究人员使用了诸多哈希方法来评估代码重复。相同的代码很容易识别,因为它们生成相同的哈希,但是考虑到小幅变化(空格键或Tab键)或甚至更大变化的软件也必不可少。

C++排名第二,所有文件中73%是其他文件的复制版,而Python的代码重用率也有71%, Java只有40%。

研究人员还根据文件内容的部分匹配(基于令牌哈希)查看了重复文件,但结果几乎一模一样。

GitHub代码重用结果

JavaScript文件重复主要归咎于NPM

JavaScript包含最多的重用代码示例,原因很容易解释,那就是NPM,这是所有客户端和服务器端JavaScript项目的事实上的软件包管理器。

虽然其他编程语言中也有软件包管理器,不过NPM是如今世界上最大的软件包管理器,它有350000多个库,这比人气指数排第二位的软件包注册中心Apache-Maven代码库的翻番都不止。

由于NPM含有更多很有帮助的库,开发人员也更常使用它。由于开发人员更常使用它,因而他们在JavaScript项目中导入的库比其他编程语言都要多,因此出现了大量的重用代码。

至于最常“重新盗用”的代码,情况如下所示:

C++:GNU
ISO C++ Library、一种特定的学生课外作业模板和Arduino示例

Java:Minecraft-API和PhoneGap

JavaScript:PhoneGap的Hello
World模板、OctoPress和BlueMix模板

Python:Cactus、Shadowsocks和Scons

代码重用研究对其他研究至关重要

研究人员表示:“用来构建GitHub的源代码控制系统Git鼓励项目分支(forking)。然而,GitHub中出现了大量的代码重复现象,这些代码并没有经历过fork机制,而是通过复制粘贴文件、甚至复制粘贴整个库进入的。”

“这项研究得出了一些重要的结果。首先,GitHub本身似乎可以大幅压缩代码库,不至于现在这么庞大。其次,如今在使用从GitHub唾手可得的一大批开源项目,开展越来越多的研究工作。”

“代码重复可能使那些研究的结果严重偏斜。那些数据集当中的项目多样性可能会受到影响,DéjàVu(http://mondego.ics.uci.edu/projects/dejavu/)可以帮助研究人员和开发人员清晰地认识GitHub中的代码复制现象,并在必要时避免这个现象。

调查称,比如说,如果开发人员研究多少C和C++程序使用了断言语句,重复现象使输出明显偏斜;与之相仿,软件质量研究需要把重复现象考虑进来。

X=文件,Y=提交代码,颜色=重复代码。

来源:《DéjàVu:GitHub上代码重复示意图》

该团队的研究论文题目为《DéjàVu:GitHub上代码重复示意图》,可以从这里(http://janvitek.org/pubs/oopsla17b.pdf)下载。该调查采用MySQL
Dumps这一格式的原始数据还可以从这里(http://mondego.ics.uci.edu/projects/dejavu/)下载。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK