<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Escric coses</title><link href="https://blog.carlesjulia.com/" rel="alternate"/><link href="https://blog.carlesjulia.com/feeds/all.atom.xml" rel="self"/><id>https://blog.carlesjulia.com/</id><updated>2026-04-21T00:00:00+02:00</updated><subtitle>Bloc tècnic de Carles Julià</subtitle><entry><title>Parlem de complexitat, no de deute tècnic</title><link href="https://blog.carlesjulia.com/ca/deute-tecnic-complexitat/" rel="alternate"/><published>2026-04-21T00:00:00+02:00</published><updated>2026-04-21T00:00:00+02:00</updated><author><name>Carles Julià</name></author><id>tag:blog.carlesjulia.com,2026-04-21:/ca/deute-tecnic-complexitat/</id><summary type="html">&lt;p&gt;La metàfora del deute tècnic porta associat un estigma de mala gestió que dificulta la comunicació amb equips no tècnics. Pensar en termes de complexitat — quelcom inevitable que s'acumula per causes sovint externes — ens permet raonar millor sobre el problema i justificar el temps necessari per abordar-lo.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Fa poc més d'un any, estàvem fent un retir estratègic a l'empresa, i m'havia posat com a objectiu, garantir que tindríem temps i dedicació per a millorar el nostre codi. El que se'n diu pagar deute tècnic.&lt;/p&gt;
&lt;p&gt;Tradicionalment, en la meva experiència, i pel que llegeixo en la de molta gent, el deute tècnic és molt difícil de gestionar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;És difícil d'identificar&lt;/li&gt;
&lt;li&gt;És difícil de comptabilitzar&lt;/li&gt;
&lt;li&gt;És difícil de comunicar&lt;/li&gt;
&lt;li&gt;I per tant és difícil d'acomodar temps i esforç a reduir-lo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Va coincidir que vaig llegir diversos articles (o veure vídeos - ja fa un any d'això) on parlaven d'un concepte diferent, la complexitat, que em va ajudar molt més a raonar sobre aquest tema i a comunicar-lo que no pas el concepte de deute tècnic.&lt;/p&gt;
&lt;p&gt;Per això crec que és interessant deixar-ho clar i per escrit, per a mi i per a qui ho trobi.&lt;/p&gt;
&lt;h2 id="les-dificultats-del-concepte-deute-tecnic"&gt;Les dificultats del concepte "deute tècnic"&lt;/h2&gt;
&lt;p&gt;D'alguna forma, si tens problemes per pagar un deute, se't mira com algú que no sap gestionar els seus diners. Hi ha un estigma associat al deute:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;poca planificació&lt;/li&gt;
&lt;li&gt;poca disciplina&lt;/li&gt;
&lt;li&gt;poca visió de futur&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A més, la imatge mental que es té és que s'ha corregut massa i s'han fet les coses malament per arribar als terminis, i ara cal arreglar-ho.&lt;/p&gt;
&lt;p&gt;Això fa que quan parles de deute tècnic, la gent ho vegi com un problema de gestió, i no com un problema tècnic. I això dificulta molt la comunicació amb altres departaments (producte, negoci, etc.) que no són tècnics.&lt;/p&gt;
&lt;p&gt;Fins i tot es creu que és quelcom que l'equip tècnic ha de resoldre per si mateix, sense ajuda de ningú més, com quelcom que han d'arreglar per que no han fet bé la seva feina abans, com a penyora.&lt;/p&gt;
&lt;p&gt;I de fet no és així. Hi ha molts motius per l'acumulació de deute tècnic. Moltes vegades per causes no pròpiament tècniques, com la impossibilitat de conèixer el problema i el mercat, a priori:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;el problema original ha canviat i ara és un altre&lt;/li&gt;
&lt;li&gt;les prioritats eren diferents&lt;/li&gt;
&lt;li&gt;el mercat ha canviat&lt;/li&gt;
&lt;li&gt;l'equip ha canviat&lt;/li&gt;
&lt;li&gt;les eines han canviat&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Però tot això sembla simplement una llista d'excuses per no haver fet bé la feina. I aquí entra el concepte de complexitat.&lt;/p&gt;
&lt;h2 id="pensar-en-termes-de-complexitat"&gt;Pensar en termes de complexitat&lt;/h2&gt;
&lt;p&gt;Deixem de classificar el codi en bo o dolent: no usem metàfores de deute. Hi ha codi, i en principi fa el que ha de fer.&lt;/p&gt;
&lt;p&gt;Volem que faci també alguna altra cosa? Afegim més codi. Segurament canviem una mica el codi existent per a acomodar el codi nou. Ostres!, abans aquesta abstracció pressuposava quelcom que ara ja no és cert: cal canviar tots els llocs on s'usava. Com ho testejo, això? Mirem com ho hem solucionat en altres tests... I aquest problema justament el podríem solucionar amb la nova versió de la llibreria, però, si l'actualitzo, trencaré alguna cosa?&lt;/p&gt;
&lt;p&gt;La complexitat ens fa anar més lents per què ens costa més raonar sobre els canvis que estem introduint. Si som capaços de mantenir-ho tot alhora en el nostre cap, podem prendre decisions molt més fàcilment, però si no podem, cada canvi es converteix en una exploració i redescobriment.&lt;/p&gt;
&lt;p&gt;Eventualment, tot projecte de programari acaba recordant l'escena famosa de Malcom In the Middle:&lt;/p&gt;
&lt;div class="video-embed video-embed-youtube" style="position: relative; width: 100%; padding-bottom: 56.25%; height: 0; margin: 1.5rem 0;"&gt;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen frameborder="0" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/AbSehcT19u0?feature=oembed" style="position: absolute; inset: 0; width: 100%; height: 100%; border: 0;" title="YouTube video"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h2 id="al-nostre-equip-li-costava-progressar"&gt;Al nostre equip li costava progressar&lt;/h2&gt;
&lt;p&gt;I és que justament això és el que ens estava passant. Constantment se'ns preguntava com ens podien costar tant les coses. Durant l'any anterior havíem estat dedicant molt de temps a una app mòbil, que semblava encallar-se constantment. El que funcionava una setmana ho deixava de fer la següent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Havíem arribat al límit de la complexitat que qualsevol membre de l'equip podia mantenir dins el seu cap&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Però era molt difícil d'entendre des de fora de l'equip. Com podia ser tan complicat tot? Al final &lt;em&gt;no semblava pas que el problema que estàvem solucionant fos tan complicat&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I aquí estava una mica el quid de la qüestió.&lt;/p&gt;
&lt;h2 id="no-tota-la-complexitat-es-igual"&gt;No tota la complexitat és igual&lt;/h2&gt;
&lt;p&gt;Hi ha complexitat que és inherent al problema que intentem solucionar. Que correspon a l'àmbit de negoci, a la realitat. Aquesta és innegociable: És la &lt;strong&gt;complexitat essencial&lt;/strong&gt;. Simplificar aquí seria perdre detall del problema i no seríem capaços de solucionar-lo correctament.&lt;/p&gt;
&lt;p&gt;En canvi, hi ha complexitat que no correspon al problema en si: la &lt;strong&gt;complexitat accidental&lt;/strong&gt;. Aquesta correspon a tot allò que no és el problema en si que volem solucionar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sistema de build complex&lt;/li&gt;
&lt;li&gt;eines massa complexes o desconegudes&lt;/li&gt;
&lt;li&gt;base del codi que ha canviat durant el temps i és difícil de llegir&lt;/li&gt;
&lt;li&gt;documentació que ha quedat obsoleta&lt;/li&gt;
&lt;li&gt;aquella feature que es va fer a correcuita i és massa enrevessada&lt;/li&gt;
&lt;li&gt;la mescla de llenguatges de programació, frameworks, llibreries i versions&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Aquesta distinció entre complexitat essencial i accidental la va formular Fred Brooks al seu assaig clàssic &lt;a href="https://en.wikipedia.org/wiki/No_Silver_Bullet"&gt;&lt;em&gt;No Silver Bullet&lt;/em&gt;&lt;/a&gt; (1986), on argumentava que no hi ha cap avenç tecnològic capaç de reduir la complexitat essencial d'un problema.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I és que amb un projecte d'una dècada de durada, es podia veure la història i l'acumulació de mil cosetes que ho feien tot molt complex.&lt;/p&gt;
&lt;h2 id="per-que-acumulem-complexitat"&gt;Per què acumulem complexitat&lt;/h2&gt;
&lt;p&gt;Ningú té com a objectiu augmentar la complexitat accidental, és més, la complexitat, a l'hora d'introduir-la, mai sembla accidental. És quelcom que passa de forma orgànica: el cert és que en el moment d'afegir complexitat estem solucionant problemes reals que tenim al projecte, i per això no ens n'adonem.&lt;/p&gt;
&lt;p&gt;Tal com passava amb la dificultat d'avenç de l'equip, a escala individual tota persona &lt;strong&gt;té un màxim nivell de complexitat que pot mantenir al seu cap&lt;/strong&gt;. Si la complexitat del projecte n'és inferior, té un espai de complexitat vacant. Aquesta complexitat vacant és la moneda corrent que usem per a crear features i afegir coses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No és bo ni dolent, és la forma en què funciona&lt;/strong&gt;: mentre hi hagi espai, l'anirem ocupant. Al principi, com més espai tinguem vacant de complexitat, més ràpid anirem afegint coses i fent canvis, i això és molt valuós. Però a mesura que anem omplint tot l'espai disponible, trobar racons costa molt més.&lt;/p&gt;
&lt;p&gt;Eventualment, quan la complexitat del projecte excedeix la capacitat de la persona, li és impossible de raonar amb claredat, i això fa que sigui quasi impossible avançar, amb perill d'acabar en un punt de no retorn, on no hi ha prou espai ni per a &lt;em&gt;desfragmentar&lt;/em&gt; la complexitat existent.&lt;/p&gt;
&lt;h2 id="com-ho-podem-solucionar"&gt;Com ho podem solucionar?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;més gent?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No serveix de res. La complexitat ens fa la punyeta de forma individual.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gent més capaç?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Podria semblar bona idea, però és encara pitjor. Gent més capaç pot tenir un límit més gran de suportar complexitat, però això només vol dir que seran capaços d'augmentar-la més, perjudicant encara més la resta de l'equip, que es veurà desbordat.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;separant els problemes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una possible forma és aquesta: divideix el que fas en dues o més parts independents. Això ajudarà molt si ho pots fer, però si ho pots fer potser és una mala senyal: per què la teva organització està fent dues coses totalment diferents? Segur que no estan relacionades?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Aquest mètode era popular durant l'auge dels microserveis: solució que va néixer per a solucionar un altre problema —l'escalabilitat de serveis gegantins de núvol— que, a més, quasi ningú no tenia. Però cada part no és al final totalment independent de les altres, obligant-se a dissenyar, negociar, mantenir, comunicar i documentar tots els punts de contacte. Suposo que si tens un exèrcit d'enginyers a la teva disposició, pot ser una opció.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;reduir complexitat!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Al final, l'única sortida és &lt;strong&gt;simplificar&lt;/strong&gt;. Això ho podem fer de vàries formes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;usant menys eines, més simples i més estàndards.&lt;/li&gt;
&lt;li&gt;fent refactors de codi que eliminin excepcions i simplifiquin codi.&lt;/li&gt;
&lt;li&gt;usant blocs de construcció que facin més coses (llibreries, frameworks) o transformant codi propi en blocs de construcció ben definits.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="i-al-final-explica-com-va-anar"&gt;I, al final, explica, com va anar?&lt;/h2&gt;
&lt;p&gt;Al final, amb l'explicació de la complexitat, vaig poder definir objectius de producte de reducció complexitat, per garantir poder tenir temps per a treballar-hi. Cada setmana teníem una reunió on ens preguntàvem què era el que ens frenava, per què anàvem lents. I fèiem una llista de les coses que volíem canviar.&lt;/p&gt;
&lt;p&gt;Després prioritzàvem aquesta llista amb una taula &lt;a href="https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/"&gt;RICE&lt;/a&gt; i a cada Sprint proposàvem d'atacar algun ítem de la llista de les primeres posicions. Una de les coses més grans que vam fer va ser fer la transició de &lt;a href="https://bazel.build/"&gt;Bazel&lt;/a&gt; a un monorepo organitzat amb &lt;a href="https://docs.astral.sh/uv/"&gt;uv&lt;/a&gt; i &lt;a href="https://pnpm.io/"&gt;pnpm&lt;/a&gt;, ja que, al final, tenir shell scripts coordinant les eines de build tenia menys complexitat que &lt;strong&gt;entendre&lt;/strong&gt; Bazel i mantenir-lo...&lt;/p&gt;
&lt;p&gt;Finalment, vam poder recuperar les regnes del projecte. Vam sortir de l'espiral en la que ens trobàvem.&lt;/p&gt;
&lt;h2 id="te-sentit-tot-aixo-en-lera-de-la-ia"&gt;Té sentit tot això en l'era de la IA?&lt;/h2&gt;
&lt;p&gt;La IA ens ajuda a operar en una complexitat molt major a la que teníem fins ara. Llavors, ens hem de preocupar de reduir la complexitat, realment?&lt;/p&gt;
&lt;p&gt;Ja escrivia anteriorment que podem &lt;a href="https://blog.carlesjulia.com/ca/paga-el-deute-tecnic-ia/"&gt;pagar el deute tècnic amb la ia&lt;/a&gt;, i així ho hem de fer! I de fet no només ho hem de fer per a nosaltres, sinó també per a la IA!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La IA té el mateix problema que nosaltres en termes de límit de complexitat&lt;/strong&gt;, i hem d'estar vigilants que no se'ns en vagi de les mans, per què llavors ens serà molt més difícil sortir a rescatar la IA d'aquesta nova complexitat que va més enllà dels nostres límits.&lt;/p&gt;
&lt;p&gt;Així que la meva recomanació més recent és fer cas de l'olfacte: cada vegada que veiem quelcom que fa mala olor, cada vegada que ens diem a nosaltres mateixos "això hauria de ser una llibreria genèrica" o "tots aquests warnings ens petaran als nassos en algun moment", afegir-ho a una llista. I constantment treballar per reduir aquesta llista amb l'ajuda de la IA, en background.&lt;/p&gt;
&lt;p&gt;Per què realment la IA ens accelera, i sembla ser molt més ràpida que nosaltres en afegir complexitat accidental, si no la lliguem curt, si no som exigents i perfeccionistes.&lt;/p&gt;</content><category term="blog"/><category term="python"/><category term="tooling"/><category term="enginyeria"/></entry><entry><title>Paga el deute tècnic amb IA</title><link href="https://blog.carlesjulia.com/ca/paga-el-deute-tecnic-ia/" rel="alternate"/><published>2026-03-13T15:55:00+01:00</published><updated>2026-03-13T15:55:00+01:00</updated><author><name>Carles Julià</name></author><id>tag:blog.carlesjulia.com,2026-03-13:/ca/paga-el-deute-tecnic-ia/</id><summary type="html">&lt;p&gt;El deute tècnic és allò que sabem que hem de canviar però que l'usuari no veu. En aquest article explico com, gràcies als agents de codi, vaig poder portar el nostre programari més antic —Mapping Tool— de Mac Intel a Apple Silicon, modernitzant dependències de fa més de 10 anys amb Codex i Claude, i sense comprometre el roadmap de l'empresa.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ja comentava a l'&lt;a href="https://blog.carlesjulia.com/ca/era-pogramari-personal/"&gt;article anterior&lt;/a&gt; que l'economia de la programació ha canviat radicalment amb els agents de codi. I això també ha afectat el deute tècnic.&lt;/p&gt;
&lt;p&gt;Definim el deute tècnic com tot allò que sabem que hem de canviar, que ens fa anar més lents, que augmenta la complexitat; però que l'usuari no veu, i per tant és difícil de justificar el temps que cal invertir-hi.&lt;/p&gt;
&lt;p&gt;No em centraré en el deute tècnic avui (ja tinc un article a mitges sobre això). El que vull és parlar de com els agents de codi ens poden ajudar a pagar-lo, amb un exemple pràctic: portar el nostre programari més antic —&lt;a href="https://www.protopixel.io/product/mapping-tool"&gt;Mapping Tool&lt;/a&gt;— de Mac Intel a Apple Silicon.&lt;/p&gt;
&lt;h2 id="el-deute-que-vaig-contraure"&gt;El deute que vaig contraure&lt;/h2&gt;
&lt;p&gt;Durant el màster i el doctorat, m'interessava molt l'art digital i la programació creativa. El que estava de moda en aquells cercles era openFrameworks, un framework que feia fàcil la creació d'aplicacions interactives en C++. M'hi vaig llançar de cap: el feia servir en les pràctiques dels meus estudiants i en projectes del màster i del doctorat.&lt;/p&gt;
&lt;p&gt;Quan vaig començar a treballar en el programari que més tard es convertiria en Mapping Tool, naturalment el vaig fer en c++ i openFrameworks. I en el moment va ser una bona elecció: ens va permetre crear ràpidament solucions que podíem iterar molt ràpidament.&lt;/p&gt;
&lt;p&gt;I, de fet, per a poder iterar més ràpidament encara i fer-lo més flexible, hi vaig &lt;a href="https://github.com/chaosct/ofxPython"&gt;encastar el runtime de python exposant-hi tot openFrameworks&lt;/a&gt;. Així, els usuaris -nosaltres, en aquell moment- podíem crear nous continguts luminics interactius sense haver de tocar c++, de forma dinàmica.&lt;/p&gt;
&lt;p&gt;En aquell moment no ho sabia, però acabava de contraure un deute tècnic que m'aniria perseguint durant els següents anys: la filosofia de openFrameworks era de trencar la seva API interna sense por, i jo em veia atrapat a una versió concreta d'openFrameworks, però no trencar tot el codi d'usuari que podia estar corrent a casa dels clients.&lt;/p&gt;
&lt;p&gt;Per més complicació, openFrameworks venia amb una sèrie de llibreries de tercers pre-compilades, en versions específiques amb pedaços dels propis autors de oF. Només poder navegar la compatibilitat amb els canvis dels compiladors (com el position independent code a linux) ja era un maldecap: vam acabar mantenint un fork privat de oF on hi anàvem aplicant els pedaços que necessitàvem perquè el Mapping Tool seguís funcionant.&lt;/p&gt;
&lt;h2 id="no-es-pot-tirar-sempre-la-pilota-endavant"&gt;No es pot tirar sempre la pilota endavant&lt;/h2&gt;
&lt;p&gt;A poc a poc, vam anar perdent l'habilitat de compilar Mapping tool en les nostres màquines personals: al principi per tenir versions massa noves del Sistema Operatiu, i després per tenir una arquitectura totalment diferent: Apple silicon, basada en ARM. Però a tot problema s'hi troba una solució, en el nostre cas, mantenir un mac mini antic amb mac intel com a builder.&lt;/p&gt;
&lt;p&gt;I el que semblava simplement un inconvenient constant, però portable, es va convertir de cop en un gran problema: Apple va anunciar que deixaria de donar suport a mac intel. A partir d'algun release del proper any, el Mapping Tool no funcionaria a les màquines dels clients. I estavem atrapats amb un framework i llibreries de fa més de 10 anys, algunes discontinuades, sense suport per a un maquinari que encara no existia.&lt;/p&gt;
&lt;p&gt;Així que ja teniem una data límit. Però podiem permetre'ns dedicar tant d'esforç a una cosa que no generava valor nou? Per als usuaris, que el programari segueixi funcionant és quelcom que es presuposa. No podíem tornar al cap d'un any dient "Us portem la nova versió de Mapping tool, amb exactament les mateixes capacitats i mancances, però que continua funcionant".&lt;/p&gt;
&lt;p&gt;A més a més, per la situació de la companyia i el roadmap que havíem de tirar endavant, resultava clar que continuaríem tirant la pilota endavant fins a l'últim moment, tret que trobéssim una solució imaginativa que ens permetés d'avançar sense comprometre el nostre roadmap.&lt;/p&gt;
&lt;h2 id="codex-al-rescat"&gt;Codex al rescat&lt;/h2&gt;
&lt;p&gt;Començo a investigar amb Codex quina seria la forma moderna de gestionar les llibreries. La idea era que si podia substituir les llibreries pre-compilades per altres que es poguessin compilar en ARM, podria compilar tot el binari per Apple Silicon. I per a fer-ho, necessitaria un sistema modern de gestió de dependències. Codex proposa conan, i en fem un petit PoC: passar una sola dependencia, una que havia introduit jo posteriorment i que coneixia bé, &lt;code&gt;pugixml&lt;/code&gt; a conan.&lt;/p&gt;
&lt;p&gt;Amb el PoC funcionant, li demano a Codex que faci una auditoria de totes les llibreries a substituir, i que creï un document amb tota la informació necessària per, a poc a poc, anar-les atacant d'una en una.&lt;/p&gt;
&lt;p&gt;Amb el document de base, es tractava d'obrir una sessió de Codex, demanar que es llegís la documentació i que ataqués la substitució de la llibreria que li semblés més factible. I que apuntés tot el que canviava i havia après al mateix document. Aquest procés dura mesos, en els que vaig treballant entre tasques i fora d'hores. De vegades fent ssh des del mòbil a una màquina on tenia l'agent corrent, per a donar-li indicacions.&lt;/p&gt;
&lt;p&gt;Algunes de les llibreries existeixen a conan amb la mateixa versió, algunes amb una versió posterior, i d'altres simplement ja no existeixen i han de ser substituïdes per d'altres. Tot això ho aconsegueix resoldre Codex.&lt;/p&gt;
&lt;p&gt;Finalment, després de modernitzar totes les llibreries de base, sóc capaç d'intentar -i succeir- compilar el Mapping Tool per Apple Silicon.&lt;/p&gt;
&lt;h2 id="el-que-vaig-fer-era-gairebe-un-ralph-loop"&gt;El que vaig fer era gairebé un Ralph Loop&lt;/h2&gt;
&lt;p&gt;Si heu estat atents a l'actualitat de IA, un &lt;a href="https://ghuntley.com/ralph/"&gt;ralph loop&lt;/a&gt; justament fa això, però d'una forma una mica més autònoma. No és sorprenent que tothom vagi arribant a les mateixes conclusions sobre com operar amb agents de codi de forma efectiva: és molt important donar a l'agent de codi una forma de comprovar els resultats, de compilar i veure els errors. Així pot iterar sol molt millor i durant més temps.&lt;/p&gt;
&lt;p&gt;Inicialment passava els errors manualment des del log del CI a Codex, però més tard vaig donar-li un script per a baixar-se tot el resultat de la compilació i trobar els logs del que havia fallat. Això va millorar bastant l'ergonomia.&lt;/p&gt;
&lt;h2 id="claude-es-millor-debugant"&gt;Claude és millor debugant&lt;/h2&gt;
&lt;p&gt;No tot ho va fer Codex. Claude va resoldre un problema de violació de segment a Linux. No era senzill, ja que usem tecnologia d'AppImage per empaquetar llibreries del sistema com glibc. Ho va fer entrant per SSH en un ordinador on fallava, per debugar-lo en remot. Vaig quedar genuïnament impressionat.&lt;/p&gt;
&lt;h2 id="al-final-pagar-deute-tecnic-si-que-tenia-valor"&gt;Al final, pagar deute tècnic sí que tenia valor&lt;/h2&gt;
&lt;p&gt;Després de fer el port, la versió de Mapping Tool no només funciona fent el mateix. Només pel fet d'estar corrent de forma nativa, ja va molt més ràpid, amb guanys espectaculars. A més, ara hem recuperat la capacitat de fer profiling, i amb una sessió curta hem pogut optimitzar la càrrega de projectes. Entre els dos guanys, projectes que tardaven minuts en carregar, ara carreguen en escassos segons.&lt;/p&gt;
&lt;h2 id="som-massa-productius"&gt;Som massa productius&lt;/h2&gt;
&lt;p&gt;Si bé és cert que he pogut esquivar un gran problema gràcies a l'augment de productivitat que ens dónen els agents de codi i la IA en general, també ho és que això ens crea una pressió molt forta a ser més productius: quan cada minut compta de forma significativa, és molt difícil parar i no fer res.&lt;/p&gt;
&lt;p&gt;Quan vaig impulsar el sistema de CI/CD intern per a compilar els productes (en aquell moment amb builds de 1 o 2 hores), sentia que si no estavem fent build tota l'estona - dia i nit - estavem perdent el temps. El mateix em passa ara: la pressió de "hauriem de tenir agents de codi treballant de forma continua dia i nit" és cada cop més present. La tinc i la llegeixo a gent del sector.&lt;/p&gt;
&lt;p&gt;Perquè com em deien avui a l'oficina, el programari no s'acaba. Sempre hi ha coses per pulir, eines per fer, casos d'ús per descobrir. I &lt;strong&gt;deute tècnic per pagar&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En aquest món tan ràpidament canviant, almenys en aquest moment, estem tots en una espiral de productivitat que haurem d'aprendre a combatre i gestionar. I si ja és tot tant intens ara, imaginem-nos amb els avenços els propers mesos i anys i l'adveniment de la IAG...&lt;/p&gt;</content><category term="blog"/><category term="AI"/><category term="agents"/><category term="deute tècnic"/><category term="C++"/></entry><entry><title>L'era del programari personal</title><link href="https://blog.carlesjulia.com/ca/era-pogramari-personal/" rel="alternate"/><published>2026-01-25T00:00:00+01:00</published><updated>2026-01-25T00:00:00+01:00</updated><author><name>Carles Julià</name></author><id>tag:blog.carlesjulia.com,2026-01-25:/ca/era-pogramari-personal/</id><summary type="html">&lt;p&gt;"Els agents de codi han canviat l'economia del programari: crear eines ad-hoc, personalitzar projectes open source o automatitzar tasques que abans no valien la pena ja és trivial. En aquest article repasso diversos exemples pràctics d'eines que he creat o modificat amb agents, des d'automatitzacions d'onboarding fins a personalitzar programari en Rust sense saber-ne."&lt;/p&gt;</summary><content type="html">&lt;p&gt;Portem una progressió d'eines molt interessant l'últim any. Primer, amb agents de langchain s'intentava el que claude code va ser el primer a aconseguir: la combinació de tools amb LLMs, amb un loop d'acció i test. Aquest 2026 tot s'està accelerant amb Ralph loops i clawdbot.&lt;/p&gt;
&lt;p&gt;El programari s'està abaratint a xarxes forçaces i, tot i les seves limitacions, hi ha molts casos d'ús on de cop l'economia de la progamació ha quedat trastocada.&lt;/p&gt;
&lt;p&gt;No tinc temps, ni l'habilitat, per a fer una disetació d'on ens porta tot això, però puc donar cinc centims de coses que he aconseguit fent servir agents de codi que no hagués pogut fer abans.&lt;/p&gt;
&lt;h2 id="automatitxacio-del-long-tail"&gt;Automatitxació del &lt;em&gt;long tail&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;L'economia de l'automatització estava perfectament capturada per la clàssica vinyeta de XKCD:&lt;/p&gt;
&lt;p&gt;&lt;img alt="XKCD 1205: is it worth the time?" src="https://imgs.xkcd.com/comics/is_it_worth_the_time.png"&gt;&lt;/p&gt;
&lt;p&gt;El primer cop que vaig veure aquesta vinyeta, em va quedat gravada a la retina. I he intentat no caure al forat negre de crerar codi per a automatitzar coses per a tasques que no tenen un retorn positiu en temps. Aquesta graella ja no té sentit: crear programari és tant barat (en temps) que gairebé qualsevol cosa es pot automatitzar.&lt;/p&gt;
&lt;h3 id="eines-donboarding-i-offboarding"&gt;Eines d'Onboarding i offboarding&lt;/h3&gt;
&lt;p&gt;He creat un parell d'eines per a fer onboqarding i offboarding. Backups de dades de google workspace i després pujar-ho en una unitat compartida de drive? Fet! Crear els comptes nous a les diferents plataformes i assignar-los els permisos? Fet! Crear un informe amb tot el procés? Fet!&lt;/p&gt;
&lt;h2 id="eines-dun-sol-us"&gt;Eines d'un sol ús&lt;/h2&gt;
&lt;p&gt;El mateix passa amb tasques que vols automatitzar &lt;strong&gt;un sol cop&lt;/strong&gt;.
He creat tot un programari ad-hoc per a transformar &lt;strong&gt;un&lt;/strong&gt; informe en markdown a PDF. Demanant coses extranyes, Etiquetes de colors, index maco... Ha funcionat perfectament i després d'aquest sol ús, no el faré servir mai més. Però no hauria fet manualment, no m'hauria valgut la pena.&lt;/p&gt;
&lt;h2 id="personalitzacio-de-programari-existent"&gt;Personalització de programari existent&lt;/h2&gt;
&lt;p&gt;Un dels casos d'ús més interessants. Baixa't el codi d'un repo de github, demana modificacións i úsa'l. No cal ni publicar-lo.&lt;/p&gt;
&lt;h3 id="tukai-aprendre-tipografia"&gt;Tukai: aprendre tipografia&lt;/h3&gt;
&lt;p&gt;Aquest any me n'he adonat que amb els agents de codi el coll d'ampolla del desenvolupament passava a ser la velocitat amb la que podia escriure a màquina. En tants anys de dedicació a aquest aprofessió això no m'havia passat mai, normalment dedicava més temps a pensar que en escriure.&lt;/p&gt;
&lt;p&gt;Així que, a la meva edat, em vaig posar a aprendre tipografia. I necessitava un programa per a practicar que a més funcionés en local, per a fer-lo servir en els meus viatges en tren. Vaig trobar &lt;a href="https://github.com/hlsxx/tukai"&gt;Tukai&lt;/a&gt; i em va agradar. La pega: ni tenia llista de paraules en català.&lt;/p&gt;
&lt;p&gt;Amb claude code (o codex, no ho recordo) en un tres i no res hem afegit diversos diccionaris en català pels diferents nivells d'aprenentatge, basats en les paraules més freqüents de la Viquipèdia, i amb presència equilibrada de totes les lletres.&lt;/p&gt;
&lt;h3 id="claude-code-sleep-preventer"&gt;Claude Code Sleep preventer&lt;/h3&gt;
&lt;p&gt;Una cosa que em fa molta ràbia del macbook és la com d'agressiu és posant-se en repòs a la mínima que pot. I quan fas servir un agent de codi, aquest tema esdevé un problema.&lt;/p&gt;
&lt;p&gt;Aparentment &lt;a href="https://github.com/CharlonTank/claude-code-sleep-preventer"&gt;Claude Code Sleep Preventer&lt;/a&gt; fa exactament això, però: O forks, 0 estrelles! Així que he baixat el codi i li he fet fer una auditoria al claude code.&lt;/p&gt;
&lt;p&gt;Aquest ja m'ha revelat una sorpresa: aparentment el programari també transcriu la veuquan li demanes que ho faci, i per a fer-ho necessita baixar i executar un model en local (whisper) de més de centenars de megues. A part d'això, el programari no sembla maliciós.&lt;/p&gt;
&lt;p&gt;Així que amb 5 minuts de modificacions amb claude code, ja el tinc instal·lat, sense la part de transcripció de veu, i funcionant.&lt;/p&gt;
&lt;p&gt;I tot aixpo en rust, que ni domino ni casi sé llegir!&lt;/p&gt;
&lt;h2 id="jugant-amb-clawdbot"&gt;Jugant amb clawdbot&lt;/h2&gt;
&lt;p&gt;L'exemple més radical que he pogut experimentar és el del clawdbot. Quan vaig descobrir què era, una espècie de claude code universal que es pot fer servir com assistent personal, el vaig instal·lar: realment necessito un assistent personal.&lt;/p&gt;
&lt;p&gt;El cas és que si li demanes si pot fer tal o qual cosa, et pot dir quelcom en la linia de: no ho puc fer, però puc programar-me un plugin per a fer-ho. I ho fa! El propi programa-assistent es crea les seves pròpies extensions. En el meu cas, volia processar informació de Notion, i pocs minuts més tard ja en podia llegir i escriure articles.&lt;/p&gt;
&lt;h2 id="conclusions"&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;Entrem en una etapa fascinant de la creació de programari. No en tinc ni idea de com serà el futur però el que sí que sé és que l'era de programes fixes, que no evolucionen, de tasques manuals acomplertes en solitari, s'ha acabat. I entrem en l'era del programari. Del programari barat i omnipresent.&lt;/p&gt;</content><category term="blog"/><category term="AI"/><category term="agents"/><category term="programari"/></entry><entry><title>The Age of Personal Software</title><link href="https://blog.carlesjulia.com/era-pogramari-personal-en.html" rel="alternate"/><published>2026-01-25T00:00:00+01:00</published><updated>2026-01-25T00:00:00+01:00</updated><author><name>Carles Julià</name></author><id>tag:blog.carlesjulia.com,2026-01-25:/era-pogramari-personal-en.html</id><summary type="html">&lt;p&gt;'Code agents have changed the economics of software: creating ad-hoc tools, customizing open source projects, or automating tasks that previously were not worth it is now trivial. In this article I go over several practical examples of tools I have created or modified with agents, from onboarding automations to customizing Rust software in a language I barely know.'&lt;/p&gt;</summary><content type="html">&lt;p&gt;Over the last year, these tools have evolved at a remarkable pace. Early LangChain agents were exploring the same idea, but Claude Code was the first tool that really made it work: combining tools with LLMs in an action-and-test loop. In 2026, all of this is accelerating with Ralph loops and clawdbot.&lt;/p&gt;
&lt;p&gt;Software is becoming dramatically cheaper to build and, despite its limitations, there are many use cases where the economics of programming have suddenly been turned upside down.&lt;/p&gt;
&lt;p&gt;I don't have the time, or the skill, to write a full dissertation on where all of this is taking us, but I can at least share a few things I've been able to do with code agents that I could not have done before.&lt;/p&gt;
&lt;h2 id="automating-the-long-tail"&gt;Automating the long tail&lt;/h2&gt;
&lt;p&gt;The economics of automation were perfectly captured by the classic XKCD comic:&lt;/p&gt;
&lt;p&gt;&lt;img alt="XKCD 1205: is it worth the time?" src="https://imgs.xkcd.com/comics/is_it_worth_the_time.png"&gt;&lt;/p&gt;
&lt;p&gt;The first time I saw that comic, it got burned into my brain. I've tried not to fall into the black hole of writing code to automate tasks that don't have a positive return on the time invested. That chart no longer really applies: software is now so cheap to create, in time terms, that almost anything can be automated.&lt;/p&gt;
&lt;h3 id="onboarding-and-offboarding-tools"&gt;Onboarding and offboarding tools&lt;/h3&gt;
&lt;p&gt;I've built a couple of tools for onboarding and offboarding. Backing up Google Workspace data and then uploading it to a shared Drive folder? Done. Creating the new accounts across different platforms and assigning permissions? Done. Generating a report with the whole process? Done.&lt;/p&gt;
&lt;h2 id="single-use-tools"&gt;Single-use tools&lt;/h2&gt;
&lt;p&gt;The same thing happens with tasks you only want to automate &lt;strong&gt;once&lt;/strong&gt;.
I built a whole ad-hoc piece of software to transform &lt;strong&gt;one&lt;/strong&gt; report from Markdown into PDF. With odd requirements, color-coded labels, a polished table of contents... It worked perfectly and after that single use, I will never use it again. But I would not have done it manually either. It would not have been worth it.&lt;/p&gt;
&lt;h2 id="customizing-existing-software"&gt;Customizing existing software&lt;/h2&gt;
&lt;p&gt;This is one of the most interesting use cases. You can pull down a GitHub repo, ask an agent to adapt it, and just use the result. You don't even need to publish it.&lt;/p&gt;
&lt;h3 id="tukai-learning-touch-typing"&gt;Tukai: learning touch typing&lt;/h3&gt;
&lt;p&gt;This year I realized that, with code agents, the bottleneck in development had shifted to my typing speed. In all my years in this profession, that had never happened to me before. Usually I spent more time thinking than typing.&lt;/p&gt;
&lt;p&gt;So, at this point in my life, I decided to learn touch typing properly. I needed a practice program that also worked locally so I could use it during train trips. I found &lt;a href="https://github.com/hlsxx/tukai"&gt;Tukai&lt;/a&gt; and liked it. The problem: it didn't even ship with a Catalan word list.&lt;/p&gt;
&lt;p&gt;With Claude Code, or Codex, I don't remember which, we quickly added several Catalan dictionaries for different learning levels, based on the most frequent words in Wikipedia and with balanced coverage of all letters.&lt;/p&gt;
&lt;h3 id="claude-code-sleep-preventer"&gt;Claude Code Sleep Preventer&lt;/h3&gt;
&lt;p&gt;One thing that really annoys me about the MacBook is how aggressive it is about going to sleep at the slightest opportunity. And when you're using a code agent, that becomes a problem.&lt;/p&gt;
&lt;p&gt;Apparently &lt;a href="https://github.com/CharlonTank/claude-code-sleep-preventer"&gt;Claude Code Sleep Preventer&lt;/a&gt; does exactly that, but: zero forks, zero stars. So I downloaded the code and had Claude Code audit it.&lt;/p&gt;
&lt;p&gt;That already revealed a surprise: apparently the software also transcribes speech when you ask it to, and to do that it needs to download and run a local Whisper model weighing in at hundreds of megabytes. Aside from that, the software did not seem malicious.&lt;/p&gt;
&lt;p&gt;So with five minutes of modifications in Claude Code, I had it installed, running, and without the speech transcription part.&lt;/p&gt;
&lt;p&gt;And all of that in Rust, a language I barely know how to read, let alone write.&lt;/p&gt;
&lt;h2 id="playing-with-clawdbot"&gt;Playing with clawdbot&lt;/h2&gt;
&lt;p&gt;The most extreme example I've personally tried is clawdbot. When I discovered what it was, a kind of universal Claude Code that you can use as a personal assistant, I installed it immediately. That immediately appealed to me, because I could genuinely use a personal assistant.&lt;/p&gt;
&lt;p&gt;The thing is, if you ask it whether it can do this or that, it might answer something like: I can't do that, but I can program myself a plugin to do it. And then it does. The assistant can effectively build its own extensions. In my case, I wanted to process information from Notion, and a few minutes later it was already able to read and write articles there.&lt;/p&gt;
&lt;h2 id="conclusions"&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;We are entering a fascinating stage in software creation. I have no idea what the future will look like, but one thing I do know is that the era of fixed programs that do not evolve, of manual tasks completed in isolation, is over. We are entering the age of software that is cheap, abundant, and everywhere.&lt;/p&gt;</content><category term="blog"/><category term="AI"/><category term="agents"/><category term="software"/></entry><entry><title>Benvinguda</title><link href="https://blog.carlesjulia.com/ca/benvinguda/" rel="alternate"/><published>2026-01-09T16:57:00+01:00</published><updated>2026-01-09T16:57:00+01:00</updated><author><name>Carles Julià</name></author><id>tag:blog.carlesjulia.com,2026-01-09:/ca/benvinguda/</id><summary type="html">&lt;p&gt;Tinc ganes d'explicar coses interessants i he decidit que un blog és el millor format per fer-ho. Aquí hi trobareu contingut tècnic i profund, en català, que aniré replicant a altres plataformes.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A vegades tinc ganes d'explicar coses, coses interessants, però mai trobo el temps ni sé on posar-les perquè arribi a algú.&lt;/p&gt;
&lt;p&gt;Després de llegir Hacker News de forma regular durant mesos, em queda clara la superioritat dels blogs per a explicar el tipus de coses que vull explicar. Així que muntaré aquest blog com a nucli i replicaré
els articles a altres outlets més tancats.&lt;/p&gt;
&lt;p&gt;Aquest és també el meu esforç perquè existeixi contingut de qualitat, profund i tècnic, en català.&lt;/p&gt;
&lt;p&gt;Espero no quedar-me atrapat en la implementació del blog. Anem veient.&lt;/p&gt;</content><category term="blog"/><category term="meta"/><category term="escriptura"/><category term="devto"/></entry><entry><title>Welcome</title><link href="https://blog.carlesjulia.com/benvinguda-en.html" rel="alternate"/><published>2026-01-09T16:57:00+01:00</published><updated>2026-01-09T16:57:00+01:00</updated><author><name>Carles Julià</name></author><id>tag:blog.carlesjulia.com,2026-01-09:/benvinguda-en.html</id><summary type="html">&lt;p&gt;I want to explain interesting things and I've decided a blog is the best format for it. Here you'll find deep, technical content, written in Catalan and in English, that I'll also replicate to other platforms.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Sometimes I feel like explaining things, interesting things, but I never find the time or know where to put them so they reach someone.&lt;/p&gt;
&lt;p&gt;After reading Hacker News regularly for months, the superiority of blogs for explaining the kind of things I want to explain is clear to me. So I'll set up this blog as a hub and replicate the articles to other more closed outlets.&lt;/p&gt;
&lt;p&gt;This is also my effort to ensure that high-quality, deep, and technical content exists in Catalan.&lt;/p&gt;
&lt;p&gt;I hope I don't get stuck in the implementation of the blog. We'll see.&lt;/p&gt;</content><category term="blog"/><category term="meta"/><category term="writing"/><category term="devto"/></entry></feed>