Nos dias atuais e na era da informação, se torna cada vez mais fácil ter acesso a um bom conteúdo para estudar e se aperfeiçoar. Isso possibilitou que nós, desenvolvedores, tenhamos uma grande quantidade de tecnologias à nossa disposição para solucionar os problemas corriqueiros de nosso dia a dia. Este texto tem como objetivo comparar duas excelentes tecnologias que empoderam milhões de desenvolvedores ao redor do mundo. Durante este post, irei  abordar diversos pontos que considerei importantes para a escolha de uma stack e espero que talvez, encurte a sua jornada.

O NodeJS é um runtime JavaScript, construído sobre o V8, um motor de renderização, criado pelo Google e considerado por muitos, um dos maiores avanços na engenharia de software, depois do Linux e do Git. Foi criado por Ryan Dahl e apresentado em 2009. É open-source e se tornou o mais popular ecossistema multiplataforma para o desenvolvimento de aplicações. De uma forma sucinta, o V8 transforma o código JavaScript em C++ e realiza sua execução.

O Go ou Golang teve seu início em 2007, originalmente por uma equipe do Google. Em 2009, foi apresentada ao público e lançada como open-source. A equipe core de criação e design da linguagem, são ícones no mundo de desenvolvimento de software. Entre eles estão: Robert Griesemer, Rob Pike e Ken Thompson. A proposta da linguagem foi trazer boa performance, segurança e aumentar a produtividade, sendo uma alternativa ao C++ e ao Java.

NodeJS – Especificações

O NodeJS, como comentando anteriormente foi construído sobre o V8, porém, ele não se limita apenas a isso. Sua arquitetura é complexa, a estrutura principal é composta por 6 módulos distintos, que comunicam-se para permitir que as aplicações sejam executadas. Esses módulos são: V8, Libuv, http-parser, c-ares, OpenSSL e zlib. Podemos ver essa disposição de dependências na imagem a seguir:

Image Source: https://dev.to/khaosdoctor/node-js-under-the-hood-1-getting-to-know-our-tools-1465

Com a utilização de JavaScript, o código é dinamicamente tipado e vem recebendo evoluções conforme novas especificações do Ecmascript são lançadas.

Não podemos falar de Node, sem mencionar que o mesmo é orientado a eventos, assíncrono e não bloqueante. Para organizar isso, utiliza uma thread principal, para que todo o processo do event loop seja controlado. Esse é o motivo de ser chamado de single-threaded, mesmo utilizando worker threads em outros processos.

Ao contrário do que muitos pensam, o NodeJS não compila o código e executa posteriormente, assim como C ou o GO. Os códigos são compilados a tempo de execução, em um processo chamado de JIT (Just-in-time), trazendo grandes benefícios como otimização dos códigos durante a execução do programa.

Go – Especificações

Go ou Golang é uma linguagem de programação procedural e fortemente tipada, com uma sintaxe parecida com C. Apesar de sua tipagem, ela permite que ocorra uma inferência de tipos, no momento da declaração de uma variável, facilitando assim a vida dos programadores. Como comentado anteriormente, ela foi desenvolvida para ser altamente escalável e ter uma curva de aprendizagem menor que o C e o C++. Diferentemente do NodeJS, é uma linguagem compilada, que permite distribuir seus binários.

Por ser uma linguagem relativamente nova, ela foi criada com o intuito de utilizar todos os núcleos de processamento dos CPU’s modernos. Para tornar essa utilização de múltiplos cores mais amigável, foram criadas as Goroutines, que abstraem a necessidade de trabalhar manualmente com as threads.

Mesmo sendo uma linguagem compilada, GO possui um garbage collector, que foi casos de polêmicas em sua utilização em grande escala. Esse garbage collector recebeu muitas melhorias desde então.

Go instaurou uma cultura diferente das demais linguagens, sempre prezando pela simplicidade e procurando ao máximo trazer o máximo de ferramentas em seu core, facilitando assim a vida dos desenvolvedores. Essa abordagem divide opiniões, onde alguns acham que torna-se inflexível e outros acreditam que isso pode prevenir algumas decisões errôneas.

Aplicações das Tecnologias

O NodeJS está em praticamente todos os lugares. Ele é comumente utilizado para realizar a criação de API’s, com express, é utilizado em projetos React, é utilizado em aplicações desktop multiplataforma através do Eletron, é utilizado em aplicativos móveis através do React Native e também pode ser utilizado em aplicações embarcadas.

GO é geralmente utilizado para construir API’s, scripts e aplicações embarcadas. É bem versátil e tem diversas bibliotecas para a utilização em interfaces para aplicações desktop. Por se tratar de algo criado e desenhado para rodar em servidores, não é suportada na Web, apesar de ter iniciativas executando através do WebAssembly.

Curva de Aprendizado

Todo e qualquer desenvolvedor, nos dias atuais, precisa saber o básico de JavaScript, com isso, ao meu ver, a curva de aprendizagem do NodeJS é menor. Porém, GO é muito simples, possui uma boa documentação e desenvolvedores originalmente de linguagens como: Java, C#, C e C++, tem grandes facilidades na evolução.

