Давно планировали отправить патч в Go, но постоянно откладывали?
Сталкивались с трудностями, не знали, с чего начать?
В данной статье я опишу как мы проводили Go contribution workshop в Казани,
о его результатах, а также об уроках, которые извлекли организаторы.
Спойлер: планируется повторить это мероприятие когда Go перейдёт в фазу активной разработки (выйдет из состояния code freeze). Подробности смотри под катом.
Что такое Go contribution workshop?
По всему миру время от времени проходят разного масштаба сходки Go программистов, целью которых является изучение внутренностей Go и отправка в него своих изменений. Началось всё с GopherCon.
Кто-то приходит для того, чтобы помочь другим разобраться с рабочим процессом, подобрать задачу и решить её, затем пройти ревью и, в идеале, дойти до вливания патча в upstream. Другие приходят в качестве "First Time Contributor".
Если вам интересно что-то из перечисленного ниже, вам могло бы быть интересно поучаствовать:
- Погрузиться в низкоуровневые детали Go тулчейна (компилятора, линкера, ассемблера, ...)
- Ускорить какую-нибудь функцию из стандартной библиотеки или рантайма
- Добавить недостающих примеров или тестов для любого из пакетов
- Провести рефакторинг какого-нибудь очень страшного кода
- Доработать поддержку более редкой архитектуры или ОС (с вас железо и/или ОС)
- Пообщаться с теми, кто уже продолжительное время контрибьютит в Go
Список не полон, каждый может найти в этом что-то своё.
Workshop в России
В какой-то момент я решил, что хочу приложить руку к организации подобного события. Больше всего хотелось оказаться в кругу людей со схожими интересами.
Предварительная программа проведения получилась примерно на 6-10 часов (диапазон лучшего и худшего случая). Наиболее подходящим форматом выглядел хакатон, но найти спонсоров на тот момент не удалось. Зато была возможность вести факультативные занятия для Научно-практической платформы ИВМиИТ КФУ, раз в неделю по полтора часа. Очевидный недостаток: из-за больших перерывов между участием, приходилось бы затрачивать некоторое дополнительное время. И никакой пиццы. Sigh
Довольно неожиданно, я оказался гостем в подкасте GolangShow (ep. 119), где проговорился про идею провести нечто подобное для студентов. Немногим позже Елена Граховац создала канал #kfu-go-2018
в слаке русскоязычного сообщества Go. Там могли общаться не только студенты КФУ, но и все те, кому было интересно поучаствовать удалённо.
После этого в университете были утверждены детали проведения, стали известны конкретные даты. Вместо хакатона получили "курс по языку программирования Go". Это не сильно меняло содержание, цель оставалась всё та же и она была явно описана в анонсе.
Далее последовало сканирование трекера в поиске таких задач, которые могли бы быть выполнены в рамках мероприятия хотя бы частично (ещё лучше — полностью).
На деле получилось так, что в список задач попадали те, что были интересы или понятны лично мне. Это осознавалось и во время составления списка, но влиять на это сложно.
Возможно было бы лучше, если бы этот список составляли несколько людей с различающимся профилем и интересами.
Любой участник мог пойти на трекер Go и выбрать себе что угодно, но для задач из списка были готовы разъяснения, а для некоторых из них частичное решение.
Большая часть контента, которая была выработана во время курса доступна в репозитории kfu-go-2018. Там же можно найти tasks.org.
Первая встреча
Пришли студенты, которые ранее не писали на Go. Большинство из них даже не слышали о таком языке программирования.
Половину первого занятия мы потратили на сборку Go из исходников. На разных компьютерах возникали разные, в том числе неожиданные проблемы. Разные ОС, версии системных компиляторов (у кого-то не собирался Go 1.4), и прочее. Банально не работал ./make.bash
(make.bat
для Windows) с разными ошибками.
Когда у большинства всё-таки появился рабочий Go, первым нашим Hello World было выведение в компиляторе (go tool compile
) канонического сообщения при передаче ему нового флага.
Прошло 90 минут: поговорили о Go, сравнили его с C++, собрали тулчейн, разобрали процесс бутстрапинга и собрали обновлённый компилятор.
Отдельно стоит упомянуть, что мне помогал Делюс Фархулин. Эмпирически выявили, что более четырёх человек в одиночку вести очень трудно. Усложняется ситуация когда никто из участников, кроме менторов, не знает Go. Приходится выполнять множество дополнительных шагов. Впрочем, если бы нас было четверо, было бы гораздо проще (студентов было 15).
Первые патчи в проект Go
Для второго занятия стояла цель перейти непосредственно к контрибьютингу:
- Договорились с Daniel Martí что он будет доступен в обговорённое время и сможет провести ревью (поставить +2 если патч тривиальный и корректный).
- Илья Токарь подсказал scratch репозиторий, куда гораздо проще отправлять первый CL (change list). Позволяет опробовать gerrit в работе без рисков что-то сломать.
- Подготовил стикеры для вручения тем, кто успешно вливал патчи в Go.
Нам повезло: scratch репозиторий был сломан. Кто-то отправил некорректный код в репозиторий и из-за этого trybots (CI тесты) всегда проваливались. Одной из задач, которую я подготовил, было исправить то, что было причиной ошибки сборки.
К концу занятия было выслано 6 патчей:
CL105415, CL105395, CL105356, CL105416, CL105355, CL105375.
Стикеры получил каждый.
Прошло 180 минут: разобрали процесс разработки Go, всем оформили Google CLA, настроили gerrit, выслали "hello world" патчи, починили сборку scratch репозитория, а один из участников успел выслать патч в golang/go (merge был в тот же день).
Для хороших стикеров "в срок" нужно обращаться к проверенным поставщикам. Экономия на ближайших точках, где могут распечатать стикеры без нарезки — не очень хорошая затея. А ещё нельзя сочетать лого суслика с чем-то ещё: gopher с табличкой Intel в руках нарушает все мыслимые законы стикеров.
Остальные занятия проходили по более свободной схеме. Мы приходили и работали над своими задачами, обменивались опытом и помогали друг другу. Почти каждую такую встречу высылали несколько патчей.
Затем наступил code freeze и курс подошёл к логическому концу. К этому моменту было влито 17 патчей. Мы по-прежнему собираемся по субботам и работаем над разными Go утилитами...
Трудности "второго шага"
Проще всего было сделать первый шаг. Для тех, кто неуверенно работает с git'ом репозиторий scratch — отличное решение.
Не слишком сложно было найти задачи минимального объёма и не требующие большого контекста. Здесь помогали разнообразные линтеры. Запускаешь "gometalinter --enable-all
" на пакете из GOROOT
и выбираешь, что поправить.
Сложнее было с задачами на уровень выше. Мне было сложно подсказать такую, а им было сложно такую выбрать. При этом было понимание того, что исправление предупреждений линтеров мы уже переросли (т.е. пропал challenge, для продуктивного обучения нужно было искать новые виды задач).
В теории, неплохой задачей второго уровня является улучшения тестов в Go: увеличение покрытия, добавление или доработка бенчмарков, исправление не вполне корретных или отключенных тестов, проверка регрессионных тестов и прочее. Это требует некоторого погружения в тестируемый пакет, но область изменений будет минимальна и достаточно легко проверить результат. Но не всем по вкусу работать с тестами.
Примеры из того, за что успели взяться в качестве задач 2-го уровня:
- encoding/json: add the full path to the field in UnmarshalTypeError (
#22369
) - time: optimize time.Time.Sub and time.Since (
#17858
) - cmd/compile: avoid slow versions of LEA instructions on x86 (
#21735
)
Начинали их ближе к code freeze, поэтому не успели довести до конца: оставалось 2 субботы по 90 минут, а этого недостаточно. Тем более каждый работал над своей задачей. Возможно было бы проще в случае разбиения на команды хотя бы по два человека, например, в случае issue21735, можно параллельно проверять разные гипотезы и изучать разные части компилятора параллельно, потом делиться знаниями.
Больше всего стоит уделять внимания именно этой части, неизбежному углублению и вопросам, которые следуют за этим. Сомневаюсь, что есть люди, которые знают все части Go настолько, чтобы суметь поддержать при любом выборе, поэтому здесь всё опять сходится к недостатку разных экспертов.
Workshop v2
Часть проблем, описанных выше, решилась бы альтернативным форматом, когда более сложная задача не требовала бы её решения на протяжении трёх недель. Следующий workshop стоит проводить в виде непрерывного мероприятия, хотя бы на 4-5 часов, а в идеале с перерывом и на подольше.
Обычно формат хакатона также подразумевает некоторую подготовку участников перед началом, а именно выбор задачи и предварительного описания путей её решения, формирование команд. Это тоже может помочь увеличить количество успешных контрибуций.
Нужно больше наставников, которые смогут в режиме реального времени помогать участникам выбирать и решать задачи.
Выбор города зависит от количества участников и их георгафической распределённости. Мне ближе всего четыре варианта: Москва, Иннополис, Казань, Нижний Новгород.
В заключение
Не обязательно приходить на подобные хакатоны, чтобы начать контрибьютить в Go, мотивирующим примером может быть статья Марко Как новичок в Go контрибьютил. Однако в компании таких же заинтересованных людей проще преодолеть первоначальный дискомфорт и растерянность, пройти путь от начала и до конца.
Если вы неравнодушны к этой теме, следите за обновлениями, заглядывайте в на golang-ru.slack. Следующий период активной разработки Go начинается с августа 2018: не слишком далеко, чтобы об этом забыть, и не слишком близко, чтобы не успеть хорошенько подготовиться.
Бонусные материалы для начинающих контрибьюторов
- Выступление Как контрибьютить в Go Станислава Афанасьева (goandfix.me)
- Слайды How to Contribute to Go
- Слайды Golang compiler internals for ARM64
- Относительно недавно стали появляться новые readme, ориентированные на новых контрибьюторов: cmd/compile, cmd/compile/internal/ssa.
Ближайшие события
- 20 июня: The London Go Contributor Workshop
- 1-3 августа: GopherCon UK, на котором тоже будет Contributor Workshop
Автор: quasilyte