Olá pessoal!
Lançamos o fluxo do quinto aniversário do curso
Python Developer . Antes do início de cada thread, eles costumam perguntar qual versão usamos no treinamento (geralmente ambos e não apenas, por mais estranho que pareça, dado o nome do curso, Python) e as diferentes nuances da migração de uma versão para outra. Hoje, queremos compartilhar um artigo sobre a experiência de migrar de 2 para 3 no Facebook, que foi publicado no PyConf.
Vamos lá
A transição para o Python 3 se tornou muito mais popular nos últimos anos, mas o processo ainda está longe de ser concluído. A infraestrutura de muitas grandes empresas que usam o Python deixa grandes blocos de código no Python 2.7, e o Facebook não é exceção. Jason Fried visitou o PyCon 2018 para falar sobre as mudanças que ocorreram na empresa nos últimos 4 anos - no início do Python 3 estava praticamente ausente, mas no final se tornou a versão principal do Python na empresa. Jason ajudou a alcançar esse objetivo, e sua
palestra [vídeo do YouTube] é uma ótima fonte de idéias para outras organizações que desejam migrar.
Fraid entrou no Facebook em 2011 e rapidamente percebeu que precisava aprender Python se quisesse obter revisões de código mais rapidamente. Um pouco mais tarde, ele percebeu que havia se tornado a principal força motriz por trás da transição para o Python 3 no Facebook. Isso nunca fez parte de seus planos, e aconteceu, é claro, enquanto ele trabalhava com Python.

