Durante mucho tiempo planeó enviar un parche a Go, pero se pospuso constantemente? Ante las dificultades, no sabía por dónde empezar? En este artículo, describiré cómo realizamos el taller de contribución de Go en Kazán, sobre sus resultados y sobre las lecciones que aprendieron los organizadores.
Spoiler: se planea repetir este evento cuando Go entra en la fase de desarrollo activo (sale del estado de congelación del código). Ver detalles debajo del corte.
¿Qué es un taller de contribución Go?
De vez en cuando, se llevan a cabo reuniones de programadores Go de diferentes tamaños en todo el mundo, cuyo propósito es estudiar el interior de Go y enviarle sus cambios. Todo comenzó con GopherCon .
Alguien viene a ayudar a otros a descubrir el flujo de trabajo, resolver un problema y resolverlo, luego pasar por una revisión e, idealmente, llegar al punto en el que el parche se inyecta aguas arriba . Otros vienen como el "primer contribuyente".
Si está interesado en alguno de los siguientes, puede estar interesado en participar:
- Sumérgete en los detalles de bajo nivel de la cadena de herramientas Go (compilador, enlazador, ensamblador, ...)
- Acelerar alguna función de la biblioteca estándar o tiempo de ejecución
- Agregue ejemplos o pruebas faltantes para cualquiera de los paquetes.
- Refactorizar un código muy aterrador
- Mejore el soporte para una arquitectura o sistema operativo más raro (tiene hardware y / o sistema operativo)
- Chatea con personas que han estado contribuyendo a Go durante mucho tiempo
La lista no está completa, todos pueden encontrar algo en esto.
Taller en Rusia
En algún momento, decidí que quería ayudar a organizar tal evento. Sobre todo, quería estar en un círculo de personas con intereses similares.
El programa preliminar fue de aproximadamente 6-10 horas (el mejor y peor caso). El hackathon parecía el formato más adecuado, pero no era posible encontrar patrocinadores en ese momento. Pero hubo una oportunidad para realizar clases opcionales para la Plataforma Científica y Práctica de IWMI y KFU , una vez a la semana durante una hora y media. Inconveniente obvio: debido a los grandes descansos entre la participación, tendrías que pasar un tiempo extra. Y no pizza. Suspiro
De manera inesperada, resultó ser un invitado en el podcast GolangShow (ep. 119) , donde dejé escapar la idea de llevar a cabo algo similar para los estudiantes. Un poco más tarde, Elena Grakhovats creó el canal #kfu-go-2018
en la holgura de la comunidad de habla rusa Go . No solo los estudiantes de KFU podían comunicarse allí, sino también todos aquellos que estaban interesados en participar de forma remota.
Después de eso, los detalles de la reunión fueron aprobados en la universidad, se conocieron fechas específicas. En lugar de un hackathon, obtuvieron un "curso de lenguaje de programación Go". Esto no cambió mucho el contenido, el objetivo siguió siendo el mismo y se describió claramente en el anuncio .
Esto fue seguido por un escaneo del rastreador en busca de tareas que pudieran realizarse dentro del evento al menos parcialmente (incluso mejor, completamente).
Lección No. 1De hecho, resultó que la lista de tareas incluía aquellas que eran intereses o que yo entendía personalmente. Esto también se reconoció durante la compilación de la lista, pero es difícil influir en ella.
Quizás sería mejor si esta lista estuviera compuesta por varias personas con diferentes perfiles e intereses.
Cualquier participante podría ir al rastreador de Go y elegir cualquier cosa, pero para las tareas de la lista, las explicaciones estaban listas y, para algunos, una solución parcial.
La mayor parte del contenido que se generó durante el curso está disponible en el repositorio kfu-go-2018 . También puede encontrar task.org allí .
Primera reunión
Vinieron estudiantes que no habían escrito previamente en Go. La mayoría de ellos ni siquiera han oído hablar de ese lenguaje de programación.
Pasamos la mitad de la primera lección sobre la construcción de Go desde la fuente. En diferentes computadoras había diferentes, incluidos problemas inesperados. Diferentes sistemas operativos, versiones de compiladores del sistema (alguien no tenía la intención de ir a 1.4), etc. ./make.bash
( make.bat
para Windows) no funcionaba con diferentes errores.
Cuando la mayoría tenía un Go en funcionamiento, nuestro primer Hello World fue go tool compile
mensaje canónico en la go tool compile
cuando se le pasó una nueva bandera.
Pasaron 90 minutos: hablamos de Go, lo comparamos con C ++, compilamos una cadena de herramientas, desmontamos el proceso de arranque y armamos un compilador actualizado.
Lección No. 2Por separado, vale la pena mencionar que Delus Farkhulin me ayudó. Empíricamente reveló que más de cuatro personas para liderar solo es muy difícil. La situación se complica cuando ninguno de los participantes, excepto los mentores, conoce a Go. Tienes que realizar muchos pasos adicionales. Sin embargo, si fuéramos cuatro de nosotros, sería mucho más fácil (había 15 estudiantes).
Los primeros parches en el proyecto Go
Para la segunda lección, el objetivo era ir directamente a contribuir:
- Acordamos con Daniel Martí que estará disponible a la hora acordada y podrá realizar una revisión (ponga +2 si el parche es trivial y correcto).
- Ilya Tokar sugirió un repositorio temporal donde es mucho más fácil enviar el primer CL (lista de cambios). Le permite probar gerrit en el trabajo sin el riesgo de romper algo.
- Pegatinas preparadas para entregar a quienes inyectaron parches con éxito en Go.
Tuvimos suerte: el repositorio de scratch estaba roto. Alguien envió el código incorrecto al repositorio y debido a esto, los trybots (pruebas de CI) siempre fallaron. Una de las tareas que preparé fue arreglar lo que estaba causando el error de compilación.
Al final de la lección se enviaron 6 parches:
CL105415 , CL105395 , CL105356 , CL105416 , CL105355 , CL105375 .
Todos obtuvieron las pegatinas.

