O Bom e o Mau do Desenvolvimento de Aplicações Web Node.js

author
19 minutes, 31 seconds Read
CONTEÚDO

Tempo de leitura: 13 minutos

Sendo a linguagem de programação mais popular, o JavaScript é também uma das tecnologias de desenvolvimento de software mais universais. Tradicionalmente utilizado como uma ferramenta de desenvolvimento web frontend, tornou-se também uma importante ferramenta de desenvolvimento móvel multi-plataforma como tecnologia básica para um grande número de plataformas, tais como Apache Cordova/PhoneGap, React Native, NativeScript, Appcelerator Titanium.

Mas as áreas de aplicação para JavaScript não terminam aqui. Ultimamente, tem havido muito buzz em torno do uso do JavaScript para programação do lado do servidor. Uma das ferramentas que indicou esta mudança no desenvolvimento web foi Node.js.

O que é Node.js?

Node.js na verdade não é um framework ou uma biblioteca, mas um ambiente de execução, baseado no motor JavaScript V8 do Chrome.

A tecnologia foi introduzida pela primeira vez em 2009 por Ryan Dahl no JSConf anual europeu e foi imediatamente reconhecida como “a mais excitante peça única de software no universo JavaScript actual”.

Como um projecto open-source, o Node.js foi patrocinado pela Joyent, um fornecedor de soluções de cloud computing e alojamento. A empresa investiu em várias outras tecnologias, como o framework Ruby on Rails, e forneceu serviços de hospedagem para Twitter e LinkedIn. Esta última também se tornou uma das primeiras empresas a utilizar o Node.js para seu backend de aplicações móveis. A tecnologia foi posteriormente adotada por uma série de líderes tecnológicos, como Uber, eBay, Walmart e Netflix, para citar alguns.

No entanto, não foi até recentemente que a ampla adoção do server-side JavaScript com o Node.js começou. O interesse por esta tecnologia atingiu o auge em 2017, de acordo com as tendências do Google, e permanece elevado.

Node.js downloads. Instale o suporte a longo prazo e as últimas versões do Node.js para Windows e MacOS aqui. Também, um lembrete – npm é distribuído com Node.js out-of-the-box.

Documentação. Encontre os documentos e guias de como começar no link.

Node.js IDEs . Quase qualquer editor de código popular tem suporte e plugins para JavaScript e Node.js, portanto, só importa como você personaliza seu IDE de acordo com suas necessidades de codificação. Mas, muitos desenvolvedores elogiam as ferramentas especiais do VS Code, Brackets, Atom e WebStorm.

Frameworks. Usar middleware sobre puro Node.js é uma prática comum que torna a vida dos desenvolvedores mais fácil. Temos um artigo separado comparando frameworks populares Node.js, onde olhamos para Express.js, Meteor, Sales.js, Koa.js, Keystone.js, e Loopback.js.

Para mais ferramentas de ecossistema JavaScript usadas com Node.js, veja o artigo dedicado.

Node.js pontos fortes e fracos fazem dele o assunto de uma discussão acalorada. Para esclarecer o assunto, analisamos ambos – Node.js prós e contras – na tentativa de descobrir quais projetos podem se beneficiar desta escolha tecnológica. Então, porque usar Node.js?

Uma explicação rápida do que é Node.js (por favor, subscreva se quiser mais conteúdo de vídeo)

Os benefícios de Node.js

⊕ Robust technology stack

JavaScript provou ser um líder indiscutível entre as linguagens de programação mais populares. Por sua vez, Node.js se tornou um nome independente na indústria. Com um total de 368.985.988 downloads e mais de 750 novos contribuidores, como indicado no relatório Node.js de 2018, o projeto parece ser mais forte do que nunca.

Using Node.js para backend, você obtém automaticamente todos os prós do desenvolvimento de JavaScript em pilha completa, como por exemplo:

  • maior eficiência e produtividade geral do desenvolvedor
  • partilha e reutilização de código
  • velocidade e desempenho
  • comunicação fácil de conhecimentos dentro de uma equipe
  • um enorme número de ferramentas livres

