Quiero aprender un nuevo lenguaje de programación para back-end. Tengo que elegir entre Elixir y Go. ¿Cuándo usarías Elixir sobre Go y viceversa?

Go es un lenguaje divertido e imperativo y es ideal para proyectos de herramientas de línea de comandos. Es un lenguaje pequeño, bastante rápido, fácil de aprender, con concurrencia de estilo buzón. Como todo se compila en un binario ‘pequeño’ ajustado, es fácil de enviar (siempre y cuando se haya compilado para el arco / os en el que lo está enviando). Todavía tiene problemas, ya que es totalmente fácil compartir variables mutables entre las rutinas que pueden conducir a algunas cosas divertidas en las que probablemente terminará lanzando un mutex al acceder a esa variable, ya que es más fácil que volver a diseñar su programa para pasar el valor de eso. variable alrededor a través de canales.

Pero oh! usted dice, eso es simplemente una programación perezosa y totalmente reparable al no ser una estupidez. Y estarías en lo cierto. Sin embargo, ir tiene otros problemas para ejecutar cosas grandes y de larga duración, como si una gorutina sale terriblemente mal, probablemente llevará consigo todos los malditos procesos que Erlang / Elixir no hará.

De todos modos, como dije, Go es ideal para programas pequeños a medianos. Se utiliza mejor cuando desea una herramienta CLI que tome algunos argumentos, haga algunas cosas y luego deje de ejecutarse y haga todas esas cosas rápidamente . Con gorountines es muy fácil escribir código concurrente (pero no necesariamente seguro). No tiene el “costo de inicio” de un lenguaje basado en VM como Erlang / Elixir, por eso digo que es genial para cosas de CLI, cuando estamos comparando los dos. El BEAM (Erlang VM) definitivamente requiere una cantidad notable de tiempo para iniciarse, por lo que es mucho más adecuado para cosas de larga duración.

Lo que ahora me lleva al Elixir . Un poco de historia, en caso de que no lo sepas: Elixir se ejecuta en el BEAM, también conocido como la máquina virtual Erlang y comparte mucho en común con Erlang. Elixir parece rubí en la superficie, pero es muy diferente. Elixir es un lenguaje funcional y, por lo tanto, si no ha tratado con uno de esos antes, se encontrará con una curva de aprendizaje. Olvídate de OOP, olvida los bucles tradicionales (while / for), olvida las variables mutables. Olvida todas esas cosas. Escribes funciones, esas funciones hacen una pequeña unidad de trabajo y regresan. Sin embargo, definitivamente vale la pena aprender un lenguaje funcional (y no mejor que Elixir o Erlang). Erlang a menudo se acredita como el abuelo de la concurrencia de buzón / actor / estilo erlang (que es donde Go obtuvo su modelo de concurrencia). Sin embargo, también vale la pena señalar algo más al respecto, algo más que Go no tiene, y eso es tolerancia a fallas . Arriba dije que si una gorutina tiene forma de pera, lleva todo el proceso. Ese tipo de mierda simplemente no volaría en el campo de las telecomunicaciones en el que se desarrolló Erlang. Si un proceso Erlang (no un proceso del sistema operativo, un proceso Erlang) muere, muere. Todos los demás procesos en el sistema están bien y Erlang tiene facilidades para que los procesos monitoreen otros procesos y se vuelvan a poner en marcha si uno muere. Es jodidamente increíble. Absolutamente hermoso.

De todos modos, Elixir es ideal para cosas de larga duración, como cosas web de back-end. Su simultaneidad (y la capacidad de utilizar completamente múltiples procesadores de forma casi automática) y la tolerancia a fallas lo hacen increíble para aplicaciones web de larga duración. Con Phoenix, no es demasiado difícil poner en funcionamiento una aplicación web. También es una opción perfecta para cualquier tipo de servicio [micro] que necesite ejecutarse durante un tiempo y que esté activo todo el tiempo.

Si eliges seguir adelante con Elixir, te recomiendo encarecidamente Elixir de programación de Dave Thomas. Tampoco sería una mala idea tener un poco de Erlang en tu haber, ya que es posible que tengas que tocarlo a veces, que hay dos grandes libros para eso: Fred Hebert’s Learn You Some Erlang (que puedes comprar como árbol muerto) o leer en línea) y Programming Erlang de Joe Armstrong (él es el inventor del lenguaje).

