<?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[Decodifique Blog RSS Feed]]></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[My Career Midpoint, Part II]]></title><description><![CDATA[Prologue: Experts and privateers In my last year of college, talking with a classmate, she told me she had been working at a biometric…]]></description><link>https://blog.decodifique.com/en/meu-midpoint-de-carreira-parte-2/</link><guid isPermaLink="false">https://blog.decodifique.com/en/meu-midpoint-de-carreira-parte-2/</guid><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;prologue-experts-and-privateers&quot;&gt;Prologue: Experts and privateers&lt;/h2&gt;
&lt;p&gt;In my last year of college, talking with a classmate, she told me she had been working at a biometric security technology startup, and that they were looking for a .NET programmer to build software using that technology for service kiosks, web &lt;em&gt;sign-in&lt;/em&gt;, and &lt;em&gt;mobile&lt;/em&gt; apps.&lt;/p&gt;
&lt;p&gt;By then, I was already working at the Forensic and Scientific Police department of São Paulo as a web programmer, on a GED (Electronic Document Management) system built in &lt;strong&gt;CakePHP&lt;/strong&gt; and &lt;strong&gt;MongoDB&lt;/strong&gt;, though already a bit unsure it would have a long life there. Let me explain: I had left a consultancy that had its own in-house framework, only to now work with a technology that also wasn&apos;t very attractive to the market, like PHP.&lt;/p&gt;
&lt;p&gt;Since the office on Faria Lima was close to the Superintendency&apos;s, I negotiated with the biometrics company&apos;s manager to work &lt;em&gt;part-time&lt;/em&gt;, in the afternoon/evening shift, balancing it with the Superintendency in the morning and early afternoon.&lt;/p&gt;
&lt;p&gt;My negotiation went well, and I kept up that double-workday rhythm for six months, until, one day, I witnessed a rather peculiar moment of the public sector at the Superintendency: the bidding process. The outsourced software consultancy&apos;s contract was expiring, and a new bid would be opened to decide who would take over the service from then on. That uncertainty over who would win the bid had been hanging over all the outsourced staff for weeks, stirring up all sorts of expectations and fears, especially the fear that the project wouldn&apos;t continue. A new company won the bid that had been opened. The winner could choose whether or not to rehire the outsourced staff already there, but that&apos;s not what happened. Given that, the company I was contracted through gave me two options: send me to a project in Alphaville, in Barueri, or let me go. I chose the latter.&lt;/p&gt;
&lt;h2 id=&quot;uncle-bill-finally-paying-the-bills&quot;&gt;Uncle Bill, finally paying the bills&lt;/h2&gt;
&lt;p&gt;Once I was let go, I started working &lt;em&gt;fulltime&lt;/em&gt; at the startup, in early 2016, my first experience as an independent contractor too. After an office move to Vila Olímpia, I found myself right in the middle of the startup boom and did a lot of &lt;em&gt;networking&lt;/em&gt; with companies across the pharmaceutical, healthcare, and fintech sectors, and other digital products on the rise at the time, like cryptocurrencies, overseas asset brokers, and all sorts of &lt;em&gt;sharing economy&lt;/em&gt; platforms, riding Uber&apos;s wake, trying to become unicorns, with a lot of &lt;em&gt;private equity&lt;/em&gt; capital flowing in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unicorn companies &quot;are start-ups (early-stage companies with a repeatable and scalable business model through technology) that have reached a market value of US$1 billion — at least&quot; [1].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Around that time, I also started an MBA (Master of Business Administration) in Software Engineering at the University of São Paulo&apos;s Polytechnic School, but I won&apos;t go into more detail so as not to open a huge parenthesis in this prologue — it&apos;s just worth mentioning that the point of the MBA was to earn a graduate-level &lt;em&gt;lato sensu&lt;/em&gt; degree.&lt;/p&gt;
&lt;p&gt;During my time at the startup, I ran into much more interesting challenges than before: I started actually using Git in my &lt;em&gt;workflow&lt;/em&gt;, and I finally got to work with the whole, and only the, Microsoft .NET &lt;em&gt;stack&lt;/em&gt;: &lt;strong&gt;Windows Forms&lt;/strong&gt;, on versions 4.6.x at the time, C#, REST APIs (Application Programming Interfaces / Representational State Transfer) in ASP.NET MVC Web API, and &lt;strong&gt;WPF (Windows Presentation Foundation)&lt;/strong&gt;. Let&apos;s break it down:&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;Figure 1. The WPF visual designer in Visual Studio, with the MainWindow&amp;#39;s XAML on the left and the interface preview on the right.&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;Figure 1. The WPF visual designer in Visual Studio, with the MainWindow&amp;#39;s XAML on the left and the interface preview on the right.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET Framework: Microsoft&apos;s development framework, Windows-only, the foundation for the technologies below.&lt;/li&gt;
&lt;li&gt;Windows Forms: framework for building graphical interfaces for Windows applications, &lt;em&gt;drag-and-drop&lt;/em&gt; style.&lt;/li&gt;
&lt;li&gt;C#: strongly-typed, object-oriented programming language developed by Microsoft.&lt;/li&gt;
&lt;li&gt;ASP.NET MVC: web framework for building web pages via the Razor markup syntax; SOAP APIs (Simple Object Access Protocol), through the WCF (Windows Communication Foundation) extension, or REST, through the Web API extension.&lt;/li&gt;
&lt;li&gt;WPF: framework for building graphical interfaces meant to replace Windows Forms, also &lt;em&gt;drag-and-drop&lt;/em&gt; style, but with a markup syntax through the XAML (Extensible Application Markup Language) language, based on 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;Figure 2. The evolution of the .NET Framework: each version stacked new libraries on top of the 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;Figure 2. The evolution of the .NET Framework: each version stacked new libraries on top of the Common Language Runtime.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s exactly where I found myself, working with the tools I was genuinely interested in, in a period of intense learning in technology, both from working with what I liked and from being in an environment where, with practically no team, it was just me as the backend programmer and one colleague responsible for the Android app development. I had total creative freedom to decide how to apply engineering techniques that were new to me, like automated tests (unit, &lt;em&gt;stress&lt;/em&gt;, and integration) and design principles, like SOLID and layered project separation. It was also in those years that I got into a richer set of readings, like the &lt;em&gt;The Pragmatic Programmer&lt;/em&gt; series, by &lt;strong&gt;Andy Hunt&lt;/strong&gt; and &lt;strong&gt;Dave Thomas&lt;/strong&gt;, and the books by &lt;strong&gt;Robert C. Martin&lt;/strong&gt;, &lt;em&gt;The Clean Coder&lt;/em&gt; and &lt;em&gt;Clean Code&lt;/em&gt;. It was also during this period that I attended many tech events, like TDC (The Developers Conference) and several &lt;em&gt;meetups&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A few months later, after running into some personal obstacles, by mutual agreement with the company&apos;s management, we decided to end the service contract I provided, and I went back to testing the market once again &lt;img src=&quot;/florzinha-easter-egg.png&quot; alt=&quot;🌼&quot; class=&quot;emoji-icon&quot; /&gt;. With considerably more experience and background under my belt, now fluent in the Microsoft &lt;em&gt;stack&lt;/em&gt;, I quickly landed somewhere new: a consultancy whose main line of business was the insurance sector, and I was assigned to one of its biggest clients.&lt;/p&gt;
&lt;h2 id=&quot;orchestrating-alphabet-soup&quot;&gt;Orchestrating alphabet soup&lt;/h2&gt;
&lt;p&gt;The change, starting in the second half of 2016, was a big one: leaving the startup world for my first experience in the corporate world, with bureaucracy, processes, decades-old system integrations, dozens of teams just within IT, and technology restricted to a select group of companies, with knowledge just as secretive, like a cult. While I had built up technical knowledge from my previous experience, the lack of a team left me weak in political skills and teamwork. Now I&apos;d have to work with developers far more experienced than me, with knowledge already well established in the business domain, especially when it came to claims rules.&lt;/p&gt;
&lt;p&gt;Because I had a good command of .NET and learned fast, I was picked to take part in a high-visibility project at the company: rolling out the &lt;strong&gt;Oracle SOA Suite (Service-Oriented Architecture)&lt;/strong&gt; platform, managing and orchestrating integrations between the various claims modules, and building a &lt;em&gt;workflow&lt;/em&gt; interface so analysts and the approval chain could analyze, evaluate, and rule on claims and settlement processes.&lt;/p&gt;
&lt;p&gt;This was a fairly complex project, since it involved migrating business rules from a monolithic &lt;em&gt;in-company&lt;/em&gt; system, partly built in VB.NET, partly in ASP (Active Server Pages, which I really thought I&apos;d never see again, a relic from the late &apos;90s), over to components on the Java J2EE (Java 2 Platform, Enterprise Edition) platform, like &lt;em&gt;servlets&lt;/em&gt; and EJB (Enterprise JavaBeans), and to the &lt;em&gt;middleware&lt;/em&gt; itself: the ADF (Application Development Framework) interfaces for &lt;em&gt;Human Tasks&lt;/em&gt; (an Oracle take on JSF, &lt;em&gt;JavaServer Faces&lt;/em&gt;), the &lt;em&gt;Mediators&lt;/em&gt;, for routing, filtering, and transforming data between different components, BPEL (Business Process Execution Language) and BPMN (Business Process Model and Notation) for orchestrating services and tasks, and the &lt;em&gt;Business Rules&lt;/em&gt;, for building a set of rules executed at &lt;em&gt;runtime&lt;/em&gt;, separately from the application code. Not to mention integrating with legacy systems via SOAP (Simple Object Access Protocol), WCF again, and its whole XML specification: XSD, XSLT, and XPath. I&apos;ll admit it: it&apos;s an alphabet soup of letters and terms. But it goes even further: all of this connected to &lt;em&gt;on-premises&lt;/em&gt; Oracle 11c or 12c databases, versioned partly in SVN (Apache Subversion) and partly in Microsoft TFS (Team Foundation Server), both centralized version control models.&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;Figure 3. A BPEL process in Oracle JDeveloper, orchestrating calls between services.&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;Figure 3. A BPEL process in Oracle JDeveloper, orchestrating calls between services.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-quality-leap&quot;&gt;The quality leap&lt;/h2&gt;
&lt;p&gt;I did well, and quickly mastering that &lt;em&gt;enterprise stack&lt;/em&gt; from Oracle earned me recognition. My situation improved: I got an offer to be brought on staff by the company, in mid-2017, no longer outsourced and now enjoying a career plan and better benefits. Taking advantage of that improvement, it was finally time to leave my studio apartment and rent my first real apartment. I also finished my MBA, and, catching myself reflecting on everything I&apos;d been through, I realized that, at that point, life really had taken a big leap in quality.&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;Figure 4. One of my theoretical study sources on the Oracle Suite toolset was this small 900-page handbook.&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;Figure 4. One of my theoretical study sources on the Oracle Suite toolset was this small 900-page handbook.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I spent the next two years in a steady routine of hard work at the insurance company, on my &lt;em&gt;Workflows&lt;/em&gt; team. Curiously, that skill with orchestrating APIs (Application Programming Interfaces) would turn out to be quite valuable in future projects. The new phases of the SOA project kept expanding into new areas: I built management dashboards and updated some of the company&apos;s technologies, at the request of the American headquarters.&lt;/p&gt;
&lt;p&gt;But work alone wasn&apos;t enough. I kept up a steady study routine, reading about Agile, Microservices, Enterprise Integration Patterns, and other software architecture topics, until I felt challenged to go for Microsoft certifications. To do that, I built a study routine based on Microsoft&apos;s own Exam Ref books and supplementary materials from Packtpub. In a year and a half, I earned three: the &lt;strong&gt;MCP (Microsoft Certified Professional)&lt;/strong&gt;, the &lt;strong&gt;MCSA (Microsoft Certified Solutions Associate)&lt;/strong&gt;, and the &lt;strong&gt;MCSD (Microsoft Certified Solutions Developer)&lt;/strong&gt;, in the areas of C#, ASP.NET MVC, and 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;Figure 5. My Microsoft Certified Solutions Developer badge, earned in 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;Figure 5. My Microsoft Certified Solutions Developer badge, earned in 2019.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;These badges may have little practical use nowadays, but the challenge of studying and going deep into topics that often get overlooked is an incredibly rich form of learning. Not to mention that, for me personally, it was my starting point for consuming material in English. Before that, I don&apos;t remember ever having read and studied 500-page books in another language. I&apos;m grateful I made that call.&lt;/p&gt;
&lt;h2 id=&quot;back-to-square-one-and-new-uncertainties&quot;&gt;Back to square one, and new uncertainties&lt;/h2&gt;
&lt;p&gt;With all that knowledge in .NET development, Azure &lt;em&gt;cloud&lt;/em&gt;, and also in SDLC (Software Development Life Cycle) tools, like VSTS (Visual Studio Team Services), later renamed Azure DevOps, I was called, in early 2018, by my very first employer, to provide external consulting on a new solution they were building: an &lt;em&gt;omnichannel&lt;/em&gt; sales system, built entirely from scratch with Microsoft technology. I took on the challenge and pushed them toward building the architecture for this new solution, based on microservices, already on .NET Core 2.0.&lt;/p&gt;
&lt;p&gt;I kept working both fronts in parallel, and in 2019 I opened up a new one: I started a Master&apos;s in IT at PUC-SP (Pontifícia Universidade Católica de São Paulo — Pontifical Catholic University of São Paulo), presenting a research project on the Internet of Things applied to São Paulo&apos;s basic sanitation, driven by the wish to one day have the chance to teach at a university.&lt;/p&gt;
&lt;p&gt;I&apos;d been at the insurance company for 3 years and a few months by then, and I felt a certain disconnect between my career expectations and how I was being valued professionally. I decided that this was the moment for another change, and, a few months later, I&apos;d change contexts completely once again — and, of all things, go back to a startup-flavored company, but now taking on a different industry: healthcare. I could say I was pretty much a senior programmer by then, at least in attitude, with a lot more experience and exuding confidence in my technical skills and my ability to work as an individual contributor, thanks to the intense routine of juggling two completely different projects in technology, scale, and challenges.&lt;/p&gt;
&lt;p&gt;I didn&apos;t know it yet, but once again the shot would miss its mark. And at an extremely delicate moment, too, since the year was 2020, just a few months after the first recorded case of SARS-CoV-2, in China [2]. From then on, nothing would be the same.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&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[My Career Midpoint, Part I]]></title><description><![CDATA[Prologue In September 2026, I completed 15 years of a career in Information Technology — my Crystal Anniversary. That was enough time to…]]></description><link>https://blog.decodifique.com/en/meu-midpoint-de-carreira-parte-1/</link><guid isPermaLink="false">https://blog.decodifique.com/en/meu-midpoint-de-carreira-parte-1/</guid><pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;prologue&quot;&gt;Prologue&lt;/h2&gt;
&lt;p&gt;In September 2026, I completed 15 years of a career in Information Technology — my &lt;em&gt;Crystal Anniversary&lt;/em&gt;. That was enough time to accumulate stories and experiences spanning the job market and academic life. I decided to revisit these memories and write down lessons and curious stories, protecting the people involved as much as possible.&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;Figure 1. 15 years of career, my Crystal Anniversary.&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;Figure 1. 15 years of career, my Crystal Anniversary.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I could open with a preface about the period before my first formal job — the Technical IT Course and my first experiences with computers — but that chapter is for the future.&lt;/p&gt;
&lt;p&gt;This story will have three main parts, milestones I consider important, spanning several years each, with a filler period between them: smaller stories, but no less interesting to recall.&lt;/p&gt;
&lt;p&gt;As it couldn&apos;t be any other way, we&apos;ll start with the call to adventure.&lt;/p&gt;
&lt;h2 id=&quot;interns-wind-pastries-and-cemeteries&quot;&gt;Interns, wind pastries, and cemeteries&lt;/h2&gt;
&lt;p&gt;In June 2011, having been accepted into the University for All Program (PROUNI) with a guaranteed scholarship in São Paulo to study Information Systems, I made my first major decision: leaving my parents&apos; house in the countryside to live in the capital, at 17 years old. I was already in my first semester of Systems Analysis and Development in my hometown, but nothing compared to the change in routine, scale, and challenges that came in the first months of this new life.&lt;/p&gt;
&lt;p&gt;Studying alone wasn&apos;t enough. Every day I faced more than 100 km of round-trip travel, from Tatuapé, in the East Zone of São Paulo, to Cotia, in the São Paulo Metropolitan Region (RMSP). In those first months, I was taken in by my aunt on my mother&apos;s side, Cida, to whom I owe immense gratitude. She certainly worked as hard as I did and, despite being strict, is an extremely protective person.&lt;/p&gt;
&lt;p&gt;This commuting challenge, on top of the routine at home, forced me to go after a job: make use of the daily trip between home and college to earn some income, gain my own independence, and save on commuting hours.&lt;/p&gt;
&lt;p&gt;Searching on the sorely missed &lt;em&gt;APInfo&lt;/em&gt; site, I sent out résumés for internship openings right in my first month of college. The first interview, luckily, landed me my first paid job, in September 2011: a small software consultancy, but with a big Enterprise Resource Planning (ERP) contract — a business management system — for an importer and retailer of clothing, footwear, and accessories.&lt;/p&gt;
&lt;p&gt;As an intern, I earned a salary slightly above minimum wage at the time (R$545.00) and a stipend, a kind of cash meal allowance (VR). For a 17-year-old who previously had nothing, it was a big win.&lt;/p&gt;
&lt;p&gt;That said, my productivity and focus — especially in calculus classes and during my ramp-up at the company, where I needed to work much harder to absorb the knowledge — were affected by the long commutes: for a few months, I left home at 5:30am to get to work, in the South Zone, by 10am, where I stayed until 5pm. Before college, I had a mandatory stop at a pastry stand in front of a church: a friendly &lt;em&gt;pastel&lt;/em&gt; with some vague memory of a filling, for about R$4.00, always backed up by guava-flavored starch snacks in my backpack. Then I headed to college, in the East Zone. On the way back, the connection to Line 4 was already closed, so I&apos;d catch the bus in front of Cemitério da Consolação and walk the entire length of Cardeal Arcoverde on foot, past sketchy bars and disreputable establishments, all the way to Largo da Batata, where I&apos;d board one of the last two intercity buses, at 11:45pm or 12:10am. I&apos;d get home, lie down, and a few hours later, start all over again.&lt;/p&gt;
&lt;p&gt;Bigger than the paycheck, though, was the learning in that consultancy environment, where every developer did a bit of everything: building features, finding and fixing bugs, touching databases and infrastructure, working alongside people around the same age with plenty of willingness to put out fires. The business complexity spanned every area of a mid-sized company: inventory, logistics, tax, price tables, sales, Points of Sale (POS), and accounting.&lt;/p&gt;
&lt;h2 id=&quot;windev-french-rapid-application-development&quot;&gt;Windev, French Rapid Application Development&lt;/h2&gt;
&lt;p&gt;The technology we used at the time, &lt;strong&gt;Windev&lt;/strong&gt;, already felt a bit dated: a Rapid Application Development (RAD) environment, in which we built the ERP and the Point of Sale (PoS) applications. The tool abstracted away the more popular frameworks of the time, Java and the .NET Framework, with a proprietary framework: its own IDE, its own language, and its own database, though it came with connectors for other providers. In our case, we used Microsoft SQL Server as the Database Management System (DBMS).&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;Figure 2. The Windev IDE interface.&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;Figure 2. The Windev IDE interface.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Windev is an IDE built by a French company, &lt;strong&gt;PCSoft&lt;/strong&gt;, with an integrated environment for developing desktop, web, and mobile applications: a proprietary language, &lt;strong&gt;WLanguage&lt;/strong&gt;, its own database, &lt;strong&gt;HyperfileSQL (HFSQL)&lt;/strong&gt;, and interoperability with other languages and databases via APIs and drivers.&lt;/p&gt;
&lt;p&gt;Some of its quirks come from the IDE&apos;s own design choices, which are quite an acquired taste, and from its proprietary language, a product of its era: a fourth-generation language (4GL). The idea was to speed up development by automatically generating artifacts once a database was hooked up to the project: the metadata became an abstract model called &lt;code class=&quot;language-text&quot;&gt;Analysis&lt;/code&gt;, similar to the .NET Framework&apos;s &lt;em&gt;Entity Data Model&lt;/em&gt;, and from it, reports and screens could be generated with just a few clicks — something like SAP&apos;s Crystal Reports, or Oracle&apos;s ADF for rich interfaces.&lt;/p&gt;
&lt;p&gt;In practice, this meant I didn&apos;t need to deeply understand databases to ship a working screen, which, looking back, was both good and bad at the same time.&lt;/p&gt;
&lt;p&gt;The language also offered automatic data fetching: you just iterated over collections with bindings to the data model, and the metamodel took care of translating everything into database queries, whether HFSQL or another compatible engine, via OLE DB/ODBC connectors.&lt;/p&gt;
&lt;p&gt;A simple example: searching for a customer by name, followed by iterating over the resulting collection, without writing a single line of 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;// Look up the first customer named &quot;João&quot;
HReadSeek(Customers, Name, &quot;João&quot;)