Consequentemente, a sua equipe é muito mais flexível, o desenvolvimento é menos demorado e como resultado, você obtém um software rápido e confiável. Desenvolvedores treinados no frontend JavaScript podem começar a programar o lado do servidor com o mínimo de esforço. Com a mesma linguagem em ambos os lados, você pode reutilizar o código no frontend e no backend, embrulhando-o em módulos e criando novos níveis de abstração.

Embora seja uma crença comum, sendo um desenvolvedor full stack você não está de forma alguma limitado ao tradicional MEAN (MongoDB, Express.js, AngularJS, e Node.js) stack. O único que deve ter neste caso é o Node.js (não há alternativa em JavaScript para programação backend). O resto das tecnologias dentro desta pilha são opcionais e podem ser substituídas por algumas outras ferramentas que fornecem funcionalidade similar (leia sobre as alternativas em nosso artigo separado).

>

⊕ Modelo de processamento rápido e baseado em eventos

Node.js é rápido; não é um mito. Dê uma olhada nos testes de performance do toptal.com, comparando como GO, PHP, Java, e Node.js lidam com pedidos simultâneos. Existem algumas razões para Node.js mostrar tais resultados:

V8 engine. O motor usado na implementação do Node.js foi originalmente desenvolvido para o navegador Chrome. Escrito em C++, o Chrome V8 é utilizado para compilar funções escritas em JavaScript em código de máquina, e faz o trabalho a uma velocidade impressionante. Basta verificar os benchmarks de desempenho no blog do V8. Graças ao investimento pesado do Google em seu motor, o V8 demonstra melhorias de desempenho a cada ano, e o Node.js extrai todo o saco de benefícios dele.

Non-blocking Input/Output e manuseio assíncrono de pedidos tornou o Node.js capaz de processar pedidos sem qualquer atraso. No contexto de backend, o processamento síncrono assume que o código é executado em uma seqüência. Assim, cada requisição bloqueia um thread, fazendo com que outras requisições esperem que ele seja finalizado. O processamento assíncrono permite que as solicitações sejam processadas sem bloquear (non-blocking I/O) o thread. Assim, depois que uma solicitação é processada, ela pode empurrar uma callback e continuar servindo as solicitações. Isso ajuda o Node.js a aproveitar ao máximo a thread única, resultando em tempo de resposta curto e processamento simultâneo.

Outro aspecto é o modelo baseado em eventos. Ao usar uma linguagem comum para ambos os lados cliente/servidor, a sincronização acontece rapidamente, o que é especialmente útil para aplicações baseadas em eventos, em tempo real. Devido à sua natureza assíncrona, sem bloqueio e com um único fio, o Node.js é uma escolha popular para jogos online, chats, videoconferências ou qualquer solução que requeira dados constantemente atualizados.

Os exemplos falam por si mesmos: muitas empresas líderes mudaram as tecnologias para o Node desenvolvido.js e notaram melhorias significativas – PayPal, por exemplo, notou uma diminuição de 35% no tempo de resposta desde a migração de Java.

⊕ Tecnologia escalável para microserviços

Por ser uma ferramenta tecnológica leve, usar o Node.js para arquitetura de microserviços é uma ótima escolha. Este estilo arquitetônico é melhor descrito por Martin Fowler e James Lewis como “uma abordagem para desenvolver uma única aplicação como um conjunto de pequenos serviços, cada um rodando em seu próprio processo e comunicando-se com mecanismos leves, muitas vezes um recurso HTTP API”

De acordo, quebrando a lógica da aplicação em módulos menores, microserviços, ao invés de criar um único e grande núcleo monolítico, você permite uma melhor flexibilidade e lança as bases para um maior crescimento. Como resultado, é muito mais fácil adicionar mais microserviços sobre os existentes do que integrar recursos adicionais com a funcionalidade básica do aplicativo.

