<?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>Forem: Jean Karlo Obando Ramos</title>
    <description>The latest articles on Forem by Jean Karlo Obando Ramos (@boceto1).</description>
    <link>https://forem.com/boceto1</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%2Fuser%2Fprofile_image%2F108963%2F42cfd84f-9c1f-4a5c-9042-7f9ed1218ce7.jpeg</url>
      <title>Forem: Jean Karlo Obando Ramos</title>
      <link>https://forem.com/boceto1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/boceto1"/>
    <language>en</language>
    <item>
      <title>La IA no reemplazará a los desarrolladores de software</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Tue, 23 Sep 2025 03:49:00 +0000</pubDate>
      <link>https://forem.com/boceto1/la-ia-no-reemplazara-a-los-desarrolladores-de-software-13ed</link>
      <guid>https://forem.com/boceto1/la-ia-no-reemplazara-a-los-desarrolladores-de-software-13ed</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2025/go-hire-humans/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2025/go-hire-humans/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;Siempre existió un deseo de reemplazar a los desarrolladores&lt;/li&gt;
&lt;li&gt;¿Qué significa ser un desarrollador de Software?&lt;/li&gt;
&lt;li&gt;El paradigma de Jevons&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Introducción
&lt;/h2&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%2Fjh4vrmecuu0p4pdzj3ro.jpg" 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%2Fjh4vrmecuu0p4pdzj3ro.jpg" alt="Publicidad de Artisan en San Francisco" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los últimos avances en el desarrollo de la Inteligencia Artificial, especialmente en el campo de la IA generativa, han puesto al alcance de todos herramientas como ChatGPT, Claude, DeepSeek, entre otras, que han revolucionado completamente la manera en la que vemos al mundo y el rol del ser humano en él.&lt;/p&gt;

&lt;p&gt;En esa nueva visión existe una tendencia por construir productos y resolver problemas usando solamente Inteligencia Artificial. Lo que se ve reflejado, por ejemplo, en el mensaje provocador de la startup Artisan “Stop Hiring Humans”. &lt;/p&gt;

&lt;p&gt;La verdad es que gran cantidad de actividades, muchas de ellas creativas, parece que pueden ser ejecutadas a través de esta tecnología. Cada día es más común encontrarnos con posts, imágenes, videos, música e incluso series realizadas en su mayoría con estas herramientas y con poca intervención humana. Esto ha puesto sobre la mesa un debate interesante a la vez que alarmante para muchos. ¿Qué profesiones van a desaparecer con la “llegada” de la IA?&lt;/p&gt;

&lt;p&gt;Dentro del grupo de profesiones que se dice van a quedar obsoletas es la del “desarrollador de software”. Esto se evidencia en la cantidad de productos que prometen que personas no técnicas puedan escribir código y crear sistemas complejos sin tener conocimientos sobre lenguajes de programación o algún otro elemento relacionado con el software, un ejemplo de ello es el Vibe Coding. &lt;/p&gt;

&lt;p&gt;Andrej Karpathy resumió esta tendencia en X con el siguiente mensaje: “El Inglés es el nuevo lenguaje de programación popular”.&lt;/p&gt;

&lt;p&gt;Sin embargo, esta idea no es nueva y la intención de reemplazar a los desarrolladores siempre ha estado ahí. En este blog buscaré argumentar por qué creo que la IA no va a reemplazar a los desarrolladores de software, por el contrario, creará más demanda de profesionales en esta área.&lt;/p&gt;

&lt;h2&gt;
  
  
  Siempre existió un deseo de reemplazar a los desarrolladores
&lt;/h2&gt;

&lt;p&gt;En el año de 1959, cuando el uso de las computadoras estaba reservado a los complejos militares y centros de investigación, los lenguajes de programación predominantes eran Assembly o Fortran, lenguajes tan complejos que su uso estaba reservado a unos pocos.&lt;/p&gt;

&lt;p&gt;En ese contexto nace COBOL (COmmon Business-Oriented Language), un lenguaje de programación basado en el Inglés cuyo propósito era ofrecer un medio para que personas sin conocimiento en computadoras pudieran programarlas para resolver sus problemas, como los contadores o asesores financieros.&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%2Fkunu0mt8n3fwpxzvzh9y.jpg" 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%2Fkunu0mt8n3fwpxzvzh9y.jpg" alt="Open Library, COBOL (1986 edition)" width="393" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;COBOL significó para la época pasar de este código escrito en Assembly para sumar dos números&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;section .data&lt;/span&gt;
    &lt;span class="s"&gt;num1    db &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="s"&gt;num2    db &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;
    &lt;span class="s"&gt;result  db &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="s"&gt;msg     db "Resultado&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
    &lt;span class="s"&gt;msglen&lt;/span&gt;&lt;span class="nv"&gt;  &lt;/span&gt;&lt;span class="s"&gt;equ&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;msg&lt;/span&gt;
    &lt;span class="s"&gt;newline&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;db&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;

&lt;span class="s"&gt;section&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;.bss&lt;/span&gt;
    &lt;span class="s"&gt;buf&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;resb&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;20&lt;/span&gt;&lt;span class="nv"&gt;          &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;buffer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;amplio&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;para&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;número&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ASCII&lt;/span&gt;

&lt;span class="s"&gt;section&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;.text&lt;/span&gt;
    &lt;span class="s"&gt;global&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;_start&lt;/span&gt;

&lt;span class="s"&gt;_start:&lt;/span&gt;
    &lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;suma&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;al,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;[num1]&lt;/span&gt;
    &lt;span class="s"&gt;add&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;al,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;[num2]&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;[result],&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;al&lt;/span&gt;

    &lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;escribir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Resultado&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="nv"&gt;           &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sys_write&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdi,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="nv"&gt;           &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;stdout&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rsi,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;msg&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdx,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;msglen&lt;/span&gt;
    &lt;span class="s"&gt;syscall&lt;/span&gt;

    &lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;convertir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(byte)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;decimal&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;buf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;
    &lt;span class="s"&gt;movzx&lt;/span&gt;&lt;span class="nv"&gt;   &lt;/span&gt;&lt;span class="s"&gt;eax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;[result]&lt;/span&gt;&lt;span class="nv"&gt;   &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;número&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;EAX&lt;/span&gt;
    &lt;span class="s"&gt;lea&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdi,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;[buf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;20]&lt;/span&gt;&lt;span class="nv"&gt;      &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;puntero&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;al&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;final&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;ebx,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
    &lt;span class="s"&gt;cmp&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;eax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
    &lt;span class="s"&gt;jne&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;.conv&lt;/span&gt;
    &lt;span class="s"&gt;dec&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdi&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;[rdi],&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'0'&lt;/span&gt;
    &lt;span class="s"&gt;jmp&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;.done&lt;/span&gt;

&lt;span class="s"&gt;.conv:&lt;/span&gt;
    &lt;span class="s"&gt;.loop:&lt;/span&gt;
        &lt;span class="s"&gt;xor&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;edx,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;edx&lt;/span&gt;
        &lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;ebx&lt;/span&gt;&lt;span class="nv"&gt;              &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;eax&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;eax/10,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;edx&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;resto&lt;/span&gt;
        &lt;span class="s"&gt;add&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;dl,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'0'&lt;/span&gt;
        &lt;span class="s"&gt;dec&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdi&lt;/span&gt;
        &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;[rdi],&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dl&lt;/span&gt;
        &lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="nv"&gt;    &lt;/span&gt;&lt;span class="s"&gt;eax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;eax&lt;/span&gt;
        &lt;span class="s"&gt;jnz&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;.loop&lt;/span&gt;

&lt;span class="s"&gt;.done:&lt;/span&gt;
    &lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;longitud&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(buf+20)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rdi&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;buf&lt;/span&gt;
    &lt;span class="s"&gt;add&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;20&lt;/span&gt;
    &lt;span class="s"&gt;sub&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rdi&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdx,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rax&lt;/span&gt;&lt;span class="nv"&gt;            &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rdx&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;longitud&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rsi,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rdi&lt;/span&gt;&lt;span class="nv"&gt;            &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rsi&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;inicio&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;del&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;número&lt;/span&gt;

    &lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;escribir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;número&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="nv"&gt;              &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sys_write&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdi,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="nv"&gt;              &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;stdout&lt;/span&gt;
    &lt;span class="s"&gt;syscall&lt;/span&gt;

    &lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;salto&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;línea&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdi,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rsi,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;newline&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdx,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
    &lt;span class="s"&gt;syscall&lt;/span&gt;

    &lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;salir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;
    &lt;span class="s"&gt;mov&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rax,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;&lt;span class="nv"&gt;             &lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sys_exit&lt;/span&gt;
    &lt;span class="s"&gt;xor&lt;/span&gt;&lt;span class="nv"&gt;     &lt;/span&gt;&lt;span class="s"&gt;rdi,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rdi&lt;/span&gt;
    &lt;span class="s"&gt;syscall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a este conjunto de sentencias más legibles&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="s"&gt;IDENTIFICATION DIVISION.&lt;/span&gt;
       &lt;span class="s"&gt;PROGRAM-ID. SUMA.&lt;/span&gt;
       &lt;span class="s"&gt;DATA DIVISION.&lt;/span&gt;
       &lt;span class="s"&gt;WORKING-STORAGE SECTION.&lt;/span&gt;
       &lt;span class="s"&gt;01 NUM1 PIC 9(2) VALUE 5.&lt;/span&gt;
       &lt;span class="s"&gt;01 NUM2 PIC 9(2) VALUE 7.&lt;/span&gt;
       &lt;span class="s"&gt;01 RESULT PIC 9(3).&lt;/span&gt;
       &lt;span class="s"&gt;PROCEDURE DIVISION.&lt;/span&gt;
           &lt;span class="s"&gt;ADD NUM1 TO NUM2 GIVING RESULT&lt;/span&gt;
           &lt;span class="s"&gt;DISPLAY "El resultado es&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;RESULT&lt;/span&gt;
           &lt;span class="s"&gt;STOP&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;RUN.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y esta fue la promesa que hizo COBOL al mundo. No necesitarías personas dedicadas solamente a escribir código, todos podrían hacerlo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❝En la reunión convocada en el Pentágono, a la que asistieron 41 personas, los participantes imaginaron un lenguaje de programación que hiciera uso de un tipo básico de inglés y que permitiera a gerentes, programadores y analistas de sistemas comunicarse con cualquier computadora disponible.❞&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;FedTech Magazine, “How COBOL Became the Early Backbone of Federal Computing”&lt;/em&gt; (2017)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pero este propósito no se cumplió. La complejidad que representaba crear sistemas financieros, de pago de nómina o seguros generó una demanda de expertos no solamente en COBOL sino en traducir reglas de negocio en sistemas informáticos eficientes, que puedan operar a través del tiempo. &lt;/p&gt;

&lt;p&gt;De hecho, esta demanda generó que la programación dejara de ser una habilidad más dentro de otras profesiones como las matemáticas o la ingeniería electrónica y se convirtiera en una nueva área como tal: la Ingeniería de Software, en 1968.&lt;/p&gt;

&lt;p&gt;De ahí en adelante siempre ha existido la necesidad de que la construcción del software no esté delegada a un grupo de profesionales sino que este al alcance de todos. Esto ha ido desde los 4GL, pasando por CASE Tools o la programación visual, y en los últimos años herramientas de low code, vibe coding e IA generativa.&lt;/p&gt;

&lt;p&gt;Que el “Inglés” sea el lenguaje de programación más popular no es una idea nueva de &lt;strong&gt;Andrej Karpathy,&lt;/strong&gt; ha sido la misión de la industria desde su creación: construir sistemas simplemente usando lenguaje natural.&lt;/p&gt;

&lt;p&gt;Pero así logremos construir un sistema 100% en lenguaje natural, eso no va a eliminar la necesidad de ingenieros o desarrolladores de software, porque su función no está en escribir código, su función va más allá.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué significa ser un desarrollador de Software?
&lt;/h2&gt;

&lt;p&gt;Siempre me llamó la atención ver cómo algunos de mis compañeros de la universidad pasaban horas antes de una prueba de programación estudiando el código, memorizándolo. Eso para mí, nunca tuvo ningún sentido, era poco probable que el ejercicio visto en clase fuera el mismo de la prueba. Los exámenes requerían comprender cómo utilizar un conjunto de sentencias (if, else, for, do while) junto con estructuras de datos (arrays, maps, objects) para resolver un problema, sea el que sea.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❝Programas = Algoritmos + Estructuras de Datos.❞&lt;/p&gt;

&lt;p&gt;— Niklaus Wirth, &lt;em&gt;Algorithms + Data Structures = Programs&lt;/em&gt; (1976)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Con el paso del tiempo he ido comprendiendo también que no soy un desarrollador de Frontend o Backend, o que mi carrera no se define por si desarrollo en JavaScript o Python. He tenido la oportunidad de trabajar con diferentes herramientas y en diversos escenarios, que al final he comprendido lo que soy:  un desarrollador de Software. Pero, ¿qué significa eso para mí?&lt;/p&gt;

&lt;p&gt;Ser desarrollador de Software significa contar con un conjunto de habilidades y herramientas (principalmente mentales) que permiten resolver problemas de la vida real a través de sistemas informáticos. Mi trabajo no es escribir código, no es hacer una página web o una API. Mi trabajo es tomar una necesidad como la creación de una cuenta bancaria, con sus reglas y asociaciones e implementarla a través de un sistema.&lt;/p&gt;

&lt;p&gt;Pero para llegar a esa implementación es importante comprender el contexto sobre el cual se presenta esa necesidad, entender a las personas que van a utilizar el producto y aquellos que están interesados en crearlo. Además, conocer el conjunto de herramientas que ofrece el mercado para implementar este tipo de soluciones, profundizar en patrones y buenas prácticas, explorar frameworks, de tal manera que los sistemas no funcionen solamente en su lanzamiento, sino que vivan y evolucionen a través del tiempo de manera sustentable.&lt;/p&gt;

&lt;p&gt;Creo que esta idea la podría resumir en la siguiente cita:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❝Cualquiera puede escribir código que una computadora pueda entender. Los buenos programadores escriben código que los humanos puedan entender.❞&lt;/p&gt;

&lt;p&gt;— Martin Fowler, &lt;em&gt;Refactoring: Improving the Design of Existing Code&lt;/em&gt; (1999)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como dice Martin Fowler, cualquiera puede escribir código  que las máquinas entiendan, incluida la IA. Yo le puedo pedir a mi ChatGPT que genere código en Assembly para sumar dos números, cómo el que puse en la sección anterior (y funciona, pueden probarlo). Pero como se declaró en 1968, la ingeniería de software presenta otros retos como: el diseño de sistemas, la abstracción de reglas de negocio, la mantenibilidad, performance, la toma de decisiones en base a presupuestos, equipos y contextos. Ese es un trabajo creativo, ese es un trabajo humano.&lt;/p&gt;

&lt;h2&gt;
  
  
  El paradigma de Jevons
&lt;/h2&gt;

&lt;p&gt;En un capítulo del podcast “&lt;strong&gt;Software Architecture Hour with Neal Ford”&lt;/strong&gt; que tuvo como invitado a Kent Beck, co creador de Extreme Programming, se planteó esta pregunta: ¿la IA reemplazará a los desarrolladores? &lt;/p&gt;

&lt;p&gt;En ese espacio, que me inspiró para escribir este blog, Kent Beck explica el paradigma de Jevons que describo a continuación:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 Paradigma de Jevons&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cuando una innovación tecnológica aumenta la eficiencia con la que se utiliza un recurso, en lugar de reducir su consumo total, a menudo provoca un incremento en la demanda de ese recurso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si volvemos al año 1959, cuando nació COBOL, el principal reto era sumar dos números sin matar la memoria. Con COBOL logramos construir sistemas empresariales, el desarrollo de lenguajes de alto nivel como C++ o Java permitieron expandir el uso de las computadoras a la música o el cine, la creación de JavaScript permitió la evolución de la Web, y Python logró que el análisis de datos y el Machine Learning fuera una realidad. Sin cada uno de estos pasos que optimizaron la construcción de software, plataformas como Netflix o Twitch no serían ni siquiera imaginables. &lt;/p&gt;

&lt;p&gt;Kent Beck señala que la inclusión de la Inteligencia Artificial es un paso más en esa optimización. Problemas que antes nos tomaban 4 o 5 horas resolver ahora lo podemos hacer en cuestión de minutos con el apoyo de ChatGPT, Claude o Copilot. &lt;/p&gt;

&lt;p&gt;¿Eso significa que vamos a requerir de menos programadores? La respuesta es no, eso significa que van a existir nuevos casos de uso para la programación, nuevos problemas a resolver que todavía no imaginamos y por ende la necesidad de desarrolladores e ingenieros de software no solo se mantendrá, sino que aumentará.&lt;/p&gt;

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

&lt;p&gt;La promesa de que la IA va a reemplazar a los desarrolladores de software no es verdadera, ni tampoco nueva. El desarrollo de software va más allá de la creación de código, requiere usar un conjunto de herramientas para resolver problemas y atender necesidades de los usuarios. El llegar a definir esa solución y llevarla a cabo es un tarea humana.&lt;/p&gt;

&lt;p&gt;Eso no significa que como desarrolladores o ingenieros nos debemos relajar. Esta nueva era exige de nosotros mayor preparación y estudio. Si la IA me permite resolver un problema de días en horas ¿qué haremos con el tiempo restante? Esa pregunta es clave y quienes aprovechen mejor su tiempo son los que menos riesgo tendrán de dejar de ser relevantes, pero eso es tema para otro post.&lt;/p&gt;