A Fraid começou participando ativamente do grupo interno do Python e, muitas vezes, acabou sendo a primeira a responder perguntas. Como resultado, ele ficou famoso (“ganhou notoriedade”) entre os pitonistas no Facebook, consertando o código ele mesmo, sem pedir permissão, se percebesse que a linguagem era usada incorretamente. Isso é possível no Facebook, devido à falta de uma hierarquia vertical de controle; todo mundo tem tantos direitos para reverter suas alterações quanto você precisa fazer essas alterações inicialmente. Com o tempo, essas edições ajudaram a fortalecer a credibilidade de Freud na comunidade do Python no Facebook, o que será útil durante o processo de migração.
Segundo Freud, mudar algo como uma versão da linguagem Python para todo o Facebook levou algum tempo e muita diplomacia. Ele queria contar "a história de como eu e alguns outros engenheiros no meu tempo livre e sem nenhuma autoridade fizemos do Python 3 a versão principal no Facebook".
Em 2013, houve suporte rudimentar ao Python 3.3 no Facebook. Apareceu como parte da tarefa de adicionar suporte ao Python 3 ao sistema de compilação. Mas essa tarefa foi bloqueada pelo suporte ao Python 3 nas bibliotecas do Facebook, que, por sua vez, foi bloqueado pela falta de suporte ao Python 3 no sistema de compilação. A situação é semelhante à do
Trick-22 : o Python 3 estava "disponível", mas nada no ambiente do Facebook a suportava.
Além disso, em 2013, o Python 3 no Facebook foi cercado por sentimentos negativos. Quase todo mundo pensou que a empresa ficaria no Python 2.7 para sempre. Também se falou em mudar para um idioma completamente diferente. Até o próprio Fraid disse (em um grupo interno) que a transição para o Python 3 nunca acontecerá no Facebook. Apenas uma pessoa contestou essa afirmação e se ofereceu para fazer algo a respeito; Naquele momento, Freide ignorou a chamada à ação, mas continuou a pensar nessa idéia.
Raio de esperançaMas, segundo Freud, a esperança era quente. Em janeiro de 2013, o
linter usou quatro importações de
__future__ (print_function, division, absolute_imports, andunicode_literals)
importações_
__future__ (print_function, division, absolute_imports, andunicode_literals)
. Inicialmente, eles pareciam prolongar a vida útil da base de código Python 2 e foram adicionados em todos os lugares para que o linter parasse de xingar. Isso simplificou a conversão de módulos para Python 3.
O Facebook usa a estrutura onipresente para serializar e chamar remotamente as rotinas do
Apache Thrift . E sua compatibilidade excepcional com o Python 2 se tornou um grande bloqueador. Mas em uma pesquisa de inovações potencialmente interessantes da Thrift no Facebook, a adição de suporte ao Python 3. acabou por ser uma opção popular.Fraid votou a favor, mas ainda não porque ele queria promover o Python 3; ele simplesmente achava que a interface do Python 2 era semelhante a algo do Java e, portanto, exigia refatoração.
Seu processo de pensamento começou a mudar após uma palestra de Guido van Rossum no Yelp, San Francisco, sobre o tema "Tulipa", que acabou sendo um módulo
assíncrono . Fride sempre foi um fã da programação Python assíncrona, mas o considerou fragmentado devido às diferenças entre os frameworks (por exemplo,
Twisted ,
gevent ) que o forneciam. O Tulip parecia que poderia tornar interoperável a E / S assíncrona. A palestra ainda não havia terminado, e Fraid já havia conversado com a equipe do Thrift no Facebook, oferecendo a implementação do suporte Tulip ao Python 3 para aguardar o porto de Twisted, gevent e outros. Alguns dias depois, Trift publicou um roteiro mostrando o suporte futuro para Python 3 e Tulip.
Isso aconteceu no início de 2014, mas nada mudou por mais seis meses; os usuários não apareceram e não planejavam fazer isso; na verdade, eles não sabiam de nenhuma alteração.
Novo projetoEm agosto de 2014, a sexta-feira lançou um projeto para reescrever um serviço legado. Inicialmente, para esse fim, ele planejou usar o Python 2 e o gevent, mas depois percebeu que, quando terminou, já estava desatualizado. Alguém deve ser o primeiro a fazer uma mudança; para o Facebook e Python 3, era precisamente o medo. "É você quem deve se tornar essa pessoa para o Python 3 em sua organização."
Então, ele iniciou seu projeto usando Python 3 e "tudo estava quebrado"; não é de surpreender que ninguém tenha usado o Python 3. O sistema de compilação nem sequer compilou seu código, e todos os pacotes de roda de terceiros estavam disponíveis apenas para o Python 2. E quando ele reparou coisas suficientes para montar seu serviço, ele caiu instantaneamente na inicialização - por causa de algo profundo no código que configurou os pontos de entrada no sistema do Facebook.
Portanto, para fazer o código funcionar, Fraid foi forçado a consertar todo o resto; Ele reconstruiu centenas de rodas de terceiros para trabalhar com ambas as versões do Python, atualizou todas as bibliotecas internas para torná-las compatíveis com 2/3. No entanto, todos os dias alguém cometeu alterações no Python 2. Apenas em sua dependência.Não admira que Fraid estivesse cansado de corrigir regressões. A única solução é forçar a conformidade com o Python 3 internamente, mas isso não é possível no Facebook. No entanto, se você começar a agir como se tivesse autoridade para fazê-lo, as pessoas começarão a acreditar que você realmente as possui.
Medo, usando sua influência social, adicionou o ponteiro do Pyflakes ao processo de construção. Dada a presença do
PEP 8 , ele justificou a adição de um novo para resolver uma categoria diferente de problemas de código; além disso, o Pyflakes tinha menos falsos positivos, por isso era menos irritante para os desenvolvedores. O medo de configurar tudo para que o Pyflakes executasse todo o código enviado para revisão, primeiro no Python 2 e depois no Python 3. Isso ajudou a distribuir o trabalho de manter a compatibilidade com o Python 3 entre todos os desenvolvedores, o que possibilitou o progresso no projeto Freud.
No início, ele teve que explicar às pessoas que o interlocutor não estava quebrado e faz sentido modificar o código para compatibilidade com o Python 3. Se os desenvolvedores acreditassem que a transição para o Python 3 era muito complicada, eles retornariam à ideia de "permanecer no Python 2 para sempre". Com Freud, tornar o código compatível com o Python 3 se tornou muito mais fácil. “Desligar o linter” e, portanto, do próprio Freud, tornou-se mais fácil do que reclamar da necessidade de editar o código, e é por isso que todos fizeram isso.
TreinamentoTudo isso ajudou a parar o "sangramento", mas não ajudou a fazer nenhum progresso significativo na introdução do Python 3 no Facebook. Friday se juntou à equipe que ensinou Python a novos funcionários. Os linters já relatavam erros quando o código não era compatível com 2 ou 3, mas a Fraid queria chegar ao ponto em que o código compatível com 2/3 foi gravado apenas para projetos legados, e o novo código foi gravado apenas no Python 3. Mais uma vez, Fraid levou a situação em suas próprias mãos: para fazer essa afirmação, em 2015, ele mudou os slides da classe Python para novos funcionários. A ideia era que, em algum momento desconhecido no futuro, o Facebook desejasse mudar para o Python 3, por isso não faz sentido escrever código para o Python 2 - um dia ele precisará ser reescrito. Ele explicou aos iniciantes que tudo isso deveria funcionar dentro da infraestrutura do Facebook e construir sistemas, e se isso não fosse possível, você teria que enviar um bug ou consertar tudo sozinho. "Estranhamente, funcionou."
Em janeiro de 2015, Fraid "finalmente lançou" seu projeto. Ele passou o resto do ano falando às pessoas sobre seu sucesso e a necessidade de mudar para o Python 3. Ao longo do ano, novos aliados apareceram na transição para o Python 3 no Facebook.