Arquitetura monolítica vs arquitetura de microserviços em resumo

Node.js é a tecnologia de escolha ao construir e implantar soluções de ecossistema de microserviços, de acordo com o Node.js User Survey Report 2017. Cerca de metade dos entrevistados está usando tecnologias relacionadas a microserviços (a saber, Docker, a plataforma líder de contentorização de software) para construir aplicações web Node.js:

Percentagem de desenvolvedores que usam contentorização Docker com Node.js

Outras descobertas recentes mostram que tecnologias relacionadas a microserviços, como Docker e Kubernetes, experimentaram um crescimento no uso em 2018, uma vez que este estilo arquitetônico só se torna mais popular. Com cada microserviço comunicando diretamente com o banco de dados através de fluxos, tal arquitetura permite um melhor desempenho e velocidade de aplicação. Uma combinação feita no céu é suportada por dois frameworks amplamente utilizados para a arquitetura de microserviços. O framework Express lista IBM e Uber entre seus usuários, enquanto o restify é usado por npm e Netflix.

Como exemplo de implementação ao vivo, a mudança do Walmart para a arquitetura de microserviços com Node.js resultou nos seguintes benefícios imediatos:

  • Crescimento da conversão de 20 por cento à noite em geral e crescimento da conversão móvel de 98 por cento
  • Crescimento de 100 por cento de tempo de atividade na Sexta-Feira Preta-Feira Preta-Feira (lidando com mais de 500 milhões de visualizações de páginas)
  • Economia de até 40 por cento em hardware e 20-50 por cento em operações gerais

Outro exemplo brilhante de como o Node.js pode superar a concorrência em termos de desempenho é o caso do GoDaddy. Executando a campanha publicitária SuperBowl, a empresa foi capaz de lidar com 10.000 pedidos por segundo sem tempo de inatividade, usando apenas 10% do hardware graças ao Node.js.

⊕ Rich ecosystem

Uma palavra – npm, um gerenciador de pacotes padrão do Node.js, ele também serve como um mercado para ferramentas JavaScript de código aberto, que desempenha um papel importante no avanço desta tecnologia. Com cerca de 836.000 bibliotecas disponíveis no registro do npm a partir de agora, e mais de 10.000 novas bibliotecas sendo publicadas a cada semana, o ecossistema Node.js é bastante rico. As mesmas estatísticas apontam que 97% das aplicações web modernas consistem em módulos npm. E isso é prova de sua popularidade indiscutível entre os desenvolvedores.

Com uma variedade tão grande de ferramentas livres acessíveis em poucos cliques, há um enorme potencial para o uso do Node.js. Ao mesmo tempo, o software de código aberto goza de popularidade crescente, pois permite construir novas soluções reduzindo os custos totais de desenvolvimento e o tempo para comercialização.

⊕ Forte suporte corporativo

Como mencionado acima, o desenvolvimento do Node.js foi suportado pela Joyent. Em 2015, a Fundação Node.js foi criada para “permitir a adoção generalizada e ajudar a acelerar o desenvolvimento do Node.js”. IBM, Microsoft, PayPal, Fidelity, e SAP tornaram-se os membros fundadores da organização.

A lista de organizações que usam Node.js na produção está em constante crescimento. Atualmente inclui quase trezentas empresas bem conhecidas, como PayPal, Medium, Trello, Uber e Zendesk.

Muitos poucos projetos de código aberto já desfrutaram de tão forte apoio das principais empresas do mundo. E isso prediz que o Node.js tem um potencial excepcional.

⊕ Seamless JSON support

Embora outras tecnologias backend como PHP e Ruby on Rails possam usar o formato JSON para comunicação, o Node.js faz isso sem converter entre modelos binários e usa JavaScript. Isto é especialmente útil quando você precisa construir APIs RESTful para suporte a banco de dados NoSQL, como MongoDB – a letra M na pilha MEAN. Esta comunicação sem problemas com um dos principais padrões de transferência de dados é outra vantagem do ecossistema JavaScript.

