点击上方“CSDN”,选择“置顶公众号”

关键时刻,第一时间送达!

作者简介:loonggg,一个文艺傲娇而又喜欢编码的程序猿,一个喜欢挑战而又喜欢分享的攻城狮。一个科技数码爱好者,又是一个爱好写作的达人。公众号「非著名程序员」的运营者。

本文为作者个人投稿,版权归作者所有。欢迎更多的朋友微信联系:guorui_1118 投稿,一起为程序员贡献更多精彩内容。

你们知道程序员最熟悉,最熟练,最常用的两个快捷键是哪两个吗?没错,估计你现在心中所想的就是:ctrl+c 和 ctrl+v ,俗名为:复制和粘贴。对于大部分程序员来说:复制和粘贴就是他敲代码,写程序员创造伟大产品的左膀和右臂,而复制和粘贴更是形影不离的好兄弟。

所谓,天下代码一大抄,亦不过在程序员心中就是复制和粘贴。更何况我们是身处在一个热爱开源的世界,而程序员更是创造和开创开源世界的积极分子呢。目前,我们身处在共享经济当中,可是殊不知我们这是一个伪共享的时代。共享单车,共享汽车,乃至共享充电宝都不是真正的共享,所谓共享就是把闲置和剩余资源利用起来,进行分享,以达到资源利用,资源价值的最大化。现在的共享经济,都不是把闲置和剩余资源的重复再利用,而是花钱买好的,每天,每月正在造成更大的资源浪费。

但是,代码的开源,技术的开源可以说是真正的共享,但是还不属于经济,毕竟开源太多都是免费的,所以,我们技术开源才是真正的共享鼻祖。有点扯远了,我尽量拉回来。之所以谈这个话题是因为近日加州大学欧文分校、捷克技术大学、微软研究院和美国东北大学的研究人员组成的一个团队开展了一项调查,结果发现,GitHub 上托管的大多数源代码文件实际上是以前所创建的文件的复制版。

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

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

其实 GitHub 的一个使命就是共享代码,所以在 GitHub 平台上发现代码重复率高并不是一个令人吃惊的事情。但是有一点是非常让你警醒的,那就是:

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

很多研究人员也表示了疑问,明明可以 fork 或者依赖使用的,现在大部分人都是复制粘贴文件、甚至复制粘贴整个库到自己的项目,再共享出来,真的是让人有点吃惊。

开源库的正确用法

由此,我们应该得感觉和意识到一些开源许可证的使用,应该正确使用开源库以及开源代码才可以。不知道有多少开发者意识到了开源库的正确使用方法?我相信现在几乎每个程序员开发的项目中都使用了 GitHub 上的开源库,但是你们尊重开源和版权了吗?一般在应用中应该声明一下使用了哪些开源库,以开源许可证等信息。我发现支付宝在这方面做的就挺好的。比如人家就在应用中有个版权信息模块,专门声明使用了哪些开源库。例如:

看到了吗?支付宝这个应用程序用到的开源库是不是很多,大家也可以研究一下,支付宝用的这些开源库应该都是非常不错,有保证的,以后说不定你也能够用到,这就是学习。我相信大家都没有正确使用和声明开源库这种做法和行为。

总结

其实通过研究其实我们可以发现:首先,GitHub 本身似乎可以大幅压缩代码库,不至于现在这么庞大。其次,如今在使用从 GitHub 唾手可得的一大批开源项目,开展越来越多的研究工作。但是我们在研究和使用的时候,应该正确使用,而不是乱用。

你们知道哪种语言在 GitHub 上代码重复率最高吗?JavaScript 项目含有的重复文件最多,研究团队只查看了用 C++、Java、JavaScript 和 Python 编写的源代码项目。在这四种项目中,JavaScript 项目所含的重复代码最多,94% 的文件是与 GitHub 上托管的另一个文件百分之百相同的克隆版(基于文件哈希)。C++ 排名第二,所有文件中 73% 是其他文件的复制版,而 Python 的代码重用率也有 71%, Java 只有 40%。其实JavaScript 包含最多的重用代码示例,原因很容易解释,那就是 NPM,这是所有客户端和服务器端 JavaScript 项目的事实上的软件包管理器。

所谓天下代码一大抄,但是抄也应该正确的抄,也应该正确的用,在规则和许可下玩才行。不要在没声明的情况下,整体的复制粘贴到你的代码库里,不尊重作者,感觉是你做的似的。

————— 推荐阅读 —————

点击图片即可阅读

