Recientemente elegimos Elixir / Erlang como nuestro principal lenguaje de fondo en Taskworld, alejándonos de una solución 100% Node.js.
El equipo evaluó 4 alternativas diferentes, construyendo una API REST simple usando Go (usando Gorilla), Rust (Hierro, níquel), Scala (Spray) y Elixir / Erlang (Phoenix, Cowboy).
Elixir ganó por un ligero margen (sobre Go ).
- Cómo saber qué compañía es mejor para el desarrollo de sitios web
- ¿Por qué muchas empresas están adoptando AEM como su nuevo CMS / Framework?
- ¿Cuáles son las mejores y mejores empresas de desarrollo de aplicaciones móviles?
- ¿Cuáles son las mejores firmas de redacción?
- ¿Debería una empresa dedicarse a la especialización de productos o debería abogar por la diversificación de productos?
Todavía usamos Node and React / Flux para nuestro front-end.
Es perfecto para nosotros ya que renderizamos previamente nuestros componentes React en el servidor y confiamos en Browserify y Gulp como parte de nuestro ciclo de desarrollo.
Pero decidimos que no queríamos construir un back-end grande en JavaScript , por varias razones;
1. La mutabilidad de los objetos JavaScript.
Este es bastante simple; Los desarrolladores pasan objetos a funciones por referencia y luego terminan mutando esos objetos ; de hecho, el lenguaje los alienta a hacerlo.
Esto puede conducir a errores sutiles y difíciles de detectar.
Al escribir el código React ( Flux almacena en particular), debemos solucionar este problema clonando constantemente los objetos a cambio porque los objetos JavaScript también se devuelven por referencia (los objetos se asignan en el montón).
Tener que hacer un seguimiento de lo que debe seguir siendo una referencia y lo que debe clonarse / copiarse es más que una molestia, es ineficiente ya que la clonación de objetos grandes es lenta.
Este problema se magnifica cuando se escribe un back-end grande, que lleva al punto número dos.
2. Tener que probar TODO.
No hay que apoyarse en el compilador al escribir JavaScript.
Los problemas normalmente se detectan en tiempo de ejecución, y eso aumenta la necesidad de realizar pruebas.
No me malinterpretes; Las pruebas son importantes sin importar el idioma que uses.
Pero la cantidad de pruebas necesarias para obtener una cobertura decente difiere mucho de un idioma a otro.
Los lenguajes de tipo estático como Go , Rust y Scala le permiten detectar muchos errores en el momento de la compilación (Rust es especialmente bueno en esto), eliminando la necesidad de realizar algunas pruebas unitarias.
Elegimos Elixir / Erlang, a pesar de que utiliza la escritura dinámica, principalmente debido a sus tipos inmutables.
El estilo funcional de Elixir , junto con la coincidencia de patrones y las especificaciones, crean un código más sólido.
Dado que los tipos de JavaScript son lo que son (es decir, inconsistentes), obliga a los desarrolladores a realizar pruebas más exhaustivas.
3. Programación asincrónica y E / S sin bloqueo.
Si bien esto tiene ventajas y podría decirse que es el principal beneficio del uso de Node.js , su implementación en la API Node.js , con la introducción de la convención de devolución de llamada Node, genera un código de aspecto extraño.
Sin embargo, eliges lidiar con las devoluciones de llamada en Node.js , ya sea a través de Fibers, Q / ES6 Promises o Async (los hemos usado todos, pero nos inclinamos hacia Q ), teniendo que trabajar constantemente alrededor del “infierno de devolución de llamada” envolviendo funciones las llamadas envejecen después de un tiempo.
Las tareas de programación de back-end más comunes requieren un flujo síncrono estándar; es decir, recuperar datos, procesar los datos, obtener más datos en función del resultado, realizar más procesamiento, etc.
Tener que compensar el modelo de programación asíncrono de Node.js el 75% o más del tiempo simplemente no puede considerarse “correcto”.
Preferimos procesos en elixir, o rutinas Go, para hacer paralelismo en el back-end.
ACTUALIZAR:
Para obtener más información sobre por qué el equipo elige Elixir sobre Go, eche un vistazo a mi respuesta en los comentarios .
Salud.