<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Feed RSS de Decodifique Blog]]></title><description><![CDATA[Discussões sobre temas de Engenharia e Arquitetura de Software]]></description><link>https://blog.decodifique.com</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 29 Sep 2026 20:15:52 GMT</lastBuildDate><item><title><![CDATA[Mi Midpoint de Carrera, Parte II]]></title><description><![CDATA[Prólogo: Peritos y corsarios En mi último año de universidad, conversando con una compañera de clase, ella me contó que había estado…]]></description><link>https://blog.decodifique.com/es/meu-midpoint-de-carreira-parte-2/</link><guid isPermaLink="false">https://blog.decodifique.com/es/meu-midpoint-de-carreira-parte-2/</guid><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;prologo-peritos-y-corsarios&quot;&gt;Prólogo: Peritos y corsarios&lt;/h2&gt;
&lt;p&gt;En mi último año de universidad, conversando con una compañera de clase, ella me contó que había estado trabajando en una startup de tecnología de seguridad biométrica, y que estaban buscando un programador .NET para desarrollar software usando esa tecnología en totems de atención, &lt;em&gt;sign-in&lt;/em&gt; de sistemas web y aplicaciones &lt;em&gt;mobile&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;En ese momento, yo ya estaba trabajando en la Policía Tecnocientífica de São Paulo como programador web, en un sistema de GED (Gestión Electrónica de Documentos) construido en &lt;strong&gt;CakePHP&lt;/strong&gt; y &lt;strong&gt;MongoDB&lt;/strong&gt;, aunque ya tenía mis dudas de que fuera a durar mucho ahí. Me explico: había dejado una consultora que tenía un framework propio para ahora trabajar con una tecnología tampoco muy atractiva para el mercado, como PHP.&lt;/p&gt;
&lt;p&gt;Como la oficina en Faria Lima quedaba cerca de la Superintendencia, negocié con el gerente de la empresa de biometría trabajar &lt;em&gt;part-time&lt;/em&gt;, en el turno de tarde/noche, conciliando así con la Superintendencia por la mañana y principio de la tarde.&lt;/p&gt;
&lt;p&gt;Mi negociación fue positiva, y seguí en ese ritmo de doble jornada durante seis meses, hasta que, cierto día, viví en la Superintendencia un momento bastante peculiar del sector público: el proceso licitatorio. El contrato de la consultora de software tercerizada estaba por vencer, y se abriría una nueva licitación para elegir quién asumiría el servicio de ahí en adelante. Esa incertidumbre sobre quién ganaría la licitación llevaba semanas pesando sobre todos los tercerizados, generando toda clase de expectativas y temores, sobre todo el miedo a la falta de continuidad en el proyecto. Una nueva empresa ganó la licitación que se había abierto. La ganadora podía optar o no por recontratar a los tercerizados que ya estaban ahí, pero no fue lo que ocurrió. Ante eso, la empresa a la que yo estaba vinculado me dio dos opciones: enviarme a un proyecto en Alphaville, en Barueri, o mi despido. Opté por la segunda.&lt;/p&gt;
&lt;h2 id=&quot;por-fin-el-tio-bill-pagando-las-cuentas&quot;&gt;Por fin, el Tío Bill pagando las cuentas&lt;/h2&gt;
&lt;p&gt;Una vez liberado, pasé a trabajar &lt;em&gt;fulltime&lt;/em&gt; en la startup, a inicios de 2016, mi primera experiencia también como autónomo (Persona Jurídica). Después de una mudanza de oficina a Vila Olímpia, estuve en el centro del &lt;em&gt;boom&lt;/em&gt; de las startups e hice un gran &lt;em&gt;networking&lt;/em&gt; con diversas empresas, de los sectores farmacéutico, hospitalario, fintech y de otros productos digitales en auge en la época, como criptomonedas, brokers de activos en el exterior y toda clase de plataformas de &lt;em&gt;sharing economy&lt;/em&gt;, a la estela de Uber, en busca de convertirse en unicornios, con mucha inyección de capital de &lt;em&gt;private equity&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Las empresas unicornio &quot;son start-ups (empresas incipientes con un modelo de negocio repetible y escalable por medio de la tecnología) que alcanzaron un valor de mercado de US$ 1.000 millones, como mínimo&quot; [1].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En ese período, también comencé un MBA (Master of Business Administration) en Ingeniería de Software en la Universidad de São Paulo, en la Escuela Politécnica, pero no entraré en más detalles para no abrir un enorme paréntesis en este prólogo; solo vale mencionar que el objetivo del MBA era obtener el título de posgrado &lt;em&gt;lato sensu&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Durante mi tiempo en la startup, me encontré con desafíos mucho más interesantes que los anteriores: empecé a adoptar de verdad el uso de Git en mi &lt;em&gt;workflow&lt;/em&gt; de trabajo y por fin pude trabajar con todo, y solamente, el &lt;em&gt;stack&lt;/em&gt; Microsoft .NET: &lt;strong&gt;Windows Forms&lt;/strong&gt;, en esa época en las versiones 4.6.x, C#, APIs REST (Application Programming Interfaces / Representational State Transfer) en ASP.NET MVC Web API, y &lt;strong&gt;WPF (Windows Presentation Foundation)&lt;/strong&gt;. Vayamos por partes:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAACD0lEQVR42o2Q7W/SUBTG+5+auBi2xRi/76tffVnm2IybmasyJ8uU8bI1rGNIlfcxhry1BYS2w0JbStsLbWl7vSiJ+2LiL+eenNybJ+c+D0ZSFeKyTFLf00UmU2SyJZbK01S2QeVQp1O55rcCmyu18+Vu/rpZpzsNVqDbt4UbNv21gYWJNH5MfgwnA8fxtx8i+GH0NR7awUO7705234ffBMJ7B9H9w9O9g1jwUySfO7+6SpSK8WY1niCjGIRQ17QJAIYBdB0AMLkDmF8jdAPNqSKdrAjJmnRRU0q3syOqhcSeqqr6b1zXhXewbVvTNH2BVmX4a5qvtEVh7EkmzFS5/xWjodURbMt0Z5bneei11eHn31bV8T/FuqYbSIr8GOlCNVOsBSOpbTyK6skLHIldWZbQgsUOZHB+kH8D3YwXaCiAiy/5o5PzEJH9fJYmkuX9IIkBbcT3OtJQluWxKCqDoSLJsjgYyLIiScpQmveRqolD+abKAEOHHpxOpp7rMGwPc2x7zPW57rTTm7V+WN2e1eNNhjWEvqmo9sS0wRSVpYNpneEd17Md17QdZKrOdOeeneHA+DkR+1ASoSrDkQR1FQINziyU5t8IOE6wzQn0vD/RtNoc9nD7dHUjsoan1gLZR6/I+8/Cvo3oiv9seTPu2yR9LxM+f2Jl63LZn7j3NLb0PPZgnVjduni8k1paJ34Bdwo6t23Hlo0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;wpf designer visual studio&quot;
        title=&quot;Figura 1. El diseñador visual de WPF en Visual Studio, con el XAML de la MainWindow a la izquierda y la vista previa de la interfaz a la derecha.&quot;
        src=&quot;/static/3864c86ee233cd585eb4e496c4aac6f1/f058b/wpf-designer-visual-studio.png&quot;
        srcset=&quot;/static/3864c86ee233cd585eb4e496c4aac6f1/c26ae/wpf-designer-visual-studio.png 158w,
/static/3864c86ee233cd585eb4e496c4aac6f1/6bdcf/wpf-designer-visual-studio.png 315w,
/static/3864c86ee233cd585eb4e496c4aac6f1/f058b/wpf-designer-visual-studio.png 630w,
/static/3864c86ee233cd585eb4e496c4aac6f1/40601/wpf-designer-visual-studio.png 945w,
/static/3864c86ee233cd585eb4e496c4aac6f1/78612/wpf-designer-visual-studio.png 1260w,
/static/3864c86ee233cd585eb4e496c4aac6f1/ad00e/wpf-designer-visual-studio.png 1366w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 1. El diseñador visual de WPF en Visual Studio, con el XAML de la MainWindow a la izquierda y la vista previa de la interfaz a la derecha.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET Framework: framework de desarrollo de Microsoft, exclusivo para Windows, base de las tecnologías de abajo.&lt;/li&gt;
&lt;li&gt;Windows Forms: framework para la construcción de interfaces gráficas para aplicaciones Windows, estilo &lt;em&gt;drag-and-drop&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;C#: lenguaje de programación orientado a objetos de tipado fuerte desarrollado por Microsoft.&lt;/li&gt;
&lt;li&gt;ASP.NET MVC: framework web para la construcción de páginas web mediante la sintaxis de marcado Razor; APIs SOAP (Simple Object Access Protocol), con la extensión WCF (Windows Communication Foundation), o REST, con la extensión Web API.&lt;/li&gt;
&lt;li&gt;WPF: framework para la construcción de interfaces gráficas que vendría a sustituir a Windows Forms, también con estilo &lt;em&gt;drag-and-drop&lt;/em&gt;, pero con una sintaxis de marcado mediante el lenguaje XAML (Extensible Application Markup Language), basado en XML.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAIAAADzvTiPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGcElEQVR42iWUe1CTVxrGT2G3oCvgth3WyxarxaqoxRJFAxguyRII1xAuiUQuLpAQSACBYAySBAUCCblBgNzzhUACDBQrQduimMisl1UKajuzs2NLUSASaIUtkMAq+9Gd+c0zz3nOec/7z3kPuDKxgBudJdjm8FY73mZPvWdPtdkvjS+k2+x469z/SbHNpcMHxubLrT9RajvxTHVyhZKnGgZhN1+5Gad29k779E5vN027d/4IoBeIoZk/GH/abp72Mv+83TTl0TX1nv4FME4HaMYPYFn+KVfdgxnInGaAHpk5MjSLuDkXOTKPvGXfP/jS0zSFvDXj0/Pz6Vv2sG/s6JHXiOE5z+4pt56Xgfrvgkl1yVXaXbHVaFoLOPv1vE/f64+vz/tdd+wZmA8YWvQ0zX1x47VH1+yeQcfeLx0fDzr2XV/4o3EOdL0+pnu+L/rSX+O5IIiOokgB/f4LxFeTqOFnIZbnYZbvYc4OP6eO/Rg5/Pty+PtQyxaRw89QX/+QfWM8plCKyBYcJ9YX1HWD9e9i1u+4b1h3btz1Wrd6r2+pj2s80mX7aMPqs2Hz2bB6wazd/XBzzPPZzQS/ZIFvdKV3eHlyhQK4HqOct4HL6u2y7nSO/sl119s5ApwPEa47HusPD60/+Gz90fGNxydXbr+/eRc86kftJ4hwjBZfLCssTwScT/7m/MdB55Mo55Nw54Mg2Kze9lh7eGZtdIfrMdL1z2CnzXd11Ou3kW1w8ZNBtF+SEEOT/DmKGUmVgrcToe9Gwbt77m9t4O09sKU28N/xk2/H3Dfve24+2PZuzA1ONmxum/fBpCXcG33NF1MJgorCKRLw7yHJhIr6VF/6VFvyVFcC66SG/q8bzZPakglV4YSaNqmlP9UyJrQlP2hpd7qEaLridHbjF2Q+rdEMzGUWPlIpwuikWIME2ynGGpqjIWPxkDjWIEs2SeKNzRidOBoSYiExWt+UZ/bPqP0kgeOFKo9lyMFAVa8+W9NXYmqLk7THS9vipS1xEjOjS5Eq77vYYyyA2hNlbUkyaZy4LVbEz1Mey2okMLW7YtjhBWLQX25WpsgNOepWrKgNK27DilqwzebiTvgWQ67GmK/vLjSo0tvF0cJWjLDp74rdSZyjGQ3gFB0FF1/nWFoTFMp0nYqoU8OQDAqifoB9Q0nSKUh6xTmog6hTEHUdmZAqXS8v7wnM4h8h1O6OYaVdUoN5E/1l/amZxpDZ9tQZZeYrPvJVY4hdRZxTnNvy/NBZBXG2gzjdEOIQIB91lATnyw8TuP547oVaI1hWhLypcV+65rPUuGdJcmiJ6/GG8/5So99S86dvOJ6/VrstC/Yti/x/rftovX7HGC90b4owiirZGcU8kysEv6iiFkUBizKEo8l/QYZYlAUtNB92CA85REcXxJ87GvwcgoO/yE8varCrbYFjdej96WJcSfuHGFYkVQLWVBErlWClCqwJPl0RH1uuAL9VgVWB/6o44D+VYJkJ1po/c0qOrvA+2OR5PK6P+gBX/0lc9XunGJFUGbh3i92rwQ1CKf1GoqU3/1tzdr8uaaArc6CbDIejfXmDpvMDXef61fFfQXF95iu4Mu3pnKaTWY10YS+oGaBnq+OpnRm5mvh8bRJVn5ajTijqJBZ3ErNUuNLu7BwVjmbIoBnJ+VBiXjvFD3d1L+7yDlQ5hiYD9X2UYmV0pT6lQocv1yaXaRLoKmylHl8FEfLlKLaRVKyM+X03pUgVQWvJPZDET2NpDqfXoQtbgMzConRgSrWJxXAfbRITbqKMKVLGwspQJ1w2ZsI5XR3PUCeW6XFVmsozuS0nyPyDhGukagjwegrSBCfIUuQFeWQFlFGqI1zUpZbpCEwDiaFJKtXhYZPbGp4pRpKliMLWvN3Y2giq1B/Pi4CnSmIpK1ShyqCYixCupofI6SXV9JLYpjROD+lKTwbbnM7rI5cb4hhabBkUxdTSd2N5J7Oa4Le9Nc/FQnXwBVYEjRNZxAktYIcWXA6jXA4pYCPzYcNGFV4JpbDPUmvCCzlnKdXEatn+RK5vNGtbWDm2WA7CskXgYD74vGgXpvo4sekwgb8PxzuU0hBIFASRRcczBIEk4YGEq24n6OAI9Rjh2l+wLHCCBgLyt74hntpCuKQic/SZHP15LkTmGsgcKKe2Eyb3qvE815DFheAc3iWyNVUtX1IazBlsLZ6p4igt/wPYaiUx4412RQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;net framework 45&quot;
        title=&quot;Figura 2. La evolución del .NET Framework: cada versión fue apilando nuevas bibliotecas sobre el Common Language Runtime.&quot;
        src=&quot;/static/b0d57f472d817c127e8b44020eb8298d/f058b/net-framework-45.png&quot;
        srcset=&quot;/static/b0d57f472d817c127e8b44020eb8298d/c26ae/net-framework-45.png 158w,
/static/b0d57f472d817c127e8b44020eb8298d/6bdcf/net-framework-45.png 315w,
/static/b0d57f472d817c127e8b44020eb8298d/f058b/net-framework-45.png 630w,
/static/b0d57f472d817c127e8b44020eb8298d/1cfc2/net-framework-45.png 900w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 2. La evolución del .NET Framework: cada versión fue apilando nuevas bibliotecas sobre el Common Language Runtime.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Fue exactamente ahí donde me encontré, trabajando con las herramientas por las que sentía verdadero interés, en un período de intenso aprendizaje en tecnología, tanto por trabajar en lo que me gustaba como por estar en un entorno donde, con prácticamente ningún equipo, solo estaba yo como programador &lt;em&gt;backend&lt;/em&gt; y un colega responsable del desarrollo de las aplicaciones Android. Tenía total libertad creativa para decidir cómo aplicar técnicas de ingeniería nuevas para mí, como pruebas automatizadas (unitarias, de &lt;em&gt;stress&lt;/em&gt; e integradas) y principios de diseño, como SOLID y proyectos con separación en capas. También fue en esos años que empecé a tener contacto con una mayor riqueza de lecturas, como la serie &lt;em&gt;The Pragmatic Programmer&lt;/em&gt;, de &lt;strong&gt;Andy Hunt&lt;/strong&gt; y &lt;strong&gt;Dave Thomas&lt;/strong&gt;, y los libros de &lt;strong&gt;Robert C. Martin&lt;/strong&gt;, &lt;em&gt;The Clean Coder&lt;/em&gt; y &lt;em&gt;Clean Code&lt;/em&gt;. También fue en ese período que participé en muchos eventos de tecnología, como el TDC (The Developers Conference) y varios &lt;em&gt;meetups&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pasados algunos meses, tras enfrentar ciertos obstáculos personales, de común acuerdo con la gestión de la empresa, optamos por rescindir el contrato de prestación de servicios que yo ofrecía, y volví una vez más a sondear el mercado &lt;img src=&quot;/florzinha-easter-egg.png&quot; alt=&quot;🌼&quot; class=&quot;emoji-icon&quot; /&gt;. Con una experiencia y un bagaje considerablemente mayores, ahora con fluidez en el &lt;em&gt;stack&lt;/em&gt; Microsoft, me reubiqué rápidamente, esta vez en una consultora cuya área principal de actuación era el sector de seguros, y así fui asignado a uno de sus mayores clientes.&lt;/p&gt;
&lt;h2 id=&quot;orquestando-la-sopa-de-letras&quot;&gt;Orquestando la sopa de letras&lt;/h2&gt;
&lt;p&gt;El cambio, a partir del segundo semestre de 2016, fue grande: salir del mundo de las startups para mi primera experiencia en el mundo corporativo, con burocracia, procesos, integraciones de sistemas con décadas de existencia, decenas de equipos solo en TI, y tecnología restringida a un selecto grupo de empresas, con un conocimiento igualmente secreto, como una secta. Aunque había desarrollado el conocimiento técnico de la experiencia anterior, la falta de equipo me dejó débil en habilidades políticas y de trabajo en equipo. Ahora tendría que trabajar con desarrolladores mucho más experimentados que yo y con un conocimiento ya consolidado en el área de negocio, especialmente en lo que respecta a las reglas de siniestros.&lt;/p&gt;
&lt;p&gt;Por tener un buen dominio de .NET y aprender rápido, fui elegido para participar en un proyecto de gran visibilidad en la compañía: la implementación de la plataforma &lt;strong&gt;Oracle SOA Suite (Service-Oriented Architecture)&lt;/strong&gt;, gestionando y orquestando las integraciones entre los diversos módulos de siniestros, y la creación de una interfaz de &lt;em&gt;workflows&lt;/em&gt; para que los analistas y la cadena de aprobaciones pudieran analizar, evaluar y resolver sobre procesos de siniestros e indemnizaciones.&lt;/p&gt;
&lt;p&gt;Fue un proyecto bastante complejo, ya que implicaba migrar reglas de negocio de un sistema &lt;em&gt;in-company&lt;/em&gt; monolítico, construido en parte en VB.NET y en parte en ASP (Active Server Pages, algo que ya pensaba que no volvería a ver, cosa de finales de los años 90), hacia los componentes de la plataforma Java J2EE (Java 2 Platform, Enterprise Edition), como &lt;em&gt;servlets&lt;/em&gt; y EJB (Enterprise JavaBeans), y hacia el propio &lt;em&gt;middleware&lt;/em&gt;: las interfaces ADF (Application Development Framework) para las &lt;em&gt;Human Tasks&lt;/em&gt; (una versión de Oracle de las JSF, &lt;em&gt;JavaServer Faces&lt;/em&gt;), los &lt;em&gt;Mediators&lt;/em&gt;, para el enrutamiento, filtrado y transformación de datos entre diferentes componentes, los BPEL (Business Process Execution Language) y BPMN (Business Process Model and Notation) para la orquestación de servicios y tareas, y las &lt;em&gt;Business Rules&lt;/em&gt;, para la elaboración de un conjunto de reglas ejecutadas en &lt;em&gt;runtime&lt;/em&gt;, por separado del código de la aplicación. Sin hablar de la integración con sistemas heredados vía SOAP (Simple Object Access Protocol), el WCF de nuevo, y toda su especificación en XML: XSD, XSLT y XPath. Lo confieso: es una ensalada de letras y términos. Pero va más allá: todo esto interconectado a bases de datos &lt;em&gt;on-premises&lt;/em&gt; Oracle 11c o 12c y versionado en parte en SVN (Apache Subversion) y en parte en Microsoft TFS (Team Foundation Server), ambos modelos centralizados de control de versiones.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACZ0lEQVR42iWOWbKjNhRA2f8Ksob8ZAeppNLpfn62HyAk0ISZR2EGYWYwra6uuh+qWzr3HO3f//WbFXx8EYSACen3KzAc/O0L/9Dxf9+ulysCiDs0Ahb7cTE+Pi0LPahbYJYbwNUMxBF2k0ws81SINgjzLM+jrJRykE0rRF2IZln3qhkcpEPL8tMxKsZEzJBVWid7TCGjeF2Xqpu8tD3P89i38TXMy3Ls+7rMatMNG7AjwiIv6ZNqSZ+L9ei0Yz+edWZCXXayey1B2pzne13WXvbrPGXtgpJewXI47pZlQCsRe1RMWbUC3mqvcazq9kuHmNAwzpJETOPUy6FuxuM43Kz9bicK7se3Ae+E22n1VtmpWKnfaTZgvpsSllGvRCSJY9HL7lnLphlU8vk+12VSLf24mXZA3CypNmVOxOKFUvv7xv7EFS1GP6jcoM7zZtu2eZqlnBRpBu1fF/c8dznsV+jeLRKkgyLVPMJe+wd+/gFMKp7n+xinWTlV5L6t27r+qh1GUXfqMU77HTFAvFDBpYJXZdIS91I+nKaq1Q/lTLK6ateiXnLxKp69aKamGzs5lWULgXP9/LoaBOAA88JEvhYHBuNOUYpfwn0nPEI0sGmASGwiDzgpojnmJeWF7UTIDhBLdcS5J7hfaUUMAo/UTfMbtkmoWwySwE+lG7aPqOVhQz1BvYo8hM1zh+fYLSFN7gbTHi5n3IviMi+aup2h7d10567jy83UAf24WZYTxsUSFbOfvFQC82t1iHkVwrEGbG7TyGEFJJnDhQkZxNyyuWE5zE0xTdmj9KPu9wSx9CMZxhKxGCDvJzJsuk0IM1yvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;oracle bpel exemplo&quot;
        title=&quot;Figura 3. Un proceso BPEL en Oracle JDeveloper, orquestando las llamadas entre servicios.&quot;
        src=&quot;/static/26224eceb1bb1c147be019b82a6c15c4/f058b/oracle-bpel-exemplo.png&quot;
        srcset=&quot;/static/26224eceb1bb1c147be019b82a6c15c4/c26ae/oracle-bpel-exemplo.png 158w,
