
¿Por qué Elixir / Phoenix está logrando una tasa de adopción tan alta en la industria del desarrollo de software? ¿Cuáles son los mejores casos de uso de este idioma? ¿Hay algún inconveniente al usarlo? Hablamos con Sergiy Kukunin, un desarrollador de pila completa en
Spotlight y un experto en Elixir, para encontrar respuestas a estas y otras preguntas.
Ivan: ¿por qué el Elixir se está volviendo tan popular?
Sergey: Elixir presenta principios que rara vez se cumplen en otros idiomas. Además, se basa en Erlang, que se utiliza para construir redes de telecomunicaciones. Como resultado, tenemos una herramienta altamente confiable para proyectos de alta carga que ha sido probada con el tiempo.
Esto es esencial, ya que en los últimos años el progreso tecnológico del hardware se está ralentizando. El rendimiento de un núcleo de la CPU ha alcanzado el límite físico de 5 GHz. Lo único que se les ocurrió a los fabricantes para aumentar el rendimiento del hardware es usar cada vez más núcleos.
El problema con este enfoque es que necesita un software que sea capaz de trabajar con múltiples núcleos en paralelo. Los lenguajes de programación clásicos son poco adecuados para tales tareas. Cuando hablamos de subprocesos múltiples en, digamos, C, sabemos que hay memoria compartida y varios subprocesos que pueden competir por los recursos. En tales condiciones, es difícil crear un código confiable para proyectos de alta carga debido a condiciones de carrera aleatorias y fallas de segmentación.
Elixir está resolviendo este problema de manera efectiva al introducir un nuevo enfoque para el subprocesamiento múltiple.
¿Cuáles son las principales ventajas de esta tecnología?
La primera característica esencial del lenguaje que proviene de su naturaleza funcional es la inmutabilidad. Una vez que hemos creado y cargado la estructura de datos (no hay objetos en lenguajes funcionales), no podemos alterarla, excepto recreándola desde cero nuevamente.
Por un lado, esta peculiaridad eleva el umbral de entrada para usar Elixir, ya que no puede elegir una parte de una aplicación e intentar grabar algo allí repetidamente, y terminar con todo en funcionamiento. Por otro lado, esto hace que el ingeniero planifique la arquitectura de una aplicación más a fondo.
La máquina virtual Elixir es literalmente un mini-SO, donde cada proceso tiene su propio espacio de memoria. Ningún otro proceso puede entrar en él, tomando prestados sus recursos. Todo lo que puede hacer un proceso es enviar un mensaje a otro proceso, sin control de cómo procesará el mensaje. Además, como es un lenguaje funcional, no hay estructuras de datos que no puedan transmitirse entre procesos, incluso a través de la red (a diferencia del enfoque utilizado en los lenguajes orientados a objetos).
Es más difícil escribir código Elixir debido a las múltiples restricciones que aplica el tiempo de ejecución, y lleva más tiempo que componer algo usando Java. Sin embargo, la fiabilidad general de una aplicación es muy alta.
¿Hay alguna alternativa al Elixir?
El enfoque más similar son las corutinas utilizadas en el lenguaje Go. Además, los greenlets y fibras de Python en Ruby proporcionan un enfoque similar, pero no hay tiempo de ejecución tan robusto y rápido disponible para ejecutarlos. El desarrollador debe decidir cómo ejecutar estas rutinas, mientras que Erlang se encarga de eso por sí mismo.
Cualquier herramienta tiene sus inconvenientes. ¿Qué son para Elixir?
Elixir hoy es una herramienta lista para la producción, pero el ecosistema lingüístico general todavía es demasiado joven. En particular, esto significa que no puede simplemente iniciar sesión en Stack Overflow y encontrar una respuesta a cualquiera de sus posibles preguntas, como puede hacer en Ruby, por ejemplo. Sí, hay libros, cursos y algunos blogs, pero deberá realizar continuamente su investigación y experimentos para resolver muchas tareas cotidianas. Este es el principal inconveniente para mí.
Además, es más difícil probar las aplicaciones de Elixir, ya que las pruebas unitarias son menos útiles, y debe centrarse más en las de integración. Sin embargo, debe recordar que casi todas las funciones de Elixir son limpias, lo que simplifica las pruebas unitarias: hay una única salida para cada entrada.
¿Podría describir el caso cuando usar Elixir proporciona resultados máximos?
Si no tiene ninguna necesidad real de soportar altas cargas con millones de solicitudes procesadas por su aplicación, entonces Elixir no es una herramienta que deba molestarse en usar. Sin embargo, Elixir es una solución perfecta para proyectos reales de alta carga. Puede que ni siquiera escriba toda su aplicación usándola, pero usar Elixir para las partes más populares de un sistema siempre será una buena idea.
En la era de un Internet dinámico, cuando los usuarios esperan velocidades muy altas y una respuesta inmediata por parte de cualquier sitio web, especialmente los recursos relacionados con el contenido. Si, por ejemplo, tiene un medio de comunicación en línea con muchas conexiones simultáneas de miles de lectores que desean recibir actualizaciones de noticias al instante, entonces mudarse a Elixir hará que su vida sea mucho más fácil.
Experiencia personal: en un proyecto teníamos una aplicación web Node.js capaz de mantener hasta 20,000 conexiones a la vez. Después de mudarse a Elixir, este número aumentó a 80,000 sin cambios en la lógica comercial o algo. Este resultado fue posible únicamente debido a la mejor eficiencia del lenguaje que utilizamos.
Elixir permite crear cosas que eran impensables hace solo unos años, como la creación de juegos en línea que se procesan completamente en el lado del servidor mediante sockets web. Incluso hay un ejemplo del juego Web Snake escrito en Elixir sin ningún código JavaScript.
Sin embargo, los desarrolladores deben entender que no hay una bala de plata. Elixir no puede darle más de lo que inicialmente tenía derecho la máquina virtual Erlang. Simplemente traduce una nueva sintaxis para que el compilador antiguo pero bueno creado por Ericsson a finales de los 90 pueda entenderlo. Este es un ejemplo perfecto de cómo la tecnología probada en el tiempo combinada con una nueva puede abrir nuevas posibilidades para los desarrolladores, pero siempre hay algunas limitaciones.
¿Cuál es su consejo al comenzar a usar Elixir? ¿Qué tecnología debería uno estudiar para comenzar a funcionar más rápido?
Bueno, la sintaxis de Elixir tiene algunas cosas en común con Ruby. Los idiomas son completamente diferentes, pero siempre es bueno ver símbolos y elementos a los que estás acostumbrado. Lo más simple es usar algunos de los nuevos marcos de desarrollo web compatibles con Elixir. El framework web más popular para Elixir es Phoenix. Definitivamente deberías probarlo, especialmente si estás acostumbrado a usar Ruby on Rails. Esto simplificará el desarrollo y al mismo tiempo hará que la aplicación sea más rápida y confiable.