As desvantagens do Node.js

Θ Gargalos de desempenho com tarefas de computação pesadas

A maior desvantagem do Node.js mesmo agora é a sua incapacidade de processar tarefas vinculadas à CPU. Mas, para entender quais são as raízes desta questão, precisamos de um pouco de contexto. Vamos começar com o básico, com o próprio JavaScript.

Como sabemos, Node.js é um ambiente de tempo de execução que executa JavaScript no lado do servidor. Sendo uma linguagem de programação frontend, o JavaScript usa um único thread para processar tarefas rapidamente. Threading não é necessário para que funcione, porque as tarefas em JavaScript são leves e levam pouco CPU.

Voltando ao Node.js, agora sabemos porque é considerado single threaded: Ele processa JavaScript, que é single threaded. Um modelo non-blocking input/output significa que o Node.js responde a chamada do cliente para iniciar uma solicitação e processa a tarefa durante o tempo em que ela dispara a chamada de retorno, já que a tarefa está pronta. Processando tarefas de forma assíncrona, o Node executa o código JS em sua única thread com base em um evento. Isto é o que chamamos de event-loop.

O problema ocorre quando o Node.js recebe uma tarefa vinculada à CPU: Sempre que uma requisição pesada chega ao loop do evento, Node.js configura toda a CPU disponível para processá-la primeiro, e depois responde a outras requisições enfileiradas. Isso resulta em processamento lento e atraso geral no loop do evento, por isso Node.js não é recomendado para computação pesada.

No entanto, em 2018, multithreading foi introduzido em Node.js como um recurso experimental com a atualização 10.5.0. Um novo recurso chamado módulo de threads de trabalhadores pode ser usado para aproveitar threads adicionais de um pool de threads, para transportar tarefas vinculadas à CPU. Mas isso só pode ser feito em máquinas com múltiplos núcleos, pois o Node.js ainda permite que você use um núcleo para uma thread. Isso significa que processos paralelos pesados podem ser executados em uma thread diferente. Este recurso permanece experimental no Node.js versão 12, mas foi significativamente melhorado.

Θ Callback hell issue

Due à sua natureza assíncrona, Node.js depende muito de callbacks, as funções que rodam após cada tarefa na fila são terminadas. Manter uma série de tarefas enfileiradas em segundo plano, cada uma com a sua callback, pode resultar no chamado inferno de callback, que impacta diretamente na qualidade do código. Simplificando, é uma “situação onde os callbacks são aninhados dentro de outros callbacks com vários níveis de profundidade, potencialmente tornando difícil entender e manter o código”

Exemplo de código com callbacks aninhados

Fonte de imagem: callbackhell.com

Yet, isto é muitas vezes considerado um sinal de padrões de codificação pobres e falta de experiência com JavaScript e Node.js em particular. O código, representado acima, pode ser refatorado e simplificado, em apenas alguns passos, como mostrado em callbackhell.com.

Θ Imaturidade de ferramentas

Embora os módulos do núcleo Node.js sejam bastante estáveis e possam ser considerados maduros, existem muitas ferramentas no registro npm que são de baixa qualidade ou não documentadas/testadas adequadamente. Além disso, o registo em si não está suficientemente bem estruturado para oferecer as ferramentas com base na sua classificação ou qualidade. Portanto, pode ser difícil encontrar a melhor solução para seus propósitos sem saber o que procurar.

O fato de que o Nó.O ecossistema js é maioritariamente de fonte aberta, tem também o seu impacto. Enquanto a qualidade do núcleo da tecnologia do Node.js é supervisionada pela Joyent e outros grandes contribuidores, o resto das ferramentas pode não ter a qualidade e os altos padrões de codificação estabelecidos por organizações globais.