/static/26224eceb1bb1c147be019b82a6c15c4/6bdcf/oracle-bpel-exemplo.png 315w,
/static/26224eceb1bb1c147be019b82a6c15c4/f058b/oracle-bpel-exemplo.png 630w,
/static/26224eceb1bb1c147be019b82a6c15c4/94829/oracle-bpel-exemplo.png 878w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 3. Un proceso BPEL en Oracle JDeveloper, orquestando las llamadas entre servicios.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;el-salto-de-calidad&quot;&gt;El salto de calidad&lt;/h2&gt;
&lt;p&gt;Me fue bien, y dominar rápido ese &lt;em&gt;stack enterprise&lt;/em&gt; de Oracle me trajo reconocimiento. Mi situación mejoró: recibí una propuesta para pasar a planilla de la compañía, a mediados de 2017, dejando de ser tercerizado y pasando a disfrutar de un plan de carrera y mejores beneficios. Aprovechando esa mejora, llegó por fin el momento de dejar mi pequeño apartamento y alquilar mi primer apartamento de verdad. También terminé mi MBA y, cuando me sorprendía reflexionando sobre todo lo que había pasado, me daba cuenta de que, en ese momento, la vida realmente había dado un gran salto de calidad.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 123.41772151898734%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFDklEQVR42pVS+VcTVxSe/6Ye21I9LogCBiJg0ABCiYTFDY9UQcmRolBAVAw1GJUgIqC4IBZFWxXcKFAgEohiSMxGZkL2STJJJpOFJJOYhPQBPa1tT3/o/eGe+5bvfd/77oXi1m3aGJ+YkJiyPTUjIzM7J68gO5fR3dMrU2lnZqV8wYehqbmZpnOurWscGfE4dQOess5HibtTXnGIVQdt2pIEkMmpGWk76Vl7GAVFB5jFpRzuNcxBaA0osqCX6K0a3hXvrgT70UL8wB60MNNFi2fvpiXQsqFtydTE7Tuo6bsy6bkM5r7DZZUVrNqmi1cXfYuxWMzn8+vMtvG+Bw9LmN176B1ZNAWPa+jgNR6vTKFlQalpmSk7aPScfEbh/tIjFccqqqtqz9acaR75bfLdB/HA0xe8jp4GDq+8rvkg64eCMpZoXg3bPaPTYt6NO1BKGi2RQt2WTEnaTqWmZeYyiipO1nxfe5ZVXdd+s4/XeZfT2tXMbT9zvuVkVX0lq1av0yuUai6vs3D/YeiLNWu/ivuGkppecrCsvPJUZXVD85WOY5WnmSWHeh48ab95n9PaeeHStbM/Xj15CoitabncBgQCvcBmKPfbooKiQ/XnODdu9/f0Pbl+6359U8uu7DwaPfdad2/X3YeAnM0F4NbTdRdKj5zIY5TkMYrSaVnAZii/YD+ruuFqR8/A4PAvL0c/KtTPX40ePVGVnJLeyL4EnmvrutfEaW24wD1dzz52/BSz+GB27l7AvAyuaWhqvgz4Hg8OT469fT8rVs5J54Vzsku8zobzF7vvDVy/1cfhdZ272HrmPPe78qpVMGjtlm0USKpAJgSzIxMzz16NvRyd+nVCOPZW+GKEL5Kq+h8/a+vqBa42srllx6sKiw8DtfnMfTl5TNAgMCCQfH4B4A0otqBD5SrN8Pj04PD47b7Hw+OCez8NMPeV5u0t3p2TT6HuBA7FrduwNYkCxgmANyckQ/CCXiSRy5SIXLkglSOvR/i9/U/ZLW0dt+7XNbLjE5LSd9LBCIHb4JPrN2xas/bLr+PWb4zfujkhCSKDITISIcORQDjqCQRxz6LN7bXghAV36i0YrDMgWj2iM8BavUoFyxQK0ZxE+G5WIBDyp4TQUiTsV330qxU+WEbqYJ9S7BNPk4g8oJb7YSmp+hjGUFCHjBowrdGlWDAUXvQF3B6/HfdAkU8ho2Ace8c38Yd1kyNOmcg4+sIt/+BFFPjMOP5+YlGHuBViDyyNLi35/AEn4bY7nGYrrjdhUIAkxyb5Q69eD7158+DRAKh/fj7kdLkAz9LSUuzv4Q+QuNNlsxMms0NntELght1mM6Mo7nDYMMxoMIClx+1yEYQTd4DahtnAUWzloWAwZHcQFsxpQG0avRkKh8MKhVwmk8EwolQqxWIxyDAMgx25XG42mwmCcLvdq8yRSNRuJ1CLQ2eywguGZebgSpAkGViJP2uQI5HIP5QTLo/eiCEa4zyig2L/M7xeH6LWq9T6P8DRlQD6Ac+/Tfo8wDERCCFm+/wqMwBotVoEQSQSiVqtBpr/C/kpGnVaLPjYG/TlICySAjwEOIErxpWwWCwulwv8FmyCRz/XEiSDbvKTcVogzEoV0imS/oew2b4MxjDMarWCpqAoajKZQOFa7hThcDhABmAwwriTIBb9Ro1mprN9+nqbaGoa1qF/GbbK8Hle3fb7Aw6cAIOFu9yE1+cNR92hiNZoVao0vwOOsDT/1ulcfgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;livro oracle soa suite 12c&quot;
        title=&quot;Figura 4. Una de mis fuentes de estudio teórico sobre las herramientas de Oracle Suite fue este pequeño manual de 900 páginas.&quot;
        src=&quot;/static/6f6f52ea793820cfaa209255e3db6efe/f058b/livro-oracle-soa-suite-12c.png&quot;
        srcset=&quot;/static/6f6f52ea793820cfaa209255e3db6efe/c26ae/livro-oracle-soa-suite-12c.png 158w,
/static/6f6f52ea793820cfaa209255e3db6efe/6bdcf/livro-oracle-soa-suite-12c.png 315w,
/static/6f6f52ea793820cfaa209255e3db6efe/f058b/livro-oracle-soa-suite-12c.png 630w,
/static/6f6f52ea793820cfaa209255e3db6efe/fd28b/livro-oracle-soa-suite-12c.png 811w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 4. Una de mis fuentes de estudio teórico sobre las herramientas de Oracle Suite fue este pequeño manual de 900 páginas.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Pasé los dos años siguientes en una rutina continua de mucho trabajo en la aseguradora, en mi equipo de &lt;em&gt;Workflows&lt;/em&gt;. Curiosamente, esa habilidad con la orquestación de APIs (Application Programming Interfaces) sería de gran valor en proyectos futuros. Las nuevas fases del proyecto SOA se fueron expandiendo hacia nuevas áreas: creé paneles gerenciales y actualicé algunas tecnologías de la compañía, a pedido de la casa matriz estadounidense.&lt;/p&gt;
&lt;p&gt;Pero el trabajo no bastaba. Seguí firme en mi rutina de estudio, leyendo sobre Agile, Microservicios, Enterprise Integration Patterns y otros temas de arquitectura de software, hasta sentirme desafiado a sacar certificaciones de Microsoft. Para eso, armé una rutina de estudio basada en los libros de Exam Ref de la propia Microsoft y en materiales complementarios de Packtpub. En un año y medio, obtuve tres: la &lt;strong&gt;MCP (Microsoft Certified Professional)&lt;/strong&gt;, la &lt;strong&gt;MCSA (Microsoft Certified Solutions Associate)&lt;/strong&gt; y la &lt;strong&gt;MCSD (Microsoft Certified Solutions Developer)&lt;/strong&gt;, en las áreas de C#, ASP.NET MVC y Windows Azure.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7ElEQVR42m1UWW9TRxS+Kf+g6kN5KiRUglIRBAQhyiaoKNDSspQHGqiK6AOUVixSSosiokA24qxeYmcxSYgDthtI4ix2ABNIo9jZlYUAjuN4d5zNNniN79yv1zcQBZVPOjozo2++OefMnKHO/mMv3CUxtx+utLbuKzdrdpeaNfvKJzW7JZOarcJJTSLfokkS29u2SRwtSRJ7xUm587dhSyie4oC4NOAjajnWF1j0B+/5ka8Pkv3VM6BSTIi7asaK6w6sK7bgaMULJJd24xdpP87UGvGN1ILE4kn/oUrHbY/HsyqmkZa2TPSLfEPXRbUHvbZg9Hy9i1B/jJId/Ock546aZNxMJ3elYlKSn0GkAh7JSk2h79XWkCq1njlcMY4ksWNK3Ok8tBjsW9ENhUbdeqETP8ntZG2+CReUE2ioUyAv6wZUKhUczinMeXyYZ81ktmDcaITqgRI3/r5Cp8h6sEXiCpd0uL7jxGKRbuZP6KgUI6iLL8mPQj1UShkGBwcxPT2DD4FhGNA0QXOLGukpF8hftXpsr5h2eb3uNZxoksDICk5gl8hASoTFUCgUWIhGlzbH7EOiMbQ90qIgI5VOlk3gqHz2Die4qcjQTaXakFOrJbzMNEzPeQDCwFPHQ5chGzNzM3BPuREOhxEKhRAMBuFyuRB9e2iJoIjhSWTYW+EK9E++XketzRvXrymwg8fjEaVSwZH8YSBV0Yhx/WGMG8YwMDCIsbExjIyMcOXQ6/WccAzdPb3g52XTvyqdONvguUwl8Ey6/eIXyEm/Rl6+MnCkKJuSNUqDRNxsegTMB2pJCOH8zOw8JAXZ9OV7w/i+ZrqWWsUz605KRyDKTScu9+JFMCyZDgcRiUQ483q98Pl88Pv9CAQC3PwdFtiDhXlZ5JygFcdq3R1UPM/ckXx7FGUFmUuCsU1yuQJarZb1cvT19XGmVqvR2dmJpqYmOBwOjhteiEJceItckT7FDzWuTmp9kVV5rNqCzOvX6NGxl4s1ZCNRNTWjobEJ9Q2NrIiOfX8mdqyCpu0hNJqH3MXEMM2mLMjNoFMUo2zKbjl1oMp9dYvIDlmVmB4e6GIpIZCF1wgH5xEOzCEa8cE374B3zobgGzdnvnknW8Qgx7VbxtHT3kifr7PgVJ3nT0o26Nm4MtMSeaw6AnR8zNDt8axfBfJsNYKP40Gerkbg8RqEniSwPp5bY/5NAJ59BobloH0l49R8jq9FPWGNDYncW9wo9t8/UiQFHlE00xoHtFIgzRS68xdtSEChv5hCbyGFjhwKoQds56op0C0rAC1FZ1f/jgOyYN3SB9E0YEv89JbLy7t9DuhaR3zazYjovwLp34sF3W4Q/U6Q7l1g+vYAg/vY9T3wPdnMcr8krcpvsU30ytNvwwZqqaFZXG50nvok28FcUowyVsMIaWmsY2+2F/6AHzShEWa7ZHZ2FkNDQ7hbU4mJ4W4ianvOJAodTNYTb/JyraXBpXrz6ZXZJv/BKgdS+TIm/XoqrayU0DXlIkalkDFlRbl0bmY6nSupYX6WGbFRYPXfaJs69b7YW5w4oVwR8/cH3Imb+KaWhHwLzf7gOC7U4XhWPc7w23C6VI/jd8xIKrGSPWXWlo6JNxuW7/0f3v287HuIEz9zbd0vtd3cUmJX7yh3DO8ssw9vL7WrD1bbblb1urbGOIuBvR/ZfxhNRYbPv+nhAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;mcsd badge&quot;
        title=&quot;Figura 5. Mi insignia de Microsoft Certified Solutions Developer, obtenida en 2019.&quot;
        src=&quot;/static/da2828d48c834a0bfd781bd92fb9bd22/0a47e/mcsd-badge.png&quot;
        srcset=&quot;/static/da2828d48c834a0bfd781bd92fb9bd22/c26ae/mcsd-badge.png 158w,
/static/da2828d48c834a0bfd781bd92fb9bd22/6bdcf/mcsd-badge.png 315w,
/static/da2828d48c834a0bfd781bd92fb9bd22/0a47e/mcsd-badge.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 5. Mi insignia de Microsoft Certified Solutions Developer, obtenida en 2019.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Hoy en día tal vez esas insignias tengan poca utilidad práctica, pero el desafío de estudiar y profundizar en temas muchas veces descuidados es una forma riquísima de aprendizaje. Sin contar que, para mí personalmente, fue mi punto de partida para consumir material en inglés. Antes no recuerdo haber tenido la experiencia de leer y estudiar libros de 500 páginas en otro idioma. Estoy agradecido por haber tomado esa decisión.&lt;/p&gt;
&lt;h2 id=&quot;de-vuelta-al-principio-y-nuevas-incertidumbres&quot;&gt;De vuelta al principio y nuevas incertidumbres&lt;/h2&gt;
&lt;p&gt;Con todo ese conocimiento en desarrollo .NET, &lt;em&gt;cloud&lt;/em&gt; de Azure y también en herramientas de SDLC (Software Development Life Cycle), como VSTS (Visual Studio Team Services), más tarde renombrado como Azure DevOps, me llamó, a inicios de 2018, mi primera empresa, para prestar una consultoría externa en una nueva solución que estaban desarrollando: un sistema de ventas &lt;em&gt;omnichannel&lt;/em&gt;, desarrollado totalmente desde cero con tecnología Microsoft. Acepté el desafío y los impulsé en la creación de la arquitectura de esta nueva solución, basada en microservicios, ya en .NET Core 2.0.&lt;/p&gt;
&lt;p&gt;Seguí manteniendo esos dos frentes de trabajo en paralelo, y en 2019 abrí uno nuevo: comencé una Maestría en TI en la PUC-SP (Pontifícia Universidade Católica de São Paulo, Pontificia Universidad Católica de São Paulo), presentando un proyecto de investigación de Internet de las Cosas aplicado al Saneamiento Básico de São Paulo, motivado por el deseo de, en el futuro, tener la oportunidad de dar clases en alguna universidad.&lt;/p&gt;
&lt;p&gt;Ya llevaba 3 años y algunos meses en la aseguradora, y sentía cierta desconexión entre mi expectativa de carrera y mi valoración profesional. Decidí que en ese momento haría un nuevo cambio y, algunos meses después, cambiaría por completo de contexto una vez más, y, quién lo diría, volvería a una empresa con ambiente de startup, pero ahora en otra área: la de salud. Podría decir que ya era prácticamente un programador senior, al menos en la actitud, con mucho más bagaje y transmitiendo confianza en mis habilidades técnicas y de gestión del tiempo como colaborador individual, gracias a la extensa rutina de trabajo en dos proyectos completamente diferentes en tecnología, escala y desafíos.&lt;/p&gt;
&lt;p&gt;Todavía no lo sabía, pero una vez más el tiro erraría el blanco. Y en un momento sumamente delicado, porque el año era 2020, pocos meses después del primer caso registrado de SARS-CoV-2, en China [2]. De ahí en adelante, nada volvería a ser como antes.&lt;/p&gt;
&lt;h2 id=&quot;lista-de-referencias&quot;&gt;Lista de referencias&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://epocanegocios.globo.com/colunas/Futuro-do-trabalho/noticia/2020/09/inovacao-nao-e-bagunca-incrivel-trajetoria-dos-10-primeiros-unicornios-brasileiros.html&quot;&gt;Época Negócios: Inovação não é bagunça! A incrível trajetória dos 10 primeiros unicórnios brasileiros&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cnnbrasil.com.br/saude/5-anos-da-covid-19-relembre-o-historico-desde-1o-caso-ate-fim-da-emergencia/&quot;&gt;CNN Brasil: 5 anos da Covid-19: lembre o histórico desde 1º caso até fim da emergência&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Mi Midpoint de Carrera, Parte I]]></title><description><![CDATA[Prólogo En septiembre de 2026 cumplí 15 años de carrera en Tecnología de la Información, mis Bodas de Cristal. Fue tiempo suficiente para…]]></description><link>https://blog.decodifique.com/es/meu-midpoint-de-carreira-parte-1/</link><guid isPermaLink="false">https://blog.decodifique.com/es/meu-midpoint-de-carreira-parte-1/</guid><pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;prologo&quot;&gt;Prólogo&lt;/h2&gt;
&lt;p&gt;En septiembre de 2026 cumplí 15 años de carrera en Tecnología de la Información, mis &lt;em&gt;Bodas de Cristal&lt;/em&gt;. Fue tiempo suficiente para acumular historias y experiencias entre el mercado laboral y la vida académica. Decidí revisitar esos recuerdos y registrar aprendizajes e historias curiosas, preservando a los involucrados tanto como sea posible.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 91.13924050632912%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEVUlEQVR42gFKBLX7AMTBydnPzrjC06K51au+2K3B2oeXr4+Zq7HD26q/2qa716y/2LLD2bPE27jH27/L3MHM3M/R2ODc3Onk4QDczMbl1s/Ry8/Oy8+oscJ+jaZVYXZwbXSknJ23wNC3x92yw9m3x9u3x9u7ydvH0d3c3N7n39vp4t7u5+IAfoSVmKC0gYqfcHeIZXGIZXCHZnGEZ2hvl4yHiYaLsrO7ztbixc/bx9Dd0NXe0NDW0cnLwLzF0MPC6dTGAFlqhGp7l11tiE9feE1Zb1Zgck9Za1RaZ0tPWFJRUHpuYb60sdTP1dLKzNzOy8W5vcy8ud/Nw/Lezfrq2ABldI5wfZSFj6dyfZN9hZiLkKJrcYBYXWg9Q0k+QkhXUUljW1WimJbazsvXzMnu2cr34cz+7tr/9eP/++4AaneRbnyVdoOccn+YbnmQaXKFXGJwU1ZcQ0VIPUFFWlVRcmtpioGBxbu8wMHPzcnQ19DR4dXR8N/Q+uvVAGJwjFlnfl9rgFVgckZPXkZLUj5BRD8/P0VEQ1dRSoJ6c4BzZ5CGg5GGg5OSnaSksri2wb64wNDAwNvIwQBVXm1SXXNfZXR8eoB2dHlmYmJJSks0Oj4+QUVWVFWfnKB9cmZSTkhqYlt4dXd5fIaamaOzrrbFubnNv78AWk4sa2JWXV5icnN9eXqGb21zZmRoS05USUhGhoB/ybu1cGhlUU5KXVhUaGNgcGtrd3d/lpSbsamt18rHAEI8GkE3GFBGL19ZSGJdR1VTUHRrZmlhV05HOoZ5aOTUx4+HhkhJSlZVVVtaX2BdX25paGtzg251hIiJkwA8NQtWSBc4Mx4VFgpCOQtxXis8NSNMQSZeTyxnUyiiimWnknRrYVZsa3Jsam1OU1x9cWmDfn9vd4Ztd4cAQToRVEcTaVgYPDUcIB0NX00bYlIqQDkkPzw1Wk44RTsgUEMkb15Fcm5udXF1Wlpfd25qbWdna2hshYGGAB4eDTEtDVhJF4FrIG5YI0s+Ik1CJFZJJFFJNFlQSk1CIkU+JVtSSY59b3l0eK+gm7WjmZKIia6ioNXAtAAlJBAsKQ46NA5MPxdTRR9hTyJGPCcZGQ1PQhpYSzM5NSZpWSyEbkZ8b2JoaXOto6bGtrLEt7jGurzXxcAAX1AjODIRKSgQKCccJyYbNC4da1w/W00vLScULykVOzo5QD9BaVUrWEsneXNwfn+Kd3mFjouTqJ6iva6rAHZiIlpQHEM6IzQwIDk1ITY1NDo8Pk1MSFZNQCwoGzMyK1FMSVpMOikkED84KWVcU2JiZ21veouIkYmGjgBPRQ9hVROOdThiUyNbThVJQiY/OyYuLit2ZFNiUDgcGw1VTEFSRzo5MCI0NTVMSEJkV0hUTkhhX19bXWUAMi8JNjIGeWckeGQla1kacF8dWE4UY1UeYE8pb1o2Sz8gSD4oODQoLiohODc1Pj4/ZVZDUkY2QTowVUs8iJbrLZ5P5N4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;bodas 15 anos&quot;
        title=&quot;Figura 1. 15 años de carrera, mis Bodas de Cristal.&quot;
        src=&quot;/static/d69b9dd01b25243140cf2114afe10e60/f058b/bodas-15-anos.png&quot;
        srcset=&quot;/static/d69b9dd01b25243140cf2114afe10e60/c26ae/bodas-15-anos.png 158w,