IF NOT HFound(Customers) THEN
    Info(&quot;Customer not found&quot;)
    RETURN
END

// Iterate over all matching records
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;Naturally, this created performance problems and hidden database behavior, since this kind of abstraction favors best-effort even at the cost of poor index usage and unoptimized queries. The result was chaotic situations in scaling scenarios, or wherever there were performance constraints, like in user-facing applications at the sales terminals. In those cases, we often fell back on Stored Procedures written in Transact-SQL to run the more expensive operations, like calculating cash flows, reprocessing inventory or price tables, and generating salesperson reports.&lt;/p&gt;
&lt;p&gt;During this period, the software we delivered had a fairly artisanal character: specs and bug reports gathered in hallway conversations, over the phone, or in endless email threads. This forced us to build and maintain our own in-house service desk to collect issues and problem reports. Having always had a creative streak, I took on supporting this system to keep evolving it, building features, reports, and dashboards, and improving our day-to-day work.&lt;/p&gt;
&lt;p&gt;Although Git had existed since 2005, my experience with source code management was still quite rudimentary: shared network folders with no versioning, and later a centralized version control system (CVS, &lt;em&gt;Concurrent Versions System&lt;/em&gt;) from Windev&apos;s own vendor, which more than once corrupted our file history and forced us to fall back on physical backups. Deployments followed the same artisanal logic: zipped builds, transferred over FTP, with access configuration in plain-text &lt;code class=&quot;language-text&quot;&gt;.ini&lt;/code&gt; files. That was our reality for years.&lt;/p&gt;
&lt;h2 id=&quot;old-school-php-and-other-projects&quot;&gt;Old-school PHP and other projects&lt;/h2&gt;
&lt;p&gt;Besides the ERP and its PoS system, the consultancy also worked on smaller projects, like e-commerce sites and hotel management systems. Those had more flexibility around technology choices, and we even used PHP and MySQL on the LAMP stack (Linux-Apache-MySQL-PHP), already on its last legs in the market, which kept moving toward the Node.js and nginx stack, even though we stuck with LAMP.&lt;/p&gt;
&lt;p&gt;At the time, knowledge of frameworks in the PHP world was entirely experimental, at least for me. I remember studying &lt;code class=&quot;language-text&quot;&gt;CodeIgniter&lt;/code&gt; from Ademir Gabardo&apos;s book and using it for my capstone project, where I also got a taste of maker culture, using &lt;strong&gt;Arduino&lt;/strong&gt; and a &lt;strong&gt;Raspberry Pi&lt;/strong&gt; to prototype a smart water meter — a project that genuinely earned the highest possible grade. Professionally, though, the PHP I used was straight out of the 2000s: &lt;code class=&quot;language-text&quot;&gt;.php&lt;/code&gt; files with script blocks mixed into HTML, sharing the stage with iconic plugins of the era, like jQuery, for DOM manipulation, client-side validation, and animations, plus &lt;code class=&quot;language-text&quot;&gt;morris.js&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;chart.js&lt;/code&gt; for stylized charts. Bootstrap was still on its early versions, making its way into my projects bit by bit.&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;Figure 3. The PHP and MVC (Model-View-Controller) book with CodeIgniter, my first web framework.&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;Figure 3. The PHP and MVC (Model-View-Controller) book with CodeIgniter, my first web framework.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;studying-on-my-own-the-net-world&quot;&gt;Studying on my own: the .NET world&lt;/h2&gt;
&lt;p&gt;A few months later, I was made a permanent &lt;strong&gt;Junior Programmer Analyst&lt;/strong&gt; and, with a bigger paycheck, moved into a studio apartment near a subway station in the West Zone. My quality of life improved instantly: I finally slept full nights.&lt;/p&gt;
&lt;p&gt;Just working with Windev and old-school PHP wasn&apos;t satisfying. In conversations with my great friend &lt;strong&gt;Mark&lt;/strong&gt; — to me, a programming legend (especially, but not only, in Java) — always tuned into engineering best practices, who taught me software architecture before I even knew the term, I realized that sticking only to day-to-day tasks was pulling me away from where the market benchmark actually was. So I started studying .NET on my own, getting into C# and ASP.NET MVC through the hefty Step-by-Step series volumes by the late &lt;strong&gt;John Sharp&lt;/strong&gt;, and through books from the also sorely missed &lt;strong&gt;Casa do Código&lt;/strong&gt; publisher, like &lt;strong&gt;Maurício Aniche&lt;/strong&gt;&apos;s fantastic TDD (Test-Driven Development) book, along with a few Windows Phone books, since I was an early adopter and enthusiast of the Nokia Lumia line 💀. It was still early, but that restlessness to study beyond my day-to-day routine would become the foundation of the repertoire I&apos;d go on to build.&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;Figure 4. The Visual C# 2008 book by John Sharp — a real brick of a book.&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;Figure 4. The Visual C# 2008 book by John Sharp — a real brick of a book.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;time-to-move-on&quot;&gt;Time to move on&lt;/h2&gt;
&lt;p&gt;Before I knew it, three years had passed and I was now a &lt;strong&gt;Mid-Level Programmer Analyst&lt;/strong&gt;. There had been many new ERP version deployments, cash-flow optimizations across brand groups, new store openings, features built and eventually rebuilt for various registration flows, integrations with thermal printers, and even setting up event booths at Anhembi. I had made great friends along this journey and was already about to finish my degree, in my final semester.&lt;/p&gt;
&lt;p&gt;That&apos;s when the urge to make a change came: to step out of my comfort zone and take another risk in search of new challenges. Without much ceremony, I started testing the market again and, in May 2015, received an offer that, at the time, felt like a promise of fresh air. So it was time to say goodbye, at that company, to the friends who had taken me in and taught me so much in that early phase of the journey (years later, I&apos;d return for a new, long-lasting project).&lt;/p&gt;
&lt;p&gt;From there I moved on to a new software consultancy, but this time on a completely different project, now at the Forensic and Scientific Police department. Still finishing up college, in that same first half of 2015, that&apos;s where I got my first taste of a double workday — but that&apos;s a story for the next part.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I dedicate the end of this part to everyone who, at that time, took part in my journey: to &lt;strong&gt;Mark&lt;/strong&gt;, to &lt;strong&gt;Vê&lt;/strong&gt;, to the brothers &lt;strong&gt;Diego&lt;/strong&gt; and &lt;strong&gt;Thiago&lt;/strong&gt;, to &lt;strong&gt;Marcão&lt;/strong&gt;, to &lt;strong&gt;Luiz XV&lt;/strong&gt;, to &lt;strong&gt;Adrian 2&lt;/strong&gt;, to &lt;strong&gt;Abel&lt;/strong&gt;, to &lt;strong&gt;Dengo&lt;/strong&gt;, and to so many others.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My Annual Library: Books Read from 2021 to 2025]]></title><description><![CDATA[Presentation Reading, for me, before it became work, was and always will be a pastime, going back to school, when I'd read
comic books and…]]></description><link>https://blog.decodifique.com/en/minha-biblioteca-anual-livros-lidos/</link><guid isPermaLink="false">https://blog.decodifique.com/en/minha-biblioteca-anual-livros-lidos/</guid><pubDate>Thu, 26 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;presentation&quot;&gt;Presentation&lt;/h2&gt;
&lt;p&gt;Reading, for me, before it became work, was and always will be a pastime, going back to school, when I&apos;d read
comic books and gaming magazines.
Wanting to cultivate that discipline, whether as &lt;strong&gt;leisure&lt;/strong&gt; or to reach &lt;strong&gt;personal&lt;/strong&gt;
and &lt;strong&gt;professional goals&lt;/strong&gt;, I&apos;ve kept an annual list since 2021 of what I&apos;ve read across those three areas.&lt;/p&gt;
&lt;p&gt;This way, the record serves both me and anyone else looking for recommendations, as a way to gauge my
past and present interests, which guide my choices and life goals.&lt;/p&gt;
&lt;h2 id=&quot;books-read-by-year&quot;&gt;Books Read by Year&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;Category&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Title&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Author(s)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Theme/Genre&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chapters Read / Completed&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Hobbit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;J.R.R. Tolkien&lt;/td&gt;
&lt;td&gt;Fantasy&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Barren Lives&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graciliano Ramos&lt;/td&gt;
&lt;td&gt;Novel&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Fable of the Island State:&lt;/strong&gt; How the Economy and Markets Work&lt;/td&gt;
&lt;td&gt;José Kobori&lt;/td&gt;
&lt;td&gt;Finance&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal Development&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Life Project:&lt;/strong&gt; Paths to a Life Worth Living&lt;/td&gt;
&lt;td&gt;Clóvis de Barros Filho&lt;/td&gt;
&lt;td&gt;Philosophy&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal Development&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Leadership:&lt;/strong&gt; Emotional Intelligence in Shaping a Successful Leader&lt;/td&gt;
&lt;td&gt;Daniel Goleman&lt;/td&gt;
&lt;td&gt;Business &amp;#x26; Leadership&lt;/td&gt;
&lt;td&gt;Completed&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;Category&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Title&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Author(s)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Theme/Genre&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chapters Read / Completed&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;São Paulo in the Skies:&lt;/strong&gt; The Modernist Revolution in Architecture and Real Estate in the 1950s and 1960s&lt;/td&gt;
&lt;td&gt;Raul Juste Lores&lt;/td&gt;
&lt;td&gt;Architecture&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Lord of the Rings:&lt;/strong&gt; Single-Volume Edition&lt;/td&gt;
&lt;td&gt;J.R.R. Tolkien&lt;/td&gt;
&lt;td&gt;Fantasy&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&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;Business &amp;#x26; Leadership&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&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;Software Development&lt;/td&gt;
&lt;td&gt;1 ~ 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&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;Software Development&lt;/td&gt;
&lt;td&gt;1 - 3 - 4 - 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Leadership Pipeline:&lt;/strong&gt; How to Build the Leadership-Powered Company&lt;/td&gt;
&lt;td&gt;Ram Charan; Stephen Drotter; James L. Noel; Kent Jonasen&lt;/td&gt;
&lt;td&gt;Business &amp;#x26; Leadership&lt;/td&gt;
&lt;td&gt;1 - 2 - 3 - 8 - 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal Development&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Knight in Rusty Armor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Robert Fisher&lt;/td&gt;
&lt;td&gt;Adventure&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal Development&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Dip:&lt;/strong&gt; A Little Book That Teaches You When to Quit (and When to Stick)&lt;/td&gt;
&lt;td&gt;Seth Godin&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;Completed&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;Category&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Title&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Author(s)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Theme/Genre&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chapters Read / Completed&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&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;Philosophy&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No Rules Rules:&lt;/strong&gt; Netflix and the Culture of Reinvention&lt;/td&gt;
&lt;td&gt;Reed Hastings&lt;/td&gt;
&lt;td&gt;Business &amp;#x26; Leadership&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&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;Software Development&lt;/td&gt;
&lt;td&gt;1 ~ 17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Pragmatic Programmer:&lt;/strong&gt; From Journeyman to Master&lt;/td&gt;
&lt;td&gt;Andrew Hunt; David Thomas&lt;/td&gt;
&lt;td&gt;Software Development&lt;/td&gt;
&lt;td&gt;1 ~ 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&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;Software Development&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;Category&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Title&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Author(s)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Theme/Genre&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chapters Read / Completed&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&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;Science Fiction&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A Country Called Brazil:&lt;/strong&gt; The History of Brazil from Discovery to the 21st Century&lt;/td&gt;
&lt;td&gt;Marco Antonio Villa&lt;/td&gt;
&lt;td&gt;History&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Manager&apos;s Path:&lt;/strong&gt; A Guide for Tech Leaders Navigating Growth and Change&lt;/td&gt;
&lt;td&gt;Camille Fournier&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personal Development&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Big Baby Book&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thatiane Mahet&lt;/td&gt;
&lt;td&gt;Parenting&lt;/td&gt;
&lt;td&gt;Completed&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;Category&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Title&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Author(s)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Theme/Genre&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chapters Read / Completed&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Engineers of Chaos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Giuliano da Empoli&lt;/td&gt;
&lt;td&gt;Politics&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Philosophy for Mortals:&lt;/strong&gt; Thinking Well to Live Well&lt;/td&gt;
&lt;td&gt;Daniel Gomes de Carvalho&lt;/td&gt;
&lt;td&gt;Philosophy&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Brave New World&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aldous Huxley&lt;/td&gt;
&lt;td&gt;Science Fiction&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leisure&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Around the World in Eighty Days&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Jules Verne&lt;/td&gt;
&lt;td&gt;Adventure&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The Fourth Industrial Revolution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Klaus Schwab&lt;/td&gt;
&lt;td&gt;Economics&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;It Doesn&apos;t Have to Be Crazy at Work&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;David Heinemeier Hansson; Jason Fried&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;In the coming years, I plan to keep this list updated, aiming to record my reading and share
my experiences with other readers. I also hope this list helps me reflect on my
interests and stay motivated to keep reading and learning.&lt;/p&gt;
&lt;p&gt;See you soon. 📚☕&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Tech Coffee: Fundamental Principles of Unit Testing]]></title><description><![CDATA[Presentation]]></description><link>https://blog.decodifique.com/en/principios-fundamentais-de-testes-unitarios/</link><guid isPermaLink="false">https://blog.decodifique.com/en/principios-fundamentais-de-testes-unitarios/</guid><pubDate>Sat, 07 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;presentation&quot;&gt;Presentation&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[AI-Assisted Programming: Accelerating Development with Artificial Intelligence Tools]]></title><description><![CDATA[Context I recently came across a mid-sized frontend application written in Angular 6 (yes, which reached EOL back in 2019).
The task was to…]]></description><link>https://blog.decodifique.com/en/programacao-assistida-por-ia-acelerando-o-desenvolvimento/</link><guid isPermaLink="false">https://blog.decodifique.com/en/programacao-assistida-por-ia-acelerando-o-desenvolvimento/</guid><pubDate>Sun, 10 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;
&lt;p&gt;I recently came across a mid-sized frontend application written in &lt;strong&gt;Angular 6&lt;/strong&gt; (yes, which reached EOL back in 2019).
The task was to upgrade the project to an &lt;strong&gt;LTS (Long Term Support)&lt;/strong&gt; version of Angular. As a first move, I chose to upgrade to the first available LTS version, &lt;code class=&quot;language-text&quot;&gt;16.2.X&lt;/code&gt;. However, I&apos;m not a frontend specialist, nor deeply familiar with the &lt;strong&gt;Node.js&lt;/strong&gt; stack, and I&apos;d need a lot of time or the support of another developer with more knowledge of the framework.&lt;/p&gt;
&lt;p&gt;The project had &lt;strong&gt;40 modules&lt;/strong&gt; and &lt;strong&gt;175 components&lt;/strong&gt;, broken down as shown in the table below:&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;Getting support from another developer wasn&apos;t an option, and I also couldn&apos;t spend weeks on the migration project. So I decided to try an approach I&apos;d recently seen on some YouTube channels: experimenting with an &lt;code class=&quot;language-text&quot;&gt;AI Code Assist&lt;/code&gt; tool in the IDE. Although I normally use &lt;strong&gt;JetBrains IDEA&lt;/strong&gt; and &lt;strong&gt;GitHub Copilot&lt;/strong&gt; for backend projects, in this case I wanted to try something new, more focused on my goal: leaning on it to make up for my elementary frontend and Angular knowledge, working in a &lt;strong&gt;Driver and Navigator&lt;/strong&gt; style of pair programming [1], alternating between moments where the AI generated code and I reviewed it, and vice versa.&lt;/p&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;
&lt;p&gt;For this task, I chose to try out the &lt;strong&gt;Cursor&lt;/strong&gt; [2] code editor, which has native AI integration and promises a productivity boost through a number of features. Below, I highlight the ones I used, though there are other advanced ones described in the documentation [3].&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Tab&lt;/code&gt;: to suggest or edit code based on an existing snippet or a description;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Cursor Prediction&lt;/code&gt;: after an edit made with &lt;code class=&quot;language-text&quot;&gt;Tab&lt;/code&gt;, Cursor predicts additional snippets that could be fixed the same way and automatically jumps to the next one with another &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;: to interact with the AI and understand a piece of code or ask for an implementation suggestion;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;AI Fix in Chat&lt;/code&gt;: where an error caught by the &lt;code class=&quot;language-text&quot;&gt;linter&lt;/code&gt; is highlighted, and the AI opens a popup suggesting a fix;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Apply&lt;/code&gt;: to apply the AI&apos;s suggestions directly in the editor;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;To use Cursor, a premium subscription is &lt;strong&gt;not&lt;/strong&gt; required, although usage is limited [4]. In my case, I chose the Pro subscription to guarantee unlimited use of the &lt;code class=&quot;language-text&quot;&gt;completions&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;instant apply&lt;/code&gt; features.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With Cursor, &lt;code class=&quot;language-text&quot;&gt;node&lt;/code&gt; version &lt;code class=&quot;language-text&quot;&gt;20.11&lt;/code&gt;, and the desired version of the &lt;code class=&quot;language-text&quot;&gt;Angular CLI&lt;/code&gt; installed, I got to work.&lt;/p&gt;
&lt;h2 id=&quot;interacting-with-cursors-ai&quot;&gt;Interacting with Cursor&apos;s AI&lt;/h2&gt;
&lt;p&gt;The first thing I did was generate a new project with version 16 of the Angular CLI and compare the differences between the old project and the new one. I noticed that some files were no longer needed, like &lt;code class=&quot;language-text&quot;&gt;angular-cli.json&lt;/code&gt;, while others needed to be created or adjusted, like &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;, and &lt;code class=&quot;language-text&quot;&gt;tsconfig.app.json&lt;/code&gt;. I delegated the task of fixing these files to the AI through prompts in the following format:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Update the &lt;strong&gt;angular-cli.json&lt;/strong&gt; file (in context) for Angular version 16.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With the following result:&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;Figure 1. Chatting with the AI to update the angular-cli.json file&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;Figure 1. Chatting with the AI to update the angular-cli.json file&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;And the changes suggested by the AI were applied directly to the target file:&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;Figure 2. Result of the AI-suggested changes using the Apply feature&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;Figure 2. Result of the AI-suggested changes using the Apply feature&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Once the project&apos;s base files were updated, I moved on to the dependencies. Naturally, many no longer existed, or had been renamed. So I had to manually fix a few dependencies based on searches on &lt;strong&gt;npm.js&lt;/strong&gt; — for example, &lt;code class=&quot;language-text&quot;&gt;angular-http&lt;/code&gt;, which was folded into &lt;code class=&quot;language-text&quot;&gt;angular-common&lt;/code&gt;, or &lt;code class=&quot;language-text&quot;&gt;angular2-fontawesome&lt;/code&gt;, which was discontinued and replaced by &lt;code class=&quot;language-text&quot;&gt;@fortawesome/angular-fontawesome&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Once the dependencies were updated, and after many &lt;code class=&quot;language-text&quot;&gt;npm install&lt;/code&gt; runs, it was time to try running &lt;code class=&quot;language-text&quot;&gt;ng build&lt;/code&gt; and face the first errors.&lt;/p&gt;
&lt;h2 id=&quot;backend-build-phase&quot;&gt;Backend build phase&lt;/h2&gt;
&lt;p&gt;Angular projects are split into two major parts: the backend, made up of components, modules, and services; and the frontend, made up of templates, directives, pipes, and UI modules.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In five years, a lot changes, and when it comes to frontend projects, the changes were even bigger.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My approach was to run &lt;code class=&quot;language-text&quot;&gt;ng build&lt;/code&gt; to compile the backend first, and, as expected, plenty of build errors came up, especially due to the &lt;code class=&quot;language-text&quot;&gt;strict&lt;/code&gt; setting in &lt;code class=&quot;language-text&quot;&gt;tsconfig.json&lt;/code&gt;, which now required every variable to be typed. While I could have disabled that setting, I preferred to fix the typing errors in each file with the AI&apos;s help, using the features listed at the start of this article. On top of that, many dependencies had their namespaces changed, one of the main examples being the splitting up of &lt;strong&gt;Angular Material&lt;/strong&gt; components, which used to live under the &lt;code class=&quot;language-text&quot;&gt;@angular/material&lt;/code&gt; namespace.&lt;/p&gt;
&lt;p&gt;Hundreds of &lt;code class=&quot;language-text&quot;&gt;Tabs&lt;/code&gt; later, &lt;code class=&quot;language-text&quot;&gt;ng build&lt;/code&gt; finally compiled without errors, and I could move on to the frontend build phase.&lt;/p&gt;
&lt;h2 id=&quot;frontend-build-phase&quot;&gt;Frontend build phase&lt;/h2&gt;
&lt;p&gt;Now &lt;code class=&quot;language-text&quot;&gt;ng serve&lt;/code&gt; needed to compile the frontend. Naturally, many directives had changed, like property and event binding, which needed fixing.&lt;/p&gt;
&lt;p&gt;Here&apos;s the explanation Cursor&apos;s AI gave for an error during the &lt;em&gt;event binding&lt;/em&gt; migration:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The change you mentioned in the Angular directive from maxlength=&apos;100&apos; to [maxLength]=&apos;100&apos; reflects an update in how properties are bound in Angular, especially around the use of property binding.&lt;/p&gt;
&lt;p&gt;Explanation of the change:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Property Binding:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Before (Angular 6): The directive used standard HTML attribute syntax, where maxlength was set as an HTML attribute with a literal value. This means the value was treated as a string.&lt;/li&gt;
&lt;li&gt;Now (Angular 16): The new [maxLength]=&apos;100&apos; syntax uses Angular&apos;s property binding. This lets the value be treated as an Angular expression, meaning you can pass variables, expressions, or dynamic values.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The advantage of having the AI provide both the fix and the explanation for the change was that I could use the &lt;em&gt;Search All and Replace&lt;/em&gt; feature to fix all similar snippets that needed the same change at once.&lt;/p&gt;
&lt;p&gt;Another frequent error was the lack of handling for &lt;code class=&quot;language-text&quot;&gt;null&lt;/code&gt; values when accessing object properties, which TypeScript didn&apos;t accept and needed fixing. This is a recurring problem in legacy projects, and the AI was able to fix it through &lt;code class=&quot;language-text&quot;&gt;Tab&lt;/code&gt; suggestions.&lt;/p&gt;
&lt;p&gt;After a while, &lt;code class=&quot;language-text&quot;&gt;ng serve&lt;/code&gt; finally compiled without errors, and I was able to access the application in the browser.&lt;/p&gt;
&lt;h2 id=&quot;publishing-the-app-and-opening-the-pull-request&quot;&gt;Publishing the app and opening the Pull Request&lt;/h2&gt;
&lt;p&gt;With the application working, all that was left was to update the pipeline file to use a newer version of Node.js and open the Pull Request on the repository.&lt;/p&gt;
&lt;p&gt;Here&apos;s the final result on the &lt;code class=&quot;language-text&quot;&gt;enhancement/bump-up-angular-16&lt;/code&gt; branch:&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;Conclusion&lt;/h2&gt;
&lt;p&gt;The term &quot;AI-Assisted/Guided Programming,&quot; and others like it, will become increasingly present in the day-to-day work of software engineering teams. Gartner studies predict that, by 2028, 75% of developers will use AI tools to write code [5]. This shift is already visible across the software industry; Mercado Livre, for example, already uses AI tools to support its more than 9,000 developers [6].&lt;/p&gt;
&lt;p&gt;In this brief account, I found that, even though I wasn&apos;t deeply familiar with a specific stack, productivity on the task increased significantly. An effort that would previously have taken weeks was reduced to a few days. That said, the developer&apos;s knowledge and experience remain indispensable, since, as I showed, it&apos;s often still up to the developer to decide which approach best solves the problem. So critical thinking, judgment, and experience were essential, not replaced.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&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 Livre frees developers&apos; minds to focus on their mission with GitHub.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[SPA: Azure App Services or Static Web Apps?]]></title><description><![CDATA[Context I recently came across a SPA (Single Page Application) written in Angular that had been running on an Azure App Service for a long…]]></description><link>https://blog.decodifique.com/en/azure-app-services-vs-static-web-apps/</link><guid isPermaLink="false">https://blog.decodifique.com/en/azure-app-services-vs-static-web-apps/</guid><pubDate>Sun, 11 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;
&lt;p&gt;I recently came across a &lt;strong&gt;SPA (Single Page Application)&lt;/strong&gt; written in &lt;strong&gt;Angular&lt;/strong&gt; that had been running on an Azure App Service for a long time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;App Services are fully managed platform-as-a-service (PaaS)&lt;/strong&gt; offerings, used to deliver web applications across various languages, frameworks, and operating systems. Because they&apos;re managed, they come with several ready-to-use capabilities, such as automatic scaling (scale up and scale out), custom domains, custom SSL, deployment integrations with GitHub Actions, Azure DevOps, and more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But is a PaaS with so many capabilities really the best option for distributing a SPA? Probably yes, but maybe not the most efficient one. Any modern SPA boils down to a set of static files, which are typically downloaded in full by the client&apos;s browser. Because of that, there are more efficient ways to distribute these static files, taking advantage of what CDNs offer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;CDN (Content Delivery Network)&lt;/strong&gt; is a network of geographically distributed servers, designed to efficiently deliver static content by bringing those assets closer to the end user.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CDNs like Akamai, Verizon, and others are highly cacheable and relatively cheap, considering the volume of traffic, compared to the cost of web server infrastructure and the outbound traffic of storage solutions like S3 and Azure Blob Storage.&lt;/p&gt;
&lt;p&gt;With that in mind, Azure built a solution that combines some of the capabilities of an App Service with a geographically distributed network for serving assets: the &lt;strong&gt;Static Web Apps&lt;/strong&gt; service.&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;Figure 1. Static Web Apps or App Services for distributing static content?&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;Figure 1. Static Web Apps or App Services for distributing static content?&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;Besides being able to distribute SPAs built with frameworks like Angular, React, Vue, Blazor, or even plain HTML with CSS and JavaScript, Static Web Apps also allows for quick integration with Azure Functions, which serve as the backend for the SPA, easing CORS restrictions and simplifying the infrastructure, since there&apos;s no need to maintain a full web server [1].&lt;/p&gt;
&lt;p&gt;Some of SWA&apos;s key features include (check the service quotas [2]):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Easy integration with GitHub Actions and Azure DevOps Pipelines.&lt;/li&gt;
&lt;li&gt;Global asset distribution.&lt;/li&gt;
&lt;li&gt;Free SSL certificates.&lt;/li&gt;
&lt;li&gt;Support for custom domains.&lt;/li&gt;
&lt;li&gt;The first 100 GB of outbound traffic/month included.&lt;/li&gt;
&lt;li&gt;Integration with authentication providers like Microsoft Entra ID and GitHub.&lt;/li&gt;
&lt;li&gt;Creating and publishing multiple environments.&lt;/li&gt;
&lt;li&gt;99.95% SLA.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You could argue that a distribution solution using Blob Storage and Azure Front Door could achieve the same result, but Front Door comes at a higher price, since it&apos;s a more robust product offering advanced distribution and cross-region routing features that may be unnecessary for use cases where you simply want to deliver a web app&apos;s static content.&lt;/p&gt;
&lt;p&gt;Here&apos;s a cost comparison table for each solution:&lt;/p&gt;
&lt;div class=&quot;table-container&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Has a free tier?&lt;/th&gt;
&lt;th&gt;Starting price&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;Yes&lt;/td&gt;
&lt;td&gt;Starting at USD 73.00 on the Standard plan&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;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;USD 9.00 per app&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) Starting at USD 22.00 + (FD) Starting at USD 46.00 on the Standard plan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;In short, &lt;strong&gt;Static Web Apps&lt;/strong&gt; is a simple, cost-effective, and reliable alternative for distributing SPA applications compared to other models Azure offers.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&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;Static Web Apps documentation&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;Static Web Apps service quotas&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[The Leadership Pipeline — The Path to the Tactical Level]]></title><description><![CDATA[Presentation Any company, regardless of industry, size, or geographic location, shares two things in common: some kind of structure…]]></description><link>https://blog.decodifique.com/en/pipeline-da-lideranca-o-trajeto-ao-nivel-tatico/</link><guid isPermaLink="false">https://blog.decodifique.com/en/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;presentation&quot;&gt;Presentation&lt;/h2&gt;
&lt;p&gt;Any company, regardless of industry, size, or geographic location, shares two things in common: some kind of structure, whatever form it takes, and an organizational culture, whether deliberately built or emergent. These two things are linked in defining how hierarchical the company&apos;s structure will be and how many levels are needed to accommodate the management of its different areas, as well as determining which areas are responsible for which parts of the business. While these structures may seem permanent and fundamental at first glance, they aren&apos;t always healthy or unobstructed, since that requires carefully organizing leadership passages, with clearly established duties and responsibilities that, as much as possible, don&apos;t overlap.&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;Figure 1. Pipeline refers to the sequential, progressive structure through which individuals grow their leadership capabilities, from entry-level roles up to the highest level of management within an organization.&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;Figure 1. Pipeline refers to the sequential, progressive structure through which individuals grow their leadership capabilities, from entry-level roles up to the highest level of management within an organization.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The book &lt;strong&gt;&quot;The Leadership Pipeline: How to Build the Leadership-Powered Company&quot;&lt;/strong&gt; [1], written by Ram Charan, Stephen Drotter, and James Noel, presents a model for understanding and developing the different layers of leadership within an organization. It suggests that developing effective leaders requires a clear understanding of the requirements, challenges, and transitions associated with each stage of the structure.&lt;/p&gt;
&lt;p&gt;This structure, referred to as the &quot;pipeline,&quot; resembles a ladder the professional climbs, made up of seven levels. At each level transition, a new leadership passage occurs, with each level represented by a given role within an organizational structure, as listed in Table 1.&lt;/p&gt;
&lt;div class=&quot;table-container&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Pipeline Level&lt;/th&gt;
        &lt;th&gt;Representative Role&lt;/th&gt;
        &lt;th&gt;Brief Description&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;1. Managing Self&lt;/td&gt;
        &lt;td&gt;Individual Contributor&lt;/td&gt;
        &lt;td&gt;Focused on developing technical and professional skills, managing their own time and tasks.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;2. Managing Others&lt;/td&gt;
        &lt;td&gt;Team Leader / Supervisor&lt;/td&gt;
        &lt;td&gt;Responsible for managing the work of others, motivating the team, and evaluating performance.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;3. Managing Managers&lt;/td&gt;
        &lt;td&gt;Manager of Managers / Director&lt;/td&gt;
        &lt;td&gt;Focused on coaching other managers, developing their leadership and strategy skills.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;4. Functional Manager&lt;/td&gt;
        &lt;td&gt;Department Manager&lt;/td&gt;
        &lt;td&gt;Oversees a specific area of the company, such as finance or marketing, implementing functional strategies.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;5. Business Manager&lt;/td&gt;
        &lt;td&gt;General Manager / Business Unit CEO&lt;/td&gt;
        &lt;td&gt;Responsible for a business unit&apos;s overall performance, including profitability and market strategy.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;6. Group Manager&lt;/td&gt;
        &lt;td&gt;Group CEO / Vice President&lt;/td&gt;
        &lt;td&gt;Manages multiple business units or regions, ensuring strategic and operational alignment.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;7. Enterprise Manager&lt;/td&gt;
        &lt;td&gt;CEO / President&lt;/td&gt;
        &lt;td&gt;Leads the organization as a whole, setting corporate vision and strategy, and shaping organizational culture.&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Table 1. Pipeline levels and their corresponding role in a traditional company.&lt;/p&gt;
