Como transplantamos toda a equipe para outro idioma em um dia (na verdade não)


Início de um modelo para "aterramento" rápido dos desenvolvedores de PHP no Go

Há 15 anos, realizamos um back-end em PHP. E uma vez tomada uma decisão estratégica: primeiro, reescreva os locais mais carregados do Go e, em seguida, desenvolva novos serviços.

Imagine: você quer falar sobre uma nova linguagem para uma equipe de 40 desenvolvedores que preparam o PHP tão bem que montam um sistema multiencadeado em tempo real e de alta disponibilidade. Na pior das hipóteses, eles o queimarão, na melhor das hipóteses, ouvirão, mas continuarão a fazer como antes. Isto é, se você inserir o idioma à força.

Portanto, decidimos primeiro organizar um hackathon e depois convidar todos para o lado sombrio. Se pelo menos dez pessoas os tivessem recrutado, com o tempo, eles teriam mostrado a todos os outros um exemplo pessoal de como isso é legal.

Vou lhe dizer em etapas como repetir essa experiência com você. E sobre os resultados de nossa implementação. E sobre o que acontece na cabeça de um desenvolvedor de PHP quando ele vê uma nova linguagem.

Começamos com a preparação do modelo e do CI / CD, que permite desligar em 15 segundos. Para escrever você mesmo, você precisa de duas semanas. Fizemos isso com antecedência.

Etapa 1. Fale sobre Golang


Muitas vezes temos muitos seminários internos. Alguém quer contar alguma coisa, escreve um anúncio, reúne pessoas e conta. Acontece que essas são as peculiaridades da regulação do tráfego aéreo na Rússia; acontece que é uma história sobre viagens, mas com muito mais frequência estamos falando de algum tipo de tecnologia ou recurso que foi implementado. E isso pode ser útil para outra pessoa. Então, montamos um seminário interno sobre o Go, onde conversamos sobre os benefícios do idioma. Rápido (compilado sem pandeiro: o PHP também pode ser compilado, mas mais difícil), com vários threads prontos para uso, com suporte simples, você pode escrever sem uma estrutura diretamente em um notebook, ou seja, não há hemorróidas com dependências de terceiro nível que a estrutura desenvolvida arrasta junto com ela. Implante em 15 segundos. E parece que não há falhas óbvias em nossa situação. Sugerimos tentar. Era como uma história sobre outro mundo: aqui está a linguagem, veja como ela difere, no próximo final de semana haverá um hackathon para quem estiver interessado.

Etapa 2. Documentação


Três dias antes do hackathon, enviamos um link para um curso introdutório de meia hora sobre sintaxe, tipos de dados básicos e funcionalidade. E documentação básica. Aqui está o que os desenvolvedores receberam:

golang.org/doc
tour.golang.org

Além disso, contatos Go-senior dentro.

Etapa 3. Grupos


Além disso, propusemos dividir em grupos e trazer tarefas que gostaríamos de implementar aqui e agora em um novo idioma. Eles imediatamente avisaram que o hackathon estaria no escritório depois de horas (no sábado), o assunto era voluntário, mas seria possível resolver a tarefa de combate e aprender na prática em modo quase pareado com uma pessoa que conhece as nuances do idioma. Isso interessou 40 pessoas, e eles começaram a lutar em grupos e a recrutar tarefas. Nem todos tiveram sucesso com os grupos: muitos vieram com a tarefa de apenas um, os grupos eram dois, com menos frequência - três pessoas. As próprias tarefas estavam no topo de pendências ou estavam relacionadas à duplicação de algum tipo de local inibitório.

O objetivo final era realizar uma tarefa no hackathon, que pode ser enrolada um pouco e "vendida" ao proprietário do produto (gerente de direção). No espírito: "Olha, funcionou antes de 40 segundos e agora faz tudo em dois." Esta parte é a mais importante para o sucesso estratégico da introdução do idioma nas equipes: você precisa de uma pequena vitória no início.

Etapa 4. Trabalho invisível


Preparamos um modelo, sobre o qual falei acima, para nossa infraestrutura, o que nos permitiria executar imediatamente sem dançar para criar e conectar tudo o que você precisa. Este modelo substitui a estrutura. Espalhar não faz muito sentido: repito, é muito aprisionado apenas para nós.

Vou listar apenas a funcionalidade que foi estabelecida no modelo:

  • Integração com k8s.
  • Exporte métricas para o prometheus.
  • Configuração através de variáveis ​​de ambiente.
  • Servidor HTTP.
  • Opentracing.
  • Logger