/static/d69b9dd01b25243140cf2114afe10e60/6bdcf/bodas-15-anos.png 315w,
/static/d69b9dd01b25243140cf2114afe10e60/f058b/bodas-15-anos.png 630w,
/static/d69b9dd01b25243140cf2114afe10e60/40601/bodas-15-anos.png 945w,
/static/d69b9dd01b25243140cf2114afe10e60/78612/bodas-15-anos.png 1260w,
/static/d69b9dd01b25243140cf2114afe10e60/ea964/bodas-15-anos.png 1312w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 1. 15 años de carrera, mis Bodas de Cristal.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Podría abrir con un prefacio sobre el período anterior a mi primer empleo formal, el Curso Técnico de Informática y mis primeras experiencias con computadoras, pero ese capítulo queda para el futuro.&lt;/p&gt;
&lt;p&gt;Esta historia tendrá tres partes principales, hitos que considero importantes de varios años cada uno, con un período de &lt;em&gt;filler&lt;/em&gt; entre ellas: historias menores, pero no menos interesantes de recordar.&lt;/p&gt;
&lt;p&gt;Como no podía ser de otra manera, comenzaremos con el llamado a la aventura.&lt;/p&gt;
&lt;h2 id=&quot;pasantes-empanadas-fritas-y-cementerios&quot;&gt;Pasantes, empanadas fritas y cementerios&lt;/h2&gt;
&lt;p&gt;En junio de 2011, aceptado en el Programa Universidade para Todos (PROUNI) y con una beca garantizada en São Paulo para estudiar Sistemas de Información, tomé mi primera gran decisión: dejar la casa de mis padres, en el interior, para vivir en la capital, a los 17 años. Ya cursaba el primer semestre de Análisis y Desarrollo de Sistemas en mi ciudad natal, pero nada se compararía al cambio de rutina, escala y desafíos que llegaron ya en los primeros meses de esta nueva vida.&lt;/p&gt;
&lt;p&gt;No bastaba con estudiar. Todos los días enfrentaba más de 100 km de traslado entre ida y vuelta, desde Tatuapé, en la Zona Este de São Paulo, hasta Cotia, en la Región Metropolitana de São Paulo (RMSP). En esos primeros meses, fui acogido por mi tía materna, Cida, a quien le tengo una inmensa gratitud. Ella sin duda trabajaba tanto como yo y, a pesar de ser estricta, es una persona extremadamente protectora.&lt;/p&gt;
&lt;p&gt;Ese desafío de traslado, sumado a la rutina de la casa, me obligó a salir a buscar trabajo: aprovechar el trayecto diario entre casa y la universidad para ganar algún sustento, conquistar mi propio espacio y ahorrar horas de traslado.&lt;/p&gt;
&lt;p&gt;Buscando en el añorado sitio &lt;em&gt;APInfo&lt;/em&gt;, envié currículums para vacantes de pasantía ya en el primer mes de universidad. La primera entrevista, por suerte, me dio mi primer trabajo remunerado, en septiembre de 2011: una consultora de software de pequeño porte, pero con un gran contrato de un Enterprise Resource Planning (ERP), sistema de gestión empresarial, para una importadora y minorista de ropa, calzado y accesorios.&lt;/p&gt;
&lt;p&gt;Como pasante, recibí un salario un poco por encima del mínimo de la época (R$ 545,00) y una ayuda de costo, una especie de vale de comida en efectivo. Para alguien de 17 años que antes no tenía nada, fue un gran logro.&lt;/p&gt;
&lt;p&gt;Sin embargo, mi productividad y mi concentración, especialmente en las materias de cálculo y durante mi ramp-up en la empresa, en la que necesitaba dedicarme mucho más para absorber el conocimiento, se veían afectadas por los largos traslados: durante algunos meses, salía de casa a las 5:30 a. m. para llegar al trabajo, en la Zona Sur, a las 10 a. m., donde me quedaba hasta las 17 h. Antes de la universidad, hacía una parada obligatoria en un puesto de empanadas fritas frente a una iglesia: una simpática empanada con algún recuerdo de relleno, por unos R$ 4,00, siempre reforzada con snacks de fécula sabor guayaba en la mochila. Luego seguía hacia la universidad, en la Zona Este. En el camino de vuelta, la integración hacia la Línea 4 ya estaba cerrada, así que tomaba el autobús frente al Cementerio de la Consolación y bajaba a pie por toda la Cardeal Arcoverde, entre bares sospechosos y locales de dudosa reputación, hasta el Largo da Batata, donde abordaba uno de los dos últimos autobuses intermunicipales, a las 23:45 o a las 00:10. Llegaba a casa, me acostaba y, pocas horas después, todo volvía a empezar.&lt;/p&gt;
&lt;p&gt;Más que el sueldo, sin embargo, fue el aprendizaje en aquel ambiente de consultoría, donde todos los desarrolladores hacían de todo un poco: creaban funcionalidades, encontraban y corregían problemas, se metían con bases de datos e infraestructura, conviviendo con gente de la misma franja etaria y mucha disposición para apagar incendios. La complejidad del negocio abarcaba todas las áreas de una empresa mediana: inventario, logística, temas fiscales, tablas de precios, ventas, Puntos de Venta (PDV) y contabilidad.&lt;/p&gt;
&lt;h2 id=&quot;windev-el-rapid-application-development-frances&quot;&gt;Windev, el Rapid Application Development francés&lt;/h2&gt;
&lt;p&gt;La tecnología que usábamos en esa época, &lt;strong&gt;Windev&lt;/strong&gt;, ya parecía un poco anticuada: un entorno de desarrollo rápido de aplicaciones, el llamado &lt;em&gt;Rapid Application Development&lt;/em&gt; (RAD), con el que desarrollábamos el ERP y las aplicaciones Point of Sale (PoS), los sistemas de punto de venta. La herramienta abstraía los frameworks más populares de la época, Java y .NET Framework, con un framework propio: IDE propio, lenguaje propio y base de datos propia, aunque contaba con conectores para otros proveedores. En nuestro caso, usábamos Microsoft SQL Server como Sistema Gestor de Base de Datos (SGBD).&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.43037974683544%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAIDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHMBYij/8QAFhABAQEAAAAAAAAAAAAAAAAAAQAQ/9oACAEBAAEFAsFxi//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AVf/xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BZH//xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAY/Al//xAAYEAADAQEAAAAAAAAAAAAAAAABEBEAMf/aAAgBAQABPyG1BCAtzv/aAAwDAQACAAMAAAAQwN//xAAWEQEBAQAAAAAAAAAAAAAAAAAAEVH/2gAIAQMBAT8QVr//xAAVEQEBAAAAAAAAAAAAAAAAAAAAYf/aAAgBAgEBPxBB/8QAGRABAAMBAQAAAAAAAAAAAAAAAQARIVEx/9oACAEBAAE/EAJsvkQryXlAQAcmHIRd9n//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;windev home&quot;
        title=&quot;Figura 2. Interfaz del IDE Windev.&quot;
        src=&quot;/static/018a288360756f6fdee34a769237023d/828fb/windev-home.jpg&quot;
        srcset=&quot;/static/018a288360756f6fdee34a769237023d/ff44c/windev-home.jpg 158w,
/static/018a288360756f6fdee34a769237023d/a6688/windev-home.jpg 315w,
/static/018a288360756f6fdee34a769237023d/828fb/windev-home.jpg 630w,
/static/018a288360756f6fdee34a769237023d/0ede0/windev-home.jpg 945w,
/static/018a288360756f6fdee34a769237023d/3ac88/windev-home.jpg 1260w,
/static/018a288360756f6fdee34a769237023d/0f98f/windev-home.jpg 1920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 2. Interfaz del IDE Windev.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Windev es un IDE creado por una empresa francesa, &lt;strong&gt;PCSoft&lt;/strong&gt;, con un entorno integrado para desarrollo de aplicaciones de escritorio, web y móviles: lenguaje propietario, &lt;strong&gt;WLanguage&lt;/strong&gt;, base de datos propia, &lt;strong&gt;HyperfileSQL (HFSQL)&lt;/strong&gt;, e interoperabilidad con otros lenguajes y bases de datos mediante APIs y drivers.&lt;/p&gt;
&lt;p&gt;Algunas peculiaridades provienen de la propia elección de diseño del IDE, de gusto bastante particular, y del lenguaje propio, fruto de la época: un lenguaje de cuarta generación (&lt;em&gt;Fourth-Generation Language&lt;/em&gt;, 4GL). La propuesta era acelerar el desarrollo generando artefactos automáticamente tras integrar una base de datos al proyecto: los metadatos se convertían en un modelo abstracto llamado &lt;code class=&quot;language-text&quot;&gt;Analysis&lt;/code&gt;, parecido al &lt;em&gt;Entity Data Model&lt;/em&gt; de .NET Framework, y, a partir de él, reportes y pantallas salían con pocos clics, algo así como Crystal Reports, de SAP, o ADF, de Oracle, para interfaces ricas.&lt;/p&gt;
&lt;p&gt;En la práctica, esto significaba que yo no necesitaba entender a fondo la base de datos para entregar una pantalla funcionando, lo cual, mirando hacia atrás, fue bueno y malo a la vez.&lt;/p&gt;
&lt;p&gt;El lenguaje también ofrecía fetch de datos automático: bastaba iterar colecciones con bindings al modelo de datos, y el metamodelo se encargaba de traducir todo en consultas a la base de datos, fuera HFSQL u otra compatible, vía conectores OLE DB/ODBC.&lt;/p&gt;
&lt;p&gt;Un ejemplo simple: una búsqueda de cliente por nombre, seguida de una iteración sobre la colección resultante, sin escribir una sola línea de SQL.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// Buscar primer cliente con nombre &quot;João&quot;
HReadSeek(Customers, Name, &quot;João&quot;)

IF NOT HFound(Customers) THEN
    Info(&quot;Cliente no encontrado&quot;)
    RETURN
END

// Iterar sobre todos los registros encontrados
FOR EACH Customers
    sName = Customers.Name
    sEmail = Customers.Email
    nID = Customers.CustomerID
    Info(nID + &quot; - &quot; + sName + &quot; (&quot; + sEmail + &quot;)&quot;)
END&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Evidentemente, esto generaba problemas de rendimiento y comportamientos ocultos en la base de datos, ya que ese tipo de abstracción prioriza el best-effort incluso a costa del mal uso de índices y consultas poco optimizadas. El resultado eran situaciones caóticas en escenarios de escala, o donde había restricciones de rendimiento, como en aplicaciones de cara al usuario en las terminales de venta. En esos casos, recurríamos con frecuencia al uso de Stored Procedures escritas en Transact-SQL para ejecutar operaciones más costosas, como calcular flujos de caja, reprocesar inventarios o tablas de precios, y generar reportes de vendedores.&lt;/p&gt;
&lt;p&gt;En ese período, el software que entregábamos tenía un carácter bastante artesanal: especificaciones y reportes de bugs recogidos en el pasillo, por teléfono, o en interminables hilos de correo electrónico. Esto nos obligó a crear y mantener, también &lt;em&gt;in-company&lt;/em&gt;, un &lt;em&gt;service desk&lt;/em&gt; para reunir issues y reportes de problemas. Yo, que siempre tuve una vena creativa, asumí el soporte de ese sistema para hacerlo evolucionar, creando funcionalidades, reportes y dashboards, y mejorando nuestro día a día de trabajo.&lt;/p&gt;
&lt;p&gt;Aunque Git ya existía desde 2005, mi experiencia con la gestión de código fuente todavía era bastante rudimentaria: carpetas compartidas en la red, sin control de versiones, y después un sistema centralizado de control de versiones (CVS, &lt;em&gt;Concurrent Versions System&lt;/em&gt;) del propio proveedor de Windev, que más de una vez corrompió el historial de los archivos y nos obligó a recurrir a copias de seguridad físicas. Los despliegues seguían la misma lógica artesanal: builds comprimidos, transferidos por FTP, con configuraciones de acceso en texto plano en archivos &lt;code class=&quot;language-text&quot;&gt;.ini&lt;/code&gt;. Fue nuestra realidad durante años.&lt;/p&gt;
&lt;h2 id=&quot;php-de-la-vieja-escuela-y-otros-proyectos&quot;&gt;PHP de la vieja escuela y otros proyectos&lt;/h2&gt;
&lt;p&gt;Además del ERP y su sistema de PoS, la consultora también trabajaba con proyectos más pequeños, como e-commerces y sistemas de gestión hotelera. En esos casos había más flexibilidad de tecnologías, y llegamos a usar PHP y MySQL en el paquete LAMP (Linux-Apache-MySQL-PHP), ya en sus últimos suspiros en el mercado, que seguía migrando hacia el paquete Node.js y nginx, aunque nosotros seguíamos con él.&lt;/p&gt;
&lt;p&gt;En ese momento, el conocimiento de frameworks en el mundo PHP era totalmente experimental, al menos para mí. Recuerdo estudiar &lt;code class=&quot;language-text&quot;&gt;CodeIgniter&lt;/code&gt; en el libro de Ademir Gabardo y usarlo en mi TCC (Trabajo de Fin de Carrera), donde también tuve contacto con la cultura &lt;em&gt;maker&lt;/em&gt;, usando &lt;strong&gt;Arduino&lt;/strong&gt; y &lt;strong&gt;Raspberry Pi&lt;/strong&gt; para prototipar un medidor de agua inteligente, proyecto que genuinamente obtuvo la nota máxima de evaluación. Profesionalmente, sin embargo, el PHP que yo usaba era el de la vieja escuela de los años 2000: archivos &lt;code class=&quot;language-text&quot;&gt;.php&lt;/code&gt; con bloques de script mezclados con HTML, compartiendo espacio con plugins icónicos de la época, como jQuery, para controlar el DOM, validaciones del lado del cliente y animaciones, &lt;code class=&quot;language-text&quot;&gt;morris.js&lt;/code&gt; y &lt;code class=&quot;language-text&quot;&gt;chart.js&lt;/code&gt;, para gráficos estilizados. Bootstrap todavía estaba en sus primeras versiones, incorporándose poco a poco en mis proyectos.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 292px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 146.2025316455696%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAIAAAAl5NuSAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGJUlEQVR42k1VeUxTdxyv10yMy5jMTQTkLqVytFyFQpG+lt7lEFqggFjKffY+KfR6ry29OQQBpRubIjqH4BlUpmzZ5hadm9s0bv5h5h8sW5yZyeJi4n6v6Gbyycvvfd/38/1+f9/rYXh2HdcRglPPCwGceQBOVMixa7l2LSpHJfp1TXDmIBpwwLCMUtagjG1R0gdlNJOMblEwYTXdqqShBxXfqWchGnAusaEShk1Fsyogi5xhU3LtOgy1VwLJWor6JAPBCfj4jPSwVxJAjMemh8+dqgvYKP09NT6LaT6omp1wLBxrmXBLZ0bh0x+qZseBIUxBU3WhpJYkFp5eWf746qXF1ZVzX1xfuH5l9fZN2binyQd3jDq/e3D/2p1v5z678slXq2dufD595RyIHPWcI+DlCvmZAq47OMXqOGgY8yp99rH5j9odg/s6GnxzHzQhxunlpanLZ9WzE8GVi9Lg2NGrF6TBUSbwTGBSM1hUIpeezqGlcWnEMiZJWFre3Uys5OSKyqGWumJZc+lQP2SWM6zK8iEjiLbEqqxwGTmIFoMryMFTSEnkrLruVr3D1mVQd+hV7Xql3u2wBDyTp+bcZ05MLi95l056F+enL58dv7gwcWlRFhxjwWoMNpeYmJWOo+QSqAVkHiOLDRWWMuv62ht725uNKsPxaaA3MHcUELqm/fLgIfn7hwZOzNT4LWxEg0nOJSRkp6cU5CTmEpLyM/GUXCw5G1eYgy+hFOu76TYlZJKxES3IEN2qQGFRQGYZKCeQYN7FYiNTEuPScHv2Jsdm4OMz02LSccAW09jHdfWDZmDbdRWIigOrgQnwCtoGALgFzYORMXds3x0Vmxz/Xlx0FDZhT0rS7uR4Sk8TDzBRgoaPqB2uZolDyoBRMvsVUPJTy6b6wh1hkbGRMZGR8bHRcTF54mq+2wiYLETLRTQjTvF5t6DH0Q3BOi6i5rxO/suyYc24uQi/A7P1ze3bt2Xu5/I9A2xYzYQ1gH/M2XDLVXbdXSmyK/iAgGiAxf/Jvw9u/NuKuSPfEv/Olqi8bJ7bwEajVTNg3aK/9fGY8Jfx+geHhLO+g8f9QqenvuR18mPTxrX+DS8cmNHat8haeakLkFUliF7s7Pt+UvTrTOOjeelP89LVUcZVH+VGIF/ulNBgPQdRhzwPbHxmw3zdt3VX2JbIbALfZQC3gmC9xiU5H4AuBBgrAeiHJcP9C5ZbY7R7Q9gZJ4eKGF6Sn1o3PNJvzsfvfCMsPDz8bUI5i+/pp8IGpbPppj/v3lnj/dN9a6ujf94+ufap9w8kfBRmFyOgN1XrYW/iZIZt2xUVEbM7Ii5mZ2REVl051z1YZpVe80Mv7i788/DLZw+uPV/78cXdE3csEVVwLwPRsdc9tzJ2bYuKjcHFR2DjolKSolEkFveImR5Tvbl5ecn95Lefnz959PjhN5eOiOvMTXS7ERSMtZ6wyFR8DD4xPmNvbBouITMNIDE7HZuXCSnbmENGyKIQek0NI7DAoUD3id0QKvWrDktIw0bjkmLTUmJTcXGEvfHEVNDqccTUZAqJaezlOrRgANHdFGoYtk0BxhgFHAob9ZaVnpiTgSURk/OzksnZmfQicimLxIYoogowPdU+C3hWeQYFPnNNwFrrt1b7LfvdA+g844tIKfvyUqkFaXRKesm+dGYxqZxd3nZQ2Nsq6GppMKraDns7p/3NE66OKfTZOuHpOhJoHHOgI0lgQwQOjchnZJWxsis4OZXc7CouVVzD726ulHcKlF2NDmPblLdtEjXRMu7qPhLoPjp8YNQO2gGTK+DnVJeSROV59fvJB6rIYmGBpJYsqaF1iXnKLo6yk6/pEdgNNX4riFzoNdcN20DkL8MGq7OwRVTU3rCvs7G4W1wMNrG0haZop6k6aOpOur6H0d/HGJCBJLEQMC0AaLZY6wkDqsWyFqqijapqh7RdJf19rEE526zg2MAC0ADzLHQ20UkI0VAmA812qMPYJnmdx9w0Ym8bd3dO+sCKZ/23Luxa8MdoGEFEIMM+NGCQdlHAVj8MgxIABQzPoQcXAN/ATYASulPR/xO60zkOHSADbbRU7sFaUDa/BVwbSAReE8+u+xe0ddD6kLZ6dgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;livro php codeigniter&quot;
        title=&quot;Figura 3. Libro de PHP y MVC (Model-View-Controller) con CodeIgniter, mi primer framework web.&quot;
        src=&quot;/static/ca16f6e09ac1bcc4970e78834c4ba910/2e9f9/livro-php-codeigniter.png&quot;
        srcset=&quot;/static/ca16f6e09ac1bcc4970e78834c4ba910/c26ae/livro-php-codeigniter.png 158w,
