Programación en Elixir
Una guía completa sobre programación funcional y concurrente usando Elixir. Cubre la transición desde el pensamiento orientado a objetos hacia el pensamiento funcional, coincidencia de patrones, inmutabilidad, el modelo de actor para concurrencia y la construcción de sistemas distribuidos robustos con OTP.
Lecciones
Descripción del curso
📚 Resumen del Contenido
Una guía completa sobre programación funcional y concurrente con Elixir. Cubre la transición de la programación orientada a objetos hacia el pensamiento funcional, el patrón de coincidencia, la inmutabilidad, el modelo de actor para la concurrencia y la creación de sistemas distribuidos robustos con OTP.
Domina el arte de construir sistemas concurrentes resilientes mediante la belleza de la programación funcional.
Autor: Dave Thomas
Agradecimientos: José Valim, Corey Haines, Bruce Tate, Jessica Kerr, Anthony Eden, Chad Fowler, Kim Shrier, Candace Cunningham y Potomac Indexing.
🎯 Objetivos de Aprendizaje
- Contrastar el modelo de transformación de datos de Elixir con la programación convencional basada en estado.
- Configurar la shell interactiva de Elixir (IEx) y ejecutar código de Elixir mediante scripts y compilación.
- Aplicar el operador de coincidencia (
=), el operador de fijación (^) y el comodín (_) para descomponer y validar datos. - Explicar las implicaciones teóricas y prácticas de la inmutabilidad sobre el rendimiento y la gestión de memoria.
- Identificar y utilizar los tipos integrados de Elixir, incluyendo tipos de Valor, Sistema y Colección.
- Aplicar las reglas de ámbito de variables y la expresión
withpara gestionar transformaciones de datos complejas. - Crear e invocar funciones anónimas utilizando notación estándar y notación de captura (
&). - Implementar funciones nombradas dentro de módulos usando coincidencia de patrones y recursión para manejar lógica compleja.
- Aplicar cláusulas de guarda y parámetros por defecto para controlar el flujo de ejecución de funciones.
- Descomponer y Construir Listas: Utilizar el patrón de cabeza/cola para navegar y construir estructuras de listas recursivas.
🔹 Lección 1: Introducción a Elixir y Coincidencia de Patrones
Resumen: Esta lección presenta Elixir como un lenguaje funcional centrado en la transformación de datos más que en la mutación de estados. Los estudiantes aprenderán a navegar en el entorno de Elixir (IEx), compilar y ejecutar scripts, y dominar la Coincidencia de Patrones—el mecanismo fundamental que Elixir utiliza para la asignación de variables y el flujo de control.
Resultados de Aprendizaje:
- Contrastar el modelo de transformación de datos de Elixir con la programación convencional basada en estado.
- Configurar la shell interactiva de Elixir (IEx) y ejecutar código de Elixir mediante scripts y compilación.
- Aplicar el operador de coincidencia (
=), el operador de fijación (^) y el comodín (_) para descomponer y validar datos.
🔹 Lección 2: Inmutabilidad y Conceptos Básicos de Elixir
Resumen: Esta lección explora la filosofía fundamental de Elixir: la inmutabilidad. Los estudiantes aprenderán cómo Elixir trata los datos como entidades inmutables, los beneficios de rendimiento de este enfoque y los diversos tipos integrados—desde tipos simples como átomos y rangos hasta colecciones complejas como mapas y binarios. La lección concluye con un análisis profundo del ámbito de variables y la poderosa expresión with.
Resultados de Aprendizaje:
- Explicar las implicaciones teóricas y prácticas de la inmutabilidad sobre el rendimiento y la gestión de memoria.
- Identificar y utilizar los tipos integrados de Elixir, incluyendo tipos de Valor, Sistema y Colección.
- Aplicar las reglas de ámbito de variables y la expresión
withpara gestionar transformaciones de datos complejas.
🔹 Lección 3: Funciones, Módulos y el Operador de Tubo
Resumen: Esta lección explora el núcleo de la programación en Elixir: la transformación funcional. Cubre la transición desde funciones anónimas y cierres hasta módulos estructurados y funciones nombradas. Los estudiantes aprenderán a aprovechar la coincidencia de patrones, la recursión y el operador de tubo para crear código conciso, legible y mantenible, interactuando con la máquina virtual Erlang subyacente.
Resultados de Aprendizaje:
- Crear e invocar funciones anónimas utilizando notación estándar y notación de captura (
&). - Implementar funciones nombradas dentro de módulos usando coincidencia de patrones y recursión para manejar lógica compleja.
- Aplicar cláusulas de guarda y parámetros por defecto para controlar el flujo de ejecución de funciones.
🔹 Lección 4: Listas Recursivas y Estructuras de Datos
Resumen: Esta lección cubre los mecanismos fundamentales de las listas de Elixir mediante recursión, centrándose específicamente en el patrón "Cabeza y Cola" para procesar y construir datos. Se transita hacia estructuras de datos complejas—Mapas, Structs y Listas de Palabras Clave—proporcionando un marco de decisión para seleccionar la estructura adecuada y técnicas avanzadas para manipular datos anidados usando el módulo Access y la teoría de tipos de Elixir.
Resultados de Aprendizaje:
- Descomponer y Construir Listas: Utilizar la coincidencia de patrones de cabeza/cola para navegar y construir estructuras de listas recursivas.
- Implementar Patrones de Alto Nivel: Crear funciones personalizadas
mapyreducepara transformar o agrupar datos de listas. - Seleccionar Estructuras de Datos Adecuadas: Diferenciar entre Mapas, Structs y Listas de Palabras Clave según necesidades de rendimiento, ordenación e integridad de datos.
🔹 Lección 5: Enumerables, Streams y Procesamiento de Cadenas
Resumen: Esta lección explora el enfoque dual para el procesamiento de colecciones en Elixir: el módulo Enum, que es agresivo, y el módulo Stream, que es perezoso y composicional. También ofrece un análisis profundo de la transformación de datos mediante comprensiones y los mecanismos internos de las cadenas de Elixir, distinguiendo entre listas de caracteres (entre comillas simples) y binarios (entre comillas dobles). Los estudiantes aprenderán a procesar estructuras de datos complejas, manejar datos infinitos y realizar extracción de bits a bajo nivel.
Resultados de Aprendizaje:
- Distinguir entre evaluación agresiva y perezosa al procesar colecciones.
- Utilizar comprensiones de listas con múltiples generadores y filtros para transformar datos y extraer información a nivel de bits.
- Distinguir entre cadenas entre comillas simples (listas de caracteres) y cadenas entre comillas dobles (binarios) y aplicar el módulo correcto (List vs. String) para su manipulación.
🔹 Lección 6: Flujo de Control, Proyectos Mix y Herramientas Profesionales
Resumen: Esta lección guía a los desarrolladores a través de la transición desde escribir funciones aisladas de Elixir hasta construir, probar y monitorear aplicaciones profesionales. Cubre estructuras de control avanzadas (case, cond), el ciclo de vida de un proyecto Mix (desde la estructura de directorios hasta ejecutables CLI) y el conjunto de herramientas profesionales utilizadas para depuración, pruebas basadas en propiedades y monitoreo de servidores.
Resultados de Aprendizaje:
- Implementar lógica de ramificación compleja usando
case,condy manejo de excepciones. - Estructurar proyectos de Elixir usando
Mix, gestionar dependencias externas comoHTTPoisonyPoison, y configurar entornos de aplicación. - Desarrollar suites de pruebas robustas utilizando
ExUnit,DocTesty pruebas basadas en propiedades conStreamData.
🔹 Lección 7: Concurrencia y Nodos Distribuidos
Resumen: Esta lección explora la transición de aplicaciones de Elixir de un solo proceso a sistemas distribuidos. Cubre los mecanismos de manejo de mensajes, la persistencia de procesos mediante bucles recursivos de cola y la gestión robusta del ciclo de vida de procesos mediante enlaces y monitores. Finalmente, introduce el modelo de distribución de la máquina virtual Erlang, enseñando a conectar nodos, protegerlos con cookies y manejar la entrada/salida a través de una red.
Resultados de Aprendizaje:
- Implementar procesos estatales y persistentes usando recursión de cola y temporizadores de mensajes.
- Construir árboles de procesos tolerantes a fallos usando enlaces (
spawn_link) y monitores (spawn_monitor). - Configurar y conectar nodos distribuidos usando convenciones de nombres, cookies de seguridad y registro global de procesos.
🔹 Lección 8: Fundamentos de OTP: Servidores y Supervisores
Resumen: Esta lección presenta el marco Open Telecom Platform (OTP) dentro del ecosistema de Elixir, centrándose específicamente en el comportamiento GenServer y los patrones de Supervisor. Los estudiantes aprenderán a construir procesos de servidor robustos y estatales, diferenciar entre comunicación síncrona y asíncrona, e implementar árboles de supervisión tolerantes a fallos que gestionen automáticamente el ciclo de vida de los procesos.
Resultados de Aprendizaje:
- Definir los componentes principales de OTP e implementar el ciclo de vida estándar de
GenServer. - Diferenciar entre y implementar patrones de mensaje síncronos (call) y asíncronos (cast).
- Configurar y desplegar un Supervisor para monitorear procesos trabajadores y mantener la confiabilidad del sistema ante fallos.
🔹 Lección 9: Arquitecturas OTP Complejas y Gestión de Estado
Resumen: Esta lección pasa de los GenServers individuales a diseñar y desplegar aplicaciones OTP complejas y multi-componente. Cubre el diseño arquitectónico del buscador de archivos duplicados "Duper", los mecanismos de especificaciones de aplicaciones OTP y técnicas avanzadas de despliegue incluyendo actualizaciones en caliente usando Distillery. Además, explora alternativas simplificadas de gestión de estado como Tasks y Agents, proporcionando un marco para elegir la herramienta adecuada según las necesidades de concurrencia específicas.
Resultados de Aprendizaje:
- Analizar los requisitos de la aplicación usando el marco de cinco preguntas para identificar puntos focales y características de tiempo de ejecución.
- Construir una aplicación OTP multi-servidor (Duper) utilizando servidores especializados (Results, PathFinder, Gatherer) y Supervisores Dinámicos.
- Realizar lanzamientos de código y actualizaciones en caliente usando Distillery, incluyendo la migración de estado mediante la devolución
code_change.
🔹 Lección 10: Metaprogramación, Protocolos y Seguridad de Tipos
Resumen: Esta lección explora la extensibilidad avanzada de Elixir, centrándose en cómo manipular el código como datos mediante metaprogramación y macros. Los estudiantes aprenderán a lograr polimorfismo usando Protocolos y Comportamientos, estructurar sistemas a gran escala con proyectos Umbrella y implementar un manejo robusto de errores. Finalmente, la lección aborda añadir una capa de análisis estático usando el sistema de tipos de Elixir y Dialyzer para garantizar la corrección del código.
Resultados de Aprendizaje:
- Dominar el uso de
quoteyunquotepara insertar y manipular bloques de código dentro de macros. - Implementar Protocolos y Comportamientos personalizados para crear estructuras de código polimórficas y reutilizables.
- Construir proyectos Umbrella multi-app y aplicar Especificaciones de Tipo formales al código dinámico de Elixir.