Estamos trabalhando no estudo do Kubernetes há muito tempo e, como solução, escolhemos o OpenShift, que ofereceu grandes oportunidades para personalizar e configurar o CI / CD. Então, aprimoramos o modelo imediatamente sob os k8s. O aplicativo criado no OpenShift cria o repositório, coleta o esqueleto do aplicativo, o serviço no k8s, aplica políticas de segurança, coleta o binário, implanta no k8s e em menos de um minuto o serviço está disponível na rede. Portanto, o hackathon também se tornou um evento em que os desenvolvedores foram apresentados ao nosso futuro PaaS.

Também preparamos um painel na Grafana com métricas básicas, configuramos logs de exportação para o Kibana e agentes para o Jaeger. Para cada serviço, são gerados links para serviços, nos quais você pode obter imediatamente todas as informações necessárias.

Em seguida, foi necessário concordar com o acesso aos bancos de dados necessários para a resolução de problemas pelos participantes do hackathon. Isso está errado, mas nos conectamos às bases militares em somente leitura durante a duração do trabalho. Essa é outra razão pela qual o sábado é a menor carga neste dia.

Eles avisaram a cozinha (lembro que a temos gratuitamente para lanches - frutas de queijo cottage, mas não para comida quente) sobre o evento. A comida foi levada ao escritório para que não nos distraíssemos.

Etapa 5. Hackathon propriamente dito


Por razões óbvias (família, relaxamento), algumas falharam no sábado, então dividimos 15 pessoas em ligações.

Eles falaram sobre nossa plataforma PaaS, como criar um aplicativo a partir de um modelo, como usar um modelo. Essa estrutura, na qual existem invólucros para coletar métricas, verificações de integridade e métricas, conectar-se a um banco de dados e assim por diante, mostrou como conectar todos os tipos de coisas diferentes. Foi possível remover tudo no local ou com antecedência (o modelo também foi distribuído para o hackathon). Este é um aplicativo pronto que precisa ser expandido.

Eles falaram sobre os recursos de implantação e desenvolvimento do Kubernetes (configuração, registro, métricas, trabalho com amostras prontas, alocação de recursos para o processador e memória, etc.). Eles tentaram implantar "Olá, mundo!".



Os próprios caras criaram os serviços. Fiquei agradavelmente surpreendido com a simplicidade e facilidade de uso do modelo. Alguém já teve tempo de praticar em Golang, alguém apenas folheou a documentação.



Não tínhamos o objetivo de mostrar como escrever bem; era necessário obter um código funcional aproximado e mostrar como tudo pode ir rapidamente para o pré-produto, como tudo funciona rapidamente e como é fácil fazer edições.

O plano era o seguinte: as equipes escrevem, se você tiver alguma dúvida, nós respondemos. Depois, uma sessão de revisão e ajuda sobre como fazer algo mais correto na arquitetura em Golang.

Das distorções cognitivas do meio PHP, vale a pena notar a maneira "antiga" de pensar em um único tópico. O Go possui um bom modelo competitivo interno e multithreading pronto para uso, que não estava no PHP. O código acaba sendo muito legível, o que poucos esperavam.

Na prática, nem sempre usamos multithreading. Depende da tarefa. Mas, sob o capô, ela também é e, quando necessário, a velocidade aumenta devido a ela. Por exemplo, uma goroutine separada é criada para qualquer solicitação REST recebida. Golang pode processar várias solicitações ao mesmo tempo, quando a maioria das outras linguagens (incluindo PHP), por padrão, enfileira-as e processa-as em um encadeamento para cada trabalhador.

O segundo recurso é uma grande dor com o retorno de erros. Se o multithreading é apenas uma arquitetura diferente e é fácil se acostumar a ela em uma ou duas horas, no caso de erros ao mudar do PHP, essa é uma mudança em todo o modelo de pensamento. Retornar erros de funções é o principal paradigma no Go. No PHP, o try-catch geralmente envolve as coisas. E aqui é necessário processar explicitamente no corpo da função. Algumas pessoas foram brutalmente bombardeadas por esse "abrandamento", resistiram ativamente. Isso ocorre porque a abordagem é muito próxima do TDD, e o TDD exige paciência ao escrever o código, mas é fácil depurar. Isso aumenta o código linha por linha "se - um erro", mas depois que você escreve e não retorna. Isso é muito importante na arquitetura dos microsserviços, porque os microsserviços crescem como cogumelos e um desenvolvedor pode gravar dezenas de microsserviços. Constantemente alternar contextos e erros de depuração é muito caro e ineficiente. Se tudo for feito corretamente, o aplicativo funcionará por anos, tão efetivamente quanto durante o desenvolvimento. E no PHP, na mesma situação, é provável que, se o código for escrito incorretamente, novos erros surjam constantemente, após o que será necessário depurar tudo novamente.