如何优雅地抄袭代码?天下代码一大抄,这才是正确的姿势相关推荐

  1. 如何优雅的抄袭代码?天下代码一大抄,这才是正确的姿势

    你们知道程序员最熟悉,最熟练,最常用的两个快捷键是哪两个吗?没错,估计你现在心中所想的就是:ctrl+c 和 ctrl+v ,俗名为:复制和粘贴. 对于大部分程序员来说:复制和粘贴就是他敲代码,写程序 ...

  2. review代码从哪些角度_转载:CodeReview正确的姿势是什么?

    CodeReview正确的姿势是什么?​www.zhihu.com 全文转载于 "微博是阿里孤尽"在上面的回答,已征求本人同意. 以下是原文: 最近 CodeReview(以下简称 ...

  3. 优雅的写出 JavaScript 代码

    目录 前言 避免使用 js 糟粕和鸡肋 编写简洁的 JavaScript 代码 使用 ES6/ES7 新特性 Babel ESLint Prettier 采用函数式编程 优雅的敲 JS 代码的几个原则 ...

  4. AMD规范:简单而优雅的动态载入JavaScript代码

    本文翻译自http://www.sitepen.com/blog/2010/11/04/requirejsamd-module-forms/,并加入部分自己的解释. CommonJS 提出了一种用于同 ...

  5. 代理模式实现优雅地修改同事的代码

    前言 在开发过程中,很多时候我们是需要在同事代码的基础上进行开发的,同时的代码你敢动吗?你开始以为只是一个小问题,你尝试着修复这个BUG,然而修复之后,你发现其他地方不能用了,因为你的修复触发了更多的 ...

  6. 大咖来信 | 微软中国CTO韦青:低代码/无代码时代来了,写代码的你准备好了吗?...

    十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 编者按:编程语言几年一变样,学了C.C++,还得跟上Python的潮流-- 各大排行榜上,语言之争也是愈演愈烈,还架不住时不时杀出个黑马. ...

  7. asp.net 页面代码 if_代码适配对百度友好代码详解

    点击上方"seo技术课堂"关注我们 移动端适配的方式有多种形式,比如通过规则适配.响应式.独立移动PC站等方式都可以实现PC移动端适配的效果. 今天详细讲一下本人比较喜欢的适配方式 ...

  8. core java 9 代码_Java Core 学习笔记——3.char/Unicode/代码点/代码单元

    通用字符集(UCS) UCS是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所制定的标准字符集. UCS包括了其他所有的字符集(包含了已知语言的所以字符). ISO/IEC 1 ...

  9. php代码怎么复制_PHP_PHP网站备份程序代码分享,效果图:PHP代码 复制代码 代码 - phpStudy...

    PHP网站备份程序代码分享 效果图: PHP代码 复制代码 代码如下: 网站程序备份 error_reporting(E_ALL & ~E_NOTICE); ini_set('memory_l ...

最新文章

  1. bind函数作用、应用场景以及模拟实现
  2. 【Python】一行python代码利用人工智能去除工作照背景
  3. 字符串池化,减少了三分之一的内存占用
  4. matlab飞行数据仿真,基于MATLAB的飞行仿真
  5. javascript之Partial Application
  6. linux脚本大全,shell大全
  7. Bootstrap 文档类型
  8. Android 8.0学习(8)---内核文件系统优化
  9. swift中变量的几种类型
  10. 跳频通信(梅文华)pdf
  11. 批量插入数据到sqlserver
  12. 汇编实验 三 编程、编译、连接、跟踪
  13. 【STM32】HAL库 STM32CubeMX系列学习教程
  14. rhcsa第二天作业9道题
  15. 2021年计算机类考研人数,2021年考研79所院校报考人数汇总
  16. 三星android平板,三星也不忘Android平板,或推带虹膜识别的Galaxy Tab S4
  17. 房产行业php_phpwind房产系统打响社区垂直行业应用
  18. java生成二维码(链接生成二维码)
  19. R 利用回归分析与时间序列预测北京市PM2.5
  20. C#关键字扫盲——Sealed 密封

热门文章

  1. Protobuf的C++使用笔记
  2. MySql基本的操作
  3. Flutter游戏:简单规则与结束页
  4. Flutter进阶—实现动画效果(一)
  5. RESTful API 特点
  6. mysql运维基础_mysql基础运维
  7. eclipse启动时JDK环境变量报错
  8. 从 Windows 切换到 Mac,这些不能错过的 Tips
  9. 确认无疑,.NET 6是迄今为止最快的.NET
  10. AspectJ在Android 中的使用攻略