/static/ca16f6e09ac1bcc4970e78834c4ba910/2e9f9/livro-php-codeigniter.png 292w&quot;
        sizes=&quot;(max-width: 292px) 100vw, 292px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 3. Libro de PHP y MVC (Model-View-Controller) con CodeIgniter, mi primer framework web.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;estudiando-por-cuenta-propia-el-mundo-net&quot;&gt;Estudiando por cuenta propia: el mundo .NET&lt;/h2&gt;
&lt;p&gt;Pasados algunos meses, fui contratado de forma permanente como &lt;strong&gt;Analista Programador Júnior&lt;/strong&gt; y, con un salario mayor, me mudé a un pequeño apartamento cerca de una estación de metro en la Zona Oeste. La calidad de vida mejoró de inmediato: por fin dormía noches completas.&lt;/p&gt;
&lt;p&gt;Solo trabajar con Windev y PHP de la vieja escuela no me satisfacía. En conversaciones con mi gran amigo &lt;strong&gt;Mark&lt;/strong&gt;, para mí una leyenda de la programación (especialmente, pero no solo, en Java), siempre al tanto de las mejores prácticas de ingeniería, quien me enseñó arquitectura de software incluso antes de que yo conociera el término, me di cuenta de que quedarme solo con las tareas del día a día me estaría alejando de los estándares del mercado. Empecé entonces a estudiar .NET por mi cuenta, adentrándome en C# y ASP.NET MVC a través de los enormes volúmenes de la serie Step-by-Step, del añorado &lt;strong&gt;John Sharp&lt;/strong&gt;, y de libros de la también añorada editorial &lt;strong&gt;Casa do Código&lt;/strong&gt;, como el fabuloso libro de TDD (&lt;em&gt;Test-Driven Development&lt;/em&gt;) de &lt;strong&gt;Maurício Aniche&lt;/strong&gt;, además de algunos libros de Windows Phone, ya que yo era un early adopter y entusiasta de la línea Nokia Lumia 💀. Todavía era temprano, pero esa inquietud por estudiar más allá de la rutina se convertiría en la base del repertorio que construiría de ahí en adelante.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 135.44303797468356%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAIAAADzvTiPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFQElEQVR42oVU/VeSVxx//pCd/bSdft9Zp5Nr5suOlmZNLUmQnJjgC4qmoqhogZlAFipaqa1w+VLO0gyxZoIgKKYg8iIgKAICNiQFReJ5gN10p23OnX3P57nne+/9vt/n+4WMqKhlgLTTAEZUtPHyPlDRpj+ZqE9Ij11O+lZ/4gtD9DFDzDF91Nf6yK/0J7+EQggSROBwKBgKIkEYBkDgwAEDAG5h/14oHPaZdMvJESZytrGBbKSVLOf8aEw6Du3s7Gi1WqvVajAYnE5nOBwOhYDwERRC4BC8DyQQDgYR/x60sbEx9+6dUCi02+1bW1t+v9/j8cjn5V6vVyqRuH53vRoZWV1dtaxZxsfHRSLxJPimpkZHR4EAtL293cZp4z5+3NXZ2d7W3s3l0mm01pZWEAh/dFQikVxMSV232WQyWfNddgu7mcVktrDZ5LJycAiBePR6/fr6OjCvUqkWFhbUarVBbwDBazSaldUVy9oakFlQKEwmk06nA0bVKjWQ9Pl8EBDa2d11uz+Ajdvt9u3t7e7ufk4bMKCU/1UFCFyplfPy2SmN3iCZmQU2lUolyBzcBYNBoA7W0L6NQ/RJGZzCgR3ko9fj2/Pu6/xV3lBo2WiSK5Qqtca36zvC8yHpzwS2oOwrK6vASSAQ8Hi9RyivGRU6i97jQz495OcQ95Vdrk3wFwAGRhD3h62/+ThACBJPcHlvXpsnRCDHQ4a1S7qD5GEYtlhtR3hWyoQq6fDC28YFjca8vrG8ZjNZ7Wa7w+LYEElmHC731q5v0+PV6Az+ABKAkY8BGFTH5dlxfvBA05I3SulQd19XIi7rPKEgOS8/tZCUVnGjlN318Nlwz+TcwIyKp9CNCqe1FqfZ6ZKbbL9OL7KGhbW9Y1Dz/SYGk34Wg0vAZcdl4RNz8CmFpCz6HfrDvjttHZxHvfe6+zld3N6BIaP9vXH9vXhp9YlYceu5gNI9Ch2/kHE8JTMiPed7DCEyI/d0ZsGFYmoJ5zG75zl3cOQpX8CXyoVzi0O8N0abU2t1TqhNPWJ504ioEihHovGnMfhIgAxC1JW8H7KL0LWNddzBBwMv+bMLEoNt3rxhcLreTk7r1+xKs2NcZeqXKlv4kqpf+NApVPbJNELEZXwUNjcamxdPuIarv0vjDt7vGxyckI5NKyblWolCN8wbVxlXZTozb36pTyRvfiWidI9A8eeSc6/GozFJcUlp55LTklGY9Cw8LrcAjcXjCbk5ucUlpHx6JYqYn1NOuU6uohaTq4lllbmksgxCMZR8IbGz/pv60lO0ku+qC6NppbF1ZQmNlDg8DkUtRzXWXKqtwD7nRDVSzrTSEhooqU11SQ1V5xsoSVgsFrqUnFDwUwwxK7al+kRtUTSzIvJ2VQyrOoaYh2XVJLBqzpWTMiqK0QzK2XZaLKMqkUOLY9fFNVTGYzLQ0JlU9JmL2IRLmPPpmSlXrmIIhZmkynzStbLK2uraG7SbTCarmXG7taKaSm24TbnJLKm7Raym48nUzFIqdOLy1Qg0PgK8E450tuQ6mtZGuv+U2dHT0f/iKV84PikVy+QveL919g4+Ecy1vJ6lv5gk94wRf+bldw5DJBqj6AajuJ5VxmDXtHbdevSM3TvE6ep+JZ0XK5eWjKYls5Uvmuno7u/hCx7yhPdejrMHXzcNjLH6ef9syf0Wd9jtywbjR//eg/b2zo4Oj2cbgWGlchGMZDBAwZwGaxhBwkHkcD+DVSabdTicAoGgkEgkFRYJJibAoWRq+n+GwQGBAQz6enNzEyiXXisFW3C4uLj4b+U/AG72rearMxygAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;livro visual csharp 2008&quot;
        title=&quot;Figura 4. Libro Visual C# 2008, de John Sharp — un volumen enorme.&quot;
        src=&quot;/static/918407d7c39fd6f6afce19068a971226/f058b/livro-visual-csharp-2008.png&quot;
        srcset=&quot;/static/918407d7c39fd6f6afce19068a971226/c26ae/livro-visual-csharp-2008.png 158w,
/static/918407d7c39fd6f6afce19068a971226/6bdcf/livro-visual-csharp-2008.png 315w,
/static/918407d7c39fd6f6afce19068a971226/f058b/livro-visual-csharp-2008.png 630w,
/static/918407d7c39fd6f6afce19068a971226/d125e/livro-visual-csharp-2008.png 737w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 4. Libro Visual C# 2008, de John Sharp — un volumen enorme.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;hora-de-seguir-adelante&quot;&gt;Hora de seguir adelante&lt;/h2&gt;
&lt;p&gt;Cuando me di cuenta, habían pasado tres años y ya era &lt;strong&gt;Analista Programador Semi Senior&lt;/strong&gt;. Hubo muchos despliegues de nuevas versiones del ERP, optimizaciones en el flujo de caja de grupos de marcas, aperturas de nuevas tiendas, funcionalidades creadas y eventualmente recreadas para diversos registros, integraciones con impresoras térmicas, e incluso el armado de stands de eventos en el Anhembi. Había hecho grandes amigos en ese trayecto y ya estaba a punto de terminar la carrera, en el último semestre.&lt;/p&gt;
&lt;p&gt;Fue entonces cuando llegaron las ganas de buscar cambios: salir de la zona de confort y volver a arriesgarme en busca de nuevos desafíos. Sin mucha ceremonia, volví a sondear el mercado y, en mayo de 2015, recibí una propuesta que, en ese momento, me pareció la promesa de nuevos aires. Así llegó la hora de despedirme, en esta empresa, de los amigos que me acogieron y tanto me enseñaron en esta etapa inicial del camino (años más tarde regresaría para un nuevo y duradero proyecto).&lt;/p&gt;
&lt;p&gt;De ahí pasé a una nueva consultora de software, pero esta vez en un proyecto totalmente diferente, ahora en la Policía Tecnocientífica. Todavía a punto de graduarme de la universidad, en ese mismo primer semestre de 2015, fue ahí donde conocí la doble jornada laboral, pero eso quedará para la próxima parte.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Dedico el cierre de esta parte a todos los que, en aquel momento, formaron parte de mi camino: a &lt;strong&gt;Mark&lt;/strong&gt;, a &lt;strong&gt;Vê&lt;/strong&gt;, a los hermanos &lt;strong&gt;Diego&lt;/strong&gt; y &lt;strong&gt;Thiago&lt;/strong&gt;, a &lt;strong&gt;Marcão&lt;/strong&gt;, a &lt;strong&gt;Luiz XV&lt;/strong&gt;, a &lt;strong&gt;Adrian 2&lt;/strong&gt;, a &lt;strong&gt;Abel&lt;/strong&gt;, a &lt;strong&gt;Dengo&lt;/strong&gt;, y a tantos otros.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mi Biblioteca Anual: Libros Leídos de 2021 a 2025]]></title><description><![CDATA[Presentación Para mí, la lectura, antes de ser un trabajo, fue y siempre será un pasatiempo, desde el colegio, cuando leía
cómics
y revistas…]]></description><link>https://blog.decodifique.com/es/minha-biblioteca-anual-livros-lidos/</link><guid isPermaLink="false">https://blog.decodifique.com/es/minha-biblioteca-anual-livros-lidos/</guid><pubDate>Thu, 26 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;presentacion&quot;&gt;Presentación&lt;/h2&gt;
&lt;p&gt;Para mí, la lectura, antes de ser un trabajo, fue y siempre será un pasatiempo, desde el colegio, cuando leía
cómics
y revistas de videojuegos.
Con la intención de cultivar esa disciplina, ya sea como &lt;strong&gt;ocio&lt;/strong&gt; o para alcanzar &lt;strong&gt;objetivos personales&lt;/strong&gt;
y &lt;strong&gt;profesionales&lt;/strong&gt;, creé una lista anual, desde 2021, con las lecturas que hice en esos tres ámbitos.&lt;/p&gt;
&lt;p&gt;De esta forma, este registro me servirá a mí y a otros que busquen recomendaciones, como una manera de evaluar mis
intereses pasados y presentes, que guían mis decisiones y mis objetivos de vida.&lt;/p&gt;
&lt;h2 id=&quot;libros-leidos-por-ano&quot;&gt;Libros Leídos por Año&lt;/h2&gt;
&lt;h3 id=&quot;2025&quot;&gt;2025&lt;/h3&gt;
&lt;div class=&quot;table-container&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Categoría&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Título&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Autor(es)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Tema/Género&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Capítulos Leídos / Completado&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;El Hobbit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;J.R.R. Tolkien&lt;/td&gt;
&lt;td&gt;Fantasía&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vidas secas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graciliano Ramos&lt;/td&gt;
&lt;td&gt;Novela&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;La fábula del Estado de la Isla:&lt;/strong&gt; Cómo funcionan la economía y los mercados&lt;/td&gt;
&lt;td&gt;José Kobori&lt;/td&gt;
&lt;td&gt;Finanzas&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desarrollo Personal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Proyecto de vida:&lt;/strong&gt; Caminos hacia una vida que valga la pena&lt;/td&gt;
&lt;td&gt;Clóvis de Barros Filho&lt;/td&gt;
&lt;td&gt;Filosofía&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desarrollo Personal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Liderazgo:&lt;/strong&gt; La inteligencia emocional en la formación del líder de éxito&lt;/td&gt;
&lt;td&gt;Daniel Goleman&lt;/td&gt;
&lt;td&gt;Negocios y liderazgo&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 id=&quot;2024&quot;&gt;2024&lt;/h3&gt;
&lt;div class=&quot;table-container&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Categoría&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Título&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Autor(es)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Tema/Género&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Capítulos Leídos / Completado&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;São Paulo en las alturas:&lt;/strong&gt; La revolución modernista de la arquitectura y el mercado inmobiliario en los años 1950 y 1960&lt;/td&gt;
&lt;td&gt;Raul Juste Lores&lt;/td&gt;
&lt;td&gt;Arquitectura&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;El Señor de los Anillos:&lt;/strong&gt; Volumen Único&lt;/td&gt;
&lt;td&gt;J.R.R. Tolkien&lt;/td&gt;
&lt;td&gt;Fantasía&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Team Topologies:&lt;/strong&gt; Organizing Business and Technology Teams for Fast Flow&lt;/td&gt;
&lt;td&gt;Matthew Skelton; Manuel Pais&lt;/td&gt;
&lt;td&gt;Negocios y liderazgo&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unit Testing Principles, Practices, and Patterns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vladimir Khorikov&lt;/td&gt;
&lt;td&gt;Desarrollo de software&lt;/td&gt;
&lt;td&gt;1 ~ 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Site Reliability Engineering:&lt;/strong&gt; How Google Runs Production Systems&lt;/td&gt;
&lt;td&gt;Jennifer Petoff; Niall Murphy; Betsy Beyer; Chris Jones&lt;/td&gt;
&lt;td&gt;Desarrollo de software&lt;/td&gt;
&lt;td&gt;1 - 3 - 4 - 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;El pipeline de liderazgo:&lt;/strong&gt; El desarrollo de líderes como diferencial competitivo&lt;/td&gt;
&lt;td&gt;Ram Charan; Stephen Drotter; James L. Noel; Kent Jonasen&lt;/td&gt;
&lt;td&gt;Negocios y liderazgo&lt;/td&gt;
&lt;td&gt;1 - 2 - 3 - 8 - 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desarrollo Personal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;El caballero de la armadura oxidada&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Robert Fisher&lt;/td&gt;
&lt;td&gt;Aventura&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desarrollo Personal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lo mejor del mundo:&lt;/strong&gt; Sepa cuándo insistir y cuándo desistir&lt;/td&gt;
&lt;td&gt;Seth Godin&lt;/td&gt;
&lt;td&gt;Negocios&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 id=&quot;2023&quot;&gt;2023&lt;/h3&gt;
&lt;div class=&quot;table-container&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Categoría&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Título&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Autor(es)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Tema/Género&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Capítulos Leídos / Completado&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Inédita pamonha&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clóvis de Barros Filho&lt;/td&gt;
&lt;td&gt;Filosofía&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Sin reglas:&lt;/strong&gt; Netflix y la cultura de la reinvención&lt;/td&gt;
&lt;td&gt;Reed Hastings&lt;/td&gt;
&lt;td&gt;Negocios y liderazgo&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Software Architect Elevator:&lt;/strong&gt; Redefining the Architect&apos;s Role in the Digital Enterprise&lt;/td&gt;
&lt;td&gt;Gregor Hohpe&lt;/td&gt;
&lt;td&gt;Desarrollo de software&lt;/td&gt;
&lt;td&gt;1 ~ 17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;El Programador Pragmático:&lt;/strong&gt; De Aprendiz a Maestro&lt;/td&gt;
&lt;td&gt;Andrew Hunt; David Thomas&lt;/td&gt;
&lt;td&gt;Desarrollo de software&lt;/td&gt;
&lt;td&gt;1 ~ 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Code That Fits in Your Head:&lt;/strong&gt; Heuristics for Software Engineering&lt;/td&gt;
&lt;td&gt;Mark Seeman&lt;/td&gt;
&lt;td&gt;Desarrollo de software&lt;/td&gt;
&lt;td&gt;1 ~ 7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 id=&quot;2022&quot;&gt;2022&lt;/h3&gt;
&lt;div class=&quot;table-container&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Categoría&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Título&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Autor(es)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Tema/Género&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Capítulos Leídos / Completado&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fahrenheit 451&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ray Bradbury&lt;/td&gt;
&lt;td&gt;Ciencia ficción&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Un país llamado Brasil:&lt;/strong&gt; La historia de Brasil desde el descubrimiento hasta el siglo XXI&lt;/td&gt;
&lt;td&gt;Marco Antonio Villa&lt;/td&gt;
&lt;td&gt;Historia&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;El arte de la gestión:&lt;/strong&gt; una guía práctica para integrar liderazgo y recursos humanos en tecnología&lt;/td&gt;
&lt;td&gt;Camille Fournier&lt;/td&gt;
&lt;td&gt;Negocios&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desarrollo Personal&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;El gran libro del bebé&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thatiane Mahet&lt;/td&gt;
&lt;td&gt;Maternidad y paternidad&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 id=&quot;2021&quot;&gt;2021&lt;/h3&gt;
&lt;div class=&quot;table-container&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Categoría&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Título&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Autor(es)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Tema/Género&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Capítulos Leídos / Completado&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Los ingenieros del caos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Giuliano da Empoli&lt;/td&gt;
&lt;td&gt;Política&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Filosofía para mortales:&lt;/strong&gt; Pensar bien para vivir bien&lt;/td&gt;
&lt;td&gt;Daniel Gomes de Carvalho&lt;/td&gt;
&lt;td&gt;Filosofía&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Un mundo feliz&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aldous Huxley&lt;/td&gt;
&lt;td&gt;Ciencia ficción&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ocio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;La vuelta al mundo en 80 días&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Julio Verne&lt;/td&gt;
&lt;td&gt;Aventura&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;La cuarta revolución industrial&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Klaus Schwab&lt;/td&gt;
&lt;td&gt;Economía&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funcionales&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;El trabajo no tiene que ser una locura&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;David Heinemeier Hansson; Jason Fried&lt;/td&gt;
&lt;td&gt;Negocios&lt;/td&gt;
&lt;td&gt;Completado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;En los próximos años, tengo la intención de mantener esta lista actualizada, con el objetivo de registrar mis lecturas y compartir
mis experiencias con otros lectores. Además, espero que esta lista ayude a reflexionar sobre mis
intereses y a mantenerme motivado para seguir leyendo y aprendiendo.&lt;/p&gt;
&lt;p&gt;Hasta luego. 📚☕&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Café Tecnológico: Principios Fundamentales de las Pruebas Unitarias]]></title><description><![CDATA[Presentación]]></description><link>https://blog.decodifique.com/es/principios-fundamentais-de-testes-unitarios/</link><guid isPermaLink="false">https://blog.decodifique.com/es/principios-fundamentais-de-testes-unitarios/</guid><pubDate>Sat, 07 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;presentacion&quot;&gt;Presentación&lt;/h2&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 59.27083333333333%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vQksGorJ7n5w30Bem_eWDPonu6k8g6Ez-bKvqVzv5W3-0FJ3-QW5-SlKB0XFyIvDXqwVOF_7OfVNFUh/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Programación Asistida por IA: Acelerando el Desarrollo con Herramientas de Inteligencia Artificial]]></title><description><![CDATA[Contexto Recientemente me encontré con una aplicación frontend de tamaño mediano escrita en Angular 6 (sí, cuyo EOL fue en 2019).
La tarea…]]></description><link>https://blog.decodifique.com/es/programacao-assistida-por-ia-acelerando-o-desenvolvimento/</link><guid isPermaLink="false">https://blog.decodifique.com/es/programacao-assistida-por-ia-acelerando-o-desenvolvimento/</guid><pubDate>Sun, 10 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;contexto&quot;&gt;Contexto&lt;/h2&gt;
&lt;p&gt;Recientemente me encontré con una aplicación frontend de tamaño mediano escrita en &lt;strong&gt;Angular 6&lt;/strong&gt; (sí, cuyo EOL fue en 2019).
La tarea era actualizar el proyecto a una versión &lt;strong&gt;LTS (Long Term Support)&lt;/strong&gt; de Angular. Opté, como primer movimiento, por actualizar a la primera versión LTS disponible, la versión &lt;code class=&quot;language-text&quot;&gt;16.2.X&lt;/code&gt;. Sin embargo, no soy especialista en frontend ni en el stack de &lt;strong&gt;Node.js&lt;/strong&gt;, y necesitaría bastante tiempo o el apoyo de otro desarrollador con más conocimiento del framework.&lt;/p&gt;
&lt;p&gt;El proyecto tenía &lt;strong&gt;40 módulos&lt;/strong&gt; y &lt;strong&gt;175 componentes&lt;/strong&gt;, distribuidos según la siguiente tabla:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
 Language            Files        Lines         Code     Comments       Blanks
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
 CSS                     &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;          &lt;span class=&quot;token number&quot;&gt;334&lt;/span&gt;          &lt;span class=&quot;token number&quot;&gt;271&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;43&lt;/span&gt;
 HTML                  &lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;11903&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;10206&lt;/span&gt;          &lt;span class=&quot;token number&quot;&gt;693&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;1004&lt;/span&gt;
 JavaScript              &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;78&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;49&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
 JSON                    &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;           &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
 Sass                  &lt;span class=&quot;token number&quot;&gt;247&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;12575&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;9431&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;1284&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;1860&lt;/span&gt;
 SVG                     &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
 TypeScript            &lt;span class=&quot;token number&quot;&gt;370&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;36123&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;27318&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;2904&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;5901&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
 Total                 &lt;span class=&quot;token number&quot;&gt;811&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;61039&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;47301&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;4920&lt;/span&gt;         &lt;span class=&quot;token number&quot;&gt;8818&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La opción de contar con el apoyo de otro desarrollador no era viable, y tampoco podía dedicar semanas al proyecto de migración. Entonces decidí adoptar un enfoque que vi recientemente en canales de YouTube: experimentar con el uso de &lt;code class=&quot;language-text&quot;&gt;AI Code Assist&lt;/code&gt; en el IDE para que me ayudara. Aunque soy usuario de &lt;strong&gt;JetBrains IDEA&lt;/strong&gt; y de &lt;strong&gt;GitHub Copilot&lt;/strong&gt; para proyectos de backend, en este caso quería probar algo nuevo y más enfocado en mi objetivo: apoyarme en mi conocimiento elemental de frontend y del framework Angular, y trabajar en un estilo de pair programming tipo &lt;strong&gt;Driver and Navigator&lt;/strong&gt; [1], alternando entre momentos en los que la IA generaba el código y yo lo revisaba, y viceversa.&lt;/p&gt;
