Você deveria considerar Erlang para seu próximo grande projeto

Ao ler o título deste post, talvez você esteja se perguntando: por que eu deveria considerar Erlang para meu próximo grande projeto? Bem, meu objetivo com este post é te apresentar alguns importantes motivos para fazer isto.

Erlang nasceu no laboratório de ciência da computação da Ericsson na década de 1980, influenciada por linguagens como ML, Ada, Module, Prolog e Smalltalk, quando um time de três cientistas – entre eles, o grande Joe Armstrong receberam a missão de descobrir qual seria a melhor linguagem de programação para escrever a próxima geração de sistemas de telecom. Após dois anos de investigação e prototipação, estes cientistas descobriram que nenhuma linguagem era completa o bastante para tal objetivo e, conclusivamente, decidiram criar uma nova linguagem. Nasceu então Erlang, the Ericsson Language.

De lá pra cá, Erlang tem sido evoluida e usada para escrever grandes sistemas críticos, porque é exatamente nesse cenário que Erlang faz mais sentido. Se seu projeto é construir um sistema crítico, altamente tolerante a falhas, com disponibilidade 24×7 e veloz como o papa-léguas, sim, Erlang é para você. Mas se não é bem esta sua necessidade, se você quer apenas construir um pequeno sistema, com baixa concorrência, poucos usuários, pouca necessidade de performance e possibilidade de passar horas down em manutenção, não, você não precisa de Erlang. Que tal Basic?

Diferente de algumas linguagens que nascem para encontrar um nicho, Erlang nasceu com um problema a ser resolvido, com requisitos a serem atendidos. Tolerância a falhas, concorrência realmente pesada, computação distribuída, atualização da aplicação sem derrubá-la, sistemas de tempo real, este é o nicho de Erlang; foi para isto que Erlang nasceu.

Quem usa Erlang atualmente?

Além da Ericsson, é lógico, há algumas outras grandes empresas e projetos usando Erlang, como por exemplo:

Facebook, no backend de seu sistema de chat, lidando com 100 milhõs de usuários ativos;
Delicious, que tem mais de 5 milhões de usuários e mais de 150 milhões de bookmarks;
Amazon SimpleDB, o serviço de dados do seu poderoso EC2;
Motorola, CouchDB, RabbitMQ, Ejabbed, etc.

Ok, mas Erlang é propriedade da Ericsson?

Não, felizmente, não. Em 1998 a Ericsson tornou Erlang open source sob a licença EPL.

Quer mais uma boa notícia? Você não precisa de um servidor de aplicações para rodar sua aplicação Erlang, nem mesmo uma pesada IDE para escrevê-las. Tudo o que você precisa é de uma distribuição de Erlang para sua plataforma, seja Mac OS X, Linux, Windows, Solaris, ou qualquer outro sistema Unix-like, que traz consigo máquina virtual, compilador e vasta bibliotéca de módulos muito úteis – além do banco de dados Mnesia; e um editor de textos de sua preferência TextMate, por exemplo, tem um ótimo bundle para Erlang.

Algumas características de Erlang

1- Expressividade e beleza

Há quem diga que não, mas Erlang é uma linguagem muito bonita — ao menos pra mim. Dado as já citadas influências de Erlang, ela é uma linguagem bem expressiva e declarativa, que encoraja a escrita de código simples e objetivo, o que certamente torna seu código fácil de ler, de escrever e de organizar [em módulos reutilizáveis]. O snippet abaixo é um exemplo de implementação do famoso fatorial:

-module(sample1).
-export([fac/1]).

fac(0) -> 1;
fac(N) -> N * fac(N-1).

2- Forte uso de recursividade

Isto certamente é uma herança da veia funcional de Erlang que torna o código muito menos imperativo e mais declarativo. Mas além da beleza declarativa óbvia, é importante saber que Erlang foi projetada para lidar com iterações recursivas gigantescas sem qualquer degradação – e sem estourar o “heap” de memória.

3- Livre de efeito colateral

Uma das grandes capacidades dadas por Erlang é a construção de sistemas altamente concorrentes rodando em processadores com multiplos núcleos. Isto não combina nada com efeito colateral, por isso, em Erlang, uma vez que um dado valor tenha sido atribuído a uma variável, esta não poderá mais ser modificada – ou seja, estão mais para o que conhecemos por constantes do que para o que conhecemos por variaveis.

Se você já escreveu código concorrênte sabe o quanto tê-lo livre de efeitos colaterais te faz livre de dores de cabeça. Poucas coisas são tão deprimentes quanto debugar código concorrênte repleto de efeitos colaterais.

4- Pattern matching

Pattern matching em Erlang é usado para associar valores a variáveis, controlar fluxo de execução de programs, extrair valores de estruturas de dados compostas e lidar com argumentos de funções. Mais um ponto para código declarativo e expressividade. Vejamos o código abaixo:

-module(sample2).
-export([convert_length/1]).

convert_length(Length) ->
    case Length of
        {centimeter, X} ->
            {inch, X / 2.54};
        {inch, Y} ->
            {centimeter, Y * 2.54}
    end.

Fala por si, não?

5- Concorrência baseada em passagem de mensagens (a.k.a. Actors)

Acho que concorrência baseada em passagem de mensagem entre atores é uma das features mais populares de Erlang. Vejamos o porque com o famoso exemplo do Ping-Pong:

-module(sample3).

-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) ->
    Pong_PID ! finished,
    io:format("Ping finished~n", []);

ping(N, Pong_PID) ->
    Pong_PID ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_PID).

