Há muito tempo planejado enviar um patch para Go, mas constantemente adiado? Diante de dificuldades, não sabia por onde começar? Neste artigo, descreverei como realizamos o workshop de contribuição do Go em Kazan, sobre seus resultados e as lições aprendidas pelos organizadores.
Spoiler: está planejado repetir esse evento quando o Go entrar na fase de desenvolvimento ativo (sai do estado de congelamento de código). Veja detalhes abaixo do corte.
O que é um workshop de contribuição do Go?
De tempos em tempos, reuniões de programadores do Go de diferentes tamanhos acontecem em todo o mundo, cujo objetivo é estudar o interior do Go e enviar suas alterações a ele. Tudo começou com o GopherCon .
Alguém vem ajudar outras pessoas a descobrir o fluxo de trabalho, identificar um problema e resolvê-lo, depois passar por uma revisão e, idealmente, chegar ao ponto em que o patch é injetado no upstream . Outros vêm como o "Primeiro colaborador".
Se você estiver interessado em algum dos seguintes itens, poderá estar interessado em participar:
- Mergulhe nos detalhes de baixo nível da cadeia de ferramentas Go (compilador, vinculador, montador, ...)
- Acelere algumas funções da biblioteca ou tempo de execução padrão
- Adicione exemplos ou testes ausentes para qualquer um dos pacotes.
- Refatorar algum código muito assustador
- Aprimore o suporte a uma arquitetura ou SO mais raro (você possui hardware e / ou SO)
- Converse com pessoas que contribuem para o Go há muito tempo
A lista não está completa, todos podem encontrar algo nisso.
Workshop na Rússia
Em algum momento, decidi que queria ajudar na organização de um evento desse tipo. Acima de tudo, eu queria estar em um círculo de pessoas com interesses semelhantes.
O programa preliminar durou cerca de 6 a 10 horas (o melhor e o pior dos casos). O hackathon parecia o formato mais adequado, mas não era possível encontrar patrocinadores na época. Mas havia uma oportunidade de ministrar aulas opcionais para a Plataforma Científica e Prática da IWMI & KFU , uma vez por semana, durante uma hora e meia. Desvantagem óbvia: devido aos grandes intervalos entre a participação, você teria que gastar um tempo extra. E sem pizza. Suspiro
Inesperadamente, acabei sendo convidado no podcast GolangShow (ep. 119) , onde deixei escapar a idéia de realizar algo semelhante para os alunos. Um pouco mais tarde, Elena Grakhovats criou o canal #kfu-go-2018
na folga da comunidade de língua russa Go . Não apenas os alunos da KFU puderam se comunicar por lá, mas também todos aqueles que estavam interessados em participar remotamente.
Depois disso, os detalhes da reunião foram aprovados na universidade, datas específicas ficaram conhecidas. Em vez de um hackathon, eles receberam um "curso de linguagem de programação Go". Isso não mudou muito o conteúdo, o objetivo permaneceu o mesmo e foi claramente descrito no anúncio .
Isto foi seguido por uma varredura do rastreador em busca de tarefas que pudessem ser executadas dentro da estrutura do evento pelo menos parcialmente (ainda melhor - completamente).
Lição No. 1De fato, a lista de tarefas incluía aquelas que eram interesses ou que eu pessoalmente entendia. Isso também foi reconhecido durante a compilação da lista, mas é difícil influenciá-la.
Talvez seja melhor que essa lista seja composta por várias pessoas com diferentes perfis e interesses.
Qualquer participante poderia ir ao rastreador Go e escolher qualquer coisa, mas para as tarefas da lista, as explicações estavam prontas e, para algumas delas, uma solução parcial.
A maior parte do conteúdo gerado durante o curso está disponível no repositório kfu-go-2018 . Você também pode encontrar tasks.org lá .
Primeira reunião
Chegaram estudantes que não haviam escrito anteriormente no Go. A maioria deles nem sequer ouviu falar dessa linguagem de programação.
Passamos metade da primeira lição sobre a criação do Go a partir da fonte. Em computadores diferentes, havia diferentes, incluindo problemas inesperados. Diferentes sistemas operacionais, versões dos compiladores do sistema (alguém não pretendia ir para o 1.4) e assim por diante. ./make.bash
( make.bat
para Windows) não funcionou com erros diferentes.
Quando a maioria tinha um Go funcionando, nosso primeiro Hello World foi go tool compile
mensagem canônica na go tool compile
quando um novo sinalizador foi passado para ele.
Passaram 90 minutos: falamos sobre o Go, comparamos com o C ++, compilamos uma cadeia de ferramentas, desmontamos o processo de inicialização e montamos um compilador atualizado.
Lição No. 2Separadamente, vale ressaltar que Delus Farkhulin me ajudou. Empiricamente, revelou que mais de quatro pessoas para liderar sozinhas são muito difíceis. A situação é complicada quando nenhum dos participantes, exceto os mentores, conhece o Go. Você precisa executar muitas etapas adicionais. No entanto, se houvéssemos quatro de nós, seria muito mais fácil (havia 15 alunos).
Os primeiros patches no projeto Go
Para a segunda lição, o objetivo era ir diretamente para contribuir:
- Concordamos com Daniel Martí que ele estará disponível no horário combinado e poderá realizar uma revisão (coloque +2 se o patch for trivial e correto).
- Ilya Tokar sugeriu um repositório de rascunho, onde é muito mais fácil enviar o primeiro CL (lista de alterações). Permite que você experimente o gerrit no trabalho sem o risco de quebrar alguma coisa.
- Adesivos preparados para entrega àqueles que injetaram patches com sucesso no Go.
Tivemos sorte: o repositório de rascunho estava quebrado. Alguém enviou o código errado ao repositório e, por causa disso, os trybots (testes de CI) sempre falharam. Uma das tarefas que preparei foi corrigir o que estava causando o erro de compilação.
No final da lição, 6 patches foram enviados:
CL105415 , CL105395 , CL105356 , CL105416 , CL105355 , CL105375 .
Todo mundo pegou os adesivos.