&lt;h2 id=&quot;herramientas&quot;&gt;Herramientas&lt;/h2&gt;
&lt;p&gt;Para esta tarea, opté por probar el editor de código &lt;strong&gt;Cursor&lt;/strong&gt; [2], que cuenta con integración nativa de IA y promete un aumento de productividad con una serie de funcionalidades. A continuación, destaco las que usé, aunque existen otras más avanzadas descritas en la documentación [3].&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Tab&lt;/code&gt;: para sugerir o editar código a partir de un fragmento existente o una descripción;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Cursor Prediction&lt;/code&gt;: después de una edición realizada con &lt;code class=&quot;language-text&quot;&gt;Tab&lt;/code&gt;, Cursor predice fragmentos adicionales que pueden corregirse de la misma forma y salta automáticamente al siguiente fragmento con un nuevo &lt;code class=&quot;language-text&quot;&gt;tab ⇥&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Chat&lt;/code&gt;: para interactuar con la IA y entender un fragmento de código o pedir una sugerencia de implementación;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;AI Fix in Chat&lt;/code&gt;: donde se resalta un error detectado por el &lt;code class=&quot;language-text&quot;&gt;linter&lt;/code&gt;, y la IA abre un popup sugiriendo una solución;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Apply&lt;/code&gt;: para aplicar las sugerencias de la IA directamente en el editor;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Para usar Cursor &lt;strong&gt;no&lt;/strong&gt; es necesario tener una suscripción premium, aunque el uso es limitado [4]. En mi caso, opté por la suscripción Pro para garantizar el uso ilimitado de las funciones &lt;code class=&quot;language-text&quot;&gt;completions&lt;/code&gt; e &lt;code class=&quot;language-text&quot;&gt;instant apply&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Con Cursor, &lt;code class=&quot;language-text&quot;&gt;node&lt;/code&gt; en la versión &lt;code class=&quot;language-text&quot;&gt;20.11&lt;/code&gt; y el &lt;code class=&quot;language-text&quot;&gt;Angular CLI&lt;/code&gt; en la versión deseada instalados, comencé a trabajar.&lt;/p&gt;
&lt;h2 id=&quot;interactuando-con-la-ia-de-cursor&quot;&gt;Interactuando con la IA de Cursor&lt;/h2&gt;
&lt;p&gt;Lo primero que hice fue generar un nuevo proyecto con la versión 16 del Angular CLI y comparar las diferencias entre el proyecto antiguo y el nuevo. Noté que algunos archivos ya no eran necesarios, como &lt;code class=&quot;language-text&quot;&gt;angular-cli.json&lt;/code&gt;, mientras que otros necesitaban crearse o ajustarse, como &lt;code class=&quot;language-text&quot;&gt;angular.json&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;tsconfig.json&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;tslint.json&lt;/code&gt; y &lt;code class=&quot;language-text&quot;&gt;tsconfig.app.json&lt;/code&gt;. Le delegué a la IA la tarea de corregir esos archivos mediante interacciones con el siguiente formato:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Actualiza el archivo &lt;strong&gt;angular-cli.json&lt;/strong&gt; (en el contexto) a la versión 16 de Angular.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Con el siguiente resultado:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 464px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 165.82278481012656%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAhCAIAAABWXBxEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEYElEQVR42oVViXKjOBD1L0wNBnMjgQRIHOYQGPARO8nUHrX//zv7hJ1JNpOpValkIam7X3e/bm9cx71crvW+MU3Ttu3dDvN92OvAxrKsIAgJoZzztm2FEL7vbxzXzWQRRRGE74/0c8dxbNtybAsHb+frmQ0ZSmkYhvjcJH7Qu1EmRCGLPBdZluGCRFFIae/TOkllWcKaEBJrVVWMMUII3sDeJkvY38frH3/+dTlfnp6ut9uzUsM0zZ1Sr+Pyer69vP44ny+32wuu2rbj6yDr2ESEtEp1XQfd+32D66bRa13Vbd/XTVOVVV3v4ec4HpIkDuD6alZb1v6Y5na7vTuGjbkObAxja2xNfGP9bhjfja2lQ+isU4+N5/mXyxNwYj0eT7A5TcuyHCMS2+ngFecdLRwqHCrtVLlJOR+mYRgRLVjauK57PJ4hCYF5Pp5Ol9fXH0AIz8+XK64GbE54cO17NY7j8/PL9XoDeKCDZe98fuo6uN3jep6X0+mMdRwnhHCeT8vlRY1Lpw7z8aLGeZig6QqHQYgNAAAzXiulEBUEC3MGcu1C68Uy2t92SWv63Ay4GQkD6WN8mib4q0nSj6MOcNsBLexDEdQBBQ5xAjzgGIKqp6VZA97ozQ6Wd3a6c2EfWu4c2n0eNuLi6ntv/V2fuq6OduR4/4RSmz1MSo0gEJ67WtNjIigil4zxOE6QcHi70ruDPPJshwTZs5BZ0zCstTwAztDZNQ2cWlvskfL1ZGs+HDA1t5FxzzFJyllds7qiWeY5Xk6zJt0XSdHnXcnKLmtV3u95LRNRJBLn2GjYUAB1JMvkNBXLnBRFHPpJSFjEkjChAY28MA5oRjMeMRoQ4keRH5GAPIQRSpKm5XHJhyHrezko3jZO4KeE1ygkVuVxjqwC+U/MmA9h7CnKYpnFMPKm4ZkgMcNrz/VgIfIi3/V1ttb0fOwTm3tusCZlAdhp32f7vRNQy/V0P3h7b+9QDc5XwvqRbiByOpTHY9a25WFKyyryw7mcgLzNGsyEJB971Lvl+1fatZgkjmvZilT6LhCHzqMAnc/U+SiMTa56MQ5ymWCcxek9JSCJtdLy/4THAcJwHgGbywEdynxzWvv2AbS99tV3YWgHT3KlkLBYSOKD0tvvurNoVmE13jb3k8/C6LjwOUeeZUHjNPTDmlWgBxIOzolYsJBhTUkK8nwOGBIO1st5EodDLPIgoG3alqwA1UAv8BRaCiahLg4pArn5Tw2is3vePWx537G2s2kIqsAaKPnN+LaWx1ewH+LbLc3z8nxK24ZleS1QHvLaPJVcFwkIf4/WL3m+C5smqyogj+I4DZJRKPAEDAFVOOG+59+j81th3uzFYeT7mpcVZxnEVN4NQjXZXsS5oDl8RjP5WhjU0D6PY6q6MAgrVk7FYZQDJqoa4DHBnN8JF+UyZ/hbynhCbNfxPTQj1wu9AOWFVqFb3drtfhHeWehbKGAZizKRFS9CL0R/x7m5Ns2fVLVt+1/jzRCmlom8OAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;chat&quot;
        title=&quot;Figura 1. Chat con la IA para actualizar el archivo angular-cli.json&quot;
        src=&quot;/static/8a58419f6cc9c2ea33796fa9f9078d90/69096/chat.png&quot;
        srcset=&quot;/static/8a58419f6cc9c2ea33796fa9f9078d90/c26ae/chat.png 158w,
/static/8a58419f6cc9c2ea33796fa9f9078d90/6bdcf/chat.png 315w,
/static/8a58419f6cc9c2ea33796fa9f9078d90/69096/chat.png 464w&quot;
        sizes=&quot;(max-width: 464px) 100vw, 464px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 1. Chat con la IA para actualizar el archivo angular-cli.json&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Y el resultado de los cambios sugeridos por la IA se aplicaba directamente en el archivo deseado:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 19.62025316455696%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAtklEQVR42kXEW4rCMBQA0K6i7b1JapJ7J69aR7CCVBhQf1SmDfPn7GD2vwLfDBxOsYyz1jWsjagFlIBv8IDvsazrsoKqhrKSKKwxiFgkpiHxysoVqTWp/qVZ85O6T3JBuospEEfne0NbyRvNBWpwP9FfOpe5zXGeU5fb2378iKNPU2hzSDnYo1X7mdwpeVB20Mm6yFwII8Jv//m3D5elmdjnQCPjWeJJ3P8n4Ixw+xvEl3TkEeAKNwklTmnIOQUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;chat apply&quot;
        title=&quot;Figura 2. Resultado de los cambios sugeridos por la IA con la funcionalidad Apply&quot;
        src=&quot;/static/7909c0e18391338d9d05ad64c5d27808/f058b/chat-apply.png&quot;
        srcset=&quot;/static/7909c0e18391338d9d05ad64c5d27808/c26ae/chat-apply.png 158w,
/static/7909c0e18391338d9d05ad64c5d27808/6bdcf/chat-apply.png 315w,
/static/7909c0e18391338d9d05ad64c5d27808/f058b/chat-apply.png 630w,
/static/7909c0e18391338d9d05ad64c5d27808/40601/chat-apply.png 945w,
/static/7909c0e18391338d9d05ad64c5d27808/6937a/chat-apply.png 1094w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 2. Resultado de los cambios sugeridos por la IA con la funcionalidad Apply&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Una vez actualizados los archivos base del proyecto, pasé a las dependencias. Obviamente, muchas ya no existían, o habían cambiado de nombre. Por lo tanto, tuve que corregir manualmente algunas dependencias a partir de búsquedas en &lt;strong&gt;npm.js&lt;/strong&gt;, como por ejemplo &lt;code class=&quot;language-text&quot;&gt;angular-http&lt;/code&gt;, que fue incorporado a &lt;code class=&quot;language-text&quot;&gt;angular-common&lt;/code&gt;, o &lt;code class=&quot;language-text&quot;&gt;angular2-fontawesome&lt;/code&gt;, que fue descontinuado y reemplazado por &lt;code class=&quot;language-text&quot;&gt;@fortawesome/angular-fontawesome&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Una vez actualizadas las dependencias, y después de muchos &lt;code class=&quot;language-text&quot;&gt;npm install&lt;/code&gt;, llegó la hora de intentar ejecutar &lt;code class=&quot;language-text&quot;&gt;ng build&lt;/code&gt; y empezar a encontrarme con los primeros errores.&lt;/p&gt;
&lt;h2 id=&quot;fase-de-build-del-backend&quot;&gt;Fase de build del backend&lt;/h2&gt;
&lt;p&gt;Los proyectos Angular se dividen en dos grandes partes: el backend, con componentes, módulos y servicios; y el frontend, compuesto por templates, directivas, pipes y módulos de interfaz de usuario.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;En cinco años cambian muchas cosas, y en el caso de los proyectos frontend, los cambios fueron aún mayores.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mi enfoque fue ejecutar primero &lt;code class=&quot;language-text&quot;&gt;ng build&lt;/code&gt; para compilar el backend, y, como era de esperar, ocurrieron muchos errores de build, especialmente por la configuración &lt;code class=&quot;language-text&quot;&gt;strict&lt;/code&gt; de &lt;code class=&quot;language-text&quot;&gt;tsconfig.json&lt;/code&gt;, que ahora exigía que todas las variables estuvieran tipadas. Aunque podría haber desactivado esa configuración, preferí, con la ayuda de la IA, corregir los errores de tipado en cada archivo, usando las funcionalidades mencionadas al inicio del artículo. Además, muchas dependencias cambiaron de namespace, siendo uno de los principales ejemplos la separación de los componentes de &lt;strong&gt;Angular Material&lt;/strong&gt;, que antes estaban bajo el namespace &lt;code class=&quot;language-text&quot;&gt;@angular/material&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cientos de &lt;code class=&quot;language-text&quot;&gt;Tabs&lt;/code&gt; después, &lt;code class=&quot;language-text&quot;&gt;ng build&lt;/code&gt; finalmente compiló sin errores, y pude pasar a la fase de build del frontend.&lt;/p&gt;
&lt;h2 id=&quot;fase-de-build-del-frontend&quot;&gt;Fase de build del frontend&lt;/h2&gt;
&lt;p&gt;Ahora &lt;code class=&quot;language-text&quot;&gt;ng serve&lt;/code&gt; necesitaba compilar el frontend. Obviamente, muchas directivas habían cambiado, como el binding de propiedades y eventos, que tuvieron que corregirse.&lt;/p&gt;
&lt;p&gt;La explicación que dio la IA de Cursor para un error durante la migración del &lt;em&gt;binding de evento&lt;/em&gt; fue la siguiente:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;El cambio que mencionaste en la directiva de Angular de maxlength=&apos;100&apos; a [maxLength]=&apos;100&apos; refleja una actualización en la forma en que se vinculan las propiedades en Angular, especialmente en relación con el uso del property binding.&lt;/p&gt;
&lt;p&gt;Explicación del Cambio:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Property Binding:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Antes (Angular 6): La directiva usaba la sintaxis de atributo HTML estándar, donde maxlength se definía como un atributo HTML con un valor literal. Esto significa que el valor se trataba como una cadena de texto.&lt;/li&gt;
&lt;li&gt;Ahora (Angular 16): La nueva sintaxis [maxLength]=&apos;100&apos; utiliza el property binding de Angular. Esto permite que el valor se trate como una expresión de Angular, lo que significa que puedes pasar variables, expresiones o valores dinámicos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;La ventaja de contar con la IA proporcionando tanto la corrección como la explicación del cambio fue que pude usar la función de &lt;em&gt;Search All and Replace&lt;/em&gt; para corregir de una sola vez todos los fragmentos similares que necesitaban modificarse.&lt;/p&gt;
&lt;p&gt;Otro error frecuente era la falta de manejo de valores &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt; al acceder a propiedades de objetos, algo que TypeScript no aceptaba y debía corregirse. Este es un problema recurrente en proyectos legados, y la IA fue capaz de corregirlo a partir de sugerencias de &lt;code class=&quot;language-text&quot;&gt;Tab&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Después de un tiempo, &lt;code class=&quot;language-text&quot;&gt;ng serve&lt;/code&gt; finalmente compiló sin errores, y pude acceder a la aplicación en el navegador.&lt;/p&gt;
&lt;h2 id=&quot;publicando-la-aplicacion-y-creando-el-pull-request&quot;&gt;Publicando la aplicación y creando el Pull Request&lt;/h2&gt;
&lt;p&gt;Con la aplicación funcionando, solo restaba actualizar el archivo de pipeline para usar una versión más reciente de Node.js y crear el Pull Request en el repositorio.&lt;/p&gt;
&lt;p&gt;Este fue el resultado final de la rama &lt;code class=&quot;language-text&quot;&gt;enhancement/bump-up-angular-16&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt; &lt;span class=&quot;token number&quot;&gt;397&lt;/span&gt; files changed, &lt;span class=&quot;token number&quot;&gt;20290&lt;/span&gt; insertions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;+&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;token number&quot;&gt;19788&lt;/span&gt; deletions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El término &quot;Programación Asistida/Guiada por IA&quot;, y otros similares, estarán cada vez más presentes en el día a día de los equipos de ingeniería de software. Estudios de Gartner prevén que, para 2028, el 75% de los desarrolladores usarán herramientas de IA para escribir código [5]. Este movimiento ya es perceptible en la industria del software; Mercado Libre, por ejemplo, ya utiliza herramientas de IA para apoyar a sus más de 9.000 desarrolladores [6].&lt;/p&gt;
&lt;p&gt;En este breve relato, pude observar que, aunque no era un profundo conocedor de un stack específico, la productividad en la ejecución de la tarea aumentó significativamente. Un esfuerzo que antes habría requerido semanas se redujo a pocos días. Sin embargo, el conocimiento y la experiencia del desarrollador son indispensables, ya que, como demostré, muchas veces es el propio desarrollador quien debe decidir cuál es el enfoque más adecuado para resolver el problema. Así, el criterio, la sensibilidad y la experiencia del desarrollador fueron esenciales y no fueron sustituidos.&lt;/p&gt;
&lt;h2 id=&quot;lista-de-referencias&quot;&gt;Lista de referencias&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/articles/on-pair-programming.html&quot;&gt;Martin Fowler: On Pair Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cursor.com&quot;&gt;Cursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.cursor.com/get-started&quot;&gt;Get Started: Cursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cursor.com/pricing&quot;&gt;Pricing: Cursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gartner.com/en/newsroom/press-releases/2024-04-11-gartner-says-75-percent-of-enterprise-software-engineers-will-use-ai-code-assistants-by-2028&quot;&gt;Gartner Says 75% of Enterprise Software Engineers Will Use AI Code Assistants by 2028&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/customer-stories/mercado-libre&quot;&gt;Mercado Libre libera la mente de los desarrolladores para que se concentren en su misión con GitHub.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[SPA: ¿Azure App Services o Static Web Apps?]]></title><description><![CDATA[Contexto Recientemente me encontré con una aplicación SPA (Single Page Application) escrita en Angular que se venía distribuyendo desde…]]></description><link>https://blog.decodifique.com/es/azure-app-services-vs-static-web-apps/</link><guid isPermaLink="false">https://blog.decodifique.com/es/azure-app-services-vs-static-web-apps/</guid><pubDate>Sun, 11 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;contexto&quot;&gt;Contexto&lt;/h2&gt;
&lt;p&gt;Recientemente me encontré con una aplicación &lt;strong&gt;SPA (Single Page Application)&lt;/strong&gt; escrita en &lt;strong&gt;Angular&lt;/strong&gt; que se venía distribuyendo desde hacía mucho tiempo en un App Service de Azure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;App Services son plataformas como servicio (PaaS)&lt;/strong&gt; totalmente gestionadas, utilizadas para entregar aplicaciones web en diversos lenguajes, frameworks y sistemas operativos. Por ser gestionadas, ofrecen diversas configuraciones listas para usar, como escalado automático (scale up y scale out), dominios personalizados, SSL personalizado, integraciones de despliegue con GitHub Actions, Azure DevOps, entre otras capacidades.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pero, ¿será que un PaaS con tantas capacidades es la mejor opción para distribuir una SPA? Probablemente sí, pero tal vez no sea la más eficiente. Cualquier SPA moderna se reduce a un conjunto de archivos estáticos, que normalmente el navegador del cliente descarga en su totalidad. Por eso existen métodos más eficientes para distribuir esos archivos estáticos, aprovechando las capacidades que ofrecen las CDN.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CDN (Content Delivery Network)&lt;/strong&gt; es una red de servidores distribuidos geográficamente, diseñada para entregar contenido estático de manera eficiente, acercando esos assets al cliente final.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CDNs como Akamai, Verizon, entre otras, son extremadamente cacheables y relativamente económicas, considerando el volumen de tráfico en comparación con la infraestructura de servidores web y el tráfico de salida de soluciones de almacenamiento, como S3 y Azure Blob Storage.&lt;/p&gt;
&lt;p&gt;Con esto en mente, Azure creó una solución que combina algunas capacidades de un App Service con una red distribuida geográficamente para la publicación de assets: el servicio &lt;strong&gt;Static Web Apps&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67.08860759493672%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFElEQVR42o2ST2jTUBzHe/LgTfDmWRTUk4g3RRQRRJCBDoYgXgTZQSZ4cCgixqGH4lrmQC0bbuCYszDo5so2V2etoCg6263d1nTNlrRpkiZNmr/Ny4vvJaVlE4Zf3ksev/c+/P4GXNf9UeCHErnxr/lwPBOc+jMQX5Z1C9khdFvfkmKHvghdY3Q4VbUANqEdQD9icmV/d+xo79yea+8CV8f23oiulRVkd3zOU98Cf+E1/SolnntJd4wyvjHgXxx4kDkbzncOU+dfkMeera0L2LPtuMDBj7IVK/qrUlfU6yNS/zx/P0b9pI0m/HiWPfEk0xulbr/duPmGPP50ZZW3PM94eTEDIr45OE8RH2p3Jphb42RZsZtwcJE/ROQ6IsXLkeLpEHmyf31DtGwH5kSrIDfoOn4XzSj7HhUeThW7J4qhlOTXAsNV1f60vJXMlhLpTXT4vSU5+A72JLkrM2XGg4HjfMzyfbP0dJoHALRzRlKVmlaXVVmSJcE0dN94NyVcjJV0G+dtWpZQphmmUuVYTTfaMAoAeqX35ecpmeAzrX9jjVWxmf/od6NzRA4ltFYTmp7hdrU65B8ReW9avDTA9KT1MzNKJFnbBv8rRKFZsD1Yb8AjQerUc/K9aR+eqx0k8pwKdoN3OF8oaIOLwnAddi3pk0tye8L+R3jabDMra5xXLbh72DuE2s4JqNJshWUb/ty57l/Sn7C5Odf9eQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;swa vs app services&quot;
        title=&quot;Figura 1. ¿Static Web Apps o App Services para la distribución de estáticos?&quot;
        src=&quot;/static/b1c0c8da06a631813e4a6662850b5483/f058b/swa-vs-app-services.png&quot;
        srcset=&quot;/static/b1c0c8da06a631813e4a6662850b5483/c26ae/swa-vs-app-services.png 158w,
