Skip to content
Go

O Movimento Modernizer em Go: Refatoração Automatizada e Testes de Concorrência Confiáveis

Published: Duration: 6:18
0:00 0:00

Transcript

Apresentadora: E aí, pessoal, bem-vindos de volta ao Allur! Eu sou a Juliana Santos e hoje o nosso papo é para quem, assim como eu, é fã de Go, mas sabe que nem tudo são flores, né? A gente sabe que o Go sempre foi famoso pela sua simplicidade e por aquela performance absurda, mas o ecossistema está amadurecendo e entrando em uma fase que a comunidade está chamando de "Movimento Modernizer". Apresentadora: Hoje eu recebo aqui no Allur o Rafael Brandão. O Rafa é Engenheiro de Software Sênior, trabalha com Go há mais de sete anos e já viu muita goroutine dar nó em cabeça de desenvolvedor por aí. Rafa, seja muito bem-vindo ao Allur! É um prazer ter você aqui, cara. Convidado: Valeu, Juliana! O prazer é todo meu. Sou fã do podcast e falar de Go é sempre um privilégio, ainda mais agora que a linguagem está ficando, digamos, "mais inteligente" com essas ferramentas novas. Apresentadora: Pois é, Rafa, a gente ouve esse termo "Modernizer" e já imagina algo revolucionário. O que exatamente está acontecendo no ecossistema do Go agora? É uma mudança na linguagem ou nas ferramentas? Convidado: Cara, é um pouco dos dois, mas o foco principal está na produtividade. O Go sempre foi muito conservador — o que é ótimo para estabilidade. Mas agora o time do Google e a comunidade entenderam que, para manter a linguagem no topo, a gente precisa de ferramentas que ajudem a limpar a casa sozinhas. Esse "Movimento Modernizer" é basicamente sobre isso: como a gente pode usar as próprias ferramentas do Go para atualizar nosso código para os padrões mais modernos sem ter que fazer tudo na mão. Apresentadora: E aí entra o "novo" `go fix`, né? Porque assim, o `go fix` já existe faz tempo, mas parece que ele tomou um energético agora, né? O que mudou? Convidado: (Risos) Exatamente! Antigamente o `go fix` era quase que um "remendo" para quando a API da linguagem mudava radicalmente, o que raramente acontecia. Agora, ele está se tornando um motor de refatoração de verdade. A grande sacada é que ele agora consegue analisar a AST — a Árvore de Sintaxe Abstrata do código — e aplicar mudanças que não são apenas correções, mas melhorias de estilo e boas práticas. Apresentadora: Tipo aquela mudança nos literais de ponteiro, o `new(expr)`? Explica pra gente por que isso é importante. Convidado: Isso mesmo! Parece um detalhe bobo, tipo trocar seis por meia dúzia, mas na verdade ajuda muito na legibilidade. O `go fix` agora consegue identificar onde você está criando ponteiros de um jeito antigo e "traduzir" para a sintaxe nova de forma automática. Imagina você ter um projeto com 500 arquivos e querer padronizar isso. Fazer na mão é pedir para ter burnout, né? O `go fix` faz isso em segundos e com a segurança de que não vai quebrar a lógica, porque ele entende a estrutura do código, não é um simples "buscar e substituir". Apresentadora: Massa! E isso tira um peso enorme das revisões de código, né? Em vez de o revisor ficar apontando detalhe de sintaxe, ele foca na lógica. Mas agora, Rafa, quero entrar num tópico que eu sei que dói em muita gente: testes de concorrência. Quem nunca meteu um `time.Sleep(500 * time.Millisecond)` num teste que atire a primeira pedra, né? Convidado: Nossa, nem me fala, Juliana! O famoso "sleep da esperança", né? (Risos). Você coloca um tempo ali e reza para a goroutine terminar antes do cronômetro. O problema é que isso é a receita para o desastre. O teste fica lento e, pior, ele fica "flaky" — uma hora passa, outra hora falha porque o processador deu uma engasgada. É horrível para a confiança do time. Apresentadora: E é aí que entra o tal do `synctest`, certo? Eu li que ele usa um "relógio falso". Como é que isso funciona na prática? Convidado: Cara, o `synctest` é libertador. Pensa assim: em vez de o seu código rodar baseado no relógio do Windows ou do Linux, ele roda dentro de uma "bolha" onde o tempo é controlado pelo teste. Esse "fake clock" permite que você diga: "Ei, finge que passou um segundo agora". O Go então avança o tempo instantaneamente para todas as goroutines ali dentro. Se tinha um processo esperando um timeout, ele dispara na hora. Apresentadora: Gente, que demais! Então eu não preciso mais esperar o tempo real passar? Convidado: Exato! Se você tem um teste que precisa validar um timeout de 10 minutos, o seu teste não vai levar 10 minutos. Ele vai levar milissegundos. E o mais legal: é determinístico. Se rodar mil vezes, vai dar o mesmo resultado mil vezes, porque você eliminou a aleatoriedade do tempo do sistema. É o fim dos testes que falham "do nada" no CI. Apresentadora: Poxa, isso resolve um dos maiores gargalos de quem trabalha com sistemas distribuídos e alta concorrência em Go. Mas vem cá, para quem está ouvindo a gente e tem aquele projeto legado, meio bagunçado... por onde começar a aplicar essa "modernização"? Convidado: Minha dica é: comece pelo básico. Roda o `go fix` na sua base de código e veja as sugestões. É um aprendizado constante, sabe? Você vê o que a ferramenta sugere e entende o "porquê" daquilo ser considerado melhor agora. E sobre o `synctest`, comece substituindo aqueles testes de concorrência mais chatos, que vivem quebrando. É um caminho sem volta, depois que você experimenta o determinismo, você nunca mais quer ver um `time.Sleep` na vida. Apresentadora: É tipo sair das trevas e ver a luz, né? (Risos). Eu acho sensacional como o Go, mesmo sendo uma linguagem que preza pela estabilidade, não fica estagnada. Ela evolui para facilitar a nossa vida. Convidado: Com certeza. O Go está mostrando que maturidade não significa ficar parado. Significa criar ferramentas melhores para quem já está no campo de batalha. Apresentadora: Com certeza! Bom, pessoal, esse foi o nosso mergulho no Movimento Modernizer. Deu para ver que o futuro do Go é automatizado e, acima de tudo, muito mais confiável. Convidado: Valeu demais pelo convite, Juliana! Quem quiser saber mais, é só dar uma olhada na documentação oficial do Go sobre o `synctest` e as novas flags do `go fix`. Tem muita coisa boa vindo por aí. Valeu! Apresentadora: Show! E para você que ouviu a gente até aqui, muito obrigada pela audiência. Se você gostou desse episódio, compartilha com aquele seu colega que ainda sofre com testes "flaky". A gente se vê no próximo episódio do Allur. Valeu por sintonizar e até a próxima!

Tags

Go Golang testing modernization concurrency go fix synctest