Descobriu-se os calçados para os pés. Quando a parte funcional foi lançada, eles já descobriram a melhor forma de decompô-la em pacotes. Então houve uma revisão. Quando o Go-senior ajuda você, é muito útil imediatamente. Eles mostraram a alguém como substituir visitas constantes à base por um cache na RAM. Alguém foi ajudado a reescrever o código em execução paralela. Em algum lugar, havia pequenos plugues, como o fato de o servidor HTTP no PHP tradicionalmente subir e morrer, mas aqui ainda resta travar.

Etapa 6. Repositório


No final do hackathon, o código foi dobrado no repositório, onde todos podiam ver o código das equipes vizinhas e enviar uma solicitação de recebimento. Isso também faz parte do treinamento e, durante a semana, essas solicitações foram bastante ativas.

Sumário


Oito horas de hackathon em dois fluxos de mais ou menos 15 pessoas (lembre-se, de 70 desenvolvedores, 40 queriam experimentar o Go e receberam documentação e um modelo, mas nem todos puderam participar de um dia ou quiseram participar fisicamente).

Um quarto dos serviços deu o resultado esperado imediatamente. Outra parte exigia longas modificações por parte do monólito PHP ou simplesmente tinha mais de oito horas de largura. Cerca de metade dos serviços foram concluídos antes da venda posteriormente.

Como resultado, todos se familiarizaram com o idioma, a plataforma OpenShift, como se casar com eles e assim por diante. Vimos o modelo de aplicativo e o novo CI / CD, obtivemos todo o conjunto de ferramentas para resolver ainda mais nossos problemas no Go.

Em seguida, os recursos foram "vendidos" para os proprietários do produto. Respondemos às perguntas de arquitetura dos líderes de equipe.

No mês seguinte, quase todos juntos adicionaram um modelo (que é uma mini-estrutura) às necessidades dos departamentos. Como resultado, ele se tornou maior. Sim, outro recurso do modelo: toda a configuração - por meio de variáveis ​​de ambiente, isto é, com desenvolvimento local e ao mudar para pré-produto, tudo funciona perfeitamente da mesma maneira. Docker é bom.

Não só Go passou do hackathon para as massas. Os modelos apareceram na plataforma PaaS para PHP e Node.js, mas, mesmo assim, todas as outras coisas iguais, os desenvolvedores geralmente escolhem Go como a linguagem do microsserviço. Como resultado, na prática, todos os novos microsserviços vendidos escritos após o hackathon são escritos especificamente no Go. Ou seja, cortamos o monólito e imediatamente escrevemos tudo de novo no Kubernetes. Até o final do ano, nos mudaremos para lá quase completamente.

Quem não veio perguntou aos colegas o que era. Em seguida, eles se aproximaram e pediram o idioma, realizaram várias tarefas em segundo plano (para o trabalho principal), depois colocaram o código no repositório e receberam solicitações pull de outros desenvolvedores recém-treinados e dos especialistas da Go. Interessado em livros. Ou seja, ainda tivemos algumas semanas de suporte técnico da segunda linha.

Para aqueles que queriam continuar seus estudos, eles criaram um grupo no Telegram com livros e muito mais. Também organizamos uma guilda de desenvolvedores Golang, onde discutimos semanalmente questões emergentes no trabalho, desenvolvemos componentes comuns, compartilhamos boas práticas. Qualquer desenvolvedor pode entrar.

A maior conseqüência é que, depois de um mês, reescrevemos uma das seções mais movimentadas e ela começou a trabalhar cerca de seis mil vezes mais rápido no prod. Mas é melhor falar sobre isso separadamente: não há apenas os recursos da linguagem, mas também a implementação de multithreading, algumas melhorias arquiteturais e um pouco de xamanismo. O mais importante é a nossa experiência de conhecer o idioma, e geralmente é fácil repeti-lo com você se você tiver pelo menos um especialista em Go que passará algumas semanas aprendendo.

Outros posts sobre o nosso desenvolvimento: a história do monólito de 15 anos , uma abordagem de mercearia na cozinha , o que o desenvolvedor deve saber sobre o negócio e, especialmente, o retorno de passagens aéreas .

Source: https://habr.com/ru/post/pt470461/


All Articles