/static/b1c0c8da06a631813e4a6662850b5483/6bdcf/swa-vs-app-services.png 315w,
/static/b1c0c8da06a631813e4a6662850b5483/f058b/swa-vs-app-services.png 630w,
/static/b1c0c8da06a631813e4a6662850b5483/f7616/swa-vs-app-services.png 766w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 1. ¿Static Web Apps o App Services para la distribución de estáticos?&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;static-web-apps&quot;&gt;Static Web Apps&lt;/h2&gt;
&lt;p&gt;Además de la capacidad de distribuir SPAs desarrolladas en frameworks como Angular, React, Vue, Blazor, o incluso en HTML simple con CSS y JavaScript, Static Web Apps también permite una rápida integración con Azure Functions, que funcionarán como backend para la SPA, facilitando las restricciones de CORS y simplificando la infraestructura, ya que no será necesario mantener un servidor web completo [1].&lt;/p&gt;
&lt;p&gt;Algunas de las principales funcionalidades de SWA incluyen (consultar las cuotas del servicio [2]):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fácil integración con GitHub Actions y Azure DevOps Pipelines.&lt;/li&gt;
&lt;li&gt;Distribución global de assets.&lt;/li&gt;
&lt;li&gt;Certificados SSL gratuitos.&lt;/li&gt;
&lt;li&gt;Permite la personalización de dominios.&lt;/li&gt;
&lt;li&gt;Primeros 100 GB de tráfico de salida/mes incluidos.&lt;/li&gt;
&lt;li&gt;Integración con sistemas de autenticación como Microsoft Entra ID y GitHub.&lt;/li&gt;
&lt;li&gt;Creación y publicación de múltiples entornos.&lt;/li&gt;
&lt;li&gt;SLA del 99,95%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se puede argumentar que una solución de distribución usando Blob Storage y Azure Front Door puede lograr el mismo resultado, pero Front Door tiene un precio superior, por ser un producto más robusto y por ofrecer funciones avanzadas de distribución y enrutamiento entre regiones, que pueden ser innecesarias en casos de uso donde simplemente se desea entregar contenido estático de aplicaciones web.&lt;/p&gt;
&lt;p&gt;A continuación, una tabla comparativa en relación con el costo de cada solución:&lt;/p&gt;
&lt;div class=&quot;table-container&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solución&lt;/th&gt;
&lt;th&gt;¿Tiene nivel gratuito?&lt;/th&gt;
&lt;th&gt;Costo de contratación&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Azure App Services&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Desde USD 73,00 en el plan Standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Static Web Apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Sí&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;USD 9,00 por aplicación&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blob Storage + Front Door&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;(BS v2 LRS) Desde USD 22,00 + (FD) Desde USD 46,00 en el plan Standard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;En síntesis, &lt;strong&gt;Static Web App&lt;/strong&gt; es una alternativa simple, económica y confiable para la distribución de aplicaciones SPA en comparación con otros modelos ofrecidos por Azure.&lt;/p&gt;
&lt;h2 id=&quot;lista-de-referencias&quot;&gt;Lista de referencias&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/static-web-apps/&quot;&gt;Documentación de Static Web Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/static-web-apps/quotas&quot;&gt;Cuotas del servicio Static Web Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Pipeline de Liderazgo — El Trayecto hacia el Nivel Táctico]]></title><description><![CDATA[Presentación Cualquier empresa, independientemente de su sector, tamaño y ubicación geográfica, tiene dos características en común: una…]]></description><link>https://blog.decodifique.com/es/pipeline-da-lideranca-o-trajeto-ao-nivel-tatico/</link><guid isPermaLink="false">https://blog.decodifique.com/es/pipeline-da-lideranca-o-trajeto-ao-nivel-tatico/</guid><pubDate>Mon, 04 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;presentacion&quot;&gt;Presentación&lt;/h2&gt;
&lt;p&gt;Cualquier empresa, independientemente de su sector, tamaño y ubicación geográfica, tiene dos características en común: una estructura, sea cual sea, y una cultura organizacional, construida o emergente. Estos dos temas se relacionan al definir cuán jerarquizada será la estructura de la empresa y cuántos niveles son necesarios para gestionar las distintas áreas, además de determinar qué áreas son responsables de qué vertientes de la compañía. Aunque en principio estas estructuras parezcan perennes y fundamentales, no siempre se consideran saludables o despejadas, ya que esto requiere una cuidadosa organización de las transiciones de liderazgo, con atribuciones y responsabilidades debidamente establecidas y, en la medida de lo posible, sin superposiciones.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECAwX/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAeTNL6zLIUEuoP/EABkQAQADAQEAAAAAAAAAAAAAAAEAAiEREP/aAAgBAQABBQIlaYuw2Pg8gdP/xAAWEQADAAAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8BI//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BH//EAB0QAAECBwAAAAAAAAAAAAAAABEAIQECECBxcoH/2gAIAQEABj8ChlTaph2gLW//xAAaEAEBAQADAQAAAAAAAAAAAAABEQAhMYGh/9oACAEBAAE/IZFPXbeXX3ERExkOLrRwOGVat1yImOyu/9oADAMBAAIAAwAAABA34D7/xAAWEQADAAAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8QIf8A/8QAFxEBAAMAAAAAAAAAAAAAAAAAAQAQEf/aAAgBAgEBPxAmt//EAB4QAQACAwACAwAAAAAAAAAAAAEAESExUUFxgZHB/9oACAEBAAE/EHgkBXBxLXvYXtM/IqoGB2ev3LLxQz3LEFsU6cv5VjBYJlXzLd5GJapJWYVde5//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;pipelines&quot;
        title=&quot;Figura 1. Pipeline se refiere a la estructura secuencial y progresiva a través de la cual los individuos evolucionan en sus capacidades de liderazgo, desde funciones básicas hasta el más alto nivel de gestión dentro de una organización.&quot;
        src=&quot;/static/ec9161e469dc95d30f240a3bfd9d43d1/828fb/pipelines.jpg&quot;
        srcset=&quot;/static/ec9161e469dc95d30f240a3bfd9d43d1/ff44c/pipelines.jpg 158w,
/static/ec9161e469dc95d30f240a3bfd9d43d1/a6688/pipelines.jpg 315w,
/static/ec9161e469dc95d30f240a3bfd9d43d1/828fb/pipelines.jpg 630w,
/static/ec9161e469dc95d30f240a3bfd9d43d1/c08c5/pipelines.jpg 640w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 1. Pipeline se refiere a la estructura secuencial y progresiva a través de la cual los individuos evolucionan en sus capacidades de liderazgo, desde funciones básicas hasta el más alto nivel de gestión dentro de una organización.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;El libro &lt;strong&gt;&quot;&lt;em&gt;Pipeline&lt;/em&gt; de Liderazgo: El Desarrollo de Líderes como Diferencial Competitivo&quot;&lt;/strong&gt; [1], escrito por Ram Charan, Stephen Drotter y James Noel, presenta un modelo para entender y desarrollar las diferentes capas de liderazgo dentro de una organización. Sugiere que el desarrollo de liderazgos eficaces requiere un entendimiento claro de los requisitos, desafíos y transiciones asociados a cada etapa de la estructura.&lt;/p&gt;
&lt;p&gt;Esta estructura, denominada &quot;&lt;em&gt;pipeline&lt;/em&gt;&quot;, se asemeja a una escalera que el profesional debe subir, compuesta por siete niveles. En cada transición de nivel ocurre una nueva transición de liderazgo, y cada nivel está representado por un determinado cargo dentro de una estructura organizacional, como se muestra en la Tabla 1.&lt;/p&gt;
&lt;div class=&quot;table-container&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Nivel del &lt;em&gt;Pipeline&lt;/em&gt;&lt;/th&gt;
        &lt;th&gt;Cargo Representativo&lt;/th&gt;
        &lt;th&gt;Descripción Breve&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;1. Autogestión&lt;/td&gt;
        &lt;td&gt;Colaborador Individual&lt;/td&gt;
        &lt;td&gt;Foco en el desarrollo de habilidades técnicas y profesionales, gestionando el propio tiempo y tareas.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;2. Gestor de Otros&lt;/td&gt;
        &lt;td&gt;Líder de Equipo / Supervisor&lt;/td&gt;
        &lt;td&gt;Responsable de gestionar el trabajo de otros, motivar al equipo y evaluar el desempeño.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;3. Gestor de Gestores&lt;/td&gt;
        &lt;td&gt;Gerente de Gerentes / Director&lt;/td&gt;
        &lt;td&gt;Se enfoca en orientar a otros gerentes, desarrollando sus habilidades de liderazgo y estrategia.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;4. Gestor Funcional&lt;/td&gt;
        &lt;td&gt;Gerente de Departamento&lt;/td&gt;
        &lt;td&gt;Supervisa un área específica de la empresa, como finanzas o marketing, implementando estrategias funcionales.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;5. Gestor de Negocios&lt;/td&gt;
        &lt;td&gt;Gerente General / CEO de Unidad de Negocio&lt;/td&gt;
        &lt;td&gt;Responsable del desempeño general de una unidad de negocio, incluyendo rentabilidad y estrategia de mercado.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;6. Gestor de Grupo&lt;/td&gt;
        &lt;td&gt;CEO de Grupo / Vicepresidente&lt;/td&gt;
        &lt;td&gt;Gestiona múltiples unidades de negocio o regiones, asegurando la alineación estratégica y operativa.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;7. Gestor Corporativo&lt;/td&gt;
        &lt;td&gt;CEO / Presidente&lt;/td&gt;
        &lt;td&gt;Lidera la organización en su conjunto, estableciendo visión y estrategia corporativas, guiando la cultura organizacional.&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Tabla 1. Niveles del &lt;em&gt;Pipeline&lt;/em&gt; y el cargo correspondiente en una compañía tradicional.&lt;/p&gt;
&lt;p&gt;Los niveles y sus respectivas transiciones de liderazgo son representados por los autores a través del &lt;em&gt;pipeline&lt;/em&gt; ilustrado en la figura referenciada a continuación. La Figura 1 muestra la progresión de cada etapa dentro de la estructura organizacional.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.22784810126582%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAv0lEQVR42qWSiQqEMAxE+//fWlvvo1WzvEBEZBfrGgiRIq8zkzp5WeM4Sl3X0ve9DMMg7h/Itm3a67pK0zTar4ApJQkhHMpyznq273s5kJ+XZVFV0zSpGkB8G4x6BKyqSrz3x7QLzuVKQFjruk4bCD3Ps+Z4LfcrdG42m4SORcBs9arqFmihY43Ztq3mRVtWRUBAlguKzB7AO9BXILmgKsaoE3vnDRYBWTsglKDKMuIci0/LATAoj9Qe6hNVZ+AHIM2z+Ec9NygAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Progresión de liderazgo en el pipeline&quot;
        title=&quot;Figura 2. Progresión de liderazgo en el pipeline. (Adaptado de: CHARAN, Ram; DROTTER, Stephen; NOEL, James, 2011, p.27)&quot;
        src=&quot;/static/c47e161d13b5d45982639a9e5746dec0/f058b/niveis-no-pipeline.png&quot;
        srcset=&quot;/static/c47e161d13b5d45982639a9e5746dec0/c26ae/niveis-no-pipeline.png 158w,
/static/c47e161d13b5d45982639a9e5746dec0/6bdcf/niveis-no-pipeline.png 315w,
/static/c47e161d13b5d45982639a9e5746dec0/f058b/niveis-no-pipeline.png 630w,
/static/c47e161d13b5d45982639a9e5746dec0/40601/niveis-no-pipeline.png 945w,
/static/c47e161d13b5d45982639a9e5746dec0/78612/niveis-no-pipeline.png 1260w,
/static/c47e161d13b5d45982639a9e5746dec0/2ed34/niveis-no-pipeline.png 1776w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 2. Progresión de liderazgo en el pipeline. (Adaptado de: CHARAN, Ram; DROTTER, Stephen; NOEL, James, 2011, p.27)&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;En esta reseña, presentaré de forma resumida las ideas principales de las &lt;strong&gt;dos primeras transiciones&lt;/strong&gt;, además de reflexionar sobre la necesidad de que cada una esté bien establecida.&lt;/p&gt;
&lt;h2 id=&quot;del-colaborador-individual-al-nivel-tactico&quot;&gt;Del Colaborador Individual al Nivel Táctico&lt;/h2&gt;
&lt;p&gt;La gestión empresarial establece desde hace tiempo que, en general, existen tres niveles organizacionales en las empresas: el &lt;strong&gt;operativo&lt;/strong&gt;, relacionado con las tareas del día a día y de corto plazo; el &lt;strong&gt;táctico&lt;/strong&gt;, que traduce directrices estratégicas en planes de acción de mediano plazo; y el &lt;strong&gt;estratégico&lt;/strong&gt;, que define la dirección general y los objetivos de largo plazo de la organización.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.12658227848101%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACCUlEQVR42pVSTWsTURTNPxFcBfMnpKsYAq6U1KWCIoWCn0kES2uVboylddOitAspqEiXRtM0hjYltpqaSDAB7aKatJk4zXwlM/Pm6zjvTYxtQ6A+ONx558097577rg//uSzdAZFsb+P0n/sObxzHGSjkdDV+ptrYfnxwMsHBal4gso31mw0kL9bQLGhHLuoJEkLQarUYeJ6HqqqgHI2apjGoHRWqpaKyJGHl6h7W7nJYj3EwDMe761ClPsuyWDKFoihMjFq3bduDZbMMbZ8gP9JAceI3qk8PkLu8h0am3Vel7yR2aQGfvmpIvpWQSiku2nj/TkY6q0DW7CPt7AnSyiRJYpFWbZomiGG6fxIUdjQEp+oIJZoIPSwjOJZH+AmHs5M1zK+ILN92jgkahgFBEJh1KqbrxOUIlLaGkXkeQ2P7CD/iELydQ3A0idD4Ls5NNl00UN41eqIDLf+doB+CjLmNGhY361j46CL/CwubFHXGzeVqSH9vUjmWwx7lOGzHaxxPZFwpPcOF4jSGi7OIFGcQ+TKDS6kpRD5PI1Jyv0uzOF9IIMtXPMudTgccx7GRoRBFEbrbR1PV8aC6jFOrNxD4cA/+TAz+bByBxesIPL8GfzrKuDOZOE6v3kJ4KwHJVPstdycLont4v/oGd769RKzyCtEuYttLiLpctPqPi1deY7T8AlvCDv4A2rZiUcdudsEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Niveles organizacionales de una empresa&quot;
        title=&quot;Figura 3. Niveles organizacionales de una empresa.&quot;
        src=&quot;/static/b30e652f452dadf0d67906fc1bd03cff/f058b/niveis-organizacionais.png&quot;
        srcset=&quot;/static/b30e652f452dadf0d67906fc1bd03cff/c26ae/niveis-organizacionais.png 158w,
