Aprenda a usar o Phoenix Framework para se divertir a construir aplicações web/móvel em tempo real
que são rápidas para “utilizadores finais”, fiáveis, escaláveis, de manutenção e (facilmente) extensíveis!
- Porquê?
- O quê?
- Alegria do Desenvolvedor
- (Devo me importar com) Benchmarks?
- Destaques de desempenho
- Quem?
- Quem deve aprender Phoenix?
- Quem NÃO deve aprender Phoenix?
- Como?
- Suposições / Pré-Requisitos?
- Elixir
- Nó.js
- Instalação
- Seguinte?
- Exemplos Práticos?
- Livro?
- Vídeo Intro por José Valim (Criador do Elixir)
- Recursos
- As nossas 10 Principais Razões Porque Phoenix
- Perguntas?
- Preciso aprender Elixir antes de tentar/usar Phoenix?
- Preciso de conhecer Erlang para usar o Elixir & Phoenix…?
- Mas Phoenix não é “Mainstream” … Se eu/nós o utilizarmos…?
- Porque é que já não estamos a utilizar Hapi.js…?
- O que há de errado em usar Rails ou Django?
- Mas GitHub ainda usa Rails … Certamente GitHub é “Escalável”?
- Porque NÃO usar Go?
- Porque NÃO Utilizar Scala + Play Framework em vez disso…?
- Porque não usar Haskell?
- Por favor, faça mais perguntas: https://github.com/dwyl/learn-phoenix-framework/issues
Porquê?
Como desenvolvedores de aplicativos web/mobile precisamos aproveitar o trabalho que outras pessoas (realmente inteligentes) fizeram
em vez de constantemente construir coisas “do zero” o tempo todo;é por isso que usamos frameworks para construir nossos aplicativos!
Veja: “Top 10 Reason Why Phoenix” (mais abaixo nesta página!)
Existem muitos frameworks para escolher (alguns “populares” são mencionados abaixo na seção “Questões”).
Mas, se seguirmos pelo que é “popular”, ainda estaremos montando cavalos (e carroças) por toda parte e nenhum progresso será feito.
Nota: todas as razões “Por que “para Elixir também se aplicam a Phoenix!
>marquem-nas: https://github.com/dwyl/learn-elixir#why
O quê?
Uma estrutura de aplicação web sem compromisso!
Alegria do Desenvolvedor
O maior “constrangimento” em qualquer projeto tecnológico são as pessoas. Um “Empreendedor”/”Fundador” ou “Dono do Produto” pode ter todas as boas idéias no mundo, se eles são incapazes de converter idéia em realidade, isso não tem sentido.
(Devo me importar com) Benchmarks?
Obviamente, você deve executar os seus próprios benchmarks no seu próprio hardware/cloud e tomar decisões informadas com base nos requisitos do seu aplicativo/produto,mas …. quando lemos as estatísticas de quantos usuários simultâneos a Phoenix App pode lidar (com conexões WebSocket ao vivo) nós fomos levados pelo vento! Isso significa que podemos construir nosso(s) aplicativo(s) em tempo real com 90% menos recursos.
Destaques de desempenho
- consideravelmente menor latência e tempo de resposta de requisição do que qualquer outra coisa! (graças aos processos leves de Erlang e ao manuseio ultra-eficiente da rede/mensagem)
- 4x mais pedidos por segundo do que o Node.js (Express.js) App.
- 9x mais taxa de transferência do que um aplicativo baseado em Python 2.7. (bloqueio realmente é uma droga!)
- 10x – 100x mais requisições tratadas que Ruby-on-Rails(dependendo do tipo de aplicação!)
- Desempenho similar a Go em um único servidor, mas um modelo muito mais simples de múltiplos servidores concorrentes, então o escalonamento horizontal entre múltiplos centros de dados (“zonas de disponibilidade”) é muito mais fácil! (Erlang gerencia os recursos para múltiplos servidores/processadores como uma única “frota” de aplicativos e delega solicitações/processamento a eles em clusters/zonas!)
Tudo isso significa que você gasta consideravelmente menos dinheiro em hardware/estrutura de alto nível para que seu aplicativo/empresa ganhe uma vantagem competitiva no custo.
Se você estiver na posição afortunada de estar considerando a utilização de algo muito melhor para o seu próximo projeto,não procure mais longe do que Phoenix!
Lê mais: http://www.phoenixframework.org
Quem?
Muitas pessoas/equipas/empresas já estão usando Erlang/Elixir e Phoenix e vendo resultados fenomenais!
Incluindo: Adobe, BBC, Spotify, Pinterest, Discord (Gamer Chat App),Groupon (Fave), Lonely Planet, Brightcove, Slack …
Veja: https://github.com/doomspork/elixir-companies
Quem deve aprender Phoenix?
- Pessoas que querem uma maneira fácil de construir um aplicativo com todas as conveniências modernas de “geradores”, interface de banco de dados (“ORM”) e WebSocketsf de primeira classe para “em tempo real” enquanto obtém confiabilidade legendária.
- Equipes que precisam da produtividade do desenvolvedor ou Ruby-on-Rails ou Django,mas querem menos “magia” (ou seja, querem entender como tudo funciona!).
- Empresas que querem gastar 90% menos nos custos de desenvolvimento e infra-estrutura para que você possa atender mais pessoas com menos recursos.
Quem NÃO deve aprender Phoenix?
- Aqueles que precisam usar a estrutura ou linguagem “mais popular” (por qualquer razão).
- Empresas que já têm muito Java/PHP/etc.legacy e não podem investir o tempo para aprender/usar algo novo.
- Desenvolvedores que querem “segurança no trabalho” – corrigindo códigos não confiáveis.
Como?
Suposições / Pré-Requisitos?
Elixir
Você não pode construir um aplicativo Phoenix sem conhecer o Elixir.
Se você é novo no Elixir, “estrela” (bookmark) this
repo(so you can return to it tomorrow)
and then go to:github.com/dwyl/learn-elixirlearn elixir até que você sinta que entende a sintaxe, então volte e aprenda Fênix!
Especificamente você deve focar em aprender o Elixir “Básico”:
- tipos de dados
- átomos
- correspondência de padrões
- maps
- definições de funções
- módulos
Nó.js
Phoenix usa o Node.js para compilar conjuntos como arquivos JavaScript e CSS (usando Webpack).
Certifique-se de que tem o Node.js instalado. https://nodejs.org
Você não precisa conhecer o Node para usar Phoenix.
Instalação
Se você já aprendeu algum Elixir e instalou o Node.js, o primeiro passo para começar a usar o Phoenix é a instalação!
A documentação do Phoenix é incrível, então recomendamos seguir as instruções oficiais de instalação do Node.js!
Você também precisa instalar o PostgreSQL, há um tutorial de como fazer solinked no guia de instalação da Phoenix ligado acima, mas você também pode verificar nossas instruções learn-postgresql
repo for, e levantar um problema se você tiver algum problema!
Embora um entendimento básico de JavaScript possa ser útil às vezes, você não precisa saber como usar o Node para usar Phoenix.
Se você está curioso porque eles escolheram Brunch.io em vez de “alternativas”,
a resposta é curta: Simplicidade & Velocidade!veja: http://brunch.io/docs/why-brunch
Nota: Phoenix v1.4 (inédita no momento da escrita)usa WebPack para a compilação de bens,veja: CHANGELOG.md
Seguinte?
Familiarize-se com o guia “Up and Running” (oficial):https://hexdocs.pm/phoenix/up_and_running.html#content
Exemplos Práticos?
Após ter a Phoenix instalada e ter seguido o guia oficial de “Up and Running”,
regresse e experimente estes exemplos para principiantes:
- Contador (contador partilhado em tempo real usando o Phoenix LiveView):https://github.com/dwyl/phoenix-liveview-counter-tutorial
- Todo List (tutorial passo-a-passo mostrando como construir um clone TodoMVC totalmente funcional):https://github.com/dwyl/phoenix-todo-list-tutorial
- Chat (UI/UX em tempo real usando WebSockets):https://github.com/dwyl/phoenix-chat-example
- Encriptação (segurança):https://github.com/dwyl/phoenix-ecto-encryption-example
- Log Append-only (como armazenar os dados do seu App):https://github.com/dwyl/phoenix-ecto-append-only-log-example
Livro?
Recomendamos que as pessoas comprem (ou emprestem)@chrismccord’s book: “Programming Phoenix”
ver: https://pragprog.com/book/phoenix14/programming-phoenix-1-4>
Os autores são individualmente impressionantes e coletivamente eles compreendem a Phoenix como ninguém mais pode! Chris criou Phoenix, José criou Elixirand Bruce é um autor técnico ultra-experiente com muitos livros de sucesso em seu nome!
(i.e: o livro é a escolha óbvia de como aprender Fénix!)
Vídeo Intro por José Valim (Criador do Elixir)
https://youtu.be/MD3P7Qan3pw
https://youtu.be/srtMWzyqdp8
Recursos
- Elixir vs Ruby Showdown – Phoenix vs Rails: https://littlelines.com/blog/2014/07/08/elixir-vs-ruby-showdown-phoenix-vs-rails
- Benchmark: https://github.com/mroth/phoenix-showdown
As nossas 10 Principais Razões Porque Phoenix
“Phoenix fornece a produtividade do Ruby-on-Rails
com a concorrência e tolerância a falhas de Erlang.”
- Além de todos os (fantásticos) benefícios técnicos, o que nos atrai para a Phoenix é a Grande Comunidade de pessoas ao redor do mundo que estão entusiasmadas em fazer da Phoenixan uma ferramenta incrível para construir aplicações web!
Salvando pessoas bem-vindas que irão
- ajudá-lo quando você ficar preso, explicando pacientemente as coisas
- respostas a perguntas (tanto “noob “como “avançado”) e
- discutir abertamente (suas) idéias para melhorias.veja: https://elixirforum.com/t/phoenix-v1-3-0-rc-0-released/3947
-
Phoenix usa a linguagem de programação Elixir, o que significa que o yourapp é compilado e executado na Máquina Virtual Erlang “BEAM”.
Erlang é uma VM altamente tolerante a falhas testada e testada em batalha, utilizada por muitas empresas de telecomunicações -
WebSockets (“canais”) são incorporados ao framework, o que significa que construir aplicações com comunicação e interação “em tempo real” é muito mais fácil do que virtualmente qualquer outro framework/plataforma!(não é necessário um módulo de terceiros
magic
tudo o que você precisa já está lá pronto para você servir milhões de pessoas!!!)
ver: http://www.phoenixframework.org/docs/channels -
Assincronia fácil porque toda a programação em Phoenix (Elixir) é funcional! Isto significa que é realmente simples de abstrair funcionalidades úteis como a autenticação de pedidos, login e processamento em “piplines” que são facilmente legíveis por humanos! (não é necessário um módulo de terceiros
async
! não são necessárias “promessas”, “geradores” ou “observáveis” para gerir!!) -
Segurança & Resilience Mindset é o
default
.Criptografia (SSL) é fácil em Phoenix/Elixir e tanto a mitigação da injeção SQL, Cross-site Scripting (XSS) e proteção CSRF são incorporados (habilitado pordefault
), portanto é praticamente impossível para um programador “novato” introduzir este tipo de bug de segurança. -
Concise Code não pode ser subestimado! Podemos escrever muito menos linhas do que na aplicação equivalente Node.js/Java/Rails/Go, esta média de desenvolvedores são mais produtivos e há menos código para manter!
-
Testabilidade devido à programação funcional de todos os controladores!
-
Easy Deployment: http://www.phoenixframework.org/docs/heroku
-
Easy Deployment é grátis! (novamente por causa de Erlang). Erlang gerencia a transição de usuários “live/active” da antiga para a nova versão de seu aplicativo sem que eles percebam que ele foi atualizado!!
-
Built-in Monitoring/Managment do seu aplicativo através dos supervisores de Erlang significa que você sabe exatamente como seu aplicativo está se desempenhando, que partes já foram destruídas/ reiniciadas e por quê! Esta é uma funcionalidade que pagamos (muito) por outros frameworks e aqui é grátis!!
Pode pensar noutra razão – por que usar o Phoenix é fantástico?!
Please Share your thoughts in this thread:https://github.com/dwyl/learn-phoenix-framework/issues/13
Perguntas?
Preciso aprender Elixir antes de tentar/usar Phoenix?
Sim. Veja: https://github.com/dwyl/learn-elixir
Preciso de conhecer Erlang para usar o Elixir & Phoenix…?
Não. Pode começar a aprender/usar Elixir hoje e chamar as funções de Erlang quando necessário,
mas não precisa de conhecer Erlangbefore
pode usar Phoenix!
Mas Phoenix não é “Mainstream” … Se eu/nós o utilizarmos…?
Existem muitos frameworks de aplicações web que você/nós podemos escolher de:https://en.wikipedia.org/wiki/Comparison_of_web_frameworks
Então porque é que alguém seleccionaria um framework escrito numa linguagem de programação que não é “mainstream”…?
Porque é que já não estamos a utilizar Hapi.js…?
Isto é informação errada. Ainda estamos a usar Hapi.jsfor para vários projectos onde é apropriado.
Inclui vários projectos de clientes e dwyl apps/tools internos.
Decidimos usar Phoenix para os nossos novos projectos por estas simples razões:
- Elixir é uma linguagem mais agradável que JavaScript.
#LessIsMore
#LessButBetter
#SmallIsBeautiful
#SyntaxMatters
- JS pode ser funcional, enquanto que Elixir é (sempre) Funcional! A distinção faz toda a diferença!
Com programação “funcional”, os programas são muito mais fáceis de pensar enquanto você os escreve/mantém! - Elixir usa o Erlang VM que é muito mais eficiente/poderoso que “V8”
- O Erlang VM é muito mais fácil de escalar do que o Nó multi-servidor multi-servidor.js
(ou praticamente qualquer outra coisa!!)
Para os nossos novos projectos precisamos de tolerância a falhas multi-centros de dados!
obtemos isso “de graça” usando Erlang -> Elixir -> Phoenix!!
Na nossa opinião Hapi.js ainda é “o melhor” Node.js framework e vamos continue
usá-lo e recomendá-lo
a pessoas que precisam de aplicações simples que escalam e são fáceis de manter.
ver: https://github.com/dwyl/learn-hapi
Também ainda usamos JavaScript para todos os nossos Micro-Services AWS Lambda,que não vai mudar.
São simples, eficientes e em escala muito bem!
ver: https://github.com/dwyl/learn-aws-lambda
O que há de errado em usar Rails ou Django?
Os frameworks web “produtivos” originais eram “Ruby-on-Rails” e “Django” (python) em 2005!
(Nós usamos ambos por períodos em nossa “jornada” e podemos falar sobre as vantagens de cada um deles!)
Não há “nada de errado” em usar Rails ou Django.
Pensamos que ainda existem muitos casos de uso para ambos os frameworks.
Só sabemos que é (muito) mais fácil construir “em tempo real”
com Phoenix porque “Channels” (WebSockets) são cozidos,
e a concorrência Elixir/Erlang é um jogo de bola totalmente diferente!
Erlang (e portanto a Phoenix) pode distribuir milhões de usuários simultâneos em um único servidor,
onde como um servidor Rails/Django só pode lidar com alguns milhares (na melhor das hipóteses!)
se o seu aplicativo estiver servindo apenas alguns milhares de pessoas ao mesmo tempo, então você está bem!!
Adoramos o fato de que Erlang usa processos de “peso leve de vida longa”,
o que significa que podemos conectar milhões de dispositivos (IoT) …Pois IoT Erlang é (inquestionavelmente) a Resposta!
Para aplicações web mais simples onde você espera apenas alguns usuários por dia,Rails/Django ainda são viáveis.
Mas por que fazer concessões se você não precisa fazer?
Se você pode ter um Tesla pelo “preço” de um Ford Focus,por que não o faria?!?
Por que se contentar de vez quando você pode facilmente ter/usar o melhor?
Mas GitHub ainda usa Rails … Certamente GitHub é “Escalável”?
Sim, GitHub ainda está usando Rails para sua aplicação Web/Site.
Mas pergunte a qualquer um do time central do GitHub se (dada a chance de começar de novo)eles escolheriam Rails
para construir o GitHub em 2017, e veja quantos deles dizem “sim, é claro”(com uma cara séria…)!
Também, GitHub faz um monte de coisas para escalar Rails em segundo plano.
E muitas das suas novas funcionalidades (client-side) são escritas em JavaScript!see: https://github.com/github
O resultado final é: tudo pode ser feito à escala usando “DevOps”,
mas Phoenix é feito à escala pordefault
porque Erlang (foi) inventado (à) escala!
Porque NÃO usar Go?
“Existem dois tipos de linguagens de programação – aquelas que ninguém usa e aquelas que todos reclamam” ~ Bjarne Stroustrup(criador de
C++
)
Go é muito popular. Em grande parte devido ao facto de o Google o “patrocinar”.
Tinha como objectivo simplificar (substituir) C++
e Java dentro do Google …
e, na sua maioria, conseguiu!
Gostamos muito de Go. Foi a nossa escolha “número dois” ao decidir que linguagem de programação
(depois do Elixir) no nosso “post JS stack”…A decisão de usar elixir
em vez de qualquer coisa else
foi fácil:
- Elixir é funcional (muito mais simples de ler/escrever/manter/extender)
- As funções do Elixir compõem de uma forma realmente elegante como “plugs”/”pipelines”
- Os dados são imutáveis o que torna o estado da aplicação previsível (sem adivinhar!)
- Tipos são dinâmicos e inferidos (não é necessário declará-los manualmente)mas existem regras que simplificam as coisas e o compilador os verifica dando um aviso apropriado.
- Erlang torna as aplicações distribuídas muito mais fáceis e nosso plano é construir sistemas de IoT que significará conectar muitos (milhões) dispositivos com conexões persistentes, Erlang foi feito para isso!
- Phoenix inclui muitas coisas úteis fora da caixa incluindo vários recursos de segurança que a maioria das pessoas nem pensa.
Outra Leitura:
- Why Go is Not Good: http://yager.io/programming/go.html
- Go Web Frameworks: https://medium.com/code-zen/why-i-don-t-use-go-web-frameworks-1087e1facfa4
- Porque Todos Odeiam Ir: https://npf.io/2014/10/why-everyone-hates-go/(click-bait title, alguns pontos válidos…)
- Discussão: https://www.reddit.com/r/elixir/comments/3c8yfz/how_does_go_compare_to_elixir>
(`querida ajuda` expandindo esta resposta…)
Porque NÃO Utilizar Scala + Play Framework em vez disso…?
Se você já está acostumado a escrever Java ou a distribuir para a JVM,o Play Framework é uma escolha soberba: https://www.playframework.com
Scala é uma boa linguagem de programação e todos devem aprendê-la! https://www.scala-lang.org/what-is-scala.html
Usamos Play algumas vezes (antes de adotarmos Node.js)e realmente gostamos!
Mas Scala é uma linguagem de programação “cozinha pia” (multi-paradigma)que permite às pessoas usar “tudo de Java” …
Pensamos que a “interoperabilidade Java” do Scala significa que é “muito fácil” para permitir a complexidade na sua base de código. Especificamente “OOP Mutation” …
Então por que nós (DWYL) não estamos mais usando “Play” para novos projetos? Primeiro, fizemos a transição para Hapi.js (Node.js) alguns anos agobec porque era mais “leve” e nos permitiu escrever pequenos programas que usavam apenas algumas Megs de RAM (onde nossas aplicações Play eram muito sedentas de recursos)..!você já tentou rodar um aplicativo Scala em um laptop “básico” como um Chromebook…?)
Resumo de “razões” para Phoenix ao invés de Play:
- Mantivemos que Play/Scala ainda tem muitos casos de uso válidos.
- Elixir é muito mais simples que o Scala.
- O Erlang VM é muito melhor em concorrência do que o JVM.
- Adoramos o facto de todos os dados serem imutáveis em Elixir.
- Adoramos os poucos recursos necessários para executar um aplicativo Phoenix (por exemplo, em um Raspberry Pi!!)
Pensamos que para o(s) nosso(s) projeto(s) o modelo Concurrency do Erlang funciona melhor e o código funcional transforma dados imutáveis mais fáceis de testar e manter.
Se você tem evidências de que “Scala é mais simples” nós adoraríamos ouvir de você!
Conta-nos: https://github.com/dwyl/learn-phoenix-web-development/issues
Porque não usar Haskell?
Se você gosta tanto de Programação Funcional (FP), porque não usar Haskell?