Ao iniciar o desenvolvimento de um novo produto digital, os primeiros questionamentos que nos vêm à mente são: qual tecnologia escolher? E essa tecnologia atenderá a todos os requisitos necessários? Pensando nisso, criamos uma série de artigos aqui no blog, para explorar as linguagens e frameworks que conhecemos e utilizamos aqui na ateliware. Assim, podemos compartilhar a nossa experiência para te ajudar na hora de tomar uma decisão de escolha como essa. Este artigo é o primeiro da série e para começar falaremos sobre os diferenciais do Elixir.
Resolvi então compilar neste texto os principais questionamentos que já percebi sobre essa linguagem ao longo de mais de 3 anos trabalhando com ela.
O Elixir é uma linguagem de programação dinâmica que utiliza o paradigma funcional, concorrente por padrão e é executada na máquina virtual do Erlang (BEAM).
Criada em 2011, em um projeto de pesquisa do brasileiro José Valim, atualmente está na versão 1.10. O foco principal da linguagem é fornecer, de forma produtiva, ferramentas para construir aplicações distribuídas e de fácil manutenção.
Não podemos falar sobre os benefícios dessa linguagem, sem antes explicar o que é a BEAM, também conhecida como máquina virtual do Erlang.
Ela faz parte do core do OTP (erlang open telecom platform) e é responsável por executar o código compilado do Erlang e do Elixir que, em conjunto do runtime do erlang, trazem alguns benefícios como padrão para a linguagem:
O código Elixir é executado em pequenas threads, chamadas de processos. Esses processos e são totalmente isolados e trocam informações através de mensagens:
current_process = self()
# Spawn an Elixir process (not an operating system one!)
spawn_link(fn ->
send(current_process, {:msg, 'hello world'})
end)
# Block until the message is received
receive do
{:msg, contents} -> IO.puts(contents)
end
Na comunidade erlang existe um conceito chamado ‘let it crash’ ou, em português, ‘deixe falhar’. A única certeza que temos de um código que é executado em produção é que as coisas podem dar errado. Para isso, o Elixir implementa uma feature de supervisão do código que está sendo executado:
children = [
TCP.Pool,
{TCP.Acceptor, port: 4040}
]
Supervisor.start_link(children, strategy: :one_for_one)
Além das ótimas funcionalidades que a linguagem traz por padrão, por se aproveitar da BEAM, vale destacar também a quantidade de ferramentas que fazem parte do dia a dia de desenvolvimento:
Mix - Ferramenta de build;
Hex - Gerenciador de pacotes;
Iex - Execução interativa do elixir;
ex_doc - Geração de documentação;
Phoenix - Framework de desenvolvimento web;
Ecto - Interação com banco de dados.
Existem alguns pontos e diferenciais que fazem com que o Elixir se destaque frente a outras linguagens de programação e ganhe cada vez mais espaço em aplicações que precisam de:
Crescimento e escala - Se a sua aplicação será acessada por milhares ou milhões de usuários você pode se aproveitar dos benefícios de confiabilidade e escalabilidade da BEAM;
Gerenciamento de grande quantidade de requisições simultâneas - Se você não tem milhões de usuários, mas tem um número menor que faz uso intenso do seu produto, você precisa de um sistema que suporte concorrência;
Mantenabilidade do código - Uma das vantagens ao escrever código em Elixir é conseguir manter o código simples. O resultado disso é que muitas empresas escolhem a linguagem brasileira pela possibilidade de ter um codebase de fácil manutenção, desde a correção de bugs até o desenvolvimento de novas funcionalidades.
Outro ponto positivo, por coincidência ou não, é que todas as vantagens do Elixir citadas na lista acima se encaixam perfeitamente em aplicações web ou api’s.
É claro, existem também outras ferramentas muito robustas para o desenvolvimento web. Mas isso é tópico para outro artigo!
Particularmente eu não acredito que aplicação alguma seja fácil de escalar. Mas com o Elixir conhecemos alguns casos de uso que nos indicam que escalar é, sim, possível.
O primeiro é o caso da Bleacher Report, uma empresa de notícias esportivas que serve mais de 1,5 bilhões de páginas por mês e reduziu de 150 servidores para apenas 5 utilizando o Elixir. O segundo caso é do Discord, um aplicativo de chat para gamers que, com o Elixir no seu cinto de ferramentas, tem a capacidade de gerenciar mais de 11 milhões de usuários simultâneos.
Além disso, recomendo este vídeo em que o criador do Phoenix Framework explica como mantém mais de 1 milhão de requisições simultâneas utilizando o Elixir.
Várias empresas ao redor do mundo já adotaram o Elixir para melhorar sua produtividade ao construir aplicações distribuídas. Alguns exemplos são:
Pinterest - Suporte a mais de 30k de eventos por segundo e mais de 200 milhões de usuários por mês;
PepsiCo - Desenvolvimento da plataforma de e-commerce;
Moz - Diminuíram o tempo de resposta de mais de 800 ms para menos de 50 ms.
Ficou interessado? Você pode conferir uma lista com mais de 400 empresas que utilizam o Elixir em produção.
Pode se dizer que o Elixir está no mainstream das tecnologias, justamente pela quantidade de features que são oferecidas por padrão. Outros pontos positivos são o paradigma funcional da linguagem, os conceitos de imutabilidade e a programação mais declarativa. Todos eles trazem mais clareza na hora de ler um código escrito.
Além disso, a comunidade é muito ativa e dificilmente você ficará na mão na hora de resolver um problema.
Trago como dica um padrão que eu mesmo sigo: antes de procurar no Stackoverflow faço minhas buscas no Fórum do Elixir e geralmente encontro mais rápido a solução para os meus problemas.
Outra questão bastante positiva é que, pelo Elixir ter uma inspiração no Ruby, muitos desenvolvedores que programam nessa linguagem têm buscado aprender o Elixir também.
A cada dia que passa, a adoção dessa linguagem aumenta mais.
Assim como todas as linguagens o Elixir não é bala de prata. Ela não foi feita para cobrir todos os casos de uso possíveis, por mais que possa parecer. Existem, principalmente, algumas situações em que o uso do Elixir não é o ideal:
Processamento computacional pesado - Não é algo que o core team do Erlang/Elixir está muito preocupado. Além disso, já existem ótimas ferramentas utilizando Python, Matlab ou R;
Deep Learning - Existem algumas ferramentas rodando em Elixir, mas existem ferramentas de Deep Learning mais robustas e validadas em Python, por exemplo;
Mobile apps - Hoje o Elixir não é uma linguagem viável para desenvolvimento mobile. Seria muito legal utilizar o Elixir para desenvolver aplicativos! Quem sabe no futuro?
Espero ter conseguido compartilhar com você um pouco do que aprendi ao longo dos anos trabalhando com Elixir e ter esclarecido dúvidas que surgem no momento da decisão de tecnologia em um novo projeto.
Aproveito e deixo a indicação de alguns livros que usei no processo de aprendizagem que são ótimos para aprofundar o conhecimento:
Programming Elixir 1.6: Functional |> Concurrent |> Pragmatic |> Fun by Dave Thomas;
Adopting Elixir: From Concept to Production by Ben Marx, José Valim, Bruce Tate;
Metaprogramming Elixir: Write Less Code, Get More Done (and Have Fun!) by Chris McCord.
Se você ficou com alguma dúvida mesmo após a leitura, entre em contato com a gente.
Até a próxima!