/static/b30e652f452dadf0d67906fc1bd03cff/6bdcf/niveis-organizacionais.png 315w,
/static/b30e652f452dadf0d67906fc1bd03cff/f058b/niveis-organizacionais.png 630w,
/static/b30e652f452dadf0d67906fc1bd03cff/40601/niveis-organizacionais.png 945w,
/static/b30e652f452dadf0d67906fc1bd03cff/f2d92/niveis-organizacionais.png 1027w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 3. Niveles organizacionales de una empresa.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Bien delimitados y con un inicio claramente definido, los profesionales al comienzo de su carrera pasarán sus primeros años en una organización como colaboradores individuales, normalmente encargados de tareas bien definidas, de corta duración y con objetivos muy bien determinados.&lt;/p&gt;
&lt;p&gt;En este momento, el profesional se encargará de moldear sus &lt;strong&gt;habilidades&lt;/strong&gt;, su &lt;strong&gt;gestión del tiempo&lt;/strong&gt; y sus &lt;strong&gt;valores profesionales&lt;/strong&gt;, entre otras características que demuestren la capacidad de asumir responsabilidades y respetar los valores de la empresa. Una vez comprobado que estos tres puntos se han desarrollado razonablemente, este profesional será, por lo general, promovido a líder o gerente de primer nivel.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Para desarrollar líderes eficaces [...], las organizaciones necesitan identificar tempranamente a los candidatos a líder, ofrecerles tareas para su crecimiento, darles retroalimentación útil y asesorarlos. (p.31)&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Es importante señalar que la denominación del cargo puede variar de una empresa a otra — pudiendo ser líder, coordinador, gerente de primer nivel, entre otros —, pero lo esencial es enfatizar que, en esta primera transición de liderazgo, el nuevo líder estará gestionando no solo a sí mismo, sino también a otras personas, lo que exige una transición conductual y de habilidades y valores fundamentales para el éxito en el cargo.&lt;/p&gt;
&lt;p&gt;Estas nuevas habilidades, descritas en la Tabla 2, incluyen &lt;strong&gt;planificar el trabajo, asignar tareas, motivar y evaluar críticamente el trabajo realizado por otras personas&lt;/strong&gt;, es decir, no solo concluir el trabajo que se le asigna, sino también ayudar a otros a alcanzar el desempeño esperado. En este punto, es crucial que el trabajo gerencial sea valorado, y no solo tolerado, ya que dedicar tiempo a atender las demandas del equipo, resolver dudas, buscar contactos y diálogo con otros equipos, departamentos y proveedores es fundamental para alcanzar los objetivos de sus liderados y, en consecuencia, determinar su éxito.&lt;/p&gt;
&lt;p&gt;Para los nuevos líderes, desprenderse de las tareas y habilidades que los llevaron a un cargo de liderazgo puede ser un desafío, pero es necesario comprender que, en este nuevo nivel, los resultados se obtienen a través de los demás. El éxito de los subordinados directos refleja el éxito del líder. Por lo tanto, &lt;strong&gt;es esencial verse a sí mismo como un gestor&lt;/strong&gt;, que define el trabajo a realizar y permite que este sea ejecutado por sus subordinados, con confianza y responsabilidad, enseñando en lugar de solo corregir errores, y manteniéndose cerca de los problemas y fracasos que enfrenta el equipo. Los líderes en esta primera transición deben, ante todo, ser accesibles y estar disponibles, tanto física como emocionalmente, demostrando que, a través de la accesibilidad, dominan la gestión de su propio tiempo.&lt;/p&gt;
&lt;div class=&quot;table-container&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Aspecto&lt;/th&gt;
        &lt;th&gt;Colaborador Individual&lt;/th&gt;
        &lt;th&gt;Gerente de Primer Nivel&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td class=&quot;bold&quot;&gt;Habilidades&lt;/td&gt;
        &lt;td&gt;Dominio técnico/especializado, trabajo en equipo, desarrollo de relaciones para beneficio personal, uso de herramientas/procesos&lt;/td&gt;
        &lt;td&gt;Planificación, definición de cargo, selección, delegación, monitoreo, &lt;em&gt;coaching/feedback&lt;/em&gt;, evaluación de desempeño, motivación, comunicación, desarrollo de relaciones para beneficio del departamento, adquisición de recursos&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td class=&quot;bold&quot;&gt;Gestión del Tiempo&lt;/td&gt;
        &lt;td&gt;Disciplina diaria, cumplimiento de plazos personales, administración del propio tiempo&lt;/td&gt;
        &lt;td&gt;Planificación anual, disponibilidad para subordinados, definición de prioridades, tiempo de comunicación con otras áreas&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td class=&quot;bold&quot;&gt;Valores Profesionales&lt;/td&gt;
        &lt;td&gt;Obtención de resultados por proficiencia, trabajo de alta calidad, incorporación de los valores de la empresa&lt;/td&gt;
        &lt;td&gt;Obtención de resultados a través de otros, éxito de los subordinados, éxito del departamento, integridad&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Tabla 2. Características de la Primera Transición de Liderazgo. (Adaptado de: CHARAN, Ram; DROTTER, Stephen; NOEL, James, 2011, p.64)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cuando los líderes carecen de aptitud para la gestión del tiempo, enfrentan problemas en la planificación de tareas y en la determinación de prioridades para el equipo. Como resultado, con frecuencia no tendrán tiempo para ayudar a sus subordinados, lo que obstruirá el flujo de trabajo y probablemente sobrecargará tanto a ellos mismos como a los demás. De igual manera, la ausencia de los valores profesionales adecuados lleva a dificultades para delegar actividades. Muchas veces, estos líderes optan por realizar las tareas por su cuenta, descuidando la planificación. Esto resulta en la falta de métodos gerenciales apropiados, volviendo caótico el ambiente de trabajo y poco estables o poco eficaces las relaciones y comunicaciones con otros equipos.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;La segunda transición — de gestor a gestor de gestores — en el liderazgo debe marcar una transición completa del enfoque operativo hacia la gestión táctica de los equipos&lt;/strong&gt;, además de priorizar el desarrollo de los nuevos líderes. Esto incluye mentoría, &lt;em&gt;coaching&lt;/em&gt;, retroalimentación continua y evaluaciones, además de delegar tareas que los incentiven a practicar habilidades de gestión del tiempo adecuadas para liderar un equipo.&lt;/p&gt;
&lt;p&gt;Cuando estos líderes están mal formados o instruidos, pueden surgir ciertos problemas de gestión, lo que indica que estos gerentes de gestores pueden estar en la posición equivocada o aún no han desarrollado plenamente sus habilidades, incluyendo la gestión del tiempo y los valores profesionales. Entre estos problemas se destacan la &lt;strong&gt;dificultad para delegar&lt;/strong&gt;, la &lt;strong&gt;mala gestión del desempeño de los gerentes de primer nivel&lt;/strong&gt;, la &lt;strong&gt;incapacidad de desarrollar un equipo fuerte&lt;/strong&gt; — quizás el principal problema, especialmente cuando hay favoritismos y falta de evaluación adecuada por competencia —, un &lt;strong&gt;enfoque excesivo en la ejecución del trabajo&lt;/strong&gt;, y la tendencia a &lt;strong&gt;seleccionar colaboradores que sean clones de sí mismos&lt;/strong&gt;, en lugar de optar por diversidad y competencia.&lt;/p&gt;
&lt;p&gt;Para que los gerentes de gestores desempeñen su papel con excelencia, deberían concentrarse en &lt;strong&gt;la selección y capacitación de nuevos gerentes altamente competentes&lt;/strong&gt;, &lt;strong&gt;exigir a estos líderes que rindan cuentas por el trabajo gerencial realizado&lt;/strong&gt;, &lt;strong&gt;asignar recursos entre las unidades según sea necesario&lt;/strong&gt;, y &lt;strong&gt;administrar los límites entre cada unidad de acuerdo con la estructura organizacional establecida&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Se observa que, en el modelo de &lt;em&gt;pipeline&lt;/em&gt; establecido por los autores, no ocurre superposición de roles. La clara definición de habilidades, gestión del tiempo y valores profesionales esperados en cada etapa del proceso proporciona un ambiente propicio para el surgimiento de nuevos liderazgos. Así, se elimina la necesidad de contratar exclusivamente a profesionales destacados, permitiendo potenciar los liderazgos internos para que desempeñen sus roles de forma adecuada, sin competencia entre líderes y liderados por una misma acción.&lt;/p&gt;
&lt;p&gt;Finalmente, al establecer los requisitos apropiados para los diferentes niveles de liderazgo, se facilita el proceso de planificación de sucesión, reduciendo la tensión emocional para los nuevos líderes recién promovidos. Como destacan los autores, &quot;cuando alguien salta etapas de liderazgo y se lo coloca en una posición para la cual no posee las habilidades, el dominio de la gestión del tiempo y los valores profesionales necesarios, el impacto emocional es significativo. El modelo de &lt;em&gt;pipeline&lt;/em&gt; hace improbable el salto de esas etapas.&quot;&lt;/p&gt;
&lt;h2 id=&quot;consideraciones&quot;&gt;Consideraciones&lt;/h2&gt;
&lt;p&gt;Establecer roles en una estructura organizacional siempre es un desafío. Se vuelve aún más difícil cuando estas definiciones no son claras y objetivas, o cuando falta un plan formal de coaching y formación por parte de los niveles superiores, que, según los autores, serían los responsables de formar a los sucesores. La ausencia de estas definiciones crea vacíos en el &lt;em&gt;pipeline&lt;/em&gt;, lo que lleva a superposiciones de funciones: la situación de gerentes realizando tareas operativas en lugar de gestionarlas es quizás el síntoma más evidente del descuido de las habilidades necesarias, la gestión del tiempo y los valores profesionales requeridos para alcanzar un desempeño excepcional en el cargo.&lt;/p&gt;
&lt;p&gt;Aunque esta disfunción es común, combatirla es fundamental. La formación de líderes en los primeros niveles de una estructura organizacional, que cumplan con los requisitos mencionados, es indispensable. Al fin y al cabo, es en las capas operativa y táctica donde todas las empresas, independientemente de su tamaño y sector, generan sus ingresos mediante el desarrollo de productos y servicios. Además, estos niveles representan la puerta de entrada para nuevos talentos, ya sea mediante reclutamiento o formación interna.&lt;/p&gt;
&lt;p&gt;Finalmente, la adopción de este modelo representa un paso estratégico vital para las organizaciones que buscan no solo mantener su competitividad en un mercado en constante evolución, sino también garantizar un legado de liderazgo fuerte y sostenible a lo largo de los años.&lt;/p&gt;
&lt;h2 id=&quot;lista-de-referencias&quot;&gt;Lista de referencias&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com.br/Pipeline-lideran%C3%A7a-Ram-Charan/dp/8543106052&quot;&gt;Libro &quot;Pipeline de liderazgo&quot; – Amazon&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;enlaces-adicionales&quot;&gt;Enlaces adicionales&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://leadershippipelineinstitute.com/resources&quot;&gt;The Leadership Institute — Resources&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Navegando por Grandes Números: Un Viaje Profesional en el Corazón del E-commerce]]></title><description><![CDATA[Presentación]]></description><link>https://blog.decodifique.com/es/navegando-por-grandes-numeros-uma-jornada-profissional-no-coracao-do-e-commerce/</link><guid isPermaLink="false">https://blog.decodifique.com/es/navegando-por-grandes-numeros-uma-jornada-profissional-no-coracao-do-e-commerce/</guid><pubDate>Sat, 17 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;presentacion&quot;&gt;Presentación&lt;/h2&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 59.27083333333333%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vROE3hdEY3rodKzUXc21j6Wk1ZPB_iFELjsVm2BcRpkaZh-tj580u-sPNijBFaJ67HQhiPi_rUAr5Pq/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Reseña de la parte II del libro "The Software Architect Elevator"]]></title><description><![CDATA[Parte II – Arquitectura Las diversas definiciones de arquitectura de software recopiladas por el Instituto de Ingeniería de Software de la…]]></description><link>https://blog.decodifique.com/es/the-software-architect-elevator-parte-2/</link><guid isPermaLink="false">https://blog.decodifique.com/es/the-software-architect-elevator-parte-2/</guid><pubDate>Wed, 03 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;parte-ii--arquitectura&quot;&gt;Parte II – Arquitectura&lt;/h2&gt;
&lt;p&gt;Las diversas definiciones de arquitectura de software recopiladas por el Instituto de Ingeniería de Software de la Universidad Carnegie Mellon [1] sugieren que esta expresión no tiene un significado obvio cuando se examina de forma aislada. Aunque los términos &quot;arquitectura&quot; y &quot;software&quot; tienen significados delineados con precisión, su combinación intrínseca depende del contexto específico en el que se aplican.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAME/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAa3sTKqq9wQj/8QAGxAAAgMBAQEAAAAAAAAAAAAAAAECAxIRITH/2gAIAQEAAQUCxN24MHiOQLa57f1QSbfD/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAQ/9oACAEDAQE/ASN//8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAQ/9oACAECAQE/AWd//8QAHRAAAgIBBQAAAAAAAAAAAAAAABECEDEBIzJBUf/aAAgBAQAGPwKK43g0bNvBGPo+6//EABsQAQADAAMBAAAAAAAAAAAAAAEAESExUXHh/9oACAEBAAE/IaHmtr3GWR+2KaV4xnnMV8IaNeTCL7LHU//aAAwDAQACAAMAAAAQ88c9/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPxAH/8QAFhEBAQEAAAAAAAAAAAAAAAAAASAh/9oACAECAQE/EEmw/8QAGhABAQEBAQEBAAAAAAAAAAAAAREhADFR4f/aAAgBAQABPxBpJkoJH5zlIZy3zpxACxvb718AYq2/ZvayiGL48mcsBsKzhlPoHpEDy73/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;arquitetura&quot;
        title=&quot;Figura 1. La arquitectura de software es más que dibujar diagramas de componentes.&quot;
        src=&quot;/static/e3a43dc2c82456c99ced08b5cd2c378f/828fb/arquitetura.jpg&quot;
        srcset=&quot;/static/e3a43dc2c82456c99ced08b5cd2c378f/ff44c/arquitetura.jpg 158w,
