Aprende a usar Phoenix Framework para divertirte construyendo aplicaciones web/móviles en tiempo real
que sean rápidas para los «usuarios finales», fiables, escalables, mantenibles y (fácilmente) extensibles!
- ¿Por qué?
- ¿Qué?
- Alegría del desarrollador
- (¿Debería preocuparme por) Benchmarks?
- Aspectos destacados del rendimiento
- ¿Quién?
- ¿Quién debería aprender Phoenix?
- ¿Quién no debería aprender Phoenix?
- ¿Cómo?
- Supuestos / Prerrequisitos?
- Elixir
- Node.js
- Instalación
- ¿Siguiente?
- Ejemplos prácticos?
- ¿Libro?
- Video Intro de José Valim (Creador de Elixir)
- Recursos
- Nuestras 10 razones principales por las que Phoenix
- ¿Preguntas?
- ¿Necesito aprender Elixir antes de probar/usar Phoenix?
- ¿Necesito saber Erlang para usar Elixir &Phoenix…?
- Pero Phoenix no es «Mainstream»… ¿Debería/debemos usarlo…?
- ¿Por qué ya no usamos Hapi.js…?
- ¿Qué hay de «malo» en usar Rails o Django?
- Pero GitHub sigue usando Rails… ¿Seguro que GitHub es «escalable»?
- ¿Por qué NO usar Go?
- ¿Por qué NO usar Scala + Play Framework en su lugar…?
- ¿Por qué no usar Haskell?
- Por favor, haz más preguntas: https://github.com/dwyl/learn-phoenix-framework/issues
¿Por qué?
Como desarrolladores de aplicaciones web/móviles necesitamos aprovechar el trabajo que otras personas (realmente inteligentes) han hecho
en lugar de construir constantemente cosas «desde cero» todo el tiempo; ¡por eso usamos frameworks para construir nuestras aplicaciones!
Ver: «Las 10 razones principales por las que Phoenix» (¡más abajo en esta página!)
Hay muchos frameworks para elegir (algunos «populares» se mencionan más abajoen la sección «Preguntas»).
Pero si nos guiamos por lo que es «popular», seguiríamos montando a caballo (y en carreta) por todas partes y no avanzaríamos.
Nota: ¡todas las razones del «por qué» de Elixir se aplican también a Phoenix!
compruébalos: https://github.com/dwyl/learn-elixir#why
¿Qué?
¡Un framework de aplicaciones web sin compromisos!
Alegría del desarrollador
La mayor «limitación» en cualquier proyecto tecnológico son las personas.Un «Emprendedor»/»Fundador» o «Propietario de Producto» puede tener todas las buenas ideas del mundo, si no es capaz de convertir la idea en realidad, no tiene sentido.
(¿Debería preocuparme por) Benchmarks?
Obviamente, deberías ejecutar tus propios benchmarks en tu propio hardware/nube y tomar decisiones informadas basadas en los requisitos de tu aplicación/producto, pero …. cuando leímos las estadísticas de cuántos usuarios concurrentes puede manejar Phoenix App (con conexiones WebSocket en vivo) nos quedamos impresionados! Esto significa que podemos construir nuestra(s) aplicación(es) en tiempo real con un 90% menos de recursos.
Aspectos destacados del rendimiento
- ¡Una latencia y un tiempo de respuesta a las solicitudes considerablemente más bajos que cualquier otra cosa! (gracias a los procesos ligeros de Erlang y al manejo ultra eficiente de la red/mensaje)
- 4 veces más peticiones por segundo que la aplicación equivalente de Node.js (Express.js).
- 9 veces más rendimiento que una aplicación basada en Python 2.7. (¡el bloqueo realmente apesta!)
- 10x – 100x más solicitudes manejadas que Ruby-on-Rails (¡dependiendo del tipo de aplicación!)
- ¡Rendimiento similar al de Go en un solo servidor, pero un modelo de concurrencia multi-servidor mucho más simple, por lo que el escalamiento horizontal a través de múltiples centros de datos («zonas de disponibilidad») es mucho más fácil! (Erlang gestiona los recursos para múltiples servidores/procesadores como una sola «flota» de aplicaciones y delega las solicitudes/procesamiento a ellos a través de clusters/zonas!)
Todo esto significa que usted gasta considerablemente menos dinero en infraestructura de hardware/nube para que su aplicación/empresa pueda obtener una ventaja competitiva en el costo.
Si usted está en la posición afortunada de considerar el uso de algo mucho mejor para su próximo proyecto, no busque más allá de Phoenix!
Lea más: http://www.phoenixframework.org
¿Quién?
¡Muchas personas/equipos/empresas ya están utilizando Erlang/Elixir y Phoenix y están viendo resultados fenomenales!
Incluyendo: Adobe, BBC, Spotify, Pinterest, Discord (Gamer Chat App),Groupon (Fave), Lonely Planet, Brightcove, Slack …
Ver: https://github.com/doomspork/elixir-companies
¿Quién debería aprender Phoenix?
- La gente que quiere una forma fácil de construir una aplicación con todas las comodidades modernas de los «generadores», la interfaz de base de datos incorporada («ORM») y los WebSockets de primera clase para el «tiempo real», mientras que consigue una fiabilidad legendaria.
- Equipos que necesitan la productividad del desarrollador o de Ruby-on-Rails o Django, pero quieren menos «magia» (es decir, quieren entender cómo funciona todo).
- Empresas que quieren gastar un 90% menos en costes de desarrollo e infraestructura para poder servir a más gente con menos recursos.
¿Quién no debería aprender Phoenix?
- Cualquier persona que necesite usar el framework o lenguaje «más popular» (por la razón que sea).
- Empresas que ya tienen un montón de Java/PHP/etc. heredados y no pueden invertir el tiempo en aprender/usar algo nuevo.
- Desarrolladores que quieren «seguridad laboral» corrigiendo código poco fiable.
¿Cómo?
Supuestos / Prerrequisitos?
Elixir
No puedes construir una Phoenix App sin conocer Elixir. ¡
Si eres nuevo en Elixir, «estrella» (marcador) this
repo (para que puedas volver a él mañana)
y luego ir a:github.com/dwyl/learn-elixiraprender elixir hasta que sientas que entiendes la sintaxis, entonces vuelve y aprende Phoenix!
Específicamente deberías centrarte en aprender los «Básicos» de Elixir:
- tipos de datos
- átomos
- comparación de patrones
- mapas
- definiciones de funciones
- módulos
Node.js
Phoenix utiliza Node.js para compilar activos como archivos JavaScript y CSS (utilizando Webpack).
Simplemente asegúrese de tener Node.js instalado. https://nodejs.org
No necesitas saber Node para usar Phoenix.
Instalación
Si ya has aprendido algo de Elixir y has instalado Node.js, ¡el primer paso para empezar con Phoenix es la instalación!
¡La documentación de Phoenix es increíble, así que recomendamos seguir las instrucciones oficiales de instalación de Phoenix!
También necesitarás instalar PostgreSQL, hay un tutorial de cómo hacerlo en la guía de instalación de Phoenix enlazada arriba, pero también puedes consultar nuestro repo para obtener instrucciones, ¡y plantear un problema si tienes algún problema!
Aunque una comprensión básica de JavaScript puede ser útil a veces, no es necesario saber cómo usar Node para usar Phoenix.
Si tienes curiosidad por saber por qué eligieron Brunch.io sobre «alternativas»,
la respuesta corta es: Simplicidad &¡Velocidad! http://brunch.io/docs/why-brunch
Nota: Phoenix v1.4 (inédito en el momento de escribir este artículo)utiliza WebPack para la compilación de activos,ver: CHANGELOG.md
¿Siguiente?
Familiarícese con la guía «Up and Running» (oficial):https://hexdocs.pm/phoenix/up_and_running.html#content
Ejemplos prácticos?
Una vez que tenga instalado phoenix y haya seguido la guía oficial «up and running»,
vuelva a probar estos ejemplos prácticos para principiantes:
- Contador (contador compartido en tiempo real usando Phoenix LiveView):https://github.com/dwyl/phoenix-liveview-counter-tutorial
- Lista de Todo (tutorial paso a paso que muestra cómo construir un clon de TodoMVC totalmente funcional):https://github.com/dwyl/phoenix-todo-list-tutorial
- Chat (UI/UX en tiempo real usando WebSockets):https://github.com/dwyl/phoenix-chat-example
- Cifrado (seguridad):https://github.com/dwyl/phoenix-ecto-encryption-example
- Registro de sólo apéndices (cómo almacenar los datos de tu App):https://github.com/dwyl/phoenix-ecto-append-only-log-example
¿Libro?
Recomendamos que la gente compre (o pida prestado) el libro de @chrismccord: «Programming Phoenix»
ver: https://pragprog.com/book/phoenix14/programming-phoenix-1-4
¡Los autores son individualmente impresionantes y colectivamente cubren Phoenix de forma comprensible como nadie más puede! Chris creó Phoenix, José creó Elixiry Bruce es un autor técnico ultraexperimentadocon muchos libros de éxito a su nombre!
(es decir: ¡el libro es la opción obvia para aprender Phoenix!)
Video Intro de José Valim (Creador de 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
Nuestras 10 razones principales por las que Phoenix
«Phoenix proporciona la productividad de Ruby-on-Rails
con la concurrencia y tolerancia a fallos de Erlang.¡»
- Más allá de todos los (fantásticos) beneficios técnicos, lo que nos atrae de Phoenix es la gran comunidad de personas de todo el mundo que están entusiasmadas por hacer de Phoenix una herramienta increíble para construir aplicaciones web!
Tener gente acogedora que te
- ayuda cuando te quedas atascado, explicando pacientemente las cosas
- respondiendo a las preguntas (tanto a los «novatos» como a los «avanzados») y
- discutiendo abiertamente (tus) ideas para mejorar.ver: https://elixirforum.com/t/phoenix-v1-3-0-rc-0-released/3947
-
Phoenix utiliza el lenguaje de programación Elixir, lo que significa que tu aplicación se compila y ejecuta en la máquina virtual Erlang «BEAM».
Erlang es una máquina virtual altamente tolerante a fallos y probada por muchas compañías de telecomunicaciones -
Los WebSockets («canales») están incorporados al frameworklo que significa que construir aplicaciones con comunicación e interacción en «tiempo real» es mucho más fácil que prácticamente cualquier otro framework/plataforma (¡no se necesitan módulos de terceros! ¡todo lo que necesitas ya está ahí listo para servir a millones de personas!)
ver: http://www.phoenixframework.org/docs/channels -
¡Fácil asincronización porque toda la programación en Phoenix (Elixir) es Funcional! Esto significa que es realmente sencillo abstraer funcionalidades útiles como la autenticación de solicitudes, el registro y el procesamiento en «piplines» que son fácilmente legibles por humanos! (¡no se requieren módulos de terceros! ¡no hay «promesas», «generadores» u «observables» que gestionar!)
-
Seguridad &La mentalidad de resiliencia es la
default
.El cifrado (SSL) es fácil en Phoenix/Elixir y la mitigación de la inyección SQL, Cross-site Scripting (XSS) y la protección CSRF están incorporados (habilitados pordefault
) por lo que es prácticamente imposible para un programador «novato» introducir este tipo de errores de seguridad. -
¡El código conciso no puede ser subestimado! Podemos escribir muchas menos líneas que en una aplicación equivalente de Node.js/Java/Rails/Go, esto significa que los desarrolladores son más productivos y hay menos código que mantener.
-
¡Testabilidad debido a la programación funcional de todos los controladores!
-
Fácil despliegue: http://www.phoenixframework.org/docs/heroku
-
¡Despliegue sin tiempo de inactividad! (de nuevo gracias a Erlang). Erlang gestiona la transición de los usuarios «vivos/activos» de la antigua a la nueva versión de tu aplicación sin que se den cuenta de que se ha actualizado!!!
-
Monitorización/Gestión incorporada de tu aplicación a través de los supervisores de Erlang significa que sabes exactamente cómo está funcionando tu aplicación, qué partes han fallado/se han reiniciado y por qué! Esta es una característica por la que pagamos (mucho) en otros frameworks y aquí es gratis!
¿Puedes pensar en otra razón por la que usar Phoenix es impresionante?
Por favor, comparte tus pensamientos en este hilo:https://github.com/dwyl/learn-phoenix-framework/issues/13
¿Preguntas?
¿Necesito aprender Elixir antes de probar/usar Phoenix?
Sí. Ver: https://github.com/dwyl/learn-elixir
¿Necesito saber Erlang para usar Elixir &Phoenix…?
No. Puede empezar a aprender/usar Elixir hoy mismo y llamar a las funciones de Erlang cuando sea necesario,
pero no necesita saber Erlangbefore
puede usar Phoenix!
Pero Phoenix no es «Mainstream»… ¿Debería/debemos usarlo…?
Hay muchos frameworks de aplicaciones web entre los que puedes/debemos elegir:https://en.wikipedia.org/wiki/Comparison_of_web_frameworks
¿Por qué alguien seleccionaría un framework escrito en un lenguaje de programación que no es «mainstream»…?
¿Por qué ya no usamos Hapi.js…?
Esta es una información errónea. Todavía estamos usando Hapi.jspara un número de proyectos donde es apropiado. ¡
Esto incluye varios proyectos de clientes y aplicaciones/herramientas internas de dwyl.
Decidimos usar Phoenix para nuestros nuevos proyectos por estas simples razones:
- Elixir es un lenguaje más agradable que JavaScript.
#LessIsMore
#LessButBetter
#SmallIsBeautiful
#SyntaxMatters
- ¡JS puede ser funcional, mientras que Elixir es (siempre) Funcional!La distinción hace toda la diferencia!
Con la programación «funcional», los programas son mucho más fáciles de pensar mientras los estás escribiendo/manteniendo! - Elixir utiliza la VM Erlang que es mucho más eficiente/potente que «V8»
- La VM Erlang escala mucho más fácil a multi-núcleo multi-servidor multi-centro de datos que Node.¡js
(¡o casi cualquier otra cosa!!)
¡Para nuestros nuevos proyectos necesitamos tolerancia a fallos en centros de datos múltiples!
¡Obtenemos eso «gratis» usando Erlang – Elixir – Phoenix!!!
En nuestra opinión Hapi.js sigue siendo «el mejor» framework de Node.js y lo continue
usaremos y recomendaremos
a la gente que necesite aplicaciones simples que escalen y sean fáciles de mantener.
ver: https://github.com/dwyl/learn-hapi
También seguimos utilizando JavaScript para todos nuestros microservicios de AWS Lambda, eso no va a cambiar.
¡Son simples, eficientes y escalan muy bien!
Ver: https://github.com/dwyl/learn-aws-lambda
¿Qué hay de «malo» en usar Rails o Django?
¡Los frameworks web «productivos» originales fueron «Ruby-on-Rails» y «Django» (python) allá por 2005!
(¡Usamos ambos durante períodos en nuestro «viaje» y podemos hablar de las ventajas de cada uno de ellos!)
No hay «nada malo» en usar Rails o Django.
Creemos que todavía hay un montón de casos de uso para ambos frameworks. ¡
Sólo sabemos que es (mucho) más fácil construir en «tiempo real»
con Phoenix porque los «Canales» (WebSockets) están incorporados,
y la concurrencia de Elixir/Erlang es un juego completamente diferente! ¡
Erlang (y por lo tanto Phoenix) puede manejar millones de usuarios concurrentes en un solo servidor,
mientras que un servidor Rails/Django sólo puede manejar unos pocos miles (¡en el mejor de los casos!)
si tu aplicación sólo sirve a unos pocos miles de personas a la vez, entonces estás bien!
Nos encanta el hecho de que Erlang utiliza procesos «ligeros de larga duración»,
lo que significa que podemos conectar millones de dispositivos (IoT) …¡Para IoT Erlang es (sin duda) la Respuesta!
Para aplicaciones web más sencillas en las que sólo esperas unos pocos usuarios al día,Rails/Django siguen siendo viables.
¿Pero por qué comprometerse si no tienes que hacerlo?
Si puedes tener un Tesla por el «precio» de un Ford Focus, ¿por qué no lo harías?
¿Por qué conformarse con lo bueno cuando puedes tener/usar fácilmente lo mejor?
Pero GitHub sigue usando Rails… ¿Seguro que GitHub es «escalable»?
Sí, GitHub sigue usando Rails para su aplicación/sitio web.
Pero pregúntale a cualquiera de los miembros del equipo principal de GitHub si (si tuvieran la oportunidad de empezar de nuevo) elegirían Rails
para construir GitHub en 2017, y verás cuántos de ellos dicen «sí, por supuesto» (con cara de circunstancias…)!
Además, GitHub hace muchas cosas para escalar Rails en segundo plano. ¡
Y muchas de sus características más nuevas (del lado del cliente) están escritas en JavaScript! https://github.com/github
En resumidas cuentas: cualquier cosa se puede hacer escalar usando «DevOps»,
pero Phoenix está hecho para escalar pordefault
¡porque Erlang (fue) inventado (para) escalar!
¿Por qué NO usar Go?
«Hay dos tipos de lenguajes de programación – los que nadie usa y los que todo el mundo se queja» ~ Bjarne Stroustrup(creador de
C++
)
Go es muy popular. En gran parte debido a que Google lo «patrocina».
Se pretendía simplificar (sustituir) C++
y Java dentro de Google…
y en su mayor parte, ha tenido éxito!
Nos gusta mucho Go. Fue nuestra elección «número dos» al decidir qué lenguaje de programación
(después de Elixir) en nuestra «pila post JS»…La decisión de utilizar elixir
en lugar de cualquier cosa else
fue fácil:
- Elixir es funcional (mucho más simple de leer/escribir/mantener/extender)
- Las funciones de Elixir se componen de una manera realmente elegante como «plugs»/»pipelines»
- Los datos son inmutables lo que hace que el estado de la aplicación sea predecible (¡no hay que adivinar!)
- Los tipos son dinámicos e inferidos (no hay necesidad de declararlos manualmente)pero hay reglas que simplifican las cosas y el compilador las comprueba dando una advertencia apropiada.
- Erlang hace que las aplicaciones distribuidas sean mucho más fáciles y nuestro plan es construir sistemasIoT que significarán la conexión de muchos (millones) dispositivoscon conexiones persistentes, ¡Erlang fue hecho para esto!
- Phoenix incluye muchas cosas útiles fuera de la caja incluyendo varias características de seguridad en las que la mayoría de la gente ni siquiera piensa.
Más lecturas:
- Por qué Go no es bueno: http://yager.io/programming/go.html
- Go Web Frameworks: https://medium.com/code-zen/why-i-don-t-use-go-web-frameworks-1087e1facfa4
- Por qué todo el mundo odia Go: https://npf.io/2014/10/why-everyone-hates-go/(título click-bait, algunos puntos válidos…)
- Discusión: https://www.reddit.com/r/elixir/comments/3c8yfz/how_does_go_compare_to_elixir
(se busca ayuda para ampliar esta respuesta…)
¿Por qué NO usar Scala + Play Framework en su lugar…?
Si ya estás acostumbrado a escribir en Java o a desplegar en la JVM, el Play Framework es una magnífica opción: https://www.playframework.com
¡Scala es un buen lenguaje de programación y todo el mundo debería aprenderlo!https://www.scala-lang.org/what-is-scala.html
¡Hemos utilizado Play unas cuantas veces (antes de adoptar Node.js)y nos ha gustado mucho!
Pero Scala es un lenguaje de programación «kitchen sink» (multiparadigma) que permite usar «todo Java»…
Pensamos que la «interoperabilidad de Java» de Scala significa que es «demasiado fácil» permitir la complejidad en su código base. Específicamente «OOP Mutation» …
Entonces, ¿por qué nosotros (DWYL) ya no usamos «Play» para los nuevos proyectos? En primer lugar, hicimos la transición a Hapi.js (Node.js) hace unos añosporque era más «ligero» y nos permitía escribir pequeños programasque utilizaban sólo unos pocos megas de RAM (donde nuestras aplicaciones de Play consumían muchos recursos….¿has intentado alguna vez ejecutar una aplicación Scala en un portátil «básico» como un Chromebook…)
Resumen de las «razones» para Phoenix en lugar de Play:
- Mantenemos que Play/Scala todavía tiene un montón de casos de uso válidos.
- Elixir es mucho más simple que Scala.
- La VM de Erlang es mucho mejor en concurrencia que la JVM.
- Nos encanta el hecho de que todos los datos son inmutables en Elixir.
- Amamos los pocos recursos que se necesitan para ejecutar una aplicación Phoenix(¡por ejemplo en una Raspberry Pi!)
Simplemente pensamos que para nuestro(s) proyecto(s) el modelo de concurrencia de Erlang funciona mejor y el código funcional que transforma los datos inmutables es más fácil de probar y mantener.
¡Si tienes pruebas de que «Scala es más sencillo «nos encantaría que nos lo dijeras!
Díganoslo: https://github.com/dwyl/learn-phoenix-web-development/issues
¿Por qué no usar Haskell?
Si te gusta tanto la Programación Funcional (PF), ¿por qué no usar Haskell?