Θ Demanda crescente para profissionais experientes

Apesar de uma crença comum, nem todos os desenvolvedores JavaScript são desenvolvedores do Node.js também. Dominar a programação JavaScript do lado do servidor requer um esforço significativo e um certo background no desenvolvimento de backend. Devido a uma curva de aprendizagem tão íngreme, o número de engenheiros do Node.js é significativamente menor que o número total de profissionais JS.

Como o hype sobre o Node.js continua a crescer, a demanda por profissionais experientes nesta área aumenta.

Existe uma grande lacuna de conhecimento entre os estudantes de engenharia começando em seus empregos e as necessidades dos empregadores
Source: HackerRank

Assim, com milhões de desenvolvedores de JavaScript por aí, pode ser difícil encontrar um profissional qualificado do Node.js para o seu projeto. Neste caso, você certamente não quer limitar sua busca a apenas um país. A procura de talentos técnicos no exterior há muito tempo se tornou a norma na indústria de TI.

Como aprender o Node.js

Aqui está o seu pacote inicial para entender e trabalhar com o Node.js.

Turorials. Não se limite aos documentos oficiais: Veja toneladas de aulas grátis na W3Schools, visite workshops internacionais da Nodeschool, e claro, use a biblioteca de tutoriais grátis por freeCodeCamp.js.

Classes. Se você é um aluno dedicado, inicie um curso online no Node.js: Aqui está um no PluralSight, e claro, um no Udemy.

Aprendizagem interativa. Veja recursos gratuitos e pagos que lhe permitem aprender Node.js usando lições e exercícios interativos. Uma das mais populares é A Arte do Nodo.

Comunidade. Veja a lista oficial de projetos Node.js administrados pela comunidade. Uma dica rápida: Pesquise grupos e comunidades do Facebook na sua área/primeiro idioma. E claro, consulte as comunidades Node.js no Reddit, uma tag no StackOverflow, e o tópico no Quora.

Node.js vs Ruby on Rails vs Django vs Symfony

Não há muitas tecnologias que possam competir com a popularidade do Node.js ou com a demanda do mercado. Entretanto, se olharmos para as alternativas de programação do lado do servidor, vemos pelo menos mais três estrelas brilhantes no céu. É Ruby on Rails, Django, e Symfony. Vejamos se eles se mantêm fiéis aos benefícios do Node.js e compartilham seus inconvenientes.

Comparing Node.js, Rails, Django e Symfony stats

Source: StackShare

Ruby on Rails é conhecido por sua linguagem simples, mas opinionated e pela disponibilidade de gems – o próprio ecossistema de pacotes personalizados do Rails. O Ruby em si é uma linguagem intuitiva e amigável para principiantes com uma comunidade dedicada e de apoio que contribui com código para o RubyGems. Rails foi criado para rápido desenvolvimento e prototipagem, embora seja usado com sucesso por marcas como GitHub, Twitter e Airbnb, provando sua ampla gama de casos de uso. Sua funcionalidade de migração de dados é especialmente impressionante – ao contrário do Node.js, que usa pacotes adicionais, Rails já tem uma funcionalidade que lhe permite facilmente e consistentemente manipular seu banco de dados.

Quando você deve usar Rails sobre o Node.js? Rails não pode competir com a performance e escalabilidade do Node, entretanto, Rails pode ser uma escolha melhor para um desenvolvimento rápido. Node.js tem que usar módulos de terceiros para atingir essa velocidade de desenvolvimento, mas Ruby tem tudo isso de forma não convencional. Quanto à linguagem, nenhuma ferramenta tem uma vantagem distinta – enquanto o Node.js tem uma alta demanda mas baixa proposta, o pool de talentos do Ruby é inicialmente menor.

