domingo, 22 de abril de 2012

Por que estou aprendendo Node.js?

Muitos de vocês (se não todos) sabem que eu sou um kra que abraçou a linguagem Python como minha preferida para fazer meus pequenos projetos. Eu escrevo códigos em Python quase todos os dias para resolver pequenos problemas diários. Eu também programo em Django, bem pouco na verdade, mais como diversão do que como um modo de ganhar a vida.

Inevitavelmente, enquanto estou escrevendo código de backend (tentando escrever APIs, códigos utilitários, whatever) eu não tenho muita chance de exercitar minhas habilidades desenvolvendo interfaces. Não faz muito sentido pra mim, dadas as minhas habilidades e conhecimento como programador, me envolver com o desenvolvimento de interfaces. Normalmente eu deixo isso pra quem têm mais afinidade com essa área. Por essa razão, meu conhecimento dessa área é bem deficitário.

Nos últimos meses, minha falta de conhecimento em desenvolvimento de interfaces têm me deixado irritado. Eu gosto de pensar em todo o problema, desde o mais profundo código até à sua superfície, pensando na maneira como o usuário deveria interagir com uma interface (a qual eu decididamente não tenho habilidade de construir). O que me deixa irritado, na verdade, é que quando eu tenho uma idéia, eu escrevo o backend todo da aplicação em pouquíssimo tempo, e depois gasto meses em uma auto-discussão filosófica sobre como criar a interface e fazer com que ela pareça pelo menos decente para uso.

Designers de Interface, eu INVEJO vocês, que conseguem pensar numa interface em um intervalo para o café!



Desde que eu comecei a escrever sites para colocar meus conteúdos, a linguagem javascript mudou significativamente. Antes ela era usada mais como um brinquedo pra fazer coisinhas legais nas páginas, com DHTML. Hoje, a linguagem é bem mais robusta e pode tanto ser usada como uma linguagem de propósito geral tanto no lado cliente (backbone.js), no lado do servidor (node.js) e inclusive no banco de dados (mongodb). Isso me surpreende, claro!

Então, depois de tantos anos ignorando a existência do Javascript como uma linguagem de verdade, eu decidi levá-la um pouco mais à sério e estudar essa linguagem.

Meu foco não é muito grande. Eu quero simplesmente conseguir programar decentemente em Javascript, que nem eu programo hoje em Python, em Java e como eu já programei em Delphi alguns anos atrás. Para isso, eu defini alguns objetivos, apesar de saber que alguns deles eu não vou ter tempo para desenvolver, que são:

  1. Usar essas frameworks e ferramentas em Javascript que têm por aí hoje (Node.js, MongoDB, Backbone.js);
  2. Usar o Javascript (e ferramentas) para criação de interfaces HTML mais interativas (MooTools, Script.aculo.us, Pyjamas, jQuery);
  3. Escrever meu próprio código javascript (sem me sentir um idiota no processo);
  4. Colaborar com algum projeto relacionado com Javascript;

Já que eu sou familiarizado com os vários conceitos relacionados à programação, eu estou pulando boa parte daquele material feito para quem está aprendendo a programar, e que está presente em 2/3 dos posts e livros sobre Javascript que estão aí no mercado. Os livros que estou lendo no momento para isso são os seguintes (todos em PDF, não comprei nenhum hahahahaha):

  1. JavaScript: The Definitive Guide: Activate Your Web Pages;
  2. JavaScript: The Good Parts;
  3. JavaScript Patterns;

Eu recomendo que você não seja tão hipócrita como eu e compre os livros, pq né? É $$ pro autor que escreveu, e todo aquele blah blah blah das editoras e talz.

Então... Para desenvolver minha nova habilidade de Javascript-fu eu decidi dar uma chance ao Node.js. Como eu aprendo melhor quando estou lidando com aplicações em linha de comando e terminais interativos (Obrigado Python e Ruby por me introduzirem nesse caminho) eu pensei "Ohh, Node.js pode ser uma boa escolha!"

Se você não está familiarizado com Node.js (se sim, por que vc está lendo isso?), esta é uma implementação de servidor da linguagem Javascript, feita utilizando a engine do Google Chome, chamada V8 Engine. Node.js é uma linguagem como Ruby e Python, ou seja, possuem um interpretador de comandos Javascript que vc pode executar do terminal (e acredite, vc não precisa de um navegador pra mexer com Node.js). Outra coisa que me agradou é que a linguagem vêm com um maravilhoso gerenciador de pacotes, o que torna o trabalho de adicionar novas funcionalidades e construir pacotes reutilizáveis uma tarefa fácil.