Passaram 180 minutos: eles desmontaram o processo de desenvolvimento do Go, emitiram o CLA do Google para todos, configuraram o gerrit, enviaram patches "olá mundo", repararam o conjunto do repositório de rascunhos e um dos participantes conseguiu enviar o patch para golang / go (a mesclagem foi no mesmo dia).
Lição No. 3Para obter bons adesivos "pontualmente", é necessário entrar em contato com um fornecedor confiável. Salvar nos pontos mais próximos onde os adesivos podem ser impressos sem cortar não é uma boa ideia. E você não pode combinar o logotipo gopher com qualquer outra coisa: um gopher com um sinal da Intel na mão viola todas as leis concebíveis dos adesivos.
As demais turmas foram realizadas de acordo com um esquema mais flexível. Viemos e trabalhamos em nossas tarefas, trocamos experiências e nos ajudamos. Quase todas as reuniões enviaram vários patches.
Então veio o congelamento do código e o curso chegou a um fim lógico. Neste ponto, 17 remendos foram derramados. Ainda nos reunimos aos sábados e trabalhamos em diferentes utilitários Go ...

As dificuldades do "segundo passo"
A maneira mais fácil era dar o primeiro passo. Para quem não tem certeza de trabalhar com o git, o repositório de rascunho é uma ótima solução.
Não foi muito difícil encontrar tarefas com volume mínimo e sem exigir um grande contexto. Uma variedade de linter ajudou aqui. Execute " gometalinter --enable-all
" no pacote do GOROOT
e escolha o que corrigir.
Foi mais difícil com tarefas um nível acima. Foi difícil para mim sugerir isso, mas foi difícil para eles escolherem isso. Ao mesmo tempo, havia um entendimento de que já tínhamos superado a correção de avisos no campo (isto é, o desafio desapareceu, para o treinamento produtivo era necessário procurar novos tipos de tarefas).
Em teoria, uma boa tarefa do segundo nível é melhorar os testes no Go: aumentar a cobertura, adicionar ou refinar benchmarks, corrigir testes não muito corretos ou desativados, verificar testes de regressão e muito mais. Isso requer alguma imersão no pacote de teste, mas o escopo da mudança será mínimo e é fácil o suficiente para verificar o resultado. Mas nem todo mundo gosta de trabalhar com testes.
Exemplos do que eles conseguiram assumir como tarefas do 2º nível:
- encoding / json: adicione o caminho completo ao campo em UnmarshalTypeError (
#22369
) - time: otimizar time.Time.Sub e time.Since (
#17858
) - cmd / compile: evite versões lentas das instruções LEA no x86 (
#21735
)
Nós os começamos mais perto do congelamento de código, então não tivemos tempo para terminar: havia dois sábados por 90 minutos, mas isso não é suficiente. Além disso, todos trabalharam em sua tarefa. Talvez seja mais fácil se pelo menos duas pessoas se dividirem em equipes, por exemplo, no caso da edição 211735 , você pode verificar diferentes hipóteses em paralelo e estudar diferentes partes do compilador em paralelo, e compartilhar conhecimento.
Lição No. 4Acima de tudo, vale a pena prestar atenção a essa parte específica, ao inevitável aprofundamento e às questões que se seguem. Duvido que haja pessoas que conheçam todas as partes do Go a ponto de serem capazes de dar suporte a qualquer escolha, então aqui novamente tudo se resume à falta de especialistas diferentes.
Workshop v2
Alguns dos problemas descritos acima seriam resolvidos por um formato alternativo, quando uma tarefa mais complexa não exigiria sua solução dentro de três semanas. O próximo workshop deve ser realizado na forma de um evento contínuo, pelo menos por 4-5 horas, e idealmente com uma pausa e por mais tempo.
Geralmente, o formato hackathon também implica alguma preparação dos participantes antes do início, a saber, a escolha da tarefa e uma descrição preliminar das formas de resolvê-la, a formação de equipes. Isso também pode ajudar a aumentar o número de contribuições bem-sucedidas.
Precisamos de mais mentores que possam ajudar os participantes a selecionar e resolver problemas em tempo real.
A escolha de uma cidade depende do número de participantes e de sua distribuição geográfica. Quatro opções estão mais próximas de mim: Moscou, Innópolis, Kazan, Níjni Novgorod.
Em conclusão
Não é necessário chegar a esses hackathons para começar a contribuir com o Go, um exemplo motivador seria o artigo de Marco: Como o New to Go está contribuindo . No entanto, em uma empresa das mesmas pessoas interessadas, é mais fácil superar o desconforto e a confusão iniciais, ir do começo ao fim.
Se você não é indiferente a este tópico, fique atento, veja golang-ru.slack . O próximo período de desenvolvimento ativo do Go começa em agosto de 2018 : não muito longe para esquecê-lo e nem muito próximo para não ter tempo para se preparar bem.
Materiais de bônus para colaboradores iniciantes
Próximos Eventos