Хабрахабр

Go contribution workshop в России

Давно планировали отправить патч в Go, но постоянно откладывали?
Сталкивались с трудностями, не знали, с чего начать?

В данной статье я опишу как мы проводили Go contribution workshop в Казани,
о его результатах, а также об уроках, которые извлекли организаторы.

Подробности смотри под катом. Спойлер: планируется повторить это мероприятие когда Go перейдёт в фазу активной разработки (выйдет из состояния code freeze).

Началось всё с GopherCon. По всему миру время от времени проходят разного масштаба сходки Go программистов, целью которых является изучение внутренностей Go и отправка в него своих изменений.

Другие приходят в качестве "First Time Contributor". Кто-то приходит для того, чтобы помочь другим разобраться с рабочим процессом, подобрать задачу и решить её, затем пройти ревью и, в идеале, дойти до вливания патча в upstream.

Если вам интересно что-то из перечисленного ниже, вам могло бы быть интересно поучаствовать:

  • Погрузиться в низкоуровневые детали Go тулчейна (компилятора, линкера, ассемблера, ...)
  • Ускорить какую-нибудь функцию из стандартной библиотеки или рантайма
  • Добавить недостающих примеров или тестов для любого из пакетов
  • Провести рефакторинг какого-нибудь очень страшного кода
  • Доработать поддержку более редкой архитектуры или ОС (с вас железо и/или ОС)
  • Пообщаться с теми, кто уже продолжительное время контрибьютит в Go

Список не полон, каждый может найти в этом что-то своё.

Больше всего хотелось оказаться в кругу людей со схожими интересами. В какой-то момент я решил, что хочу приложить руку к организации подобного события.

Наиболее подходящим форматом выглядел хакатон, но найти спонсоров на тот момент не удалось. Предварительная программа проведения получилась примерно на 6-10 часов (диапазон лучшего и худшего случая). Очевидный недостаток: из-за больших перерывов между участием, приходилось бы затрачивать некоторое дополнительное время. Зато была возможность вести факультативные занятия для Научно-практической платформы ИВМиИТ КФУ, раз в неделю по полтора часа. Sigh И никакой пиццы.

