Сегодняшний день посвящён Code Archeology. Она представляет из себя подход к исследованию кода как чёрного ящика. Не глядя в код, она раскапывает инфу о нём по внешним проявлениям. Щупальцами могут быть системы контроля вер-й, багтрекеры, сервисы ревью кода и анализаторы.
Археология хорошо дополняет такие известные практики как автотесты, ревью и статический анализ, которые являются примерами проактивного ухода за кодом. При этом статей и инструментов на тему Code Archeology немного.
Итак, как же именно она матчится с другими полезными активностями.
Автотесты довольно дороги. Археология отвечает на вопрос, где они нужны в первую очередь, и стал ли код стабильнее после их внедрения; показывает хорошо ли автотесты спроектированы или не ломаются ли после каждого изменения тесируемого кода, принося вреда больше, чем пользы.
Метрики кода, включая test coverage, показывают насколько код плох, но ничего не говорят о том, а надо ли что-то с этим делать. Есть мнение, которое я поддерживаю, что не весь код обязан быть одинаково хорошим. Археология помогает понять, для каких частей кода это критично.
Кодревью играет важную роль в раннем предотвращении ошибок технического и архитектурного характера, но вещь дорогая, т.к. завязана на людей. Code Archeology подсвечивает, где эта цена оправданна и, более того, как я покажу завтра, позволяет отыскать наиболее подходящих ревьюеров.
Я покажу применение техник Code Archeology на примере рабочего проекта – клиента Облака #mailru для #iOS. Это позволит мне предметно отвечать на возможные вопросы о пользе той или иной раскопки.
Сегодня мы намайним карту, где будут подсвечены участки кода, более остальных нуждающихся в рефакторинге. Это будут одновременно самые изменяемые и самые частофиксящиеся участки. Посыл в том, что иррационально тратить время на улучшение тех мест, которые редко изменяются.
Чем больше круг, тем чаще вносятся изменения в код. Чем краснее круг, тем чаще изменения связаны с фиксами багов.

В конце треда дам ссылочку на интерактивную версию. Более того, надеюсь, что вы сами сможете её воспроизвести. Если что, готов помочь в личке t.me/posipov
В основе практически всех скриптов лежит команда команда git --numstat. Она позволяет узнать, какие файлы трогались в тех или иных комитах. Непосредственно ей мы пользоваться не будем, но полезно знать, откуда ноги растут.
Сравнение однотипных срезов – ключ для понимания, есть ли улучшения в результате рефакторинга. Например, полезно строить указанную выше карту не за всё время жизни проекта, а за равные интервалы времени: месяцы, кварталы, года.
Для ограничения выборки временным интервалом есть доп. параметры --after и --before. Они используются для снятия аналитических срезов в разные периоды жизни проекта.
Для использования стандартных инструментов обработки данных, вывод git приводится в общеупотребительный формат вроде csv. С этой задачей справляются скрипты Адама Торнхилла из книги "Your Code as a Crime Scene", из которой я и узнал про археологию github.com/adamtornhill/c…
После сборки тулы по инструкции на выходе будет jar-файл. На вход она принимает файл с логом от git в формате --numstat, как в примерах выше. Заалиасим тулзу следующим образом:

alias maat='java -jar /path/to/code-maat/target/code-maat-1.1-SNAPSHOT-standalone.jar'
Вывод самых часто изменяемых файлов в 2018 году с помощью связки git + maat:

git log --pretty=format:'[%h] %an %ad %s' --date=short --after=2017-12-31 --before=2019-01-01 --numstat > all-2018.log

maat -l all-2018.log -c git -a revisions | head -n 20
Инфильтруем все технологические файлы, запайпив вывод maat командой sed, пропускающей заголовок csv и строки с инфой по файлам с расширением m или mm.

maat -l all-2018.log -c git -a revisions | sed -n '1p;/\.[m|mm]/p' | head -n 20
К слову, если вас не волнует вывод результата в формате csv, и хочется прямо сейчас получить аналогичный результат для своей репы без привлечения code-maat, то вот тут я показывал как это сделать –
Показатель частотности измерений интересен, но по нему ничего нельзя сказать о качестве кода. Возможно, в топовых файлах находится идеальный код и его модификация не доставляет хлопот. Нужны дополнительные измерения.
Команда для получения файлов, изменённых в комитах с сообщениями, характерными для фиксов:

git log --pretty=format:'[%h] %an %ad %s' --date=short --after=2017-12-31 --before=2019-01-01 --grep=Bug --grep=bug --grep=bugs --grep=fix --grep=fixes --grep=Fix --grep=Fixes --numstat
Забагованность будет нашим вторым измерением.

Используя указанную выше команду, преобразуем её вывод в формат csv, как мы это уже проделали для часто изменяющихся файлов.
Сделаем join данных об изменённых файлах с данными о файлах, измененных в рамках исправлений с помощью одного из скриптов Адама Торнхилла уже из другой (!) репы.

python merge_comp_freqs.py all-2018.csv all-2018-fixes.csv > all-2018-merged.csv

github.com/adamtornhill/m…
В результате проделанного упражнения мы, не заглядывая в код, смогли получить приоритетные места, которые одновременно и часто изменяются, и часто фиксятся. Это клондайк для рефакторинга, ревью, покрытия тестами и прочих благостных практик. В виде csv они выглядят так.
Время для визуализации hotspots в виде карты.

Сначала подготовим данные, используя скрипт из maat-scripts:
python csv_as_enclosure_json.py --structure all-2018-impl.csv --weights all-2018-fixes.csv > hotspots.json

Положим итоговой JSON в шаблон Адама: s3.amazonaws.com/CodeMaatDistro…
Hotspots Map в Облаке mailru, явившийся результатом git-майнига. Лежит на моей VPS, не пугайтесь, что безымянный голый IP.

http://80.211.94.62:8888/cloud-hotspots.html
Отмечу, что если захотите воспроизвести точь-в-точь такую же карту, то нужно взять мой форк скриптов Адама. В оригинальных размер кругов определяется не количеством изменений, а объемом кода.

Я счел некорректным, давать ссылку на него раньше оригинала.

github.com/pavelosipov/ma…
За сим пока всё. Пробуйте у себя – очень увлекательно.
Добавил новый метатредик.
Missing some Tweet in this thread?
You can try to force a refresh.

Like this thread? Get email updates or save it to PDF!

Subscribe to Мобильный разработчик
Profile picture

Get real-time email alerts when new unrolls are available from this author!

This content may be removed anytime!

Twitter may remove this content at anytime, convert it as a PDF, save and print for later use!

Try unrolling a thread yourself!

how to unroll video

1) Follow Thread Reader App on Twitter so you can easily mention us!

2) Go to a Twitter thread (series of Tweets by the same owner) and mention us with a keyword "unroll" @threadreaderapp unroll

You can practice here first or read more on our help page!

Follow Us on Twitter!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just three indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3.00/month or $30.00/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!