<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JavaScript Chile</title>
    <description>The latest articles on DEV Community by JavaScript Chile (@javascriptchile).</description>
    <link>https://dev.to/javascriptchile</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F7892%2F13eff38a-1832-4eb7-942f-f26636c008a3.png</url>
      <title>DEV Community: JavaScript Chile</title>
      <link>https://dev.to/javascriptchile</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/javascriptchile"/>
    <language>en</language>
    <item>
      <title>Separación de Responsabilidades de los Dispositivos</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Sat, 24 Jan 2026 17:49:45 +0000</pubDate>
      <link>https://dev.to/javascriptchile/separacion-de-responsabilidades-de-los-dispositivos-3meb</link>
      <guid>https://dev.to/javascriptchile/separacion-de-responsabilidades-de-los-dispositivos-3meb</guid>
      <description>&lt;p&gt;La verdad yo creo que mi vida era mucho más ordenada y simple cuando mi celular solo podía conectarse a internet a páginas &lt;a href="https://es.wikipedia.org/wiki/Protocolo_de_aplicaciones_inal%C3%A1mbricas" rel="noopener noreferrer"&gt;WAP&lt;/a&gt; usando &lt;a href="https://es.wikipedia.org/wiki/Symbian" rel="noopener noreferrer"&gt;Symbian&lt;/a&gt; en un Nokia por allá en el 2007 y solo lo utilizaba para descargar ringtones midi.&lt;/p&gt;

&lt;p&gt;Creo que más de 10 años usando iPhone y otros "smartphones" ha mermado mi capacidad de concentración y restado a mi calidad de vida en general. Ha llegado el momento de replantear la relación que yo tengo con la tecnología, sobre todo la que es muy enganchante como las redes sociales.&lt;/p&gt;

&lt;p&gt;Siendo un Ingeniero en Software es necesario evaluar estos temas por que la tecnología informática siempre ha sido de mi predilección frente a otras áreas del conocimiento humano. Una vez que se masificaron los smartphones y las redes sociales, poco a poco el tiempo que dedicaba a leer libros, hacer artesanías u simplemente disfrutar el día se ha disminuido notablemente, sobre todo durante y luego de la pandemia. Dedicando un tiempo poco saludable a mirar una pantalla pequeña. Las redes sociales y las constantes notificaciones se han vuelto un sifón de atención y energía que debo controlar.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Es ser un Ludista?
&lt;/h2&gt;

&lt;p&gt;No creo que la solución sea eliminar la tecnología actual de nuestras vidas. No abogo ser un seguidor de &lt;a href="https://es.wikipedia.org/wiki/Ludismo" rel="noopener noreferrer"&gt;Ned Ludd&lt;/a&gt;. Pero pienso que las tecnologías actuales sin un orden y control adecuado se han convertido en herramientas de servidumbre del humano hacia la máquina y no como era antes donde la máquina servía al humano.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tecnología Kosher/Halal
&lt;/h2&gt;

&lt;p&gt;Los miembros de la religión Judía utilizan el término "Kosher" para significar que algo "esta bien" y "aprobado" para que un judío utilice un alimento u otro elemento por que está dentro de lo permitido en su religión. Los miembros de la religión Musulmana utilizan el término "Halal" para el mismo fin.&lt;/p&gt;

&lt;p&gt;Dentro de ésta tecnología "Kosher" existen los celulares que no permiten acceso a internet o reproductores de mp3 sin acceso a la radio FM, entre otras restricciones. La idea es evitar acceder a contenido que pudiera ser perjudicial para alguien que siga las normas de la religión.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué opciones hay?
&lt;/h2&gt;

&lt;p&gt;Como Ingeniero en Software es vital estar actualizado en el avance tecnológico y estar capacitado en las tecnologías del estado del arte en la industria que uno desee participar. Pero eso no significa estar conectado 24/7 a la marea de información disponible cada segundo.&lt;/p&gt;

&lt;p&gt;Por lo tanto creo que es pertinente poner algunas reglas que permitan dar orden a todo el caos generado por los "smartphones" y redes sociales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Espacio Dedicado
&lt;/h3&gt;

&lt;p&gt;En la época de los cibercafes pre 2010. La mayoría de las personas tenían un lugar dedicado en la casa para uso del computador. Por que eran comunes las pantallas CRT grandes y equipos pesados. Los notebook si bien existían, tenían precios elevados que no todas las familias podían permitir alcanzar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7a2rukwn7wbz8h37xpp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7a2rukwn7wbz8h37xpp.gif" alt="https://www.goconqr.com/ficha/10306022/hardware-y-software-partes-de-la-computadora" width="519" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hoy es más probable tener un notebook que un computador de escritorio, ya que los computadores de escritorio se asocian más con streaming, videojuegos y situaciones de alta exigencia de recursos por que hay mayor flexibilidad de cambiar componentes.&lt;/p&gt;

&lt;p&gt;Los notebook son más asociados a contextos de trabajo general y navegación de internet, por lo menos las opciones económicas.&lt;/p&gt;

&lt;p&gt;Considero que se debe rescatar esa tradición de tener un lugar dedicado para la computación por que permitía ordenar los espacios y tener un &lt;a href="https://es.wikipedia.org/wiki/Mise_en_place" rel="noopener noreferrer"&gt;mise en place&lt;/a&gt; de la computación.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1wldfolgus1g5txjc8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1wldfolgus1g5txjc8l.png" alt="Mise en Place" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://es.wikipedia.org/wiki/Mise_en_place#/media/Archivo:Mise_en_place_for_hot_station.jpg" rel="noopener noreferrer"&gt;https://es.wikipedia.org/wiki/Mise_en_place#/media/Archivo:Mise_en_place_for_hot_station.jpg&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Tener un Celular Simple
&lt;/h3&gt;

&lt;p&gt;Un celular simple se puede encontrar como "Senior Phones" o "Nonnophone". Hoy todavía se pueden encontrar teléfonos con Symbian o similar que son compatibles. La red 2G ya no es funcional en Chile, por lo que muchos celulares del 2010 o anterior ya no sirven. Pero se pueden encontrar algunos reemplazos bastante buenos.&lt;/p&gt;

&lt;p&gt;Por ejemplo el Teléfono Móvil Senior 3g Nonnophone 3.0 Green-e. &lt;br&gt;
Este celular no tiene acceso a internet, pero si tiene un cargador moderno, bluetooth, radio FM y posibilidad de sacar fotos a la vieja escuela con una cámara 2GP y guardarlas en una tarjeta sd.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3d6awpi4xpnc3pswsae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3d6awpi4xpnc3pswsae.png" alt="https://www.paris.cl/telefono-movil-senior-3g-nonnophone-30-green-e-MKLB8WFK0V.html" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La verdad pienso de que es sumamente útil por que no tiene notificaciones constantes. Los únicos mensajes que llegarán serán por SMS y las llamadas serán de personas que conozcan nuestro número (omitiendo el SPAM de algunas empresas o estafadores). Además no puedes tener instagram, whatsapp, facebook, email, slack, x (ex twitter) o teams instalado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Herramientas de Trabajo
&lt;/h3&gt;

&lt;p&gt;¿No más smartphone?. En mi experiencia es mejor tener ambos tanto un celular simple como uno smart, algunas de las apps necesitan ser usadas y solo funcionan en un celular smartphone como Instagram o a veces piden las empresas usar aplicaciones de OTP para hacer login a la VPN. Por lo que es necesario tener un smartphone para el mundo laboral actual. Sin embargo creo que es necesario ver el smartphone como una herramienta de trabajo más que como una herramienta de "uso en todos los contextos".&lt;/p&gt;

&lt;p&gt;Si no puedo tener esas apps en mi celular ¿Donde las uso?. Pues las herramientas de comunicación como slack, email y amigos son esenciales para cualquier trabajo, pero no deberían ser tan esenciales como para estar conectadas a ella todo el día e incluso en nuestros momentos privados en el baño.&lt;/p&gt;

&lt;p&gt;La estrategia es tener un smartphone para las apps obligatorias del trabajo y comunicaciones como Whatsapp. Pero no usarlo ni tenerlo cerca si no es necesario, quizás guardarlo en un cajón y no tenerlo a la vista.&lt;/p&gt;

&lt;p&gt;Cambiar el chip para llamadas telefónicas y sms al teléfono simple. De esta forma el smartphone solo se convierte en un puente a la tecnología moderna y conservamos la comunicación esencial en un teléfono simple.&lt;/p&gt;

&lt;p&gt;Muchas de las aplicaciones de trabajo funcionan perfectamente en un computador tradicional y se puede hacer todas las tareas que tiene un smartphone, en su gran mayoría.&lt;/p&gt;

&lt;p&gt;Por lo que esta estrategia también en más barata a largo plazo, no se necesita un smartphone nuevo cada año y no se necesita usarlo mucho por lo que su tiempo de vida es mayor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Creo que es saludable volver a un mundo donde tenemos control de la tecnología y no al revés. Usemos un celular simple para llamar y enviar sms, usemos una cámara de fotos para sacar fotos y un reproductor de música sin internet para escuchar canciones que no puedan ser borradas de un servidor.&lt;/p&gt;

&lt;p&gt;El smartphone debe ser catalogado como una herramienta de trabajo, más no convertirse en una aspiradora de nuestro tiempo y energía. Si simplemente lo usamos para las tareas esenciales y obligatorias. Dejando al computador como la herramienta principal de acceso a internet, trabajo y comunicación.&lt;/p&gt;

&lt;p&gt;Rescatemos lo mejor de la década del 2000 y aprendamos las buenas prácticas y separación de responsabilidades de cada dispositivo para que no se vuelvan nuestros gobernantes.&lt;/p&gt;

&lt;p&gt;Portada: &lt;a href="https://commons.wikimedia.org/wiki/File:Telmac_1800.JPG" rel="noopener noreferrer"&gt;https://commons.wikimedia.org/wiki/File:Telmac_1800.JPG&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tecnología</category>
      <category>chile</category>
      <category>esencialismo</category>
    </item>
    <item>
      <title>Programación Orientada a Objetos - Una abstracción de la realidad</title>
      <dc:creator>Jose Germán Martínez</dc:creator>
      <pubDate>Thu, 08 Aug 2024 01:29:14 +0000</pubDate>
      <link>https://dev.to/javascriptchile/programacion-orientada-a-objetos-una-abstraccion-de-la-realidad-206k</link>
      <guid>https://dev.to/javascriptchile/programacion-orientada-a-objetos-una-abstraccion-de-la-realidad-206k</guid>
      <description>&lt;p&gt;Hola, en este artículo, que parece tutorial, abordaremos un tema que en lo particular al principio me dio muchos dolores de cabeza. Sin embargo, esta dificultad me llevó a estudiar, estudiar y estudiar para hacer como propia la abstracción de la vida cotidiana y así llevar a líneas de código, la representación de algo tangible (créeme que esto puede llegar a ser una tarea titánica a veces). El tema terminó apasionándome de manera tal que ahora comparto en este artículo datos importantes para comprenderlo, así que vamos al hueso del asunto.&lt;/p&gt;

&lt;p&gt;Explicaré o intentaré hacerlo de la mejor manera posible, programación orientada a objetos o por sus siglas (POO) utilizando JavaScript como mi lenguaje de elección. Para entender cómo aplicar la POO a situaciones del mundo real, tienes que internalizar que la programación orientada a objetos no es solo una técnica, ¡es un enfoque de vida! En este artículo, exploraremos conceptos fundamentales de POO y los aplicaremos a ejemplos tangibles de la vida cotidiana.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es la Programación Orientada a Objetos?
&lt;/h3&gt;

&lt;p&gt;La programación orientada a objetos es un paradigma de programación que se basa en el concepto de "objetos", puedes imaginarte en este mismo instante &lt;em&gt;literalmente&lt;/em&gt; un objeto de la vida: una manzana, un perro, una casa, un auto, un papito de hule. Ahora, visualiza que estos objetos pueden contener datos en forma de propiedades o características y funcionalidades, es decir, pueden hacer cosas. Imagina que estás modelando un mundo virtual donde cada entidad puede ser representada como un objeto independiente con características únicas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Objetos en la Vida Real y en la POO
&lt;/h3&gt;

&lt;p&gt;Para entender mejor la POO, echemos un vistazo a un ejemplo de la vida real: un auto. Un auto puede tener propiedades como modelo, color y velocidad, así como métodos como arrancar y detener. Transpolar esto al mundo de la POO sería bastante sencillo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Auto {
  constructor(modelo, color) {
    this.modelo = modelo;
    this.color = color;
    this.velocidad = 0;
  }

  arrancar() {
    console.log(`El auto ${this.modelo} ha arrancado.`);
  }

  detener() {
    console.log(`El auto ${this.modelo} se ha detenido.`);
    this.velocidad = 0;
  }

  acelerar(kmh) {
    this.velocidad += kmh;
    console.log(`El auto ${this.modelo} acelera a ${this.velocidad} km/h.`);
  }
}

// Crear un objeto auto
const miAuto = new Auto('Sedán', 'Rojo');

// Utilizar métodos del objeto auto
miAuto.arrancar();
miAuto.acelerar(50);
miAuto.detener();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, hemos creado una clase Auto con propiedades como modelo, color y velocidad, así como métodos, es decir, las cosas que puede hacer: como arrancar, detener y acelerar. Luego, creamos un objeto miAuto basado en esta clase y lo utilizamos para simular acciones de la vida real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Herencia: La Clave de la Jerarquía
&lt;/h3&gt;

&lt;p&gt;Imagina ahora que queremos modelar no solo coches, sino también motocicletas. Ambos comparten algunas similitudes, pero también tienen características únicas. Aquí es donde entra en juego el concepto de herencia en la POO.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Camioneta extends Auto {
  constructor(modelo, color, tipo) {
    super(modelo, color);
    this.tipo = tipo;
  }

  realizarTruco() {
    console.log(`La camioneta ${this.modelo} ${this.tipo} realiza un asombroso truco.`);
  }
}

// Crear un objeto camioneta
const miCamioneta = new Camioneta('Explorer', 'Negra', '4x4');

// Utilizar métodos del objeto camioneta
miCamioneta.arrancar();
miCamioneta.acelerar(80);
miCamioneta.realizarTruco();
miCamioneta.detener();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí, hemos creado una nueva clase Camioneta que extiende la clase Auto. La palabra clave extends nos permite heredar todas las propiedades y métodos de la clase padre (Auto). Además, la clase hija (Camioneta) puede tener propiedades y métodos adicionales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Encapsulamiento: Protegiendo tus Secretos
&lt;/h3&gt;

&lt;p&gt;El encapsulamiento es otro pilar de la POO que nos permite proteger los detalles internos de un objeto y exponer solo lo necesario. Veamos un ejemplo sencillo utilizando una "Cuenta Bancaria":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
class CuentaBancaria {
  constructor(titular, saldoInicial) {
    this.titular = titular;
    this._saldo = saldoInicial; // El saldo se designa con el prefijo _ para indicar que es privado
  }

  get saldo() {
    return this._saldo;
  }

  depositar(cantidad) {
    if (cantidad &amp;gt; 0) {
      this._saldo += cantidad;
      console.log(`${cantidad} depositados. Nuevo saldo: ${this._saldo}`);
    } else {
      console.log("Error: La cantidad debe ser mayor que cero.");
    }
  }

  retirar(cantidad) {
    if (cantidad &amp;gt; 0 &amp;amp;&amp;amp; cantidad &amp;lt;= this._saldo) {
      this._saldo -= cantidad;
      console.log(`${cantidad} retirados. Nuevo saldo: ${this._saldo}`);
    } else {
      console.log("Error: Cantidad inválida o saldo insuficiente.");
    }
  }
}

// Crear una cuenta bancaria
const miCuenta = new CuentaBancaria('Juan Pérez', 1000);