119), где проговорился про идею провести нечто подобное для студентов. Довольно неожиданно, я оказался гостем в подкасте GolangShow (ep. Там могли общаться не только студенты КФУ, но и все те, кому было интересно поучаствовать удалённо. Немногим позже Елена Граховац создала канал #kfu-go-2018 в слаке русскоязычного сообщества Go.

Вместо хакатона получили "курс по языку программирования Go". После этого в университете были утверждены детали проведения, стали известны конкретные даты. Это не сильно меняло содержание, цель оставалась всё та же и она была явно описана в анонсе.

Далее последовало сканирование трекера в поиске таких задач, которые могли бы быть выполнены в рамках мероприятия хотя бы частично (ещё лучше — полностью).

Lesson №1

Это осознавалось и во время составления списка, но влиять на это сложно. На деле получилось так, что в список задач попадали те, что были интересы или понятны лично мне.

Возможно было бы лучше, если бы этот список составляли несколько людей с различающимся профилем и интересами.

Любой участник мог пойти на трекер Go и выбрать себе что угодно, но для задач из списка были готовы разъяснения, а для некоторых из них частичное решение.

Там же можно найти tasks.org. Большая часть контента, которая была выработана во время курса доступна в репозитории kfu-go-2018.

Большинство из них даже не слышали о таком языке программирования. Пришли студенты, которые ранее не писали на Go.

На разных компьютерах возникали разные, в том числе неожиданные проблемы. Половину первого занятия мы потратили на сборку Go из исходников. 4), и прочее. Разные ОС, версии системных компиляторов (у кого-то не собирался Go 1. Банально не работал ./make.bash (make.bat для Windows) с разными ошибками.

Когда у большинства всё-таки появился рабочий Go, первым нашим Hello World было выведение в компиляторе (go tool compile) канонического сообщения при передаче ему нового флага.

Прошло 90 минут: поговорили о Go, сравнили его с C++, собрали тулчейн, разобрали процесс бутстрапинга и собрали обновлённый компилятор.

Lesson №2

Эмпирически выявили, что более четырёх человек в одиночку вести очень трудно. Отдельно стоит упомянуть, что мне помогал Делюс Фархулин. Приходится выполнять множество дополнительных шагов. Усложняется ситуация когда никто из участников, кроме менторов, не знает Go. Впрочем, если бы нас было четверо, было бы гораздо проще (студентов было 15).

Для второго занятия стояла цель перейти непосредственно к контрибьютингу:

  • Договорились с Daniel Martí что он будет доступен в обговорённое время и сможет провести ревью (поставить +2 если патч тривиальный и корректный).
  • Илья Токарь подсказал scratch репозиторий, куда гораздо проще отправлять первый CL (change list). Позволяет опробовать gerrit в работе без рисков что-то сломать.
  • Подготовил стикеры для вручения тем, кто успешно вливал патчи в Go.

Кто-то отправил некорректный код в репозиторий и из-за этого trybots (CI тесты) всегда проваливались. Нам повезло: scratch репозиторий был сломан. Одной из задач, которую я подготовил, было исправить то, что было причиной ошибки сборки.

К концу занятия было выслано 6 патчей:
CL105415, CL105395, CL105356, CL105416, CL105355, CL105375.

Стикеры получил каждый.

Прошло 180 минут: разобрали процесс разработки Go, всем оформили Google CLA, настроили gerrit, выслали "hello world" патчи, починили сборку scratch репозитория, а один из участников успел выслать патч в golang/go (merge был в тот же день).

Lesson №3

Экономия на ближайших точках, где могут распечатать стикеры без нарезки — не очень хорошая затея. Для хороших стикеров "в срок" нужно обращаться к проверенным поставщикам. А ещё нельзя сочетать лого суслика с чем-то ещё: gopher с табличкой Intel в руках нарушает все мыслимые законы стикеров.

Мы приходили и работали над своими задачами, обменивались опытом и помогали друг другу. Остальные занятия проходили по более свободной схеме. Почти каждую такую встречу высылали несколько патчей.

К этому моменту было влито 17 патчей. Затем наступил code freeze и курс подошёл к логическому концу. Мы по-прежнему собираемся по субботам и работаем над разными Go утилитами...

Для тех, кто неуверенно работает с git'ом репозиторий scratch — отличное решение. Проще всего было сделать первый шаг.

Здесь помогали разнообразные линтеры. Не слишком сложно было найти задачи минимального объёма и не требующие большого контекста. Запускаешь "gometalinter --enable-all" на пакете из GOROOT и выбираешь, что поправить.

Мне было сложно подсказать такую, а им было сложно такую выбрать. Сложнее было с задачами на уровень выше. пропал challenge, для продуктивного обучения нужно было искать новые виды задач). При этом было понимание того, что исправление предупреждений линтеров мы уже переросли (т.е.

Это требует некоторого погружения в тестируемый пакет, но область изменений будет минимальна и достаточно легко проверить результат. В теории, неплохой задачей второго уровня является улучшения тестов в Go: увеличение покрытия, добавление или доработка бенчмарков, исправление не вполне корретных или отключенных тестов, проверка регрессионных тестов и прочее. Но не всем по вкусу работать с тестами.

Примеры из того, за что успели взяться в качестве задач 2-го уровня:

  1. encoding/json: add the full path to the field in UnmarshalTypeError (#22369)
  2. time: optimize time.Time.Sub and time.Since (#17858)
  3. cmd/compile: avoid slow versions of LEA instructions on x86 (#21735)

Тем более каждый работал над своей задачей. Начинали их ближе к code freeze, поэтому не успели довести до конца: оставалось 2 субботы по 90 минут, а этого недостаточно. Возможно было бы проще в случае разбиения на команды хотя бы по два человека, например, в случае issue21735, можно параллельно проверять разные гипотезы и изучать разные части компилятора параллельно, потом делиться знаниями.

Lesson №4

Сомневаюсь, что есть люди, которые знают все части Go настолько, чтобы суметь поддержать при любом выборе, поэтому здесь всё опять сходится к недостатку разных экспертов. Больше всего стоит уделять внимания именно этой части, неизбежному углублению и вопросам, которые следуют за этим.

Следующий workshop стоит проводить в виде непрерывного мероприятия, хотя бы на 4-5 часов, а в идеале с перерывом и на подольше. Часть проблем, описанных выше, решилась бы альтернативным форматом, когда более сложная задача не требовала бы её решения на протяжении трёх недель.

Это тоже может помочь увеличить количество успешных контрибуций. Обычно формат хакатона также подразумевает некоторую подготовку участников перед началом, а именно выбор задачи и предварительного описания путей её решения, формирование команд.

Нужно больше наставников, которые смогут в режиме реального времени помогать участникам выбирать и решать задачи.

Мне ближе всего четыре варианта: Москва, Иннополис, Казань, Нижний Новгород. Выбор города зависит от количества участников и их георгафической распределённости.

Однако в компании таких же заинтересованных людей проще преодолеть первоначальный дискомфорт и растерянность, пройти путь от начала и до конца. Не обязательно приходить на подобные хакатоны, чтобы начать контрибьютить в Go, мотивирующим примером может быть статья Марко Как новичок в Go контрибьютил.

Следующий период активной разработки Go начинается с августа 2018: не слишком далеко, чтобы об этом забыть, и не слишком близко, чтобы не успеть хорошенько подготовиться. Если вы неравнодушны к этой теме, следите за обновлениями, заглядывайте в на golang-ru.slack.

Бонусные материалы для начинающих контрибьюторов

Ближайшие события

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть