<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Sre - Etiqueta - El Meu Racó Personal</title>
        <link>https://fde.cat/tags/sre/</link>
        <description>Sre - Etiqueta - El Meu Racó Personal</description>
        <generator>Hugo -- gohugo.io</generator><language>ca</language><lastBuildDate>Thu, 15 Feb 2024 00:00:00 &#43;0000</lastBuildDate><atom:link href="https://fde.cat/tags/sre/" rel="self" type="application/rss+xml" /><item>
    <title>La Simplicitat en Sistemes Complexos</title>
    <link>https://fde.cat/essays/simplicitat-sistemes-complexos/</link>
    <pubDate>Thu, 15 Feb 2024 00:00:00 &#43;0000</pubDate>
    <author>fde.cat</author>
    <guid>https://fde.cat/essays/simplicitat-sistemes-complexos/</guid>
    <description><![CDATA[<p>Després de gairebé dues dècades treballant amb sistemes distribuïts, he arribat a una conclusió que sembla contraintuïtiva: la complexitat és el veritable enemic, no els errors.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<h2 id="el-paradox-de-la-complexitat">El Paradox de la Complexitat</h2>
<p>Quan comencem a construir sistemes, afegir funcionalitats sembla gratuït. Un microservei aquí, una cua de missatges allà, una capa de cache per accelerar les coses. Cada decisió sembla raonable aïlladament.</p>
<blockquote class="quote-block">
  <div class="quote-content">
    Un sistema complex que funciona invariablement ha evolucionat d&rsquo;un sistema simple que funcionava. Un sistema complex dissenyat des de zero mai funciona i no pot fer-se funcionar. Has de començar de nou amb un sistema simple que funcioni.
  </div><footer class="quote-footer">
      <cite><span class="quote-author">John Gall</span>,<span class="quote-source">Systemantics: How Systems Work and Especially How They Fail</span></cite>
    </footer></blockquote>

<p>Però la complexitat no és additiva; és multiplicativa. Cada component nou no només afegeix la seva pròpia complexitat, sinó que multiplica les interaccions possibles amb tots els altres components.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<h2 id="els-costos-ocults">Els Costos Ocults</h2>
<p>La complexitat té costos que rarament apareixen als pressupostos:</p>
<ol>
<li><strong>Temps de diagnòstic</strong> — Cada incident triga més en investigar-se</li>
<li><strong>Onboarding</strong> — Els nous enginyers necessiten mesos per entendre el sistema</li>
<li><strong>Decisions de disseny</strong> — Cada canvi requereix considerar més implicacions</li>
<li><strong>Proves</strong> — La matriu de possibles interaccions creix exponencialment</li>
</ol>
<h3 id="un-exemple-real">Un Exemple Real</h3>
<p>Fa anys, vaig treballar en un sistema de processament de pagaments que havia crescut orgànicament durant una dècada. Tenia:</p>
<ul>
<li>47 microserveis</li>
<li>12 bases de dades diferents</li>
<li>8 cues de missatges</li>
<li>3 sistemes de cache</li>
<li>Aproximadament 150 integracions externes</li>
</ul>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-plaintext">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copiar al porta-retalls"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-plaintext" data-lang="plaintext"><span class="line"><span class="cl">┌─────────────────────────────────────────────────────┐
</span></span><span class="line"><span class="cl">│                    COMPLEXITAT                       │
</span></span><span class="line"><span class="cl">├─────────────────────────────────────────────────────┤
</span></span><span class="line"><span class="cl">│  Components: O(n)                                    │
</span></span><span class="line"><span class="cl">│  Interaccions: O(n²)                                 │
</span></span><span class="line"><span class="cl">│  Modes de fallada: O(2ⁿ)                             │
</span></span><span class="line"><span class="cl">└─────────────────────────────────────────────────────┘</span></span></code></pre></div></div>
<p>El temps mitjà de resolució d&rsquo;incidents havia passat de minuts a hores. No perquè els enginyers fossin menys capaços, sinó perquè entendre què estava passant requeria navegar una xarxa de dependències cada vegada més densa.</p>
<h2 id="simplicitat-deliberada">Simplicitat Deliberada</h2>
<p>La simplicitat no és absència de funcionalitat; és absència de complexitat innecessària. És el resultat de decisions conscients i, sovint, doloroses.</p>
<blockquote class="quote-block">
  <div class="quote-content">
    La perfecció s&rsquo;assoleix, no quan no hi ha res més a afegir, sinó quan no hi ha res més a treure.
  </div><footer class="quote-footer">
      <cite><span class="quote-author">Antoine de Saint-Exupéry</span></cite>
    </footer></blockquote>

<h3 id="principis-pràctics">Principis Pràctics</h3>
<p>He après a aplicar alguns principis:</p>
<p><strong>1. Prefereix el monòlit primer</strong></p>
<p>Comença amb el sistema més simple que pugui funcionar. Només divideix quan tinguis evidència clara que la divisió resoldrà un problema real.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p><strong>2. Mesura abans d&rsquo;optimitzar</strong></p>
<p>La complexitat afegida per &ldquo;rendiment&rdquo; sovint no aporta millores mesurables. Fins i tot pitjor, pot afegir latència per la sobrecàrrega de comunicació entre components.</p>
<p><strong>3. Documenta les decisions, no només el codi</strong></p>
<p>Cada decisió arquitectònica hauria de tenir un ADR (Architecture Decision Record) que expliqui:</p>
<ul>
<li>El context</li>
<li>Les alternatives considerades</li>
<li>La decisió presa</li>
<li>Les conseqüències esperades</li>
</ul>
<p><strong>4. Revisa la complexitat periòdicament</strong></p>
<p>El que tenia sentit fa dos anys potser ja no el té. Programa revisions regulars de l&rsquo;arquitectura amb la pregunta: &ldquo;Això encara ens aporta valor?&rdquo;</p>
<h2 id="conclusió">Conclusió</h2>
<p>La simplicitat és una disciplina, no un estat natural. Requereix esforç constant, decisions difícils i la voluntat de dir &ldquo;no&rdquo; a funcionalitats que semblen atractives però que afegeixen complexitat innecessària.</p>
<p>Els millors sistemes que he vist no són els més sofisticats; són els que fan una cosa, la fan bé, i són prou simples perquè qualsevol membre de l&rsquo;equip els pugui entendre en una tarda.</p>
<hr>
<p><em>Aquesta és la primera entrada d&rsquo;una sèrie sobre lliçons apreses després de gairebé dues dècades en SRE. La propera entrada tractarà sobre observabilitat i per què &ldquo;més mètriques&rdquo; no sempre és millor.</em></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Això no vol dir que els errors no importin. Òbviament importa quan les coses fallen. Però la complexitat és la font d&rsquo;on neixen la majoria d&rsquo;errors difícils de diagnosticar.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Si tens <em>n</em> components, tens potencialment <em>n(n-1)/2</em> interaccions entre parells de components. A la pràctica, no totes les interaccions existeixen, però el creixement segueix sent superlineal.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Martin Fowler escriu extensament sobre això al seu article &ldquo;<a href="https://martinfowler.com/bliki/MonolithFirst.html" target="_blank" rel="noopener noreffer ">Monolith First</a>&rdquo;.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>]]></description>
</item>
</channel>
</rss>