Ferramental Disponível e Gerenciamento de Dependências

O gerenciamento de pacotes do Go é infinitamente superior ao do NodeJS. Golang cria uma pasta no repositório local do usuário, e mesmo que múltiplos projetos utilizem as mesmas dependências, elas são armazenadas uma única vez. Poupando muito espaço se compararmos com o node_modules, que requer que as dependências fiquem na mesma pasta do package.json.

Quanto ao ferramental de desenvolvimento, tanto um quanto o outro é possível escolher seu editor de código favorito, atualmente os principais dão suporte a linguagem. Existem também IDEs construídas por empresas como a JetBrains para ambas as tecnologias. 

Usando como base o Visual Studio Code, o GO se destaca em possuir um Linter que é instalado e configurado automaticamente ao iniciar um arquivo da respectiva extensão. Isso facilita bastante, pois tudo é baixado diretamente pelo editor e requer apenas uma extensão. No NodeJS para termos um bom linter, é necessário baixar a extensão e configurar manualmente os arquivos no projeto.

Em questão de bibliotecas, o NodeJS tem uma grande vantagem, tendo uma comunidade maior, com mais variedade e possuindo inúmeros projetos open source maduros, bem codificados e consolidados. GO tem uma comunidade em constante crescimento, e cada vez mais, novas bibliotecas são criadas e disponibilizadas no Github.

NodeJS tem frameworks muito populares e maduros, como Express, NestJS, LoopBack, etc. Enquanto o GO possui frameworks com uma popularidade menor, porém, muito eficientes, como o GIN, Fiber, etc.

Mercado

O mercado de tecnologia como um todo está bem aquecido. Para ambas as linguagens, existem bastante vagas em aberto, a diferença existe na busca de perfil, onde as vagas para GO, buscam geralmente pessoas com mais experiência na área. Isso não quer dizer que não existam vagas, para Junior, porém, se compararmos com o NodeJS, esse número é menor.

Quanto a empresas que utilizam determinada tecnologia, para o NodeJS podemos citar, Uber, Netflix, Paypal, Trello e muitas outras. O GO também está tendo uma rápida adoção e já temos casos de uso no Mercado Livre, Twitch, SendGrid, Dropbox e o próprio Google. Também vale salientar que o Docker, Kubernetes e o Terraform são construídos nesta tecnologia.

Performance

Para comparar a performance, me baseei em dados do TechEmpower, um dos mais renomados benchmarks, com os testes mais efetivos e em diversos segmentos. No atual momento que escrevo este texto, o Round é o 19.

Acredito que um dos testes mais relevantes são os de Data Updates, onde é bem perceptível que os frameworks Go, tem grande vantagem:

Desconsiderando o es4x, que é o JavaScript rodando no Vert.x, os frameworks escritos em GO dominam o ranking da posição 2 à 20, aparecendo sutilmente o Fastify.

Em outro cenário, realizando múltiplas requisições no banco de dados, podemos perceber novamente que o Go tem uma grande vantagem:

Também dominando as 20 primeiras posições do ranking, desconsiderando novamente o es4x.

Conclusão

O GO tem claramente um melhor gerenciamento de dependências, mais performance e está em um mercado ascendente, onde aqueles que se aventurarem em seu profundo entendimento, poderão colher bons frutos. Porém, é recomendado para equipes mais maduras, que tenham a capacidade de manter uma arquitetura de microsserviços e as aplicações Frontend desacopladas. 

NodeJS tem um mercado maior, com uma curva de aprendizado menor e possibilita que desenvolvedores possam atuar em diferentes partes da arquitetura, sem ter que aprender uma nova tecnologia. Tem uma performance aceitável e uma quantidade de frameworks e bibliotecas exuberante.

Ao comparar duas tecnologias, a ideia não é definir qual é a melhor e sim explanar as diferenças para que a escolha seja a mais adequada para um determinado contexto.

Autor: Francisco Felipe de Lima.

Fonte de referências:

https://productcoalition.com/reasons-why-golang-is-better-than-other-programming-languages-4714082bb1b1#:~:text=Golang%20emerged%20as%20an%20alternative,scalable%20servers%20and%20software%20systems.

https://www.geeksforgeeks.org/golang/?ref=lbp

https://www.quora.com/What-kind-of-applications-or-software-can-you-make-with-Golang

https://github.com/gofiber/fiber

https://medium.com/@blogger.ashishsharma/golang-vs-node-js-comparison-and-why-developers-prefer-node-js-9e669319df52

https://dev.to/khaosdoctor/node-js-under-the-hood-1-getting-to-know-our-tools-1465

https://blog.bitsrc.io/the-jit-in-javascript-just-in-time-compiler-798b66e44143

https://blog.gopheracademy.com/advent-2018/go-in-the-browser/

https://docs.gofiber.io/benchmarks https://www.techempower.com/benchmarks/