Um deles foi ukasz Langa, que "de alguma forma convenceu o Instagram a mudar para o Python 3". Em 2016, Langa formou uma nova equipe de controle do Facebook, chamada
“Departamento de Marcha Estúpida” . Por serem a "equipe Python", a "autoridade fictícia" mencionada acima funcionou; as pessoas pensavam que poderiam tomar decisões sobre Python no Facebook.
Em 2016, houve um aumento lento mas constante no uso do Python 3 na empresa. Eles conversaram sobre ele em reuniões, usadas em novos projetos. A opinião estava mudando, embora o Python 3 ainda não fosse considerado a versão padrão e os projetos voluntariamente optaram por usá-lo. Em maio de 2016, a sexta-feira anunciou sua intenção de mudar o sistema de compilação para o Python 3 por padrão. A idéia foi totalmente apoiada, então, alguns dias depois, a troca foi realizada - sem consequências negativas.
No final de 2016, a equipe do projeto divulgou um relatório com os resultados da mudança para o Python 3. Os desenvolvedores simplesmente lançaram
2to3 no código e corrigiram todos os pontos que ele jurou. Quando o código recebido foi iniciado, verificou-se que era 40% mais rápido e utiliza apenas metade da memória. Isso apontou para um mito que a sexta-feira costumava encontrar: o Python 3 é mais lento que o Python 2. Isso pode ser verdade para versões anteriores do Python 3, mas no momento não é relevante.
Coisas boas
No início de 2017, o Instagram concluiu a migração para o Python 3 e o Facebook estava colhendo as recompensas de um "futuro glorioso onde você pode desfrutar de coisas boas". A atualização da versão do Python não foi um processo tão assustador e abriu a possibilidade de usar novos recursos. Agora, os desenvolvedores do Facebook podem se concentrar em questões como novos recursos de digitação estática ou migração de serviços para o uso de assíncrono. "Python no Facebook é divertido de novo."
Um novo problema - as pessoas perguntam quando é possível recusar o suporte ao Python 2. Quando regressões aparecem no suporte de bibliotecas ou módulos do Python 2, os desenvolvedores frequentemente perguntam se podem simplesmente mudar para o Python 3. O problema é o oposto do que era há alguns anos atrás. "Oh, que maravilhoso o mundo em que vivo."
Durante a palestra, Freide mostrou um gráfico dos pontos de entrada do Facebook para o serviço Python a partir do terceiro trimestre de 2015 - naquele momento, havia apenas 4 pontos no Python 3. No momento da transição para o Python 3, em meados de 2016, 4% de todos os pontos já estavam Python 3. Em março de 2018, seu número excedeu 50%; em meados de maio, na época da palestra, havia 55% das "dezenas de milhares de pontos de entrada do Facebook". De acordo com Freud, a empresa agora tem vergonha de escrever código que só roda em Python 2.
Então sexta-feira analisou o processo. Ele observou que mais precisa ser feito do que apenas criar algo novo; você precisa levar os desenvolvedores a isso, "sendo a mudança que você deseja ver". Precisamos atrair pessoas, mesmo que elas não entendam que ajudam. Isso é facilitado por testes de linter e unidade. É muito importante ensinar aos novos funcionários o que você está buscando. Quando você obtiver o resultado, comemore enquanto desfruta das “coisas boas”: escreva “código legal do Python 3”. Vendo como os novos recursos podem ser usados, outros também desejam trocar.
Friday respondeu a algumas perguntas da platéia. Uma pergunta era sobre como fazer essa mudança em uma organização hierárquica mais tradicional. Sexta-feira sugeriu que poderia ser ainda mais fácil, pois você não precisa convencer milhares de desenvolvedores, mas apenas uma cadeia de gerentes, começando com quem vê os benefícios da transição. Mas, por outro lado, pode ser mais difícil se a cultura da empresa for conservadora. O foco na melhoria da qualidade do código ajudará aqui. Outra questão dizia respeito ao código indivisível, que não é dividido em muitos pontos de entrada. Para essa situação, a sexta-feira sugeriu assistir à
apresentação do Instagram (vídeo no YouTube) com o PyCon 2017.
Outras organizações podem aprender muito com essa palestra, mas é claro que é importante ter um apoiador teimoso, pronto para controlar e coordenar todo o processo. As empresas que planejam essa transição precisarão de um homem como a Fraid.
O FIM
Estamos aguardando uma pergunta e comentários que você possa deixar aqui ou perguntar diretamente a
Stas em sua
lição aberta .