pong() ->
    receive
        finished ->
            io:format("Pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.

start() ->
    Pong_PID = spawn(sample3, pong, []),
    spawn(sample3, ping, [3, Pong_PID]).

Neste pequeno snippet podemos observar algumas características de Erlang já citadas neste post, tal como pattern matching na captura das mensagens e recursividade no controle das iterações.

Agora, falando do aspecto concorrente em sim, algumas coisas são particularmente interessantes aqui:

a. Em Erlang, a concorrência acontece entre processos leves, diferente de linguagens como C++ e Java, que baseiam sua concorrência em threads nativas de sistema operacional [caríssimas];
b. Em Erlang, há um tipo de dado chamado PID, o qual é o identificador do processo paralelo (mais conhecido como Actor) e para o qual as mensagens podem ser enviadas.

Releia o código acima com estas informações em mente e veja como concorrência em Erlang é algo completamente descomplicado e natural. Depois, pense no mesmo código implementado em C#, Java ou C++.

Gostei de Erlang, há algum livro para eu começar a estudar?

Sim, há dois livros excepcionais. Um, do próprio criador da linguagem, Joe Armstrong:

E outro de Francesco Cesarini e Simon Thompson:

Além disso, há o próprio material on line que é muito bom e barato. :)

Conclusão

Erlang possui muitas outras características e informações bem interessantes, mas que me falta espaço neste post para citar e apresentar, senão ele ficará absurdamente gigantesco para o meu gosto. Mas acredito que pelo que já apresentei até aqui, você já tenha motivos suficientes para pensar em Erlang com carinho e conciderá-la para seu próximo grande projeto.

Em breve devo escrever algo sobre OTP, já que neste post apresentei características mais inerentes à linguagem em si e nem tanto sobre a plataforma.

Até mais!

{ 8 comments to read ... please submit one more! }

  1. Graande Leandro! Parabéns pelo post.

    Como que está sendo a curva de aprendizado? Uma equipe com a cabeça aberta (leia-se, não viciada em j2ee), conseguiria produzir alguma coisa com erlang em no mínimo….

    Mestre, dê-nos uma luz :D

  2. Muito bom!
    Me interessei por erlang depois que começei a
    testar o couchdb. Por enquanto estou achando
    excelente, principalmente o spawn.

    Parabéns pelo post.

  3. @Douglas

    Aprender uma nova linguagem nunca é uma tarefa trivial. São novos conceitos, novas bibliotecas, novas maneiras de se fazer as coisas, e às vezes até um novo paradigma. Em se tratando de uma linguagem tão diferente das mais populares que estamos acostumados a lidar no nosso dia a dia então, não é trivial mesmo.

    Então, sim, a curva de aprendizado é um tanto ingrime. Aprender o básico e começar a praticar, eu não é dificil não; chegar ao avançado é que, com certeza, requer dedicação. Eu mesmo ainda não cheguei lá, não sou mestre, sou iniciante. :)

    @Fabio

    Valeu!

  4. Ótimo post Leandro,

    Num sei se conhece, mas gostaria de citar alguns links que acredito serem úteis pra quem está iniciando no seu estudo sobre erlang:

    – Um site ensinando Erlang
    http://learnyousomeerlang.com

    – ScreenCasts da Pragmatic Programmers sobre Erlang
    http://pragprog.com/screencasts/v-kserl/erlang-by-example

    Valeu mano! Continue no embalo de Erlang que está muito bom ;)

  5. @Charleno

    Os screencasts eu já conhecia, mas o learnyousomeerlang.com não. Ótima dica!

  6. Você acha que vale investir tempo para aprender Erlang? Como é o meracado para ela?

  7. @Leandro

    Opa! Blz?

    Cara, na minha opinião, vale a pena, sim. O mercado é irrisório, por enquanto, mas você tem que ter linguagem de futuro.

    Olha só, vou te dar um exemplo: em 1997, eu comecei a aprender Java e o mercado não era nem a sombra da sombra do que é hoje. Mesmo assim, segui meus estudos. Em 2000, quando a coisa começou a bombar no Brasil, eu estava preparando para ocupar uma boa posição no mercado, enquanto muitos estavam ainda aprendendo que Java não tinha nada a ver com JavaScript. O mesmo aconteceu com grandes nomes de Ruby on Rails no Brasil, como é o caso do nosso caro colega Akita.

    Então, se eu puder te dar um conselho: aprenda Erlang, sim. E caso Erlang nunca bombe no Brasil, ao menos você aprendeu um monte de coisas inegavelmente interessantes, que vão te acompanhar por toda tua vida de programação.

    Boa sorte!

  8. @ALL

    Pra ser bem franco, a minha intensão com este post não é que amanhã você boot um Erlang/OTP na sua empresa e comece a desenvolver a aplicação mais importante da sua empresa, a mais crítica, sem ter qualquer conhecimento e know how de Erlang/OTP. Se você fizer isso, vou te achar bem corajoso, pode ter certeza! :)

    A minha intensão, no entanto, é provocar você, instigar você, a procurar novas alternativas, a pensar fora da caixa, a tentar algo novo, soluções novas para seus problemas atuais — e quem sabe até de amanhã. Talvez seja Erlang a sua solução; talvez não; talvez seja uma nova linguagem, que ainda nem existe, uma linguagem que você criará! Mas pode ser mesmo que seja Erlang, caso seus requisitos possam ser melhor atendidos por ela. Por que não? Ham? É claro que não inconsequentemente, sem qualquer base, mas com uma base de estudo e pesquisa forte, que pode começar hoje, agora mesmo. Por que não?

    Bem, talvez eu escreva algo a respeito num outro momento.

    Abraço a todos e obrigado pelos comentários!

{ 0 Pingbacks/Trackbacks }

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>