&lt;p&gt;The levels and their respective leadership passages are represented by the authors through the pipeline illustrated in the figure referenced below. Figure 1 shows the progression of each stage within the organizational structure.&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;Leadership progression through the pipeline&quot;
        title=&quot;Figure 2. Leadership progression through the pipeline. (Adapted from: 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;Figure 2. Leadership progression through the pipeline. (Adapted from: CHARAN, Ram; DROTTER, Stephen; NOEL, James, 2011, p.27)&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In this review, I&apos;ll summarize the main ideas behind the &lt;strong&gt;first two passages&lt;/strong&gt;, along with some reflections on why each one needs to be firmly established.&lt;/p&gt;
&lt;h2 id=&quot;from-individual-contributor-to-the-tactical-level&quot;&gt;From Individual Contributor to the Tactical Level&lt;/h2&gt;
&lt;p&gt;Business management has long established that, broadly speaking, there are three organizational levels within companies: the &lt;strong&gt;operational&lt;/strong&gt; level, tied to day-to-day, short-term tasks; the &lt;strong&gt;tactical&lt;/strong&gt; level, which translates strategic guidelines into medium-term action plans; and the &lt;strong&gt;strategic&lt;/strong&gt; level, which defines the organization&apos;s overall direction and long-term goals.&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;An organization&amp;#39;s levels&quot;
        title=&quot;Figure 3. An organization&amp;#39;s levels.&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;Figure 3. An organization&amp;#39;s levels.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Well-defined, with a clear starting point, early-career professionals will spend their first years in an organization as individual contributors, usually assigned well-defined, short-duration tasks with very clear goals.&lt;/p&gt;
&lt;p&gt;At this stage, the professional will be focused on shaping their &lt;strong&gt;skills&lt;/strong&gt;, their &lt;strong&gt;time management&lt;/strong&gt;, and their &lt;strong&gt;professional values&lt;/strong&gt;, along with other traits that demonstrate the ability to take on responsibility and respect the company&apos;s values. Once these three areas are reasonably developed, this professional is typically promoted to a first-level leader or manager.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;To develop effective leaders [...], organizations need to identify leadership candidates early, give them growth assignments, provide them with useful feedback, and coach them. (p.31)&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&apos;s worth noting that the job title can vary from company to company — it might be leader, coordinator, first-level manager, and so on — but the key point is that, in this first leadership passage, the new leader will be managing not just themselves, but other people too, which requires a behavioral shift and a fundamental change in skills and values for success in the role.&lt;/p&gt;
&lt;p&gt;These new skills, described in Table 2, include &lt;strong&gt;planning the work, assigning tasks, motivating, and critically evaluating the work done by others&lt;/strong&gt; — in other words, not just completing the work assigned to them, but also helping others reach an expected level of performance. At this point, it&apos;s crucial that managerial work be valued, not merely tolerated, since making time to address the team&apos;s needs, clarify doubts, and pursue contact and dialogue with other teams, departments, and vendors is essential for helping their reports reach their goals — and, in turn, for determining the leader&apos;s own success.&lt;/p&gt;
&lt;p&gt;For new leaders, letting go of the tasks and skills that got them promoted into a leadership role can be challenging, but it&apos;s necessary to understand that, at this new level, results are achieved through others. Direct reports&apos; success reflects the leader&apos;s own success. So, &lt;strong&gt;it&apos;s essential to see yourself as a manager&lt;/strong&gt;, one who defines the work to be done and lets it be carried out by their reports, with trust and accountability, teaching rather than just correcting mistakes, and staying close to the problems and failures the team faces. Leaders at this first passage must, above all, be accessible and available, both physically and emotionally, showing that, through that accessibility, they&apos;ve mastered managing their own time.&lt;/p&gt;
&lt;div class=&quot;table-container&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Aspect&lt;/th&gt;
        &lt;th&gt;Individual Contributor&lt;/th&gt;
        &lt;th&gt;First-Level Manager&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td class=&quot;bold&quot;&gt;Skills&lt;/td&gt;
        &lt;td&gt;Technical/functional mastery, teamwork, building relationships for personal benefit, using tools/processes&lt;/td&gt;
        &lt;td&gt;Planning, job design, staffing, delegating, monitoring, coaching/feedback, performance evaluation, motivating, communicating, building relationships for the department&apos;s benefit, acquiring resources&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td class=&quot;bold&quot;&gt;Time Management&lt;/td&gt;
        &lt;td&gt;Daily discipline, meeting personal deadlines, managing their own time&lt;/td&gt;
        &lt;td&gt;Annual planning, availability for direct reports, setting priorities, time spent communicating with other areas&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td class=&quot;bold&quot;&gt;Professional Values&lt;/td&gt;
        &lt;td&gt;Getting results through their own proficiency, high-quality work, embodying the company&apos;s values&lt;/td&gt;
        &lt;td&gt;Getting results through others, direct reports&apos; success, the department&apos;s success, integrity&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Table 2. Traits of the first leadership passage. (Adapted from: CHARAN, Ram; DROTTER, Stephen; NOEL, James, 2011, p.64)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When leaders lack an aptitude for time management, they run into trouble planning tasks and setting priorities for the team. As a result, they&apos;ll often lack the time to support their direct reports, which will clog up the flow of work and probably overload both themselves and everyone else. Likewise, the absence of proper professional values leads to difficulty delegating tasks. These leaders often choose to do the tasks themselves rather than plan the work. This leads to a lack of proper managerial methods, making the work environment chaotic and relationships and communication with other teams unstable or ineffective.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The second passage — to manager of managers — should mark a complete shift from operational focus to the tactical management of teams&lt;/strong&gt;, while also prioritizing the development of new leaders. This includes mentoring, coaching, ongoing feedback and evaluations, and delegating tasks that push them to practice time-management skills suited to leading a team.&lt;/p&gt;
&lt;p&gt;When these leaders are poorly trained or coached, certain management problems can surface, signaling that these managers of managers may be in the wrong role, or that they haven&apos;t yet fully developed their skills, time management, or professional values. Among these problems are &lt;strong&gt;difficulty delegating&lt;/strong&gt;, &lt;strong&gt;poor management of first-level managers&apos; performance&lt;/strong&gt;, an &lt;strong&gt;inability to build a strong team&lt;/strong&gt; — perhaps the biggest problem of all, especially when favoritism is at play and there&apos;s a lack of proper evaluation based on competence — an &lt;strong&gt;excessive focus on doing the work themselves&lt;/strong&gt;, and a tendency to &lt;strong&gt;select people who are clones of themselves&lt;/strong&gt;, rather than choosing for diversity and competence.&lt;/p&gt;
&lt;p&gt;For managers of managers to excel in their role, they should focus on &lt;strong&gt;selecting and training highly competent new managers&lt;/strong&gt;, &lt;strong&gt;holding those leaders accountable for the managerial work they&apos;ve done&lt;/strong&gt;, &lt;strong&gt;allocating resources across units as needed&lt;/strong&gt;, and &lt;strong&gt;managing the boundaries between each unit according to the established organizational structure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Notice that, in the pipeline model established by the authors, there&apos;s no overlap of roles. Clearly defining the skills, time management, and professional values expected at each stage of the process creates an environment conducive to the emergence of new leaders. This eliminates the need to hire exclusively from outside for standout talent, allowing internal leaders to be developed so they can carry out their roles properly, without competition between leaders and their reports over the same action.&lt;/p&gt;
&lt;p&gt;Finally, by establishing the right requirements for the different leadership levels, succession planning becomes easier, reducing the emotional strain on newly promoted leaders. As the authors point out, &quot;when someone skips leadership passages and is placed in a position for which they lack the necessary skills, time-management mastery, and professional values, the emotional impact is significant. The pipeline model makes skipping those passages unlikely.&quot;&lt;/p&gt;
&lt;h2 id=&quot;closing-thoughts&quot;&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;Establishing roles within an organizational structure is always a challenge. It becomes even harder when those definitions aren&apos;t clear and objective, or when there&apos;s no formal coaching and development plan led by the upper levels, who, according to the authors, are the ones responsible for developing successors. The absence of these definitions creates gaps in the pipeline, leading to overlapping roles: managers doing operational work instead of managing it is perhaps the clearest symptom of neglecting the skills, time management, and professional values needed to achieve exceptional performance in the role.&lt;/p&gt;
&lt;p&gt;While this dysfunction is common, addressing it is essential. Developing leaders at the earlier levels of an organizational structure, who meet the requirements described above, is indispensable. After all, it&apos;s at the operational and tactical layers that every company, regardless of size or industry, generates its revenue through the development of products and services. These levels also represent the entry point for new talent, whether through hiring or internal development.&lt;/p&gt;
&lt;p&gt;Finally, adopting this model represents a vital strategic step for organizations that want to not only stay competitive in an ever-evolving market, but also secure a strong, sustainable leadership legacy for years to come.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&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;Book &quot;The Leadership Pipeline&quot; – Amazon&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;additional-links&quot;&gt;Additional links&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[Navigating Big Numbers: A Professional Journey at the Heart of E-commerce]]></title><description><![CDATA[Presentation]]></description><link>https://blog.decodifique.com/en/navegando-por-grandes-numeros-uma-jornada-profissional-no-coracao-do-e-commerce/</link><guid isPermaLink="false">https://blog.decodifique.com/en/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;presentation&quot;&gt;Presentation&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[Book review – "The Software Architect Elevator", Part II]]></title><description><![CDATA[Part II – Architecture The many definitions of software architecture compiled by Carnegie Mellon University's Software Engineering Institute…]]></description><link>https://blog.decodifique.com/en/the-software-architect-elevator-parte-2/</link><guid isPermaLink="false">https://blog.decodifique.com/en/the-software-architect-elevator-parte-2/</guid><pubDate>Wed, 03 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;part-ii--architecture&quot;&gt;Part II – Architecture&lt;/h2&gt;
&lt;p&gt;The many definitions of software architecture compiled by Carnegie Mellon University&apos;s Software Engineering Institute [1] suggest that the phrase has no obvious meaning when examined on its own. While the terms &quot;architecture&quot; and &quot;software&quot; each have precisely defined meanings, how they combine depends entirely on the specific context in which they&apos;re applied.&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;Figure 1. Software architecture is more than drawing component diagrams.&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;Figure 1. Software architecture is more than drawing component diagrams.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Gregor Hohpe argues that every piece of software has an architecture, even if it wasn&apos;t intentional. That architecture should drive the efficiency of engineering teams by enabling parallel development and evaluation of the components being built. He also argues that no architecture is perfect, and there&apos;s always a combination of trade-offs to weigh, with context being the organizing principle behind all of those decisions.&lt;/p&gt;
&lt;p&gt;Software architecture documentation should capture the non-trivial decisions and always give the reader the reasoning behind each choice, along with the context that drove it. It should also emphasize what&apos;s essential, de-emphasize what&apos;s unnecessary, and describe the limitations of any architectural choice. It&apos;s essential to recognize that every important decision comes with trade-offs.&lt;/p&gt;
&lt;p&gt;The author warns that &lt;strong&gt;decisions too costly to reverse later should be made early in the project&lt;/strong&gt;, to avoid stalling progress by second-guessing every new element introduced. Quoting Martin Fowler, Hohpe explains that one of the crucial jobs of software architects is to remove irreversibility from software design through abstractions [2], patterns, and development paradigms, aiming to minimize irreversible decisions early in the process. If the engineering team&apos;s level of familiarity with the technologies involved isn&apos;t sufficient, it&apos;s possible to adopt an evolutionary architecture, one that develops as the team&apos;s understanding of those tools grows.&lt;/p&gt;
&lt;p&gt;Software architecture covers more than components and how they relate to each other. It requires a systemic approach, emphasizing relationships and how each structure acts as a means to achieve a desired behavior. In that sense, techniques like negative feedback loops can be applied, acting as a form of self-regulation for systems through the relationships between the designed components. That focus on behavior should also show up in the documentation produced, where it should be the most relevant aspect, rather than static structures.&lt;/p&gt;
&lt;p&gt;Taming legacy software is also a challenge in software architecture, and the key to avoiding obsolescence in these systems is keeping them agile. A system isn&apos;t agile if nobody can change it. That fear of change is justified when there&apos;s a lack of proper operating practices and techniques, a lack of useful metrics, and sporadic deployments. Fowler puts it this way: &quot;if it hurts, do it more often&quot; [3]. In that context, painful tasks should be performed frequently, so that automation becomes unavoidable.&lt;/p&gt;
&lt;p&gt;For software architecture operating at large scale, the author stresses the need for broad automation — from bureaucratic processes like infrastructure request approvals, all the way to application deployment pipelines. Whatever can&apos;t be automated should be turned into a self-service system, simplifying routine, predictable activities. One possible strategy for automating this kind of system is building interfaces with validations built into the software development lifecycle, including the use of boilerplate code for new applications and infrastructure service configuration. Tacit knowledge should also be codified into scripts and tools, surfacing these processes and making knowledge transfer easier. Finally, automated systems for widely standardized, explicit processes make compliance audits easier.&lt;/p&gt;
&lt;p&gt;Software architecture implies making design decisions to prevent developers from exercising unnecessary creativity. This means certain processes should be established up front and kept as standards, simplifying software operations and freeing up engineering teams to focus on what actually drives the company&apos;s business differentiation. Standardizing IT components simplifies operations, allows for economies of scale, and saves money thanks to greater purchasing power with vendors.&lt;/p&gt;
&lt;p&gt;This standardization should be considered at two levels: the lower level, where the goal is to maximize reuse, since it&apos;s rarely what differentiates the company; and the upper level, made up of internally developed software, which provides the real value and competitive differentiation in the market. There&apos;s an element of conformity here, where few changes happen at the lower levels, making it easier to standardize around a common set of tools.&lt;/p&gt;
&lt;p&gt;When drawing software architecture diagrams — whether using C4 models [4] or other graphical notations — the boxes representing components usually get the spotlight. However, from Hohpe&apos;s perspective, these diagrams should be designed with a focus on the functionality and relationships between those components, through the lines and arrows, in order to highlight the communication between the elements that make up the system at different levels. This approach leads to a clearer, more effective understanding of the software&apos;s architecture and its dynamics.&lt;/p&gt;
&lt;p&gt;Finally, when adopting a set of technologies from a single vendor, it&apos;s crucial to question the boundaries of each tool and how they relate to the system as a whole. This makes it possible to establish the boundaries of the proposed solution and ensure a more effective approach to software architecture.&lt;/p&gt;
&lt;h2 id=&quot;closing-thoughts&quot;&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;The difficulty in precisely defining software architecture comes from trying to tie it directly to software&apos;s most fundamental components, like data and code. While topics such as layered architecture, design patterns, and source-code design are related to software architecture, that association is only partly true. As noted, the strategies shaped by the context the software architect operates in are inseparable from the principles that guide the design, implementation, and evolution of these systems.&lt;/p&gt;
&lt;p&gt;It&apos;s essential to establish the boundaries, responsibilities, and relationships of each component chosen to make up the architecture map, taking into account all the constraints imposed by the environment and the subject being observed, whose systemic representation will be built. In this way, software architecture goes beyond basic components and covers broader, more complex aspects, involving decisions and strategies specific to each context and project.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&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;additional-links&quot;&gt;Additional links&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://architectelevator.com/&quot;&gt;Gregor Hohpe – Personal page&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;Book &quot;The Software Architect Elevator&quot; – Amazon&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Book review – "The Software Architect Elevator", Part I]]></title><description><![CDATA[Context Software architecture has been the subject of heated debate among engineers and IT managers for decades. Many works by great authors…]]></description><link>https://blog.decodifique.com/en/the-software-architect-elevator-parte-1/</link><guid isPermaLink="false">https://blog.decodifique.com/en/the-software-architect-elevator-parte-1/</guid><pubDate>Wed, 25 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;
&lt;p&gt;Software architecture has been the subject of heated debate among engineers and IT managers for decades. Many works by great authors — Mark Richards, Sam Newman, Len Bass, George Fairbanks, Frederick Brooks Jr., among others — have helped shed light on this vast topic.&lt;/p&gt;
&lt;p&gt;This review covers the first part of the book &lt;strong&gt;&quot;The Software Architect Elevator&quot;&lt;/strong&gt; [1], written by Gregor Hohpe [2], who is also the author of the acclaimed EIP, &lt;strong&gt;&quot;Enterprise Integration Patterns&quot;&lt;/strong&gt; [3], a catalog of essential patterns for integrating systems.&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;Elevators&quot;
        title=&quot;Figure 1. Software architects need to travel across different organizational levels.&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;Figure 1. Software architects need to travel across different organizational levels.&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&quot;part-i--architects&quot;&gt;Part I – Architects&lt;/h2&gt;