TL; DR: Creo que Go es excelente para cosas de CLI de corta duración y Elixir / Erlang es excelente para servicios de larga duración que necesitan mantenerse activos y ser rápidos.

Cuando desarrollo una aplicación con una base de usuarios pequeña a mediana, como un sistema de gestión de estudiantes (escuela), un menú de restaurante, un carrito de compras para una pequeña tienda local en línea, etc., utilizo Rails. Los rieles pueden manejar fácilmente tanto tráfico con la configuración predeterminada y un poco de almacenamiento en caché.

Si estoy desarrollando alguna aplicación con una base de usuarios muy grande y capacidades en tiempo real como transmisiones en vivo o notificaciones, usaré Go para un alto rendimiento en recursos de servidor comparativamente bajos.

Elixir es algo intermedio, su marco Phoenix es tan fácil de usar como Rails, pero carece de paquetes en comparación con la cantidad de Gemas para Rails de alta calidad, por lo que no es tan productivo como Rails, pero aún más productivo para aplicaciones web que Golang. Su rendimiento es varias veces mayor que Rails pero varias veces menor que Go.

Me preguntaría por qué son tus opciones entre Elixir y Go. ¿Y qué esperas sacar de un nuevo lenguaje de programación?

No he hecho mucho con Elixir, pero aprendí Go hace poco más de un año y puedo describir por qué elegí eso. Mi experiencia era principalmente en Java, PHP, C #, etc. Nunca estuve muy contento con ninguno de ellos y Go sonaba como una gran iteración. Hizo docenas y docenas de cambios relativamente pequeños que, en conjunto, hicieron que la experiencia de la programación fuera mucho más fluida (al menos para mí). Como era efectivamente una iteración sobre otros lenguajes OO de propósito general, aprenderlo no fue tan difícil. Muchos de los patrones de diseño que alienta también son transferibles a otros idiomas que necesito usar en la oficina, por lo que hubo un beneficio adicional allí.

Diría que si su experiencia es similar a la mente y está buscando repetir lo que sabe, Go sería una excelente opción. Si, en cambio, su fondo es similar al mío pero desea probar algo DRASTICAMENTE diferente, vaya con Elixir. Viceversa, si su fondo está en lenguajes de programación más funcionales y desea iterar, intente con Elixir. Para algo drásticamente diferente, prueba Go.

Si, en cambio, su objetivo es “Quiero construir una aplicación que haga X”, mi recomendación sería aprender ambos y construir prototipos en ambos. La base de su próxima aplicación no puede basarse en la recomendación de otra persona. Tiene que basarse en tus fortalezas como programador.

Para los backends web, casi siempre preferiría Elixir. ¿Por qué?

En primer lugar, prefiero la sintaxis de Elixir, pero esa no es la razón principal. La razón principal es la tolerancia a fallas y el manejo de errores. Si bien debe detectar cualquier caso de borde explícitamente en Go y debe manejar cualquier caso exactamente donde sucede, simplemente deja que se bloquee en Elixir y maneje las consecuencias con los supervisores. Sí, en el caso de un back-end web, no debería tener la situación en la que su proceso falla, pero incluso si eso sucede, su aplicación no estaría inactiva por un nano segundo. Además, Go te obliga a escribir mucho código repetitivo. Elixir es mucho más pragmático en comparación con Go y eso es algo que le permite iterar más rápido en su código.

Para mí, el objetivo principal de Go no es escribir backends web, sino aplicaciones nativas que se ejecutan en dispositivos externos. Al igual que los conectores que se instalan localmente en las máquinas de mis clientes para enviar datos a mi aplicación. La compilación cruzada es una gran característica de Go. Elixir, por otro lado, es ideal para aplicaciones web. Phoenix es uno de los mejores webframeworks que he visto hasta ahora.

Sin embargo, si le gusta trabajar con idiomas que son de nivel más bajo o de tipo guardar, tome Go. Si prefiere idiomas de alto nivel, Elixir es la mejor opción. Por cierto, el Elixir se puede hacer más tipo salvo proporcionando guardias, etc.

Espero que te ayude a tomar una decisión. Feliz codificación

Podría usar Go cuando necesite más potencia de procesamiento sin procesar para, por ejemplo, el procesamiento de números (hay implementación del nodo Erlang en Go, por lo que podría ser más fácil interactuar con él), pero prefiero Rust o Haskell (dependiendo de la exactitud requisitos). Y eso es.