Pasaron 180 minutos: desmantelaron el proceso de desarrollo de Go, emitieron el CLA de Google para todos, configuraron gerrit, enviaron parches de "hola mundo", repararon el ensamblaje de depósito de scratch y uno de los participantes logró enviar el parche a golang / go (la fusión se realizó el mismo día).
Lección No. 3Para obtener buenas calcomanías "a tiempo", debe comunicarse con un proveedor confiable. No es una buena idea guardar en los puntos más cercanos donde se pueden imprimir pegatinas sin cortar. Y no puede combinar el logotipo de Gopher con nada más: un gopher con un signo de Intel en la mano viola todas las leyes imaginables de las pegatinas.
Las clases restantes se llevaron a cabo de acuerdo con un esquema más flexible. Vinimos y trabajamos en nuestras tareas, intercambiamos experiencias y nos ayudamos mutuamente. Casi todas esas reuniones enviaron varios parches.
Luego vino la congelación de código y el curso llegó a un final lógico. En este punto, se vertieron 17 parches . Todavía nos reunimos los sábados y trabajamos en diferentes utilidades de Go ...

Las dificultades del "segundo paso"
La forma más fácil era dar el primer paso. Para aquellos que no están seguros de trabajar con git, el repositorio de scratch es una gran solución.
No fue demasiado difícil encontrar tareas de volumen mínimo y que no requirieran un contexto amplio. Una variedad de linter ayudó aquí. Ejecute " gometalinter --enable-all
" en el paquete de GOROOT
y elija qué solucionar.
Fue más difícil con tareas de un nivel más alto. Fue difícil para mí sugerir eso, pero fue difícil para ellos elegir esto. Al mismo tiempo, se entendió que ya habíamos superado la corrección de las advertencias de linter (es decir, el desafío desapareció, para una capacitación productiva era necesario buscar nuevos tipos de tareas).
En teoría, una buena tarea de segundo nivel es mejorar las pruebas en Go: aumentar la cobertura, agregar o refinar los puntos de referencia, corregir las pruebas no correctas o deshabilitadas, verificar las pruebas de regresión y más. Esto requiere un poco de inmersión en el paquete de prueba, pero el alcance del cambio será mínimo y es bastante fácil verificar el resultado. Pero no a todos les gusta trabajar con pruebas.
Ejemplos de lo que lograron tomar como tareas del segundo nivel:
- codificación / json: agregue la ruta completa al campo en UnmarshalTypeError (
#22369
) - time: optimiza time.Time.Sub y time.Since (
#17858
) - cmd / compilar: evite versiones lentas de instrucciones LEA en x86 (
#21735
)
Los iniciamos más cerca de la congelación de código, por lo que no tuvimos tiempo de terminarlo: hubo 2 sábados durante 90 minutos, pero esto no es suficiente. Además, todos trabajaron en su tarea. Tal vez sería más fácil si al menos dos personas se dividieran en equipos, por ejemplo, en el caso del problema 21355 , puede verificar diferentes hipótesis en paralelo y estudiar diferentes partes del compilador en paralelo, luego compartir el conocimiento.
Lección No. 4Sobre todo, vale la pena prestar atención a esta parte en particular, la profundización inevitable y los problemas que siguen a esto. Dudo que haya personas que conozcan todas las partes de Go tanto como para poder apoyar cualquier opción, por lo que aquí nuevamente todo se reduce a la falta de diferentes expertos.
Taller v2
Algunos de los problemas descritos anteriormente se resolverían con un formato alternativo, cuando una tarea más compleja no requeriría su solución en tres semanas. El próximo taller debe realizarse en forma de un evento continuo, al menos durante 4-5 horas, e idealmente con un descanso y por más tiempo.
Por lo general, el formato de hackathon también implica cierta preparación de los participantes antes del inicio, es decir, la elección de la tarea y una descripción preliminar de las formas de resolverla, la formación de equipos. Esto también puede ayudar a aumentar el número de contribuciones exitosas.
Necesitamos más mentores que puedan ayudar a los participantes a seleccionar y resolver problemas en tiempo real.
La elección de una ciudad depende del número de participantes y su distribución geográfica. Cuatro opciones son las más cercanas a mí: Moscú, Innopolis, Kazan, Nizhny Novgorod.
En conclusión
No es necesario llegar a tales hackathons para comenzar a contribuir a Go, un ejemplo motivador sería el artículo de Marco Cómo nuevo en Go está contribuyendo . Sin embargo, en una compañía de las mismas personas interesadas, es más fácil superar la incomodidad y la confusión iniciales, ir desde el principio hasta el final.
Si no eres indiferente a este tema, mantente atento, mira golang-ru.slack . El próximo período de desarrollo activo de Go comienza en agosto de 2018 : no muy lejos para olvidarlo y no demasiado cerca para no tener tiempo para prepararse bien.
Materiales de bonificación para contribuyentes principiantes
Próximos eventos