// Utilizar métodos del objeto cuenta bancaria
console.log(`Saldo inicial: ${miCuenta.saldo}`);
miCuenta.depositar(500);
miCuenta.retirar(200);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, hemos encapsulado el saldo de la cuenta utilizando un método get para acceder a él. Esto protege el saldo de ser modificado directamente desde fuera de la clase, manteniendo la integridad de nuestra cuenta bancaria.&lt;/p&gt;

&lt;h3&gt;
  
  
  Polimorfismo: La Magia de la Versatilidad
&lt;/h3&gt;

&lt;p&gt;El polimorfismo permite que diferentes clases compartan el mismo nombre de método, pero con comportamientos específicos para cada una. Para ilustrar esto, imaginemos un zoológico con animales que emiten sonidos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
class Animal {
  hacerSonido() {
    console.log('Algunos sonidos genéricos de animal.');
  }
}

class Perro extends Animal {
  hacerSonido() {
    console.log('¡Guau! ¡Guau!');
  }
}

class Gato extends Animal {
  hacerSonido() {
    console.log('¡Miau! ¡Miau!');
  }
}

// Crear objetos animales
const miAnimal = new Animal();
const miPerro = new Perro();
const miGato = new Gato();

// Utilizar el método hacerSonido de cada objeto
miAnimal.hacerSonido();
miPerro.hacerSonido();
miGato.hacerSonido();

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, las clases Perro y Gato heredan de la clase Animal, pero cada una sobrescribe el método hacerSonido con su propia implementación única. Esto permite que diferentes tipos de animales utilicen el mismo método de manera distinta.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusión: POO... ponlo en Acción
&lt;/h4&gt;

&lt;p&gt;¡Te agradezco mucho llegar este punto! Exploramos conceptos clave como objetos, herencia, encapsulamiento y polimorfismo, y los hemos aplicado a situaciones de la vida real. Recuerda, la POO es una forma de pensar que te permite modelar y entender el mundo de manera más efectiva...y llevarla a código.&lt;/p&gt;

&lt;p&gt;Así que la próxima vez que veas un auto, una cuenta bancaria o incluso a tu mascota, piensa en cómo podrías representarlos como objetos en tu código. La programación orientada a objetos no solo es una herramienta poderosa, ¡es una forma de dar vida a tus programas!&lt;/p&gt;

&lt;p&gt;Espero que hayas disfrutado este artículo y que le puedas sacar provecho en tus proyectos. Déjeme tus comentarios para saber que te pareció y si tienes alguna otra abstracción de la vida real. ;)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>¿Trabajo Remoto o Híbrido?</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Wed, 03 Jul 2024 16:42:00 +0000</pubDate>
      <link>https://dev.to/javascriptchile/trabajo-remoto-o-hibrido-5f2o</link>
      <guid>https://dev.to/javascriptchile/trabajo-remoto-o-hibrido-5f2o</guid>
      <description>&lt;p&gt;Este es un pequeño artículo sobre reflexiones sobre los llamados trabajos "Híbridos" y la necesidad de establecer una definición adecuada para no confundir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trabajo Presencial
&lt;/h2&gt;

&lt;p&gt;Primero tendremos el trabajo presencial, el cual estás obligado a ir a una oficina o lugar específico para ejercer tus labores. En la pandemia del 2020 vimos un cambio hacia lo remoto. Los primeros años de la década del 2020 demostraron que si se puede trabajar remotamente para gran parte de las labores tech.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trabajo Híbrido
&lt;/h2&gt;

&lt;p&gt;Luego de la pandemia comenzaron a surgir los llamados trabajos "híbridos". Hay una clara mal interpretación de lo que es trabajo Híbrido. Se puede asumir de que "Algunos días remoto y algunos días presencial", pero esto causa confusión.&lt;/p&gt;

&lt;p&gt;La definición que propongo híbrido es lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se trabaja en un horario y zona horaria específica.&lt;/li&gt;
&lt;li&gt;Se tiene a disposición una oficina pero es &lt;strong&gt;opcional&lt;/strong&gt; asistir.&lt;/li&gt;
&lt;li&gt;Es obligación estar dentro de un territorio (Por ejemplo dentro de Chile, por temas legales, tributarios y otros).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En términos simples, si te obligan a ir presencial entonces es un trabajo presencial y no híbrido. &lt;/p&gt;

&lt;h2&gt;
  
  
  Trabajo Remoto
&lt;/h2&gt;

&lt;p&gt;El trabajo remoto es similar al híbrido con la salvedad de que puede ser en cualquier parte del mundo o zona horaria, no tienes la obligación de estar en el mismo país donde esta el trabajo.&lt;/p&gt;

&lt;p&gt;Es más pensado para ofertas laborales en el extranjero donde tu debas pagar tus propias cotizaciones, previsión de salud y pagar los costes de transferencias.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué es importante?
&lt;/h2&gt;

&lt;p&gt;Muchas personas dicen que les gusta ir a la oficina por diversos motivos. Se confunde muchas veces trabajar remotamente con trabajar desde casa. Lo cual es erróneo. Trabajar remoto simplemente significa que tienes la libertad de trabajar donde sea más cómodo. Puede incluso ser una oficina, pero la clave es la libertad de elección donde se trabaja. Es por esto que muchos defienden el ir presencial a una oficina y privilegian por sobre la opción remota. El drama es que no debería ser obligatorio ir a la oficina en un trabajo híbrido, es opcional y no habría problemas si deseas trabajar fuera de ella todo el tiempo. La oficina se transforma en un espacio de cowork opcional más que un lugar de sometimiento y esclavitud a horarios y expectativas de calentar sillas.&lt;/p&gt;

&lt;p&gt;Piensa todas las horas de vida que pierdes solo por ir a un lugar obligado, costos en salud mental, costos de alimentación y transporte. Costos que asumes personalmente y no la empresa.&lt;/p&gt;

&lt;p&gt;Que tu relación laboral sea de mutuo beneficio y no unilateral para la empresa.&lt;/p&gt;

&lt;p&gt;Como profesionales de la tecnología está en nuestro poder exigir este beneficio a las empresas. Si nos sometemos el ir presencial obligadamente, afectaremos tanto a nuestra salud mental como a los seres queridos que tenemos y principalmente afectamos a la industria en general haciendo más fome las condiciones laborales para todos los miembros del oficio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Prioriza tu vida y tu salud mental y financiera, prefiere siempre trabajos donde sea opcional ir presencial.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Imagen: &lt;a href="https://commons.wikimedia.org/wiki/File:Remote_work_Telelavoro_1.jpg" rel="noopener noreferrer"&gt;https://commons.wikimedia.org/wiki/File:Remote_work_Telelavoro_1.jpg&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>work</category>
      <category>chile</category>
      <category>remote</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Super Club Net: Libro de Introducción a HTML, CSS y JS</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Tue, 25 Jun 2024 16:12:00 +0000</pubDate>
      <link>https://dev.to/javascriptchile/super-club-net-libro-de-introduccion-a-html-css-y-js-32hc</link>
      <guid>https://dev.to/javascriptchile/super-club-net-libro-de-introduccion-a-html-css-y-js-32hc</guid>
      <description>&lt;p&gt;Con motivo de dar honor a la revista Club Nintendo y su mini curso de HTML.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/javascriptchile" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F7892%2F13eff38a-1832-4eb7-942f-f26636c008a3.png" alt="JavaScript Chile" width="500" height="500"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F6232%2F9umXr7KQ.png" alt="" width="444" height="443"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/javascriptchile/la-revista-club-nintendo-y-su-curso-de-html-264c" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;La revista Club Nintendo y su curso de HTML&lt;/h2&gt;
      &lt;h3&gt;Camilo for JavaScript Chile ・ Jun 8 '24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#html&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#clubnintendo&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#principiante&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#chile&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;He elaborado este pequeño libro actualizando y ampliando los conceptos vistos en esa revista.&lt;/p&gt;

&lt;p&gt;Un libro gratuito que puede ser leído en los siguientes sitios web:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ninjas.cl/books/superclubnet/" rel="noopener noreferrer"&gt;https://ninjas.cl/books/superclubnet/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;mirror: &lt;a href="https://ninjas.codeberg.page/superclubnet/@main/docs/" rel="noopener noreferrer"&gt;https://ninjas.codeberg.page/superclubnet/@main/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTML y CSS básico.&lt;/li&gt;
&lt;li&gt;JavaScript básico.&lt;/li&gt;
&lt;li&gt;Manipulación de DOM.&lt;/li&gt;
&lt;li&gt;Formularios y validación.&lt;/li&gt;
&lt;li&gt;Tips y recomendaciones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una escritura amena y con ejemplos basados en juegos de Nintendo 64. Incluye un proyecto para ejercitar con temática de Mario Kart 64.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1cyc53e2lfzmhjiucq8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1cyc53e2lfzmhjiucq8.png" alt="Simulador de Mario Kart 64" width="408" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pensado para personas que recién inician en el mundo HTML y quizás para alguien que quiera refrescar conceptos.&lt;/p&gt;

&lt;p&gt;Hecho con mucho amor por &lt;a href="https://ninjas.cl" rel="noopener noreferrer"&gt;Ninjas.cl&lt;/a&gt; para todo aquel con curiosidad y paciencia de aprender HTML, CSS y JS para desarrollo web :)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>css</category>
      <category>chile</category>
    </item>
    <item>
      <title>Desafío de Nombres y Apellidos</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Tue, 11 Jun 2024 19:29:00 +0000</pubDate>
      <link>https://dev.to/javascriptchile/desafio-de-nombres-y-apellidos-540f</link>
      <guid>https://dev.to/javascriptchile/desafio-de-nombres-y-apellidos-540f</guid>
      <description>&lt;p&gt;El siguiente es un pequeño ejercicio encontrado en el curso de &lt;em&gt;Haskell&lt;/em&gt;&lt;br&gt;
disponible en la &lt;a href="https://haskell.mooc.fi/part1" rel="noopener noreferrer"&gt;Universidad de Helsinki&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Desafío
&lt;/h2&gt;

&lt;p&gt;Dado una lista de nombres y apellidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nombres: &lt;code&gt;["Eva", "Mike"]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Apellidos: &lt;code&gt;["Smith", "Wood", "Odd"]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Retornar una lista cuyos elementos sean solo de personas con largo par.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo de Retorno&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;["EvaSmith", "EvaOdd", "MikeWood"]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Solución en Haskell
&lt;/h2&gt;

&lt;p&gt;Haskell permite pattern matching y &lt;code&gt;list comprehensions&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;whole&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Eva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Mike"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
         &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Wood"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Odd"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
         &lt;span class="kr"&gt;let&lt;/span&gt; &lt;span class="n"&gt;whole&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;even&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="n"&gt;whole&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solución en Elixir
&lt;/h2&gt;

&lt;p&gt;Si bien la solución en &lt;em&gt;Elixir&lt;/em&gt; no es tan corta como en &lt;em&gt;Haskell&lt;/em&gt;&lt;br&gt;
es igual de elegante.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="kn"&gt;require&lt;/span&gt; &lt;span class="no"&gt;Integer&lt;/span&gt;

