Melhorando continuamente a produtividade dos desenvolvedores da Snowflake

Uma pergunta que escuto com frequência é: "por que você ingressou na Snowflake e por que escolheu trabalhar com a produtividade do desenvolvedor?" Entrei na Snowflake para aprender com engenheiros de alto nível e fazer parte de uma cultura altamente colaborativa. Esses itens têm sido o segredo do sucesso do crescimento astronômico da Snowflake. Naquele momento, a Snowflake estava iniciando uma viagem incrível de transformação da produtividade dos desenvolvedores e eu tive que embarcar na nave antes dela decolar!
Vamos começar pelo início. Em 2012, Benoit Dageville e Thierry Cruanes fundaram a Snowflake. Engenheiros experientes da área de banco de dados, eles criaram muitos dos códigos que ainda hoje ajudam o Snowflake a funcionar. Nossos fundadores acreditam que todos os engenheiros devem criar código, independente do tempo que tenham dentro da empresa. Realizar o trabalho na prática permite que nossos CTOs e arquitetos mais experientes conheçam exatamente qual é a situação real da produtividade dos desenvolvedores e entendam com mais precisão as dificuldades diárias, a viabilidade dos prazos e as promessas das soluções.
A Snowflake teve um rápido crescimento, contratou os melhores talentos e isso levou a base de código a se expandir com rapidez. Como uma empresa de produto único, o produto Snowflake inevitavelmente tornou-se mais complexo e rico em recursos com o tempo. Sendo assim, ao longo dos anos, nossos testes colaterais cresceram sem controle, o ambiente de desenvolvimento tornou-se cada vez mais complexo e o tempo alocado para criação e teste diminuíram significativamente, afetando de modo negativo a produtividade do desenvolvedor. Além disso, a infraestrutura para dar suporte aos sistemas era pouco confiável sob alta carga de trabalho, exigindo a repetição de testes manuais e frustrando os desenvolvedores com a queda de produtividade. Apesar das primeiras tentativas de reverter esse quadro, a centralização e o dimensionamento de nossas ferramentas não tiveram sucesso.
No começo de 2023, demos início a iniciativas para melhorar a integração contínua (continuous integration, CI) e os ambientes de desenvolvedores, mas esses avanços foram lentos. No final de 2023, a estratégia exigia um reelaboração completa para que pudesse funcionar.
Identificamos quatro ingredientes principais para essa reinicialização: prioridade de liderança, medição, conexão com o cliente e responsabilidade.
Prioridade da liderança
Nossa liderança define a produtividade do desenvolvedor como uma alta prioridade para toda a empresa, com revisões mensais do CEO e da equipe de liderança executiva. O CTO da Snowflake, S. Muralidhar, está profundamente envolvido em definir metas para toda a empresa e em liderar as equipes entre diferentes empresas para realizar o trabalho na prática. A produtividade do desenvolvedor levou a um aumento no número de funcionários para a equipe. Enquanto isso, voluntários de toda a empresa começaram a trabalhar na refatoração do código e melhorar a configuração de testes e tempos de execução para agilizar a reconversão do nosso sistema de desenvolvimento e dos ambientes dos desenvolvedores.
Medição
A medição é fundamental para entender se estamos no caminho certo. É fundamental medir como o sucesso é percebido do lado do cliente; e não pela nossa capacidade de cumprir metas internas. Para isso, usamos uma combinação de métricas qualitativas e quantitativas:
Métricas de operação do produto: tempo de atividade do sistema de build; número total de comandos de sistema de build por dia.
Métricas de produto percebidas pelo usuário: latência de desenvolvimento e teste; porcentagem de espaços de trabalho com bom funcionamento; adoção de novos sistemas.
Métricas de resultados de jornada de usuário: média de PR por desenvolvedor por semana; latência do ciclo de vida de PR em cada estágio da apresentação de PR, primeira revisão e última revisão para fusão.
Sentimento geral do desenvolvedor: CSAT trimestral (baseado em pesquisa); áreas de maior dificuldade.
Com base nas métricas, definimos metas trimestrais ambiciosas e as monitoramos de perto. Em nossas revisões semanais das operações, analisamos em detalhes as anomalias nas métricas e chegamos a uma resolução. Quando as métricas não estão suficientemente conectadas à experiência do desenvolvedor, as revisamos e coletamos feedback atualizado do usuário para garantir consistência com a experiência vinda dos usuários.
Conexão com o cliente
Nossos clientes são engenheiros Snowflake mais qualificados. Para conquistar sua confiança e construir o ciclo virtuoso de feedback e iteração, precisamos demonstrar que 1) entendemos suas experiências, 2) estamos fazendo progresso constante e 3) repriorizamos e iteramos com base no feedback.
Nossos clientes pertencem a três categorias: usuários pioneiros, seguidores e retardatários. Os usuários pioneiros são fundamentais para dar feedback crítico, para nos ajudar a iterar. Eles divulgam as inovações para suas equipes como parceiros confiáveis para promover a adoção. Identificamos os usuários pioneiros como os capitães de cada equipe e realizamos entrevistas regulares para ficar de olho no progresso e no sentimento.
Analisamos o feedback dos usuários nas pesquisas trimestrais como uma ferramenta fundamental para priorizar o planejamento do trimestre. Realizamos entrevistas frequentes com os usuários de todos os grupos de produtos, analisando por idade, principais linguagens de programação e localização geográfica. Usamos esse feedback para ajustar as prioridades nos sprints mensais. O ritmo de trabalho e a preferência de comunicação são diferentes de acordo com a localização geográfica. Por isso, consultamos cada equipe de recursos para entender qual seria o melhor método para interagir com os desenvolvedores locais. E sempre fechamos o ciclo com os clientes, compartilhando o progresso do trabalho sendo feito para resolver seus principais pontos problemáticos e receber o feedback deles sobre o roteiro traçado.
Responsabilidade
Com contratos de nível de serviço publicados, tratamos as ferramentas de desenvolvedores como um produto voltado para o cliente. Demonstramos responsabilidade em emails semanais e atualizações duas vezes por semana nas novidades do produto. A transparência ajuda a conquistar a confiança do cliente e mantém o fluxo de feedback contínuo.
Conseguimos progredir por meio de medições, validar melhorias por meio da conexão com o cliente e demonstrar responsabilidade com as atualizações para nossos clientes. O foco acelerou o desenvolvimento e a adoção de quatro inovações: Bazel (sistema de criação), espaço de trabalho na nuvem (ambiente de desenvolvimento), SnowCI (integração contínua) e Snowfort (estrutura de teste de regressão). Cada uma das quatro áreas de inovação nos permitiu superar desafios técnicos e organizacionais.
Bazel
Nossos sistemas de desenvolvimento legados, Maven e CMake, levaram à proliferação de scripts de desenvolvimento e ferramentas inconsistentes, ampliando a curva de aprendizado para desenvolvedores que trabalham com diferentes componentes. As configurações locais eram pouco confiáveis e precisavam de repetições frequentes e de "compilações limpas" para obter sucesso, o que resultava em grande frustração entre os desenvolvedores. Ao adotar o Bazel, conseguimos gerar builds consistentes, confiáveis e rápidos. Além disso, a execução de backend remoto no Buildbarn nos permitiu realizar o desenvolvimento e o teste em paralelo, reduzindo drasticamente a latência.
Espaço de trabalho na nuvem
O antigo ambiente de trabalho de desenvolvedores em MacBook VMs não estava conseguindo atender à demanda crescente por desenvolvimento e testes do produto. Os usuários ficavam limitados a uma máquina virtual (VM) por vez e a reposição de uma VM corrompida podia levar 30 minutos e às vezes muito mais tempo. Para lidar com isso, adicionamos espaços efêmeros de trabalho na nuvem funcionando em Kubernetes, pré-carregados com o último código de checkpoint, builds em cache, IDE, ferramentas de teste e tudo o mais de que o usuário precisasse para uma rápida produtividade. Em dois minutos, um usuário pode ativar um espaço de trabalho e manter vários espaços de trabalho em paralelo, com conexão rápida dentro do data center diretamente ao cache Bazel Buildbarn.
A migração do ambiente de desenvolvimento é a mudança mais revolucionária para os fluxos de trabalho de desenvolvimento. Incentivar a adoção exigiu mais do que um excelente produto para superar a inércia. Consideramos os usuários pioneiros como os líderes de adoção, realizamos atividades divertidas e criativas para motivar os retardatários, consultamos equipe por equipe para demonstrar as vantagens do trabalho e encerramos a fase com uma rodada após a outra de feedback.
SnowCI
Historicamente, nosso sistema de CI era alimentado por scripts Jenkins dispersos e desconexos que cresceram ao longo dos anos. Corrigir e otimizar esses problemas era desafiador por causa do baixo nível de recursos de teste e do pouco conhecimento da equipe sobre toda a configuração do sistema. Ao criar internamente um sistema de clean-slate baseado em YAML, denominado SnowCI, para alimentar nossos fluxos de trabalho de CI, forçamos uma limpeza desses scripts e passamos a um sistema de CI muito mais fácil de entender, convencional e moderno. Isso nos permitiu medir de forma consistente as fases de CI, eliminar grandes partes de fluxos de trabalho personalizados e não confiáveis e nos concentrar na velocidade e na confiabilidade como nossos principais valores.
Snowfort
Nossa estrutura de teste legada foi criada há mais de uma década, sem isolamento para permitir que os testes começassem e terminassem de forma clara, sem proteções para evitar inconsistências e sem abstração para impedir a duplicação de códigos de configuração boilerplate. Foi por isso, para resolver esses problemas, que criamos o Snowfort: a estrutura de testes de regressão do Snowflake. Ele também nos permitiu dividir grandes testes colaterais em pequenos lotes, possibilitando repetir de modo rápido as falhas dos testes. Com o Buildbarn, conseguimos realizar os testes em paralelo, reduzindo a latência de CI. O isolamento nos permitiu reduzir consideravelmente a fragilidade dos testes, melhorando a confiabilidade de CI.
Progresso
Entre fevereiro e dezembro de 2024, a adoção desses quatro novos sistemas aumentou de 10% a 20% para 90% a 95%. O desenvolvimento agora é muito mais confiável e estável com latência de oito minutos. A latência e a confiabilidade de CI em diferentes estágios do pipeline melhoraram de três a seis vezes. Os ambientes efêmeros dos desenvolvedores funcionam em dois minutos, com builds em cache e ferramentas completas, preservando totalmente as configurações entre sessões. A estrutura do teste de regressão do Snowfort facilita a criação de testes confiáveis com isolamento adequado. Como resultado, o sentimento do desenvolvedor melhorou significativamente. Em nove meses, a porcentagem de clientes insatisfeitos caiu de 58,9% para 21,4%, e a porcentagem de clientes satisfeitos aumentou de 17,8% para 42,3%.

Nosso trabalho ainda não terminou. Temos ainda muito trabalho pela frente para tornar a experiência no circuito interno dos desenvolvedores mais agradável e com menos atritos. Estamos investindo na estratégia Bazel e IDE para ter builds locais em menos de um minuto e oferecer uma experiência contínua de criação e depuração para cada linguagem de programação na Snowflake. Estamos investindo no SnowCI para completar PR desde a criação até a fusão em menos de 20 minutos. Com os quatro ingredientes principais mencionados acima, estamos bem posicionados para continuar a atender bem nossos clientes.