The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

20.11.2017 21:47  Анализ степени дублирования кода на GitHub

Представлены результаты изучения дублирования кода в общем объёме исходных текстов, размещённых на GitHub. Проанализировано 4.5 млн различных проектов (без форков репозиториев), включающих более 428 млн файлов с кодом на языках Java, C++, Python и JavaScript. Из этих файлов лишь 85 млн оказались уникальными, т.е. 80% кода на GitHub являются копиями других файлов.

Определение дубликатов выполнялось несколькими методами: путём сравнения хэшей файлов (полные копии), хэшей сгруппированного набора токенов из файла (не учитывает форматирование и комментарии) и оценки частичного заимствования кода при помощи SourcererCC (определён отредактированный код с 80% общих токенов).

Наиболее часто дубликаты встречаются в коде на языке JavaScript, для которого лишь 6% файлов не совпадают (т.е. 94% файлов являются полными клонами 6% файлов), 5% не совпадают по хэшу набора токенов и 3% отличаются с учётом редактирования кода. Наименьшее число дубликатов выявлено для кода на языке Java, для которого не повторяется 60% файлов, 56% наборов токенов и 30% отличаются с учётом редактирования кода. Для C++ эти показатели составляют 27%, 23% и 13%, а для Python - 29%, 27% и 19%.

Наиболее часто повторяющимся стал пустой файл, размером 0 байт, который встречается 2.2 млн раз. Но игнорирование при проверке мелких файлов, в которых встречаются менее 50 токенов, почти не сказывается на уровне совпадений:

Распределение языков по уровню дублирования кода также сохраняется, если провести сравнение не на уровне файлов, а на уровне проектов. Например, около 15% проектов на JavaScript являются полными клонами других проектов, 31% проектов копируют более 80% кода из других проектов, а 48% копируют более 50% кода. Для Java эти показатели составляют 6%, 9% и 14%.



Попытки разобраться почему степень дублирования кода столь велика показали, что наиболее частой причиной появление дубликатов, является включение в репозитории проектов кода из сторонних библиотек и фреймворков, вместо подключения их как внешних зависимостей. Например, для JavaScript очень велика доля копий библиотек, распространяемых через NPM. Несмотря на то, что только 6% проектов включают каталог node_modules, 70% из всех дубликатов на JavaScript связаны с копированием модулей NPM.

В среднем в JavaScript-проект включается 63 зависимости, а уровень вложенности зависимостей составляет 5 (максимальное зафиксированное число зависимостей - 1261, максимальный уровень вложенности - 47). Кроме NPM-модулей достаточно часто в проект включается библиотека jQuery. В Java чаще остальных дублируются компоненты ActionBarSherlock и Cordova, в C/C++ - boost и freetype, в Python копирование распределено более равномерно по разнообразным библиотекам.