&lt;span class="n"&gt;for&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="sx"&gt;~w[Eva Mike]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="sx"&gt;~w[Smith Wood Odd]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt;
  &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_even&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para esto utilizamos las características de &lt;code&gt;for comprehensions&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://elixirschool.com/en/lessons/basics/comprehensions" rel="noopener noreferrer"&gt;https://elixirschool.com/en/lessons/basics/comprehensions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solución en Javascript
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;David&lt;/em&gt; de &lt;em&gt;Javascript Chile&lt;/em&gt; nos escribe una solución en versión&lt;br&gt;
imperativa y declarativa utilizando &lt;em&gt;Javascript&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Imperativa&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nombres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Eva&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mike&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apellidos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Smith&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Wood&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Odd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;apellidos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]}${&lt;/span&gt;&lt;span class="nx"&gt;apellidos&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Declarativa&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nombres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Eva&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mike&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apellidos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Smith&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Wood&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Odd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;apellidos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Elixir&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La versión declarativa de &lt;em&gt;Javascript&lt;/em&gt; la podríamos emular en &lt;em&gt;Elixir&lt;/em&gt; de la siguiente&lt;br&gt;
forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="sx"&gt;~w[Eva Mike]&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flat_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="sx"&gt;~w[Smith Wood Odd]&lt;/span&gt;
  &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;
    &lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_even&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aunque no es tan elegante como usar &lt;code&gt;for comprehensions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿En qué otros lenguajes puedes solucionar el desafío?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>chile</category>
      <category>javascript</category>
      <category>ejercicios</category>
    </item>
    <item>
      <title>La revista Club Nintendo y su curso de HTML</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Sat, 08 Jun 2024 17:47:00 +0000</pubDate>
      <link>https://dev.to/javascriptchile/la-revista-club-nintendo-y-su-curso-de-html-264c</link>
      <guid>https://dev.to/javascriptchile/la-revista-club-nintendo-y-su-curso-de-html-264c</guid>
      <description>&lt;p&gt;Quiero compartir el curso que inicio mi interés por la informática.&lt;br&gt;
El curso de HTML de la revista Club Nintendo. Encontré los escaneos de la versión&lt;br&gt;
mexicana, aunque yo leí la edición chilena. El contenido es el mismo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primera Parte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://archive.org/embed/club-nintendo-ano-06-no-05-mexico" rel="noopener noreferrer"&gt;https://archive.org/embed/club-nintendo-ano-06-no-05-mexico&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Página 44. Introducción al HTML.&lt;br&gt;
Etiquetas básicas como  &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; y los colores hexadecimales. Tablas y listas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conceptos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/CSS/color" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/CSS/color&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/API/HTMLTableElement" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/API/HTMLTableElement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/menu" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/menu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/li" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/li&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/img" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/img&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/center" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/br" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/br&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Segunda Parte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://archive.org/embed/club-nintendo-ano-06-no-10-mexico" rel="noopener noreferrer"&gt;https://archive.org/embed/club-nintendo-ano-06-no-10-mexico&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Página 44. Mapas de imagenes. Frames, enlaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conceptos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/map" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/frame" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/frame&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/frameset" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/frameset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/a" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/sub" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/sub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/sup" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/sup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/hr" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/hr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/u" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/u&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tercera Parte  (final)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://archive.org/embed/club-nintendo-ano-06-no-11-mexico" rel="noopener noreferrer"&gt;https://archive.org/embed/club-nintendo-ano-06-no-11-mexico&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Página 52. Formularios y un poquito de Javascript.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conceptos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/form" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/form&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/input" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/input&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/input/checkbox" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/input/checkbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/input/button" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/HTML/Element/input/button&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/es/docs/Web/JavaScript" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Web/JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Experiencia personal
&lt;/h2&gt;

&lt;p&gt;Personalmente yo tenía 8 años y estaba en segundo básico (Mayo de 1997), no hace mucho había aprendido a leer y escribir. Mi padre trajo a la casa un viejo computador con Windows 3.1 que habían dado de baja en su trabajo y me sirvió para practicar las cosas de la revista, aunque principalmente lo usaba para jugar juegos de DOS&lt;br&gt;
y aprender a escribir con el teclado, con eso también aprendí los comandos básicos de terminal como crear carpetas, copiar y borrar archivos y esas cosas del DOS.&lt;/p&gt;

&lt;p&gt;Mi padre era más de Excel y Word, así que tuve que aprender todas esas cosas viendo y experimentando por mi cuenta.&lt;/p&gt;

&lt;p&gt;Aunque no tuvimos internet en la casa como hasta el 2004, pude ir a su trabajo y descargar cosas y más tutoriales.&lt;/p&gt;

&lt;p&gt;Luego de eso también me trajo un libro fotocopiado de Visual Basic 6, donde también aprendí armar programas de escritorio, aunque super básicos.&lt;/p&gt;

&lt;p&gt;Terminaré este pequeño post con las mismas palabras del curso de HTML de la revista Club Nintendo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ojalá que estos 3 cursos de HTML. te sirvan y que despierten tu interés por aprender más. Si es así, existen libros muy buenos de programación de otros lenguajes para usarse en Internet.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>html</category>
      <category>clubnintendo</category>
      <category>principiante</category>
      <category>chile</category>
    </item>
    <item>
      <title>Historia de la BeamVM</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Thu, 06 Jun 2024 16:00:00 +0000</pubDate>
      <link>https://dev.to/javascriptchile/historia-de-la-beamvm-2b5l</link>
      <guid>https://dev.to/javascriptchile/historia-de-la-beamvm-2b5l</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es Erlang?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Erlang&lt;/em&gt; es un lenguaje de programación funcional. Esto quiere decir que se basa en los principios de funciones con transparencia referencial e inmutabilidad. La transparencia referencial quiere decir que una función con los mismos parámetros debería retornar el mismo resultado.  La inmutabilidad quiere decir que no puedo alterar el valor de una variable una vez que se ha asignado, por ejemplo si digo que x es 5, no es lógico que también sea 6 (sería deshonesto). Sin embargo existen casos donde una función puede retornar otro resultado con los mismos parámetros (por ejemplo una función de la fecha actual). &lt;em&gt;Erlang&lt;/em&gt; usa un enfoque pragmático: Obedecer los principios de la programación funcional (inmutabilidad, transparencia referencial) y romperlos cuando aparecen conflictos del mundo real.&lt;/p&gt;

&lt;p&gt;Además del lenguaje de programación, &lt;em&gt;Erlang&lt;/em&gt; tiene todo un ecosistema de herramientas. En primer lugar se encuentra su máquina virtual (&lt;em&gt;BEAM VM&lt;/em&gt;), la cual ejecuta código compilado con un &lt;em&gt;bytecode&lt;/em&gt; específico, muy similar a la &lt;em&gt;JVM&lt;/em&gt; de &lt;em&gt;Java&lt;/em&gt;. Por lo que el código puede ser ejecutado en cualquier sistema para la cual la &lt;em&gt;BEAM VM&lt;/em&gt; sea compatible. También proporciona herramientas de desarrollo como compiladores, debuggers, herramientas para análisis de rendimiento y pruebas. El framework OTP, servidores web, generadores de analizadores de código fuente (parsers), una base de datos distribuida llamada &lt;em&gt;mnesia&lt;/em&gt;, entre otras herramientas. La máquina virtual y sus bibliotecas permiten actualizar el código en caliente (hot reload), lo que significa cambiar el código durante la ejecución del programa sin interrupción del servicio y también permitir la ejecución del código de forma distribuida en varias computadoras, manejando los errores y fallos de una forma simple y poderosa.&lt;/p&gt;

&lt;p&gt;Todas estas características permiten una habilidad de &lt;em&gt;Erlang&lt;/em&gt; para la resiliencia frente a errores y organización del código en procesos y mensajes concurrentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Origen de Erlang
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Erlang&lt;/em&gt; comenzó como una biblioteca de &lt;em&gt;Prolog&lt;/em&gt;, luego como un dialecto de &lt;em&gt;Prolog&lt;/em&gt;, para finalmente ser un lenguaje de programación por si mismo. El objetivo fue resolver el problema de construir sistemas distribuidos robustos y confiables. Desarrollado originalmente en la empresa de telecomunicaciones &lt;em&gt;Ericsson&lt;/em&gt;  para sus switch telefónicos. Desde un inicio se enfrentaron a desafíos de escala mundial como cientos de milllones de usuarios y condiciones de servicio muy estrictas. Fue liberado al público en 1998 como un proyecto &lt;em&gt;Open Source&lt;/em&gt;. Hoy en día, según &lt;a href="https://news.ycombinator.com/item?id=17218190" rel="noopener noreferrer"&gt;Cisco&lt;/a&gt;, el 90% del tráfico de internet es orquestado por nodos programados en &lt;em&gt;Erlang&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1002494428748140544-407" src="https://platform.twitter.com/embed/Tweet.html?id=1002494428748140544"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1002494428748140544-407');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1002494428748140544&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Erlang&lt;/em&gt; y la &lt;em&gt;BEAM VM&lt;/em&gt; han evolucionado a lo largo de más de 30 años para otros casos de uso como la robótica, machine learning, aplicaciones web, entre otros. Uno de sus creadores principales &lt;em&gt;Joe Armstrong&lt;/em&gt; lo detalla de la &lt;a href="https://dl.acm.org/doi/abs/10.1145/1238844.1238850" rel="noopener noreferrer"&gt;siguiente forma&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Erlang fue diseñado para escribir programas concurrentes que se ejecutasen eternamente. Erlang usa procesos concurrentes para estructurar el programa. Estos procesos no tienen memoria compartida y se comunican por paso de mensajes asíncronos. Los procesos de Erlang son ligeros y pertenecen al lenguaje, no al sistema operativo. Erlang tiene mecanismos que permiten que los programas cambien on-the-fly (en vivo) así, esos programas pueden evolucionar y cambiar sin detener su ejecución. Estos mecanismos simplifican la construcción de software implementando sistemas non-stop (que no se detienen).&lt;/p&gt;

&lt;p&gt;El desarrollo inicial de Erlang tuvo lugar en 1986 en el Laboratorio de Computación de Ericsson. Erlang fue diseñado con un objetivo específico en mente: proporcionar una mejor forma de programar aplicaciones de telefonía. En ese momento, las aplicaciones de telefonía eran atípicas del tipo de problemas que podían resolver los lenguajes de programación convencionales. Las aplicaciones de telefonía son, por su naturaleza, altamente concurrentes: un simple switch debe manejar decenas o cientos de miles de transacciones simultáneas. Tales transacciones son intrínsecamente distribuidas y el software se espera que sea altamente tolerante a fallos. Cuando el software que controla los teléfonos falla, sale en los periódicos, algo que no ocurre cuando fallan las aplicaciones de escritorio. El software de telefonía debe también cambiar on-the-fly, esto es, sin perder el servicio mientras se realiza una actualización del código. El software de telefonía debe también operar en tiempo real, con ajustados requisitos de tiempo para algunas operaciones, y más relajado tiempo en otras clases de operaciones.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BXmOlCy0oBM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué Erlang es Bueno?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Joe Armstrong&lt;/em&gt;, fijó los requisitos de &lt;em&gt;Erlang&lt;/em&gt; en solucionar los problemas de un entorno altamente concurrente, que no puede permitirse caer y que debe de actualizarse sin pérdida de servicio. Actualmente, esta definición calza con casi la mayor parte de servicios en Internet.&lt;/p&gt;

&lt;p&gt;Sin embargo pensar de que &lt;em&gt;Erlang&lt;/em&gt; solamente es para casos de uso de procesos y mensajes livianos y concurrentes es insuficiente para describirlo. En su &lt;a href="http://kth.diva-portal.org/smash/record.jsf?pid=diva2%3A9492&amp;amp;dswid=9576" rel="noopener noreferrer"&gt;tésis de doctorado&lt;/a&gt; &lt;em&gt;Joe Armstrong&lt;/em&gt; detalla componentes genéricos llamados "behaviours" (comportamientos) en &lt;em&gt;Erlang&lt;/em&gt;.  Estos "behaviours" son similares a las interfaces en otros lenguajes de programación y permiten el polimorfismo, es decir, que los programas puedan trabajar con múltiples formas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Joe Armstrong&lt;/em&gt; detalló seis distintos &lt;em&gt;behaviours&lt;/em&gt; &lt;code&gt;gen_server&lt;/code&gt;, &lt;code&gt;gen_event&lt;/code&gt;, &lt;code&gt;gen_fsm&lt;/code&gt; (&lt;code&gt;gen_statem&lt;/code&gt;), &lt;code&gt;supervisor&lt;/code&gt;, &lt;code&gt;application&lt;/code&gt; y &lt;code&gt;release&lt;/code&gt;. Definió que estos seis &lt;em&gt;behaviours&lt;/em&gt; eran suficientes para crear sistemas distribuidos confiables y robustos.&lt;/p&gt;

&lt;p&gt;Los &lt;em&gt;behaviours&lt;/em&gt; son escritos por expertos y están basados en años de experiencia y representan las "mejores prácticas". Permiten que los programadores de la aplicación se enfoquen en la "lógica de negocios", mientras que la infraestructura es proporcionada automáticamente por el &lt;em&gt;behaviour&lt;/em&gt;. El código es escrito de forma secuencial y toda la concurrencia es realizada por el &lt;em&gt;behaviour&lt;/em&gt; "por debajo". Esto facilita que nuevos miembros del equipo aprendan la lógica de negocios, ya que es secuencial y es similar a cómo operan otros lenguajes de programación.&lt;/p&gt;

&lt;p&gt;La siguiente lista es una breve descripción de cada &lt;em&gt;behaviour&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gen_server&lt;/code&gt;: Un servidor genérico. Permite crear un servicio que puede recibir llamadas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gen_event&lt;/code&gt;: Un gestor de eventos. Permite enviar mensajes cuando ocurren eventos definidos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gen_statem&lt;/code&gt;: Una máquina de estados, anteriormente conocida como &lt;code&gt;gen_fsm&lt;/code&gt;. Permite validar estados de los datos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;supervisor&lt;/code&gt;: Un supervisor es un proceso cuya tarea es que otros procesos (hijos) esten vivos y realizando su labor. Con múltiples estrategias para reiniciarlos si estos fallan. Un supervisor puede ser padre de otros supervisores.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;application&lt;/code&gt;: Una aplicación es un conjunto de componentes &lt;code&gt;gen_server&lt;/code&gt;, &lt;code&gt;gen_event&lt;/code&gt;, &lt;code&gt;gen_statem&lt;/code&gt; y &lt;code&gt;supervisor&lt;/code&gt; utilizados para un fin. Se le llama "árbol de supervisión" (supervision tree).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;release&lt;/code&gt;:  Un sistema puede contener una o múltiples &lt;code&gt;application&lt;/code&gt;, lo que se considera un &lt;code&gt;release&lt;/code&gt;. Además proporciona herramientas para actualizar el código y volver a un estado anterior (&lt;em&gt;rollback&lt;/em&gt;) si la actualización falla.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si se tiene en cuenta que un supervisor puede supervisar a otros supervisores (los cuales pueden estar ejecutándose en otro computador), nos da una idea de lo poderoso que pueden ser los &lt;em&gt;behaviour&lt;/em&gt;. Se podría hacer un paralelo con &lt;em&gt;Kubernetes&lt;/em&gt;, pero la principal diferencia es que estos &lt;em&gt;behaviours&lt;/em&gt; son ejecutados a nivel del proceso/hilo a diferencia de &lt;em&gt;Kubernetes&lt;/em&gt; que se ejecuta a nivel del contenedor Docker.&lt;/p&gt;

&lt;p&gt;Las ideas de los supervisores y las estrategias de reinicio vienen de la observación de que usualmente es más simple reiniciar un servicio para solucionar un problema. ¿Has probado apagar y prender un equipo para solucionar un problema?. Esto se puede explicar con un ejemplo: Si estoy siguiendo la ruta de un mapa y me pierdo, es más simple partir del punto inicial que desde donde me perdí para llegar a la meta, es decir, en vez de encontrar el error y repararlo sobre la marcha, es más rápido y correcto registrar el error y volver al inicio para intentarlo de nuevo.&lt;/p&gt;

&lt;p&gt;Saber que los procesos pueden fallar y serán reiniciados por un supervisor nos permite fallar temprano y rápido (Siguiendo las recomendaciones de &lt;a href="https://en.wikipedia.org/wiki/Fail-fast_system" rel="noopener noreferrer"&gt;Jim Gray&lt;/a&gt;). Un proceso produce un resultado correcto según la especificación o envía una señal de fallo y se detiene su operación. "Let it crash!" (Déjalo caer) es una frase acuñada por &lt;em&gt;Joe Armstrong&lt;/em&gt; para denominar este comportamiento de "camino feliz", donde si ocurre algo fuera del "camino feliz", el proceso debe detenerse y no tratar de solucionar el problema sobre la marcha (potencialmente empeorando la situación), dejando que otro componente dentro del árbol de supervisión maneje el error.&lt;/p&gt;

&lt;p&gt;Los supervisores y la filosofía de "Let it Crash!" de &lt;em&gt;Erlang&lt;/em&gt; le permiten producir sistemas robustos y confiables. Se puede ejemplificar con la máquina &lt;em&gt;Ericsson AXD301&lt;/em&gt;, la cual alcanzó nueve nueves (99.9999999%) de fiabilidad en sus sistemas. Para poner en perspectiva la fiabilidad de cinco nueves (99.999%) se considera bueno (5.26 minutos de servicio caido por año). En grandes compañias se estima que existe 1.6 horas de servicio caido por semana. Nueve nueves de fiabilidad es como un parpadeo al año de servicio caido (31.56 milisegundos al año). Si bien los nueve nueves fueron alcanzados en una situación específica y no hay claridad total de cómo se obtuvieron dichos datos, se puede afirmar que la tecnología de &lt;em&gt;Erlang&lt;/em&gt; da una fiabilidad y robustes muy grande.&lt;/p&gt;

&lt;h2&gt;
  
  
  El modelo de Actores
&lt;/h2&gt;

&lt;p&gt;Se ha definido &lt;em&gt;Erlang&lt;/em&gt; y su ecosistema, pero para tener una noción más íntegra se debe explicar lo que es concurrencia. En muchos lugares se puede considerar concurrencia y paralelismo como el mismo concepto. En &lt;em&gt;Erlang&lt;/em&gt; son dos ideas separadas. La concurrencia se refiere a la idea de actores ejecutandose de forma independiente, pero no necesariamente al mismo tiempo. El paralelismo es tener actores independientes ejecutandose al mismo tiempo. Si lo vemos a nivel de procesador, concurrencia es que cada proceso tiene su tiempo de ejecución en un único procesador, similar a como funcionaban los sistemas antes de la existencia de múltiples núcleos en los procesadores. El paralelismo ha estado disponible desde el inicio de &lt;em&gt;Erlang&lt;/em&gt;, simplemente era necesario un computador anexo y conectado al computador principal.  En la actualidad los procesadores con múltiples núcleos permiten paralelismo en un único computador (en contextos industriales llegando a docenas de núcleos por procesador) y &lt;em&gt;Erlang&lt;/em&gt; permite aprovechar estas características completamente (desde aproximadamente el año 2009 con la implementación del &lt;a href="https://es.wikipedia.org/wiki/Multiprocesamiento_sim%C3%A9trico" rel="noopener noreferrer"&gt;multiprocesamiento simétrico&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Para lograr la concurrencia &lt;em&gt;Erlang&lt;/em&gt; utiliza el &lt;a href="https://en.wikipedia.org/wiki/Actor_model" rel="noopener noreferrer"&gt;modelo de actores&lt;/a&gt;. Cada actor es un proceso separado (función) y aislado en la máquina virtual y se comunican utilizando mensajes. Cada proceso (actor) es totalmente independiente y no comparte ninguna información con otros procesos, solamente utilizan mensajes entre ellos para comunicar datos. Son livianos (no son procesos del sistema operativo). Toda la comunicación es explícita, segura y con alta trazabilidad. Si un proceso falla, no afectará a los otros procesos, ya que son totalmente independientes entre si.&lt;/p&gt;

&lt;p&gt;Una cosa importante a considerar en relación a las habilidades de escalamiento de &lt;em&gt;Erlang&lt;/em&gt; y sus procesos ligeros. Es cierto que pueden tener cientos de miles de procesos existentes al mismo tiempo, pero no significa abusar de ellos. Por ejemplo crear un videojuego de disparos en los que cada bala sea su propio actor es algo excesivo. Ya que hay un pequeño costo en enviar mensajes entre actores, si se dividen las tareas demasiado puede incluso perjudicar el rendimiento.&lt;/p&gt;

&lt;p&gt;Se puede pensar de que la programación paralela es directamente proporcional a la cantidad de núcleos de un procesador, lo que se conoce como escalamiento lineal. Pero es importante recordar de que no existe algo perfecto y libre de costos asociados. El paralelismo no es la respuesta a cada problema, en algunos casos incluso puede afectar la velocidad de la aplicación, por ejemplo cuando existen tareas redundantes o el código es 100% secuencial pero intenta utilizar procesos paralelos. Un programa en paralelo va tan rápido como su parte secuencial más lenta. Esto significa que usar paralelismo para todos los problemas no garantiza que sea más rápido. Simplemente es una herramienta que puede ser muy útil, pero no siempre es la adecuada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Quizás se ha encontrado con una situación similar a la siguiente: Mi sistema es local y no necesito de las capacidades de concurrencia que &lt;em&gt;Erlang&lt;/em&gt; proporciona. Jamás llegaré a los niveles de exigencia en mis sistemas que justifiquen utilizar dichas capacidades.&lt;/p&gt;

&lt;p&gt;Se podría pensar de que al tener sistemas de nicho nunca tendremos la necesidad de usar las bondades de la &lt;em&gt;BEAM VM&lt;/em&gt;. ¿Pero qué pasa si tenemos una cantidad de datos enorme que debe ser procesada?.&lt;/p&gt;

&lt;p&gt;Esto sucedió en una empresa donde debían migrar una base de datos de usuarios a un nuevo sistema. Se debían procesar las tablas y ajustarlas al formato del nuevo sistema, es decir, se debía crear un pequeño script ETL (Extract Transform Load) para extraer, transformar y cargar datos. En un inicio un programador que solamente conocía &lt;em&gt;Python&lt;/em&gt; intentó realizar la migración, pero debido a la cantidad de datos la operación tomaba más de una semana en completar. Luego la tarea pasó a un equipo que conocía &lt;em&gt;Elixir&lt;/em&gt; y la operación tardó menos de un día en ser completada, gracias a las bondades de concurrencia y paralelismo de la &lt;em&gt;Beam VM&lt;/em&gt;.&lt;br&gt;
Se puede argumentar de que tal ves era inexperiencia en &lt;em&gt;Python&lt;/em&gt; o no se usaron las herramientas adecuadas en dicho lenguaje. Pero eso nos habla de que realizar concurrencia y paralelismo en otros lenguajes no es tan simple como en el ecosistema de &lt;em&gt;Erlang&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Si bien todas estas herramientas e ideas podrían ser implementadas y desarrolladas en otros lenguajes de programación y ecosistemas (y viceversa). No es una tarea sencilla y tampoco se contaría con más de 30 años de evolución funcionando en sistemas productivos de clase mundial. Por lo que la máquina virtual de &lt;em&gt;Erlang&lt;/em&gt; (&lt;em&gt;BEAM VM&lt;/em&gt;) es una tecnología robusta, confiable y acertada para ser usada en las soluciones de software actuales. Se debe evaluar cada problema y seleccionar las herramientas adecuadas según su contexto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://altenwald.org/2009/09/02/la-historia-de-erlang/" rel="noopener noreferrer"&gt;https://altenwald.org/2009/09/02/la-historia-de-erlang/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/stevana/armstrong-distributed-systems/blob/main/docs/erlang-is-not-about.md" rel="noopener noreferrer"&gt;https://github.com/stevana/armstrong-distributed-systems/blob/main/docs/erlang-is-not-about.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emanuelpeg.blogspot.com/2024/05/tipos-en-erlang.html" rel="noopener noreferrer"&gt;https://emanuelpeg.blogspot.com/2024/05/tipos-en-erlang.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emanuelpeg.blogspot.com/2014/05/elixir.html" rel="noopener noreferrer"&gt;https://emanuelpeg.blogspot.com/2014/05/elixir.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jlouisramblings.blogspot.com/2010/12/response-to-erlang-overhyped-or.html" rel="noopener noreferrer"&gt;http://jlouisramblings.blogspot.com/2010/12/response-to-erlang-overhyped-or.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency" rel="noopener noreferrer"&gt;https://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adabeat.com/fp/is-erlang-relevant-in-2024/" rel="noopener noreferrer"&gt;https://adabeat.com/fp/is-erlang-relevant-in-2024/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/programming/comments/erboq/a_response_to_erlang_overhyped_or_underestimated/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/programming/comments/erboq/a_response_to_erlang_overhyped_or_underestimated/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adoptingerlang.org/" rel="noopener noreferrer"&gt;https://adoptingerlang.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://michal.muskala.eu/post/why-i-stayed-with-elixir/" rel="noopener noreferrer"&gt;https://michal.muskala.eu/post/why-i-stayed-with-elixir/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://railsware.com/blog/important-overhaul-elixir-did-to-erlang-to-become-appealing-web-development-tool/" rel="noopener noreferrer"&gt;https://railsware.com/blog/important-overhaul-elixir-did-to-erlang-to-become-appealing-web-development-tool/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
      <category>beam</category>
      <category>erlang</category>
      <category>chile</category>
    </item>
    <item>
      <title>Entendiendo la Mutabilidad y la Re-asignación</title>
      <dc:creator>Gonzalo Fernández</dc:creator>
      <pubDate>Sun, 02 Jun 2024 22:18:04 +0000</pubDate>
      <link>https://dev.to/javascriptchile/entendiendo-la-mutabilidad-y-la-re-asignacion-ihf</link>
      <guid>https://dev.to/javascriptchile/entendiendo-la-mutabilidad-y-la-re-asignacion-ihf</guid>
      <description>&lt;p&gt;Buenas, hoy quisiera hablar sobre un tema que puede ser confuso al iniciar en programación, especialmente en lenguajes como Javascript donde la diferencia es tan clara: La Mutabilidad y la Re-asignación.&lt;/p&gt;

&lt;p&gt;Al igual que en otros lenguajes, Javascript permite la definición de variables en las cuales almacenar datos. Existen 3 palabras reservadas que nos sirven para definir variables: &lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt; y &lt;code&gt;const&lt;/code&gt;, pero para este artículo, nos concentraremos en estas últimas 2, y ahondaremos en su relación con la mutabilidad y la reasignación.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;let&lt;/code&gt;: Permite definir una variable cuyo valor puede re-asignarse en cualquier momento.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;const&lt;/code&gt;: Permite definir una variable cuyo valor no puede re-asignarse, esa decir, una constante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas definiciones, si bien son concisas, podrían no bastar para dar cuenta del impacto que tiene el uso de uno versus el otro en Javascript, pues en mi opinión, es necesario hacer énfasis primeramente en los conceptos de &lt;strong&gt;re-asignación&lt;/strong&gt; y &lt;strong&gt;mutabilidad&lt;/strong&gt; que conlleva el uso de una u otra palabra reservada. &lt;/p&gt;

&lt;p&gt;Para ello, nos remontaremos a cómo funciona la memoria en un computador: a grandes rasgos, e ignorando cierta cantidad de aspectos fundamentales sobre arquitectura de computadores, es la memoria RAM la que almacena los datos con los que vamos a trabajar. Estos datos tienen &lt;strong&gt;direcciones&lt;/strong&gt; a través de las cuales accedemos a ellos. &lt;/p&gt;

&lt;p&gt;Veamos un ejemplo: supongamos que tenemos una memoria RAM de 8 bytes, por lo que si necesitáramos almacenar 1 byte, podríamos hacerlo en cualquiera de los 8 espacios distintos disponibles. Vamos a decir que estos espacios son &lt;strong&gt;direcciones de memoria&lt;/strong&gt;, y los nombraremos del 0 al 7. &lt;/p&gt;

&lt;p&gt;Cuando declaramos la primera variable en nuestro código, digamos &lt;code&gt;x = 5&lt;/code&gt;, el computador va a buscar un espacio de memoria disponible en nuestra RAM, digamos que en este caso es el espacio 0, y va a guardar allí el valor 5. Esto significa que la variable &lt;code&gt;x&lt;/code&gt; va a &lt;strong&gt;apuntar&lt;/strong&gt; a la dirección de memoria 0, porque en nuestra memoria RAM hemos guardado el número 5, pero nuestra variable &lt;code&gt;x&lt;/code&gt; no contiene el número 5, sino que contiene la &lt;strong&gt;dirección de memoria&lt;/strong&gt; donde se encuentra el número 5. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wal044ugk9ect08ir1s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wal044ugk9ect08ir1s.png" alt="Memoria RAM de 8 bytes, con x apuntando a la dirección 0 y guardando el número 5." width="322" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Memoria RAM de 8 bytes, con &lt;code&gt;x&lt;/code&gt; apuntando a la dirección 0 y guardando el número 5. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ahora bien, tenemos entonces variables que representan direcciones de memoria, y direcciones de memoria en donde se guardan datos. Estos datos pueden ser números, caracteres e incluso &lt;strong&gt;punteros&lt;/strong&gt;. Para entender esto, primero vamos a definir el concepto de puntero:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puntero:&lt;/strong&gt; es un dato que contiene una &lt;strong&gt;dirección de memoria&lt;/strong&gt; de otro dato, por eso se dice que &lt;strong&gt;apunta&lt;/strong&gt; hacia otra dirección de memoria.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Siguiendo con nuestro ejemplo, podemos guardar en la dirección 1 de la memoria un &lt;strong&gt;puntero&lt;/strong&gt; hacia la dirección 2. Por lo tanto, si quisiéramos acceder al dato que se encuentra en la dirección 2, tendríamos que acceder primero a la dirección 1, que nos llevará a la dirección 2.&lt;/p&gt;

&lt;p&gt;Supongamos que en la dirección 2 se almacena una &lt;strong&gt;Lista&lt;/strong&gt; de 4 elementos &lt;code&gt;(7, 'a', 'c' y 9)&lt;/code&gt;. Como ya no es un solo dato, vamos a utilizar más espacios de memoria: 4 bytes en total, desde el espacio 2 (el inicio) hasta el espacio 5 (el final). Entonces, resumiendo, en la dirección 0 de nuestra RAM tenemos el número 5, en la dirección 1 tendremos un puntero a la dirección 2, y en la dirección 2 una lista de 4 elementos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr5cykxvicdghngzn4a3y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr5cykxvicdghngzn4a3y.png" alt="Memoria RAM de 8 bytes, con x apuntando a la dirección 0, un puntero en la dirección 1 apuntando a la dirección 2, y 4 elementos correspondientes a la lista que parte en la dirección 2 y termina en la dirección 5" width="322" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Memoria RAM de 8 bytes, con &lt;code&gt;x&lt;/code&gt; apuntando a la dirección 0, un puntero en la dirección 1 apuntando a la dirección 2, y 4 elementos correspondientes a la lista que parte en la dirección 2 y termina en la dirección 5.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Teniendo este escenario en mente, vamos a definir los conceptos de &lt;strong&gt;re-asignación&lt;/strong&gt; y &lt;strong&gt;mutabilidad&lt;/strong&gt;. La &lt;strong&gt;reasignación&lt;/strong&gt; es cuando queremos cambiar el valor &lt;strong&gt;almacenado en la dirección de memoria&lt;/strong&gt; que representa nuestra variable. Es decir, la operación &lt;code&gt;x = 10&lt;/code&gt; accedería a la dirección 0 y cambiaría el valor que allí se almacena de 5 a 10, lo que estaría &lt;strong&gt;re-asignando&lt;/strong&gt; a la variable &lt;code&gt;x&lt;/code&gt;. O bien, podríamos &lt;strong&gt;re-asignar&lt;/strong&gt; la dirección de memoria 1 para que deje de almacenar la dirección de memoria 2, y de ahora en adelante guarde un número cualquiera en vez de un puntero. &lt;/p&gt;

&lt;p&gt;Por otro lado, diremos que la &lt;strong&gt;mutabilidad&lt;/strong&gt; es la capacidad que tiene una variable de modificar su contenido &lt;strong&gt;sin cambiar el valor&lt;/strong&gt; almacenado en la dirección de memoria que representa. Siguiendo la idea anterior, si tenemos una nueva variable &lt;code&gt;y&lt;/code&gt; que representa la dirección de memoria 1 (que recordemos, almacena un puntero a la dirección de memoria 2, donde hay una lista), y queremos &lt;strong&gt;modificar un elemento&lt;/strong&gt; de esa lista, podemos hacerlo sin cambiar el valor que se encuentra en la dirección de memoria 1. Esto significa que estaríamos &lt;strong&gt;mutando&lt;/strong&gt; la variable &lt;code&gt;y&lt;/code&gt;, ya que vamos a modificar un valor en otra dirección de memoria. Sin embargo, si ahora queremos que la variable &lt;code&gt;y&lt;/code&gt; tenga el valor 3, la estaría &lt;strong&gt;re-asignando&lt;/strong&gt; y no &lt;strong&gt;mutando&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;En resumen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Re-asignación&lt;/strong&gt;: capacidad de una variable de cambiar el valor almacenado en la dirección de memoria a la que apunta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutabilidad&lt;/strong&gt;: capacidad de una variable de modificar su contenido sin cambiar el valor en la dirección de memoria a la que apunta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Habiendo entendido esto, podemos aterrizar estos conceptos al ecosistema de Javascript, observemos el siguiente ejemplo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Uncaught TypeError: Assignment to constant variable.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las variables definidas con &lt;code&gt;const&lt;/code&gt; no se pueden &lt;strong&gt;re-asignar&lt;/strong&gt;, por lo que una vez que le asignamos el valor 10, ya no hay nada más que podamos hacer para modificar ese valor. Lo mismo ocurre con objetos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Javascript Chile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jschile.org/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Ningún problema.&lt;/span&gt;
&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// Uncaught TypeError: &lt;/span&gt;
                                &lt;span class="c1"&gt;// Assignment to constant variable.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este caso, definimos un objeto el cual posteriormente &lt;strong&gt;mutamos&lt;/strong&gt;, añadiéndole la propiedad &lt;code&gt;url&lt;/code&gt;, sin embargo, cuando quisimos asignar un objeto diferente, nos encontramos un error. Esto es porque cuando trabajamos con objetos, lo que se almacena en la dirección de memoria que representa la variable es un &lt;strong&gt;puntero&lt;/strong&gt;, el cual apunta a la dirección de memoria donde se almacena el objeto, y por lo tanto, intentar almacenar otro objeto implicaría cambiar el valor almacenado en la dirección de memoria de &lt;code&gt;x&lt;/code&gt;, cambiando hacia donde apunta el puntero, y por lo tanto intentando &lt;strong&gt;re-asignar&lt;/strong&gt; la variable.&lt;/p&gt;

&lt;p&gt;Para finalizar, queda el siguiente ejemplo con &lt;code&gt;let&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Javascript Chile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jschile.org/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Ningún problema.&lt;/span&gt;
&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// Ningún problema.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Donde ambas operaciones funcionan porque &lt;code&gt;let&lt;/code&gt; permite tanto la &lt;strong&gt;re-asignación&lt;/strong&gt; como la &lt;strong&gt;mutabilidad&lt;/strong&gt;. Dicho esto, vale la pena estudiar más sobre como la &lt;strong&gt;mutabilidad&lt;/strong&gt; impacta en el desarrollo de nuestros productos, y en la forma en la que programamos. A modo de detalle, en este artículo utilizo el concepto &lt;strong&gt;re-asignación&lt;/strong&gt;, porque las memorias RAM siempre tienen un dato asignado, siempre tendrán almacenado un 1 o 0 en sus celdas, por lo que sería erróneo en mi opinión hablar de &lt;strong&gt;asignación&lt;/strong&gt; bajo el nivel de detalle en que se desenvuelve este artículo, más no significa que esté erróneo per sé hablar de &lt;strong&gt;asignar&lt;/strong&gt; una variable.&lt;/p&gt;

&lt;p&gt;Espero que se haya entendido bien el concepto con este artículo, y quedo atento a cualquier comentario que puedan tener, por último, quisiera mencionar que este artículo fue extraído de un &lt;strong&gt;Apunte de Introducción a Javascript&lt;/strong&gt;, el cual redacté para mis estudiantes de Desarrollo Web, puedes descargarlo haciendo clic en la imagen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://steadycraft.notion.site/Introducci-n-a-Javascript-48a4b004556641dc8ffede99bbe071e9?pvs=25"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gc8z0we8wf2ztscnsbb.png" alt="Apunte Introducción a Javascript" width="800" height="1276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos vemos!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>mutability</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Introducción a Elixir</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Wed, 22 May 2024 16:21:00 +0000</pubDate>
      <link>https://dev.to/javascriptchile/introduccion-a-elixir-3953</link>
      <guid>https://dev.to/javascriptchile/introduccion-a-elixir-3953</guid>
      <description>&lt;p&gt;¿Se han preguntado que és lo que hace genial a un lenguaje de programación?. Una de las razones por la que Elixir es genial es su consistencia. José Valim tomó ideas de otros lenguajes de programación como Ruby y Erlang, ideas que han sido desarrolladas por más de 30 años y las hizo mucho más consistentes. 30 años de ideas pensadas para diferentes propósitos por diferentes personas condensadas en una serie de bibliotecas mucho más rápidas de usar y entender.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/lxYFOM3UJzo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Elixir se ejecuta en la máquina virtual &lt;code&gt;BEAM&lt;/code&gt;, una &lt;em&gt;VM&lt;/em&gt; realmente antigua, ya que fue creada por Ericsson en 1986 para el lenguaje Erlang (Más antigua que Java). Estas tecnologías fueron las principales protagonistas de las aplicaciones en un entorno de telecomunicaciones que manejan innumerables solicitudes por segundo de una manera confiable y eficiente.&lt;/p&gt;

&lt;p&gt;Unas décadas más tarde, esta VM fue considerada por José Valim, quien creó el lenguaje Elixir a mediados de 2011 para utilizar todo el poder de &lt;code&gt;BEAM&lt;/code&gt; en un lenguaje moderno y enfocado en la experiencia de desarrollo. Este lenguaje también fue responsable de la popularización de la máquina virtual de Erlang.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ninjas.cl/books/elixir-fullstack/" rel="noopener noreferrer"&gt;https://ninjas.cl/books/elixir-fullstack/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/cherryramatis/beam-vm-the-good-the-bad-and-the-ugly-9d6"&gt;https://dev.to/cherryramatis/beam-vm-the-good-the-bad-and-the-ugly-9d6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Un pequeño vistazo de Elixir
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;booleano&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;123_456&lt;/span&gt;
&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Un binario"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Concatenada"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Interpolación &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;?A&lt;/span&gt;
&lt;span class="n"&gt;atomo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:un_atomo&lt;/span&gt;
&lt;span class="n"&gt;funcion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Hola"&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;mapa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;%{&lt;/span&gt;&lt;span class="ss"&gt;valor:&lt;/span&gt; &lt;span class="s2"&gt;"hola"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;tupla&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"dos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:tres&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;keyword_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;valor:&lt;/span&gt; &lt;span class="s2"&gt;"hola"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Imprimir en Terminal"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Comentario&lt;/span&gt;
&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="c1"&gt;# variable placeholder&lt;/span&gt;
&lt;span class="n"&gt;_var&lt;/span&gt; &lt;span class="c1"&gt;# variable omitida&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;MiModulo&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

  &lt;span class="nv"&gt;@atributo&lt;/span&gt; &lt;span class="s2"&gt;"Un atributo del módulo"&lt;/span&gt;

  &lt;span class="c1"&gt;# Retorno el resultado de la última expresion&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;mi_funcion_publica&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parametro&lt;/span&gt; &lt;span class="p"&gt;\\&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="s2"&gt;"Función Pública con &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;parametro&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# Pattern matching selecciona cual ejecutar según la firma de la función&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;mi_funcion_publica&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="s2"&gt;"Función Pública Sin parámetros"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;mi_funcion_privada&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="s2"&gt;"Función Privada"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;MiModulo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mi_funcion_publica&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ¿Qué significa Consistencia?
&lt;/h3&gt;

&lt;p&gt;La palabra consistencia se puede definir según la &lt;em&gt;RAE&lt;/em&gt; como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;f. Duración, estabilidad, solidez.&lt;/li&gt;
&lt;li&gt;f. Trabazón, coherencia entre las partículas de una masa o los elementos de un conjunto.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Adicionalmente definiremos coherencia:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;f. Conexión, relación o unión de unas cosas con otras.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Así como cohesión:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;f. Fís. Fuerza de atracción que mantiene unidas las moléculas de un cuerpo.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dle.rae.es/coherencia" rel="noopener noreferrer"&gt;https://dle.rae.es/coherencia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dle.rae.es/consistencia" rel="noopener noreferrer"&gt;https://dle.rae.es/consistencia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dle.rae.es/cohesi%C3%B3n" rel="noopener noreferrer"&gt;https://dle.rae.es/cohesión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En el desarrollo de software los componentes que utilizamos para elaborar el sistema idealmente deben ser consistentes, coherentes y cohesivos, es decir, que tengan una armonía y sean una base sólida para facilitar la mantención e implementación de los requisitos del sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplos de Inconsistencias
&lt;/h3&gt;

&lt;p&gt;En otras tecnologías podemos encontrar inconsistencias.&lt;/p&gt;

&lt;h4&gt;
  
  
  Inconsistencias en la API
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt; es un gran ejemplo de inconsistencias en su biblioteca oficial de funciones.&lt;br&gt;
Por ejemplo notemos como las diferencias entre las funciones &lt;code&gt;str_replace&lt;/code&gt; y &lt;code&gt;strpos&lt;/code&gt;. Ambas funciones para trabajar con &lt;code&gt;strings&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El nombre es inconsistente, la primera utiliza guión bajo para separar &lt;code&gt;str_&lt;/code&gt; y la otra no.&lt;/li&gt;
&lt;li&gt;El nombre de los parámetros es incosistente. &lt;code&gt;$search&lt;/code&gt; y &lt;code&gt;$haystack&lt;/code&gt; son equivalentes.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt; &lt;span class="nb"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;mixed&lt;/span&gt; &lt;span class="nv"&gt;$search&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mixed&lt;/span&gt; &lt;span class="nv"&gt;$replace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mixed&lt;/span&gt; &lt;span class="nv"&gt;$subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mixed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$haystack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$needle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Además la función &lt;code&gt;strpos&lt;/code&gt; puede retornar un valor que sea un entero, pero podría ser considerado falso (&lt;code&gt;0&lt;/code&gt;).&lt;br&gt;
Por lo que debería usar el operador &lt;code&gt;===&lt;/code&gt; para verificar el real valor de retorno.&lt;/p&gt;

&lt;p&gt;En &lt;strong&gt;Elixir&lt;/strong&gt; se podría utilizar un retorno de tuplas &lt;code&gt;{:ok, pos}&lt;/code&gt; y  &lt;code&gt;{:error, motivo}&lt;/code&gt;&lt;br&gt;
y utilizar pattern matching, simplificando las validaciones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hexdocs.pm/elixir/1.16.3/Kernel.html#===/2" rel="noopener noreferrer"&gt;https://hexdocs.pm/elixir/1.16.3/Kernel.html#===/2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.codinghorror.com/php-sucks-but-it-doesnt-matter/" rel="noopener noreferrer"&gt;https://blog.codinghorror.com/php-sucks-but-it-doesnt-matter/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hexdocs.pm/elixir/String.html" rel="noopener noreferrer"&gt;https://hexdocs.pm/elixir/String.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.php.net/manual/en/ref.strings.php" rel="noopener noreferrer"&gt;https://www.php.net/manual/en/ref.strings.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.php.net/manual/en/function.strpos.php" rel="noopener noreferrer"&gt;https://www.php.net/manual/en/function.strpos.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.php.net/manual/en/function.str-replace.php" rel="noopener noreferrer"&gt;https://www.php.net/manual/en/function.str-replace.php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Inconsistencias en los Datos
&lt;/h4&gt;

&lt;p&gt;En otros lenguajes de programación una fuente de inconsistencias es la mutabilidad de sus estructuras de datos. &lt;em&gt;Elixir&lt;/em&gt; al ser un lenguaje funcional trabaja con estructuras inmutables que permiten una consistencia en los datos.&lt;/p&gt;

&lt;p&gt;El siguiente ejemplo escrito en &lt;strong&gt;Python&lt;/strong&gt;, nos muestra los problemas de inconsistencias en lenguajes de programación con estructuras de datos mutables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;mapa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lista&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;numero&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lista&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;numero&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# [1, 2, 3, 4]
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 20
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mapa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# {'lista': [1, 2, 3, 4], 'numero': 10}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hemos modificado la variable &lt;code&gt;lista&lt;/code&gt; y &lt;code&gt;numero&lt;/code&gt;, pero sin embargo la variable &lt;code&gt;mapa&lt;/code&gt; fue afectada. Esto es debido a que &lt;code&gt;lista&lt;/code&gt; fue accedido por referencia y &lt;code&gt;numero&lt;/code&gt; accedido por valor.&lt;/p&gt;

&lt;p&gt;En &lt;em&gt;Elixir&lt;/em&gt; eso no pasa, gracias a su inmutabilidad. Podemos trabajar con las variables &lt;code&gt;lista&lt;/code&gt; y &lt;code&gt;numero&lt;/code&gt; sin miedo a alterar el valor de la variable &lt;code&gt;mapa&lt;/code&gt;.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;mapa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;%{&lt;/span&gt;
  &lt;span class="ss"&gt;lista:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="ss"&gt;numero:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;

&lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# [1, 2, 3, 4]&lt;/span&gt;

&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 20&lt;/span&gt;

&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mapa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# %{lista: [1, 2, 3], numero: 10}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Functional_programming" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Functional_programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Las diferencias con lenguajes OOP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Acoplamiento en la OOP
&lt;/h3&gt;

&lt;p&gt;Los objetos son el acomplamiento de tres componentes: Comportamiento, Estado y Mutabilidad (cambios en el tiempo). Cada vez que se crea un objeto se obtiene una entidad que acopla esos tres componentes. Este acoplamiento causa muchas veces problemas, ¿Cómo puedo solamente utilizar uno de los componentes?.&lt;/p&gt;

&lt;p&gt;Una de las mayores fuentes de problemas es la herencia entre objetos. Si por ejemplo tenemos un objeto que tiene acoplado estado y comportamientos, luego deseo añadir más comportamientos, debo recurrir a la herencia. Los objetos por definición existen para encapsular un estado, para modificar el estado debo interactuar con el objeto. Al utilizar herencia se tiene un mecanismo que permite adulterar el estado directamente, invalidando al objeto. Es así como algunos lenguajes de programación incluyen operadores como &lt;code&gt;protected&lt;/code&gt;, &lt;code&gt;final&lt;/code&gt;, entre otros para controlar la visibilidad de lo que se supone no debería tener acceso.&lt;/p&gt;

&lt;p&gt;Básicamente existe un problema cuya solución crea otros problemas, sin incluir cosas como la herencia múltiple. Todo esto debido al acomplamiento inherente de la orientación a objetos.&lt;/p&gt;

&lt;p&gt;La Programación Orientada a Objetos (POO) no se trata de crear una taxonomía gigante con una compleja jerarquía de objetos. El uso desmedido de la sintaxis del punto (&lt;code&gt;objeto.metodo()&lt;/code&gt;) es una consecuencia de esa mala interpretación. La &lt;em&gt;POO&lt;/em&gt; se trata de tener objetos que parpean como un pato, pero no necesariamente son un pato (quack like a duck, but is not a duck). Hay una gran confusión acerca de que en la POO solo existen métodos y no funciones. Hasta Smalltalk (padre de la POO) hay funciones (escondidas bajo una sintaxis especial).&lt;/p&gt;

&lt;p&gt;En el conocido libro del &lt;a href="https://en.wikipedia.org/wiki/Design_Patterns" rel="noopener noreferrer"&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt; mencionan: "Preferir la composición por sobre la herencia".&lt;/p&gt;

&lt;p&gt;Los lenguajes funcionales como Haskell, Lisp y Elixir han estado resolviendo problemas complejos sin recurrir a la herencia. Mientras que los lenguajes orientados a objetos pueden utilizar la composición gracias a las interfaces. Ya que las interfaces son un mecanismo de polimorfismo, es decir, que nos permiten trabajar con múltiples formas a través de un contrato pre-establecido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Los Componentes de Elixir
&lt;/h3&gt;

&lt;p&gt;En Elixir existe comportamiento (Módulos), estado (Datos) y una visión de mutabilidad (Procesos), pero no están acoplados. Lo que nos permite elaborar software utilizando solamente el componente requerido, sin incurrir en los problemas ocasionados por el acoplamiento de la POO. Elixir dispone de tres dimensiones para realizar sistemas, a diferencia de la POO que solamente cuenta con una. Por lo que puede tener un polimorfismo distinto en cada componente (Behaviours, Protocols, Messages).&lt;/p&gt;

&lt;p&gt;En el libro &lt;a href="https://en.wikipedia.org/wiki/Concepts,_Techniques,_and_Models_of_Computer_Programming" rel="noopener noreferrer"&gt;Concepts, Techniques, and Models of Computer Programming&lt;/a&gt; mencionan la regla de lo menos expresivo. "Cuando se programa un componente, el modelo computacional correcto para lograr un programa natural es el menos expresivo posible". Lo que se puede simplificar como "utilizar la abstracción más simple posible para resolver el problema".&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/agkXUp0hCW8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo de Acoplamiento
&lt;/h3&gt;

&lt;p&gt;Vamos por un ejemplo simple comparando la forma de contar caracteres en un &lt;code&gt;string&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;El siguiente es un ejemplo en &lt;strong&gt;Ruby&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"Hola"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
&lt;span class="c1"&gt;# 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En &lt;strong&gt;Elixir&lt;/strong&gt; la misma operación sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hola"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En &lt;strong&gt;Ruby&lt;/strong&gt; el &lt;code&gt;string&lt;/code&gt; "Hola" es un objeto que además de tener&lt;br&gt;
la estructura de datos, tiene una serie de comportamientos asociados.&lt;br&gt;
Esta altamente acoplado.&lt;/p&gt;

&lt;p&gt;En cambio en &lt;strong&gt;Elixir&lt;/strong&gt; el &lt;code&gt;string&lt;/code&gt; "Hola" solamente es un dato&lt;br&gt;
que no tiene comportamientos. Para poder realizar operaciones&lt;br&gt;
debemos utilizar las funciones del módulo &lt;code&gt;String&lt;/code&gt;. Existe&lt;br&gt;
un desacople entre datos y comportamientos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Por qué es importante este desacople?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Veamos un ejemplo. Si asignamos una variable a "Hola",&lt;br&gt;
con el tiempo podemos cambiar el contenido de la variable&lt;br&gt;
y ya no podremos utilizar el método asociado a los tipos &lt;code&gt;string&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Hola"&lt;/span&gt;
&lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
&lt;span class="c1"&gt;# 4&lt;/span&gt;

&lt;span class="n"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
&lt;span class="c1"&gt;# (irb):4:in `&amp;lt;main&amp;gt;': undefined method `length' for an instance of Integer (NoMethodError)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto puede ser un problema, sobre todo si existe una jerarquía de herencias y combinado con la mutabilidad del lenguaje, es una receta para el caos y soluciones poco elegantes si no se maneja adecuadamente los riesgos.&lt;/p&gt;

&lt;p&gt;En &lt;strong&gt;Elixir&lt;/strong&gt; al estar totalmente desacoplados dato, comportamiento y cambios de estado, se puede asegurar productos de software libres de problemas asociados a jerarquías de herencias y mutabilidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern Matching
&lt;/h2&gt;

&lt;p&gt;Esta técnica propia de los lenguajes funcionales, se utiliza para buscar patrones y decidir qué hacer en cada momento. Debemos pensar en el operador = no como un signo igual típico de otros lenguajes, sino como el que nos encontramos en una función matemática del tipo x = a + 1. Es decir que estamos diciendo que x y a + 1 tienen el mismo valor.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# a = 1&lt;/span&gt;
&lt;span class="c1"&gt;# b = "elixir"&lt;/span&gt;
&lt;span class="c1"&gt;# c = "ninjas"&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"elixir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ninjas"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joyofelixir.com/6-pattern-matching" rel="noopener noreferrer"&gt;https://joyofelixir.com/6-pattern-matching&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  El Operador Pipe
&lt;/h2&gt;

&lt;p&gt;Los sistemas operativos inspirados por &lt;em&gt;Unix&lt;/em&gt; vienen usando &lt;strong&gt;Pipelines&lt;/strong&gt; desde sus inicios.&lt;br&gt;
En este ejemplo, listamos el contenido del directorio, filtramos solo las líneas que contienen &lt;em&gt;"archivo.txt"&lt;/em&gt;, y redirigimos la salida a un archivo llamado &lt;em&gt;resultado.txt&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"archivo.txt"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; resultado.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.swhosting.com/es/comunidad/manual/uso-de-pipes-en-sistemas-unix" rel="noopener noreferrer"&gt;https://www.swhosting.com/es/comunidad/manual/uso-de-pipes-en-sistemas-unix&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el caso de &lt;strong&gt;Elixir&lt;/strong&gt;, el operador &lt;code&gt;pipe&lt;/code&gt; (tubería) &lt;code&gt;|&amp;gt;&lt;/code&gt; es una hermosa herramienta que nos permite expresar una cadena de funciones como una secuencia de acciones.&lt;/p&gt;

&lt;p&gt;Aún si no has usado &lt;em&gt;Elixir&lt;/em&gt; podrías entender la lógica del siguiente código.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;parametros_formulario&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;validar_formulario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;insertar_usuario&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;crear_reporte&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mostrar_resultado&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilizar una serie de operadores &lt;code&gt;pipe&lt;/code&gt; se conoce como un &lt;code&gt;pipeline&lt;/code&gt;.  Es simple de leer y comprender lo que ocurre. Pero por su simpleza también tiene algunas limitaciones. Debido a que las funciones están encadenadas, dependen del resultado anterior. Si alguna de las funciones falla quebraría el flujo completo. No se puede hacer mucho frente a esto a menos que se maneje los casos de error en cada función.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.appsignal.com/2022/07/19/writing-predictable-elixir-code-with-reducers.html" rel="noopener noreferrer"&gt;https://blog.appsignal.com/2022/07/19/writing-predictable-elixir-code-with-reducers.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  En Elixir Todo es un Reductor (Reducer)
&lt;/h2&gt;

&lt;p&gt;Primero partiremos explicando los conceptos de &lt;code&gt;acumulador&lt;/code&gt; y &lt;code&gt;reductor&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acumulador
&lt;/h3&gt;

&lt;p&gt;Un acumulador es una variable que durante la ejecución de un programa va referenciar así misma y almacenar el resultado de realizar operaciones con los valores contenidos en otras variables.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;acumulador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;acumulador&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.uacj.mx/CGTI/CDTE/JPM/Documents/IIT/fund_programacion/U4-1.html" rel="noopener noreferrer"&gt;https://www.uacj.mx/CGTI/CDTE/JPM/Documents/IIT/fund_programacion/U4-1.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://es.wikipedia.org/wiki/Acumulador_(inform%C3%A1tica)" rel="noopener noreferrer"&gt;https://es.wikipedia.org/wiki/Acumulador_(inform%C3%A1tica)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reductor
&lt;/h3&gt;

&lt;p&gt;Un reductor es una forma de procesar una tarea grande poco a poco. Utiliza un acumulador para facilitar las operaciones intermedias y entrega un único resultado final.&lt;/p&gt;

&lt;p&gt;La estructura común de un reductor es la siguiente.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;reductor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elementos_enumerables&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor_inicial_acumulador&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;funcion_reductora&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;elementos_enumerables&lt;/code&gt;: Una lista de elementos que pueden ser enumerados. Ejemplo &lt;code&gt;[1, 2, 3]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;valor_inicial_acumulador&lt;/code&gt;: El valor que tendrá nuestro acumulador en la primera ejecución de la función reductora. Ejemplo &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;funcion_reductora&lt;/code&gt;: Es la función que recibe dos parámetros. El elemento en la lista y el valor actual del acumulador. Ejemplo &lt;code&gt;fn elemento, acc -&amp;gt; acc + elemento end&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El reductor ejecutará la función reductora por cada elemento y retornará el valor final del acumulador cuando cada elemento haya sido procesado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://redrapids.medium.com/learning-elixir-its-all-reduce-204d05f52ee7" rel="noopener noreferrer"&gt;https://redrapids.medium.com/learning-elixir-its-all-reduce-204d05f52ee7&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo
&lt;/h3&gt;

&lt;p&gt;Vamos a ver un ejemplo concreto de cómo funciona un reductor. Primero definiremos una función para sumar dos valores. Utilizaremos la sintaxis simplificada con el operador de captura (&lt;code&gt;&amp;amp;&lt;/code&gt;).&lt;br&gt;
Lo que nos permite expresar una función de forma más corta.&lt;/p&gt;

&lt;p&gt;La siguiente forma de expresar una función con dos parámetros&lt;/p&gt;




&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;sumar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;elemento&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;elemento&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Puede ser simplificada utilizando el operador de captura &lt;code&gt;&amp;amp;&lt;/code&gt;.&lt;/p&gt;




&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;sumar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Sumaremos la lista de elementos &lt;code&gt;[1, 3, 4]&lt;/code&gt; para que podamos obtener la sumatoria que es &lt;code&gt;8&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# sumar = fn elemento, acc -&amp;gt; elemento + acc end&lt;/span&gt;
&lt;span class="n"&gt;sumar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;amp;:erlang.+/2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si utilizamos el módulo &lt;code&gt;Enum&lt;/code&gt; y la función &lt;code&gt;reduce&lt;/code&gt; obtendremos nuestro resultado&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# reduce(enumerable, acumulador, funcion_reductora)&lt;/span&gt;
&lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Es equivalente a llamar a la funcion &lt;code&gt;sumar&lt;/code&gt; de forma anidada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puede ser expresada como un &lt;code&gt;pipeline&lt;/code&gt; de la función sumar, cuyo valor incial es. &lt;code&gt;0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este pipeline se podría expresar como llamar a la función &lt;code&gt;suma&lt;/code&gt; utilizando el resultado de la función anterior. En este caso se podría expresar como lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1&lt;/span&gt;
&lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 4&lt;/span&gt;
&lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 8&lt;/span&gt;
&lt;span class="n"&gt;sumar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CRC: Crear, Reducir y Convertir
&lt;/h3&gt;

&lt;p&gt;Elixir utiliza módulos y tipos de datos, lo que permite una forma de organizar nuestro código en lo que se denomina &lt;em&gt;CRC&lt;/em&gt; (Constructores, Reductores y Conversores). Por lo que tendremos funciones para (&lt;strong&gt;crear&lt;/strong&gt;) un &lt;em&gt;acumulador&lt;/em&gt;, funciones que realizarán operaciones (&lt;strong&gt;reductores&lt;/strong&gt;) con este &lt;em&gt;acumulador&lt;/em&gt; y finalmente funciones que transformarán el &lt;em&gt;acumulador&lt;/em&gt; en un formato final (&lt;strong&gt;conversores&lt;/strong&gt;). Ésto es algo que ha existido por largo tiempo en diferentes lenguajes de programación como &lt;em&gt;Haskell&lt;/em&gt; o &lt;em&gt;Lisp&lt;/em&gt;. Lo más importante que puedes hacer en un lenguaje es unir ideas utilizando composición.&lt;/p&gt;

&lt;p&gt;La idea es crear un &lt;code&gt;pipeline&lt;/code&gt; que reciba como primer parámetro un acumulador y realizar una serie de operaciones &lt;code&gt;reduce&lt;/code&gt; hasta llegar al &lt;code&gt;conversor&lt;/code&gt; final.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;  &lt;span class="n"&gt;entrada&lt;/span&gt;
  &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# crea el acumulador inicial&lt;/span&gt;
  &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reductor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reductor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reductor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;conversor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
  &lt;span class="c1"&gt;# salida de la función listo para ser utilizado por otro pipeline&lt;/span&gt;
  &lt;span class="c1"&gt;# o ser mostrado al usuario final&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por esta razón podemos considerar que todo en &lt;em&gt;Elixir&lt;/em&gt; es un conjunto de acumuladores y reductores. Mucha de las funciones del core de &lt;em&gt;Elixir&lt;/em&gt; pueden ser implementadas usando nada más que un acumulador y &lt;code&gt;Enum.reduce&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué es importante?
&lt;/h3&gt;

&lt;p&gt;Gracias a ésta forma de organización podemos ver nuestro código de forma coherente&lt;br&gt;
y unificada. Al tener una estructura de datos en común con varias funciones &lt;br&gt;
podemos realizar operaciones y expresarnos con una facilidad de lectura mayor.&lt;br&gt;
Nuestros sistemas serán más fáciles de entender y mantener en el futuro.&lt;/p&gt;

&lt;p&gt;La consistencia es un factor importante de calidad en nuestros sistemas y utilizar &lt;em&gt;CRC&lt;/em&gt; es una gran herramienta para lograr eso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ElixirCL/ElixirCL/wiki/%5BTutorial%5D-CRC-y-DFTBLWB" rel="noopener noreferrer"&gt;https://github.com/ElixirCL/ElixirCL/wiki/%5BTutorial%5D-CRC-y-DFTBLWB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/69wZzHYa0aM"&gt;
&lt;/iframe&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Creamos un nuevo mapa con nuestro acumulador&lt;/span&gt;
&lt;span class="n"&gt;constructor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;%{&lt;/span&gt;&lt;span class="ss"&gt;acc:&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Retornamos el valor del acumulador actualizado&lt;/span&gt;
&lt;span class="n"&gt;suma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;%{&lt;/span&gt;&lt;span class="ss"&gt;acc:&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Mostramos solamente el valor que deseamos&lt;/span&gt;
&lt;span class="n"&gt;conversor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;&amp;amp;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt;

&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;constructor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;suma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;suma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;suma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;conversor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ejemplo de CRC
&lt;/h3&gt;

&lt;p&gt;Vamos a ejemplificar un poco utilizando un mapa del tesoro. En este mapa vamos a dar una serie de direcciones norte, sur, este y oeste. Se puede ver como tenemos una función de creación que retorna una tupla &lt;code&gt;{x, y}&lt;/code&gt;, la cual será nuestra estructura de datos del acumulador. Luego tenemos una serie de reductores que modifican la tupla y devuelven una nueva tupla con los valores apropiados. Finalmente tenemos nuestro conversor que retorna un &lt;code&gt;String&lt;/code&gt; con un mensaje final.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Tesoro&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;# Creador&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;nuevo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;nuevo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nuevo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;# Reductores&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;norte&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sur&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;este&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;oeste&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;# Conversor&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;mostrar&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"El tesoro se encuentra en las coordenadas &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{:module, Tesoro, &amp;lt;&amp;lt;70, 79, 82, 49, 0, 0, 11, ...&amp;gt;&amp;gt;, {:mostrar, 1}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="no"&gt;Tesoro&lt;/span&gt;

&lt;span class="n"&gt;nuevo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;norte&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;este&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;este&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;oeste&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;oeste&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sur&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sur&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sur&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;este&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;este&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;este&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mostrar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"El tesoro se encuentra en las coordenadas -3,2"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como se puede apreciar logramos generar nuestro mapa del tesoro utilizando un &lt;code&gt;pipeline&lt;/code&gt; de funciones que aceptan una estructura de datos en común como primer parámetro (acumulador). Se realizan las operaciones a esta estructura para finalmente crear una salida con un formato específico.&lt;/p&gt;

&lt;p&gt;Hemos logrado algo genial. Tomamos una idea compleja de distintas funciones y las unificamos como si fueran eslabones de una misma cadena. De esta forma puedes ver como las operaciones forman una cascada enviando valores. Hemos creado una composición utilizando reductores.&lt;/p&gt;

&lt;p&gt;Las ideas de &lt;em&gt;CRC&lt;/em&gt; (Crear, Reducir y Convertir) pueden ser encontradas a lo largo de todo el ecosistema de &lt;em&gt;Elixir&lt;/em&gt;, por ejemplo con &lt;em&gt;OTP&lt;/em&gt; y el estado de un &lt;em&gt;GenServer&lt;/em&gt; o &lt;em&gt;Phoenix&lt;/em&gt; para tomar un dato y convertir ese dato a HTML, SVG, JSON o similares.&lt;/p&gt;

&lt;p&gt;El ver las operaciones como una cadena simplifica cómo construir, leer y probar todo el software en el ecosistema de &lt;em&gt;Elixir&lt;/em&gt;, gracias a una excelente consistencia y decisiones de diseño.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué usar Elixir frente a las alternativas?
&lt;/h2&gt;

&lt;p&gt;Algunas razones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un lenguaje funcional moderno y preciosamente consistente. Permitiendo un nivel más desacoplado y consistente que con otras tecnologías.&lt;/li&gt;
&lt;li&gt;Se ejecuta en la &lt;code&gt;BEAM&lt;/code&gt; con más de 30 años de herramientas para sistemas robustos, escalables y concurrentes. Logrando una mayor confiabilidad y resiliencia a fallos que con otras soluciones.&lt;/li&gt;
&lt;li&gt;Gran ecosistema de herramientas para IOT, Robótica, IA, Web, Mobile, entre otros.&lt;/li&gt;
&lt;li&gt;Un mercado atractivo para profesionales con ofertas laborales novedosas y frescas, sin tanta competencia como en otras tecnologías.  Mercado laboral en auge en USA, Alemania, Japón, entre otros.&lt;/li&gt;
&lt;li&gt;Multitud de capacitaciones y certificaciones disponibles (Grox.io, Erlang Solutions).&lt;/li&gt;
&lt;li&gt;Utilizado por empresas de alto calibre como Facebook, Whatsapp, Discord, Pepsico, Walmart, entre otros.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ¿Qué nos depara la industria en el futuro?
&lt;/h3&gt;

&lt;p&gt;La industria informática está llena de cambios. Podemos mencionar la tecnología de los 80's con las primeras computadoras personales como el &lt;em&gt;Commondore&lt;/em&gt; o &lt;em&gt;Atari&lt;/em&gt;. Luego en los 90's vimos los inicios de internet con &lt;em&gt;HTML&lt;/em&gt;, &lt;em&gt;JS&lt;/em&gt; y &lt;em&gt;CSS&lt;/em&gt;. En los 2000's vimos el auge de las redes sociales como &lt;em&gt;Facebook&lt;/em&gt; y plataformas como &lt;em&gt;Youtube&lt;/em&gt;. En los 2010's se masificaron las aplicaciones y teléfonos móviles "inteligentes". ¿Qué se viene en la década del 2020's?. Lo más probable es la masificación de la &lt;em&gt;IA&lt;/em&gt; y sistemas concurrentes. Casos donde &lt;em&gt;Elixir&lt;/em&gt; y &lt;em&gt;Erlang&lt;/em&gt; son idóneos, superando a otras alternativas como &lt;em&gt;Python&lt;/em&gt; y &lt;em&gt;Ruby&lt;/em&gt;. Los profesionales que aprendan lenguajes de la &lt;code&gt;BEAM&lt;/code&gt; estarán preparados para las próximas décadas de la industria, debido a que cada día la concurrencia y robustez de los sistemas será mucho más necesaria.&lt;/p&gt;

&lt;p&gt;Los lenguajes de programación que son "difíciles de contratar" siempre serán un problema. Desafortunadamente, este no es un problema que realmente puedas resolver, porque nadie conoce el futuro. Si por ejemplo elijes un lenguaje de programación popular hoy, luego a la gente deja de gustarle y no será fácil encontrar personal (VB6, Action Script Flash). ¿Qué pasa con casos como &lt;strong&gt;Python&lt;/strong&gt;, donde la migración de &lt;em&gt;2.x&lt;/em&gt; a &lt;em&gt;3.x&lt;/em&gt; fue tan tortuosa, que prácticamente fue un cambio a un lenguaje distinto?. Las organizaciones que no se casan con un solo lenguaje o tecnología y adoptan estratégicamente nuevas herramientas, estarán mejor capacitadas para las variaciones del mercado e industria.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://adoptingerlang.org/docs/team_building/how_to_polyglot/" rel="noopener noreferrer"&gt;https://adoptingerlang.org/docs/team_building/how_to_polyglot/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ElixirCL/ElixirCL/wiki/Por-qu%C3%A9-elegir-Elixir-y-Phoenix" rel="noopener noreferrer"&gt;https://github.com/ElixirCL/ElixirCL/wiki/Por-qué-elegir-Elixir-y-Phoenix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/9lkO-kgxoiY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Imágen: &lt;a href="https://commons.wikimedia.org/wiki/File:%C3%89lixir_et_liqueur.JPG" rel="noopener noreferrer"&gt;https://commons.wikimedia.org/wiki/File:%C3%89lixir_et_liqueur.JPG&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
      <category>chile</category>
      <category>introduccion</category>
      <category>flisol</category>
    </item>
    <item>
      <title>Documenta tu Evolución Profesional</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Tue, 02 Apr 2024 15:18:01 +0000</pubDate>
      <link>https://dev.to/javascriptchile/documenta-tu-evolucion-profesional-af5</link>
      <guid>https://dev.to/javascriptchile/documenta-tu-evolucion-profesional-af5</guid>
      <description>&lt;p&gt;Un sitio web personal es un gran aliado para documentar nuestro camino y evolución en la industria I.T.&lt;/p&gt;

&lt;h2&gt;
  
  
  Github Es Insuficiente
&lt;/h2&gt;

&lt;p&gt;Muchos pueden pensar de que solamente subiendo nuestro código a plataformas como &lt;em&gt;Github&lt;/em&gt;, &lt;em&gt;Gitlab&lt;/em&gt;, &lt;em&gt;Codeberg&lt;/em&gt; y similares es suficiente. Pero lamentablemente tienen los siguientes problemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No sirven para documentar proyectos privados. &lt;/li&gt;
&lt;li&gt;La información no está ordenada y es difícil de destacar las partes importantes.&lt;/li&gt;
&lt;li&gt;Dependes de un tercero y no tienes autonomía al almacenar y distribuir tu contenido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El principal problema es que cuando participas en proyectos donde no eres dueño del código. Normalmente para empresas privadas. En tu sitio web puedes por lo menos documentar que participaste en dichos proyectos (Si tu contrato lo permite).&lt;/p&gt;

&lt;p&gt;Además muchas veces son tantos proyectos dispersos que es mejor tener un lugar centralizado que puedes poner en tu currículum vitae.&lt;/p&gt;

&lt;h3&gt;
  
  
  Super Tip
&lt;/h3&gt;

&lt;p&gt;Si lograste algo importante en un proyecto privado puedes crear un ejemplo que no tenga los datos restringidos y que demuestre lo que aprendiste o lograste.&lt;/p&gt;

&lt;p&gt;De esta forma puedes tener una documentación personal y tal ves en otros proyectos futuros puedas tener este código de ejemplo o cómo lograste algo en específico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comienza Hoy
&lt;/h2&gt;

&lt;p&gt;Lo ideal es que si eres estudiante o estas aprendiendo, comiences desde ya a tener un sitio personal que documente los proyectos, ideas, eventos y otras experiencias que has vivido en tu carrera profesional. Si ya tienes algunos años te costará un poco más comenzar a documentar todo y tomará más tiempo ordenar el material que has acumulado con el paso de los años.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué tecnología usar?
&lt;/h2&gt;

&lt;p&gt;Lo más importante es tener la capacidad de migración. Si algún evento causa que tu proveedor de hosting cierre, puedas encontrar otro fácilmente y migrar tu contenido. Además de poder ser almacenado en &lt;a href="https://web.archive.org" rel="noopener noreferrer"&gt;archive.org&lt;/a&gt; para preservación histórica.&lt;/p&gt;

&lt;p&gt;La recomendación es utilizar sitios web estáticos con las viejas confiables tecnologías de HTML y CSS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usa un generador de sitios estáticos
&lt;/h3&gt;

&lt;p&gt;Lo ideal es usar uno elaborado con la tecnología que más te guste, hay diversas opciones y para todos los gustos.&lt;/p&gt;

&lt;p&gt;Acá una selección pequeña&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/geolessel" rel="noopener noreferrer"&gt;
        geolessel
      &lt;/a&gt; / &lt;a href="https://github.com/geolessel/vox" rel="noopener noreferrer"&gt;
        vox
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The static site builder for Elixir lovers
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Vox&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;The static site generator for Elixir lovers.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;There is a new site generator that is the quickest way to get started
In order to use it, run&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;mix archive.install hex vox_new
mix vox.new blog&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This will generate a simple scaffolded site that you can customize and tweak as you see fit.&lt;/p&gt;
&lt;p&gt;There is also an example blog built with Vox that attempts to take advantage of all the features of Vox as they are built.
You can look at the source code for that (and clone it and build it yourself) at &lt;a href="https://github.com/geolessel/vox-example" rel="noopener noreferrer"&gt;geolessel/vox-example&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;code&gt;vox.new&lt;/code&gt; options&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--esbuild&lt;/code&gt; - include a simple esbuild installation for asset compilation&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Manual installation&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The package can be installed by adding &lt;code&gt;vox&lt;/code&gt; to your list of dependencies in &lt;code&gt;mix.exs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For now, it is recommended to install directly from GitHub.
&lt;strong&gt;Note that the &lt;code&gt;mix vox.new&lt;/code&gt; generator will generate the &lt;code&gt;"~&amp;gt; 0.1.0"&lt;/code&gt; version instead.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-elixir notranslate position-relative overflow-auto js-code-highlight"&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/geolessel/vox" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gohugoio" rel="noopener noreferrer"&gt;
        gohugoio
      &lt;/a&gt; / &lt;a href="https://github.com/gohugoio/hugo" rel="noopener noreferrer"&gt;
        hugo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The world’s fastest framework for building websites.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://gohugo.io/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fgohugoio%2FgohugoioTheme%2Fmaster%2Fstatic%2Fimages%2Fhugo-logo-wide.svg%3Fsanitize%3Dtrue" alt="Hugo" width="565"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A fast and flexible static site generator built with love by &lt;a href="https://github.com/bep" rel="noopener noreferrer"&gt;bep&lt;/a&gt;, &lt;a href="https://github.com/spf13" rel="noopener noreferrer"&gt;spf13&lt;/a&gt;, and &lt;a href="https://github.com/gohugoio/hugo/graphs/contributors" rel="noopener noreferrer"&gt;friends&lt;/a&gt; in &lt;a href="https://go.dev/" rel="nofollow noopener noreferrer"&gt;Go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://godoc.org/github.com/gohugoio/hugo" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/03dd00acbb64c0ef8add699ba995726c27a9a082d7415961f7038e18fdbdc76b/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f676f6875676f696f2f6875676f3f7374617475732e737667" alt="GoDoc"&gt;&lt;/a&gt;
&lt;a href="https://github.com/gohugoio/hugo/actions?query=workflow%3ATest" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/gohugoio/hugo/workflows/Test/badge.svg" alt="Tests on Linux, MacOS and Windows"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/gohugoio/hugo" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3ea8f7fda959c8402013a916aa669b388b49411c580044441bc8dea29ddae058/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f676f6875676f696f2f6875676f" alt="Go Report Card"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gohugo.io" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt; | &lt;a href="https://gohugo.io/installation" rel="nofollow noopener noreferrer"&gt;Installation&lt;/a&gt; | &lt;a href="https://gohugo.io/documentation" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt; | &lt;a href="https://discourse.gohugo.io" rel="nofollow noopener noreferrer"&gt;Support&lt;/a&gt; | &lt;a href="https://github.com/gohugoio/hugo/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt; | &lt;a href="https://fosstodon.org/@gohugoio" rel="nofollow noopener noreferrer"&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Hugo is a &lt;a href="https://en.wikipedia.org/wiki/Static_site_generator" rel="nofollow noopener noreferrer"&gt;static site generator&lt;/a&gt; written in &lt;a href="https://go.dev/" rel="nofollow noopener noreferrer"&gt;Go&lt;/a&gt;, optimized for speed and designed for flexibility. With its advanced templating system and fast asset pipelines, Hugo renders a complete site in seconds, often less.&lt;/p&gt;
&lt;p&gt;Due to its flexible framework, multilingual support, and powerful taxonomy system, Hugo is widely used to create:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Corporate, government, nonprofit, education, news, event, and project sites&lt;/li&gt;
&lt;li&gt;Documentation sites&lt;/li&gt;
&lt;li&gt;Image portfolios&lt;/li&gt;
&lt;li&gt;Landing pages&lt;/li&gt;
&lt;li&gt;Business, professional, and personal blogs&lt;/li&gt;
&lt;li&gt;Resumes and CVs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use Hugo's embedded web server during development to instantly see changes to content, structure, behavior, and presentation. Then deploy the site to your host, or push changes to your Git provider for automated builds and deployment.&lt;/p&gt;
&lt;p&gt;Hugo's fast asset pipelines include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image processing…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gohugoio/hugo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/11ty" rel="noopener noreferrer"&gt;
        11ty
      &lt;/a&gt; / &lt;a href="https://github.com/11ty/eleventy" rel="noopener noreferrer"&gt;
        eleventy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A simpler site generator. Transforms a directory of templates (of varying types) into HTML.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/263fe07506cd323c270b362900bfe436151c6e38b6fedb8dc86b0de086912fdf/68747470733a2f2f7777772e313174792e6465762f696d672f6c6f676f2d6769746875622e737667"&gt;&lt;img src="https://camo.githubusercontent.com/263fe07506cd323c270b362900bfe436151c6e38b6fedb8dc86b0de086912fdf/68747470733a2f2f7777772e313174792e6465762f696d672f6c6f676f2d6769746875622e737667" width="200" height="200" alt="eleventy Logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;eleventy 🕚⚡️🎈🐀&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A simpler static site generator. An alternative to Jekyll. Written in JavaScript. Transforms a directory of templates (of varying types) into HTML.&lt;/p&gt;
&lt;p&gt;Works with HTML, Markdown, JavaScript, Liquid, Nunjucks, with addons for WebC, Sass, Vue, Svelte, TypeScript, JSX, and many others!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;➡ &lt;a href="https://www.11ty.dev/docs/" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;
&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Star &lt;a href="https://github.com/11ty/eleventy/" rel="noopener noreferrer"&gt;this repo on GitHub&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;Follow us &lt;a href="https://neighborhood.11ty.dev/@11ty" rel="nofollow noopener noreferrer"&gt;on Mastodon &lt;code&gt;@11ty@neighborhood.11ty.dev&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow us &lt;a href="https://bsky.app/profile/11ty.dev" rel="nofollow noopener noreferrer"&gt;on Bluesky &lt;code&gt;@11ty.dev&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://www.npmjs.com/org/11ty" rel="nofollow noopener noreferrer"&gt;from npm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="https://github.com/11ty" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Watch us &lt;a href="https://www.youtube.com/c/EleventyVideo" rel="nofollow noopener noreferrer"&gt;on YouTube&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chat on &lt;a href="https://www.11ty.dev/blog/discord/" rel="nofollow noopener noreferrer"&gt;Discord&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Latest: &lt;a href="https://www.npmjs.com/package/@11ty/eleventy" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/99f4f7e8b963ac6214bc1b5988aab24b0d4e4cc7a14a30f64535f4c77dd3d92f/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f40313174792f656c6576656e74792e7376673f7374796c653d666f722d7468652d6261646765" alt="npm Version"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm install @11ty/eleventy --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Read our &lt;a href="https://www.11ty.dev/docs/getting-started/" rel="nofollow noopener noreferrer"&gt;Getting Started guide&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tests&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We have a few test suites, for various reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/avajs/ava" rel="noopener noreferrer"&gt;ava JavaScript test runner&lt;/a&gt; (&lt;a href="https://github.com/avajs/ava/blob/main/docs/03-assertions.md" rel="noopener noreferrer"&gt;assertions docs&lt;/a&gt;) (primary test suite in &lt;code&gt;test/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/api/test.html" rel="nofollow noopener noreferrer"&gt;Node.js Test runner&lt;/a&gt; (secondary test suite in &lt;code&gt;test_node/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vitest.dev/guide/browser/" rel="nofollow noopener noreferrer"&gt;Vitest (in Browser Mode)&lt;/a&gt; (client tests in &lt;code&gt;packages/client/test/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/11ty/eleventy-benchmark" rel="noopener noreferrer"&gt;Benchmark for Performance Regressions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These run in various environments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/11ty/eleventy/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;Continuous Integration on GitHub Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/11ty/eleventy/blob/master/docs/coverage.md" rel="noopener noreferrer"&gt;Code Coverage Statistics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Community Roadmap&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/11ty/eleventy/discussions/categories/enhancement-queue?discussions_q=is%3Aopen+category%3A%22Enhancement+Queue%22+sort%3Atop" rel="noopener noreferrer"&gt;Top&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/11ty/eleventy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Crea tu propio generador de contenidos
&lt;/h3&gt;

&lt;p&gt;Es una buena forma de practicar un lenguaje o tecnología, un proyecto pequeño que se adapte a tus necesidades. Aunque esta opción es solamente para quien desee dedicar mucho tiempo en detalles que ya están solucionados por los generadores disponibles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compra tu Dominio y Hosting
&lt;/h2&gt;

&lt;p&gt;Lo ideal es tener un dominio y hosting propio. Puedes empezar con el hosting de Github Pages para empezar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proveedores de Dominio
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nic.cl" rel="noopener noreferrer"&gt;https://nic.cl&lt;/a&gt; : Dominios de Chile&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dyndns.com" rel="noopener noreferrer"&gt;https://dyndns.com&lt;/a&gt; : Dominios para Ips&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.dynadot.com" rel="noopener noreferrer"&gt;https://www.dynadot.com&lt;/a&gt; : Dominios Internacionales&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://porkbun.com/:" rel="noopener noreferrer"&gt;https://porkbun.com/:&lt;/a&gt; Otro proveedor de dominios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Proveedores de Hosting
&lt;/h3&gt;

&lt;p&gt;Dependiendo de tus necesidades puedes tener algo propio en una Raspberry PI, o adquirir un hosting. La siguiente es una lista no ordenada de distintas opciones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cpanelhost.cl/:" rel="noopener noreferrer"&gt;https://cpanelhost.cl/:&lt;/a&gt; Hosting Chileno Barato&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.silverhost.cl/:" rel="noopener noreferrer"&gt;https://www.silverhost.cl/:&lt;/a&gt; Hosting Chileno Mediano&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pages.cloudflare.com/" rel="noopener noreferrer"&gt;https://pages.cloudflare.com/&lt;/a&gt; : Hosting de Páginas Estáticas&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;https://pages.github.com/&lt;/a&gt; :  Hosting de Páginas Estáticas&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codeberg.page/" rel="noopener noreferrer"&gt;https://codeberg.page/&lt;/a&gt; : Hosting de Páginas Estáticas&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://neocities.org/" rel="noopener noreferrer"&gt;https://neocities.org/&lt;/a&gt; :  Hosting de Páginas Estáticas&lt;/li&gt;
&lt;li&gt;Servidor Propio (Raspberry PI)&lt;/li&gt;
&lt;li&gt;Servidores VPS (DigitalOcean, Vultr, etc)&lt;/li&gt;
&lt;li&gt;Servidores de Aplicaciones (Fly.io, Vercel)&lt;/li&gt;
&lt;li&gt;Servidores de Nube (AWS, Azure, GCP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://unsplash.com/es/fotos/monitor-showing-java-programming-OqtafYT5kTw?utm_content=creditShareLink&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Foto de Ilya Pavlov en Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cv</category>
      <category>spanish</category>
      <category>chile</category>
      <category>beginners</category>
    </item>
    <item>
      <title>¿Me conviene un Bootcamp Tecnológico?</title>
      <dc:creator>Camilo</dc:creator>
      <pubDate>Thu, 28 Mar 2024 12:30:00 +0000</pubDate>
      <link>https://dev.to/javascriptchile/me-conviene-un-bootcamp-tecnologico-4405</link>
      <guid>https://dev.to/javascriptchile/me-conviene-un-bootcamp-tecnologico-4405</guid>
      <description>&lt;p&gt;Los Bootcamps son escuelas donde te enseñan un conjunto de herramientas con el objetivo de mejorar tus habilidades y hacer más expedito tu proceso laboral en la industria de las tecnologías de información (I.T). Una pregunta habitual es ¿Me conviene un Bootcamp?. Debido a las diversas opciones, este pequeño artículo te podría ayudar a determinar si un Bootcamp es algo que quieras experimentar.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuál es tu perfil?
&lt;/h2&gt;

&lt;p&gt;Lo primero en determinar es cuál es el perfil que tienes.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Beginner
&lt;/h3&gt;

&lt;p&gt;Sin experiencia ni conocimientos previos. Vienes de otra industria o nunca has realizado ningún proyecto de informática.&lt;/p&gt;

&lt;p&gt;Un Bootcamp te podría ayudar a definir tu camino y asesorarte en las tecnologías que puedes aprender. Además de presentarte un pequeño conjunto de proyectos que puedes hacer. &lt;/p&gt;

&lt;p&gt;Sin embargo evalúa primero estudiar un curso específico (gratuito o de pago) de alguna tecnología para que puedas tantear el terreno antes de una inversión de tiempo y dinero significativa.&lt;/p&gt;

&lt;p&gt;Personalmente recomendaría algún curso estatal de bajo coste como &lt;a href="https://talentodigitalparachile.cl/" rel="noopener noreferrer"&gt;Talento Digital&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Recordar que los Bootcamps no son obligatorios para entrar en la industria o aprender las tecnologías.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Intermediate
&lt;/h3&gt;

&lt;p&gt;Haz hecho algunos proyectos (sin usar tutoriales) pero tienes muy poca experiencia profesional en la industria.&lt;/p&gt;

&lt;p&gt;Solo ingresa a un Bootcamp si realmente sientes que te dará un apoyo y valor relevante. &lt;/p&gt;

&lt;p&gt;Si ya tienes algo de conocimientos, la recomendación es realizar proyectos en formato freelance o de apoyo a ONG para sacar filo y engrasar las herramientas.&lt;/p&gt;

&lt;p&gt;El tener pequeños proyectos para clientes te dará mayores incentivos para aprender las herramientas y volverte un experto.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Expert
&lt;/h3&gt;

&lt;p&gt;Haz estudiado una carrera de la industria o tienes experiencia laboral relevante en ella (más de dos años).&lt;/p&gt;

&lt;p&gt;La verdad que un Bootcamp no te servirá mucho. Te conviene más cursos específicos de alguna tecnología o práctica. Realizar proyectos por tu cuenta, aumentar las habilidades blandas y mejorar tus redes de contacto serán más provechosos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Tienes el Dinero?
&lt;/h2&gt;

&lt;p&gt;Un Bootcamp es una inversión grande de dinero y tiempo. Por ningún motivo te endeudes (con un banco) para estudiar en uno. Ir a un Bootcamp no te da garantías de encontrar un trabajo ni tampoco comenzar recibiendo sumas millonarias de sueldo. No es una bala de plata que te da las llaves para entrar en la industria, simplemente son escuelas de capacitación.&lt;/p&gt;

&lt;p&gt;La verdad yo recomendaría al menos dos años de estudio. Un Bootcamp ronda entre 6 a 12 meses.&lt;/p&gt;

&lt;p&gt;Si cuentas con los recursos para costear una carrera técnica, recomendaría ir a una universidad o instituto certificado antes que un Bootcamp.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuál es su prestigio?
&lt;/h2&gt;

&lt;p&gt;Muchas empresas en la actualidad tienen filtros sobre la calidad de los egresados de algunas instituciones. Procura que donde estudies tengan buena reputación en la industria y que sus egresados tengan buenas recomendaciones sobre la institución. El prestigio de donde estudiaste puede jugar a favor o en contra, sobre todo en los primeros años cuando no tienes mucha experiencia laboral que respalde tus capacidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Tienen redes de apoyo?
&lt;/h2&gt;

&lt;p&gt;Un Bootcamp debería ser capaz de ayudarte en conseguir tu primer trabajo en la industria. Ya sea dándote empresas y prácticas o por último la capacidad de tener entrevistas. Si no te dan eso, no son diferentes a un curso presencial u online de alguna &lt;a href="https://www.chileatiende.gob.cl/fichas/39693-organismos-tecnicos-de-capacitacion-otec" rel="noopener noreferrer"&gt;OTEC&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Además del conocimiento técnico un Bootcamp debería también darte asesoría en crear tu currículum y entrenar cómo hacer entrevistas laborales y redes de contacto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aprende los Fundamentos
&lt;/h2&gt;

&lt;p&gt;Muchos Bootcamps se enfocan en tecnologías populares como Javascript y Python. Pero recordar que las tecnologías son efímeras, la industria cambia tanto como la dirección del viento, por lo que es de mucha importancia que aprendas los fundamentos que te permitirán adaptarte a cualquier tecnología o industria.&lt;/p&gt;

&lt;p&gt;Yo personalmente recomiendo la tecnología &lt;a href="https://elixir-lang.org" rel="noopener noreferrer"&gt;Elixir&lt;/a&gt;, por su paradigma funcional, te permitirá salir de lo común y realizar proyectos en una amplia gama de contextos.&lt;/p&gt;

&lt;p&gt;Si bien esta tecnología no es tan conocida como Javascript y Python (aún), te puede servir mucho para aprender Algoritmos, Sistemas Web, Apps Móviles, Robótica, Machine Learning y muchos otros casos de uso.&lt;/p&gt;

&lt;p&gt;Sigue el &lt;a href="https://exercism.org/tracks/elixir/" rel="noopener noreferrer"&gt;Track de Elixir en Exercism&lt;/a&gt; para practicar ejercicios que te ayudarán a mejorar tus habilidades.&lt;/p&gt;

&lt;p&gt;Podrías comenzar con tecnologías como Pascal, C y Assembler para aprender los fundamentos, altamente recomendado. Pero la verdad yo estimo que &lt;em&gt;Elixir&lt;/em&gt; es una tecnología relevante y moderna, con un alto futuro y posibilidades de crecimiento. Personalmente lo veo como una apuesta segura.&lt;/p&gt;

&lt;p&gt;Nada quita que una vez sepas los fundamentos puedas ir por otras tecnologías como Javascript, tener varias herramientas bajo el brazo nos dará mayor chances de destacar y tener seguridad personal de que podemos tener éxito en la maravillosa industria I.T.&lt;/p&gt;

&lt;p&gt;Cover Foto por &lt;a href="https://unsplash.com/es/fotos/persona-usando-macbook-pro-en-white-table-uyfohHiTxho?utm_content=creditShareLink&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;ThisisEngineering RAEng en Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bootcamp</category>
      <category>chile</category>
      <category>beginners</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Construyendo un mapa para aprender sobre el Back-end</title>
      <dc:creator>Yorman Amaro</dc:creator>
      <pubDate>Wed, 28 Feb 2024 18:47:05 +0000</pubDate>
      <link>https://dev.to/javascriptchile/construyendo-un-mapa-para-aprender-sobre-el-back-end-1dee</link>
      <guid>https://dev.to/javascriptchile/construyendo-un-mapa-para-aprender-sobre-el-back-end-1dee</guid>
      <description>&lt;p&gt;Para los que estudiamos desarrollo de software y nos fuimos por el desarrollo FullStack, sabemos que llegara ese momento donde tendremos que tomar una decisión ya sea por voluntad propia o simplemente porque nos lo exigen en nuestro trabajo o proyecto, y es me voy por el lado del Front-end o del Back-end.&lt;/p&gt;

&lt;p&gt;Independientemente del camino que elijas, debes ser consciente de que cada lado será tan apasionante como complejo y es que el mundo de tecnologías que existen tanto en una como en la otra es tan diversa y amplia, que hay que tomarlo con calma y con una ruta bien definida.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xcfqdyfe1yzrhxlu1l0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xcfqdyfe1yzrhxlu1l0.png" alt="Image description" width="603" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Es por eso, que en este artículo lo que vamos a hacer es hablarte de forma amplia sobre el mundo del Backend, y que es lo que debes saber  de esta rama del desarrollo de aplicaciones y, teniendo esto claro, puedas encauzar tu camino como un perfecto back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es el Back-end:
&lt;/h2&gt;

&lt;p&gt;Esto es lo primero que lógicamente deberíamos saber para poder iniciar en esta rama, al menos saber para qué nos va a servir en nuestra aplicación tener un back-end.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea4tif1uhq9tg022zno0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea4tif1uhq9tg022zno0.png" alt="Image description" width="700" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De una forma simple, el back-end es la parte de toda aplicación que funciona del lado del servidor o también la podemos explicar como la parte que comunica los datos con los clientes; estos clientes pueden ser tanto internos como externos dentro de la misma empresa o clientes fuera de esta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las API:
&lt;/h2&gt;

&lt;p&gt;Imagínate básicamente un puente, que es lo que hace un puente, comunica un lado con el otro; esto es lo que hace una API en nuestras aplicaciones, va a hacer el puente de comunicación para intercambiar información entre las peticiones de los clientes y nuestros datos en el servidor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jiby38xin2r9afunja6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jiby38xin2r9afunja6.png" alt="Image description" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Debemos destacar, que este intercambio de información puede ser tanto del cliente hacia la API como de la API hacia el cliente, y esto va a depender del tipo de API que estemos manejando, lo que debemos saber es que una API puede ser sincrónica o asíncrona.&lt;/p&gt;

&lt;p&gt;Sincrónica implica que el cliente espera una respuesta inmediata del servidor, mientras que la comunicación asíncrona implica que el cliente no espera una respuesta inmediata, sino que puede recibir una notificación posteriormente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protocolos de comunicación:
&lt;/h2&gt;

&lt;p&gt;Estos protocolos van a definir cómo se establece la conexión, cómo se transmiten los datos y cómo se verifica la integridad de esos datos; son como los lineamientos de cómo se van a manejar los datos en la aplicación. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ei786c9xkhos2meebo2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ei786c9xkhos2meebo2.png" alt="Image description" width="592" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estos protocolos van a depender del tipo de aplicación, arquitectura, entre otras, que estemos construyendo estos protocolos son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;REST: Manejado por formatos como JSON.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SOAP: Manejado por formatos como XML.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GraphQL: Permitiendo consultas de una forma más flexible.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Base de datos:
&lt;/h2&gt;

&lt;p&gt;En un back-end también debemos construir las peticiones y la forma en que se van a enviar los datos, ese lenguaje se llama SQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejtzdv2zhwe2qay8phz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejtzdv2zhwe2qay8phz5.png" alt="Image description" width="587" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el mundo de los datos se manejan dos tipos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Relacionales: En estos encontramos a MySQL, PostgreSQL, MariaDB.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No Relacionales: En estos encontramos a MongoDB, Redis, Cassandra, Neo4J.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos por nombrar algunos dentro de muchos más.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estructura de datos y algoritmos:
&lt;/h2&gt;

&lt;p&gt;Aquí estamos hablando, de la forma en que guardamos la información en memoria, con el fin de que esta pueda ser mejor utilizada en las diferentes peticiones que se hagan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz917w6ctf7zhkrnmafdz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz917w6ctf7zhkrnmafdz.png" alt="Image description" width="597" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Las más usadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Arrays.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pilas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Colas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Listas enlazadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hashmaps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Árboles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Algoritmos:
&lt;/h2&gt;

&lt;p&gt;Esta es una parte importante en un proyecto back-end, ya que es la forma en que vamos a resolver el flujo de la información para hacerlo de la manera más eficiente, mejorando las respuestas de nuestro sistema o puente de comunicación. Estas las podemos evaluar mediante lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lh15hbus50u65t8jdjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0lh15hbus50u65t8jdjs.png" alt="Image description" width="510" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Complejidad Temporal: Se refiere al número de operaciones que realiza un algoritmo para hacer una tarea. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complejidad Espacial: Se refiere al espacio en memoria que utiliza un algoritmo para almacenar datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Notación Big O: Mide la complejidad algorítmica en términos de tiempo y espacio. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos conceptos son importantes tenerlos en cuenta al momento de desarrollar como back-end, así garantizamos las mejores prácticas y el mejor rendimiento de la app.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Framework y Librerías en el Backend:
&lt;/h2&gt;

&lt;p&gt;Estos 2 conceptos son muy utilizados en nuestros días y son los que nos van a ayudar a construir nuestras aplicaciones en el back-end; un framework incluye todas las herramientas que necesitas para desarrollar un proyecto completo y una librería solo aborda utilidades específicas, sin embargo, actualmente una librería puede llegar hacer muchas cosas, tanto como un framework.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6lj5dr6z8aqs2ztbsce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6lj5dr6z8aqs2ztbsce.png" alt="Image description" width="740" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estos son algunos lenguajes de programación con sus pares de librerías para el back-end:   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Node.js: Express.js - Nest.js.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python: Flask - Django - Fast API. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ruby: Ruby on Rails.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PHP: Laravel - Synfony.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Java: Spring.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C++ y #C: .NET&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go: Fiber.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elixir: Phoenix.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Objetos relacionales de mapeo (ORM) :
&lt;/h2&gt;

&lt;p&gt;Estos van a establecer una estructura ya desarrollada para obtener muestras de datos, es decir, nuestras peticiones a la base de datos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4pfqbyqo9m5rexu5rhi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4pfqbyqo9m5rexu5rhi.png" alt="Image description" width="491" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Menciono algunas con su referente lenguaje de programación:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;JavaScript: Mongoose - Sequelize - TypeORM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Java: Hibernate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PHP: Doctrine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.NET: Dapper.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python: Django (esta librería ya incorpora un ORM).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como podemos ver, en el back-end existe un universo de conceptos y herramientas con las cuales podemos construir ese puente de comunicación entre los datos y los clientes y que nos van a permitir hacer aplicaciones más eficientes; todo va a depender del tipo de arquitectura que estemos construyendo y  con el lenguaje de programación con que lo estemos haciendo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62nle4v417dxbuqsk8xq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62nle4v417dxbuqsk8xq.png" alt="Image description" width="227" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este fue un artículo a modo introductorio, ya que en los próximos continuaremos en el lado del back-end, pero desarrollando más en profundidad cada una de las partes mencionadas aquí.    &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La tecnología que utilizas no impresiona a nadie. La experiencia que creas con ella lo es todo. Sean Gerety &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nos vemos en un siguiente artículo. &lt;br&gt;
Un fuerte abrazo y saludos...&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>node</category>
      <category>database</category>
    </item>
  </channel>
</rss>
