DEV Community

Cover image for Explorando Golang com olhos de um dev sênior em TypeScript
Victor Lima Reboredo
Victor Lima Reboredo

Posted on

Explorando Golang com olhos de um dev sênior em TypeScript

Introdução

Como desenvolvedor sênior em TypeScript, passei anos imerso em um ecossistema altamente expressivo, dinâmico e repleto de ferramentas que facilitam o desenvolvimento web moderno. TypeScript me oferece tipagem estática poderosa, integração nativa com bibliotecas JavaScript, e uma curva de aprendizado suave para quem vem do mundo do JS. No entanto, recentemente, decidi encarar um novo desafio: aprender Golang.



Há alguns anos venho atuando no desenvolvimento de software e, nesse tempo, acumulei uma boa variedade de experiências. Já mergulhei em código legado — alguns verdadeiramente marcantes, como sistemas escritos em Clipper (xBase) — e também trabalhei com stacks bem mais "moderninhas", como Python e TypeScript, usando até o Deno em alguns projetos.

Entre todas as linguagens com as quais tive contato, a que mais me conquistou, sem a menor dúvida, foi o TypeScript. E não, não estou falando apenas de usar React (sim, estou sendo um pouco pejorativo aqui) para montar páginas web e controlar estados como um verdadeiro "front-enzo". Minha atuação foi principalmente front-end, mas sempre amei estar no back-end também e me aprofundei consideravelmente nesse ecossistema, explorando o Node.js, Deno e - mais recentemente - a runtime Bun.

Já estive à frente da construção de servidores back-end que conversavam com bancos relacionais — em sua maioria — tanto com frameworks completos como o NestJS quanto com servidores mais leves e "crus", usando Express ou Fastify. Todas essas experiências foram extremamente enriquecedoras e moldaram muito da forma como penso e escrevo código hoje. Além disso, foi com essa linguagem que pude colocar em prática pensamentos meio soltos relacionados à arquitetura de um software e até ao design de código dos projetos que criei (a maioria privado, mas muita coisa disponível publicamente). Estudar Programação Orientada a Objetos — que era o foco principal da minha abordagem com TS — e também revisitar a programação procedural foi uma ótima experiência que eu tive com o typescript. Tem sido um forte companheiro nesses poucos anos de carreira.

De um tempo para cá, estava ouvindo alguns ótimos podcasts como o Código Fonte TV, Café Debug e assistindo os vídeos do mano Deyvin para distrair a mente e me ocorreu que eu estava há um tempo em minhas "zonas" de conforto. Sempre a mesma stack: postgres ou mysql com typescript ou python. A única variação era a lib, ou até o método de abordagem. As perguntas eram sempre: "Ah, vou usar sequelize (gosto mais de typeorm e sqlalchemy para python) como ORM? Aliás, vou usar ORM ou faço algo mais hard com sanitização de queries, etc?", então "Bom, eu posso usar um PDO com doctrine ou ZendFramework/Laravel?" ou então "Faço um monolito, microsserviços, monorepo?" - sim, às vezes é um saco ser pleno e ainda ter algumas dúvidas infantis.

Pensando nisso, comecei a me aventurar a descobrir novos horizontes. Quer dizer, o mundo da tecnologia é tão amplo e sofisticado. Nunca temos uma resposta definitiva, há sempre algo apropriado para um problema específico. Mas mesmo assim, todos os dias surgem coisas novas e tentam matar outras coisas (RIP Flutter). Em minhas pesquisas pessoais e buscas por mais conteúdo profundo sobre programação, além de ter me dedicado a mais estudos referentes a estruturas de dados e algoritmos, me deparei com linguagens de mais "baixo nível". Eu na verdade, as chamo de nível médio kkkkkk. Dentre elas: zig, rust e a linguagem que dedico esse post: golang.

Aprender golang está sendo um desafio extremamente prazeroso e tenho conseguido estar mais perto de problemas que, linguagens quase que humanas como python e typescript, nos suprimem de conhecer. Algumas coisas interessantes são os controles de threads, os controles de erros (quando descobri que golang não tinha try/catch minha mente deu uma explodida, confesso) e até mesmo a manipulação intensiva de ponteiros e seu uso dinâmico. Mas vamos por partes...

Logo de cara, o contraste entre as duas linguagens é significativo. Golang é realmente minimalista por natureza, e eu achava que isso era uma espécie de sensacionalismo. É impressionante como que escrevendo pouco, as coisas tomam forma de maneira bem fluída e simples. Ele remove toda a "mágica" que frameworks e abstrações em TypeScript muitas vezes introduzem, forçando você a pensar de maneira mais direta, próxima ao metal. A ausência inicial de generics (que felizmente agora fazem parte da linguagem), o modelo de concorrência com goroutines e channels, e até mesmo a maneira pragmática como erros são tratados (sem exceções!) representam uma nova mentalidade.

Há algum tempo atrás vinha escrevendo sobre conceitos-chave da orientação a objetos e do mundo de linguagens de alto nível. Mas golang é uma linguagem pragmática, que se utiliza fortemente de padrões de programação funcional e procedural, o que foi uma quebra de padrões para mim, mais acostumado com o foco em OO que tive com TS. Aprender Go é como reaprender a programar com foco em simplicidade e performance. Tudo parece mais enxuto, mais pragmático — às vezes até cru. Mas é exatamente aí que mora a beleza da linguagem. Ela é rápida, consistente e feita sob medida para sistemas concorrentes, APIs robustas e aplicações de back-end em larga escala. Quando cheguei nas coisas mais específicas do go, tais como defer, goroutines, channels e paralelismo, tive um pouco de dor de cabeça. Nada muito horrível de entender, mas como muitas coisas um Java da vida vai sintetizar e "mastigar" pra gente, nós não pensamos tanto. Mas quando chegamos em uma linguagem como golang, devemos estar atentos a literalmente TODAS as coisas. Além de todas essas coisas um detalhe me salta os olhos: o compilador e linter do golang deixam o código extramemente belo e legível ao forçar um padrão consistente. Ainda tenho muito a aprender, sei disso, mas devo dizer que tem sido incrível!

Conclusão

Agora, já tenho 3 projetos em golang que deixei público e que são frutos de migrações de code-bases escritas essencialmente em typescript e tenho gostado muito dos resultados. Linguagens de programação não deveriam, definitivamente, existir para serem pivôs de richas infantis na internet sobre qual é melhor e qual é pior. Consigo perceber que Golang não substitui outras linguagens — ele complementa. Enquanto python, java, node e até C# brilham em produtividade e expressividade, Go se destaca em performance, escalabilidade e manutenibilidade em ambientes de alto desempenho. Basta você escolher a melhor para auxiliar sua abordagem.


Link para meu github

#golang #webdev #bolhadev #carrer #carreira

Top comments (0)