Из Википедии: фактор автобуса (англ. bus factor, либо truck factor) проекта — это мера сосредоточения информации среди отдельных членов проекта; фактор показывает количество участников проекта, после потери которых (в оригинале — «попадания» которых под автобус или грузовик, варианты: увольнения, заболевания, рождения у них ребёнка, наступления несчастного случая и других форс-мажорных обстоятельств) проект не сможет быть завершён оставшимися участниками.
Мотивация
Во всех компаниях, где я работал (в строительстве и разработке ПО), в тот или иной момент времени возникал вопрос «фактора автобуса» в управлении разработкой проектов.
Инженеру-строителю вычислить его было крайне сложно, потому что наша отчётная документация была сильно распределена между сотрудниками и существовал дефицит документации. Единственный раз, когда это стало очевидно, случился после увольнения одного из сотрудников — спустя полгода возник срочный запрос RFI (запрос информации) по чьему-то пакету расчётов (хотя официальный пакет должен быть подписан инженером-проектировщиком, а не инженером, непосредственно отвечающим за расчёты). После таких инцидентов нам обещали улучшить документацию, но это неизбежно отходило на второй план, когда все участники группы переходили на новые проекты даже без итогового совещания. Я был свидетелем того, как в долговременных проектах инженерный состав менялся на 100%, поэтому это ужасный антипаттерн.
В разработке ПО можно провести множество параллелей, но по природе нашей работы поставка выпущенного кода — это единственный способ измерения фактора автобуса. По крайней мере, именно её изучали многие исследователи, в том числе и в научной статье, имеющей большое количество цитирований (156, согласно Google Scholar!) с момента её публикации в 2016 году (препринт выпустили в 2015 году). Ша отправил мне статью, а после того, как мы обнаружили её исходные данные и исходный код, это стало идеальным проектом на выходные, который бы позволил, как минимум, получить представление об интересных метриках open source.
В статье используется концепция степени авторства (degree of authorship, DOA), вычисляемая по следующей формуле:
Вычисление фактора автобуса «основано на предположении о покрытии: система столкнётся с серьёзными задержками или имеет вероятность прекращения работы, если текущее множество авторов покрывает менее 50% текущего множества файлов в системе». То есть алгоритм урезает участие в проекте на основании DOA, пока не останется меньше 50% от изначальных файлов.
Методики
Первым делом надо было проверить, можно ли вообще собрать код. Сам алгоритм не менялся с 2018 года, но я редко собираю код на Java. К счастью, инструкции из README сработали почти полностью. В тех же инструкциях, что и для локальной сборки, есть команды docker
, но я решил просто создать локальную сборку.
Некоторые из команд были привередливы к директориям вызова. В частности, commit_log_script.sh
должен выполняться внутри директории scripts
, потому что в противном случае мы получим такую ошибку:
awk: can't open file /Users/mclare/workspaces/Truck-Factor/gittruckfactor/log.awk source line number 1 source file /Users/mclare/workspaces/Truck-Factor/gittruckfactor/log.awk
Затем нужно выполнить саму программу:
mvn package cd Truck-Factor/gittruckfactor java -jar ./target/gittruckfactor-1.0.jar ~/workspaces/numpy ~/workspaces/numpy
Вывод в случае удачного выполнения будет выглядеть примерно так:
TF = 9 (coverage = 48.74%) TF authors (Developer;Files;Percentage): Charles Harris;206;15.28 Bas van Beek;204;15.13 Sebastian Berg;142;10.53 Sayed Adel;138;10.24 Travis Oliphant;116;8.61 Rohit Goswami;87;6.45 Mateusz Sokoł;82;6.08 David Cournapeau;75;5.56 Matti Picus;70;5.19
Попробовав её на одном пакете, я захотел проверить все репозитории из исходной статьи, в том числе и parallel
, а также другие инструменты командной строки.
Оказалось, что все репозитории из статьи используют веб-сайт, который загружает интерактивные графики D3 на основании скачанных CSV. Мне достаточно было извлечь первый столбец загруженного CSV, который я сохранял в файл (repo_list.txt
) для дальнейшего использования.
Клонирование репозиториев
parallel -j 8 git clone ::: $(cat ../meta/repo_list.txt)
Эти репозитории весят примерно 64 ГБ!
Для клонирования репозиториев потребовалось большое количество ресурсов. Несмотря на то, что я настроил 8 jobs, процесс клонирования/сборки сразу же «съел» почти все ресурсы моего CPU.
Выполнение анализа
ls ../cloned_repos | xargs -I {} echo "java -jar ./target/gittruckfactor-1.0.jar /Users/mclare/Truck-Factor/cloned_repos/{} {} > results_linguist/{}.txt" | parallel -j 8
Рекомендую поначалу выполнять шелл-скрипты с echo
, чтобы ещё раз убедиться, что результат получается именно таким, как вы ожидали.
Благодаря параллелизации на выполнение этой команды понадобилось всего около четырёх минут (репозиторий platform_framework_base
отставал примерно на две минуты).
Вопросы исходного исследования
Чтобы успеть завершить этот проект за двое суток, мы выбрали следующие первоначальные вопросы:
-
Как выполнение анализа с помощью
linguist
меняет результаты? -
Что мы ожидаем увидеть от этих результатов для соответствующих пакетов спустя восемь лет?
Результаты
Проведя анализ с помощью linguist
, я заметил существенные изменения в покрытии кода и в самом факторе автобуса. В целом я ожидал, что linguist
снизит фактор автобуса, поскольку он должен удалить некритичные файлы, например документацию. Однако в нескольких случаях прогон анализа linguist
не возвращал вообще никакого фактора автобуса. В других случаях фактор автобуса даже увеличился. Это меня удивило и заслуживает дополнительного анализа действий linguist
, а также удаляемых им из репозиториев файлов.
Я ожидал, что во многих проверенных репозиториях фактор автобуса должен уменьшиться. Прошлое десятилетие показало, насколько сложно быть мейнтейнером опенсорсных проектов, учитывая текущую экономическую ситуацию. Самое неожиданное изменение фактора автобуса произошло в репозитории исходников Linux. В научной статье этот фактор был равен 57, в моём первоначальном анализе он уменьшился до 12, а в анализе linguist
— вообще до 8. Примерно в 30% проектов вообще не случилось никаких изменений (в основном в тех, где фактор автобуса равен 1), В 15% он увеличился на 1 (хотя в них изначально фактор был равен всего 1-3), а в 20% уменьшился на 1 или большее значение.
В оригинале статьи вы можете изучить результаты самостоятельно, выбрав в раскрывающихся меню два разных датасета.
На графике ниже показана диаграмма трёх отдельных датасетов, которая также демонстрирует, что существенных улучшений по снижению количества проектов с низким фактором автобуса не произошло.
Дальнейшая работа
На самом деле, это лишь начало исследований того, как подобные инструменты можно использовать для оценки уровня здоровья опенсорсных проектов.
Мне бросился в глаза важный недостающий аспект: анализ проводится только для авторства как метрики, но не для ревью. Можно надеяться, что в случае существенных изменений процесс ревью кода приводит к обмену знаниями, но я не знаю, была ли эта информация получена из логов git, и можно ли это вообще сделать простым способом.
Другие исследовательские вопросы на будущее:
-
Можно ли воспроизвести результаты научной статьи? (Это непросто, даты получения информации из github не указаны ни в данных, ни в самой научной статье)
-
Что можно получить из настройки псевдонимов разработчиков в соответствии с опциональными настройками репозиториев? Увеличит ли это потенциально фактор автобуса благодаря объединению действий одного человека?
-
Можем ли мы воспроизвести другие графики из исходных данных с использованием других данных из Github API, например графики количества разработчиков?
-
Может ли мы глубже понять метрику degree of authorship (DOA)? Похоже, существуют магические числа, которые могут указывать на некую линейную регрессию. Кажется, они взяты из других статей.
-
Можно ли использовать более свежие статьи, ссылающиеся на эту, чтобы лучше оценить характеристики опенсорсных проектов?
Прочие примечания
-
Другой взгляд на этот эксперимент можно найти в блоге Ша
-
Для генерации графиков я использовал Observable Plot. Забавно, что D3 оказался одним из тех репозиториев, фактор автобуса которых не изменился и остался равным 1!
-
Мы форкнули исходный репозиторий и изложили наши находки в spite-driven-development/Truck-Factor
ссылка на оригинал статьи https://habr.com/ru/articles/858374/
Добавить комментарий