&lt;p&gt;Por ahora me gustaría cerrar modificando el mensaje de Artisan: Ve y contrata humanos, su era no ha terminado.&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%2Fdocp2n2in5bz1zrutv39.jpg" 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%2Fdocp2n2in5bz1zrutv39.jpg" alt="Mensaje de Artisan modificado" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Karpathy, A. [@karpathy]. (2023, enero 25). &lt;em&gt;The hottest new programming language is English&lt;/em&gt; [Tweet]. X. &lt;a href="https://x.com/karpathy/status/1617979122625712128" rel="noopener noreferrer"&gt;https://x.com/karpathy/status/1617979122625712128&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Guardian. (2025, marzo 16). &lt;em&gt;AI coding threatens programmers’ jobs but experts say human expertise still crucial&lt;/em&gt;. The Guardian. &lt;a href="https://www.theguardian.com/technology/2025/mar/16/ai-software-coding-programmer-expertise-jobs-threat" rel="noopener noreferrer"&gt;https://www.theguardian.com/technology/2025/mar/16/ai-software-coding-programmer-expertise-jobs-threat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;FedTech Magazine. (2017, septiembre 18). &lt;em&gt;How COBOL became the early backbone of federal computing&lt;/em&gt;. FedTech. &lt;a href="https://fedtechmagazine.com/article/2017/09/how-cobol-became-early-backbone-federal-computing?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://fedtechmagazine.com/article/2017/09/how-cobol-became-early-backbone-federal-computing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;IsThisIt.nz. (2022, diciembre 20). &lt;em&gt;1968 NATO Software Engineering Conference&lt;/em&gt; [Blog post]. &lt;a href="https://isthisit.nz/posts/2022/1968-nato-software-engineering-conference/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://isthisit.nz/posts/2022/1968-nato-software-engineering-conference/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Richards, M., &amp;amp; Ford, N. (2021). &lt;em&gt;Software architecture hour: Evolutionary architecture with Neal Ford and Mark Richards&lt;/em&gt; [Video]. O’Reilly Media. &lt;a href="https://learning.oreilly.com/videos/software-architecture-hour/0636920902454/0636920902454-video345197/" rel="noopener noreferrer"&gt;https://learning.oreilly.com/videos/software-architecture-hour/0636920902454/0636920902454-video345197/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ia</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Implementando software centrado en el negocio</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Sat, 13 Sep 2025 02:03:00 +0000</pubDate>
      <link>https://forem.com/boceto1/implementando-software-centrado-en-el-negocio-31l7</link>
      <guid>https://forem.com/boceto1/implementando-software-centrado-en-el-negocio-31l7</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2025/ddd-serie-part-4-implementing-bc/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2025/ddd-serie-part-4-implementing-bc/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;¿Qué tenemos que implementar?&lt;/li&gt;
&lt;li&gt;DDD en acción&lt;/li&gt;
&lt;li&gt;Screaming Architecture&lt;/li&gt;
&lt;li&gt;Conclusiones&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A lo largo de esta serie hemos comentado la importancia de construir software con el negocio en el centro. Para ello, nos hemos apoyado del acercamiento propuesto por Eric Evans en el 2003, Domain-Driven Design.&lt;/p&gt;

&lt;p&gt;Hemos hecho énfasis en la importancia del lenguaje y cómo delimitarlo dentro de un contexto es muy útil al momento de construir software. Por lo general, una organización (dominio) divide sus problemas en partes (subdominios) sobre los cuales se establecen un conjunto de términos, acciones y reglas que solo tienen sentido (y es bueno que así sea) en ese contexto. Finalmente, comentamos que estos elementos se delimitan según DDD en “Bounded Contexts”.&lt;/p&gt;

&lt;p&gt;En este blog, el último de esta serie, es momento de que el software escuche. Es por ello que nos vamos a adentrar en la implementación de la acción de negocio “Generar órdenes de envío”.&lt;/p&gt;

&lt;p&gt;Comencemos.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué tenemos que implementar?
&lt;/h2&gt;

&lt;p&gt;A partir del Bounded Context descrito en el &lt;a href="https://dev.to/boceto1/del-negocio-al-software-construyendo-un-bounded-context-en-ddd-4hhi"&gt;capítulo anterior&lt;/a&gt; (imagen 1), tenemos la siguiente información sobre la acción ‘Generar órdenes de envío’.&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%2Fxvzjx8ytivo4fsmoj5lz.jpg" 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%2Fxvzjx8ytivo4fsmoj5lz.jpg" title="Imagen 1: Bounded Context de Envíos (Shipments)" alt="Imagen 1: Bounded Context de Envíos (Shipments)" width="800" height="479"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 1. Bounded Context de Envíos (Shipments)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intervienen dos Bounded Context en la acción, Shipments (para envíos) y Orders (órdenes de pago). Este último desencadena el proceso.&lt;/li&gt;
&lt;li&gt;Tenemos a la mano una regla de negocio clara: &lt;em&gt;“una orden debe estar confirmada o pagada para poder generar una orden de envío”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Nuestra Entidad “Shipment” (Envío) debe tener un trackingID, una dirección válida, el estado inicial debe ser “creado” y se debe registrar la fecha de creación.&lt;/li&gt;
&lt;li&gt;La dirección es un Value Object porque no tiene un ID, pero sí reglas claras, como que solo se permiten envíos a Quito y Guayaquil en Ecuador.&lt;/li&gt;
&lt;li&gt;Finalmente, el resultado de la generación debe ser emitir un evento que será receptado por el mismo Bounded Context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con estos elementos ya tenemos todo lo necesario para empezar a programar.&lt;/p&gt;

&lt;h2&gt;
  
  
  DDD en acción
&lt;/h2&gt;

&lt;p&gt;Para el propósito de este blog no nos vamos a detener en la configuración del proyecto. Ustedes pueden descargarlo en el siguiente &lt;a href="https://github.com/boceto1/compra-ya-demo-ddd" rel="noopener noreferrer"&gt;repositorio de Github&lt;/a&gt; (no olvides dejar una estrella) e instalarlo siguiendo la descripción del README.&lt;/p&gt;

&lt;p&gt;Comencemos con la estructura, como se observa en la imagen 2, a nivel del repositorio se deja claro que por ahora vamos a trabajar con dos Bounded Context: Orders y Shipments. Siendo estos los únicos módulos que está importando el proyecto central.&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%2Fp0alstvop8s3qlpu5htk.jpg" 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%2Fp0alstvop8s3qlpu5htk.jpg" alt="Imagen 2: Estructura del Proyecto" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 2. Estructura del Proyecto&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ahora centrémonos en la estructura de Shipping. Para ello hemos decidido organizar el código aplicando “Clean Architecture” que es una metodología propuesta por Robert C. Martin y que aplica perfecto para DDD.&lt;/p&gt;

&lt;p&gt;Como se ve en la imagen 3, siguiendo esta metodología hemos dividido nuestra implementación de Shippings en 3 partes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application&lt;/strong&gt;: dónde van a vivir todas las acciones de negocio definidas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain&lt;/strong&gt;: dónde se definen las entidades y value objects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation&lt;/strong&gt;: dónde se implementan los mecanismos para que el exterior pueda interactuar con estas acciones de negocio. Estas pueden ser interfaces, controladores o eventos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clean Architecture plantea una capa más que es &lt;strong&gt;Infrastructure&lt;/strong&gt; dónde están todos los elementos externos cómo apis, bases de datos, cache; sin embargo al no utilizarlos todavía no los hemos definido.&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%2F54u020p0o364gh2r50od.jpg" 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%2F54u020p0o364gh2r50od.jpg" title="Imagen 3: Bounded Context Envíos con Clean Architecture" alt="Imagen 3: Bounded Context Envíos con Clean Architecture" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 3. Bounded Context Envíos con Clean Architecture&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Veamos cómo definimos nuestra acción “generar órdenes de envío” en nuestro caso de uso. Cómo se ve en la imagen 4, el caso de uso debe describir la acción tal cual la planteo el negocio. En nuestro caso evaluamos la regla sobre el estado de la orden asociada, validamos que la dirección sea válida, generamos la orden y notificamos. Si nos fijamos bien, aquí no debe haber referencias a frameworks o bases de datos, estamos ejecutando la lógica de negocio.&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%2Ffp352sz19cxiw9x6yfcq.jpg" 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%2Ffp352sz19cxiw9x6yfcq.jpg" title="Imagen 4: Caso de uso Generar orden de envío" alt="Imagen 4: Caso de uso Generar órden de envío" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 4. Caso de uso Generar orden de envío&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ahora bien, por que tenemos que crear una dirección y no simplemente pasamos los valores recibidos al constructor de la orden. La respuesta es que la dirección es un elemento que puede tener sus propias reglas. Ejemplo: las ciudades de envío solo pueden ser Quito o Guayaquil. Al encapsular esto en el Value Object como se ve en la imagen 5 no solamente agrupamos estas reglas en dirección, sino que si tenemos que implementar otra acción como por ejemplo “reubicar orden” no necesitamos volver a poner las reglas, estás viven en el value object. Ahí el valor.&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%2Ftrucviqz2ne3bk5l2lwg.jpg" 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%2Ftrucviqz2ne3bk5l2lwg.jpg" title="Imagen 5: Value Object Address" alt="Imagen 5: Value Object Address" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 5. Value Object Address&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nuestras entidades son el corazón de nuestro Bounded Context, dado que sobre ellas ejecutamos acciones de negocio. En la imagen 6 vemos como la Entidad garantiza que la creación correcta del objeto cumpla lo especificado por el negocio. Un detalle importante es que solo acepta un value object dirección como parámetro, ahí garantiza que la dirección sea válida. Sobre esta entidad se pueden extender otras acciones cómo “Asignar Transportista” o “Confirmar Entrega”&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%2Fx0j0251cpi18dn9o4jlw.jpg" 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%2Fx0j0251cpi18dn9o4jlw.jpg" title="Imagen 6: Entidad Shipment" alt="Imagen 6: Entidad Shipment" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 6. Entidad Shipment&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Finalmente, la capa de presentación es lugar dónde definimos cómo los sistemas externos pueden interactuar con nuestras acciones de negocio. Para nuestro caso habíamos definido que el evento “Orden Pagada”, desencadena la generación del envío y esto está en el código como se ven en la imagen 7.&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%2Fuotywg2jij3mbehpsw5e.jpg" 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%2Fuotywg2jij3mbehpsw5e.jpg" title="Imagen 7: Capa de Presentación" alt="Imagen 7: Capa de Presentación" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 7. Capa de Presentación&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Con todos estos elementos juntos podemos ya generar una primera versión de la acción “Generar ordenes de envío” que cumple con todos los requisitos de negocio. Cómo pueden ver en este proyecto no hemos topado nada de base de datos o implementación de librerías complejas. Nuestro foco ha estado 100% en implementar una funcionalidad de nuestro sub dominio.&lt;/p&gt;

&lt;p&gt;Veamos el resultado en la imagen 8.&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%2F6pvic7cw7j1pfku3ix8o.jpg" 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%2F6pvic7cw7j1pfku3ix8o.jpg" title="Imagen 8: Generación de orden de envío exitosa" alt="Imagen 8: Generación de orden de envío exitosa" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 8. Generación de orden de envío exitosa&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;También podemos ver el ejemplo de cuando una regla falla, por ejemplo el contar con un estado de orden asociada diferente a los permitidos o una dirección no válida como en la imagen 9 y 10&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%2Ffveqaaxbsicys9ptxt6w.jpg" 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%2Ffveqaaxbsicys9ptxt6w.jpg" title="Imagen 9: Error por estado de orden asociada no válida" alt="Imagen 9: Error por estado de orden asociada no válida" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 9. Error por estado de orden asociada no válida&lt;/em&gt;&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%2Fqh0v00hdbfstlb1cuhid.jpg" 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%2Fqh0v00hdbfstlb1cuhid.jpg" title="Imagen 10: Error por dirección no válida" alt="Imagen 10: Error por dirección no válida" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 10. Error por dirección no válida&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lo importante a recalcar de este ejercicio es que el código representa claramente lo expuesto por el negocio. Robert C. Martin a esto lo llamó Screaming Architecture. Veamos de qué trata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screaming Architecture
&lt;/h2&gt;

&lt;p&gt;En su libro Clean Architecture, Robert C. Martin,  plantea el siguiente ejemplo para describir cómo debe organizarse el software:&lt;/p&gt;

&lt;p&gt;¿Qué pasa cuando vemos el plano de una casa? Este va a mostrar que va a existir un cuarto, una cocina, un área de estudio y un jardín; cada lugar con las dimensiones y elementos necesarios para que cada espacio cumpla su función. Lo mismo pasa si tomamos el plano de una oficina, este tendrá una sala de reuniones, cubículos de trabajo, baños, etc. De tal manera que cualquier persona que vea estos diseños entiende que se trata de un plano de una casa o una oficina.&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%2Fk7ww6rrn9rr3ibe1dsr6.jpg" 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%2Fk7ww6rrn9rr3ibe1dsr6.jpg" title="Imagen 11: Ejemplo de plano de una casa" alt="Imagen 11: Ejemplo de plano de una casa" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen 11. Ejemplo de plano de una casa&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Robert C. Martin señala que lo mismo debe pasar con nuestros sistemas. Cualquier persona que los vea, aún así no entienda nada de código, debería saber solamente con la estructura del proyecto a qué se refiere el sistema. Este concepto lo denomina Screaming Architecture.&lt;/p&gt;

&lt;p&gt;Esto es importante, porque, cómo lo hemos comentado durante esta serie, existen muchas veces una desconexión entre el código y las necesidades del negocio, dando como resultado proyectos que a simple vista nos dicen mucho sobre el framework que utiliza pero muy poco sobre lo que hace el sistema.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;❝ Las arquitecturas de software son estructuras que soportan los casos de uso del sistema. ❞&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;— Robert C. Martin, &lt;em&gt;Clean Architecture&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aplicar DDD nos ayuda a cumplir este objetivo dado que el código está guiado por acciones de negocio y no por las herramientas tecnológicas vamos a usar. &lt;/p&gt;

&lt;p&gt;Como hemos visto en la construcción de nuestra acción “Generar órdenes de envío”, la distribución del código no está realizada por capas tecnológicas como el patrón Modelo-Vista-Controlador, no se ha definido que Base de Datos se va a usar, ni siquiera he comentado que framework de NodeJs estoy usando; nuestra conversación se ha centrado en implementar el caso de uso, lo otro puede venir después.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;❝ Una buena arquitectura de software permite aplazar y retrasar las decisiones sobre frameworks, bases de datos, servidores web y otras cuestiones y herramientas relacionadas con el entorno. ❞&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;— Robert C. Martin, &lt;em&gt;Clean Architecture&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En resumen, una buena arquitectura y su implementación deben hacer explícito el propósito del software y los conceptos que giran alrededor de él. Es ahí donde DDD nos da bases sólidas para construir soluciones centradas en el dominio.&lt;/p&gt;

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

&lt;p&gt;El software debe buscar siempre dar valor, es decir, debe tratar de que cada uno de los elementos implementados permita ejecutar acciones del negocio de la manera más eficiente y segura. Esto es fácil de tener en cuenta en proyectos pequeños, pero ya en sistemas complejos se vuelve un problema.&lt;/p&gt;

&lt;p&gt;Muchas veces ese problema es que los elementos del negocio se pierden dentro del código, entonces es muy fácil que el desarrollador comente qué base de datos usa pero no dónde se aplica una validación importante. Ese es un gran problema, la construcción del software se guía a través de la tecnología a usar y no del problema a resolver.&lt;/p&gt;

&lt;p&gt;A lo largo de esta serie hemos comentado cómo DDD nos permite afrontar esta situación a través de centrar nuestro diseño e implementación de software en el dominio, buscando para ello alinear el lenguaje y delimitarlos dentro de contextos.&lt;/p&gt;

&lt;p&gt;Este trabajo da como resultado la implementación de sistemas que representan las necesidades de la organización. En pocas palabras “El negocio habla, y el código escucha”&lt;/p&gt;

&lt;p&gt;Ahora la pregunta es para ustedes: ¿Cómo se ven sus sistemas? ¿Su código grita qué problema resuelve o representa más las tecnologías que usa?&lt;/p&gt;

&lt;p&gt;Gracias por acompañarme en esta serie sobre DDD, espero que haya servido como puerta de entrada a este tema y despertado en ustedes curiosidad. Los invito a seguir aprendiendo y puliendo este arte que es el software. &lt;/p&gt;

&lt;p&gt;Hasta la próxima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;p&gt;Martin, R. C. (2017). &lt;em&gt;Clean architecture: A craftsman’s guide to software structure and design&lt;/em&gt;. Addison-Wesley Professional. &lt;a href="https://learning.oreilly.com/library/view/clean-architecture-a/9780134494272/" rel="noopener noreferrer"&gt;https://learning.oreilly.com/library/view/clean-architecture-a/9780134494272/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Evans, E. (2003). &lt;em&gt;Domain-driven design: Tackling complexity in the heart of software&lt;/em&gt;. Addison-Wesley Professional. &lt;a href="https://learning.oreilly.com/library/view/domain-driven-design-tackling/0321125215/" rel="noopener noreferrer"&gt;https://learning.oreilly.com/library/view/domain-driven-design-tackling/0321125215/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pluralsight. (s.f.). &lt;em&gt;Clean architecture: Patterns, practices, and principles&lt;/em&gt;. Pluralsight. &lt;a href="https://www.pluralsight.com/courses/clean-architecture-patterns-practices-principles" rel="noopener noreferrer"&gt;https://app.pluralsight.com/library/courses/clean-architecture-patterns-practices-principles/table-of-contents&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pluralsight. (s.f.). &lt;em&gt;Fundamentals of domain-driven design&lt;/em&gt;. Pluralsight. &lt;a href="https://www.pluralsight.com/courses/fundamentals-domain-driven-design" rel="noopener noreferrer"&gt;https://app.pluralsight.com/library/courses/fundamentals-domain-driven-design/table-of-contents&lt;/a&gt;&lt;/p&gt;

</description>
      <category>domaindrivendesign</category>
      <category>architecture</category>
      <category>ubiquitouslanguage</category>
    </item>
    <item>
      <title>Del negocio al software: Construyendo un Bounded Context en DDD</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Tue, 02 Sep 2025 02:03:00 +0000</pubDate>
      <link>https://forem.com/boceto1/del-negocio-al-software-construyendo-un-bounded-context-en-ddd-4hhi</link>
      <guid>https://forem.com/boceto1/del-negocio-al-software-construyendo-un-bounded-context-en-ddd-4hhi</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2025/ddd-serie-part-3-modeling-bc/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2025/ddd-serie-part-3-modeling-bc/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;Guíate en las acciones&lt;/li&gt;
&lt;li&gt;Entidades, Value Objects e Invariants&lt;/li&gt;
&lt;li&gt;Modelando nuestro Bounded Context&lt;/li&gt;
&lt;li&gt;Conclusiones&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;El software se construye alrededor de un conjunto de términos, acciones y reglas definidos por el subdominio del negocio sobre el que opera. Es la correcta implementación de estos elementos los que da su valor. Sin embargo, muchas veces estos detalles se pierden en nuestra arquitectura debido a que se organizan con base a los elementos técnicos o simplemente no se organiza.&lt;/p&gt;

&lt;p&gt;Este es el principal objetivo de Domain-Driven Design, que el modelo de nuestro sistema y su implementación esté guiada siempre por el negocio. De esta manera podemos poner nuestro esfuerzo y enfoque en los elementos que dan valor.&lt;/p&gt;

&lt;p&gt;En los capítulos anteriores de esta serie comentamos acerca de la importancia del lenguaje y cómo es este el que nos permite poner límites claros a nuestros sistemas. Estos límites Eric Evans los define como Bounded Contexts.&lt;/p&gt;

&lt;p&gt;Las preguntas que me hago para este capítulo son: ¿Cómo se modelan estos elementos del negocio en un Bounded Context? ¿Cómo guían la implementación de nuestros sistemas?&lt;/p&gt;

&lt;h2&gt;
  
  
  Guíate en las acciones
&lt;/h2&gt;

&lt;p&gt;Retomemos el ejemplo visto en el capítulo anterior &lt;a href="https://dev.to/boceto1/bounded-contexts-delimitando-el-lenguaje-4mih"&gt;(link aquí)&lt;/a&gt; y trabajemos con el Bounded Context “Envíos” donde se definieron ciertas acciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generar órdenes de envío&lt;/li&gt;
&lt;li&gt;Asignar transportista&lt;/li&gt;
&lt;li&gt;Despachar envío&lt;/li&gt;
&lt;li&gt;Reprogramar entrega&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahora nuestro trabajo es implementar una de estas acciones y en ese proceso conocer más acerca de nuestro subdominio.&lt;/p&gt;

&lt;p&gt;Vamos a tomar “Generar órdenes de envío” como la primera acción de negocio a implementar. Simulemos una conversación con un PM con la ayuda de ChatGPT&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;## Ejemplo: Conversación con un PM para entender el proceso de "Generar una Orden de Envío"&lt;/span&gt;

&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*Dev&lt;/span&gt;&lt;span class="s"&gt;:** ¿Qué significa exactamente “generar una orden de envío”?&lt;/span&gt;  
&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*PM&lt;/span&gt;&lt;span class="s"&gt;:** Es crear la **instrucción formal** de que un pedido debe moverse del almacén al cliente.&lt;/span&gt;  
&lt;span class="s"&gt;En nuestro lenguaje de negocio lo llamamos **Orden de envío**. Es el registro oficial que inicia el proceso logístico.&lt;/span&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*Dev&lt;/span&gt;&lt;span class="s"&gt;:** ¿La instrucción formal es lo mismo que una orden de envío?&lt;/span&gt;  
&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*PM&lt;/span&gt;&lt;span class="s"&gt;:** Sí. “Instrucción formal” lo dije como explicación, pero el término correcto en nuestro *Lenguaje Ubicuo* es **Orden de envío**.&lt;/span&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*Dev&lt;/span&gt;&lt;span class="s"&gt;:** ¿Qué elementos tiene una Orden de envío?&lt;/span&gt;  
&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*PM&lt;/span&gt;&lt;span class="s"&gt;:**&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Tracking ID (identificador único)&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Pedido asociado&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Dirección de destino&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Estado actual&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Fecha de creación&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;(Opcional más adelante&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;transportista, condiciones especiales)&lt;/span&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*Dev&lt;/span&gt;&lt;span class="s"&gt;:** ¿Cuál sería la versión mínima para un MVP?&lt;/span&gt;  
&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*PM&lt;/span&gt;&lt;span class="s"&gt;:**&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Tracking ID único&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Pedido asociado confirmado/pagado&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Dirección de destino válida&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Estado inicial = “Creada”&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Fecha de creación&lt;/span&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*Dev&lt;/span&gt;&lt;span class="s"&gt;:** ¿Qué reglas se aplican al crear una Orden de envío?&lt;/span&gt;  
&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*PM&lt;/span&gt;&lt;span class="s"&gt;:**&lt;/span&gt;  
&lt;span class="s"&gt;1. El pedido debe estar confirmado/pagado.&lt;/span&gt;  
&lt;span class="s"&gt;2. La dirección debe ser válida.&lt;/span&gt;  
&lt;span class="s"&gt;3. El Tracking ID debe ser único.&lt;/span&gt;  
&lt;span class="s"&gt;4. El estado inicial siempre es “Creada”.&lt;/span&gt;  
&lt;span class="s"&gt;5. Se debe registrar la fecha de creación.&lt;/span&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*Dev&lt;/span&gt;&lt;span class="s"&gt;:** Entonces, para generar un envío necesito&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Confirmación de pago&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Generar un ID único&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Añadir dirección válida&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Estado inicial “Creada”&lt;/span&gt;  
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Fecha de creación&lt;/span&gt;  

&lt;span class="s"&gt;¿Me falta algo más?&lt;/span&gt;  

&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;*PM&lt;/span&gt;&lt;span class="s"&gt;:** Está perfecto. Lo único adicional que podrías incluir (si el negocio lo requiere) son **los datos de origen** del envío, pero con lo que tienes ya puedes empezar el proceso.&lt;/span&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;👀 &lt;strong&gt;TIP:&lt;/strong&gt; Este tipo de conversaciones deben ser el día a día de nuestro trabajo, especialmente si somos líderes técnicos o arquitectos. Si no las tenemos es muy probable que construyamos software a ciegas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La conversación con el PM nos da luces sobre cómo debemos implementar la acción “Generar orden de envío”. De ella podemos obtener la siguiente información:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El concepto sobre el cual gira la conversación parece ser la “Orden de Envío”&lt;/li&gt;
&lt;li&gt;Una orden de envío maneja un proceso, por ello tiene estados&lt;/li&gt;
&lt;li&gt;La dirección es otro elemento importante para generar órdenes de envío.&lt;/li&gt;
&lt;li&gt;Estas acciones parecen ser desencadenadas por otro Bounded Context, dado que hay un elemento no ligado directamente a “Envíos” llamado “Pedido” y su valor influye en sí se ejecuta o no nuestra acción.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos hallazgos son la materia prima del modelo que construiremos. &lt;/p&gt;

&lt;p&gt;Con estos elementos definidos es momento que el software comience a ser protagonista y ubiquemos estos elementos en un modelo que guíe la construcción de nuestro sistema. &lt;/p&gt;

&lt;h2&gt;
  
  
  Entidades, Value Objects e Invariants
&lt;/h2&gt;

&lt;p&gt;Hasta este momento he hecho mucho énfasis acerca de entender los conceptos, definiciones y reglas que están alrededor de nuestro subdominio. En este momento vamos a entender el motivo.&lt;/p&gt;

&lt;p&gt;Partiendo de nuestro ejemplo, “Envío” es uno de los elementos centrales del BC. Este elemento tiene algunas características:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Es un elemento identificable (tiene un ID)&lt;/li&gt;
&lt;li&gt;Tiene un conjunto de propiedades que lo definen: estado del envío, dirección, fecha de creación.&lt;/li&gt;
&lt;li&gt;Sobre este elemento se ejecutan acciones de negocio:

&lt;ul&gt;
&lt;li&gt;Crear orden de envío&lt;/li&gt;
&lt;li&gt;Actualizar estado&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Cuando un objeto tiene este conjunto de características DDD lo define como una &lt;strong&gt;Entidad.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Entidad:&lt;/strong&gt; Es un objeto que está definido principalmente por su identificador&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pero en nuestra conversación también salieron otros elementos como Dirección que presenta las siguientes características:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No tiene un identificador&lt;/li&gt;
&lt;li&gt;Es inmutable (&lt;em&gt;“Ejemplo: una Dirección siempre describe la misma calle y número aunque la consultemos varias veces”&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Describe “algo” dentro del sistema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para DDD, cuando un elemento reúne este conjunto de cualidades lo denomina &lt;strong&gt;Value Object.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Value Object:&lt;/strong&gt; Describe las características de un objeto pero no posee un identificador.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finalmente, en el proceso para crear una orden de envío se definen algunas reglas que se deben cumplir para ejecutar la acción, por ejemplo &lt;em&gt;“el pedido debe estar confirmado o pagado para crear la orden”.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Cuando nos encontramos con condiciones y reglas cuya evaluación siempre debe ser verdadera DDD las denomina &lt;strong&gt;Invariants&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Invariant:&lt;/strong&gt; Reglas que siempre deben ser verdaderas para que el sistema mantenga un estado consistente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eric Evans propone más elementos que iremos explorando con el tiempo, pero con estos tres ya tenemos suficiente para empezar.&lt;/p&gt;

&lt;p&gt;Con todos estos conceptos claros ¿qué tal si modelamos nuestro BC Envíos?&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelando nuestro Bounded Context
&lt;/h2&gt;

&lt;p&gt;La comunidad de DDD es muy activa y existe en especial una, como el &lt;a href="https://ddd-crew.github.io/" rel="noopener noreferrer"&gt;DDD-Crew&lt;/a&gt;, que provee un conjunto de recursos que nos ayudan a aterrizar estos conceptos en modelos gráficos. Te comparto el link para que los puedas explorar: &lt;a href="https://github.com/ddd-crew/ddd-starter-modelling-process" rel="noopener noreferrer"&gt;https://github.com/ddd-crew/ddd-starter-modelling-process&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;De este conjunto de elementos, en esta ocasión vamos a utilizar el relacionado con Bounded Context. DDD-Crew nos provee de una plantilla en donde podemos ubicar cada una de las ideas que discutimos en la sección anterior. La plantilla es la siguiente:&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%2F5uhhp2x0q8o4cg6rg1zp.jpg" 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%2F5uhhp2x0q8o4cg6rg1zp.jpg" title="Bounded Context Canvas v5 propuesto por DDD Crew" alt="Bounded Context Canvas v5 propuesto por DDD Crew" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como pueden ver en la imagen, en esta plantilla podemos formalizar el nombre de nuestro BC y su propósito. Categorizarlo como parte de un subdominio central, de soporte o genérico (ya veremos estas categorías a profundidad en un futuro post). Describir explícitamente las acciones de nuestro sistema, sus entidades y reglas. Finalmente, contamos con una sección para describir algún supuesto, métricas de cómo evaluar las acciones del BC y preguntas.&lt;/p&gt;

&lt;p&gt;Para nuestro ejemplo el resultado sería el siguiente:&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%2F6tzcdyije4owalydojuw.jpg" 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%2F6tzcdyije4owalydojuw.jpg" title="Bounded Context de Envíos (Shipments)" alt="Bounded Context de Envíos (Shipments)" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🗒️ &lt;strong&gt;Nota:&lt;/strong&gt; Algunos términos se encuentran en inglés en el modelo debido a que estos se transformaran en el nombre de las clases, funciones y eventos que se implementarán en el código, que por estándar se escribe en este idioma.*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cómo podemos ver, con este modelo tenemos una guía clara de qué hace nuestro BC Shipments por ahora, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Su propósito es la administración del envío de artículos, entonces es evidente para nosotros que cualquier acción o concepto que no encaje en ese propósito debe ubicarse en otro lado (Ejemplo: el pago de las órdenes)&lt;/li&gt;
&lt;li&gt;Se enfatiza en que “Envíos” es un subdominio de soporte para el dominio de E-commerce. Es decir, no es un factor diferenciador para nuestro negocio pero es necesario para que este opere.&lt;/li&gt;
&lt;li&gt;Está explícita la relación con el Bounded Context “Orders” y que el desencadenante para iniciar nuestra acción será el evento “OrderPaid”.&lt;/li&gt;
&lt;li&gt;Se definen las métricas de negocio sobre las cuales se van a evaluar las acciones ejecutadas en este sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un Bounded Context puede ser modelado de diferentes formas, pero esta herramienta de DDD-Crew en mi opinión permite servir como puente entre el negocio y desarrolladores dado que plantea un lenguaje común sobre el cual se van a dar las conversaciones sobre este subdominio. &lt;/p&gt;

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

&lt;p&gt;DDD nos invita a centrar nuestros esfuerzos en construir software guiado por el dominio. En un Bounded Context nosotros podemos describir formalmente ese conjunto de términos, reglas y acciones que guían al negocio en un modelo, convirtiéndose en una herramienta poderosa en pro de la construcción de soluciones que den valor a nuestra organización. &lt;/p&gt;

&lt;p&gt;En el siguiente capítulo, el final de nuestra serie, vamos a implementar este BC en código y comprender cómo este proceso nos ha permitido que el negocio hable y que el código escuche.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;p&gt;Evans, E. (2003). &lt;em&gt;Domain-driven design: Tackling complexity in the heart of software&lt;/em&gt;. Addison-Wesley Professional. &lt;a href="https://learning.oreilly.com/library/view/domain-driven-design-tackling/0321125215/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://learning.oreilly.com/library/view/domain-driven-design-tackling/0321125215/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pluralsight. (s. f.). Fundamentals of Domain-Driven Design. Pluralsight. &lt;a href="https://app.pluralsight.com/library/courses/fundamentals-domain-driven-design/table-of-contents" rel="noopener noreferrer"&gt;https://app.pluralsight.com/library/courses/fundamentals-domain-driven-design/table-of-contents&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DDD-Crew. (s. f.). &lt;em&gt;Bounded context canvas&lt;/em&gt;. GitHub. &lt;a href="https://github.com/ddd-crew/bounded-context-canvas?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;https://github.com/ddd-crew/bounded-context-canvas&lt;/a&gt;&lt;/p&gt;

</description>
      <category>domaindrivendesign</category>
      <category>architecture</category>
      <category>ubiquitouslanguage</category>
    </item>
    <item>
      <title>Bounded Contexts: Delimitando el lenguaje</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Sat, 30 Aug 2025 16:27:00 +0000</pubDate>
      <link>https://forem.com/boceto1/bounded-contexts-delimitando-el-lenguaje-4mih</link>
      <guid>https://forem.com/boceto1/bounded-contexts-delimitando-el-lenguaje-4mih</guid>
      <description>&lt;p&gt;&lt;em&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2025/ddd-serie-part-2-bounded-context/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2025/ddd-serie-part-2-bounded-context/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;Reconocer nuestro subdominio&lt;/li&gt;
&lt;li&gt;Bounded Context: delimitando el terreno&lt;/li&gt;
&lt;li&gt;Mismos nombres, diferentes significados&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;En el día a día, los sistemas son complejos. Es muy difícil, por no decir imposible, que una persona o grupo de personas pueda conocer todos los detalles de cómo funciona el software de una empresa. La pregunta es: ¿eso importa?&lt;/p&gt;

&lt;p&gt;Comenzamos esta serie haciendo énfasis en el lenguaje. Recalcamos que para construir soluciones centradas en el negocio y no en la tecnología era importante entender la razón de ser de nuestros sistemas. Pero me gustaría hacer un matiz: no es necesario que conozcamos el panorama completo a profundidad. Lo importante es identificar la parte del negocio en la que trabajamos, sus objetivos, términos, reglas y cómo se relaciona con otras partes del sistema.&lt;/p&gt;

&lt;p&gt;Es por esa razón que terminamos el capítulo anterior hablando acerca de delimitar el lenguaje. &lt;/p&gt;

&lt;p&gt;En esta ocasión vamos a centrarnos en eso. En identificar en qué parte del sistema estamos y cómo construir soluciones que funcionen en ese contexto.&lt;/p&gt;

&lt;p&gt;Comencemos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reconocer nuestro subdominio
&lt;/h2&gt;

&lt;p&gt;Pongamos atención a la siguiente imagen:&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%2Fzt14otkfwsemuya634jy.jpg" 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%2Fzt14otkfwsemuya634jy.jpg" alt="Ejemplo de anuncio empresa de E-commerce" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos a imaginarnos que trabajamos en una empresa donde uno de sus anuncios es similar al de la imagen anterior. ¿Qué servicios estamos ofertando?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compra por catálogo&lt;/li&gt;
&lt;li&gt;Pagos con tarjeta de crédito y PayPal&lt;/li&gt;
&lt;li&gt;Promociones y Descuentos&lt;/li&gt;
&lt;li&gt;Entrega a domicilio&lt;/li&gt;
&lt;li&gt;Seguimiento de envíos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este ejemplo es muy fácil identificar el &lt;strong&gt;dominio&lt;/strong&gt; de nuestro sistema, &lt;strong&gt;E-commerce&lt;/strong&gt;. Pero si lo analizamos a detalle, estos servicios abarcan áreas diferentes de la empresa y cada uno de ellos maneja un lenguaje diferente. Por ejemplo, en “Catálogos” pueden hablar de búsquedas, filtros, productos destacados; en “Entregas” necesitan hablar de direcciones, puntos de entrega, estados del envío; mientras que “Pagos” define términos como transferencias, moneda, impuestos, método de pago. Cada uno de ellos corresponde a un subdominio dentro del dominio de E-commerce.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;📖 Un subdominio es un área específica del dominio&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un subdominio se identifica por las conversaciones que existen alrededor de él y las expectativas que tiene la empresa sobre el grupo que trabaja en esta área. Por lo general, en esas conversaciones se definen acciones, reglas y términos que describen los problemas del día a día. Y es precisamente cuando agrupamos este conjunto de elementos del negocio que tenemos las herramientas para establecer esos límites en nuestros sistemas. Esto permite que nuestras soluciones estén enmarcadas dentro de contextos delimitados o Bounded Contexts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bounded Context: delimitando el terreno
&lt;/h2&gt;

&lt;p&gt;Tomemos del ejemplo anterior los servicios seguimiento de envíos y entrega a domicilio, los vamos a encapsular dentro del subdominio &lt;strong&gt;“Envíos”.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si nos centramos solo en este subdominio podemos identificar, de las conversaciones con los expertos del dominio (Product Owners, Gerentes, Consultores), ciertas acciones que se realizan en esta área:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generar órdenes de envío&lt;/li&gt;
&lt;li&gt;Asignar transportista&lt;/li&gt;
&lt;li&gt;Despachar envío&lt;/li&gt;
&lt;li&gt;Confirmar entrega&lt;/li&gt;
&lt;li&gt;Reprogramar entrega&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Además, si te fijas con atención también percibes que se definen algunas reglas sobre estas acciones, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un transportista no puede tener más de 10 órdenes de envío al día&lt;/li&gt;
&lt;li&gt;Se requiere la firma del ordenante para confirmar la entrega&lt;/li&gt;
&lt;li&gt;Solo se puede reprogramar una entrega 3 días antes de la fecha de entrega&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con estos elementos tú puedes comenzar a definir un conjunto de términos comunes que pueden alinear la comunicación y la aplicación de estas acciones con sus reglas en el sistema, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orden de envío:&lt;/strong&gt; Instrucción formal para trasladar un pedido desde el almacén hasta la dirección del cliente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transportista:&lt;/strong&gt; Persona o empresa responsable de trasladar el paquete (puede ser interno o un proveedor externo).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guía / Tracking:&lt;/strong&gt; Código único que identifica y permite rastrear un envío en todo su recorrido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos elementos de negocio, que definen un área específica, son lo que en DDD se conocen como “Bounded Contexts”. Eric Evans lo define así:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;📖 Un Bounded Context es una parte definida del software donde ciertos términos, definiciones y reglas se aplican de manera consistente&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sin embargo, es posible que los mismos términos se utilicen en diferentes Bounded Contexts con significados diferentes. Este es precisamente el desafío que Evans ilustra con la famosa parábola del elefante y los hombres ciegos, que veremos a continuación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mismos nombres, diferentes significados
&lt;/h2&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%2Fw77k64l0lxjti1kh28vp.jpg" 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%2Fw77k64l0lxjti1kh28vp.jpg" alt="Parábola del Elefante y los hombres ciegos" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En su libro &lt;strong&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/strong&gt;, Eric Evans se apoya en la parábola del “Elefante y los hombres ciegos” para explicar que el dominio puede representar diferentes cosas dependiendo del subdominio en que el equipo esté interactuando.&lt;/p&gt;

&lt;p&gt;Así como para el hombre que toca el colmillo el elefante es como una lanza, para quien está en las piernas es como un árbol; en nuestros sistemas también el entendimiento del negocio de quien trabaja en pagos va a ser completamente diferente a quien trabaja envíos.&lt;/p&gt;

&lt;p&gt;En este proceso, es muy común, que se utilicen los mismos nombres para definir conceptos totalmente diferentes. Por ejemplo un “artículo” para Pagos tiene las propiedades de precio, marca, aplica descuento, pero para Envíos tiene las propiedades de peso, dimensiones, condición de embalaje.&lt;/p&gt;

&lt;p&gt;Esto no es un problema como tal, de hecho es lo recomendable según Eric Evans, que cada término describa específicamente el problema que está resolviendo en su contexto.&lt;/p&gt;

&lt;p&gt;Sin embargo, es importante tener clara esta situación. Especialmente, cuando tenemos que definir relaciones entre diferentes Bounded Contexts, para así evitar que la integridad de nuestro contexto se comprometa. Esto será tema de un próximo capítulo, pero por ahora es importante reconocer que van a existir este tipo de situaciones.&lt;/p&gt;

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

&lt;p&gt;Toda solución de software se construye dentro de un contexto, definido por los elementos del negocio propios del subdominio en el que trabajamos.&lt;/p&gt;

&lt;p&gt;Los Bounded Contexts nos permiten que ese conjunto de términos, reglas y acciones del negocio se encuentren bien definidas y sirvan como guía para el desarrollo de nuestras soluciones; permitiendo que los equipos se centren en resolver problemas que agregan valor a la empresa en lugar de distraerse con detalles tecnológicos secundarios.&lt;/p&gt;

&lt;p&gt;En el siguiente capítulo veremos cómo se definen estos elementos de negocio en un Bounded Context y cómo esto se traduce a software. Nos vemos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Evans, E. (2004). Domain-driven design: Tackling complexity in the heart of software. Addison-Wesley Professional.
&lt;a href="https://learning.oreilly.com/library/view/domain-driven-design-tackling/0321125215/" rel="noopener noreferrer"&gt;https://learning.oreilly.com/library/view/domain-driven-design-tackling/0321125215/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lerman, J., &amp;amp; Smith, S. (2014). Fundamentals of Domain-Driven Design. Pluralsight.
&lt;a href="https://app.pluralsight.com/library/courses/fundamentals-domain-driven-design/table-of-contents" rel="noopener noreferrer"&gt;https://app.pluralsight.com/library/courses/fundamentals-domain-driven-design/table-of-contents&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>domaindrivendesign</category>
      <category>architecture</category>
      <category>ubiquitouslanguage</category>
    </item>
    <item>
      <title>El punto de partida de DDD: Hablar el idioma del negocio</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Thu, 21 Aug 2025 10:35:00 +0000</pubDate>
      <link>https://forem.com/boceto1/el-punto-de-partida-de-ddd-hablar-el-idioma-del-negocio-36m8</link>
      <guid>https://forem.com/boceto1/el-punto-de-partida-de-ddd-hablar-el-idioma-del-negocio-36m8</guid>
      <description>&lt;p&gt;&lt;em&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2025/ddd-serie-part-1-language/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2025/ddd-serie-part-1-language/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;Entender qué hacemos&lt;/li&gt;
&lt;li&gt;La importancia del lenguaje&lt;/li&gt;
&lt;li&gt;Poniendo límites a nuestro lenguaje&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Hace algunos meses me encontraba presentando una iniciativa a las diferentes áreas interesadas en esta: experiencia, negocio, seguridades, riesgos, canales de atención, legal. Para mí, esta funcionalidad no representaba un cambio significativo en la arquitectura del sistema, era una variante sobre un flujo ya existente.&lt;/p&gt;

&lt;p&gt;Me sorprendió descubrir que solo para mí no era algo nuevo. Para las otras áreas, esto sí representaba una nueva funcionalidad que tenía sus propias reglas de negocio y restricciones.&lt;/p&gt;

&lt;p&gt;Ante esto traté de explicar que: la arquitectura de &lt;strong&gt;máquina de estados&lt;/strong&gt; implementada permitía guardar &lt;strong&gt;pasos&lt;/strong&gt; sin alterar el estado de las &lt;strong&gt;bases de datos&lt;/strong&gt; y que al final los &lt;strong&gt;registros&lt;/strong&gt; tenían &lt;strong&gt;esquemas&lt;/strong&gt; similares.&lt;/p&gt;

&lt;p&gt;¿Pueden ustedes identificar mi error? Yo tampoco lo vi en su momento hasta que alguien del área legal me dijo &lt;em&gt;¿Qué es una máquina de estados?&lt;/em&gt;. En ese momento comprendí que la mayoría de términos que usé no los conocía gran parte de mi audiencia. Eso hacía que no estuviéramos alineados en lo que se iba a construir.&lt;/p&gt;

&lt;p&gt;Reflexionando sobre este tema regresé a ver a mi arquitectura y me di cuenta que su estructura representaba claramente el patrón técnico que utilizábamos. Pero las reglas de negocio se diluían en el código y era difícil identificarlas. En pocas palabras, nuestro centro no era el negocio, era la tecnología.&lt;/p&gt;

&lt;p&gt;Este fue mi punto de partida hacia Domain-Driven Design (DDD). En esta serie de blogs les compartiré mi aprendizaje sobre este tema y cómo puede aportar a construir soluciones centradas en el negocio, no en la tecnología.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entender que hacemos
&lt;/h2&gt;

&lt;p&gt;Como desarrolladores y líderes técnicos nuestra área de confort es la creación de software, somos buenos en ello. Pero por un momento nos hemos puesto a pensar en qué hacemos. No me refiero si habilitamos un servicio “REST” o estamos implementando un “Dead Letter Queue”. Lo que pregunto es  ¿conocemos qué hace nuestro sistema? ¿por qué la empresa considera que es importante lo que estamos construyendo? ¿cuál es el giro de negocio? ¿cómo aportamos valor?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"El corazón del software es su capacidad para resolver problemas relacionados con el dominio de un usuario.”&lt;/p&gt;

&lt;p&gt;— Eric Evans, &lt;em&gt;Domain-Driven Design&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tener claro qué hace el negocio y cuál es su razón de ser nos permitirá construir software que aporte a ese objetivo y no piezas costosas de software que nadie las utiliza.&lt;/p&gt;

&lt;p&gt;Una forma útil para identificar el “qué” de nuestros sistemas es a través de las conversaciones que se tienen con las diferentes áreas que interactúan con el sistema de forma directa o indirecta. &lt;/p&gt;

&lt;p&gt;Te planteo este ejercicio. En tu siguiente conversación con algún área diferente a la de desarrollo busca identificar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Qué acciones describen tu sistema (Ejemplo: Usuario agrega orden a carrito de compra, Cliente realiza una transferencia)&lt;/li&gt;
&lt;li&gt;Dentro de esas acciones señala los términos comunes utilizados (Ejemplo: Carrito, Compra, Transacción, Transferencia)&lt;/li&gt;
&lt;li&gt;Qué restricciones o reglas se comentan (límite de compra, máximo valor de transacción)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esto te dará unas pistas no solo de qué hace tu sistema, sino lo que los otros piensan que hace tu sistema. Y lo más importante, reconocerás el siguiente desafío que necesitas afrontar. &lt;/p&gt;

&lt;p&gt;Alinear el lenguaje.&lt;/p&gt;

&lt;h2&gt;
  
  
  La importancia del lenguaje
&lt;/h2&gt;

&lt;p&gt;Si eres de Hispanoamérica te habrás percatado que una misma palabra puede significar cosas diferentes dependiendo de la región. Por ejemplo “guagua” en Ecuador significa bebé mientras que en países como Chile o Cuba significa autobús, no existe ninguna relación entre los dos significados.  &lt;/p&gt;

&lt;p&gt;Esto mismo ocurre con nuestros sistemas, por ello antes de lanzarnos a construir soluciones es importante &lt;strong&gt;alinearnos en el lenguaje&lt;/strong&gt;. Y así evitar que terminemos en una torre de Babel donde cada quien entiende o infiere lo que quiere y el resultado final no representa a nadie.&lt;/p&gt;

&lt;p&gt;Pongamos un ejemplo de un “lenguaje común” exitoso, HTML. Este lenguaje de marcado creado por Tim Berners Lee generó un esquema para presentar páginas en Internet. Su éxito es tal que no importa el país, las creencias, el nivel técnico, todos quienes interactuamos con la web sabemos que es un &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; o &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;De este último párrafo me gustaría que nos quedemos con la frase &lt;strong&gt;“todos quienes interactuamos con”.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un Lenguaje Universal no existe. Volviendo a mi ejemplo de HTML, tal vez un abogado no sabe qué es una marca &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; pero ¿eso importa?, no. Sin embargo, si el abogado desea implementar su página web y se aventura a hacerlo por sí solo deberá aprender el lenguaje de la web, en donde la marca &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; define un párrafo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eric Evans define a este conjunto de conceptos y términos que evolucionan juntos dentro de un contexto delimitado como &lt;strong&gt;Ubiquitous Language.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De la definición de Eric Evans me gustaría rescatar la última parte &lt;strong&gt;“contexto delimitado”&lt;/strong&gt;. Que exista ambigüedad en lenguaje no es un problema como tal. De igual manera que podemos usar guagua mientras estemos en Ecuador para referirnos a un bebé. Es importante identificar el contexto sobre el cual se desenvuelve nuestro sistema y definir límites alrededor de él. &lt;/p&gt;

&lt;p&gt;De esta manera nuestro lenguaje nos permitirá describir los problemas y acciones que son relevantes para nuestra área del negocio y sus interesados&lt;/p&gt;

&lt;h2&gt;
  
  
  Poniendo límites a nuestro lenguaje
&lt;/h2&gt;

&lt;p&gt;Regresemos un momento al ejemplo de HTML, en una frase anterior comentaba que &lt;strong&gt;“todos quienes interactuamos con la web sabemos”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;De esta expresión podemos conocer el contexto general en el cual nos estamos desenvolviendo, la web.&lt;/p&gt;

&lt;p&gt;¿Quiénes podrán estar interesados en la web? La respuesta puede ser muy amplia. Eso no nos ayuda a construir un lenguaje común. Pero qué tal si replanteamos la pregunta en ¿Quiénes están interesados en cómo publicar información en internet a través de páginas?&lt;/p&gt;

&lt;p&gt;En ese contexto vamos a encontrar acciones comunes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Escribir un artículo&lt;/li&gt;
&lt;li&gt;Dar formato al contenido&lt;/li&gt;
&lt;li&gt;Insertar enlaces, multimedia o componentes interactivos&lt;/li&gt;
&lt;li&gt;Configuración de SEO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También podemos definir nuestros actores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desarrolladores web&lt;/li&gt;
&lt;li&gt;Autores&lt;/li&gt;
&lt;li&gt;Diseñadores web&lt;/li&gt;
&lt;li&gt;Especialistas en Marketing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finalmente vamos a descubrir términos comunes como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Página HTML&lt;/li&gt;
&lt;li&gt;Hipervínculo&lt;/li&gt;
&lt;li&gt;SEO&lt;/li&gt;
&lt;li&gt;Estilo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este contexto se puede explicar la razón de ciertas etiquetas de HTML:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; y &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; nos ayudan a definir títulos y párrafos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; hace referencia a hipervínculos&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; a la capacidad de añadir estilos a nuestras páginas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dentro de un contexto general muy amplio (la web) hemos puesto límites basados en las acciones que queremos realizar en la web (publicar información), de esta manera ha sido más fácil identificar las capacidades de nuestro sistema y sus involucrados.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eric Evans define al entorno en el cual se desarrollan nuestros sistemas como &lt;strong&gt;dominio&lt;/strong&gt; , y las capacidades específicas en las que se divide como &lt;strong&gt;subdominios&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Este ejercicio lo podemos hacer nosotros con nuestros sistemas, por ejemplo. Si trabajamos para una empresa que vende artículos por internet podemos decir claramente que estamos en el dominio de “E-commerce”. Pero en qué área nos desenvolvemos: pagos, entregas, marketing, catálogo. Cuando tengamos esto identificado comenzaremos a ver que tenemos términos que son propios de nuestro subdominio como “transacción” para pagos o “alcance” para marketing. Incluso términos que se utilizan entre subdominios cómo “orden” que puede significar una cosa para un pago y otra para una entrega.&lt;/p&gt;

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

&lt;p&gt;Construir sistemas es complejo y mucho más cuando existen una desconexión entre los participantes de un proyecto. Para nosotros, como personas de tecnología, esa desconexión es un riesgo.  Significa construir sistemas centrados en las herramientas que usamos y no en los problemas del negocio que queremos resolver. &lt;/p&gt;

&lt;p&gt;Para ello es importante detenerse un momento e identificar dónde estamos parados, cuál es el dominio de nuestro negocio y en cuál subdominio están mis soluciones. Para así trabajar en construir un lenguaje que permita al sistema representar el negocio y alinear a los interesados.&lt;/p&gt;

&lt;p&gt;Aquí lo dejamos por ahora. En la siguiente parte explicaremos cómo estos límites se convierten en contextos claros que guían la arquitectura: los Bounded Contexts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pluralsight. (s. f.). Clean Architecture: Patterns, Practices, and Principles. Recuperado de &lt;a href="https://app.pluralsight.com/library/courses/clean-architecture-patterns-practices-principles/table-of-contents" rel="noopener noreferrer"&gt;https://app.pluralsight.com/library/courses/clean-architecture-patterns-practices-principles/table-of-contents&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evans, E. (2003). Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison-Wesley Professional. Recuperado de &lt;a href="https://learning.oreilly.com/library/view/domain-driven-design-tackling/0321125215/" rel="noopener noreferrer"&gt;https://learning.oreilly.com/library/view/domain-driven-design-tackling/0321125215/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>domaindrivendesign</category>
      <category>architecture</category>
      <category>ubiquitouslanguage</category>
    </item>
    <item>
      <title>Tres claves para que tu equipo cante fuerte, claro y en armonía</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Tue, 12 Aug 2025 01:24:53 +0000</pubDate>
      <link>https://forem.com/boceto1/tres-claves-para-que-tu-equipo-cante-fuerte-claro-y-en-armonia-3hhm</link>
      <guid>https://forem.com/boceto1/tres-claves-para-que-tu-equipo-cante-fuerte-claro-y-en-armonia-3hhm</guid>
      <description>&lt;p&gt;En los últimos meses mi equipo y yo hemos enfrentado retos complejos, desafiantes. Hecho que provocó que las últimas semanas terminé un poco desgastado y sobre todo reflexivo. Una pregunta rondaba en mi cabeza a diario, &lt;strong&gt;&lt;em&gt;¿qué define a un gran equipo?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En esos momentos de reflexión recordé una anécdota de mis tiempos en el coro de la universidad, que días más tarde compartí con mi equipo y después de pensarlo me gustaría compartirla con ustedes.&lt;/p&gt;

&lt;p&gt;Hace algunos años, el coro de mi universidad tuvo la oportunidad de participar en un festival de música coral en la ciudad de Tlaxcala, México. Todos estábamos muy ilusionados y para muchos de nosotros significaba la primera vez que una de nuestras pasiones nos permitía viajar a otro país.&lt;/p&gt;

&lt;p&gt;La preparación no estuvo exenta de problemas, falta de compromiso y claridad en el objetivo del viaje pero la ilusión estaba ahí. Después de dos meses de ensayo estábamos listos para viajar.&lt;/p&gt;

&lt;p&gt;Como todo festival, el nuestro comenzó con un concierto de apertura, al cual llegamos un poco tarde por un retraso en nuestro vuelo. Si bien el evento ya había comenzado, logramos estar presentes para nuestro número. La mezcla de ilusión y nervios estaban a flor de piel pero lo hicimos y salimos contentos. Después de ello nos dispusimos a escuchar al resto de grupos.&lt;/p&gt;

&lt;p&gt;Fue una gran sorpresa descubrir que nuestro grupo era uno de los más numerosos, 25 personas aproximadamente. La mayoría de grupos no llegaba a la docena y hubo uno en especial que me sorprendió, eran apenas 8 personas: 2 sopranos, 2 contraltos, 2 tenores y 2 bajos (uno de ellos hacía beatbox).&lt;/p&gt;

&lt;p&gt;El grupo era increíble, a pesar de ser un grupo pequeño se los escuchaba fuerte y claro. Cada canción la interpretaban con cierta delicadeza y belleza que no importaba lo que hiciesen todo sonaba bien y sobre todo el grupo se lo veía feliz de estar en tarima, lo que producía que el público disfrutara la presentación. Intrigado los seguí durante todo el festival y una sola pregunta rondaba en mi cabeza, la cual compartí con mi director.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;¿Por qué si era un grupo tan pequeño sonaba tan bien y nosotros siendo más nos costaba que se nos escuche?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La respuesta de mi director me asombró  y creo que responde a la pregunta inicial que planteé en este blog. ¿Qué define un gran equipo? He aquí la respuesta.&lt;/p&gt;

&lt;p&gt;Lo primero, me dijo, es que todos, sin excepción, se saben la letra de sus canciones. El director ha delineado el repertorio que quería presentar en este festival y la primera tarea que han tenido es aprenderse la letra. Si alguien no se sabe la letra de las canciones es difícil avanzar dado a que no se pueden trabajar armonías, cambios de tiempo, matices, juegos de voces. Si el grupo no se sabe la letra de sus canciones se pierde claridad en los ensayos y seguridad en el escenario.&lt;/p&gt;

&lt;p&gt;Lo segundo, es que cada quien ejecuta su rol en el equipo como el mejor. La soprano que tienen sabe que es la mejor soprano que puede ser, al igual que su tenor o su bajo. &lt;strong&gt;&lt;em&gt;¿Qué significa ser la mejor en su rol?&lt;/em&gt;&lt;/strong&gt; Significa que trabaja todos los días puliendo su arte, sin criticar el trabajo de otros o menospreciándolo. El bajo sabe que es la base del coro, la contralto está clara que tal vez no se luzca como la soprano pero sin ella no se pueden armar armonías complejas. El tenor sabe que debe no exagerar en su volumen de voz dado que pueden en ello opacar ciertos matices y arreglos que ha puesto el director. Todos saben que son importantes y son los mejores en lo que hacen o al menos buscan serlo.&lt;/p&gt;

&lt;p&gt;Finalmente, gracias a lo primero y lo segundo, ellos logran algo importante durante su ejecución. &lt;strong&gt;&lt;em&gt;"La respiración intercalada"&lt;/em&gt;&lt;/strong&gt;. Ponte a pensar, me dijo, muchas canciones requieren notas largas o frases muy rápidas. En muchos coros, nosotros incluidos, se escucha la respiración y se identifica cuando alguien está sufriendo en esas notas. ¿Por qué en ellos no? La respuesta es simple, si todos se saben la letra y son los mejores en lo que hacen, se pueden permitir que alguien tome pequeñas pausas dado que saben que el grupo los respalda. De esta manera no importa si están en una misma nota 5 minutos, si todos se apoyan para darse tiempo para respirar unos segundos, eso no se notará y el coro siempre sonará sólido.&lt;/p&gt;

&lt;p&gt;Si lo piensan bien, eso mismo ocurre con los equipos. Un gran equipo, uno que canta fuerte, seguro y muy hermoso es aquel en donde:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;El equipo se sabe la letra de sus canciones.-&lt;/strong&gt; es decir que conoce y se interesa por el contexto de su trabajo, el &lt;strong&gt;"por qué"&lt;/strong&gt; se hacen las cosas, sus objetivos, sus procesos. En el caso de los desarrolladores eso significa también conocer el código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cada miembro del equipo es el mejor en lo que hace.-&lt;/strong&gt; en un equipo no se requiere de estrellas, se requiere que el equipo brille. Eso significa que cada uno de los integrantes sea el mejor en lo que hace o que busque serlo. Si es un QA, es la persona más apasionada en la búsqueda de la calidad de las funcionalidades y del sistema como tal. Si es UX designer, es el más apasionado en crear experiencias sencillas y de valor en las personas. Todo ello mientras respetan y valoran el trabajo de los demás. De nada sirve un equipo donde solo brille uno, una armonía requiere de muchas voces diversas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;El mejor equipo es el que se permite respirar de manera intercalada.-&lt;/strong&gt; al final es importante reconocer que somos humanos, que no siempre nos vamos a saber las letras de las canciones o estamos con energía para ser los mejores en lo que hacemos. Pero si estamos como grupo en búsqueda de ese objetivo, eso nos permite darnos espacio para apoyar al que se siente mal, al que está cerca de entrar en burnout, al que una situación familiar lo ha desenfocado. Los proyectos son complejos, como dar notas muy largas, entonces en ese proceso tenemos que darnos respiros los unos a los otros para seguir avanzando.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Son estos tres puntos los que para mí definen a un gran equipo. Uno en el que todos buscan entender lo que hacen y sobre todo el por qué lo hacen, son los mejores en su rol o buscan serlo. Y lo más importante se permiten respirar cuando alguien del equipo no se siente bien o necesita un espacio.&lt;/p&gt;

&lt;p&gt;Esto no significa que el equipo será infalible, incluso el coro que les conté tuvo canciones que no estuvieron al 100, pero su ejecución en general era excelente, lo mismo pasa con los equipos, pero eso no nos impide trabajar por que nuestros grupos de trabajo suenen fuerte, claro y sobre todo hermoso.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Meajs8rH2fI"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
&lt;em&gt;El progreso - Coro ESPE. Festival Tlaxcala Canta 2016&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Educational Frontmap: La clave para un aprendizaje organizado y efectivo</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Thu, 30 Jan 2025 02:49:00 +0000</pubDate>
      <link>https://forem.com/boceto1/educational-frontmap-la-clave-para-un-aprendizaje-organizado-y-efectivo-33a6</link>
      <guid>https://forem.com/boceto1/educational-frontmap-la-clave-para-un-aprendizaje-organizado-y-efectivo-33a6</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2025/educational-frontmap/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2025/educational-frontmap/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;¿Qué es un Educational Frontmap?&lt;/li&gt;
&lt;li&gt;¿Cómo construir un Educational Frontmap?&lt;/li&gt;
&lt;li&gt;Beneficios&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Introducción:
&lt;/h2&gt;

&lt;p&gt;El entorno actual nos desafía a mantenernos en constante aprendizaje. Cada día aparecen nuevas tecnologías, técnicas o herramientas que nos permiten ser mejores en lo que hacemos y en el proceso disfrutarlo más. Para ello podemos apoyarnos de un sin fin de recursos como: videos de YouTube, libros, cursos, charlas, artículos, entre otros.  &lt;/p&gt;

&lt;p&gt;Sin embargo, en este afán de aprender nuevas cosas podemos perder el rumbo y sentirnos abrumados por la cantidad de información que existe. Lo que puede ocasionar que nos frustre no avanzar o sea complejo reconocer cada paso que damos en la construcción de nuestra carrera.&lt;/p&gt;

&lt;p&gt;Para ello me gustaría presentarles la siguiente herramienta:&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es un Educational Frontmap?
&lt;/h2&gt;

&lt;p&gt;Un "educational frontmap" es un tablero que nos permite organizar y categorizar todos los recursos que hemos utilizado o tenemos interés de explorar. El tablero está dividio por categorìas y en cada una de estas podemos encontrar cursos, blogs, libros, artículos, videos o personalidades que han contribuido a nuestra formación en relación a un tema&lt;/p&gt;

&lt;p&gt;De esta manera podemos contar con un lugar donde se encuentran todos los elementos que han contribuido a nuestra formación y son un espacio para consultas posteriores.&lt;/p&gt;

&lt;p&gt;Esta herramienta la encontré hace algunos años leyendo un blog, decidí explorarla e incorporarla en mi vida y me ha dado grandes resultados.  &lt;/p&gt;

&lt;p&gt;Permíteme explicarte cómo construirlo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo construir un Educational Frontmap?
&lt;/h2&gt;

&lt;p&gt;Como mencioné anteriormente, un "educational frontmap" es un tablero para mapear recursos de aprendizaje. Para ello puedes utilizar herramientas que permitan hacer tablas como: Excel, Notion o Trello.&lt;/p&gt;

&lt;p&gt;En cada columna ingresa las áreas de interés que estén relacionadas con tu carrera, en mi caso tengo las siguientes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programming&lt;/li&gt;
&lt;li&gt;Software Engineering and Architecture&lt;/li&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Frontend&lt;/li&gt;
&lt;li&gt;Backend&lt;/li&gt;
&lt;li&gt;Javascript / Typescript&lt;/li&gt;
&lt;li&gt;Cloud / DevOps&lt;/li&gt;
&lt;li&gt;Artificial Intelligence&lt;/li&gt;
&lt;li&gt;Others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como pueden ver las secciones pueden ser muy específicas o generales dependiendo del nivel de profundidad que le quieran dar a cada una de las áreas.&lt;/p&gt;

&lt;p&gt;Ahora, para mí también es importante incorporar otras categorías que complementan la formación técnica de un profesional:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Soft skills.- recursos relacionados con el desarrollo de habilidades no técnicas.&lt;/li&gt;
&lt;li&gt;Pet Projects.- links a proyectos personales&lt;/li&gt;
&lt;li&gt;Inspiration.- personalidades de la industria que tienen una opinión importante&lt;/li&gt;
&lt;li&gt;Research.- investigaciones formales&lt;/li&gt;
&lt;li&gt;Conferences.- ponencias o conferencias en las que se participa como ponente&lt;/li&gt;
&lt;li&gt;Formal Education.- educación formal como pregrados o postgrados.&lt;/li&gt;
&lt;li&gt;Blog Posts.- artículos o blogs de nuestra autoría&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos estos elementos complementan la formación de un profesional y permiten desarrollar esos elementos diferenciadores dentro de la industria.&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%2Fiu0fuscep0w5wltovcf0.jpg" 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%2Fiu0fuscep0w5wltovcf0.jpg" title="Ejemplo de Tablero" alt="Ejemplo de Tablero" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para cada área, agrega los siguientes datos para cada recurso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nombre del recurso (ejemplo: "React Handbook")&lt;/li&gt;
&lt;li&gt;Tipo de recurso (curso, blog, libro, etc.)&lt;/li&gt;
&lt;li&gt;Enlace o ubicación&lt;/li&gt;
&lt;li&gt;Estado (por ejemplo, "en progreso", "pendiente" o "completado")&lt;/li&gt;
&lt;li&gt;Notas personales&lt;/li&gt;
&lt;/ul&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%2Fjixt2junhsn3g382xufu.jpg" 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%2Fjixt2junhsn3g382xufu.jpg" title="Ejemplo de Recurso" alt="Ejemplo de Recurso" width="800" height="882"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puedes ampliar esta estructura según tus necesidades y personalizarla de acuerdo a tus objetivos de aprendizaje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beneficios
&lt;/h2&gt;

&lt;p&gt;El organizar tus recursos en un Educational Frontmap puede impactar de gran manera en la construcción de tu carrera dado a que te permite centralizar en un lugar todos los recursos que has utilizado y bien organizado peude permitirte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tener un acceso rápido a funtes de consulta por área de interes.&lt;/li&gt;
&lt;li&gt;Adjuntar elementos adicionales que complemtan el recurso utilizado. Por ejemplo puedes añadir tus notas de clase a un curso que hayas tomado.&lt;/li&gt;
&lt;li&gt;Usando filtros pueden permitirte ver que áreas necesitas trabajar más, comenzar a explorar o simplemente dejar de lado.&lt;/li&gt;
&lt;li&gt;Es una buena carta de presentación cómo profesionales.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Un "Educational Frontmap" puede ayudarte a organizar tus objetivos de aprendizaje, mantenerte motivado y facilitar el acceso a los recursos que necesitas. Dedica tiempo a construirlo y personalizarlo para que se convierta en una herramienta clave en tu desarrollo profesional.&lt;/p&gt;

&lt;p&gt;Empieza hoy mismo y déjame saber en los comentarios cómo lo has organizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://trello.com/" rel="noopener noreferrer"&gt;Trello&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aprendizajecontinuo</category>
      <category>desarrolloprofesional</category>
      <category>softskills</category>
    </item>
    <item>
      <title>Throughput vs IOPS: Su impacto clave en la selección de almacenamiento en AWS</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Wed, 22 Jan 2025 04:45:08 +0000</pubDate>
      <link>https://forem.com/boceto1/throughput-vs-iops-su-impacto-clave-en-la-seleccion-de-almacenamiento-en-aws-i0g</link>
      <guid>https://forem.com/boceto1/throughput-vs-iops-su-impacto-clave-en-la-seleccion-de-almacenamiento-en-aws-i0g</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2025/throughput-vs-iops/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2025/throughput-vs-iops/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;Qué es Throughput?&lt;/li&gt;
&lt;li&gt;Qué es IOPS?&lt;/li&gt;
&lt;li&gt;Cómo se relacionan Throughput y el IOPS?&lt;/li&gt;
&lt;li&gt;Cómo escoger mi servicio AWS de storage en base a estas métricas?&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Uno de los  principales retos que enfrentamos al momento de diseñar soluciones Cloud es seleccionar las herramientas adecuadas para cumplir con nuestro objetivo de manera óptima y eficiente en base a los requerimientos del negocio.&lt;/p&gt;

&lt;p&gt;En este blog me gustaría que nos centremos en comprender los conceptos de Throughput y IOPS. Métricas que nos pueden ayudar a seleccionar qué opción de almacenamiento es la más conveniente para nuestro caso.&lt;/p&gt;

&lt;p&gt;Comencemos:&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es Throughput?
&lt;/h2&gt;

&lt;p&gt;Imaginemos que somos los encargados de un servicio de streaming de video, como Netflix o YouTube. Cada vez que un usuario reproduce un video, el sistema debe transferir datos constantemente desde el servidor al dispositivo del usuario. Ahora, si millones de usuarios están viendo contenido en alta definición (HD o 4K) al mismo tiempo, la cantidad de datos que debe transferirse es inmensa. Si la capacidad de la red o los servidores no es suficiente para manejar este flujo constante de datos, los usuarios experimentarán interrupciones o tiempos de carga prolongados. Este desafío para transferir &lt;strong&gt;grandes volúmenes de datos de manera continua&lt;/strong&gt; es un problema de Throughput.&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%2F8y1u4nl4wnkb4ejo3lpy.jpg" 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%2F8y1u4nl4wnkb4ejo3lpy.jpg" title="Ejemplo de Throughput" alt="Ejemplo de Throughput" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Throughput se refiere a la cantidad de datos que pueden transferirse en un sistema por unidad de tiempo. Generalmente se mide en megabytes por segundo (MB/s) o gigabytes por segundo (GB/s). Es una métrica clave para evaluar el rendimiento de sistemas que manejan flujos continuos y grandes volúmenes de información.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es IOPS?
&lt;/h2&gt;

&lt;p&gt;Pensemos en un sistema de mensajería instantánea como WhatsApp o Slack. Cada mensaje que se envía o recibe puede implicar &lt;strong&gt;múltiples operaciones pequeñas por segundo&lt;/strong&gt;. Estas operaciones incluyen almacenar el mensaje en una base de datos, actualizar el estado de lectura y enviar notificaciones a los dispositivos involucrados. Si el sistema no está diseñado para manejar este tipo de carga, podrían ocurrir retrasos en la entrega de mensajes, especialmente cuando millones de usuarios están activos simultáneamente. Esto simboliza un problema de IOPS (Input/Output Per Second).&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%2Fnuorkdfe8cr7gsjgl6r8.jpg" 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%2Fnuorkdfe8cr7gsjgl6r8.jpg" title="Ejemplo de IOPS" alt="Ejemplo de IOPS" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IOPS se refiere a la cantidad de operaciones de entrada y salida que un sistema puede realizar en un segundo. Estas operaciones pueden incluir lecturas, escrituras o una combinación de ambas. Se mide en operaciones por segundo y es una métrica clave para evaluar el rendimiento de sistemas donde se ejecutan múltiples transacciones rápidas y frecuentes, como bases de datos o sistemas de mensajería.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se relacionan Throughput y el IOPS?
&lt;/h2&gt;

&lt;p&gt;Estas dos métricas no son opuestas, más bien nos ayudan a evaluar el rendimiento de nuestros sistemas desde diferentes aristas.  Throughput nos indica la velocidad general a la que los sistemas pueden mover datos. Mientras que IOPS refleja el rendimiento de un sistema con múltiples operaciones rápidas y frecuentes.&lt;/p&gt;

&lt;p&gt;Veamoslo con mayor claridad en la siguiente tabla:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Throughput&lt;/th&gt;
&lt;th&gt;IOPS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qué mide&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cantidad de datos transferidos por unidad de tiempo&lt;/td&gt;
&lt;td&gt;Número de operaciones de entrada/salida por segundo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Megabytes por segundo (MB/s) o Gigabytes por segundo (GB/s)&lt;/td&gt;
&lt;td&gt;Operaciones por segundo (número entero)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Importancia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Crucial para flujos de datos continuos y grandes volúmenes de información&lt;/td&gt;
&lt;td&gt;Fundamental en sistemas transaccionales donde se requieren rápidas operaciones de I/O&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cómo escoger mi servicio AWS de storage en base a estas métricas?
&lt;/h2&gt;

&lt;p&gt;AWS provee diferentes servicios de almacenamiento y memoria, el seleccionar uno de ellos va a depender mucho de la necesidad de nuestro caso de uso y los requerimientos que tengamos que cumplir. Es por ello analizar las métricas Throughput y el IOPS puede contribuir a que tomemos una mejor decisión. &lt;/p&gt;

&lt;p&gt;La siguiente tabla muestra un resumen de qué servicio está más optimizado para una métrica o la otra.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Servicio de Almacenamiento&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;th&gt;Casos de Uso&lt;/th&gt;
&lt;th&gt;Optimizado para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Almacenamiento de objetos escalable y duradero.&lt;/td&gt;
&lt;td&gt;Respaldo masivo de datos, análisis de Big Data, almacenamiento de contenido multimedia.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon EFS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sistema de archivos compartido para instancias EC2.&lt;/td&gt;
&lt;td&gt;Compartición de archivos entre instancias EC2 en aplicaciones distribuidas o sistemas analíticos.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon EBS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Almacenamiento en bloque para instancias EC2.&lt;/td&gt;
&lt;td&gt;Bases de datos transaccionales, aplicaciones críticas con alta concurrencia.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IOPS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon FSx for Lustre&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Diseñado para cargas de trabajo intensivas en datos como análisis y procesamiento de big data.&lt;/td&gt;
&lt;td&gt;Análisis de datos científicos, simulaciones, y cargas de trabajo de machine learning.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amazon FSx for Windows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sistema de archivos optimizado para aplicaciones empresariales y bases de datos en entornos Windows.&lt;/td&gt;
&lt;td&gt;Aplicaciones empresariales en Windows, entornos de directorio activo, y bases de datos SQL Server.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IOPS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Comprender los requerimientos de nuestros sistemas es importante al momento de seleccionar nuestras soluciones de almacenamiento. El comprender si nuestro sistema requiere mover grandes cantidades de datos (Throughput) o realizar una gran cantidad de operaciones pequeñas por segundo (IOPS) nos permite identificar la métrica correcta para nuestro estudio y la solución de AWS que más se acople a nuestras necesidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://buffalotech.com/blog/iops-vs-throughput-what-is-the-difference-and-how-do-they-affect-storage-performance" rel="noopener noreferrer"&gt;https://buffalotech.com/blog/iops-vs-throughput-what-is-the-difference-and-how-do-they-affect-storage-performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.simplyblock.io/blog/iops-throughput-latency-explained/" rel="noopener noreferrer"&gt;https://www.simplyblock.io/blog/iops-throughput-latency-explained/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://silk.us/blog/throughput-vs-iops/" rel="noopener noreferrer"&gt;https://silk.us/blog/throughput-vs-iops/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.site24x7.com/learn/linux/iops-throughput.html" rel="noopener noreferrer"&gt;https://www.site24x7.com/learn/linux/iops-throughput.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloudmetrics</category>
      <category>awssolutionsarchitect</category>
      <category>cloudperformance</category>
    </item>
    <item>
      <title>El verdadero valor del software no siempre está en el presente</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Fri, 08 Nov 2024 03:18:00 +0000</pubDate>
      <link>https://forem.com/boceto1/el-verdadero-valor-del-software-no-siempre-esta-en-el-presente-129n</link>
      <guid>https://forem.com/boceto1/el-verdadero-valor-del-software-no-siempre-esta-en-el-presente-129n</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2024/software-to-the-future/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2024/software-to-the-future/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;El verdadero valor y costo del software&lt;/li&gt;
&lt;li&gt;Estructura vs Comportamiento&lt;/li&gt;
&lt;li&gt;¿Cuándo? y ¿Dónde?&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;En el post anterior &lt;a href="https://blog.jeankaobando.com/blog/2024/from-functional-to-readable/" rel="noopener noreferrer"&gt;(link si no lo has revisado)&lt;/a&gt; discutimos el uso de "Tidyings", pequeñas acciones que mantienen una estructura limpia y, sobre todo, comprensible de nuestro código. Sin embargo, quedó pendiente abordar cuándo y dónde aplicar estos cambios. Si bien el cliente principal de nuestro código es otro programador, el cliente final sigue siendo el usuario, a quien no le importa si nos demoramos tres semanas arreglando nuestro código; lo que quiere es ver que la aplicación funcione y que se desarrollen nuevas funcionalidades.&lt;/p&gt;

&lt;p&gt;Por ello, en esta ocasión vamos a entender cómo aplicar "Tidyings" y reforzar su importancia. Pero primero, profundicemos en el valor y el costo del software.&lt;/p&gt;

&lt;h2&gt;
  
  
  El verdadero valor y costo del software
&lt;/h2&gt;

&lt;p&gt;Imaginemos que vamos a un restaurante especializado en pizza artesanal. Hemos estado allí tres veces y el sabor es excelente, especialmente la pizza de la casa. Esta vez, decidimos llevar a nuestra cita para impresionarla, y nuestras expectativas son altas.&lt;/p&gt;

&lt;p&gt;Por otro lado, el restaurante, con solo tres meses de operación, enfrenta dificultades. No han logrado medir su éxito y su cocina es demasiado pequeña para satisfacer la demanda diaria. Además, solo tienen ingredientes para sus tres tipos de pizzas más populares. La organización del espacio de trabajo es caótica; al principio, con solo dos cocineros, era fácil encontrar las cosas, pero ahora, para los dos nuevos ayudantes, es una verdadera pesadilla. En ese ambiente, todos corren y el descontento es evidente.&lt;/p&gt;

&lt;p&gt;Al llegar al restaurante y preguntar por nuestra reservación, nos sorprenden diciendo que el lugar está lleno y que han dado nuestra mesa a otra pareja, pidiéndonos esperar 15 minutos. Molestos, reclamamos y nos asignan un lugar incómodo cerca de la cocina, pero nos decimos: "Tranquilo, la comida es buena, saldremos de esta". Llamamos al mesero para ordenar lo de siempre, pero a nuestra acompañante le llama la atención una pizza de frutas y la pide. Intuimos que algo va mal porque el mesero toma la orden con preocupación.&lt;/p&gt;

&lt;p&gt;Finalmente, nuestra orden llega en 5 minutos, pero la de nuestra cita tarda una hora; cada vez que preguntamos, nos aseguran que ya va a salir. Durante ese tiempo, escuchamos platos quebrándose en la cocina y discusiones generalizadas. El servicio fue pésimo y ni siquiera la pizza de la casa estuvo buena.&lt;/p&gt;

&lt;p&gt;Al salir, decidimos reclamar; quedamos mal con nuestra cita y el restaurante arruinó la noche. Nos explican que han tenido problemas para crecer, que la pizza de frutas no es muy solicitada y tuvieron que buscar los ingredientes. Además, su sistema de reservas se había caído una hora antes. Deciden no cobrarnos, pero eso no cambia el hecho de que no volveremos.&lt;/p&gt;

&lt;p&gt;Analizando esta historia, podemos destacar dos puntos clave:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;El restaurante comenzó bien, con recetas exitosas. Sin embargo, no se enfocaron en un crecimiento ordenado. Aumentaron las ventas, pero su sistema ya no podía soportarlo.&lt;/li&gt;
&lt;li&gt;Aunque entendimos sus problemas y sentimos empatía, eso no era nuestra preocupación; queríamos disfrutar de una noche agradable y la arruinaron. Como resultado, perdieron no solo el ingreso de ese día, sino también un cliente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esto es precisamente lo que ocurre al crear software. Las empresas y sus desarrolladores se concentran tanto en lanzar funcionalidades rápidamente que descuidan la deuda técnica y las áreas de mejora. El proyecto funciona bien cuando es pequeño, pero cuando crece el código se vuelve un caos, lo que dificulta y hace riesgosa la implementación de cambios. El ambiente se vuelve hostil: el desarrollador está estresado porque teme dañar algo al hacer cambios, los dueños se frustran porque las tareas que antes eran rápidas ahora toman más tiempo, y los usuarios abandonan la aplicación, no sin antes quejarse de que las primeras versiones eran buenas pero ahora nada funciona.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;El software crea valor de dos formas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Haciendo cosas hoy&lt;/li&gt;
&lt;li&gt;En la posibilidad de hacer nuevas cosas mañana.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kent Beck&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kent Beck enfatiza precisamente esto: el valor del software no radica simplemente en su capacidad actual, sino en su flexibilidad para adaptarse y enfrentar cambios futuros.&lt;/p&gt;

&lt;p&gt;Por eso, la legibilidad y mantenibilidad de nuestro código son fundamentales para el crecimiento exitoso de nuestro sistema. Como mencionamos antes: el verdadero costo del software no está en escribirlo, sino en leerlo y entenderlo.&lt;/p&gt;

&lt;p&gt;El libro propone la siguiente relación:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;cost(software)≅cost(cambio)cost(software) \cong cost(cambio) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;cos&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;so&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mord mathnormal"&gt;tw&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;re&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;cos&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ambi&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Sin embargo, los cambios más costosos son aquellos que requieren más tiempo de implementación. Por lo tanto, la relación más precisa es:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;cost(software)≅cost(grandescambios)cost(software) \cong cost(grandes cambios) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;cos&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;so&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mord mathnormal"&gt;tw&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;re&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;cos&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal"&gt;r&lt;/span&gt;&lt;span class="mord mathnormal"&gt;an&lt;/span&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="mord mathnormal"&gt;esc&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ambi&lt;/span&gt;&lt;span class="mord mathnormal"&gt;os&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Los grandes cambios están estrechamente relacionados con el nivel de acoplamiento del código. Cuantos más elementos se interrelacionen entre sí, más complejo será realizar cambios sin afectar otras partes. Esto lleva a la siguiente relación:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;cost(grandescambios)≅cost(coupling)cost(grandes cambios) \cong cost(coupling) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;cos&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal"&gt;r&lt;/span&gt;&lt;span class="mord mathnormal"&gt;an&lt;/span&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="mord mathnormal"&gt;esc&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ambi&lt;/span&gt;&lt;span class="mord mathnormal"&gt;os&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;cos&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;co&lt;/span&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal"&gt;pl&lt;/span&gt;&lt;span class="mord mathnormal"&gt;in&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Si el costo del software es aproximadamente igual al costo de hacer grandes cambios, y este a su vez es aproximadamente igual al nivel de acoplamiento de nuestra aplicación, entonces podemos concluir que el costo del software es aproximadamente igual al nivel de acoplamiento del sistema.&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;cost(software)≅cost(coupling)cost(software) \cong cost(coupling) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;cos&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;so&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mord mathnormal"&gt;tw&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mord mathnormal"&gt;re&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;cos&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;co&lt;/span&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="mord mathnormal"&gt;pl&lt;/span&gt;&lt;span class="mord mathnormal"&gt;in&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Esta relación se conoce en el libro como la &lt;strong&gt;Equivalencia de Constantine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El tema del acoplamiento es extenso y merecería otro post, pero por ahora es crucial entender que nuestro enfoque no debe limitarse a desarrollar funcionalidades, sino también a mantener nuestro espacio de trabajo preparado para los cambios. Veamos cómo hacerlo a continuación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estructura vs Comportamiento
&lt;/h2&gt;

&lt;p&gt;Como hemos mencionado, el valor del software se define por su capacidad de hacer cosas hoy y estar listo para hacer cosas mañana. En otras palabras, el tipo de código que escribimos afectará cómo funciona o cómo se ve. Por eso, es común ver pull requests con un historial de commits como este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;a1b2c3d refactor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;isolate wishlist query function&lt;/span&gt;
&lt;span class="na"&gt;i7j8k9l feat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;add API routes for wishlist management&lt;/span&gt;
&lt;span class="na"&gt;e4f5g6h refactor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create helper function to parse wishlist user's names&lt;/span&gt;
&lt;span class="na"&gt;m0n1o2p feat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;add initial wishlist backend structure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, observamos dos tipos de cambios: de comportamiento y de estructura. Veamos sus definiciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los cambios de comportamiento son aquellos que añaden, modifican o eliminan funcionalidad en nuestro código. Afectan cómo el usuario final interactúa con la aplicación y, por ende, son difíciles de revertir. Por ejemplo, si has dado a un usuario la opción de buscar por tipos, no querrás quitársela solo porque descubriste un error.&lt;/li&gt;
&lt;li&gt;Los cambios de estructura buscan mejorar la legibilidad o mantenibilidad del código. Estos cambios deben garantizar que el sistema funcione igual que antes y que sean fácilmente reversibles en caso de error. Por ejemplo, si se extrae una sección de una función como función auxiliar, no debería ser complicado volver a integrar ese código en su lugar original si fuera necesario.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta distinción nos muestra que cada tipo de cambio requiere su propio enfoque. En los cambios de comportamiento, nos centramos principalmente en implementar lógica de negocio que debe probarse en diversos escenarios. En los cambios de estructura, el objetivo es mejorar la organización del código, ya sea aplicando "Tidyings" o realizando refactorizaciones más amplias.&lt;/p&gt;

&lt;p&gt;Por eso, el libro recomienda abordar estos dos tipos de cambios por separado, siempre que sea posible.&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%2Ftmh0m555tnjamnwbrf8f.jpg" 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%2Ftmh0m555tnjamnwbrf8f.jpg" title="Imagen del libro Tidy First? de Kent Beck, © 2021" alt="Imagen Descriptiva de cambios de comportamiento vs estructura" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuándo? y ¿Dónde?
&lt;/h2&gt;

&lt;p&gt;Una vez que entendemos que es preferible manejar los cambios de estructura de manera independiente, surge la pregunta de cuándo y dónde aplicarlos.&lt;/p&gt;

&lt;p&gt;El libro "Tidy First?" propone cuatro momentos: Nunca, en otro momento, después de, y antes de.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nunca:&lt;/strong&gt; Es probable que en nuestros proyectos existan secciones que varían poco con el tiempo, como configuraciones, conexiones a bases de datos o implementaciones de reglas de negocio fijas. En estos casos, refactorizar no genera valor futuro y ese tiempo puede invertirse en áreas más críticas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;En otro momento:&lt;/strong&gt; Si al realizar un cambio identificas que mejorar cierta sección no aporta un beneficio inmediato, siendo más un "sería bueno tenerlo", entonces incluye ese arreglo en tu lista de tareas pendientes. Si eres líder técnico, busca siempre espacios en el sprint para ir saldando esa deuda técnica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Después de:&lt;/strong&gt; Si durante una tarea o implementación de funcionalidad identificas una función que "debe" ser mejorada, pero no es el momento adecuado porque podría retrasar el desarrollo, anota esa tarea y comprométete a abordarla inmediatamente después de terminar la tarea actual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antes de:&lt;/strong&gt; Si aplicar un "Tidying" facilitará la implementación de una tarea y garantizará una entrega más robusta o por otro lado no nos quita mucho tiempo a nuestra tarea principal, adelante, no lo pospongas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Identificar el momento adecuado requiere experiencia, pero la idea es siempre tener presente que debemos "mantener nuestra cocina limpia". Ya sea que apliques los cambios en grupo, después de una tarea o antes de ella, recuerda su importancia y no relegues estos cambios al final del backlog.&lt;/p&gt;

&lt;p&gt;Otra pista útil al tomar decisiones es considerar que al código también se le aplica la "Ley de Pareto": el 80% de los cambios se concentra en el 20% del código. Es crucial identificar en nuestros proyectos cuáles son los archivos y funciones más frecuentemente modificados, para mantenerlos organizados y preparados para futuros cambios.&lt;/p&gt;

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

&lt;p&gt;El valor del software y de nuestros sistemas no reside solo en las características que ofrecemos a nuestros clientes, sino en su capacidad para incorporar nuevas funcionalidades en el futuro. Esta capacidad de preparación para el futuro depende de la facilidad con que podamos buscar, modificar o añadir código en nuestros proyectos.&lt;/p&gt;

&lt;p&gt;Para lograrlo, es fundamental diferenciar entre los cambios de comportamiento y los cambios estructurales, e identificar el momento oportuno para aplicar cada tipo de cambio.&lt;/p&gt;

&lt;p&gt;Finalmente, es crucial mantener siempre presente la pregunta: "¿Cómo puedo mejorar mi código?" y no permitir que la deuda técnica se acumule en nuestro backlog.&lt;/p&gt;

&lt;p&gt;Un tema que nos ha quedado pendiente discutir es “coupling”, déjame saber si te gustaría tener un post dedicado solo a este tema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos:
&lt;/h2&gt;

&lt;p&gt;Tidy First, Kent Beck: &lt;a href="https://learning.oreilly.com/library/view/tidy-first/9781098151232/" rel="noopener noreferrer"&gt;https://learning.oreilly.com/library/view/tidy-first/9781098151232/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;SE Radio 615: Kent Beck on “Tidy First”: &lt;a href="https://open.spotify.com/episode/6XHBSDSSuH0xBDz1LeiAUE?si=44cab186651b486d" rel="noopener noreferrer"&gt;https://open.spotify.com/episode/6XHBSDSSuH0xBDz1LeiAUE?si=44cab186651b486d&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cleancode</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>De lo funcional hasta lo legible con Tidyings</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Wed, 23 Oct 2024 02:46:00 +0000</pubDate>
      <link>https://forem.com/boceto1/de-lo-funcional-hasta-lo-legible-con-tidyings-4lm8</link>
      <guid>https://forem.com/boceto1/de-lo-funcional-hasta-lo-legible-con-tidyings-4lm8</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2024/from-functional-to-readable/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2024/from-functional-to-readable/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;Un poco de Tydings&lt;/li&gt;
&lt;li&gt;¿Quién es el principal cliente del código?&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;El trabajo del desarrollador se ve muchas veces reducido a la construcción de nuevas funcionalidades o la solución de bugs. De hecho, esto se ve reflejado en la forma que estas tareas se encuentran estructuradas dentro de la planificación. Al final o se va a implementar algo o se va a arreglar algo.&lt;/p&gt;

&lt;p&gt;Está simplificación tiende a que muchas veces nos enfoquemos solo en la resolución de problemas a través de un ordenador y nos olvidemos de las estructura de esas órdenes.&lt;/p&gt;

&lt;p&gt;En ese contexto fue una grata sorpresa para mi encontrar el libro “Tidy First?” de Kent Beck, el cuál recomiendo 100%. En este se hace énfasis en una de las preguntas que cómo desarrollador nos hacemos todos los días ¿Debo arreglar este código de mie*** primero?.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un poco de Tydings
&lt;/h2&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%2F1cjrba3lddhhcdte6v3t.jpg" 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%2F1cjrba3lddhhcdte6v3t.jpg" alt="Imagen Descriptiva Clean Code" width="500" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Imagen del libro Clean Code de Robert C. Martin, © 2008&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una de las formas más fáciles que tuvo Robert C. Martín para definir que es un buen código fue en términos de cuantos dolores de cabeza y maldiciones produce el revisarlo. Si son muchos WTF definitivamente no es un buen código. Y es que ya lo diría Martin Fowler &lt;em&gt;“Cualquier tonto puede escribir código que una computadora pueda entender. Los buenos programadores escriben código que los humanos puedan entender”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;El tema de “Clean Code” es muy amplio y existe basta literatura relacionada con el tema, pero Kent Beck se enfoca en su libro en un grupo de pequeñas acciones que pueden mejorar la legibilidad y la estructura del código a las que llama “Tydings”. Revisemos mejor con un ejemplo.&lt;/p&gt;

&lt;p&gt;Digamos que estamos trabajando en una nueva funcionalidad y nos encontramos con la siguiente linea de código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;función&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// .... código&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&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="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&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="s1"&gt;negative&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;/// ... más código&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nuestra primera reacción es obviamente WTF? Es dificil de entender y tenemos poco tiempo para terminar la tarea, así que después de leerla un momento y consultar a otro compañero que hace esta línea, nos enteramos que es el resultado de una libreria para detectar el estatus de una cuenta. Este valor puede ser “positive”, “negative” o “invalid”, pero a veces suele devolver el resultado en números. Cuando el resultado sea “undefined” debemos devolver cómo “default”.&lt;/p&gt;

&lt;p&gt;Lo se el código es un asco,  pero es la respuesta  de un tercero y no tenemos control ahí. Además no es parte de nuestra tarea principal arreglarlo y tenemos poco tiempo. ¿Qué podemos hacer? &lt;/p&gt;

&lt;p&gt;Lo mas rápido y uno de los “tidyings” que nos recomienda Kent Beck es dejar un comentario.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;funciónFn&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// .... código&lt;/span&gt;

    &lt;span class="cm"&gt;/*
     ** Transformación de resultado de libreria para calcular estado de la ganancia de una cuenta en positivo y negativo.
     ** El resultado puede ser devuelto cómo string, en números o "undefinded"
     */&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&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="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&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="s1"&gt;negative&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;/// ... más código&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, tal vez no solucione todos los problemas del mundo pero hemos evitado al menos un dolor de cabeza a la siguiente persona que se topen con esta línea de código, quizá a nosotros mismo. Lo interesante de aplicar “tydings” es que un siguiente desarrollador que se tope con esto puede hacer lo siguiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;funciónFn&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// .... código&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;accountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;transformAccountStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;/// ... más código&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/*
** Transformación de resultado de libreria para calcular estado de la ganancia de una cuenta en positivo y negativo.
** El resultado puede ser devuelto cómo string, en números o "undefinded"
*/&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transformAccountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
          &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&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="s1"&gt;negative&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="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La persona que ha hecho este cambio para mi ya es un héroe. La solución es perfecta, NO. Pero ha aplicado dos “tydings” que vuelven más claro el panorama. El primero extraer la función en un helper, lo que logra que la complejidad de esta línea sea encapsulada en una función y que tenga ya un significado cómo tal para la función padre. La segunda es aplicar simetrías, si bien seguimos teniendo todo en una sentencia, ahora se distribuyen en algunas líneas de código, lo que produce que podamos leerlo mejor.&lt;/p&gt;

&lt;p&gt;Digamos que  unos días después alguien dice me parece que estamos haciendo muchas cosas en la misma linea de código: validamos tipos, hacemos transformaciones ademas de manejar diferentes tipos de inputs; entonces decide hacer lo siguiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;funciónFn&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// .... código&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;accountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;transformAccountStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;/// ... más código&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/*
** Transformación de resultado de libreria para calcular estado de la ganancia de una cuenta en positivo y negativo.
** El resultado puede ser devuelto cómo string, en números o "undefinded"
*/&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transformAccountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;=&amp;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;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&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="s1"&gt;negative&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="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí el desarrollador decide aplicar otro “tyding”, aplicar “guardias”.  Eso significa primero validar que los elementos que entran a la función sean válidos antes de ejecutar la lógica de la función.&lt;/p&gt;

&lt;p&gt;Después de realizar este primer arreglo se da cuenta de algunas cosas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Undefined no es el único valor no definido que puede entrar a la función.&lt;/li&gt;
&lt;li&gt;El valor ‘default’ solo aplica cuando el valor es un string.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Entonces procede a hacer un cambio más.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;funciónFn&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// .... código&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;accountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;transformAccountStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;/// ... más código&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/*
** Transformación de resultado de libreria para calcular estado de la ganancia de una cuenta en positivo y negativo.
** El resultado de la libreria puede ser cualquiere valor
*/&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transformAccountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;=&amp;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="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&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="s1"&gt;negative&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="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&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;isString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Genial, hemos encontrado a otro héroe. Este desarrollador primero se ha percatado que el comentario inicial estaba incorrecto, el resultado de la librería puede retornar más que números o strings. Hecho que no se había comentado al inicio, por ello corrige el comentario, aplica la creación de helpers y genera variables con mejor nombre y significado.&lt;/p&gt;

&lt;p&gt;El código para mi está bien, sin embargo, podemos hacerle un pequeño “tyding” más. Sucede que alguien decide ir a ver la librería y ahora ellos han definido una interfaz para el string, garantizando que solo devuelva valores cómo “positive” o “negative”. Y esto le da la idea de que tal vez el default ya no sea necesario y que tal vez nuestra función necesite una interfaz. Manos a la obra.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;
&lt;span class="c1"&gt;//main.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;transformAccountStatus&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./account.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;funciónFn&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// .... código&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;accountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;transformAccountStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;/// ... más código&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// account.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;isNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isString&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./utils.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AccountStatusType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;negative&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transformAccountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;AccountStatusType&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;transformNumberAccountStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt;&lt;span class="p"&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;transformNumberAccountStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;negative&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;noParsedAccountStatus&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&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="s1"&gt;negative&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// utils.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&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;isString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente hemos decidido aplicar un poco de orden de cohesión. Las cosas que se relaciona van juntas y en su propio archivo. Además usando Typescript hemos definido una interfaz, lo que previene errores para futuro y obliga a que el resultado cumpla siempre con esos definición. Finalmente hemos eliminado el comentario, el código se explica ahora por si mismo.&lt;/p&gt;

&lt;p&gt;Si volvemos a la sentencia inicial vemos que mantenemos una línea de código:&lt;/p&gt;

&lt;p&gt;Antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;funciónFn&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// .... código&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&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="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positive&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="s1"&gt;negative&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;/// ... más código&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;funciónFn&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// .... código&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;accountStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;transformAccountStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;/// ... más código&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Pero el resultado es mucho mejor para el principal cliente del código. ¿Quién es este?&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Quién es el principal cliente del código?
&lt;/h2&gt;

&lt;p&gt;Quizá muchos de ustedes dirán después de la primera sección, porque tanto trabajo para una función que estaba bien y no hacía daño a nadie. Para ser muy sincero nunca he sido fan del “si funciona no lo toques”, esto es por que el principal cliente de nuestro código, no es el cliente, es otro programador. &lt;/p&gt;

&lt;p&gt;El usuario utiliza la funcionalidad y no le importa para nada como esta esté implementada, pero el que va a tener que revisar ese desarrollo, mantenerlo y mejorarlo es otro programador.&lt;/p&gt;

&lt;p&gt;Es por ello que algunos “tydings” aplicados en la sección anterior, como otros señalados por Kent Beck en su libro permiten reducir el número de WTF que nuestro código produce si se aplican de manera adecuada. &lt;/p&gt;

&lt;p&gt;Expliquemos un poco mejor algunos de ellos&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Tyding&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Escribir comentarios&lt;/td&gt;
&lt;td&gt;Explicación de lo que hace cierta sección de código o notas para comprender mejor la sentencia.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eliminar comentarios redundantes&lt;/td&gt;
&lt;td&gt;Identificar y remover comentarios que expresan exactamente una sección de código que se explica por si misma.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extraer funciones utilitarias&lt;/td&gt;
&lt;td&gt;Identificar secciones de código en una función o método que no está directamente relacionada a la función pero que sirve de soporte.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guardias&lt;/td&gt;
&lt;td&gt;Al inicio de una función o método hacer todas las validaciones sobre los parámetros.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orden de cohesión y de lectura&lt;/td&gt;
&lt;td&gt;Agrupar y ordenar el código que comparten una función en espacios comunes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Normalizar simetrias&lt;/td&gt;
&lt;td&gt;Usar patrones y formatos de código similares dentro de todo el proyecto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eliminar código muerto&lt;/td&gt;
&lt;td&gt;Remover código que ya no se usa.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variables y Constantes con significado&lt;/td&gt;
&lt;td&gt;Promover que las variables y las constantes tengan un buen nombre&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pequeños “tydings” cómo los mencionados en este momento quizá no son la panacea para todos los problemas que tiene nuestro proyecto pero nos permiten lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mejorar la legibilidad y el entendimiento del código.&lt;/li&gt;
&lt;li&gt;Analizar el uso de cierta sentencia o resultado pre existente en el código.&lt;/li&gt;
&lt;li&gt;Descubrir areas de mejora.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El software es un ente vivo que cambia constantemente, por lo que es altamente probable que el código que escribimos deba ser modificado o utilizado en otros contextos según lo requiera el proyecto. Es por ello que entre más fácil sea leerlo, más fácil será utilizarlo para resolver nuevos problemas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;El mayor costo del código es el costo de leerlo y entenderlo, no el de escribirlo&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Kent Beck&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Quizá este blog deje muchas preguntas abiertas: ¿Cuándo debo aplicar estos “tidyings”? ¿Todas mis funciones deben ser así de detalladas? ¿Qué pasa cuando no tengo el tiempo para ordenar el código? ¿Y si en vez de ayudar termino dañando algo?&lt;/p&gt;

&lt;p&gt;Estas preguntas son válidas y dan mucho sentido al por qué el libro se llama “Tyding First?” con un signo de interrogación. El autor nos explica en la segunda parte del libro el cuándo y cómo aplicar estos cambios, ideas que me gustaría abordar en un siguiente blog.&lt;/p&gt;

&lt;p&gt;Por ahora, lo más importante que deseo que nos llevemos es que los “Tydings” son este conjunto de pequeñas acciones que nos permiten mejorar la calidad de nuestro código en función de la legibilidad y el entendimiento del mismo, para así evitarle en su medida dolores de cabeza a nuestros principales clientes, los otros desarrolladores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos:
&lt;/h2&gt;

&lt;p&gt;Tidy First, Kent Beck: &lt;a href="https://learning.oreilly.com/library/view/tidy-first/9781098151232/" rel="noopener noreferrer"&gt;https://learning.oreilly.com/library/view/tidy-first/9781098151232/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;SE Radio 615: Kent Beck on “Tidy First”: &lt;a href="https://open.spotify.com/episode/6XHBSDSSuH0xBDz1LeiAUE?si=44cab186651b486d" rel="noopener noreferrer"&gt;https://open.spotify.com/episode/6XHBSDSSuH0xBDz1LeiAUE?si=44cab186651b486d&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cleancode</category>
      <category>refactoring</category>
    </item>
    <item>
      <title>Mis primeras 3 lecciones como Arquitecto de Soluciones</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Mon, 30 Sep 2024 03:56:55 +0000</pubDate>
      <link>https://forem.com/boceto1/mis-primeras-3-lecciones-como-arquitecto-de-soluciones-38g</link>
      <guid>https://forem.com/boceto1/mis-primeras-3-lecciones-como-arquitecto-de-soluciones-38g</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2024/first-3-lessons-solutions-architect/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2024/first-3-lessons-solutions-architect/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;Lección 1: Un nuevo comienzo&lt;/li&gt;
&lt;li&gt;Lección 2: Pregunta, pregunta, pregunta&lt;/li&gt;
&lt;li&gt;Lección 3: El desarrollo no lo harás tú&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Hace un mes mi carrera profesional dio un salto importante, me convertí en Arquitecto de Soluciones. Luego de pasar por el proceso de ascenso, me encontraba listo para empezar este nuevo reto.&lt;/p&gt;

&lt;p&gt;Comencé el primer día con mucha energía, busqué ponerme en contexto lo más pronto posible, revisé la lista de proyectos asignados a mi equipo y me aventuré a tomar un par de ellos.&lt;/p&gt;

&lt;p&gt;A los pocos días ya me encontraba activo, daba mi opinión sobre cómo resolver uno u otro problema, mi agenda estaba llena de reuniones y planifiqué mi primer sprint como líder.&lt;/p&gt;

&lt;p&gt;El resultado de este primer mes ha sido interesante y un poco caótico también. Por ello me gustaría reflexionar un poco acerca de las lecciones que he aprendido en este corto tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lección 1: Un nuevo comienzo
&lt;/h2&gt;

&lt;p&gt;Una de las primeras misiones que me puse fue aprender lo más que pueda sobre mi rol, tengo claro que es ser “desarrollador” pero ¿Que significa ser Arquitecto de Soluciones?&lt;/p&gt;

&lt;p&gt;En esa búsqueda me encontré con el libro “The Art of Leadership, Small Things Done Well” de Michael Loop, líder tecnológico en empresas cómo Netscape, Slack y Apple. De este libro me gustaría citar la frase que me ha acompañado en las últimas semanas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember, management isn’t a promotion, it’s a career restart. Michael Loop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Estar en paz con la idea de que soy nuevo en el cargo ha sido complicado para mí, sé cómo ser un desarrollador, un buen desarrollador. He ganado cierta experiencia que me permite resolver problemas con cierta facilidad o al menos tengo cierta noción de como enfrentarlos. Pero ahora, todo se ve nuevo: la reunión con los Stakeholders, el diseño de arquitecturas en modelo C4, la revisión de métricas, la creación y planificación de historias de usuario, la administración de equipos y la responsabilidad sobre ellos. Todo es nuevo.&lt;/p&gt;

&lt;p&gt;La frase de Loop ha resonado en mí precisamente por esto, y cómo lo explica el libro, un error que todo líder técnico junior comete es precisamente sentir que ha alcanzado un nuevo nivel de juego cuando lo que ha pasado es que ahora está en un juego diferente. &lt;/p&gt;

&lt;p&gt;Esta idea es importante porque nos permite ser conscientes de nuestra falta de experiencia y estar tranquilos con ello, tomar las cosas con calma y cómo pasó al momento de empezar nuestra carrera, estar listos para tomar retos, equivocarse en el proceso y aprende de ello. &lt;/p&gt;

&lt;p&gt;Lo que me lleva a mi segunda lección.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lección 2: Pregunta, pregunta, pregunta
&lt;/h2&gt;

&lt;p&gt;Recuerdo una vez que unos superiores me dijo: &lt;em&gt;“Jean, si no sabes algo pregunta, trata de resolverlo por ti mismo por unos 30 minutos o una hora, pero si no logras, pregunta, todos queremos que esto salga bien”.&lt;/em&gt; Este consejo me ha acompañado a lo largo de los años.&lt;/p&gt;

&lt;p&gt;Cómo lo explico en la sección anterior, las responsabilidades que trae el cargo de Arquitecto de Soluciones va más allá del desarrollo de código, de hecho casi no existe desarrollo, por lo que muchas cosas no vas a saber cómo resolverlas o al menos cómo empezar, ante esta situación pregunta. &lt;/p&gt;

&lt;p&gt;Te piden que consigas los conformes del equipo de seguridades para la iniciativa del equipo, pregunta ¿con quién tengo que hablar? ¿cuál es proceso para recibir los conformes? ¿qué evidencia necesito adjuntar para conseguir la aprobación? ¿debo enviar la evidencia por correo o por mensaje? &lt;/p&gt;

&lt;p&gt;Te piden que planifiques una migración de tecnología pregunta ¿por qué hacemos la migración? ¿qué componentes afectan este cambio? ¿qué tiempo tenemos? ¿quién tanto tiene que revisar este cambio?&lt;/p&gt;

&lt;p&gt;Para ello apóyate de tus compañeros que tienen más experiencia que tú, ellos ya lo vivieron y han aprendido ciertos hacks para que los procesos salgan bien y más rápido. Apóyate de tu equipo, por lo general al inicio ellos tienen más contexto que tú del sistema, de las tecnologías que usan y por qué las usan. Apóyate de tus jefes, ellos te han dado la confianza, lo que significa que son conscientes de tus habilidades, pero también de lo mucho que tienes que aprender.&lt;/p&gt;

&lt;p&gt;Y cómo decía mi compañero, por lo general a todos nos interesa que nos vaya bien, de ello depende nuestro trabajo. Así que pregunta, que por lo general todos están dispuestos a darte una mano.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lección 3: El desarrollo no lo harás tú
&lt;/h2&gt;

&lt;p&gt;Finalmente, un último gran aprendizaje que tuve este mes fue entender que el desarrollo no lo haré yo. La inercia hace difícil dejar de lado el impulso de ir por el código y programar las soluciones propuestas, pero esto no es lo más saludable, ¿por qué? &lt;/p&gt;

&lt;p&gt;En primer lugar, tienes otras responsabilidades, por lo que a menos de que trabajes más de tus ocho horas o descuides tus principales responsabilidades, te convertirás en un cuello de botella para el equipo, cómo lo comenta Michael Loop en su libro.&lt;/p&gt;

&lt;p&gt;Además, estarás descartando las ideas de los otros miembros del equipo que, por un lado, pueden contar con una mejor solución técnica al problema o por el otro necesitan trabajar en esta iniciativa para ganar experiencia y volverse mejores en su trabajo. &lt;/p&gt;

&lt;p&gt;Esta idea también es importante  tenerla en cuenta al momento de crear las historias de usuario y planificar el trabajo. Entender que el desarrollo no lo harás tú evitarás que subestimes o sobreestimes el tiempo que toma una tarea. Busca conocer a tu equipo, identifica cuáles son sus puntos fuertes y de mejora, planifica para ellos y busca su crecimiento, eso es parte de tu trabajo.&lt;/p&gt;

&lt;p&gt;Finalmente, busca espacios para seguir practicando: pet projects, automatizaciones, cursos, hackatones, code reviews. La idea detrás de esto es simple, no pierdas la práctica. El desarrollo te ha llevado a tu puesto, además es el corazón y los cimientos de toda tu carrera.&lt;/p&gt;

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

&lt;p&gt;Me falta mucho por aprender y cuatro semanas de trabajo no me vuelven un Arquitecto de Soluciones Senior, pero considero que estas primeras lecciones me acompañaran a lo largo de mi carrera y espero que puedan guiar a otros que están viviendo una experiencia similar a la mía. &lt;/p&gt;

&lt;p&gt;Recuerda que este es nuevo comienzo, no te canses de preguntar y ten siempre en mente que ahora el desarrollo no lo haces tú.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Art-Leadership-Small-Things-Done/dp/1492045691" rel="noopener noreferrer"&gt;The Art of Leadership: Small Things, Done Well&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>leadership</category>
      <category>solutionsarchitect</category>
    </item>
    <item>
      <title>¿Cómo funciona la función bisect en JS?</title>
      <dc:creator>Jean Karlo Obando Ramos</dc:creator>
      <pubDate>Thu, 22 Jun 2023 17:18:00 +0000</pubDate>
      <link>https://forem.com/boceto1/como-funciona-la-funcion-bisect-en-js-33</link>
      <guid>https://forem.com/boceto1/como-funciona-la-funcion-bisect-en-js-33</guid>
      <description>&lt;p&gt;Originalmente publicado en: &lt;a href="https://blog.jeankaobando.com/blog/2023/bisect/" rel="noopener noreferrer"&gt;https://blog.jeankaobando.com/blog/2023/bisect/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;Binary Search&lt;/li&gt;
&lt;li&gt;Función Bisect&lt;/li&gt;
&lt;li&gt;Aplicando Bisect&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Recursos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mientras trabajaba en un ejercicio de algoritmos, me encontré con la siguiente situación: necesitaba determinar si dentro de un arreglo de posiciones de un carácter dentro en un string existía un valor después de una posición dada. 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="c1"&gt;// Existe un caracter "a" en el string después de la posición 4?&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aaabbabc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;aPos&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&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;targetPosition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Una manera sencilla de resolver este problema es la siguiente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Iterar a través del arreglo&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comparar si el número es menor que el valor que se busca.&lt;/p&gt;

&lt;p&gt;2.1.  Si es menor avanzar al siguiente número&lt;/p&gt;

&lt;p&gt;2.2.  Si es igual retornar la siguiente posición. Si la siguiente posición es mayor o igual al tamaño del arreglo retornar -1&lt;/p&gt;

&lt;p&gt;2.3   Si es mayor retornar la actual posición.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Si se itera todo el arreglo, significa que no existe esa posición, entonces retornar -1.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aquí está la implementación:&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;getNextPositionAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;pos&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;positions&lt;/span&gt;&lt;span class="p"&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;pos&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;targetPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;positions&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;pos&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="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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;pos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;targetPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;pos&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="k"&gt;return&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="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getNextPositionAfter&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="c1"&gt;// 5&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getNextPositionAfter&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// -1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getNextPositionAfter&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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;// 2&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getNextPositionAfter&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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;// -1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si analizamos la función vemos que la complejidad de tiempo es 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(n)O(n) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
. Y he aquí la pregunta de siempre, lo podemos hacer mejor? Pues sí, de hecho estamos obviando una caracteristica importante del arreglo, está &lt;strong&gt;ordenado&lt;/strong&gt;. Eso significa que podemos intentar aplicar Binary Search o algún algoritmo similar a este.&lt;/p&gt;
&lt;h2&gt;
  
  
  Binary Search
&lt;/h2&gt;

&lt;p&gt;Recordemos brevemente la definición del algoritmo Binary Search.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;El algoritmo de búsqueda Binary Search define que dentro de un arreglo de datos ordenados, podemos analizar el elemento de la mitad, si es el elemento que busco retorno su índice, caso contrario verifico si el valor de la mitad es menor al elemento que busco. Si la sentencia es verdera descarto de mi busqueda el lado derecho, si es falsa el lado izquierdo de mi arreglo. Y así hasta encontrar mi valor o quedarme sin elementos por analizar. Su complejidad es 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(logn)O(log n) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
. Mira más información &lt;a href="https://www.geeksforgeeks.org/binary-search/" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Su implementación sería la siguiente:&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;binarySearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;startIdx&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&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="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;endIdx&lt;/span&gt;&lt;span class="p"&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;midIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;startIdx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&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;midValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;midIdx&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;target&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;midValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;midIdx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;target&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;midValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;midValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;midValue&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="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;binarySearch&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="c1"&gt;// 2&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;binarySearch&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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;// 3&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;binarySearch&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// -1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;binarySearch&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="c1"&gt;// -1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos aplicar Binary Search a nuestro problema inicial? La respuesta es no ... todavía.&lt;br&gt;
Nuestro problema exige no solamente que encontremos un valor, sino que retornemos la posición siguiente a un valor dado.&lt;br&gt;
Si puedo plantear el problema en otras palabras puedo decir que lo que buscamos es:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Encontrar la posición en la que podemos insertar un elemento dado de tal manera que la lista siga ordenada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bajo esta premisa, me encontré que existe una función en Python que hace precisamente esto y está basada en Binary Search.&lt;/p&gt;
&lt;h2&gt;
  
  
  Función Bisect
&lt;/h2&gt;

&lt;p&gt;Si vamos a la documentación de Python nos indica lo siguiente acerca de bisect.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bisect provee un soporte para mantener listas ordenadas sin la necesidad de hacer un reordenamiento después de un inserción.&lt;br&gt;
Más información &lt;a href="https://docs.python.org/3/library/bisect.html#module-bisect" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Veamos a continuación cómo funciona:&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bisect&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;bisect&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisect&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="c1"&gt;# 3
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisect&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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;# 4
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisect&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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;# 2
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisect&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 4
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisect&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&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="c1"&gt;# 0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si analizamos las salidas, podemos concluir lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si encuentra que el elemento es mayor o igual al valor que está analizando, devuelve su valor + 1, para mantener la lista ordenada&lt;/li&gt;
&lt;li&gt;Si el elemento es mayor el último valor del arreglo, retorna como índice el tamaño del arreglo&lt;/li&gt;
&lt;li&gt;Si el elemento es menor al primer valor del arreglo, retorna 0 como índice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cabe destacar que cuando el elemento está en la lista, no necesariamente debe devolverse el índice a la derecha, también puede ser el índice a la izquierda. Es por ello que Python define otras dos funciones denominadas &lt;code&gt;bisect_left&lt;/code&gt; y &lt;code&gt;bisect_right&lt;/code&gt;. Por defecto &lt;code&gt;bisect&lt;/code&gt; funciona cómo &lt;code&gt;bisect_right&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lamentablemente, estas funciones no están implementadas en Javascript, por lo que procedemos a hacer nuestra propia implementación usando como base la función Binary Search. Empecemos con &lt;code&gt;bisect_right&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisect Right
&lt;/h3&gt;

&lt;p&gt;Si observamos bien la función Binary Search, lo que hace es acortar el rango de valores a analizar moviendo valores por la izquierda y la derecha. Esta acción produce que si el valor no se encuentra presente en la lista, el valor de &lt;code&gt;startIdx&lt;/code&gt; va a ser el índice dónde debería estar ese valor.&lt;/p&gt;

&lt;p&gt;Ejemplo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tomemos el arreglo [0, 1, 2, 5] y digamos que debemos insertar el valor 4;&lt;/li&gt;
&lt;li&gt;Analizemos cómo se compartaría binary search.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;startIdx&lt;/th&gt;
&lt;th&gt;endIdx&lt;/th&gt;
&lt;th&gt;midIdx&lt;/th&gt;
&lt;th&gt;midValue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;La respuesta sería falso.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sin embargo &lt;code&gt;startIdx&lt;/code&gt; (&lt;code&gt;endIdx&lt;/code&gt; también) tiene el índice dónde debería estar 4, que es la posición 3. Esto es justamente lo que necesitamos para implementar bisect_right usando binary search.&lt;/p&gt;

&lt;p&gt;Haciendo algunos cambios al algoritmo inicial, el resultado que tenemos es el siguiente.&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;bisectRight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;startIdx&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&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="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;endIdx&lt;/span&gt;&lt;span class="p"&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;midIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;startIdx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&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;midValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;midIdx&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;target&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;midValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;midIdx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;midIdx&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="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;startIdx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectRight&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="c1"&gt;// 3&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectRight&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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;// 4&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectRight&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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;// 2&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectRight&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectRight&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&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="c1"&gt;// 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como se ve en el código, ya no tenemos la sentencia para verificar si el valor se encuentra en el arreglo. Lo que tratamos es forzar que el startIdx nos indique la posición en la que debería estar un valor dado en el arreglo.&lt;/p&gt;

&lt;p&gt;Qué pasa si el valor está en el arreglo? Pues cómo se ve la sección &lt;code&gt;else&lt;/code&gt; del algoritmo, el índice retornado será el de la derecha &lt;code&gt;startIdx = midIdx + 1;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisect Left
&lt;/h3&gt;

&lt;p&gt;Ahora que pasa si lo que nos piden es devolver el índice a la izquierda del valor dado. Simple, evitamos que si el valor se encuentra en el arreglo se aumente el índice en 1, para ello hacemos el siguiente cambio en el algoritmo: &lt;code&gt;if (target &amp;lt;= midValue)&lt;/code&gt; de tal modo que el resultado sería el siguiente:&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;bisectLeft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;startIdx&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&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="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;endIdx&lt;/span&gt;&lt;span class="p"&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;midIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;startIdx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&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;midValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;midIdx&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;target&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;midValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;endIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;midIdx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;startIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;midIdx&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="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;startIdx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectLeft&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="c1"&gt;// 3&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectLeft&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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;// 3&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectLeft&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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;// 1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectLeft&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bisectLeft&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&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="c1"&gt;// 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Aplicando Bisect
&lt;/h2&gt;

&lt;p&gt;Cool!! Ahora que tenemos claro cómo funciona bisect, apliquémoslo a nuestro problema inicial.&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="c1"&gt;// Existe un caracter "a" en el string después de la posición 4?&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aaabbabc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;aPos&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&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;targetPosition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El algoritmo sería el siguiente:&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;getNextPositionAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;nextIdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bisectRight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetPosition&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;nextIdx&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;positions&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="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;nextIdx&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getNextPositionAfter&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="c1"&gt;// 5&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getNextPositionAfter&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// -1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getNextPositionAfter&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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;// 2&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getNextPositionAfter&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&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;// -1&lt;/span&gt;

&lt;span class="c1"&gt;// Aquí debería estar implementado bisectRight&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom!!! Tenemos una nueva solución para nuestro problema inicial, el cual tiene una complejidad de tiempo de 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(logn)O(log n) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, que es mucho mejor a 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;O(n)O(n) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, cómo se puede ver en la siguiente gráfica.&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%2F4fj3g8b0z35hg3i3633y.jpg" 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%2F4fj3g8b0z35hg3i3633y.jpg" alt="Análisis de Complejidad de las Soluciones" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;La función bisect nos permite identificar la posición en la que debería ir un valor si fuera agregado a una lista.&lt;/li&gt;
&lt;li&gt;Siempre debemos estar atentos a los datos ocultos de un problema, en este caso el saber que el arreglo es ordenado nos permitió aplicar bisect, lo que redujo la complejidad de nuestro problema significativamente.&lt;/li&gt;
&lt;li&gt;Si una función no está implementada en tu lenguaje, siempre puedes implementarla tú :D.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Binary Search: &lt;a href="https://www.geeksforgeeks.org/binary-search/" rel="noopener noreferrer"&gt;https://www.geeksforgeeks.org/binary-search/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentación acerca de Bisect en Python: &lt;a href="https://docs.python.org/3/library/bisect.html#module-bisect" rel="noopener noreferrer"&gt;https://docs.python.org/3/library/bisect.html#module-bisect&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>computerscience</category>
      <category>algoritmos</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