&lt;p&gt;In this first part, the author lists the skills and traits that are desirable in a software architect, and what roles they should play within an organization: broad strategic vision, technical leadership, and being a good people manager.
The author states that these professionals need to handle discussions that go beyond the purely technical, such as &lt;strong&gt;the situational context they&apos;re operating in&lt;/strong&gt; and &lt;strong&gt;certain tacit assumptions&lt;/strong&gt;, which sometimes hide fundamental contextual information, as well as establishing communication across different organizational levels.&lt;/p&gt;
&lt;p&gt;Finding the right balance in design decisions, according to the established goals and principles, is essential — connecting software components so they can work together to achieve the expected outcome, all while managing complexity through governance techniques.&lt;/p&gt;
&lt;p&gt;When it comes to communication, the author uses the metaphor of a building&apos;s elevator, connecting the lower floors — where systems engineers work on building and maintaining the business&apos;s software systems — to the upper floors, where the executives responsible for the business&apos;s high-level abstraction sit. This connection is represented by the metaphor of a building elevator. In this context, the architect&apos;s job is to move naturally between these floors without losing the essence of the message — in other words, adapting the language used to the specific needs of each audience.&lt;/p&gt;
&lt;p&gt;In situations where there&apos;s resistance to the software architect&apos;s role in communicating across levels, the author argues that it&apos;s necessary to work at reducing that resistance. One way to do that is by getting the upper levels genuinely interested in and aware of the projects being carried out by engineering. It&apos;s also important to establish frequent feedback loops.&lt;/p&gt;
&lt;p&gt;On the technical side, Hohpe describes how architects must ensure that the solutions being built preserve the balance and proportion of the original ideas. This same ability is mentioned by Frederick Brooks Jr. in his book &lt;strong&gt;&quot;The Mythical Man-Month&quot;&lt;/strong&gt;, where it&apos;s called &quot;conceptual integrity.&quot; Brooks highlights how important it is for the architect to work at tying together the ideas that make up the system and preserving the cohesion of the whole.&lt;/p&gt;
&lt;p&gt;An architect&apos;s experience across projects of different sizes is essential, giving them the sensitivity to spot opportunities for change that go beyond a system&apos;s expected functional requirements. These changes might include the need to support shifts in the volume of data being processed, environment changes when the system is moved to a new cloud provider, or the need to implement globalization features so the system becomes available in multiple languages.&lt;/p&gt;
&lt;p&gt;Another important technical aspect is promoting the building of tools for building and shipping software to production, increasing the speed of delivering changes while also reducing the risk of errors from manual operations carried out by operations teams.
A software architect must ensure their technical judgment stays free of bias, so they need to make sure they&apos;re in touch with other experts who can give them information that lets them see past the buzzwords and discern whether a solution is genuinely new, or just &quot;cleverly reheated.&quot; This matters, because it curbs the temptation for an architect to stay comfortable with the same set of solutions, or to irrationally adopt new tools without good reasons to apply them.&lt;/p&gt;
&lt;p&gt;According to the author, enterprise architecture is the logical organization of business processes and the IT infrastructure that supports them, bringing together the work of business and IT architects. There are various business-process mapping tools that architects use. According to Hohpe, architects should be cautious about using these tools as mere documentation, since the end product can become outdated the moment it&apos;s released. However, this static approach presents a recurring dilemma for architects, since it may not accurately reflect the constantly changing interactions within the business environment.&lt;/p&gt;
&lt;p&gt;There are different levels of seniority for software architects, which, according to Hohpe, can be identified by applying the tripod of &lt;strong&gt;skill, impact, and leadership&lt;/strong&gt; — where skill refers to the ability to solve real problems with the right tools; impact measures how the architect&apos;s skills benefit the company, helping it reach its strategic and market goals; and leadership, which determines the architect&apos;s ability to advance the state of their practice, sharing knowledge through talks, blogs, publications, and mentoring other professionals.&lt;/p&gt;
&lt;p&gt;Finally, the ability to ask the right questions and identify who makes the decisions — and the motivations behind them — is an indispensable skill for a software architect.&lt;/p&gt;
&lt;h2 id=&quot;closing-thoughts&quot;&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;The reflections Hohpe presents in this first part are essential for understanding the position the software architect occupies within the complex organizational ecosystem, which involves multiple stakeholder groups, going well beyond purely technical decisions related to engineering or operations.&lt;/p&gt;
&lt;p&gt;That said, it&apos;s worth highlighting that communication and decision-making ability is the single most important factor for successful management, regardless of the area in question — whether to set a new direction or change the trajectory of a project that has drifted from its plan.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://architectelevator.com/&quot;&gt;Gregor Hohpe – Personal page&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;Book &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;Book &quot;Enterprise Integration Patterns&quot; – Amazon&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Upgrading Sleuth for Spring Boot 3.0]]></title><description><![CDATA[Context My team and I were recently working on library upgrades for APIs built on . These
upgrades were happening in projects running the…]]></description><link>https://blog.decodifique.com/en/sleuth-spring-boot-30/</link><guid isPermaLink="false">https://blog.decodifique.com/en/sleuth-spring-boot-30/</guid><pubDate>Sun, 08 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;
&lt;p&gt;My team and I were recently working on library upgrades for APIs built on &lt;code class=&quot;language-text&quot;&gt;Spring Boot&lt;/code&gt;. These
upgrades were happening in projects running the framework on version &lt;code class=&quot;language-text&quot;&gt;2.7.X&lt;/code&gt;, and we wanted to take
the opportunity to move up to version &lt;code class=&quot;language-text&quot;&gt;3.0.1&lt;/code&gt;, made
available as &lt;a href=&quot;https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga&quot;&gt;Generally Available in late November 2022&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The upgrade guide available in
the &lt;a href=&quot;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide&quot;&gt;framework&apos;s official repository&lt;/a&gt; went smoothly, with the build and automated tests running without issues.&lt;/p&gt;
&lt;p&gt;However, when we ran the project and looked at the logs, we noticed the &lt;code class=&quot;language-text&quot;&gt;Trace Id&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;Span Id&lt;/code&gt; were missing from the
records, which are normally enriched through the &lt;a href=&quot;https://spring.io/projects/spring-cloud-sleuth&quot;&gt;Spring Cloud Sleuth&lt;/a&gt; library.&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;problem&quot;&gt;Problem&lt;/h2&gt;
&lt;p&gt;A quick read of the Sleuth documentation tells us this project was absorbed
by &lt;a href=&quot;https://micrometer.io/docs/tracing&quot;&gt;Micrometer Tracing&lt;/a&gt; starting
with &lt;strong&gt;Spring Boot 3.0&lt;/strong&gt;, and therefore appears to be deprecated &lt;strong&gt;starting with version 3.1&lt;/strong&gt;.
This is also confirmed on Micrometer&apos;s official GitHub, which provides
a &lt;a href=&quot;https://github.com/micrometer-metrics/tracing/wiki/Spring-Cloud-Sleuth-3.1-Migration-Guide&quot;&gt;migration guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, the migration guide doesn&apos;t seem complete, since following it didn&apos;t result in trace data being printed correctly.&lt;/p&gt;
&lt;p&gt;So the goal of the walkthrough below is to help you with this migration.&lt;/p&gt;
&lt;h2 id=&quot;solution&quot;&gt;Solution&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Check that the project is using Spring Boot version 3.0;&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;Remove the Sleuth dependency;&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;Add the Micrometer Tracing dependency along with the bridge to Brave, which is responsible for creating the 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;If you don&apos;t already have it, add the Spring Actuator dependency. It&apos;s required for Micrometer&apos;s
autoconfiguration;&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;Finally, following Micrometer&apos;s migration guide, add the &lt;strong&gt;log pattern&lt;/strong&gt; property in
your &lt;code class=&quot;language-text&quot;&gt;.properties&lt;/code&gt;
or &lt;code class=&quot;language-text&quot;&gt;.yml&lt;/code&gt; file so that the &lt;strong&gt;Trace Id&lt;/strong&gt; and &lt;strong&gt;Span
Id&lt;/strong&gt; get printed;&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;When you run the project again, the Trace and Span Ids will start working correctly.&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;If you have any questions, feel free to reach out through my contacts.&lt;/p&gt;
&lt;p&gt;Happy coding, everyone. 😎&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&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;Spring Boot 3.0 GA release&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;Spring Boot 3.0 migration guide&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;Micrometer Tracing documentation&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;Sleuth 3.1 to Micrometer migration guide&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item></channel></rss>