Uma coisa engraçada aconteceu quando eu comecei a ler sobre Node.js e outras frameworks que usam o conceito de desenvolvimento event-driven e Comet (Twisted, Cramp e Cool.io). Muitos blogs e pessoas por aí estão falando mal de Node.js, que é enganação, que é o fim do mundo em 2012, e coisas do tipo. Eu pessoalmente não vi nada dessa histeria generalizada quando fui começar a escrever meus primeiros códigos em Node.js. Acho que têm muito a ver com meu post "Dia do Programador 2011: Vantagens de ser um Programador Poliglota" no sentido que essas pessoas que se decepcionaram com Node.js e fizeram benchmarks que provam que o Node.js não é essa coca-cola toda estão simplesmente sendo fanboys das suas linguagens preferidas ou, nos casos mais sérios, aplicando técnicas de desenvolvimento que não se alinham com a filosofia de desenvolvimento do Node.js.


Com certeza nesse momento, alguns haters vão comentar alguma coisa, mas o fato é: Se vc seguir a filosofia de desenvolvimento a que se propõe o Node.js, vc conseguirá tirar bastante proveito da linguagem. E qual é essa filosofia? A filosofia por trás do Node.js é a de seu código ser reativo em vez de proativo. Você desenvolve seu código para responder à eventos que venham à ocorrer e não se preocupa em saber quando eles ocorrem. Isso é serviço da framework Node.js. Quando o evento ocorrer, ela irá chamar o método que você definiu para aquele evento. É uma programação event-driven ou para os Javeiros de plantão, orientada baseada no Design Pattern Observer. Outra coisa, em Node.js vc não se preocupa com I/O pois até ela é tratada sob o conceito do padrão Observer.

O Node soluciona problemas mudando a forma como uma conexão é feita no servidor. Em vez de iniciar um novo encadeamento do SO para cada conexão (e alocar a memória correspondente com ele), cada conexão cria um processo, que não requer que o bloco de memória o acompanhe. O Node alega que nunca ocorrerá um impasse de bloqueios, pois não são permitidos bloqueios e ele não bloqueia diretamente para realizar chamadas de E/S. O Node também alega que um servidor que o execute pode suportar dezenas de milhares de conexões simultâneas. De fato, o Node altera o panorama do servidor ao mudar o gargalo do sistema inteiro do número máximo de conexões para a capacidade de tráfego de um único sistema.

Portanto, agora que você tem um programa que pode tratar dezenas de milhares de conexões simultâneas, o que você pode de fato criar com o Node? Seria ótimo se você tivesse um aplicativo da Web que exigisse tantas conexões. Este é um daqueles problemas do tipo "se você tem esse problema, ele não é um problema".

Sinceramente, essa forma como o Node.js está trabalhando com Javascript usando o padrão para ocultar as coisas mais chatas como bloqueios de I/O torna as coisas bem mais fáceis para o desenvolvedor. Não nego que a linguagem deva ter suas falhas, pois todas têm, mas não acho que realçar as falhas de uma linguagem ajude mais do que simplesmente fazer FUD ou descrédito pela idéia. Falhas existem, e se existem, a gente têm de ser consciente delas e corrigí-las ou se não for possível (por motivos técnicos ou de conhecimento) dar a volta e evitar o erro. Simples assim.

O importante é que, depois de brincar um pouco com Node.js, eu decidi continuar a estudar e aprender mais sobre essa framework. Ela está sendo extremamente importante no meu aprendizado de Javascript e, apesar de não me ajudar em NADA com desenvolvimento de interfaces, pq no final das contas, estou aprendendo uma nova forma de fazer programação Backend, eu estou aprendendo Javascript e numa futura incursão ao desenvolvimento HTML5/XML + CSS + Javascript, pelo menos a linguagem de programação eu já saberei. Só faltará os outros dois, que envolvem um pouco de conhecimentos de design e semântica na organização de informações. Mas, tou indo bem.

Bom, é isso. Falei o que queria falar, agora comentem o que vocês quiserem comentar!

Fontes:
IBM Developer Works: O que exatamente é o Node.js?
Node.js is a Cancer

Sobre o Autor
é um afficcionado por tecnologia. Adora escrever sobre assuntos diversos como programação, misticismo, Rpg e qualquer assunto que desperte seu interesse.

Todos os comentários passam por moderação, ou seja, eles são lidos antes de serem publicados.

Não serão aprovados os comentários que:

* não sejam relacionados ao tema do post;
* contenham pedidos de parceria;
* possuam propagandas (spam);
* possuam link para divulgar seu blog;
* contenham palavrões ou ofensas a pessoas e marcas.

Contatos podem ser feitos pelo formulário de contato ou pelo e-mail.

Postar um comentário

1 comentários:

Nailson Martins. disse...

Node.JS é foda, só preciso sentar e estudar pra aproveitar as maravilhas...