Совпадения на уровне изменённого кода (частичное совпадение при проверке SourcererCC)чаще всего оказались вызванными использованием "копипастинга", а также ненамеренным копированием кода или автогенерацией кода в процессе применения типовых фреймворков. Например, для Java чаще всего совпадения выявлялись в коде, сгенерированном при помощи Apache Axis, Android SDK и JAXB, для Python при помощи Django, а для JavaScript - Angular.

  1. Главная ссылка к новости (https://blog.acolyer.org/2017/...)
  2. OpenNews: GitHub опубликовал статистику за 2017 год
  3. OpenNews: Применение тайпсквоттинга для распространения вредоносных модулей NPM, PyPI и Gems
  4. OpenNews: Инцидент с захватом прав на NPM-модуль привёл к сбою в работе проектов, использующих NPM
  5. OpenNews: Незащищённость NPM к атакам по внедрению вредоносных модулей-червей
  6. OpenNews: NPM стал крупнейшим репозиторием пакетов
Лицензия: CC-BY
Тип: Тема для размышления
Ключевые слова: github, code
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение Линейный вид | Ajax | Показать все | RSS
 
  • 1.1, Аноним, 21:53, 20/11/2017 [ответить] [смотреть все]
  • +6 +/
    leftpad надублировали, небось.
     
     
  • 2.27, Green, 08:14, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]
  • +3 +/
    Ага, послушали комментаторов на опеннете, которые осуждали подключение лефтпада ... весь текст скрыт [показать] [показать ветку]
     
  • 2.29, Аноним, 08:39, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    Вот это и надублировали Каждая хомпага тащит свою копию зависимостей ... весь текст скрыт [показать] [показать ветку]
     
  • 1.3, Аноним, 22:18, 20/11/2017 [ответить] [смотреть все]  
  • +17 +/
    Да, npm это страшная вещь.

    Как-то на досуге загрузил модуль ноды через npm, модуль 20-25 Кб.

    Вы не поверите, npm зависимостей всосал где-то на 100 метров. Честное слово, я не вру, сам о*уел когда увидел.

     
     
  • 2.4, Moomintroll, 22:24, 20/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    Что тут удивительного, когда В среднем уровень вложенности зависимостей сос... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.6, Donald Trump aside of Yuri Bezmenov, 22:38, 20/11/2017 [^] [ответить] [смотреть все]  
  • +/
    derivative ... весь текст скрыт [показать]
     
  • 2.8, Sw00p aka Jerom, 22:48, 20/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • –1 +/
    Эт я думаю вы с каким нить флагом nodev устанавливали Пс зовите Гугл на помощь... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.9, пох, 22:58, 20/11/2017 [^] [ответить] [смотреть все]  
  • +3 +/
    тут не надо разгребать, тут другой случай, нокию вызывайте - чтоб закoпали поглу... весь текст скрыт [показать]
     
     
  • 4.12, Sw00p aka Jerom, 01:38, 21/11/2017 [^] [ответить] [смотреть все]  
  • +1 +/
    а прикол весь в том, что ну придумают лопату, а куча то растёт, придумают экскав... весь текст скрыт [показать]
     
  • 3.10, Аноним, 23:10, 20/11/2017 [^] [ответить] [смотреть все]  
  • +1 +/
    Без лопаты тут однозначно не обойтись, но я бы её для другого употребил ... весь текст скрыт [показать]
     
     
  • 4.13, Sw00p aka Jerom, 01:39, 21/11/2017 [^] [ответить] [смотреть все]  
  • +/
    >> но я бы её для другого употребил.

    аа понял выруБалочку )))


     
  • 3.20, 123, 06:37, 21/11/2017 [^] [ответить] [смотреть все]  
  • –2 +/
    Так уже создали, Yarn.
     
  • 2.11, Анимус, 01:03, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    А зачем зависимости (node_modules) в гит пихать?
     
     
  • 3.15, агент малдер, 01:56, 21/11/2017 [^] [ответить] [смотреть все]  
  • +5 +/
    В пакетах ноды творится адъ и израиль Лично я сталкивался с такой ситуацией ес... весь текст скрыт [показать]
     
     
  • 4.16, Sw00p aka Jerom, 02:01, 21/11/2017 [^] [ответить] [смотреть все]  
  • +1 +/
    версия то по идее должна смениться, а в пекедж ждейсоне указывать конкретную ст... весь текст скрыт [показать]
     
     
  • 5.17, агент малдер, 02:13, 21/11/2017 [^] [ответить] [смотреть все]  
  • +/
    Тут может быть другая проблема Например, версия нужного тебе пакета _не_ поменя... весь текст скрыт [показать]
     
     
  • 6.18, Sw00p aka Jerom, 03:01, 21/11/2017 [^] [ответить] [смотреть все]  
  • –3 +/
    проблема таже просто следующий уровень зависимости, я понимаю даже если вы укажи... весь текст скрыт [показать]
     
  • 6.45, Аноним, 16:42, 21/11/2017 [^] [ответить] [смотреть все]  
  • –1 +/
    Решается элементарно Собрать проект, убедиться, что всё работает, и специальной... весь текст скрыт [показать]
     
  • 6.56, Аноним, 10:37, 28/11/2017 [^] [ответить] [смотреть все]     [к модератору]  
  • +/
    Сейчас никто не умеет версии назначать Херачат тупо в мастере То ли индусы, то... весь текст скрыт [показать]
     
  • 4.30, Аноним, 08:41, 21/11/2017 [^] [ответить] [смотреть все]  
  • +1 +/
    Вы хотели ЯП с встроенными пакетными менеджерами и хипстерами А теперь получите... весь текст скрыт [показать]
     
     
  • 5.34, пох, 09:32, 21/11/2017 [^] [ответить] [смотреть все]  
  • +1 +/
    хипстеры умеют репы - npm живее всех живых Хипстеры не умеют backward compatibi... весь текст скрыт [показать]
     
  • 2.36, Аноним, 10:05, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • –5 +/
    порекомендую заклинание The -g or --global argument will cause npm to install ... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.48, lolwat, 02:04, 22/11/2017 [^] [ответить] [смотреть все]  
  • +2 +/
    долбаёб
     
     
  • 4.52, Ilya Indigo, 01:16, 24/11/2017 [^] [ответить] [смотреть все]  
  • +/
    сказочный
     
  • 1.5, Вареник, 22:36, 20/11/2017 [ответить] [смотреть все]  
  • –1 +/
    Т.е. рано стартовавший жавовский maven действитель сделал великое дело - зависимости в яве копипастят реже других.
     
  • 1.7, kamiram, 22:40, 20/11/2017 [ответить] [смотреть все]  
  • +1 +/
    интересно а всякие __init__.py и подобное тоже учитывали?
     
     
  • 2.19, Stop, 03:29, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • +4 +/
    Чукча не читатель, чукча писатель.
     
     
  • 3.47, m_and_ms, 22:45, 21/11/2017 [^] [ответить] [смотреть все]  
  • +/
    __init__.py часто не пустой
     
  • 1.21, Аноним, 06:44, 21/11/2017 [ответить] [смотреть все]  
  • –1 +/
    php на гитхабе не в моде?
     
  • 1.22, бедный буратино, 06:54, 21/11/2017 [ответить] [смотреть все]  
  • +/
    лучше дайте анализ дублирования кода с github на других серверах
     
     
  • 2.38, Аноним, 10:51, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • –1 +/
    У меня дублирование стопроцентное Гитхаб не даёт жадинам вроде меня создавать с... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.40, бедный буратино, 12:52, 21/11/2017 [^] [ответить] [смотреть все]  
  • –1 +/
    Фишка в том, что распределённая система превращается в систему с одним-единствен... весь текст скрыт [показать]
     
     
  • 4.42, Аноним, 13:18, 21/11/2017 [^] [ответить] [смотреть все]  
  • +/
    Ну, строго говоря, код останется практически весь За исключением одноразовых п... весь текст скрыт [показать]
     
  • 4.46, пох, 20:43, 21/11/2017 [^] [ответить] [смотреть все]  
  • –1 +/
    как и весь этот ваш интернет-2 0 или уже 3 0 весь будет, на локальной машине т... весь текст скрыт [показать]
     
  • 1.28, Аноним, 08:21, 21/11/2017 [ответить] [смотреть все]  
  • +4 +/
    Выводы из статьи 1 Python - лучший язык для изобретения велосипедов 2 JavaSc... весь текст скрыт [показать]
     
     
  • 2.35, пох, 09:36, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • –1 +/
    неправильные выводы В пихоне те же самые велосипеды чаще подключают как зависим... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.41, бедный буратино, 12:54, 21/11/2017 [^] [ответить] [смотреть все]  
  • +3 +/
    10 баллов даже 11 Выражение изобретать велосипед означает, что кто-то изобре... весь текст скрыт [показать]
     
     
  • 4.44, Аноним, 15:25, 21/11/2017 [^] [ответить] [смотреть все]  
  • +/
    > даже не пытаясь вдуматься в их смысл

    У вас тут ещё и думать надо?

     
     
  • 5.49, lolwat, 02:12, 22/11/2017 [^] [ответить] [смотреть все]  
  • +4 +/
    думать сложно - пойду писать проекты на JavaScript
     
  • 1.31, Аноним, 08:47, 21/11/2017 [ответить] [смотреть все]  
  • –6 +/
    Что то странное исследование Обычное явление сделать форк какого-нибудь проекта... весь текст скрыт [показать]
     
     
  • 2.32, Аноним, 09:18, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • +11 +/
    Вижу программиста на JavaScript в тебе я.

    Написано же:

    > (без форков репозиториев)

     
  • 1.33, Аноним, 09:24, 21/11/2017 [ответить] [смотреть все]  
  • +7 +/
    > 94% файлов являются полными клонами 6% файлов

    Лол, вся суть первого места яваскрипта на гитхабе.

     
     
  • 2.37, letsmac, 10:24, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • +1 +/
    Ну дык они зря что-ли кучу WebPack- ов наплодили, вся цель которых - ужимать коп... весь текст скрыт [показать] [показать ветку]
     
  • 2.43, Аноним, 15:01, 21/11/2017 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    И добавить даже нечего.
     
  • 1.54, pripolz, 12:25, 27/11/2017 [ответить] [смотреть все]  
  • +/
    configure.ac и autogen.sh )))
     
  • 1.55, pripolz, 12:38, 27/11/2017 [ответить] [смотреть все]  
  • +/
    а где m4?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:


      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor