Como o Braze desativou o RequireJS e modernizou nossa pilha de tecnologia de front-end

Publicados: 2021-09-24

Para milhares de profissionais de marketing em todo o mundo, o painel Braze é onde eles fazem as coisas acontecerem. O trabalho envolvido em garantir que essa interface esteja no seu melhor é realizado por uma ampla variedade de pessoas diferentes, de designers de produtos a engenheiros. E embora essas otimizações sejam frequentemente sobre a interface do usuário, com a mesma frequência, elas são sobre a tecnologia que suporta o painel.

Nos últimos anos, uma das mudanças mais significativas nessa área foi a substituição do RequireJS e a migração do painel para o Webpack , um esforço liderado pelo engenheiro de software sênior da Braze, Alex Guerra. Vamos dar uma olhada nas contribuições essenciais de Guerra para este projeto, os detalhes do processo de migração e como as melhorias de velocidade subsequentes facilitaram a resolução de problemas de codificação relacionados ao painel.

Do dia do hack à migração: como tudo começou

É engraçado dizer, mas acabei trabalhando no projeto de descontinuação do RequireJS quase por acidente. Estou trabalhando na equipe de mensagens e automação da Braze Engineering há cerca de dezoito meses, uma equipe focada em otimizar o pipeline de envio de mensagens de back-end para nosso produto principal. Em algum momento, perguntei a outro membro da equipe como funcionava o front-end e, embora ele tivesse uma vaga ideia, não sabia os detalhes exatos.

Isso me deixou curioso; Eu realmente queria entender como nosso painel funcionava. E como o Braze realiza dias de hack que permitem que os funcionários busquem projetos de paixão, decidi aproveitar o próximo dia de hack para explorar os detalhes de nosso painel mapeando e documentando o código de front-end. Por volta dessa mesma época, a equipe do painel Braze estava pensando em fazer a mudança do RequireJS para o Webpack, o que se esperava que fosse um grande empreendimento. Mas durante a minha exploração, comecei a ver um caminho a seguir que pensei que poderia ajudar a equipe do painel a automatizar parte do trabalho envolvido na atualização do software que suporta o front-end da plataforma Braze.

Mas para ter uma visão completa do que estávamos procurando mudar e por que fiquei tão empolgado com isso, você precisa entender as diferenças entre RequireJS e Webpack.

Evoluindo o Dashboard do Braze: RequireJS vs. Webpack

Então, o que é o painel Braze, afinal? No nível mais básico, é um aplicativo JavaScript de página única. E quando um profissional de marketing visita o site da Braze e faz login em nossa plataforma, a visualização da Web que ele recebe geralmente é informada por uma versão em pacote do código do painel. Esse pacote, que coleta arquivos díspares para produção, tem várias otimizações diferentes aplicadas a eles que ajudam o painel a funcionar com mais eficiência, incluindo:

  • Minificação para permitir que ele carregue mais rápido

  • Modificações automáticas de código que permitem que o painel se adapte a diferentes navegadores da web

  • Divisão de código para permitir que o código front-end seja carregado sob demanda, conforme necessário

Na Braze, esse processo de agrupamento de ativos para nosso código JavaScript foi originalmente suportado pelo RequireJS, um arquivo JavaScript e carregador de módulo projetado para uso na web. Mas, com o tempo, cresceu um consenso com a organização Braze Product and Engineering de que precisávamos evoluir a maneira como estávamos agrupando o código para o painel.

O maior fator motivador foi a necessidade de acelerar o processo de construção. Um desenvolvedor geralmente precisa passar pelo processo de compilação toda vez que quiser validar as alterações feitas em um pedaço de código, para garantir que o ajuste esteja afetando o software da maneira esperada. Uma vez que ficou claro que o Webpack – um empacotador de módulos JavaScript de código aberto – poderia realizar essas compilações complicadas de forma mais rápida e eficaz do que o RequireJS, sabíamos que era hora de fazer a mudança.

Em particular, sentimos que fazer a mudança traria três benefícios principais:

1. Uma Base de Código Unificada

Nesse ponto, o front-end do painel foi essencialmente dividido em dois, com metade escrito em CoffeeScript e construído usando RequireJS, enquanto o outro foi escrito em JavaScript e TypeScript e construído com Webpack. Como você pode esperar, compartilhar código entre as divisões era um problema e, em muitos casos, eram necessários alguns hacks muito frágeis para fazer tudo funcionar. Portanto, uma grande vantagem de fazer o trabalho envolvido na migração para um único processo foi que ele apresentou uma oportunidade de ouro para realmente unificar – e modernizar – a base de código.

2. Ciclos de feedback mais curtos

Como mencionei acima, uma das grandes prioridades associadas a este projeto foi encontrar maneiras de encurtar o ciclo de feedback para os engenheiros que trabalham no painel. Naquela época, se você fizesse uma modificação no código do front-end, o processo de agrupamento com o RequireJS levaria em média três minutos – e às vezes poderia levar até oito minutos. É muito tempo para fazer um engenheiro esperar para saber se seu código está funcionando normalmente. Com o Webpack, há um tempo de inicialização inicial que dura cerca de 90 segundos, mas cada alteração adicional pode ser realizada significativamente mais rápido, permitindo que os engenheiros usem melhor seu tempo e façam mais.

3. Solução de problemas mais eficaz

Encontrar e resolver erros de código é uma parte essencial do trabalho de qualquer equipe de engenharia. Na Braze, usamos um produto chamado Sentry que ajuda a organizar e rastrear a origem dos problemas quando eles surgem no painel de produção. Mas como esse código foi construído com o CoffeeScript com o RequireJS, quando compilado e reduzido, o nome descritivo de uma função como “navigateToPill” seria renomeado para algo como “a”. Isso, por sua vez, significava que veríamos um erro de tipo em “a” na linha um, coluna 200.000 – o que, como você pode imaginar, deu muito trabalho para determinar a origem desse erro. O Webpack, por outro lado, possui uma ferramenta chamada Source Maps que permite que as equipes peguem esse código minificado e mapeiem uma determinada coluna e linha para o arquivo de origem; isso significa que você receberia relatórios do Sentry dizendo que “navigateToPill” teve um erro em uma linha específica, tornando mais fácil resolver problemas mais rapidamente.

O processo de migração: passando do RequireJS para o Webpack

A necessidade de fazer a mudança do RequireJS para o Webpack era clara, mas a escala do empreendimento significava que eles esperavam que o processo levasse pelo menos um ano e envolvesse muita complexidade e largura de banda de engenharia para alcançar. O pensamento na época era que teríamos que passar sistematicamente pela base de código seção por seção e migrar tudo manualmente, o que seria muito oneroso.

Minha descoberta, se você quiser chamá-lo assim, foi perceber que eu poderia escrever código capaz de modificar o código do painel Braze em massa por meio de um processo automatizado - e também não modificar nosso código, se precisássemos reverter essas alterações rapidamente. Acabei fazendo uma prova de conceito seguindo meu projeto de hack day, só para mostrar que poderia funcionar, e depois continuei trabalhando nele no meu tempo livre como uma espécie de projeto de paixão.

Dito isso, as coisas realmente não decolaram até que Greg Beaver – que é engenheiro de software sênior na equipe do Braze Dashboard – se envolveu. Ele conseguiu pegar os scripts que eu escrevi como parte da minha prova de conceito e incorporá-los em uma ferramenta que poderíamos compartilhar com outros engenheiros. Isso, por sua vez, significava que poderíamos migrar do RequireJS para o Webpack sem forçar todos os engenheiros trabalhando no código relacionado ao painel a parar enquanto fazíamos isso; em vez disso, eles puderam usar a ferramenta para trazer automaticamente qualquer código em que estivessem trabalhando em sincronia com as alterações gerais.

A ferramenta acabou sendo tão rápida - leva apenas cerca de dois minutos para ser executada - e funcionou tão bem que, enquanto estávamos nos preparativos para as migrações, um engenheiro a utilizou como uma solução alternativa para as compilações lentas associadas ao RequireJS. Eles apenas converteram sua ramificação para o Webpack, fizeram a alteração que precisavam fazer e depois a converteram de volta para que pudessem comitá-la no código antigo.

Com esse novo recurso à nossa disposição, nosso plano de migração era executar a ferramenta de Greg em nossa filial principal todas as noites por algumas semanas e fazer com que as pessoas revisassem manualmente o ambiente de controle de qualidade dessa filial, apenas para ver se algo estava quebrado. Quando estávamos confiantes de que tudo parecia bem, informamos o restante da organização sobre a atualização planejada, orientamos como eles poderiam migrar seu código do RequireJS para o Webpack e informamos algumas considerações importantes antes de obterem em andamento.

Graças à nossa abordagem, um projeto que deveria levar mais de um ano acabou sendo finalizado em apenas três semanas, o que é incrível. Ainda mais inesperado foi o impacto da migração – em particular, o processo de compilação no Webpack agora geralmente leva apenas cerca de um segundo, reduzindo o tempo necessário para cada verificação de código em mais de 99%.

Na Braze, estamos comprometidos em construir um ambiente onde indivíduos como Guerra possam aproveitar ao máximo suas perspectivas e talentos únicos. Você é alguém que quer ultrapassar limites e reimaginar o que é possível? Confira nossa página de carreiras para saber mais sobre nossas vagas abertas.