Django é um framework web em Python, a linguagem de programação que mais cresce de acordo com os dados do StackOverflow. Marcado como uma ferramenta para perfeccionistas com prazos, é criado para fazer aplicações o mais rápido possível e da forma mais estruturada, segura e fácil de entender. O Django, juntamente com o Python, também é considerado como tendo uma curva de aprendizagem mais suave. Enquanto trabalhar com o Node.js vai exigir um conhecimento extenso de JavaScript, Django é uma tecnologia “baterias incluídas”. Ele tem um painel de administração incorporado para facilmente atualizar e manter suas bases de dados e templates para acelerar seu trabalho.

Quando você deve usar Django sobre o Node.js? Comparado ao Node.js, o Django é uma ferramenta para iniciantes. Além da linguagem em si, não há nenhuma razão real para escolher um em vez do outro. É mais uma questão sobre seu conforto e experiência com JavaScript ou Python do que os casos específicos de uso.

Symfony é um framework PHP que automaticamente fornece mais de 20 anos de documentação, e uma comunidade massiva e ativa. Mais de 80 por cento da web é alimentada por PHP com projetos como Facebook, Baidu, ou qualquer outro site rodando no WordPress. Embora o Symfony seja apenas uma das frameworks PHP no mercado, é impressionantemente estável, escalável e funciona bem para projetos de grande escala. Ele também usa um motor de templating Twig que funciona como muitos sistemas de gerenciamento de conteúdo baseados em PHP.

Quando você deve usar Symfony sobre Node.js? Symfony naturalmente suporta recursos de CMSs como templates e painéis de administração que permite que ele execute blogs, sites de notícias e lojas de eCommerce. Alguns exemplos incluem Yahoo Answers, Dailymotion e National Geographic.

Make Node.js Shine

Obviamente, com todas as vantagens e desvantagens listadas do Node.js, a tecnologia não é uma bala de prata. Mas também não é Java, .Net framework ou PHP. No entanto, existem casos específicos onde cada uma das tecnologias listadas tem o melhor desempenho. Para Node.js, estas são aplicações em tempo real com intensa E/S, requerendo velocidade e escalabilidade.

Pode ser redes sociais, aplicações de jogos, chats ao vivo ou fóruns, bem como software de bolsa de valores ou servidores de anúncios, onde a velocidade é tudo. Rápido e escalável, o Node.js é a tecnologia de escolha para dispositivos e aplicativos IoT de dados intensivos e em tempo real.

Node.js fez do JavaScript uma tecnologia de ponta para o desenvolvimento de aplicativos web. Devido à sua arquitetura non-blocking, o Node.js funciona bem para codificação e transmissão de vídeo e áudio, upload de múltiplos arquivos, e streaming de dados. Este último pode ser extremamente útil para software da indústria de viagens, onde você precisa obter dados de diferentes APIs de diferentes fornecedores.

Recentemente, o Node.js tem sido ativamente utilizado em software de nível empresarial. Embora ainda haja muitos argumentos sobre isso, muitas grandes empresas e organizações globais, como a Capital One e NASA, já adotaram o Node.js. E o ecossistema empresarial Node.js continua a amadurecer com ferramentas como IBM API Connect, Triton by Joyent, N|Solid by NodeSource, Red Hat OpenShift, Trace by RisingStack e outros.

Este post é parte da nossa série “The Good and the Bad”. Para mais informações sobre os prós e contras das tecnologias mais populares, veja os outros artigos da série:

O Bom e o Mau do Desenvolvimento Xamarin Mobile

O Bom e o Mau do Desenvolvimento Full Stack JavaScript

O Bom e o Mau do ReactJS e React Native

O Bom e o Mau da linguagem de programação Swift

O Bom e o Mau do Desenvolvimento Full Stack JavaScript

O Bom e o Mau do .NET Framework Programming

>

O Bom e o Mau do Desenvolvimento Angular

O Bom e o Mau da Ferramenta de Automação de Testes Selênios

>

O Bom e o Mau do Desenvolvimento de Aplicações Android

Similar Posts

Deixe uma resposta

O seu endereço de email não será publicado.