/static/e3a43dc2c82456c99ced08b5cd2c378f/a6688/arquitetura.jpg 315w,
/static/e3a43dc2c82456c99ced08b5cd2c378f/828fb/arquitetura.jpg 630w,
/static/e3a43dc2c82456c99ced08b5cd2c378f/0ede0/arquitetura.jpg 945w,
/static/e3a43dc2c82456c99ced08b5cd2c378f/72e01/arquitetura.jpg 1024w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 1. La arquitectura de software es más que dibujar diagramas de componentes.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Gregor Hohpe postula que todo software tiene una arquitectura, aunque no sea intencional. Esa arquitectura debería impulsar la eficiencia de los equipos de ingeniería al permitir el desarrollo en paralelo y la evaluación de los componentes creados. Además, sostiene que ninguna arquitectura es perfecta y que siempre existe una combinación de decisiones a considerar, siendo el contexto el principio organizador de todas ellas.&lt;/p&gt;
&lt;p&gt;La documentación de arquitectura de software debe contener las decisiones no triviales y siempre ofrecer al lector el razonamiento detrás de cada elección realizada, observando el contexto que sirvió como catalizador. Además, la documentación debe enfatizar lo esencial, restar énfasis a lo innecesario y describir las limitaciones de una decisión arquitectónica. Es fundamental reconocer que toda decisión importante tiene sus desventajas.&lt;/p&gt;
&lt;p&gt;El autor advierte que &lt;strong&gt;las decisiones demasiado costosas de revertir más adelante deben tomarse desde el inicio del proyecto&lt;/strong&gt;, para evitar que el progreso se paralice debido al análisis de cada nuevo elemento introducido. Citando a Martin Fowler, Hohpe aclara que una de las tareas cruciales de los arquitectos de software es eliminar la irreversibilidad del diseño de software mediante abstracciones [2], patrones y paradigmas de desarrollo, con el fin de minimizar las decisiones irreversibles al principio del proceso. Si el nivel de conocimiento de las tecnologías por parte del equipo de ingenieros es insuficiente, es posible adoptar una arquitectura evolutiva, que se desarrolla a medida que crece la comprensión sobre esas herramientas.&lt;/p&gt;
&lt;p&gt;La arquitectura de software abarca más que componentes y sus interrelaciones. Es necesario adoptar un enfoque sistémico, enfatizando las relaciones y cómo cada estructura actúa como medio para alcanzar un comportamiento deseado. En este sentido, técnicas como los ciclos de retroalimentación negativa pueden aplicarse actuando como una autorregulación de los sistemas mediante las relaciones entre los componentes diseñados. El foco en el comportamiento también debe reflejarse en la documentación producida, donde debe ser el aspecto más relevante, en lugar de las estructuras estáticas.&lt;/p&gt;
&lt;p&gt;Controlar el software heredado también es un desafío en la arquitectura de software, y la clave para evitar la obsolescencia de estos sistemas es mantener su agilidad. Un sistema no es ágil si nadie puede modificarlo. Este temor a los cambios está justificado cuando no existen prácticas y técnicas de operación adecuadas, faltan métricas productivas y las implementaciones son esporádicas. Fowler afirma: &quot;si algo duele, hazlo más seguido&quot; [3]. En este contexto, las tareas problemáticas deben realizarse con frecuencia, de modo que se imponga la automatización.&lt;/p&gt;
&lt;p&gt;Para una arquitectura de software en operaciones a gran escala, el autor enfatiza la necesidad de una amplia automatización, desde procesos burocráticos como aprobaciones de solicitudes de infraestructura, hasta pipelines para el despliegue de aplicaciones. Lo que no pueda automatizarse debe convertirse en sistemas de &lt;em&gt;autoservicio&lt;/em&gt;, simplificando actividades rutinarias y predecibles. Una estrategia posible para la automatización de este tipo de sistema es la construcción de interfaces con validaciones integradas al ciclo de desarrollo de software, incluyendo el uso de código &lt;em&gt;boilerplate&lt;/em&gt; para nuevas aplicaciones y la configuración de servicios de infraestructura. También debe codificarse el conocimiento tácito en scripts y herramientas, evidenciando estos procesos y facilitando la transferencia de conocimiento. Por último, los sistemas automatizados para procesos ampliamente estandarizados y explícitos facilitan la auditoría de cumplimiento.&lt;/p&gt;
&lt;p&gt;La arquitectura de software implica tomar decisiones de diseño para evitar que los desarrolladores ejerzan una creatividad innecesaria. Esto significa que ciertos procesos deben establecerse previamente y mantenerse como estándares, con el fin de simplificar la operación del software y liberar a los equipos de ingeniería para aquello que aporta diferenciación de negocio a la empresa. La estandarización de componentes en TI simplifica las operaciones, permite economías de escala y ahorra recursos financieros gracias al aumento del poder de negociación con los proveedores.&lt;/p&gt;
&lt;p&gt;Esta estandarización debe considerarse en dos niveles: el nivel inferior, donde debe buscarse el máximo reaprovechamiento, ya que no siempre es el diferencial de la empresa, y el nivel superior, con software desarrollado internamente, que aporta el verdadero valor y la diferenciación competitiva en el mercado. Existe un elemento de conformidad en el que ocurren pocos cambios en los niveles más bajos, lo que facilita la estandarización con un conjunto común de herramientas.&lt;/p&gt;
&lt;p&gt;Al elaborar diagramas de arquitectura de software, ya sea utilizando modelos C4 [4] u otras notaciones gráficas, comúnmente se destacan los bloques que representan los componentes. Sin embargo, desde la perspectiva de Hohpe, estos diagramas deben diseñarse enfocándose en las funcionalidades y en las relaciones entre esos componentes, mediante líneas y flechas, para resaltar la comunicación entre los elementos que componen el sistema en diferentes niveles. Este enfoque contribuye a una comprensión más clara y eficiente de la arquitectura del software y de su dinámica.&lt;/p&gt;
&lt;p&gt;Finalmente, al adoptar un conjunto de tecnologías de un proveedor, es crucial cuestionar los límites de cada herramienta y cómo se relacionan con el sistema en su conjunto. De esta forma, es posible establecer las fronteras de la solución propuesta y garantizar un enfoque más eficiente para la arquitectura de software.&lt;/p&gt;
&lt;h2 id=&quot;consideraciones&quot;&gt;Consideraciones&lt;/h2&gt;
&lt;p&gt;La dificultad para definir con precisión la arquitectura de software surge del intento de asociarla directamente con los componentes más fundamentales del software, como los datos y el código. Aunque temas como la arquitectura en capas, los patrones de diseño y el diseño del código fuente están relacionados con la arquitectura de software, esa asociación es solo parcialmente cierta. Como se observó, las estrategias formadas por el contexto en el que está inserto el arquitecto de software son indisociables de los principios que guían el diseño, la implementación y la evolución de esos sistemas.&lt;/p&gt;
&lt;p&gt;Es fundamental establecer límites, responsabilidades y relaciones de cada componente seleccionado para conformar el mapa de la arquitectura, teniendo en cuenta todas las restricciones impuestas por el entorno y por el objeto observado, cuya representación sistémica se construirá. De esta forma, la arquitectura de software va más allá de los componentes básicos y abarca aspectos más amplios y complejos, que involucran las decisiones y estrategias específicas para cada contexto y proyecto.&lt;/p&gt;
&lt;h2 id=&quot;lista-de-referencias&quot;&gt;Lista de referencias&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://resources.sei.cmu.edu/asset_files/factsheet/2010_010_001_513810.pdf&quot;&gt;What is your definition of software architecture? – Carnegie Mellon University&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf&quot;&gt;Who Needs an Architect? – Martin Fowler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/bliki/FrequencyReducesDifficulty.html&quot;&gt;Frequency Reduces Difficulty – Martin Fowler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://c4model.com/&quot;&gt;C4 Model – Simon Brown&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;enlaces-adicionales&quot;&gt;Enlaces adicionales&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://architectelevator.com/&quot;&gt;Gregor Hohpe – Página personal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com.br/Software-Architect-Elevator-Gregor-Hohpe/dp/1492077542&quot;&gt;Libro &quot;The Software Architect Elevator&quot; – Amazon&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Reseña de la parte I del libro "The Software Architect Elevator"]]></title><description><![CDATA[Contexto La arquitectura de software ha sido objeto de acaloradas discusiones entre técnicos y gestores de TI durante décadas. Muchas obras…]]></description><link>https://blog.decodifique.com/es/the-software-architect-elevator-parte-1/</link><guid isPermaLink="false">https://blog.decodifique.com/es/the-software-architect-elevator-parte-1/</guid><pubDate>Wed, 25 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;contexto&quot;&gt;Contexto&lt;/h2&gt;
&lt;p&gt;La arquitectura de software ha sido objeto de acaloradas discusiones entre técnicos y gestores de TI durante décadas. Muchas obras de grandes autores, como Mark Richards, Sam Newman, Len Bass, George Fairbanks, Frederick Brooks Jr., entre otros, han contribuido a esclarecer este vasto tema.&lt;/p&gt;
&lt;p&gt;En esta reseña se abordará la primera parte del libro &lt;strong&gt;&quot;The Software Architect Elevator&quot;&lt;/strong&gt; [1], titulado en portugués como &quot;El elevador del arquitecto de software&quot;, escrito por Gregor Hohpe [2], autor también del aclamado EIP, &lt;strong&gt;&quot;Enterprise Integration Patterns&quot;&lt;/strong&gt; [3], un catálogo de patrones esenciales para integraciones entre sistemas.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 150%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAeABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIDBQEE/8QAFwEBAAMAAAAAAAAAAAAAAAAAAgABA//aAAwDAQACEAMQAAAB5XNmtBmpTyRsCJCv/8QAHBAAAgICAwAAAAAAAAAAAAAAAQIDEiIjETEz/9oACAEBAAEFApRqYZ3HE4JDsLJJUSVJl6dLGY7ZPFGw/8QAFxEBAQEBAAAAAAAAAAAAAAAAAAESUf/aAAgBAwEBPwFl1mV//8QAGREAAgMBAAAAAAAAAAAAAAAAAAECEiEx/9oACAECAQE/AS4uRLSWH//EAB4QAAICAgIDAAAAAAAAAAAAAAABAhESQQNhIVFx/9oACAEBAAY/AofTk6eQqI1XgXZjLQ8nog/RaGIR/8QAHhABAAMBAAEFAAAAAAAAAAAAAQARMSFBUXGBocH/2gAIAQEAAT8h7XpaFhdB/YD41QUQB22oexeDIT6OpknATm5eI5tpH+Ag+qXexP/aAAwDAQACAAMAAAAQYzV9/8QAGBEBAQEBAQAAAAAAAAAAAAAAAQARMSH/2gAIAQMBAT8Q9FtvJNZ0X//EABoRAQEAAgMAAAAAAAAAAAAAAAEAESExQWH/2gAIAQIBAT8QEQ9sTTJMlxXV/8QAIRABAQACAgEEAwAAAAAAAAAAAREAIUFRYTGRobHR8PH/2gAIAQEAAT8QjHNvndOTJ6Ee7IfRwU3nMsdXoHZ+Mi3oCIkje8l1bbycYDL4AV2quCZsNdnrhtCN8v7M1jgPjDU6Vvz/AHEpGke2f//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Elevadores&quot;
        title=&quot;Figura 1. Los arquitectos de software necesitan transitar por diferentes niveles organizacionales.&quot;
        src=&quot;/static/0940c4e41e1c8ccc95535578d7d22056/828fb/elevadores.jpg&quot;
        srcset=&quot;/static/0940c4e41e1c8ccc95535578d7d22056/ff44c/elevadores.jpg 158w,
/static/0940c4e41e1c8ccc95535578d7d22056/a6688/elevadores.jpg 315w,
/static/0940c4e41e1c8ccc95535578d7d22056/828fb/elevadores.jpg 630w,
/static/0940c4e41e1c8ccc95535578d7d22056/0ede0/elevadores.jpg 945w,
/static/0940c4e41e1c8ccc95535578d7d22056/3ac88/elevadores.jpg 1260w,
/static/0940c4e41e1c8ccc95535578d7d22056/c3b2b/elevadores.jpg 3648w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Figura 1. Los arquitectos de software necesitan transitar por diferentes niveles organizacionales.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;parte-i--arquitectos&quot;&gt;Parte I – Arquitectos&lt;/h2&gt;
&lt;p&gt;En esta primera parte, el autor enumera las habilidades y características deseables en un arquitecto de software, y qué funciones debería desempeñar dentro de una organización, como: visión estratégica de amplio alcance, liderazgo técnico y buena gestión de personas.
El autor afirma que estos profesionales deben lidiar con discusiones que van más allá del ámbito técnico, como &lt;strong&gt;el contexto situacional en el que están insertos&lt;/strong&gt; y &lt;strong&gt;ciertas suposiciones tácitas&lt;/strong&gt;, que a veces ocultan información contextual fundamental, además de establecer comunicación entre diferentes niveles organizacionales.&lt;/p&gt;
&lt;p&gt;Encontrar el equilibrio correcto en las decisiones de diseño de acuerdo con los objetivos y principios establecidos es fundamental, conectando los componentes de software para que puedan trabajar en conjunto y alcanzar el resultado esperado, sin dejar de lidiar con la complejidad mediante el uso de técnicas de gobernanza.&lt;/p&gt;
&lt;p&gt;En cuanto a la comunicación, el autor utiliza la metáfora de un elevador de un edificio, que conecta los niveles inferiores, donde los ingenieros de sistemas trabajan en la creación y el mantenimiento de los sistemas de software del negocio, con los niveles superiores, donde se encuentran los ejecutivos responsables de la alta abstracción del negocio ofrecido por la organización. Esta conexión se representa mediante la metáfora de un elevador de un edificio. En este contexto, la función del arquitecto es transitar naturalmente por esos niveles, sin perder la esencia del mensaje, es decir, adaptando el lenguaje utilizado según las necesidades específicas.&lt;/p&gt;
&lt;p&gt;En situaciones donde hay resistencia a la actuación del arquitecto de software en la comunicación entre diferentes niveles, el autor argumenta que es necesario trabajar para reducir esa resistencia. Una forma de lograrlo es haciendo que los niveles superiores se interesen y estén al tanto de los proyectos realizados por ingeniería. Además, es importante establecer ciclos frecuentes de retroalimentación.&lt;/p&gt;
&lt;p&gt;En cuanto a las características técnicas, Hohpe describe que los arquitectos deben garantizar que las soluciones desarrolladas mantengan el equilibrio y la proporción de las ideas iniciales. Esta capacidad también la menciona Frederick Brooks Jr. en su libro &lt;strong&gt;&quot;El mítico hombre-mes&quot;&lt;/strong&gt;, donde se la denomina &quot;integridad conceptual&quot;. Brooks destaca la importancia de que el arquitecto trabaje para unir las ideas que componen el sistema y mantener la cohesión del conjunto.&lt;/p&gt;
&lt;p&gt;La experiencia del arquitecto en proyectos de diferentes tamaños es fundamental, ya que le permite tener la sensibilidad para identificar oportunidades de cambio que van más allá de los requisitos funcionales esperados en un sistema. Estos cambios pueden incluir la necesidad de soportar variaciones en el tráfico de datos procesado, cambios de entorno cuando el sistema se traslada a un nuevo proveedor de computación en la nube, o la necesidad de implementar funcionalidades de internacionalización para hacerlo disponible en varios idiomas.&lt;/p&gt;
&lt;p&gt;Otro aspecto técnico importante es promover la construcción de herramientas para la construcción y entrega de software en producción, aumentando la velocidad de entrega de los cambios y reduciendo el riesgo de errores en operaciones manuales realizadas por los equipos de operaciones.
El arquitecto de software debe garantizar que su criterio técnico esté libre de sesgos, por lo que debe procurar mantenerse en contacto con otros expertos que le brinden información que le permita ver más allá de las palabras de moda, y discernir si una solución es realmente nueva o simplemente &quot;recalentada de forma inteligente&quot;. Esto es importante porque evita que el arquitecto se sienta cómodo siempre con el mismo abanico de soluciones, o que emplee nuevas herramientas de forma irracional, sin buenas razones para aplicarlas.&lt;/p&gt;
&lt;p&gt;Según el autor, la arquitectura empresarial es la organización lógica de los procesos de negocio y de la infraestructura de TI que los soporta, uniendo los logros de los arquitectos de negocio y de TI. Existen diversas herramientas de mapeo de procesos empresariales utilizadas por los arquitectos. Según Hohpe, los arquitectos deben actuar con cautela al usar estas herramientas como meros documentadores, ya que pueden entregar un producto final desactualizado apenas se publica. Sin embargo, este enfoque estático plantea un dilema recurrente para los arquitectos, pues puede no reflejar con precisión las interacciones en constante cambio dentro del entorno empresarial.&lt;/p&gt;
&lt;p&gt;Existen diferentes niveles de seniority para los arquitectos de software, que según Hohpe pueden identificarse aplicando el trípode de &lt;strong&gt;habilidad, impacto y liderazgo&lt;/strong&gt;, donde la habilidad se refiere a la capacidad de resolver problemas reales con las herramientas adecuadas; el impacto mide cómo las habilidades del arquitecto benefician a la empresa, ayudándola a alcanzar sus objetivos estratégicos y de mercado; y el liderazgo determina la capacidad del arquitecto de promover el estado de sus prácticas, compartiendo conocimiento a través de charlas, blogs, publicaciones y al mentorizar a otros profesionales.&lt;/p&gt;
&lt;p&gt;Por último, la habilidad de hacer las preguntas correctas e identificar quién toma las decisiones y cuáles son las motivaciones detrás de ellas es una competencia indispensable para el arquitecto de software.&lt;/p&gt;
&lt;h2 id=&quot;consideraciones&quot;&gt;Consideraciones&lt;/h2&gt;
&lt;p&gt;Las reflexiones presentadas por Hohpe en esta primera parte son fundamentales para entender la posición que ocupa el arquitecto de software dentro del complejo ecosistema organizacional, que involucra a diversos grupos de interés y va mucho más allá de las decisiones puramente técnicas relacionadas con aspectos de ingeniería u operaciones.&lt;/p&gt;
&lt;p&gt;Sin embargo, es importante destacar que la capacidad de comunicación y toma de decisiones es el aspecto más importante para el éxito de una gestión, independientemente del área observada, ya sea para establecer un nuevo hito o para cambiar el rumbo de un proyecto que se ha desviado de lo planeado.&lt;/p&gt;
&lt;h2 id=&quot;lista-de-referencias&quot;&gt;Lista de referencias&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://architectelevator.com/&quot;&gt;Gregor Hohpe – Página personal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com.br/Software-Architect-Elevator-Gregor-Hohpe/dp/1492077542&quot;&gt;Libro &quot;The Software Architect Elevator&quot; – Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com.br/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683&quot;&gt;Libro &quot;Enterprise Integration Patterns&quot; – Amazon&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Actualizando Sleuth para Spring Boot 3.0]]></title><description><![CDATA[Contexto Recientemente, mi equipo y yo estábamos trabajando en actualizaciones de bibliotecas de APIs que utilizan . Estas
actualizaciones…]]></description><link>https://blog.decodifique.com/es/sleuth-spring-boot-30/</link><guid isPermaLink="false">https://blog.decodifique.com/es/sleuth-spring-boot-30/</guid><pubDate>Sun, 08 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;contexto&quot;&gt;Contexto&lt;/h2&gt;
&lt;p&gt;Recientemente, mi equipo y yo estábamos trabajando en actualizaciones de bibliotecas de APIs que utilizan &lt;code class=&quot;language-text&quot;&gt;Spring Boot&lt;/code&gt;. Estas
actualizaciones se realizaron en proyectos que usaban el framework en la versión &lt;code class=&quot;language-text&quot;&gt;2.7.X&lt;/code&gt;, y quisimos aprovechar la ocasión para subir a la versión &lt;code class=&quot;language-text&quot;&gt;3.0.1&lt;/code&gt;,
disponible
desde &lt;a href=&quot;https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga&quot;&gt;Generally Available a finales de noviembre de 2022&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La guía de actualización disponible
en el &lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide&quot;&gt;repositorio oficial del framework&lt;/a&gt; transcurrió bien, con el build y las pruebas automatizadas ejecutándose sin problemas.&lt;/p&gt;
&lt;p&gt;Sin embargo, al ejecutar el proyecto y observar los logs, notamos la ausencia del &lt;code class=&quot;language-text&quot;&gt;Trace Id&lt;/code&gt; y del &lt;code class=&quot;language-text&quot;&gt;Span Id&lt;/code&gt; en los registros, los cuales
se enriquecen mediante el uso de la biblioteca &lt;a href=&quot;https://spring.io/projects/spring-cloud-sleuth&quot;&gt;Spring Cloud Sleuth&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token number&quot;&gt;2023&lt;/span&gt;-01-06T20:06:46.830-03:00  INFO &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;my-test-app,&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;TRACE_ID_HERE_BUT_EMPTY&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;,&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;SPAN_ID_HERE_BUT_EMPTY&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;29324&lt;/span&gt; --- &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;nio-8080-exec-6&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; c.a.Loren &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Loren ipsun&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;problema&quot;&gt;Problema&lt;/h2&gt;
&lt;p&gt;Una lectura rápida de la documentación de Sleuth nos indica que este proyecto fue absorbido
por &lt;a href=&quot;https://micrometer.io/docs/tracing&quot;&gt;Micrometer Tracing&lt;/a&gt; a partir
de la &lt;strong&gt;versión 3.0 de Spring Boot&lt;/strong&gt;, por lo que aparentemente quedó descontinuado &lt;strong&gt;a partir de la versión 3.1&lt;/strong&gt;.
Esto también lo confirma el GitHub oficial de Micrometer, donde se presenta
una &lt;a href=&quot;https://github.com/micrometer-metrics/tracing/wiki/Spring-Cloud-Sleuth-3.1-Migration-Guide&quot;&gt;guía de migración&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sin embargo, la guía de migración no parece estar completa, ya que seguirla no dio como resultado la correcta impresión de los datos de trazabilidad.&lt;/p&gt;
&lt;p&gt;Por lo tanto, el objetivo del siguiente paso a paso es ayudarlos con esta migración.&lt;/p&gt;
&lt;h2 id=&quot;solucion&quot;&gt;Solución&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Verifique que el proyecto esté usando la versión 3.0 de Spring Boot;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;groovy&quot;&gt;&lt;pre class=&quot;language-groovy&quot;&gt;&lt;code class=&quot;language-groovy&quot;&gt;plugins &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.springframework.boot&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; version &lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3.0.1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Elimine la dependencia de Sleuth;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;groovy&quot;&gt;&lt;pre class=&quot;language-groovy&quot;&gt;&lt;code class=&quot;language-groovy&quot;&gt;&lt;span class=&quot;token function&quot;&gt;implementation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.springframework.cloud:spring-cloud-starter-sleuth&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Agregue la dependencia de Micrometer Tracing con el bridge para Brave, responsable de la creación de los tracers;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;groovy&quot;&gt;&lt;pre class=&quot;language-groovy&quot;&gt;&lt;code class=&quot;language-groovy&quot;&gt;&lt;span class=&quot;token function&quot;&gt;implementation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;io.micrometer:micrometer-tracing-bridge-brave&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Si no la tiene, agregue la dependencia de Spring Actuator. Es necesaria para la autoconfiguración de
Micrometer;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;groovy&quot;&gt;&lt;pre class=&quot;language-groovy&quot;&gt;&lt;code class=&quot;language-groovy&quot;&gt;&lt;span class=&quot;token function&quot;&gt;implementation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;org.springframework.boot:spring-boot-starter-actuator&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Finalmente, siguiendo la guía de migración de Micrometer, agregue la propiedad de &lt;strong&gt;log pattern&lt;/strong&gt; en el
archivo &lt;code class=&quot;language-text&quot;&gt;.properties&lt;/code&gt;
o &lt;code class=&quot;language-text&quot;&gt;.yml&lt;/code&gt; para que el &lt;strong&gt;Trace Id&lt;/strong&gt; y el &lt;strong&gt;Span
Id&lt;/strong&gt; se impriman correctamente;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;properties&quot;&gt;&lt;pre class=&quot;language-properties&quot;&gt;&lt;code class=&quot;language-properties&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;logging.pattern.level&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al ejecutar nuevamente el proyecto, los Ids de Trace y Span volverán a funcionar correctamente.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token number&quot;&gt;2023&lt;/span&gt;-01-06T20:16:46.830-03:00  INFO &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;my-test-app,63b8a986c713b025bfcb74bfc7c64a77,bfcb74bfc7c64a77&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;29324&lt;/span&gt; --- &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;nio-8080-exec-6&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; c.a.Loren &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Loren ipsun&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para cualquier duda, estoy disponible a través de mis contactos.&lt;/p&gt;
&lt;p&gt;Buen código para todos. 😎&lt;/p&gt;
&lt;h2 id=&quot;lista-de-referencias&quot;&gt;Lista de referencias&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga&quot;&gt;Lanzamiento de Spring Boot 3.0 en GA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide&quot;&gt;Guía de migración a Spring Boot 3.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://spring.io/projects/spring-cloud-sleuth&quot;&gt;Spring Cloud Sleuth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://micrometer.io/docs/tracing&quot;&gt;Documentación de Micrometer Tracing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/micrometer-metrics/tracing/wiki/Spring-Cloud-Sleuth-3.1-Migration-Guide&quot;&gt;Guía de migración de Sleuth 3.1 a Micrometer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item></channel></rss>