Como desenvolvedor sênior focado em TypeScript, passei os últimos anos imerso em um ecossistema altamente expressivo e dinâmico. O TypeScript me oferece uma tipagem estática poderosa, integração nativa com o universo JavaScript e uma curva de aprendizado suave. É a minha casa.
No entanto, a tecnologia é cíclica e o conforto pode ser perigoso. Recentemente, decidi encarar um novo desafio e “descer” alguns degraus na abstração: decidi aprender Golang. Neste artigo, compartilho como tem sido ver o mundo do Go através das lentes de quem respira TS.
O Background: Do Clipper ao Runtime Moderno
Há alguns anos atuo no desenvolvimento de software e, nesse tempo, acumulei uma “bagagem” variada. Já mergulhei fundo em código legado — incluindo experiências com sistemas em Clipper— e naveguei por stacks modernas.
Entre todas as linguagens com as quais tive contato, a que mais me conquistou foi, sem dúvida, o TypeScript. E, por favor, não me entenda mal: não estou falando apenas de usar React para montar páginas como um “front-enzo”. Embora minha atuação tenha raízes fortes no front-end, sempre fui apaixonado pelo back-end.
Mergulhei nesse ecossistema explorando o Node.js, Deno e, mais recentemente, o Bun. Liderei a construção de servidores que conversavam com bancos relacionais, utilizando desde frameworks opinados como NestJS até servidores “crus” e performáticos com Fastify.
Foi com o TypeScript que consolidei meus conceitos de arquitetura de software e design de código. Estudar Programação Orientada a Objetos (POO) — meu foco principal com TS — e revisitar a programação procedural foram experiências que moldaram a forma como penso e escrevo soluções hoje.
A Inquietação: O Perigo da Zona de Conforto
De um tempo para cá, enquanto ouvia podcasts como o Código Fonte TV e Café Debug, ou assistia aos vídeos do mano Deyvin para descontrair, uma realização me atingiu: eu estava estagnado na minha zona de conforto.
O cenário era sempre o mesmo: Postgres ou MySQL, pareados com TypeScript ou Python. A única variação era a biblioteca ou a abordagem arquitetural. Minhas dúvidas haviam se tornado repetitivas:
- “Uso Sequelize, TypeORM ou arrisco um SQLAlchemy no Python?”
- “Faço sanitização de queries na mão ou confio no ORM?”
- “Monolito ou microsserviços?”
Sim, às vezes é frustrante ter um certo lastro na área e ainda gastar energia em dúvidas que parecem “infantis”, mas que na verdade são apenas a rotina segura.
O mundo da tecnologia é vasto demais para ficarmos presos a uma única caixa de ferramentas. Todos os dias surgem novidades tentando matar as antigas (RIP Flutter e PHP? Brincadeira… ou não). Buscando conteúdo mais profundo sobre Estruturas de Dados e Algoritmos, acabei esbarrando nas linguagens de “nível médio” (ou baixo nível, para os mais puristas): Zig, Rust e a protagonista deste post, Golang.
Choque Cultural: TypeScript vs. Golang
Aprender Go tem sido um desafio prazeroso. A linguagem me aproximou de problemas que runtimes de alto nível, como Node.js e Python, abstraem completamente. Nada que chegue aos pés de problemas de alocação de memória ou sistemas de build complexos, mas ainda assim, lidar com certos níveis de preciosismos que linguagens “mainstreams” escondem de nós é um pouco dolorido no início.
O contraste inicial é brutal. Go é minimalista por natureza. Eu costumava achar que o papo de “simplicidade do Go” era sensacionalismo de fã, mas é a pura verdade. É impressionante como, escrevendo pouco e sem “mágica”, as coisas tomam forma.
Um exemplo bem claro de como a cultura de cada linguagem pode quebrar nossa mente, foi quando descobri que Go não tinha try/catch. MInha mente deu um nó. Estou tão acostumado a encapsular erros e tratá-los em blocos, seja no ambiente node ou em java… Em Go, o tratamento de erros é explícito, procedural e onipresente.
if err != nil {
return nil, err
}
Isso força você a lidar com a possibilidade de falha na hora, e não delegar para um handler genérico lá no topo da pilha. Loucura pra mim no início!
Outro ponto de contraste foi a forma de tratar Promises. Aliás: não tratar Promises! Saí das Promises e async/await e parar no mundo das Goroutines e Channels é uma mudança de paradigma. Enquanto no Node brigamos com o Event Loop em uma única thread, no Go gerenciamos threads leves (goroutines) que escalam aos milhares com facilidade. A manipulação de ponteiros e o gerenciamento de memória, embora não sejam manuais como em C, exigem uma atenção que eu havia “terceirizado” para o Garbage Collector da runtime que utilizava (ora bun, ora deno, ora node).
Pragmatismo como charme
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.
#golang #webdev #bolhadev #carrer #carreira

1 thought on “De TypeScript a Golang: Saindo da zona de conforto”