<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator>
  <link href="https://mariomelo.com/it/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://mariomelo.com/it/" rel="alternate" type="text/html" />
  <updated>2026-04-29T14:53:41+00:00</updated>
  <id>https://mariomelo.com/it/feed.xml</id>
  <title type="html">Mario Melo</title>
  <subtitle>Software Developer &amp; Scrum Trainer</subtitle>

  
  
  <entry xml:lang="it">
    <title type="html">Macchina vs Apprendimento</title>
    <link href="https://mariomelo.com/it/macchina-vs-apprendimento" rel="alternate" type="text/html" title="Macchina vs Apprendimento" />
    <published>2026-04-27T00:00:00+00:00</published>
    <updated>2026-04-27T00:00:00+00:00</updated>
    <id>https://mariomelo.com/macchina-vs-apprendimento</id>
    <content type="html" xml:base="https://mariomelo.com/macchina-vs-apprendimento">
      <![CDATA[<p>Qualche anno fa ho avuto un’interessante conversazione con un buon amico sul… senso della vita. Sì, cliché, lo so. Alla fine siamo arrivati alla conclusione che è un concetto molto personale, e sono uscito da quella conversazione ruminando qual era la mia definizione personale di significato.</p>

<p>Ho notato che ogni giorno in cui imparavo qualcosa di nuovo era un buon giorno per me. Qualsiasi giorno in cui mi sentivo migliorato in qualcosa aveva un significato speciale per me: imparare a suonare una nuova canzone, imparare una nuova apertura agli scacchi, sperimentare con la fotografia, ecc. In quel momento ho sentito che imparare e condividere ciò che avevo imparato con gli altri era qualcosa di significativo, e forse il senso della mia vita.</p>

<p>Sapete chi è d’accordo con me? <del>Neil deGrasse Tyson</del> un bambino casuale di 6 anni. 10 anni fa quel bambino chiese a Neil del senso della vita, e se quel bambino ha seguito il consiglio ricevuto scommetto che oggi è un sedicenne molto intelligente.</p>

<p><iframe src="https://www.youtube.com/embed/q_za_b6haXQ" loading="lazy" frameborder="0" allowfullscreen=""></iframe></p>

<h2 id="imparare-o-non-imparare-questo-è-il-dilemma">Imparare o non imparare, questo è il dilemma</h2>

<p>Sapete chi altro ama imparare? La Macchina.</p>

<p>Il Machine Learning non è poi così un concetto nuovo. Ricordo di averlo studiato all’università e persino di aver seguito un corso di Andrew Ng intorno al 2013, quando cercavo un modo per introdurre un algoritmo di classificazione in un prodotto che la mia azienda stava creando.</p>

<p>Ma non avevamo mai abbastanza dati <del>rubati</del> o disponibilità computazionale per fare qualcosa come gli LLM che abbiamo oggi, quindi i modelli che creavamo allora erano specifici di dominio e non avrebbero mai potuto fare ciò che gli LLM fanno oggi. Abbiamo imparato molto esplorando i concetti, e anche se i risultati non erano sorprendenti, ci rendeva felici come nerd.</p>

<p>Ciò che mi disturba dello scenario attuale è che l’apprendimento sta perdendo significato per alcune persone perché non vedono motivo di trascorrere il loro tempo ad imparare un mestiere solo per essere superati da un LLM in un paio di secondi.</p>

<p>Ad esempio: mi piace disegnare tutte le immagini che uso in questo blog. Sì, ci vuole tempo. Ma come ho imparato dal mio psicanalista dopo circa 5 anni di terapia: <strong>Non devi essere produttivo in ogni momento, Mario!</strong></p>

<p><em>Perché dovresti scrivere codice se l’LLM può scriverlo 1000 volte più velocemente?</em></p>

<p>Beh… Perché un <a href="https://www.youtube.com/watch?v=RVGkyWPUz1k">Drauzio Varela di 79 anni dovrebbe correre una maratona</a>? Ha impiegato quasi 5 ore per coprire quella distanza! Se avesse preso un taxi avrebbe raggiunto la destinazione in 30 minuti! È riuscito a farlo perché si è allenato duramente dai 50 anni in poi, e durante quel percorso i suoi muscoli, il suo cuore e il suo cervello hanno imparato a sopportare uno sforzo così estenuante.</p>

<p>Il mio punto è: c’è valore nel percorso, e imparare è sempre un percorso.</p>

<h2 id="creare-vs-reagire">Creare vs Reagire</h2>

<p>Durante il Regional Scrum Gathering South Africa, <a href="https://www.linkedin.com/in/chris-garvey-a988203b/">Chris Garvey</a> ha fatto un gioco di parole divertente con le parole <strong>CREATING</strong> e <strong>REACTING</strong>, che si adattava perfettamente al tema di questo post. Ha usato le stesse lettere per creare due parole diverse, e queste parole rappresentano due modi molto diversi di lavorare con gli LLM. Dopotutto, quanto puoi imparare quando stai solo reagendo allo tsunami di contenuti generati dagli LLM oggi? Puoi usare gli LLM per sviluppare davvero un mestiere e imparare mentre vai avanti?</p>

<p>Fondamentalmente, vedo due approcci diversi quando si lavora con un LLM:</p>

<p>1- <em>Puoi scrivere un testo per me?</em> Veloce. Potenzialmente nessun apprendimento coinvolto.</p>

<p>2- <em>Ehi, ho scritto questo. Puoi darmi un feedback?</em> Lento. Potenzialmente qualche apprendimento coinvolto.</p>

<p>Uso il secondo. Scrivo i miei post, e questo mi dà una leva incredibile nell’usare un LLM per fornire feedback su ciò che ho scritto. Prima di tutto: se l’LLM fornisce un feedback che non ha senso, lo ignoro. O lo metto in discussione.</p>

<p>Oltre a ciò, ho un progetto Claude con tutti i miei post e un file <code class="language-plaintext highlighter-rouge">values.txt</code> dove dichiaro la mia missione personale (lo stesso contenuto che puoi leggere sulla mia <a href="https://mariomelo.com/it/about">Pagina About</a>). Ogni volta che scrivo un nuovo post, chiedo di:</p>

<ul>
  <li>Tenermi responsabile dei miei valori</li>
  <li>Trovare connessioni significative tra il post attuale e i post precedenti che ho scritto</li>
  <li>Trovare errori di battitura e aiutarmi a migliorare il mio vocabolario in inglese</li>
  <li>Controllare le persone che ho menzionato e suggerire persone diverse per poter rompere la mia bolla e fare la mia parte per rendere il mondo IT più eterogeneo.</li>
</ul>

<p>Non riesco a dirti quanto ho imparato facendo questo. Ho trovato molte persone al di fuori della camera d’eco dell’IA che è LinkedIn, e ho ricevuto una raccomandazione di un libro che ha cambiato il modo in cui mi sento e mi rapporto agli LLM in generale: “<strong>The Empire of AI</strong>” di <a href="https://www.linkedin.com/in/karendhao/">Karen Hao.</a> È pesante, e anche se conoscevo alcune delle problematiche dietro l’intero ecosistema AI, il libro ha fatto luce su altri impatti di cui ero precedentemente ignaro. Nei suoi capitoli finali ha anche mostrato come gli LLM e gli SLM possono essere creati e usati in modo più consapevole e produrre benefici reali per l’umanità nel suo insieme.</p>

<p>Non perché i post finali siano scritti meglio (non posso nemmeno dire se lo sono), ma perché il <strong>percorso</strong> della scrittura ha iniziato a farmi imparare di più. E la stessa idea può essere applicata alla programmazione, al disegno o a qualsiasi cosa tu trovi piacere nel fare, purché tu continui a <strong>creare</strong> invece di semplicemente <strong>reagire</strong> a ciò che l’LLM ha creato per te.</p>

<p>Penso ancora che imparare dia significato alla mia vita, e cerco di farlo il più possibile. È più difficile ora, con tutto il rumore dell’IA intorno a noi, eppure… non solo è ancora possibile imparare, ma possiamo scegliere consapevolmente di farlo quando inevitabilmente interagiamo con gli LLM nelle nostre vite quotidiane. <strong>Creare</strong> è ancora una scelta che possiamo fare, e <strong>imparare</strong> è il risultato che potremmo ottenerne.</p>

<p>La maggior parte delle persone (me compreso) sta imparando a gestire l’AI in modi produttivi. Ma nota che questa è una lezione che viene con una dipendenza: togli l’LLM, e non hai un’abilità preziosa. E indovina un po’? Gli LLM non sono gratuiti. Puoi usarli per imparare a lavorare senza di loro, per rompere la tua bolla.</p>

<p>Questo è ciò che sto cercando di fare: esplorazione. Imparare per il gusto di imparare. Sto cercando di creare di più e reagire di meno.</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Building" />
    
    <category term="Learning" />
    
    <summary type="html">Qualche anno fa ho avuto un&apos;interessante conversazione con un buon amico sul... senso della vita. Sì, cliché, lo so.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Perché ho lasciato Substack e quali sono le alternative?</title>
    <link href="https://mariomelo.com/it/perche-ho-lasciato-substack" rel="alternate" type="text/html" title="Perché ho lasciato Substack e quali sono le alternative?" />
    <published>2026-02-13T00:00:00+00:00</published>
    <updated>2026-02-13T00:00:00+00:00</updated>
    <id>https://mariomelo.com/perche-ho-lasciato-substack</id>
    <content type="html" xml:base="https://mariomelo.com/perche-ho-lasciato-substack">
      <![CDATA[<p>L’anno scorso ho cercato di impegnarmi a scrivere di più, e sono andato abbastanza bene fino a metà anno. Ho scelto Substack come piattaforma e mi è piaciuta l’idea di come collegasse chi scrive a chi legge i testi.</p>

<p>Ma poi è arrivata l’<a href="https://it.wikipedia.org/wiki/Enshittification"><em>enshittification</em></a>.</p>

<h2 id="metriche-sempre-loro">Metriche, sempre loro</h2>

<p>Substack è una piattaforma dove alcuni autori rilasciano i loro testi gratuitamente, mentre altri fanno pagare un certo importo per testi più importanti. Quindi, cosa diventa rilevante per chi scrive?</p>

<ul>
  <li>Numero di visualizzazioni</li>
  <li>Numero di menzioni</li>
  <li>Numero di iscritti</li>
  <li>Numero di iscritti paganti</li>
</ul>

<p>E fin qui tutto bene, tutto normale. C’è molto contenuto buono là che vale il denaro richiesto, e molte persone abbastanza competenti da riuscire a vivere di questo modello.</p>

<p>Il problema non sono <del>tutti</del> gli autori, ma ciò che la piattaforma fa per cercare di rendere queste metriche abbastanza attraenti da mantenere gli autori lì e attirare nuovi scrittori. Col tempo, Substack ha aggiunto:</p>

<ul>
  <li>Una specie di Twitter</li>
  <li>Popup che chiedono continuamente al lettore di iscriversi alla newsletter</li>
  <li>Opzione predefinita per iscriversi a <strong>TUTTI</strong> i substacks che un autore consiglia quando ci si iscrive alla sua newsletter</li>
</ul>

<p>Leggere un post su Substack è diventato un esercizio di pazienza e ho iniziato a sentirmi male a far passare le persone che dedicano un po’ del loro tempo per leggere ciò che scrivo attraverso tutto questo. Così la mia voglia di scrivere lì è andata diminuendo.</p>

<h2 id="dove-ho-tracciato-la-linea">Dove ho tracciato la linea</h2>

<p>Come se tutto questo non bastasse, le metriche hanno fatto sì che newsletter completamente spregevoli diventassero interessanti per il business perché generano entrate per l’azienda.</p>

<p>E questo include <a href="https://arstechnica.com/tech-policy/2025/07/substacks-nazi-problem-wont-go-away-after-push-notification-apology">newsletter naziste</a>.</p>

<p>Lì lasciare Substack ha smesso di essere un’opzione ed è diventata una necessità per me.</p>

<h2 id="dove-sono-andato-e-dove-puoi-andare-tu">Dove sono andato e dove puoi andare tu?</h2>

<p>Se inviare newsletter è super importante per te, <a href="https://ghost.org">Ghost</a> è l’opzione migliore. È open-source, facile da configurare ed è piuttosto leggero. Molte persone hanno fatto questa transizione, e in termini di funzionalità è quello che più assomiglia a Substack.</p>

<p>Se vuoi solo scrivere e le immagini non sono molto importanti per te, puoi usare <a href="https://writefreely.org">WriteFreely</a>. Poiché è stato realizzato in Go, è abbastanza leggero (nel test che ho fatto sul mio server consumava solo circa 50MB di memoria RAM!). L’esperienza di scrittura è piacevole e va dritta al punto. Curiosamente, WriteFreely è stato sviluppato come alternativa a Medium perché il suo fondatore si è stancato dell’enshittification di Medium.</p>

<p>Se vuoi qualcosa di gratuito, con un alto livello di personalizzazione e avendo la totale proprietà dei tuoi contenuti, la cosa migliore da fare è usare un generatore di siti statici come <a href="https://jekyllrb.com">Jekyll</a>, <a href="https://gohugo.io">Hugo</a> o <a href="https://astro.build">Astro</a>. Questo blog è stato fatto con Jekyll, che è realizzato in Ruby ed è stato creato più tempo fa, e ho finito per seguire questo percorso perché avevo già acquisito un tema che si adattava a ciò che avevo immaginato per il mio sito. Hugo è un’opzione più moderna, e probabilmente la scelta migliore qui, specialmente se pensi di scrivere in più di una lingua.</p>

<p>Un altro vantaggio dei generatori di siti statici è che puoi ospitarli gratuitamente su GitHub Pages, per esempio. Non hai nemmeno bisogno di pagare un server.</p>

<p>Se vuoi qualcosa da leggere, suggerisco fortemente di usare un RSS Reader, che non è altro che un’applicazione dove aggiungi i blog che ti piace leggere e ti avvisa di nuovi post senza ingombrare la tua casella email. L’RSS è anche una forma di lettura più <strong>consapevole</strong>: devi scegliere ciò che vuoi leggere e seguire, e nessun algoritmo cerca di spingerti nient’altro.</p>

<p>Attualmente, i software/servizi che uso sono:</p>

<ul>
  <li><a href="https://www.scaleway.com/en/">Scaleway</a>, per ospitare il mio sito.</li>
  <li><a href="https://typora.io">Typora</a>, per scrivere i post.</li>
  <li><a href="https://plausible.io">Plausible</a>, self-hosted. Per raccogliere metriche rispettando la tua privacy (niente Google Analytics qui).</li>
  <li><a href="https://procreate.com">Procreate</a>, per creare le immagini che uso nel blog</li>
  <li><a href="https://vivaldi.com">Vivaldi</a>, browser che ha anche un lettore RSS</li>
</ul>

<h2 id="ma-e-la-newsletter">Ma… e la newsletter?</h2>

<p>Beh, per ora non esiste, ma potrebbe essere che in futuro ne crei una. Ringrazio di cuore tutti coloro che si sono iscritti alla newsletter su Substack, e spero che continuerete a seguire ciò che scrivo qui.</p>

]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Tools" />
    
    <category term="Degoogle" />
    
    <summary type="html">È da un po&apos; che non scrivo, e c&apos;è un motivo: mi sentivo scoraggiato a continuare a pubblicare su Substack.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Il pacchetto di espansione di Scrum è prezioso?</title>
    <link href="https://mariomelo.com/it/il-pacchetto-di-espansione-di-scrum-e-prezioso" rel="alternate" type="text/html" title="Il pacchetto di espansione di Scrum è prezioso?" />
    <published>2025-07-28T17:00:36+00:00</published>
    <updated>2025-07-28T17:00:36+00:00</updated>
    <id>https://mariomelo.com/il-pacchetto-di-espansione-di-scrum-e-prezioso</id>
    <content type="html" xml:base="https://mariomelo.com/il-pacchetto-di-espansione-di-scrum-e-prezioso">
      <![CDATA[<p>Il mese scorso Jeff Sutherland e compagnia hanno pubblicato un pacchetto di espansione per il Framework Scrum (lo chiamerò SGEP per brevità). E a dire il vero, ha un po’ floppato. Abbiamo avuto circa mezza settimana di post su LinkedIn (per lo più recensioni negative) ed era finito.</p>

<p>Non volevo scrivere nulla di superficiale a riguardo, quindi ho provato a leggerlo attentamente, con basse aspettative, e ho fatto alcune note lungo il percorso.</p>

<h1 id="non-è-perfetto">Non è perfetto…</h1>

<p>Scrum è un framework e quindi è incompleto per natura. Ci dà il compito di completarlo con pratiche, tecniche e strumenti, e questa è la parte migliore del Framework Scrum secondo me.</p>

<p>Quando ho sentito per la prima volta del pacchetto di espansione, temevo che avrebbe riempito le lacune e reso l’intera cosa più prescrittiva, e penso che la maggior parte delle persone condividesse lo stesso sentimento. Gli autori sono riusciti a evitare abbastanza bene quel problema, tuttavia, c’erano altri problemi che ho trovato.</p>

<h2 id="non-è-un-pacchetto-di-espansione">Non è un pacchetto di espansione</h2>

<p>Invece di aggiungere solo nuove informazioni, gli autori hanno anche cambiato alcuni concetti originali (es: tornando all’uso della parola <strong>roles</strong> invece di <strong>accountabilities</strong>).</p>

<p>Dice anche che il Product Backlog Refinement potrebbe essere un evento, cosa che non apprezzo davvero dato che nella mia esperienza questo tipo di linguaggio favorisce un comportamento meccanico.</p>

<p>Non è un singolo documento. Come gli autori affermano all’inizio:</p>

<p><em>“Questo documento è una raccolta di lavori indipendenti. Ogni sezione mantiene la sua licenza originale o stato di copyright, come indicato.”</em></p>

<p>Quindi la lettura è una strada piena di buche, e a volte ripetitiva.</p>

<p>A parte questo, direi che è praticamente innocuo.</p>

<h1 id="in-realtà-potrebbe-aiutare-chi-ha-difficoltà-con-scrum">In realtà potrebbe aiutare chi ha difficoltà con Scrum</h1>

<p>Insegno sviluppo software e Scrum dal 2013, e oso dire che una buona parte delle domande che le persone mi fanno durante le sessioni di formazione possono essere risposte dal pacchetto di espansione.</p>

<p>E la maggior parte delle volte lo SGEP è riuscito a farlo espandendo il <strong>PERCHÉ</strong> delle cose, con un enorme focus sull’<strong>empirismo</strong>.</p>

<h2 id="più-parole-rendono-più-facile-capire">Più parole rendono più facile capire</h2>

<p>Lascia che ti dia un esempio concreto: la <strong>Sprint Review</strong>. Lo Scrum Guide originale è un po’ criptico quando dice:</p>

<blockquote>
  <p>Lo scopo della Sprint Review è ispezionare il risultato dello Sprint e determinare adattamenti futuri</p>

  <p><cite> Scrum Guide, 2020</cite></p>
</blockquote>

<p>Dice anche che <em>Il Product Backlog <strong>può anche essere aggiustato</strong> per soddisfare nuove opportunità.</em></p>

<p>Nelle mie lezioni spesso mi prendo del tempo per discutere questo: dobbiamo determinare adattamenti futuri, il che significa cambiare il Product Backlog in qualche modo. Quindi, una Sprint Review che non cambia il Product Backlog è qualcosa che dovrebbe causare qualche riflessione. Inoltre, se la Sprint Review è un evento obbligatorio, significa che lo Scrum Team non è passivamente aperto a cambiare il Product Backlog: <strong>stanno attivamente cercando questi cambiamenti.</strong></p>

<p>Lo SGEP usa più parole per descrivere questo:</p>

<p>“<em>Il Product Backlog (il cosa) <strong>VIENE</strong> adattato</em>” - Non “<em>può anche essere aggiustato</em>”, ma un forte “<strong>VIENE</strong>.”</p>

<p>Questo è il tipo di differenza che conta per me. Rafforzando che Scrum riguarda l’apprendimento attraverso la sperimentazione così possiamo usare informazioni fresche per sviluppare cose.</p>

<h2 id="focus-sullempirismo">Focus sull’Empirismo</h2>

<p>Il problema principale che la maggior parte delle persone ha con Scrum, a volte senza nemmeno notarlo, è che usano il framework credendo che aumenterà la velocità di sviluppo. Questo spesso mette Product Owner e Developer in confronto invece che in collaborazione. Questo problema è così comune che l’ultimo aggiornamento dello Scrum Guide ha cambiato il termine “<em>Development Team</em>” in “<em>Developers</em>”, e la spiegazione del perché l’hanno fatto era:</p>

<blockquote>
  <p>L’obiettivo era eliminare il concetto di un team separato all’interno di un team che ha portato al comportamento “proxy” o “noi e loro” tra il PO e il Dev Team.</p>

  <p>Ora c’è solo uno Scrum Team focalizzato sullo stesso obiettivo, con tre diversi set di responsabilità: PO, SM e Developers.</p>

  <p><cite><a href="https://scrumguides.org/revisions.html">- Scrum Guide 2020 Revisions</a></cite></p>
</blockquote>

<p>Non fraintendermi: mi piace questo cambiamento. Ma per i principianti o anche per le persone che hanno usato il Framework Scrum in modo disfunzionale per molto tempo, questo non risolverà nessun problema. Voglio dire, nemmeno lo SGEP, ma almeno penso che abbia fatto un lavoro migliore nel provare a raggiungere questo.</p>

<p>Per esempio, lo SGEP:</p>

<ul>
  <li>
    <p>Afferma chiaramente che essere una feature-factory o una discovery factory non è desiderabile</p>
  </li>
  <li>
    <p>Stabilisce che il Product Owner deve <strong>comunicare efficacemente i risultati</strong></p>
  </li>
  <li>
    <p>Il Prodotto diventa un artefatto con metriche basate sui risultati</p>
  </li>
</ul>

<p>Lo SGEP crea anche la <strong>Definition of Outcome Done</strong>, e ho sentimenti contrastanti a riguardo. Da un lato aggiunge un altro pezzo al puzzle e rende il framework Scrum più prescrittivo, ma dall’altro potrebbe essere particolarmente importante per chi sta iniziando o ha difficoltà con Scrum.</p>

<p>Parlando di questo, lo SGEP fornisce anche alcuni preziosi insight per chi sta iniziando o ha difficoltà con il proprio lavoro come Scrum Master.</p>

<h2 id="fornisce-migliori-indicazioni-agli-scrum-master">Fornisce migliori indicazioni agli Scrum Master</h2>

<p>Lo Scrum Guide originale descrive lo Scrum Master in mezza pagina. E se hai una buona dose di esperienza con il framework, questo è più che sufficiente.</p>

<p>Lo SGEP tuttavia entra più nello specifico, ma senza limitare troppo il tuo lavoro. Afferma per esempio, che <strong>lo Sprint Backlog dovrebbe avere abbastanza lavoro per iniziare, es: inizia con uno o due Product Backlog Item verso lo Sprint Goal</strong>. E puoi leggere questa frase come: “non c’è Definition of Ready”.</p>

<p>Un altro esempio è il Product Backlog: mentre la guida originale afferma che lo Scrum Master deve <em><strong>trovare tecniche per una definizione efficace del Product Goal e gestione del Product Backlog</strong></em>, lo SGEP aggiunge alcune informazioni preziose sopra a questo, come: <em><strong>Un Product Backlog più piccolo spesso fornisce più Trasparenza</strong></em> o anche il suggerimento di usare un <em><strong>Outcome Criteria</strong></em> per i Product Backlog Item.</p>

<p>Ancora una volta, so che queste sono vecchie notizie per alcuni. Tuttavia rende ovvie alcune delle cose che le persone spesso faticano a imparare.</p>

<h2 id="quindi-è-prezioso">Quindi, è prezioso?</h2>

<p>Può esserlo. Ma non per tutti. Ma leggerlo è comunque un buon esercizio, quindi vai avanti. Il focus sull’empirismo è quello che me l’ha fatto piacere, ed è un <strong>pacchetto di espansione</strong>, il che significa… è opzionale comunque. Puoi anche prendere alcune delle idee e applicarle se non vuoi aggiungere tutto.</p>

<p>Quindi, se te la cavi bene con Scrum, non ne hai bisogno. Dopotutto, probabilmente stai già facendo la maggior parte delle cose descritte lì.</p>

<p>Se senti che lo Scrum Guide è criptico e ti lascia con la sensazione che dovrebbe elaborare un po’ di più su alcuni aspetti perché sei bloccato, allora lo Scrum Guide Expansion Pack potrebbe essere una buona cosa per te.</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Teamwork" />
    
    <category term="Scrum" />
    
    <summary type="html">Il mese scorso Jeff Sutherland e compagnia hanno pubblicato un pacchetto di espansione per il Framework Scrum (lo chiamerò SGEP per brevità).</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Le insidie dello sviluppo aumentato da IA, parte 2</title>
    <link href="https://mariomelo.com/it/le-insidie-dello-sviluppo-aumentato-da-ia-parte-2" rel="alternate" type="text/html" title="Le insidie dello sviluppo aumentato da IA, parte 2" />
    <published>2025-06-04T09:21:57+00:00</published>
    <updated>2025-06-04T09:21:57+00:00</updated>
    <id>https://mariomelo.com/le-insidie-dello-sviluppo-aumentato-da-ia-parte-2</id>
    <content type="html" xml:base="https://mariomelo.com/le-insidie-dello-sviluppo-aumentato-da-ia-parte-2">
      <![CDATA[<p><strong>AVVISO</strong>: Questo è il secondo post che ho scritto sul mio intervento al Global Scrum Gathering Munich, e anche se non penso che tu debba leggere entrambi i post in ordine, ti suggerisco fortemente di leggerli entrambi per avere la totalità delle idee che sto condividendo. Quindi, ecco il link al primo:</p>

<p>Ora, torniamo alle nostre insidie e parliamo anche di una “<em>guerra</em>” che va avanti da 40 anni: la <a href="https://en.wikipedia.org/wiki/Editor_war">Guerra degli Editor</a>. Potrebbe sembrare una guerra sciocca, o una semplice questione di preferenze, ma fidati: non è solo tribalismo geek, riguarda filosofie fondamentalmente diverse dell’interazione uomo-computer.</p>

<p>Sono un utente NeoVim. Questo significa che sono uno di quei geek che preferisce digitare codice nel terminale invece di usare qualcosa di più moderno come VSCode. Mentre uso NeoVim non uso mai il mouse o il touchpad: digito solo cose e uso un mucchio di combinazioni di tasti per navigare nel codice. Ma non sono solo! Il primo editor Vi è stato creato nel 1976 e da allora la sua popolarità è solo cresciuta tra i più geek degli sviluppatori software.</p>

<p>Perché? Beh, spieghiamolo mentre parliamo di una delle insidie che ho menzionato a Monaco:</p>

<h2 id="insidia-4-la-visione-a-tunnel-nella-codifica"><strong>Insidia 4: La Visione a Tunnel nella Codifica</strong></h2>

<p>Vi e i suoi fratelli (Vim, Neovim) sono diventati popolari perché permettevano agli sviluppatori di navigare nel codice più velocemente. Invece di muovere la mano verso il mouse, scorrere verso il basso, selezionare una parte del codice che vuoi cambiare e poi digitare il cambiamento, questi editor hanno proposto un’idea diversa: avrebbero avuto <strong>modalità</strong>. Mentre in modalità <strong>INSERT</strong>, tutto quello che digiti sulla tastiera apparirebbe sullo schermo, proprio come succede in qualsiasi altro editor. Ma in modalità <strong>NORMAL</strong>, ogni tasto sulla tastiera può essere usato per navigare nel codice.</p>

<p>Per esempio: se premi 3wce cambieresti istantaneamente il contenuto della terza parola in quella riga. (Qualcosa come: Vai alla <strong>3</strong>a <strong>W</strong>ord <strong>C</strong>hange fino al suo <strong>E</strong>nd).</p>

<p>Fondamentalmente crea un dialetto così puoi dire al tuo editor dove vuoi andare e cosa vuoi fare con il tuo codice senza dover usare mouse, menu, ecc. E accelerare come navighiamo nel codice è importante perché <strong>gli sviluppatori software passano più tempo a navigare e capire il codice che a scriverlo</strong>.</p>

<p>Un grafico che rappresenta i risultati di una ricerca su come gli sviluppatori passano il loro tempo</p>

<p>Quindi, perché ci stiamo concentrando sull’uso degli LLM per generare codice quando possiamo anche usarli per aiutarci a capire il codice? Voglio dire, sono ottimi programmatori, non lo nego. Ma nella mia esperienza possono fornire molto più valore spiegando il codice invece di crearlo.</p>

<p>Ecco un esempio pratico di come l’ho fatto: sto attualmente scrivendo un software per migliorare le attività pratiche che faccio nelle mie classi. E a un certo punto ho deciso di chiedere a Claude di spiegarmi la mia stessa architettura. Dato che Claude eccelle nell’output testuale ho pensato che sarebbe stato bello usare uno strumento come <a href="https://mermaid.js.org">Mermaid</a>, uno strumento che trasforma input testuali in diagrammi ordinati. Ho chiesto a Claude di spiegare la struttura usando <a href="https://www.markdown-cheatsheet.com">MarkDown</a> e <a href="https://mermaid.js.org">Mermaid</a>, e ho incollato il risultato in un editor di testo compatibile con entrambe le tecnologie chiamato <a href="https://typora.io/">Typora</a>. Ecco il risultato:</p>

<p><img src="../assets/images/posts/4fad149de25d.jpeg" alt="Image" /></p>

<p>Questa è un’ottima documentazione che può essere usata per spiegare sia agli sviluppatori del mio team che allo stesso LLM come funziona l’architettura! Specialmente perché il diagramma può essere letto dall’LLM come un semplice input testuale, minimizzando la quantità di token consumati in ogni interazione.</p>

<p>Il punto è che, non importa se hai scritto il codice manualmente o se un LLM ha scritto l’intera cosa per te, sarai comunque responsabile delle conseguenze. Quindi, capire cosa sta succedendo è fondamentalmente importante.</p>

<p>Ricorda: <strong>se qualcosa funziona e non sai come, quando smette di funzionare non saprai perché.</strong></p>

<h2 id="insidia-5-il-bias-del-volume"><strong>Insidia 5: Il Bias del Volume</strong></h2>

<p>Alcune persone si lamentano ancora della qualità del codice generato dagli LLM e sono fortemente in disaccordo con questa opinione. Nella mia esperienza, il codice generato è in realtà piuttosto buono.</p>

<p>Quello che mi disturba è la <strong>quantità</strong> di codice.</p>

<p>Specialmente perché non credo nel “vibe coding” (cioè: fidarsi del codice generato e non dargli nemmeno un’occhiata). Devo revisionare il codice e assicurarmi che faccia quello che dovrebbe fare perché… sono un adulto responsabile? Quindi, quando l’LLM cambia 8 file e aggiunge 200 righe di codice per ogni prompt che faccio, il mio lavoro diventa estremamente doloroso e beh, noioso. Ho provato molteplici approcci e prompt diversi per ridurre questo problema ma devo ancora trovare una soluzione.</p>

<p>Per essere onesto Claude 4.0 ha presentato un grande miglioramento quando si tratta di questa particolare insidia, e penso che avremo una soluzione definitiva a questo in un futuro prossimo. Ma non ci siamo ancora.</p>

<p><img src="../assets/images/posts/eaa796ed5b4d.png" alt="Image" /><em>Un prompt, MOLTI cambiamenti</em></p>

<p>Quello che sento è che invece di aiutarci a camminare più velocemente gli LLM ci stanno aiutando a fare passi più grandi. Entrambi gli approcci possono aiutarci a coprire una distanza maggiore nella stessa quantità di tempo, ma il secondo comporta anche un alto costo quando stai camminando nella direzione sbagliata. Anche il modello di business contribuisce a questo: quando uso Cursor per esempio, ho token/interazioni limitati, il che mi incentiva a trarre il massimo da ogni prompt.</p>

<h2 id="conclusione"><strong>Conclusione</strong></h2>

<p>Scrivere sul lavorare con gli LLM è una cosa strana. Credo sinceramente in tutto quello che ho scritto in questo post <strong>oggi</strong>. Ma le cose stanno cambiando velocemente, e questo post potrebbe invecchiare come latte o vino a seconda dei prossimi sviluppi. Se apprezzi imparare di più su questo argomento, ti suggerisco fortemente di fare due cose: <strong>usalo</strong> per creare qualcosa invece di solo leggerne su LinkedIn (ancora meglio: allontanati del tutto da LinkedIn), e prova a leggere opinioni diverse sull’argomento. Il libro di Karen Hao “<strong>The Empire of AI</strong>” potrebbe essere un buon inizio.</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Coding" />
    
    <category term="AI" />
    
    <summary type="html">AVVISO: Questo è il secondo post che ho scritto sul mio intervento al Global Scrum Gathering Munich, e anche se non penso che tu debba leggere entrambi i post in ordine, ti suggerisco fortemente di leggerli entrambi per avere la totalità delle idee che sto condividendo.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Le insidie dello sviluppo aumentato da IA, parte 1</title>
    <link href="https://mariomelo.com/it/le-insidie-dello-sviluppo-aumentato-da-ia" rel="alternate" type="text/html" title="Le insidie dello sviluppo aumentato da IA, parte 1" />
    <published>2025-05-07T17:00:08+00:00</published>
    <updated>2025-05-07T17:00:08+00:00</updated>
    <id>https://mariomelo.com/le-insidie-dello-sviluppo-aumentato-da-ia</id>
    <content type="html" xml:base="https://mariomelo.com/le-insidie-dello-sviluppo-aumentato-da-ia">
      <![CDATA[<p>Il mio intervento al Global Scrum Gathering Munich è stato veloce, e ho detto lì che avrei scritto sull’argomento per approfondire questa discussione, quindi eccomi qui. Ho aggiunto una “Parte 1” al titolo perché ora vorrei esplorarne tre: <strong>Fissazione sulla Scrittura</strong>, <strong>Approccio Monolitico</strong> e <strong>Atrofia nell’Apprendere</strong>.</p>

<p>La cosa divertente di questa conferenza è che sono andato a due interventi successivi che si collegavano direttamente a quello che ho presentato: Nigel Baker e Paul Goddard hanno parlato di Pair Programming (e sono ancora deluso che non abbiano menzionato Penn &amp; Teller nei loro esempi di pairing) e il keynote finale di Henrik Kniberg che ha parlato di IA agentica nel software e nello sviluppo software agile. Quindi, collegherò anche insight dalle loro presentazioni per arricchire la nostra conversazione. Per farlo, cambierò l’ordine in cui ho inizialmente presentato le insidie.</p>

<h2 id="insidia-1---fissazione-sulla-scrittura">Insidia 1 - Fissazione sulla Scrittura</h2>

<p>La mia prima lamentela su come la maggior parte delle persone ha usato l’IA riguardava come continuiamo a scrivere e usare il testo come l’<strong>unico</strong> modo per parlare con i nostri LLM. Kniberg ha usato due forme diverse di comunicazione durante la sua presentazione: <strong>voce</strong> e un disegno su <strong>tovagliolo</strong>. Ed è proprio di questo che stavo parlando: il linguaggio ha limitazioni, e queste sono vecchie notizie. Nietzsche ha notoriamente detto che <em><strong>Ogni parola è un pregiudizio</strong></em> e William James ha sfidato la nostra capacità di comprendere il significato dietro le parole con il suo aneddoto dello scoiattolo che gira intorno all’albero.</p>

<p>Se vuoi provare come potrebbe funzionare, puoi integrare Aider con ChatGPT per usare la tua voce per programmare (e forse questo potrebbe essere il mio prossimo post). Ma se non vuoi spingerti così lontano, <strong>disegna</strong>, fai screenshot da usare come esempi, fondamentalmente: <strong>sperimenta</strong>.</p>

<p>Un diagramma che mostra come i moduli della mia applicazione dovrebbero interagire tra loro</p>

<p>Ora, il diagramma ci porta immediatamente alla prossima insidia…</p>

<h2 id="insidia-2---atrofia-nellapprendere">Insidia 2 - Atrofia nell’Apprendere</h2>

<p><em>Se un’IA può programmare, perché dovrei imparare a programmare?</em>, beh… questa è una domanda interessante. Nel mio intervento ho menzionato che il codice generato dagli attuali LLM (come Sonnet 3.7) è in realtà piuttosto buono, e spesso migliore di quello che scriverebbe un umano. E gli LLM stanno migliorando più velocemente di noi in questo momento, quindi…</p>

<p>Quindi dobbiamo ancora imparare. Guarda il diagramma nella sezione precedente: parla di struttura software e come organizzare il codice. Se non sai programmare, non puoi creare diagrammi come questi e <strong>le tue opzioni saranno limitate</strong>. Queste limitazioni possono portarti a vicoli ciechi e problemi che non sei in grado di risolvere, e se anche il tuo collega IA non è in grado di risolverli allora…</p>

<p><img src="../assets/images/posts/b22f19f41da8.jpeg" alt="Image" /><em>Il lato oscuro del vibe</em></p>

<p>Come hanno detto Nigel Baker e Paul Goddard nel loro intervento: <strong>il pairing è un ottimo modo per imparare</strong>. Probabilmente imparerai che persone diverse usano gli LLM in modi diversi, e dovrai capire quando usare ogni approccio. Per esempio: al giorno d’oggi puoi letteralmente programmare un agente che controllerebbe tutto quello che il tuo partner ha postato su internet e comprerebbe automaticamente regali per loro in date speciali. E probabilmente saranno buoni regali!</p>

<p>Ma è una buona idea? Beh, non credo. Simon Wardley propone una domanda interessante per risolvere questo dilemma, e in ogni caso, se non hai ancora visto il suo intervento <strong>per favore fallo</strong>:</p>

<blockquote>
  <p><em>Quanto valorizzi un umano coinvolto in quella decisione?</em></p>
</blockquote>

<p>E a volte, quando sviluppi software, conta. Ma ancora una volta: le tue capacità decisionali saranno limitate dalla tua conoscenza. Quindi, continua a imparare (e prova a fare pairing con qualcun altro così puoi imparare di più e più velocemente).</p>

<h2 id="insidia-3---lapproccio-monolitico">Insidia 3 - L’Approccio Monolitico</h2>

<p>Ho fatto una battuta durante la mia presentazione e ho detto che <em>Vibe Coding</em> dovrebbe essere rinominato <em>Conversational Reactive Assisted Programming</em>, o <strong>C.R.A.P.</strong>. Tutti hanno riso, e momenti dopo stavamo tutti guardando Henrik Kniberg fare un’impressionante dimostrazione usando Cursor.</p>

<p>Quindi, penso che dovrò spiegarmi. :)</p>

<p>Il termine Vibe Coding è stato coniato da Andrej Karpathy, e ha detto che la tecnica è “<em>non troppo male per progetti usa e getta del weekend</em>”. Una parte chiave della definizione di vibe coding è che l’utente accetta il codice senza piena comprensione, e il ricercatore di IA Simon Willison ha persino detto che “<em><strong>Se un LLM ha scritto ogni riga del tuo codice, ma l’hai revisionato, testato e capito tutto, questo non è vibe coding secondo me—questo è usare un LLM come assistente di digitazione</strong></em>.”</p>

<p>Quindi, per quella definizione di Vibe Coding, mantengo la mia battuta. Almeno per ora. Il concetto di non preoccuparsi del codice generato da un LLM può essere una buona idea, ma solo se sappiamo <strong>quando usarlo</strong>, e per ora non dovrebbe essere il 100% del tempo a meno che tu non stia costruendo un prototipo.</p>

<p>Il punto è che, se non sai programmare, il Vibe Coding sarà la tua <strong>unica opzione</strong> quando usi un LLM per sviluppare software. E non è veramente <strong>programmare</strong>, perché è non-deterministico: lo stesso prompt potrebbe generare risultati diversi. Preferisco il termine che usa Simon Wardley: <strong>Vibe Wrangling</strong>.</p>

<p><img src="../assets/images/posts/0f708cd44fe0.jpeg" alt="Image" /><em>Una slide del mio intervento: Se hai più conoscenza tecnica, avrai più opzioni</em></p>

<p>Forse in futuro avere il <strong>Vibe Coding</strong> come unica opzione non sarà un problema, ma non ci siamo ancora. Potrebbe succedere l’anno prossimo, nel 2035, o potrebbe non succedere mai. Ma qualunque sia la risposta, imparare a programmare è ancora rilevante perché <strong>espanderà le tue opzioni</strong>. E questa è la mia principale (e forse unica) critica sull’ottima sessione keynote di Kniberg: non penso che il Vibe Coding sia un’<strong>evoluzione</strong> del copiare e incollare codice generato da un LLM, per esempio. Vedo tutti questi approcci essere usati in contesti diversi, e la decisione si ridurrà sempre a una versione leggermente modificata della domanda proposta da Simon Wardley:</p>

<blockquote>
  <p>Quanto consapevole devo essere sul modo in cui questo verrà implementato?</p>
</blockquote>

<p>Per me la risposta è ancora “<em><strong>abbastanza spesso</strong></em>”. Gli LLM sono biased, non-deterministici e replicano tutti i problemi che erano presenti nei loro dati di training. Faranno errori, e alcuni di questi errori potrebbero danneggiare le persone, specialmente in gruppi che sono sotto-rappresentati nei dati usati per addestrare i modelli (puoi e dovresti controllare il lavoro della Dott.ssa <strong>Timnit Gebru</strong>). Quando accettiamo codice generato dall’IA senza piena comprensione, stiamo ereditando non solo la soluzione ma anche i pregiudizi concettuali incorporati in essa.</p>

<p>Quindi, rispondere a quella domanda è qualcosa che inizieremo a fare sempre di più. E tornando alla sessione di Nigel Baker e Paul Goddard: non devi rispondere a quella domanda da solo.</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Coding" />
    
    <category term="AI" />
    
    <summary type="html">Il mio intervento al Global Scrum Gathering Munich è stato veloce, e ho detto lì che avrei scritto sull&apos;argomento per approfondire questa discussione, quindi eccomi qui.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Cosa ho scelto di non costruire: Decisioni che ho preso mentre creavo la mia piattaforma di formazione usando Elixir</title>
    <link href="https://mariomelo.com/it/cosa-ho-scelto-di-non-costruire" rel="alternate" type="text/html" title="Cosa ho scelto di non costruire: Decisioni che ho preso mentre creavo la mia piattaforma di formazione usando Elixir" />
    <published>2025-03-31T17:11:56+00:00</published>
    <updated>2025-03-31T17:11:56+00:00</updated>
    <id>https://mariomelo.com/cosa-ho-scelto-di-non-costruire</id>
    <content type="html" xml:base="https://mariomelo.com/cosa-ho-scelto-di-non-costruire">
      <![CDATA[<p>Come qualsiasi sviluppatore là fuori, adoro iniziare progetti personali. Ma per me hanno un peso diverso: sviluppare un progetto personale mi aiuta a rimanere connesso alla mia <a href="/it/about">missione personale.</a></p>

<p>Insegno e faccio coaching costantemente con le persone su come sviluppare prodotti migliori, che sia in corsi CSM/CSD, come consulente o come mentore. Ho la mia quota di storie da condividere durante questi eventi, ma sai com’è… mentre queste storie sono nuove ed eccitanti per gli studenti, non posso dire lo stesso dopo averle ripetute una dozzina di volte.</p>

<p>E inoltre… ho bisogno di una scusa per toccare il codice. :)</p>

<h2 id="il-prodotto">Il Prodotto</h2>

<p>Come formatore, cerco di creare simulazioni così i miei studenti possono imparare dalla propria esperienza la maggior parte del tempo. Ecco perché nel 2019 ho creato il gioco di carte <a href="https://scrumchkin.com">Scrumchkin</a>, per esempio. Ma dalla pandemia, la maggior parte delle mie sessioni di formazione sono state online, il che rende molto difficile replicare lo stesso ambiente dinamico che avevo con le vere carte Scrumchkin in una formazione in presenza.</p>

<p>Quindi, ho deciso che il mio prodotto avrebbe provato a risolvere quel problema:</p>

<blockquote>
  <p><strong>Gli studenti dovrebbero essere in grado di imparare argomenti complessi attraverso esperienze dinamiche e simulazioni.</strong></p>
</blockquote>

<p>Era un fit perfetto dopotutto: ho corsi periodici dove posso portare il prodotto a un test sul campo e raccogliere feedback e ho accesso a una comunità di formatori che potrebbero essere interessati a provare il prodotto e fornire un tipo diverso di feedback.</p>

<p>Dato che tutto ciò di cui avevo bisogno era una scusa per iniziare a scrivere codice, ero soddisfatto di questo.</p>

<p><strong>Decisione:</strong> Scegli una libreria di componenti UI dall’inizio e attieniti ad essa. Puoi cambiare tutto dopo, <strong>se necessario</strong>.</p>

<h2 id="decisioni-sugli-strumenti">Decisioni sugli Strumenti</h2>

<p>Ho deciso di evitare l’uso di un database all’inizio, finché non capisco che tipo di dati voglio memorizzare e come voglio memorizzarli.</p>

<p>Elixir (il mio linguaggio preferito) ha qualcosa che fa il lavoro abbastanza bene: i GenServer. Posso usarli per memorizzare temporaneamente i dati senza dover ricorrere a un database. L’informazione sarà lì finché non accade una di tre cose:</p>

<ul>
  <li>
    <p>Riavvio il server</p>
  </li>
  <li>
    <p>Si verifica un errore e il GenServer viene riavviato</p>
  </li>
  <li>
    <p>Termino il GenServer</p>
  </li>
</ul>

<p>Questo approccio mi ha permesso di muovermi più velocemente e dimenticare le migrazioni, per esempio.</p>

<p><strong>Ma, ma… Mario! Non è rischioso?</strong></p>

<p>Il rischio dipende dal contesto. Le mie sessioni di formazione sono brevi, e nel peggiore dei casi perderei circa 15 minuti di tempo e gli studenti dovrebbero ricominciare un esercizio se un GenServer fallisce durante la formazione.</p>

<p>Quindi, è un rischio che sono <strong>consapevolmente</strong> disposto a correre.</p>

<h2 id="parlando-di-fallimenti">Parlando di fallimenti…</h2>

<p>Non posso dire che sto facendo puro TDD, ma sto scrivendo molti test. Specialmente perché sto usando Claude per generare alcuni pezzi di codice per me (scriverò dopo su <strong>quali</strong> pezzi di codice Claude sta scrivendo per me).</p>

<p>È molto difficile usare il TDD con un LLM. Questi modelli generano enormi pezzi di codice in una volta. Nel frattempo, il TDD è tutto su quel ritmo incrementale: un test, fallo passare, e poi affronta il prossimo. Quello che sto facendo è scrivere test per i miei GenServer, chiedere a Claude di proporre test extra che potrei aver dimenticato e poi chiedere a Claude di implementare le funzioni che farebbero passare i test.</p>

<p>Ho imparato che i test ora sono <strong>molto più importanti di quanto fossero prima dell’IA</strong>. Quando un LLM fa dozzine di modifiche al tuo codice, è impossibile per te garantire che il tuo codice faccia ancora quello che dovrebbe fare. E Claude ha rotto i miei test più volte di quante possa contare, specialmente quando ha provato a modificare molti file contemporaneamente.</p>

<p><strong>Decisione:</strong> Usare l’IA come copilota aumenta la necessità di test automatizzati. E l’IA può aiutarti a scrivere anche i tuoi test.</p>

<h2 id="decisioni-di-design">Decisioni di Design</h2>

<p>Ho acquisito <a href="https://tailwindcss.com/plus">tailwindui</a> molto tempo fa e mi piace usare i suoi blocchi di costruzione per creare le mie applicazioni. Posso usarlo per rendere il mio prodotto bello senza spendere molto tempo a raffinare eccessivamente il mio design.</p>

<p>Ovviamente, essendo un non-designer ho anche difficoltà con il layout generale. Anche se ho bei blocchi con cui lavorare sono ancora abbastanza capace di rovinare tutto quando li metto insieme. Quindi, a volte uso <a href="https://lovable.dev">Lovable</a> per capire meglio modi di visualizzare come i componenti potrebbero stare insieme.</p>

<p><strong>Decisione:</strong> Prova a posticipare l’avere un database. Pensa a modi diversi per farlo così puoi imparare di più sui tuoi dati prima di impegnarti in una struttura di modello.</p>

<h2 id="meccanismo-di-autenticazione">Meccanismo di Autenticazione</h2>

<p>Quando sono in una sessione di formazione, non voglio che i miei studenti creino account e ricordino password per un’esperienza che durerà 2 o 3 giorni. Non voglio nemmeno spendere tempo a armeggiare con un meccanismo di autenticazione.</p>

<p>Ora, so che alcuni di voi stanno pensando: “<em>Ehi Mario, è il 2025! Puoi configurare un meccanismo di autenticazione in un paio di minuti</em>”. Forse sì, forse no. Ma sono sicuro che avere un meccanismo di autenticazione completo aggiungerebbe istantaneamente almeno un po’ di complessità a tutto il resto che voglio sviluppare.</p>

<p>Quindi il mio meccanismo funziona così:</p>

<p>Mi dici il tuo nome, lo salvo nella tua sessione e sei a posto. A meno che tu non sia il formatore, ovviamente. Allora tutto quello che devi fare è inserire il tuo nome come <strong>SUPER_SECRET_PASSWORD</strong> e avrai accesso alle funzionalità avanzate.</p>

<p>È sicuro? No.</p>

<p>È abbastanza buono da usare in una classe con 20 persone? Decisamente sì.</p>

<p><strong>Decisione:</strong> L’autenticazione arriva all’ultimo momento responsabile. Pensaci, lavora attorno ad essa e forse finirai per creare qualcosa di innovativo.</p>

<h2 id="deploy">Deploy</h2>

<p>Ho recentemente letto l’incredibile libro Simplicity di <a href="https://articles.pragdave.me">Dave Thomas</a>, e ci sono molte buone idee lì. Una che mi piace particolarmente è: <strong>automatizza il tuo deploy dal giorno zero</strong>, così puoi fare deploy spesso.</p>

<p>L’ho fatto usando github workflow e la mia dedibox su <a href="https://www.scaleway.com/en/">Scaleway</a>. Ora faccio deploy facendo solo un semplice:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push origin deploy
</code></pre></div></div>

<p>E ovviamente, il deploy avviene solo se tutti i miei test passano. Roba piuttosto basilare, lo so. Ma fare questo dal primo giorno mi permette di fare deploy spesso e raccogliere feedback rapidamente.</p>

<p><strong>Decisione:</strong> Crea un hello world, fai il deploy e automatizza l’intero processo di deployment prima di fare qualsiasi altra cosa.</p>

<h2 id="considerazioni-finali">Considerazioni Finali</h2>

<p>Un buon progetto personale è un progetto personale che puoi rapidamente deployare e far usare ad altre persone. Nel mio caso, come formatore, l’idea di creare una piattaforma per simulare cose della vita reale durante le sessioni di formazione sembra un fit perfetto.</p>

<p>Rivedrò alcune di queste decisioni? <strong>CERTO!</strong> Questa è l’intera idea dietro ciascuna di queste decisioni. Un giorno avrò un meccanismo di autenticazione appropriato e un database, ma quando quel giorno arriverà avrò una ragione per implementare queste cose.</p>

<p>Come direbbe Jaqen di Game of Thrones:</p>

<blockquote>
  <p>Cosa diciamo al nostro bisogno di implementare l’autenticazione nei nostri prodotti? <strong>Non oggi.</strong></p>
</blockquote>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Building" />
    
    <category term="Product" />
    
    <summary type="html">Come qualsiasi sviluppatore là fuori, adoro iniziare progetti personali.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">L&apos;avvento del TDD: Una guida per principianti</title>
    <link href="https://mariomelo.com/it/lavvento-del-tdd-una-guida-per-principianti" rel="alternate" type="text/html" title="L&apos;avvento del TDD: Una guida per principianti" />
    <published>2025-01-14T17:22:21+00:00</published>
    <updated>2025-01-14T17:22:21+00:00</updated>
    <id>https://mariomelo.com/lavvento-del-tdd-una-guida-per-principianti</id>
    <content type="html" xml:base="https://mariomelo.com/lavvento-del-tdd-una-guida-per-principianti">
      <![CDATA[<h2 id="iniziare-con-il-test-driven-development">Iniziare con il Test-Driven Development</h2>

<p>“Come posso iniziare ad applicare il Test-Driven Development?” Questa domanda echeggia nelle mie sessioni di formazione come una chiamata di funzione ricorsiva. Mentre la mia risposta predefinita è sempre stata <em>“Inizia correggendo i bug,”</em> ho scoperto un approccio ancora più coinvolgente: <strong>Advent of Code</strong>.</p>

<h2 id="il-mio-approccio-predefinito-correggere-un-bug-esistente">Il mio approccio predefinito: correggere un bug esistente</h2>

<p>Esaminiamo un esempio semplice. Immagina di avere una funzione calcolatrice:</p>

<p>Quando qualcuno prova a dividere per zero, la nostra applicazione crasha <strong>senza cerimonie</strong>. Questo presenta un’opportunità perfetta per il TDD – possiamo scrivere un test che esprime il nostro <strong>comportamento desiderato</strong>:</p>

<p><img src="../assets/images/posts/0dbccba9581c.png" alt="Codice di test per lo scenario di divisione per zero" /></p>

<p>Il mio test fallirà ovviamente, perché il mio codice fallisce. Ora posso correggere il mio codice e far passare il mio test.</p>

<h2 id="lapproccio-gamificato-advent-of-code">L’Approccio Gamificato: Advent of Code</h2>

<p>Come un autoproclamato geek con un’affinità per i puzzle, ho scoperto che <a href="https://adventofcode.com">Advent of Code</a> è il terreno di allenamento perfetto per il TDD. Ogni puzzle fornisce:</p>

<ul>
  <li>
    <p>Un campione di input</p>
  </li>
  <li>
    <p>Un output atteso</p>
  </li>
</ul>

<p>Questa struttura ti guida naturalmente nella mentalità TDD – scrivi il tuo test basato sull’esempio prima di implementare la tua soluzione. È come avere una <strong>specifica incorporata</strong>!</p>

<p><img src="../assets/images/posts/980611310d5a.png" alt="Esempio di Advent of Code che mostra input e output atteso" /></p>

<p>Voglio dire, non solo è un buon modo per imparare il TDD, ma è anche divertente. Stai affinando le tue capacità di sviluppo, risolvendo un puzzle e praticando una tecnica molto preziosa.</p>

<p>Man mano che avanzi nelle sfide, potresti iniziare a sperimentare di più con il TDD e forse ridurre la granularità di alcuni dei tuoi test. Per esempio, potresti dover fare il parsing di un input di testo complesso in una Map per risolvere il problema, e poi questo potrebbe essere un test a sé stante.</p>

<h2 id="strumenti-che-migliorano-lesperienza">Strumenti che Migliorano l’Esperienza</h2>

<p>In Elixir (il mio linguaggio preferito), l’<strong>operatore pipe</strong> (<code class="language-plaintext highlighter-rouge">|&gt;</code>) è particolarmente potente per il TDD:</p>

<p><img src="../assets/images/posts/ad2c4c517ce0.png" alt="Esempio di codice con operatore pipe in Elixir" /></p>

<p>Quel piccolo triangolo dice fondamentalmente: <em>prendi l’output della funzione sopra e passalo alla funzione seguente.</em> Questa sintassi elegante ti permette di abbozzare il flusso ad alto livello della tua soluzione prima di tuffarti nei dettagli di implementazione.</p>

<p>Combina questo con strumenti come <code class="language-plaintext highlighter-rouge">mix test.watch</code>, che esegue automaticamente i test quando i file cambiano, e hai un ciclo di feedback rapido che rende il TDD naturale e intuitivo.</p>

<h3 id="pronto-per-iniziare">Pronto per Iniziare?</h3>

<p>Scegli il tuo linguaggio di programmazione preferito e tuffati! Puoi esplorare il mio repository Advent of Code 2024 per ispirazione:</p>

<p><a href="https://github.com/mariomelo/advent_of_code24">https://github.com/mariomelo/advent_of_code24</a></p>

<p>Ricorda: L’obiettivo non è la perfezione ma la pratica. Ogni puzzle è un’opportunità per rafforzare i tuoi muscoli TDD mentre ti diverti!</p>

<p><em>Per approfondimenti sul TDD, dai un’occhiata all’eccellente articolo su Software Design: Tidy First?</em></p>

<p><a href="https://tidyfirst.substack.com/p/canon-tdd?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"> Software Design: Tidy First? - Canon TDD</a></p>

<p>Buon coding!</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Coding" />
    
    <category term="Testing" />
    
    <summary type="html">Iniziare con il Test-Driven Development</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Una riflessione sui miei 20 anni di lavoro nello sviluppo software</title>
    <link href="https://mariomelo.com/it/una-riflessione-sui-miei-20-anni-di-sviluppo-software" rel="alternate" type="text/html" title="Una riflessione sui miei 20 anni di lavoro nello sviluppo software" />
    <published>2024-07-22T16:02:33+00:00</published>
    <updated>2024-07-22T16:02:33+00:00</updated>
    <id>https://mariomelo.com/una-riflessione-sui-miei-20-anni-di-sviluppo-software</id>
    <content type="html" xml:base="https://mariomelo.com/una-riflessione-sui-miei-20-anni-di-sviluppo-software">
      <![CDATA[<p>Ho ricevuto il mio primo stipendio come sviluppatore software nel luglio 2004. Sono passati 20 anni.</p>

<p>Durante questi anni sono stato sviluppatore, imprenditore, consulente, formatore, e ho imparato (principalmente commettendo errori) molte cose sia sul lato tecnico che su quello sociale dello sviluppo software.</p>

<p>Quello che ho scritto qui è basato su quello che ho vissuto in questo mercato, il che significa: è basato su molti anni di esperienza, ma è anche influenzato da queste stesse esperienze. Ma dato che ho visto cose cambiare e altre non cambiare, vorrei provare a elaborare il mio ragionamento su quali sono le cause e le conseguenze di questi risultati.</p>

<p>Quindi, iniziamo!</p>

<h2 id="cosa-è-cambiato-in-20-anni">Cosa è cambiato in 20 anni?</h2>

<p>Beh… Ovviamente, <strong>la tecnologia è cambiata.</strong> E con essa, tutto è cambiato.</p>

<p>Quando ho iniziato a programmare non avevamo iPhone o telefoni Android, e curiosamente stavo lavorando con il mobile computing. Pocket PC 2002 era il sistema operativo e stavo scrivendo codice C++ che doveva essere altamente ottimizzato a causa di tutte le restrizioni di memoria che avevamo all’epoca.</p>

<p><img src="../assets/images/posts/718c3cc53b95.jpeg" alt="Computer mobili Intermec" /><em>Mobile negli anni 2000: Questi dispositivi potevano far sembrare fragile il Nokia 3310</em></p>

<p>Ma soprattutto: le <strong>organizzazioni sono cambiate</strong>. E la maggior parte dei cambiamenti che ho visto sono stati causati da innovazioni tecnologiche.</p>

<h4 id="complicato-poi-più-semplice-poi-complesso"><strong>Complicato, poi più semplice, poi complesso</strong></h4>

<p>Se hai mai scritto un’applicazione web usando J2EE e Enterprise Bean, ricorderai quanto era burocratico. Il deploy non era diretto, dovevamo scrivere molto codice per fare la cosa più semplice e i cambiamenti allo schema del database erano un incubo. Il punto è che stavamo principalmente creando applicazioni web private perché il web non era quello che è oggi (nemmeno Orkut era stato creato ancora).</p>

<p>All’inizio, questi punti dolenti hanno incentivato le organizzazioni a spingere per <strong>team più grandi</strong>, un <strong>dipartimento di gestione database</strong> specializzato e anche un <strong>dipartimento operazioni</strong>.</p>

<p>D’altra parte, gli sviluppatori hanno iniziato a creare strumenti per risolvere questi punti dolenti: framework ORM come Hibernate hanno iniziato a diventare popolari, poi framework come Rails hanno iniziato a introdurre modi più semplici per creare database evolutivi e anche un approccio più diretto per creare un’applicazione web.</p>

<p>Questi cambiamenti hanno dato potere agli sviluppatori e permesso a piccoli team di essere ancora più produttivi di quanto lo fossero i grandi team aziendali. Con questo abbiamo visto un cambiamento nel mercato: tutti volevano team più piccoli con i cosiddetti Sviluppatori Full-stack. Il cloud computing era disponibile per tutti per meno di $5/mese con Heroku, DigitalOcean e AWS, e molte startup hanno iniziato a spuntare ovunque.</p>

<p><strong>Ma poi… tutto è cambiato.</strong></p>

<p>Il web si è evoluto e quello che era un semplice REQUEST/RESPONSE con HTML e CSS è diventato un puzzle complesso usando Ajax, jQuery, e poi Angular, Ember, React, Vue, Svelte. Le aziende hanno iniziato a richiedere <strong>sviluppatori frontend</strong>.</p>

<p>Sul backend, le cose sono diventate ancora più complesse. I giganti dell’industria stavano affrontando le sfide causate dal loro stesso successo: come gestire una quantità così massiccia di utenti simultanei? Come memorizzare efficientemente questa quantità massiccia di dati?</p>

<p>Ancora una volta, gli sviluppatori sono venuti in soccorso e hanno creato soluzioni come Docker, Kubernetes, Grafana. I giganti hanno condiviso le loro storie di successo e le aziende di medie dimensioni hanno deciso di aggiungere tutta questa complessità ai loro prodotti per raggiungere gli stessi risultati. In parte, questo movimento è stato causato anche dagli sviluppatori: volevamo lavorare con la tecnologia all’avanguardia usata dai giganti del mercato, anche se chiaramente non era necessaria per i nostri server che gestivano molti meno utenti di Google o Facebook.</p>

<p>Sviluppare un software semplice sembrava… inutilmente complesso. La maggior parte delle aziende con cui ho lavorato all’epoca non stavano creando prodotti per le masse, ma prodotti di nicchia con poca o nessuna necessità di tale complessità. Ed è stato proprio quando ho iniziato a lavorare di più con consulenza e formazione di nuovo. Stavo costantemente sostenendo modelli più semplici ogni volta che erano abbastanza buoni.</p>

<p>Lo faccio ancora.</p>

<h2 id="cosa-non-è-cambiato-in-20-anni">Cosa non è cambiato in 20 anni?</h2>

<p>Molte cose:</p>

<ul>
  <li>
    <p>Abbiamo ancora bisogno di sviluppatori software</p>
  </li>
  <li>
    <p>Le persone stanno ancora cercando di capire come misurare la produttività nel campo dello sviluppo software</p>
  </li>
  <li>
    <p>Le stime sono ancora un problema per la maggior parte delle persone</p>
  </li>
  <li>
    <p>Le persone discutono ancora su qual è il miglior editor di testo/IDE/framework/linguaggio</p>
  </li>
  <li>
    <p>E beh… <strong>lo sviluppo software mi porta ancora gioia</strong> :)</p>
  </li>
</ul>

<p>Non sento di aver detto tutto quello che volevo dire. Devo ancora riflettere di più su come sono cambiato durante questi 20 anni.</p>

<p>Forse scriverò di più su questo in futuro.</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Building" />
    
    <category term="Career" />
    
    <summary type="html">Ho ricevuto il mio primo stipendio come sviluppatore software nel luglio 2004.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Dipendenze: Librerie o applicazioni OTP</title>
    <link href="https://mariomelo.com/it/dipendenze-librerie-o-applicazioni-otp" rel="alternate" type="text/html" title="Dipendenze: Librerie o applicazioni OTP" />
    <published>2024-07-18T08:51:08+00:00</published>
    <updated>2024-07-18T08:51:08+00:00</updated>
    <id>https://mariomelo.com/dipendenze-librerie-o-applicazioni-otp</id>
    <content type="html" xml:base="https://mariomelo.com/dipendenze-librerie-o-applicazioni-otp">
      <![CDATA[<h2 id="il-progetto-scrumchkin-online">Il progetto: Scrumchkin Online</h2>

<p>Circa un anno fa ho creato un gioco di carte per insegnare Scrum: <a href="http://scrumchkin.com">Scrumchkin</a>. Il gioco ha reso il processo di apprendimento più divertente ed è stato adottato da <em>Scrum Trainer</em> di diversi paesi, finché la pandemia non ha reso impossibile qualsiasi lezione in presenza.</p>

<p>Ed è da lì che è nato il mio progetto personale: creare una versione online di Scrumchkin. Che sarebbe stata un’ottima opportunità per giocare e imparare di più su <em>Phoenix Liveview</em>.</p>

<p>Inizialmente, ho pensato alla seguente struttura per il progetto:</p>

<p>In questo modo, sarebbe possibile creare giochi in processi separati e avere un registro con identificatori unici per ogni gioco in modo che ogni partita potesse essere accessibile attraverso un URL diverso.</p>

<p>Esempio:</p>

<ul>
  <li>
    <p>L’utente accede all’URL <code class="language-plaintext highlighter-rouge">http://scrumchkin.com/game/abc123</code></p>
  </li>
  <li>
    <p>L’applicazione web chiede al Registro dei Giochi dove si trova il gioco <code class="language-plaintext highlighter-rouge">abc123</code></p>
  </li>
  <li>
    <p>Il Registro dei Giochi trova il PID della partita e lo restituisce all’applicazione web</p>
  </li>
</ul>

<h3 id="il-registro-dei-giochi-come-libreria">Il Registro dei Giochi come libreria</h3>

<p>Tenendo a mente il <strong>principio di responsabilità singola</strong>, il design sopra rende evidente l’esistenza di 3 progetti diversi: Il Registro dei Giochi, il Server di Gioco e l’Interfaccia Web.</p>

<p><em>I prossimi paragrafi parleranno di alcuni aspetti tecnici di Elixir come curiosità. Se vuoi solo capire la differenza tra una libreria e un’applicazione OTP sentiti libero di saltare questa parte</em> :)</p>

<p>Tecnicamente il Registro dei Giochi è estremamente semplice: collega un ID unico a una partita. È fondamentalmente un dizionario che ha un <em>UUID</em> come chiave e un <em>PID</em> di un GenServer come valore per una partita.</p>

<p>Inizialmente, ho creato il Registro dei Giochi come una libreria capace di eseguire operazioni CRUD su una <em>tabella ets</em>:</p>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defmodule</span> <span class="no">GameRegister</span> <span class="k">do</span>
  <span class="k">def</span> <span class="n">init</span><span class="p">()</span> <span class="k">do</span>
    <span class="ss">:ets</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">,</span> <span class="p">[</span><span class="ss">:set</span><span class="p">,</span> <span class="ss">:public</span><span class="p">,</span> <span class="ss">:named_table</span><span class="p">])</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">save</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">do</span>
    <span class="n">key</span> <span class="o">=</span> <span class="no">UUID</span><span class="o">.</span><span class="n">uuid1</span><span class="p">()</span>
    <span class="ss">:ets</span><span class="o">.</span><span class="n">insert_new</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">,</span> <span class="p">{</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">})</span>
    <span class="n">key</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">delete</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">do</span>
    <span class="ss">:ets</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">do</span>
    <span class="ss">:scrumchkin</span>
    <span class="o">|&gt;</span> <span class="ss">:ets</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
    <span class="o">|&gt;</span> <span class="n">format_result</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">list_all</span> <span class="k">do</span>
    <span class="ss">:ets</span><span class="o">.</span><span class="n">tab2list</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">)</span>
  <span class="k">end</span>

  <span class="k">defp</span> <span class="n">format_result</span><span class="p">([]),</span> <span class="k">do</span><span class="p">:</span> <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="s2">"Game not found"</span><span class="p">}</span>

  <span class="k">defp</span> <span class="n">format_result</span><span class="p">(</span><span class="n">item_list</span><span class="p">)</span> <span class="k">do</span>
    <span class="n">item_list</span>
    <span class="o">|&gt;</span> <span class="n">hd</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p><strong>TL;DR</strong> - La libreria memorizza lo stato corrente delle partite e le collega a un codice identificatore. È capace di elencare, ottenere, salvare ed eliminare partite dal registro.</p>

<h3 id="un-piccolo-problema">Un piccolo problema</h3>

<p>Per poter usare la tabella ets, doveva esistere. Questo significa che a un certo punto la funzione <code class="language-plaintext highlighter-rouge">init</code> dal codice sopra avrebbe dovuto essere chiamata dalla mia applicazione web.</p>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">def</span> <span class="n">init</span><span class="p">()</span> <span class="k">do</span>
    <span class="ss">:ets</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">,</span> <span class="p">[</span><span class="ss">:set</span><span class="p">,</span> <span class="ss">:public</span><span class="p">,</span> <span class="ss">:named_table</span><span class="p">])</span>
  <span class="k">end</span>
</code></pre></div></div>

<p>Ma questo va contro il principio di responsabilità singola che ho usato per dividere questo progetto in parti più piccole, giusto?</p>

<h3 id="il-registro-come-applicazione">Il Registro come applicazione</h3>

<p>Ma cos’è una dipendenza come libreria? È un ingranaggio che fa parte di un tutto; qualcosa di molto simile a un pezzo di Lego. Sappiamo dove sono i perni e i buchi e lo usiamo per costruire qualcosa di più grande.</p>

<p><img src="../assets/images/posts/0b40ff6369e6.png" alt="Dipendenze come Librerie" /><em>La dipendenza da un’applicazione OTP è un po’ diversa.</em></p>

<p>Pensa a un’auto. Di solito, le auto hanno un meccanismo di raffreddamento del motore che si avvia quando giri la chiave e avvii l’auto. L’auto dipende da questo meccanismo per funzionare, ma è in qualche modo indipendente: molte volte si attiva quando spegniamo l’auto (quel rumore di ventola che viene da sotto il cofano, specialmente nelle giornate calde).</p>

<p>Questo meccanismo di raffreddamento ha interfacce con il motore dell’auto, ma controlla il proprio stato. C’è una chiara relazione di <strong>dipendenza</strong>, ma non di controllo. Il motore dipende dal sistema di raffreddamento per non surriscaldarsi, ma non lo controlla.</p>

<p>E lo stesso doveva succedere con il mio Registro dei Giochi, che è diventato così:</p>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defmodule</span> <span class="no">GameRegister</span> <span class="k">do</span>
  <span class="kn">use</span> <span class="no">GenServer</span>

  <span class="k">def</span> <span class="n">start_link</span><span class="p">(</span><span class="n">state</span><span class="p">)</span> <span class="k">do</span>
    <span class="no">GenServer</span><span class="o">.</span><span class="n">start_link</span><span class="p">(</span><span class="bp">__MODULE__</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="ss">name:</span> <span class="bp">__MODULE__</span><span class="p">)</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">init</span><span class="p">(</span><span class="n">stack</span><span class="p">)</span> <span class="k">do</span>
    <span class="ss">:ets</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">,</span> <span class="p">[</span><span class="ss">:set</span><span class="p">,</span> <span class="ss">:public</span><span class="p">,</span> <span class="ss">:named_table</span><span class="p">])</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">"Tabella scrumchkin creata"</span><span class="p">)</span>
    <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">stack</span><span class="p">}</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">handle_call</span><span class="p">({</span><span class="ss">:save</span><span class="p">,</span> <span class="n">game</span><span class="p">},</span> <span class="n">_from</span><span class="p">,</span> <span class="n">state</span><span class="p">)</span> <span class="k">do</span>
    <span class="n">key</span> <span class="o">=</span> <span class="no">UUID</span><span class="o">.</span><span class="n">uuid1</span><span class="p">()</span>
    <span class="ss">:ets</span><span class="o">.</span><span class="n">insert_new</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">,</span> <span class="p">{</span><span class="n">key</span><span class="p">,</span> <span class="n">game</span><span class="p">})</span>
    <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">state</span><span class="p">}</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">handle_call</span><span class="p">({</span><span class="ss">:delete</span><span class="p">,</span> <span class="n">game_id</span><span class="p">},</span> <span class="n">_from</span><span class="p">,</span> <span class="n">state</span><span class="p">)</span> <span class="k">do</span>
    <span class="ss">:ets</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">,</span> <span class="n">game_id</span><span class="p">)</span>
    <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:ok</span><span class="p">,</span> <span class="n">state</span><span class="p">}</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">handle_call</span><span class="p">({</span><span class="ss">:get</span><span class="p">,</span> <span class="n">game_id</span><span class="p">},</span> <span class="n">_from</span><span class="p">,</span> <span class="n">state</span><span class="p">)</span> <span class="k">do</span>
    <span class="n">result</span> <span class="o">=</span>
      <span class="ss">:scrumchkin</span>
      <span class="o">|&gt;</span> <span class="ss">:ets</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">game_id</span><span class="p">)</span>
      <span class="o">|&gt;</span> <span class="n">format_result</span>

    <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">state</span><span class="p">}</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">handle_call</span><span class="p">(</span><span class="ss">:list_all</span><span class="p">,</span> <span class="n">_from</span><span class="p">,</span> <span class="n">state</span><span class="p">)</span> <span class="k">do</span>
    <span class="p">{</span><span class="ss">:reply</span><span class="p">,</span> <span class="ss">:ets</span><span class="o">.</span><span class="n">tab2list</span><span class="p">(</span><span class="ss">:scrumchkin</span><span class="p">),</span> <span class="n">state</span><span class="p">}</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">save</span><span class="p">(</span><span class="n">game</span><span class="p">)</span> <span class="k">do</span>
    <span class="no">GenServer</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">__MODULE__</span><span class="p">,</span> <span class="p">{</span><span class="ss">:save</span><span class="p">,</span> <span class="n">game</span><span class="p">})</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">delete</span><span class="p">(</span><span class="n">game_id</span><span class="p">)</span> <span class="k">do</span>
    <span class="no">GenServer</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">__MODULE__</span><span class="p">,</span> <span class="p">{</span><span class="ss">:delete</span><span class="p">,</span> <span class="n">game_id</span><span class="p">})</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">get</span><span class="p">(</span><span class="n">game_id</span><span class="p">)</span> <span class="k">do</span>
    <span class="no">GenServer</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">__MODULE__</span><span class="p">,</span> <span class="p">{</span><span class="ss">:get</span><span class="p">,</span> <span class="n">game_id</span><span class="p">})</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="n">list_all</span> <span class="k">do</span>
    <span class="no">GenServer</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="bp">__MODULE__</span><span class="p">,</span> <span class="ss">:list_all</span><span class="p">)</span>
  <span class="k">end</span>

  <span class="k">defp</span> <span class="n">format_result</span><span class="p">([]),</span> <span class="k">do</span><span class="p">:</span> <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="s2">"Game not found"</span><span class="p">}</span>

  <span class="k">defp</span> <span class="n">format_result</span><span class="p">(</span><span class="n">item_list</span><span class="p">)</span> <span class="k">do</span>
    <span class="n">item_list</span>
    <span class="o">|&gt;</span> <span class="n">hd</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="ma-cosa-cambia">Ma… cosa cambia?</h3>

<p>La mia applicazione web non è responsabile della creazione della tabella ets. Dice solo che dipende dal Registro dei Giochi e che ora è un’<strong>applicazione extra</strong>.</p>

<p>La modifica nel file <code class="language-plaintext highlighter-rouge">mix.exs</code> è semplice:</p>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">def</span> <span class="n">application</span> <span class="k">do</span>
    <span class="p">[</span>
      <span class="ss">mod:</span> <span class="p">{</span><span class="no">Scrumchkin</span><span class="o">.</span><span class="no">Application</span><span class="p">,</span> <span class="p">[]},</span>
      <span class="ss">extra_applications:</span> <span class="p">[</span><span class="ss">:logger</span><span class="p">,</span> <span class="ss">:runtime_tools</span><span class="p">,</span> <span class="ss">:game_register</span><span class="p">,</span> <span class="ss">:game_engine</span><span class="p">]</span>
    <span class="p">]</span>
  <span class="k">end</span>
  <span class="k">defp</span> <span class="n">deps</span> <span class="k">do</span>
    <span class="p">[</span>
      <span class="p">{</span><span class="ss">:game_engine</span><span class="p">,</span> <span class="ss">path:</span> <span class="s2">"../game_engine"</span><span class="p">},</span>
      <span class="p">{</span><span class="ss">:game_register</span><span class="p">,</span> <span class="ss">path:</span> <span class="s2">"../game_register"</span><span class="p">}</span>
    <span class="p">]</span>
  <span class="k">end</span>
</code></pre></div></div>

<p>Ora, ogni volta che avvio la mia applicazione con <code class="language-plaintext highlighter-rouge">mix phx.server</code>, il mio registro dei giochi viene automaticamente avviato e si assume la responsabilità di creare la tabella ets dove memorizzerà i PID delle partite di Scrumchkin.</p>

<p>La mia applicazione web <strong>dipende</strong> dal Registro dei Giochi, ma si fida che possa risolvere i suoi problemi da solo.</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Coding" />
    
    <category term="Elixir" />
    
    <summary type="html">Il progetto: Scrumchkin Online</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">La pericolosa cultura della vergogna del fallimento</title>
    <link href="https://mariomelo.com/it/la-pericolosa-cultura-della-vergogna-del-fallimento" rel="alternate" type="text/html" title="La pericolosa cultura della vergogna del fallimento" />
    <published>2024-07-17T11:38:54+00:00</published>
    <updated>2024-07-17T11:38:54+00:00</updated>
    <id>https://mariomelo.com/la-pericolosa-cultura-della-vergogna-del-fallimento</id>
    <content type="html" xml:base="https://mariomelo.com/la-pericolosa-cultura-della-vergogna-del-fallimento">
      <![CDATA[<p>Michael Caine come Alfred Pennyworth</p>

<p><strong>Disclaimer</strong>: questo post è stato scritto originariamente il 24 marzo 2014 e pubblicato su Medium. Penso che sia ancora molto rilevante (forse con qualche riferimento musicale datato qua e là), quindi l’ho portato anche qui.</p>

<h1 id="sbagliare-o-non-sbagliare">Sbagliare o non sbagliare</h1>

<p><em>Come esseri umani, siamo tutti inclini all’errore. Ma alcuni si rifiutano di accettarlo.</em></p>

<p>Dai il massimo per qualcosa solo per scoprire che non è andato come avevi pianificato. C’è qualche tipo di punizione in arrivo?</p>

<h1 id="ambienti-che-stigmatizzano-il-fallimento">Ambienti che stigmatizzano il fallimento</h1>

<p>Qualunque sia la tua risposta, è stata almeno in parte creata dagli ambienti in cui hai vissuto finora. Eri libero di <strong>fallire</strong> quando eri giovane? Lavori in un’azienda dove le persone vengono punite quando commettono <strong>errori</strong>? Ti senti a tuo agio quando affronti persone che hai <strong>deluso</strong>?</p>

<p>Un ambiente che stigmatizza il fallimento è un posto dove a nessuno è permesso fallire, perché se lo fanno, subiranno qualche tipo di dura punizione. Come essere licenziato dal capo, sculacciato dai genitori o persino lasciato dal partner. Scegli tu.</p>

<blockquote>
  <p>Hai sbagliato. Vergognati.</p>

  <p><cite>- Noi stessi</cite></p>
</blockquote>

<p>Se hai mai vissuto in questo tipo di ambiente (e le probabilità sono che tu l’abbia fatto), sai quanto duramente devi pensare prima di fare un singolo passo avanti. O indietro. Devi pensare e ripensare ogni mossa perché se fallisci c’è qualcosa di brutto che ti aspetta.</p>

<h1 id="conseguenze-della-stigmatizzazione-del-fallimento">Conseguenze della stigmatizzazione del fallimento</h1>

<p>Beh, <em>se guardi in faccia il male, il male ti guarderà indietro</em>, e non potendo fallire potresti iniziare a <strong>odiare</strong> quando le persone ti deludono.</p>

<p>È successo a me, e quando ho iniziato a invertire questo processo sono diventato in grado di percepire alcune conseguenze di questo tipo di cultura.</p>

<h2 id="stagnazione">Stagnazione</h2>

<p>Spesso evolviamo per tentativi ed errori. Accettiamo i concetti appresi con la pratica più velocemente di quelli appresi dalla teoria.</p>

<blockquote>
  <p>Perché cadiamo, signore? Così possiamo imparare a rialzarci.</p>

  <p><cite>— Alfred Pennyworth</cite></p>
</blockquote>

<p>Dove lavoro, proviamo costantemente cose nuove e facciamo brainstorming. Non importa cosa viene in mente, tutti si sentono liberi di dire qualsiasi cosa a chiunque. I fallimenti sono tollerabili finché impariamo qualcosa da loro, e questo ci fa evolvere molto più velocemente di quanto ci si aspetterebbe.</p>

<p>Se nessuno avesse questa libertà di fallire, i miei colleghi perderebbero l’autonomia e la fiducia in sé stessi per provare le proprie idee e saremmo bloccati nel 2011.</p>

<h2 id="procrastinazione">Procrastinazione</h2>

<p>Non posso fallire quindi devo lavorarci finché non è perfetto, non importa quanto tempo ci vuole.</p>

<blockquote>
  <p>Voglio un nuovo errore, perdere è meglio che esitare.</p>

  <p><cite>— Queens of the Stone Age</cite></p>
</blockquote>

<p>Una volta ho lavorato a un progetto che mirava a migliorare un certo indicatore aziendale a qualcosa sopra il 90%. Dopo 5 mesi, il progetto poteva migliorare questo indicatore dal 10% a qualcosa sopra il 65% <strong>se fosse stato distribuito</strong>. I responsabili non volevano distribuirlo così com’era e hanno continuato a cercare modi per migliorare quel 65% al desiderato 90% per <strong>2 maledetti anni</strong>.</p>

<p>Per 2 anni l’azienda ha avuto il 10% su qualcosa che avrebbe potuto avere il 65% perché nessuno voleva dire <em>Ehi, non sono riuscito a consegnare il 90%, ma iniziamo con il 65% e cresciamo da lì</em>. È probabile che se avessero provato, avrebbero capito come raggiungere più del 90% in meno di 2 anni.</p>

<p>Quindi, se fallisci velocemente, evolverai più velocemente.</p>

<h2 id="bugie-e-apatia">Bugie e Apatia</h2>

<p>Tutto è in fiamme, ma nessuno si farà avanti per fare qualcosa. A proposito, l’accendino è stato buttato via perché poteva far sembrare qualcuno colpevole.</p>

<blockquote>
  <p>Non sono stato io</p>

  <p><cite>— Shaggy (e il 94,7% dell’umanità)</cite></p>
</blockquote>

<p>È difficile trovare qualcuno con più informazioni su un problema della persona che l’ha creato per prima. Se questa persona si sente abbastanza a suo agio da ammetterlo, il suo aiuto può essere la chiave per risolvere il problema. Tuttavia, se non c’è spazio per questo, molte cose importanti rimarranno sotto il tappeto.</p>

<p>Cerco di fare <em>riunioni retrospettive</em> con i miei colleghi periodicamente. È salutare avere un dibattito aperto sui nostri difetti e cercare miglioramenti insieme, qualunque sia l’argomento.</p>

<h1 id="tldr">TL;DR</h1>

<p>Lotta per il tuo diritto di fare errori, prova le tue idee senza aver paura di fallire e non essere cattivo quando vedi qualcun altro fallire, anche se ti fa male.</p>

<p>Se mai ti trovi in una situazione difficile causata da un errore che hai fatto, dai un’occhiata a <a href="https://medium.com/p/49fc07093fde/www.experienceproject.com">www.experienceproject.com</a>. Troverai molte persone amichevoli come te che condividono le loro esperienze in modo molto aperto.</p>

<p>Questo è tutto. Continua a fallire. ☺</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Teamwork" />
    
    <category term="Culture" />
    
    <summary type="html">Michael Caine come Alfred Pennyworth</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Property based testing e il problema del trasferimento da R$17,99</title>
    <link href="https://mariomelo.com/it/property-based-testing-e-il-problema-del-trasferimento-da-17-99" rel="alternate" type="text/html" title="Property based testing e il problema del trasferimento da R$17,99" />
    <published>2022-03-28T14:48:26+00:00</published>
    <updated>2022-03-28T14:48:26+00:00</updated>
    <id>https://mariomelo.com/property-based-testing-e-il-problema-del-trasferimento-da-17-99</id>
    <content type="html" xml:base="https://mariomelo.com/property-based-testing-e-il-problema-del-trasferimento-da-17-99">
      <![CDATA[<p>Alcune settimane fa qualcuno ha scoperto che la sua banca non gli permetteva di fare un bonifico bancario di un valore molto specifico: <strong>R$17,99</strong> (circa $3,50 USD). Cosa succedeva? La banca convertiva automaticamente il valore trasferito in <strong>R$17,98</strong>.</p>

<p>La cosa più curiosa è che i trasferimenti di altri valori funzionavano perfettamente. Beh, quasi tutti. Le persone hanno iniziato a scoprire altri casi specifici dove il problema si verificava: <strong>R$32,23</strong> o <strong>R$155,17</strong>.</p>

<p>L’idea di questo post non è discutere la causa del problema, ma mostrare una tecnica che può aiutare i team a rilevare problemi simili.</p>

<p>Il testo include del codice in Elixir, ma include anche illustrazioni per spiegare ogni concetto. L’obiettivo è rendere questo contenuto utile sia per le persone tecniche che non tecniche.</p>

<h3 id="i-test-unitari-aiuterebbero-beh-non-esattamente">I test unitari aiuterebbero? Beh… non esattamente.</h3>

<p>Non fraintendermi: sono un fan dei test unitari e (<em>quasi</em>) sempre pratico TDD.</p>

<p>Ma un test convenzionale per una funzione di trasferimento di denaro sarebbe probabilmente qualcosa di simile all’esempio qui sotto:</p>

<script src="https://gist.github.com/mariomelo/56fa58d3515bc5c78afff7a24ded0dc6.js"></script>

<p>Non è troppo specifico?</p>

<p>Nota che il test dove il trasferimento è possibile si concentra su un solo caso: un trasferimento di <strong>R$25,00</strong>. E in questo caso, i test hanno successo:</p>

<p><img src="../assets/images/posts/e55bd026f55a.png" alt="Test che passano con successo" /></p>

<h3 id="ma-possiamo-scrivere-un-test-per-il-caso-dei-r1799-giusto">Ma possiamo scrivere un test per il caso dei R$17,99, giusto?</h3>

<p>Certo! <strong>Dopo aver saputo dell’esistenza dell’errore</strong> potremmo includere un test aggiuntivo per garantire che anche i bonifici bancari di R$17,99 possano essere effettuati:</p>

<script src="https://gist.github.com/mariomelo/b3fab52e0eebccdbbe77afdfb9cdc55f.js"></script>

<p>Qui possiamo mettere in azione il famoso ciclo TDD (<em>Test Driven Development</em>): <strong>Red, Green, Refactor.</strong></p>

<p><img src="../assets/images/posts/a1cf3f1ae6aa.jpeg" alt="Ciclo TDD Red, Green, Refactor" /></p>

<p>Questo test fallisce (<strong>RED</strong>), e poi possiamo correggere il problema finché il test non passa (<strong>GREEN</strong>). E ora, avendo il test come rete di sicurezza possiamo alterare il codice per renderlo più leggibile senza paura di rompere nulla (<strong>REFACTOR</strong>).</p>

<p><img src="../assets/images/posts/6fcf1901980a.png" alt="Test che fallisce mostrando la differenza di saldo" /><em>Il test fallisce perché il saldo rimanente era R$2,02 e non R$2,01</em></p>

<p>Fatto! Ora quando faremo passare questo test garantiremo che i trasferimenti di R$17,99 funzioneranno perfettamente. Ma alcune domande rimangono:</p>

<ul>
  <li>
    <p>Il trasferimento di <strong>R$32,23</strong> funzionerà?</p>
  </li>
  <li>
    <p>E se ci sono altri valori che generano lo stesso errore?</p>
  </li>
  <li>
    <p>E se ci sono valori che generano un errore diverso?</p>
  </li>
  <li>
    <p>Come possiamo impedire che problemi come questo raggiungano i nostri clienti?</p>
  </li>
</ul>

<p>Ed è qui che entra in gioco il PBT — Property Based Testing, ovvero <strong>Test Basati su Proprietà</strong>.</p>

<h3 id="pbt-pulire-dove-i-test-convenzionali-non-arrivano">PBT: pulire dove i test convenzionali non arrivano</h3>

<p>È piuttosto semplice scrivere il test dei R$17,99 <strong>dopo</strong> che sappiamo dell’esistenza dell’errore.</p>

<p><img src="../assets/images/posts/3dcaa4913450.jpeg" alt="Illustrazione sulla scrittura di test dopo aver scoperto l'errore" /></p>

<p>Quello che succede è che scriviamo test con casi che già abbiamo in mente, in modo molto <strong>lineare e specifico</strong>. Ma il test è così specifico che testa solo un caso. E se il problema continua a verificarsi con trasferimenti di altri valori?</p>

<p><img src="../assets/images/posts/52d6e20585be.png" alt="Test che mostra problema con trasferimento di R$6,05" /><em>In questo caso, il problema è apparso solo quando si è provato a trasferire R$6,05</em></p>

<p>Ma… come potremmo identificare valori problematici <strong>prima ancora di sapere del problema</strong>? È qui che entrano in gioco i test basati su proprietà.</p>

<p>Lavorare con le proprietà significa non pensare a casi specifici, ma piuttosto alle caratteristiche di ogni variabile coinvolta nel test. In questo caso, possiamo dire che:</p>

<ul>
  <li>
    <p>Il saldo iniziale di chi sta per trasferire il denaro può essere <strong>qualsiasi valore maggiore di zero</strong>.</p>
  </li>
  <li>
    <p>Il valore del trasferimento è <strong>maggiore di zero e minore o uguale al saldo disponibile.</strong></p>
  </li>
</ul>

<p><img src="../assets/images/posts/ad110b85f0ac.jpeg" alt="Illustrazione sulle proprietà dei test" /></p>

<p>Per sapere se il trasferimento è stato fatto con i valori corretti, basta “verificare il nostro lavoro”, come facevamo alle elementari. :)</p>

<blockquote>
  <p><strong>Valore trasferito + Saldo rimanente = Saldo prima del trasferimento</strong></p>
</blockquote>

<p>Quando definiamo le regole in questo modo, gli strumenti di test automatizzati sono in grado di validare diversi casi differenti. E molte volte questi “casi diversi” finiscono per includere situazioni che non abbiamo mai nemmeno immaginato, e quindi non scriveremmo mai un test convenzionale su di esse.</p>

<script src="https://gist.github.com/mariomelo/320463a24d236fd1c1f634951431f42c.js"></script>

<p>Ora, eseguendo i test scopriamo che ci sono altri valori che generano anch’essi l’errore:</p>

<p><img src="../assets/images/posts/2df433c8c4e5.png" alt="Test PBT che rileva errore con valori diversi" /><em>Ops! Se ho R$0,98 e provo a trasferire R$0,71 il problema si verifica anche!</em></p>

<p>Ah! Nota che la libreria di test dice: <strong>Counter example stored</strong>.</p>

<p>Le librerie PBT di solito memorizzano i valori che hanno generato errori e li usano di nuovo finché il problema non viene risolto. Cioè, quando il test passa è perché il problema è stato risolto, e non perché la libreria ha selezionato solo valori per i quali il problema non si verifica.</p>

<h3 id="ok-ma-cosa-centra-questo-con-lagilità">Ok, ma cosa c’entra questo con l’agilità?</h3>

<p>Beh, l’agilità è la capacità di cambiare e generare risultati rapidamente.</p>

<p>È come essere in un’auto da corsa su una pista tortuosa: per fare curve velocemente e senza perdere molta velocità avrai bisogno di un veicolo solido e ben costruito. Senza di esso, sei limitato a due opzioni:</p>

<ul>
  <li>
    <p>Fare la curva moooolto lentamente per assicurarti che il veicolo non si rompa</p>
  </li>
  <li>
    <p>Fare la curva velocemente e smontare il tuo veicolo</p>
  </li>
</ul>

<p><strong>Esempio:</strong></p>

<p>Immagina che la banca decidesse di permettere conti in Bitcoin. Dovrebbero ora lavorare con una valuta che ha molti più di due decimali.</p>

<p>Ora immagina che la banca possa avere un’applicazione che:</p>

<p>a) Non ha test automatizzati</p>

<p>b) Ha alcuni test automatizzati</p>

<p>c) Ha test automatizzati convenzionali e alcuni che usano PBT</p>

<p>In quale scenario la banca sarebbe in grado di avere un prodotto funzionante in produzione più rapidamente?</p>

<p>In sintesi: <strong>Non c’è agilità senza eccellenza tecnica.</strong></p>

<h3 id="codice-sorgente-e-considerazioni-finali">Codice Sorgente e considerazioni finali</h3>

<p>Ho scritto il codice per generare l’errore di proposito e quindi illustrare come una certa tecnica potrebbe aiutare a risolvere un problema.</p>

<p>Se sei curioso, il codice usato in questo post è disponibile su: <a href="https://github.com/mariomelo/post_pbt">https://github.com/mariomelo/post_pbt</a></p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Coding" />
    
    <category term="Testing" />
    
    <summary type="html">Alcune settimane fa qualcuno ha scoperto che la sua banca non gli permetteva di fare un bonifico bancario di un valore molto specifico: R$17,99 (circa $3,50 USD).</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">3 fake news che potresti aver sentito su Scrum</title>
    <link href="https://mariomelo.com/it/3-fake-news-che-potresti-aver-sentito-su-scrum" rel="alternate" type="text/html" title="3 fake news che potresti aver sentito su Scrum" />
    <published>2022-02-09T15:30:31+00:00</published>
    <updated>2022-02-09T15:30:31+00:00</updated>
    <id>https://mariomelo.com/3-fake-news-che-potresti-aver-sentito-su-scrum</id>
    <content type="html" xml:base="https://mariomelo.com/3-fake-news-che-potresti-aver-sentito-su-scrum">
      <![CDATA[<p>Scrum è diventato assurdamente popolare, e buona parte di questa popolarità è dovuta alla sua semplicità. Ma, come diceva lo Scrum Guide nelle sue prime righe della versione 2017:</p>

<blockquote>
  <p>Scrum is simple to understand, but difficult to master</p>

  <p><cite>- Scrum Guide, versione 2017</cite></p>
</blockquote>

<p>In altre parole, c’è un universo di distanza tra capire Scrum e padroneggiarlo davvero. Ed è lì che sta il pericolo: questa distanza è l’habitat perfetto per le vittime dell’<a href="https://it.wikipedia.org/wiki/Effetto_Dunning-Kruger">effetto Dunning-Kruger</a>.</p>

<p><img src="../assets/images/posts/cd04250d7c4b.jpeg" alt="Grafico dell'effetto Dunning-Kruger" /><em>Immagine creata da <a href="http://www.investificar.com.br">www.investificar.com.br</a></em></p>

<p><strong>Da Wikipedia:</strong> <em>L’effetto Dunning-Kruger è una distorsione cognitiva a causa della quale individui poco esperti in un campo tendono a sopravvalutare le proprie abilità autovalutandosi, a torto, esperti in quel campo.</em></p>

<p>Detto questo, andiamo alle tre fake news!</p>

<h3 id="1--il-problema-di-scrum-è-che-è-troppo-semplice">1 — Il problema di Scrum è che è troppo semplice</h3>

<p>Scrum è un framework, ma è comune sentire persone riferirsi a Scrum come una metodologia. Può sembrare pignoleria, ma questo semplice scambio di parole dice molto sulla comprensione di Scrum.</p>

<p>Dopotutto, cos’è un framework? Beh, secondo il <a href="https://dictionary.cambridge.org/dictionary/english/framework">dizionario Cambridge</a>:</p>

<blockquote>
  <p><strong>A supporting structure around which something can be built</strong></p>

  <p><cite>- Dizionario Cambridge</cite></p>
</blockquote>

<p>Scrum è una struttura sulla quale dovresti costruire il tuo modo di lavorare. È come <a href="https://rubyonrails.org/">Ruby on Rails</a>, <a href="https://expressjs.com/">ExpressJS</a> o <a href="http://hibernate.org/">Hibernate</a>: non funzionano da soli, ma ti aiutano a lavorare in modo più strutturato e produttivo.</p>

<p><strong>I framework sono incompleti per default e di proposito</strong>. Sono creati affinché tu possa pensare ed espanderli nel modo che ha più senso nel tuo contesto lavorativo. Ed è da lì che vengono le pratiche agili come Story Points, User Story Mapping, Prioritizzazione Rischio x Valore, User Stories, ecc.</p>

<p><img src="../assets/images/posts/5a054b71daa0.png" alt="Illustrazione delle pratiche agili che completano Scrum" /></p>

<p>Dato che Scrum implementa il ciclo <a href="https://it.wikipedia.org/wiki/Ciclo_di_Deming">PDCA</a>, è possibile adottare una certa pratica agile, validare i suoi effetti e decidere se vale la pena continuare con quella pratica. E ovviamente, è necessario sperimentare nuove idee e ripetere questa riflessione alla fine di ogni Sprint.</p>

<p><strong>In sintesi:</strong></p>

<p>Scrum è semplice e incompleto di proposito per farti pensare a modi per completarlo.</p>

<p>Se qualcuno ti dice che il problema di Scrum è essere troppo semplice, questa persona non ha ancora capito nulla del framework.</p>

<h3 id="2--management-30-e-devops-sono-arrivati-per-sostituire-scrum">2 — Management 3.0 e DevOps sono arrivati per sostituire Scrum</h3>

<p>In Brasile abbiamo un’espressione comunemente usata quando qualcuno dice qualcosa del genere:</p>

<p><em><strong>COSA???</strong></em> — Traduzione: scusa, cosa hai appena detto?</p>

<p>Questa affermazione non ha senso se hai già capito il concetto di framework: Management 3.0 e DevOps arrivano per completare, non per sostituire.</p>

<p><a href="https://scrumguides.org/scrum-guide.html">Dopotutto, lo Scrum Guide dice:</a></p>

<blockquote>
  <p>Gli Scrum Team sono cross-funzionali, il che significa che i membri hanno tutte le competenze necessarie per creare valore in ogni Sprint.</p>

  <p><cite> - Scrum Guide</cite></p>
</blockquote>

<p>Sì, Scrum non parla di automatizzare i deploy, per esempio. Non parla di feedback wrap, delegation board o motivatori intrinseci.</p>

<p>Perché Scrum è un… <strong>framework</strong>!</p>

<p>Credo che questa rappresentazione visiva usata da <a href="https://twitter.com/axmagno">Alexandre Magno</a> nelle sue sessioni di formazione illustri molto bene questa idea.</p>

<p><img src="../assets/images/posts/e3337e8091b0.jpeg" alt="Diagramma del framework Scrum con tecniche emergenti" /><em>Rappresentazione del framework Scrum completato da tecniche emergenti, creata da Alexandre Magno</em></p>

<h3 id="3--non-abbiamo-più-team-scrum-abbiamo-squad">3 — Non abbiamo più team Scrum. Abbiamo Squad.</h3>

<p>Questa è piuttosto interessante, e l’ho aggiunta qui perché vedo sempre più organizzazioni usare termini del famoso modello Spotify. E spesso la giustificazione è che i team sono multidisciplinari e non segmentati per aree di conoscenza.</p>

<p>Ma, cosa dice lo <a href="https://scrumguides.org/scrum-guide.html">Scrum Guide</a> del suo <em>Scrum Team</em>?</p>

<ul>
  <li>
    <p>Gli <em>Scrum Team</em> sono cross-funzionali, il che significa che i membri hanno tutte le competenze necessarie per creare valore in ogni Sprint.</p>
  </li>
  <li>
    <p>All’interno di uno <em>Scrum Team</em>, non ci sono sotto-team o gerarchie. È un’unità coesa di professionisti focalizzati su un obiettivo alla volta, il Product Goal.</p>
  </li>
</ul>

<p>Il concetto di Squad è nato in modo collaborativo a Spotify ed è stato parzialmente documentato nel 2012 in questo pdf da <a href="https://twitter.com/henrikkniberg">Henrik Kniberg</a> e <a href="https://twitter.com/anders_ivarsson">Anders Ivarsson</a>. Nel documento, <a href="https://blog.crisp.se/wp-content/uploads/2012/11/SpotifyScaling.pdf">disponibile a questo link</a>, dicono:</p>

<p><em>A Squad is similar to a Scrum team, and is designed to feel like a mini-startup. They sit together, and they have all the skills and tools needed to design, develop, test, and release to production. They are a self-organizing team and decide their own way of working.</em></p>

<p>Vale sempre la pena riflettere sul modello adottato dall’organizzazione:</p>

<ul>
  <li>
    <p>Il tuo Scrum Team ha le caratteristiche menzionate nello Scrum Guide?</p>
  </li>
  <li>
    <p>La tua organizzazione fornisce l’ambiente necessario per l’esistenza di Squad/Scrum Team?</p>
  </li>
  <li>
    <p>Quale problema viene affrontato con l’adozione degli Squad?</p>
  </li>
  <li>
    <p>Cosa differenzia il tuo Squad da uno Scrum Team?</p>
  </li>
</ul>

<p>Gli Squad hanno avuto senso nel contesto di scaling di Spotify, e potrebbero anche essere compatibili con la tua organizzazione. Ma è essenziale capire quali problemi Scrum e il “Modello Spotify” cercano di risolvere prima di fare un CTRL+C / CTRL+V.</p>

<p>Alla fine della giornata, la disinformazione esisterà sempre e alla fine le persone possono diffonderla anche con le migliori intenzioni. L’unico modo che conosco per evitare queste trappole è seguire il consiglio del saggio filosofo E.T. Bilu:</p>

<p><img src="../assets/images/posts/a88da506696d.png" alt="Meme di E.T. Bilu che dice cerca la conoscenza" /><em>E.T. Bilu leggerebbe lo Scrum Guide prima di iniziare a usare Scrum</em></p>

<p>Allora, ci prendiamo un po’ di tempo per rileggere le <a href="https://scrumguides.org/scrum-guide.html">16 pagine dello Scrum Guide</a>?</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Teamwork" />
    
    <category term="Scrum" />
    
    <summary type="html">Scrum è diventato assurdamente popolare, e buona parte di questa popolarità è dovuta alla sua semplicità.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Prioritizzazione con cost of delay</title>
    <link href="https://mariomelo.com/it/prioritizzazione-con-cost-of-delay" rel="alternate" type="text/html" title="Prioritizzazione con cost of delay" />
    <published>2022-02-08T16:42:37+00:00</published>
    <updated>2022-02-08T16:42:37+00:00</updated>
    <id>https://mariomelo.com/prioritizzazione-con-cost-of-delay</id>
    <content type="html" xml:base="https://mariomelo.com/prioritizzazione-con-cost-of-delay">
      <![CDATA[<p>Prioritizzare è una delle attività più importanti e difficili nella vita di qualsiasi Product Owner. La maggior parte delle volte la difficoltà nel prioritizzare si verifica perché le persone hanno diverse <em><strong>opinioni</strong></em> sugli impatti che ogni elemento del Product Backlog può avere sul prodotto finale.</p>

<p>Beh, e questo è il problema. La prioritizzazione basata su <em><strong>opinioni</strong></em> (che di solito hanno un peso proporzionale al peso del badge di chi sta opinando). Quando in qualche modo riusciamo a rendere tangibile il valore di ogni elemento nel nostro Product Backlog, la discussione diventa molto più razionale.</p>

<p>Un modo per capire meglio il valore di ogni funzionalità viene attraverso una semplice domanda: <strong>quanto stiamo perdendo per non aver ancora consegnato questo elemento?</strong></p>

<p>Rispondere a questa domanda non è sempre facile, e spesso implica molto lavoro di ricerca. L’importante è ricordare sempre che non stiamo sempre cercando informazioni super precise qui. Lo scopo di comprendere il valore di ogni elemento è aiutarci a prendere una decisione razionale.</p>

<p>Per esempio: diciamo che un certo elemento mi farà guadagnare tra $6.000 e $40.000. Questo intervallo è <strong>molto</strong> ampio e può sembrare avere poco valore, ma se so che il costo dell’elemento non dovrebbe superare $3.000, posso già prendere una decisione e non ho bisogno di investire più tempo a raffinare la mia ricerca per restringere questo intervallo.</p>

<p><img src="../assets/images/posts/401d8f64d35c.jpeg" alt="Diversi tipi di cost of delay" /></p>

<p>Ogni elemento può avere un costo di ritardo in un formato diverso: alcuni tendono a crescere linearmente e altri esponenzialmente. Ci sono anche quelli con una data fissa, come la conformità a una legge con una data di entrata in vigore, e altri il cui costo non ha una relazione così rilevante con il tempo di ritardo. Capire quali tipi di elementi hai nel tuo Product Backlog è il primo passo per razionalizzare il tuo processo di prioritizzazione.</p>

<p>Il tipo di elemento più comune da trovare in un Product Backlog sono quelli il cui costo di ritardo tende ad aumentare nel tempo, sia linearmente che esponenzialmente. Immagina un prodotto con i seguenti elementi nel suo Product Backlog:</p>

<p><img src="../assets/images/posts/6e5a2b5187d3.jpeg" alt="Tabella con elementi del Product Backlog e i loro costi" /></p>

<p>Ogni elemento ha un costo stimato per settimana di ritardo e un tempo di sviluppo stimato. Se dividiamo il costo di ritardo per la durata di ogni elemento, arriviamo al famoso <strong>CD3: Cost of Delay Divided by Duration</strong> (costo di ritardo diviso per la durata).</p>

<p>Ma perché questo CD3 è importante? Per rispondere a questa domanda, proviamo a prioritizzare questo backlog in tre modi diversi.</p>

<p><strong>Prioritizzazione per dimensione</strong></p>

<p>Se scegliamo di consegnare prima gli elementi più piccoli, la nostra curva di consegna sarebbe più o meno così:</p>

<p><img src="../assets/images/posts/270bb0046b54.jpeg" alt="Grafico prioritizzazione per dimensione" /></p>

<p>Nella prima settimana avremmo un costo di ritardo equivalente a tutti gli elementi sommati (2.000 + 5.000 + 6.000 + 1.500), dopotutto non abbiamo consegnato nulla.</p>

<p>Alla fine della settimana 1 siamo riusciti a consegnare l’elemento <strong>Notifiche</strong> (che è stato prioritizzato per avere la durata più breve) e con ciò abbiamo ridotto il nostro costo totale di ritardo di 2.000. E poi ripetiamo questo processo per i prossimi elementi nel Product Backlog.</p>

<p>Alla fine, abbiamo il seguente scenario:</p>

<ul>
  <li>
    <p>1 settimana con costo totale di ritardo di 14.500</p>
  </li>
  <li>
    <p>2 settimane con costo totale di ritardo di 12.500</p>
  </li>
  <li>
    <p>3 settimane con costo totale di ritardo di 11.000</p>
  </li>
  <li>
    <p>4 settimane con costo totale di ritardo di 6.000</p>
  </li>
</ul>

<p>In questo scenario il nostro costo totale di ritardo è stato:</p>

<p>(1 x 14.500) + (2 x 12.500) + (3 x 11.000) + (4 x 6.000) = <strong>96.500</strong></p>

<p><strong>Prioritizzazione per valore</strong></p>

<p>Quando prioritizziamo per valore, le cose cambiano un po’:</p>

<p><img src="../assets/images/posts/98ab79c2b24c.jpeg" alt="Grafico prioritizzazione per valore" /></p>

<ul>
  <li>
    <p>4 settimane con costo totale di ritardo di 14.500</p>
  </li>
  <li>
    <p>3 settimane con costo totale di ritardo di 8.500</p>
  </li>
  <li>
    <p>1 settimana con costo totale di ritardo di 3.500</p>
  </li>
  <li>
    <p>2 settimane con costo totale di ritardo di 1.500</p>
  </li>
</ul>

<p>In questo scenario iniziamo a lavorare con l’elemento <strong>APP</strong> perché ha il più alto costo di ritardo per settimana. Alla fine abbiamo un costo totale di ritardo di:</p>

<p>(4 x 14.500) + (3 x 8.500) + (1 x 3.500) + (2 x 1.500) = <strong>90.000</strong></p>

<p><strong>Prioritizzazione per CD3</strong></p>

<p>La prioritizzazione per valore ha generato un risultato leggermente migliore, ma abbiamo ancora margine di miglioramento. Guarda cosa succede quando prioritizziamo per CD3:</p>

<p><img src="../assets/images/posts/a77c54287629.jpeg" alt="Grafico prioritizzazione per CD3" /></p>

<ul>
  <li>
    <p>1 settimana con costo totale di ritardo di 14.500</p>
  </li>
  <li>
    <p>3 settimane con costo totale di ritardo di 12.500</p>
  </li>
  <li>
    <p>4 settimane con costo totale di ritardo di 7.500</p>
  </li>
  <li>
    <p>2 settimane con costo totale di ritardo di 1.500</p>
  </li>
</ul>

<p>(1 x 14.500) + (3 x 12.500) + (4 x 7.500) + (2 x 1.500) = <strong>85.000</strong></p>

<p>Una buona riduzione, vero? E un ottimo esempio di come una persona che agisce come Product Owner può avere un impatto molto positivo sullo sviluppo del prodotto!</p>

<p><strong>Conclusione</strong></p>

<p>Sapere come prioritizzare bene è importante, e per farlo avrai sempre bisogno di avere una buona comprensione del valore di ogni elemento nel tuo Product Backlog.</p>

<p>Formule come il calcolo del CD3 possono aiutare molto una volta che hai fatto il primo passo: avere questo senso del valore. Ma questo primo passo dipende molto dalla vicinanza del Product Owner al mercato e da una buona comprensione dei problemi dei clienti. E beh, non c’è una formula magica per questo. :)</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Teamwork" />
    
    <category term="Prioritization" />
    
    <summary type="html">Prioritizzare è una delle attività più importanti e difficili nella vita di qualsiasi Product Owner.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Autonomia nella Retrospettiva</title>
    <link href="https://mariomelo.com/it/autonomia-nella-retrospettiva" rel="alternate" type="text/html" title="Autonomia nella Retrospettiva" />
    <published>2022-02-07T12:04:52+00:00</published>
    <updated>2022-02-07T12:04:52+00:00</updated>
    <id>https://mariomelo.com/autonomia-nella-retrospettiva</id>
    <content type="html" xml:base="https://mariomelo.com/autonomia-nella-retrospettiva">
      <![CDATA[<p>La <strong>Sprint Retrospective</strong> è un evento che dipende molto dalla partecipazione dei membri del team, e a volte chi assume il ruolo di <strong>ScrumMaster</strong> deve tirare fuori un coniglio dal cilindro per rompere la routine ed evitare la passività del team.</p>

<p>Un modo semplice per farlo è avere criteri chiave in modo che il team possa valutare qualitativamente lo <strong>Sprint</strong> appena concluso. Ma quali criteri chiave dovremmo usare?</p>

<p><strong>Daniel Pink</strong> definisce attraverso esperimenti nel suo libro <strong>Drive</strong> che l’Autonomia è uno dei tre pilastri che sostengono la motivazione delle persone sul lavoro. Possiamo sfruttare questo concetto per creare un modello di retrospettiva più partecipativa in 4 passi:</p>

<p><strong>1 — Chiedi al team di pensare a criteri chiave</strong></p>

<p>Imposta un breve limite di tempo e scrivi insieme al team quali fattori influenzano la qualità del lavoro del team.</p>

<p>Ricorda che la partecipazione di tutto il team Scrum è fondamentale durante tutte le fasi.</p>

<p><strong>2 — Limita i criteri chiave</strong></p>

<p>Puoi usare il <em><strong>dot voting</strong></em> per limitare i criteri chiave che verranno utilizzati se necessario. L’ideale è avere <strong>tra 5 e 10 criteri</strong> alla fine di questa fase.</p>

<p><img src="../assets/images/posts/e7e56cb3b051.jpeg" alt="Dot voting sui post-it" /></p>

<p><strong>Importante:</strong> Puoi scegliere di unire 2 o più temi se sono molto simili, ricordati solo di farlo prima della votazione.</p>

<p><strong>3 — Chiedi a ogni membro del team di valutare l’ultimo Sprint secondo i criteri più votati</strong></p>

<p>Qui non dobbiamo fare un’analisi super dettagliata. Possiamo usare 3 livelli di soddisfazione, come un semaforo.</p>

<p><strong>Esempio</strong>: Una persona può votare <strong>verde</strong> per il criterio <strong>Interruzioni</strong> se crede di essere stata raramente interrotta nello Sprint passato.</p>

<p><img src="../assets/images/posts/11e1d3f5f7b4.jpeg" alt="Valutazione in formato semaforo" /></p>

<p>Fai solo attenzione a due dettagli: assicurati che <strong>nessuno</strong> nel team abbia difficoltà a distinguere i colori selezionati e garantisci che <strong>tutti</strong> i membri abbiano valutato <strong>tutti</strong> i criteri eletti.</p>

<p><strong>4 — Valuta con il team l’evoluzione attraverso gli Sprint</strong></p>

<p>Uno dei principali benefici di questa tecnica è poter dibattere con il team cosa ha influenzato la valutazione di ogni criterio, e avere una piccola cronologia può aiutare molto a percepire alcune tendenze e possibili correlazioni.</p>

<p><img src="../assets/images/posts/cde391c316cd.jpeg" alt="Grafico dell'evoluzione dei criteri attraverso gli sprint" /></p>

<p>Guardare una valutazione congiunta di criteri che il team stesso ha stabilito è un ottimo modo per rompere il ghiaccio iniziale di una retrospettiva.</p>

<p>Questa può essere la spinta iniziale di cui il team ha bisogno per iniziare a proporre azioni ed esperimenti con il potenziale di migliorare il loro modo di lavorare.</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Teamwork" />
    
    <category term="Facilitation" />
    
    <summary type="html">La Sprint Retrospective è un evento che dipende molto dalla partecipazione dei membri del team, e a volte chi assume il ruolo di ScrumMaster deve tirare fuori un coniglio dal cilindro per rompere la routine ed evitare la passività del team.</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">E ora quali sono le direzioni future dell&apos;agilità</title>
    <link href="https://mariomelo.com/it/e-ora-quali-sono-le-direzioni-future-dellagilita" rel="alternate" type="text/html" title="E ora quali sono le direzioni future dell&apos;agilità" />
    <published>2021-02-23T23:44:45+00:00</published>
    <updated>2021-02-23T23:44:45+00:00</updated>
    <id>https://mariomelo.com/e-ora-quali-sono-le-direzioni-future-dellagilita</id>
    <content type="html" xml:base="https://mariomelo.com/e-ora-quali-sono-le-direzioni-future-dellagilita">
      <![CDATA[<p>Conosci quelle riflessioni che spuntano all’improvviso e sembrano attaccarsi alla tua testa come una canzone orecchiabile? Beh… L’altro giorno una domanda mi ha colto di sorpresa durante un training sull’agilità per una classe dal Portogallo.</p>

<p>Avevo appena finito di spiegare l’origine del Manifesto Agile e avevo elaborato un po’ su cosa è successo dopo quando uno studente mi ha bombardato con la domanda:</p>

<blockquote>
  <p><em>Secondo te, quali sono le direzioni future dell’agilità da ora in poi?</em></p>
</blockquote>

<p>In quel momento ho cercato di ripercorrere il cammino che abbiamo fatto finora, e il dibattito che ne è seguito è iniziato con un’analisi di questo percorso per identificare indizi che potessero aiutarmi a delineare cosa ci aspetta.</p>

<p>La mia interpretazione dell’illustrazione di Pierre Hervouet sulla storia del Manifesto Agile e cosa è venuto dopo</p>

<h3 id="se-tutto-è-iniziato-nello-sviluppo-software-come-siamo-arrivati-dove-siamo">Se tutto è iniziato nello sviluppo software, come siamo arrivati dove siamo?</h3>

<p>Mi sono fatto questa domanda migliaia di volte. E ho visto molte persone arrabbiate perché oggi abbiamo molti agilisti che non hanno mai scritto una riga di codice in vita loro. Beh, confesso che mi sono arrabbiato anche io per questo.</p>

<p>Ma non più.</p>

<p>C’è stato un tempo in cui era necessario convincere le persone che investire tempo nei test automatizzati era effettivamente una buona idea.</p>

<p>Ed era difficile, <strong>molto</strong> difficile.</p>

<p>Server di integrazione continua, deploy automatizzati, documentazione snella… Tutti questi concetti hanno affrontato una forte resistenza per un bel po’. Ed è lì che gli agilisti investivano la maggior parte del loro tempo e sforzo: al fianco degli sviluppatori, aiutandoli a creare meccanismi per ridurre il dolore causato dai cambiamenti nelle specifiche del software.</p>

<p>Ma a un certo punto qualcosa è cambiato.</p>

<p>Forse il mercato stesso ha eliminato le aziende che non sono riuscite ad adattarsi alle buone pratiche di sviluppo software, o forse internet e i social network hanno aiutato a sensibilizzare sull’importanza dell’eccellenza tecnica e dell’automazione dei compiti più soggetti all’errore umano.</p>

<p>Questa transizione ha portato alla luce una nuova gamma di sfide. Fondamentalmente, se Wagner Moura fosse un agilista questo sarebbe il momento in cui migrerebbe dal film <em>Tropa de Elite</em> a <em>Tropa de Elite 2</em>, realizzando che <em><strong>il nemico ora è un altro</strong></em>.</p>

<h3 id="e-chi-è-questo-nuovo-nemico">E chi è questo nuovo nemico?</h3>

<p>Questa è la domanda da un milione di dollari. In realtà, la risposta a questa domanda di solito vale molto di più.</p>

<blockquote class="q-left">
  <p>I nuovi problemi organizzativi non sono così espliciti e standardizzati come quelli che avevamo a livello operativo. Non abbiamo più una ricetta che possa essere prescritta per risolvere questi problemi e dobbiamo analizzare caso per caso.</p>
</blockquote>

<p>Ecco perché lo <a href="http://scrumguides.org">Scrum Guide</a> che una volta aveva <strong>19 pagine</strong> e raccomandava strumenti specifici per tracciare ogni ciclo è diventato solo 13 pagine, di cui 5 parlano esclusivamente della teoria e dei concetti principali del framework.</p>

<p>L’automedicazione senza una diagnosi può generare effetti collaterali peggiori dei sintomi stessi. E questo diventa più vero ad ogni passo che l’agilità fa verso l’ignoto.</p>

<h3 id="ma-allora-posso-dimenticare-la-parte-operativa">Ma allora posso dimenticare la parte operativa?</h3>

<p>Non tutte le organizzazioni sono effettivamente riuscite a lasciare il primo “Tropa de Elite”. Ma anche queste possono già visualizzare i prossimi possibili problemi se valutano scenari già esplorati da altre organizzazioni. Allora è necessario lavorare con “<em>un occhio al pesce e un occhio al gatto</em>”.</p>

<p>In fondo, l’agilità cerca di migliorare il sistema organizzativo. Tutto è iniziato nella parte più operativa, ma gradualmente abbiamo scoperto che per cambiare il sistema avremmo dovuto lavorare anche in aree più lontane dallo sviluppo software.</p>

<p>E come direbbe Wagner Moura, il sistema è… difficile.</p>

<p><strong>Ps:</strong> Solo per chiarire: non abbiamo davvero nemici, ed era solo un modo di dire. :)</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Teamwork" />
    
    <category term="Agile" />
    
    <summary type="html">Conosci quelle riflessioni che spuntano all&apos;improvviso e sembrano attaccarsi alla tua testa come una canzone orecchiabile?</summary>
  </entry>
  
  <entry xml:lang="it">
    <title type="html">Guida alle istruzioni di Scrumchkin: Livello Shu</title>
    <link href="https://mariomelo.com/it/guida-alle-istruzioni-di-scrumchkin-livello-shu" rel="alternate" type="text/html" title="Guida alle istruzioni di Scrumchkin: Livello Shu" />
    <published>2019-08-12T22:31:55+00:00</published>
    <updated>2019-08-12T22:31:55+00:00</updated>
    <id>https://mariomelo.com/guida-alle-istruzioni-di-scrumchkin-livello-shu</id>
    <content type="html" xml:base="https://mariomelo.com/guida-alle-istruzioni-di-scrumchkin-livello-shu">
      <![CDATA[<h3 id="guida-alle-istruzioni-di-scrumchkin--livello-shu">Guida alle Istruzioni di Scrumchkin — Livello Shu</h3>

<p>Se hai scaricato o comprato <a href="https://scrumchkin.com">Scrumchkin</a>, potresti volere un aiuto per ottenere il massimo dalle tue sessioni. E anche se c’è una <a href="https://www.thegamecrafter.com/games/scrumchkin/download/2596A8FC-888A-11E9-82E1-EACF782CAC4F">Guida alle Istruzioni</a> disponibile, questo post vuole essere una guida del tipo “leggi mentre giochi” così non devi memorizzare tutto.</p>

<h3 id="definire-i-ruoli">Definire i Ruoli</h3>

<p>Ok, abbiamo bisogno di almeno 5 persone. Massimo 9. Inoltre, ci servono uno ScrumMaster e un Product Owner.</p>

<p>Spesso chiedo a tutti di puntare le dita verso l’alto, contare fino a tre e chiedere loro di indicare lo ScrumMaster. E poi ripetere il processo per definire il Product Owner. È divertente e evitiamo di perdere tempo a discutere chi dovrebbe assumere il ruolo.</p>

<p>Se ci sono persone che sono veri ScrumMaster e Product Owner, suggerisco loro di vivere nuove esperienze durante il gioco. Anche se può sembrare illogico all’inizio, essere in un ruolo diverso aiuta a creare empatia tra i membri del team e favorisce una comprensione più ampia dell’intero flusso.</p>

<h4 id="lo-scrummaster">Lo ScrumMaster</h4>

<p>Lo ScrumMaster può eseguire le seguenti azioni:</p>

<ul>
  <li>
    <p>Pescare una carta</p>
  </li>
  <li>
    <p>Dare una carta</p>
  </li>
  <li>
    <p>Prendere una carta da un membro del Dev Team e darla a qualcun altro</p>
  </li>
  <li>
    <p>Rimuovere un Impedimento</p>
  </li>
</ul>

<h4 id="il-product-owner">Il Product Owner</h4>

<p>Il Product Owner può eseguire le seguenti azioni:</p>

<ul>
  <li>
    <p>Scoprire una nuova Feature</p>
  </li>
  <li>
    <p>Rivelare il Business Value di una Feature</p>
  </li>
  <li>
    <p>Riordinare il Backlog</p>
  </li>
  <li>
    <p>Raccogliere feedback dai clienti</p>
  </li>
</ul>

<h4 id="il-dev-team">Il Dev Team</h4>

<p>I membri del Dev Team possono eseguire le seguenti azioni:</p>

<ul>
  <li>
    <p>Pescare una carta</p>
  </li>
  <li>
    <p>Giocare una carta</p>
  </li>
  <li>
    <p>Stimare una Feature</p>
  </li>
</ul>

<h3 id="scoprire-il-product-backlog-iniziale">Scoprire il Product Backlog iniziale</h3>

<p>Il Product Backlog iniziale consiste in <strong>5 Feature</strong>. Le prime 2 sono sia stimate che hanno il loro Business Value scoperto. La terza è solo stimata.</p>

<p><img src="../assets/images/posts/47c0d2d93244.jpeg" alt="Carte del Product Backlog iniziale disposte sul tavolo" /><em>Ecco come appare un Product Backlog iniziale in Scrumchkin</em></p>

<p>Ti suggerisco di lasciare che il Product Owner riveli le carte delle feature e le carte del Business Value mentre un membro del Dev Team rivela le carte Size, dato che questo aiuta a inserirli nel mondo del gioco.</p>

<p>Dopo aver fatto alcune sessioni, potresti voler provare alcune modifiche e variazioni.</p>

<h3 id="impegnarsi-per-uno-sprint-backlog">Impegnarsi per uno Sprint Backlog</h3>

<p>Uno Sprint dura 5 giorni, e durante ogni giorno ogni giocatore può eseguire due azioni. Ci sono carte Work numerate come 1, 2 e 3 punti Work. E queste sono tutte le informazioni che avranno per definire il loro primo Sprint Backlog.</p>

<p>Alla fine dello Sprint, alcune carte feedback potrebbero apparire sul tavolo, secondo la seguente formula:</p>

<blockquote>
  <p>Feature Consegnate <strong>meno</strong> Feature Non Consegnate</p>
</blockquote>

<p>Non preoccuparti, torneremo alle Carte Feature più tardi.</p>

<p>Dopo che il team decide cosa c’è nel loro Sprint Backlog, prendono le carte e le separano dal Product Backlog.</p>

<h3 id="eseguire-lo-sprint">Eseguire lo Sprint</h3>

<p>Non c’è un ordine di turno.</p>

<p>Non c’è nulla che vieti ai giocatori di mostrare le loro carte agli altri.</p>

<p>Non c’è una regola che dice di giocare due azioni di fila.</p>

<p>Sai perché? Sono un team auto-organizzato. E come facilitatore vedrai questo processo accadere continuamente. Se hai un occhio attento, sarai in grado di fare domande molto potenti sul loro comportamento e sulle loro decisioni.</p>

<p><strong>I dubbi sulle regole e sulle decisioni del team sono ottimi spunti di conversazione. E le conversazioni sono il punto di questo gioco, non aver paura di interrompere il gioco e iniziarle.</strong></p>

<p>Un giorno finisce quando tutti hanno giocato le loro 2 azioni. Lo Sprint finisce dopo 5 giorni.</p>

<p>Se il team è riuscito a consegnare tutte le feature pianificate, puoi lasciare che il Product Owner o il Dev Team spendano 2 azioni per spostare la prima Feature del Product Backlog nello Sprint Backlog.</p>

<p>Le carte arancioni sono istantanee. Vengono giocate nel momento in cui qualcuno le pesca, e conta come una singola azione.</p>

<p><img src="../assets/images/posts/65c261a1e6d2.jpeg" alt="Carte Bug e urgenti di Scrumchkin" /><em>I Bug sono fastidiosi. Inoltre, URGENTE!</em></p>

<p>I <strong>Bug</strong> hanno la precedenza su qualsiasi feature. Sono bloccanti e mentre c’è un bug sul tavolo, nessuno può lavorare su nient’altro.</p>

<p>Il <strong>Technical Debt</strong> resta sul tavolo e influenza ogni feature. Il team deve decidere quando è il momento giusto per affrontare il Technical Debt e rimuoverlo dal tavolo.</p>

<p>I <strong>Sick Day</strong> sono in realtà Sick Week. Chiunque peschi questa carta non può eseguire alcuna azione fino alla fine dello Sprint corrente.</p>

<p>Gli <strong>Impedimenti</strong> sono bloccanti totali. Nessuno può fare nulla finché lo ScrumMaster non lo rimuove dal tavolo.</p>

<p>Ma ehi, abbiamo anche carte buone! Ci sono due carte che restano sul tavolo e sono cumulative:</p>

<p><img src="../assets/images/posts/2f9da72cea7d.jpeg" alt="Carte Automated Tests e Continuous Integration" /><em>I Bug, come ogni famoso cattivo, hanno la loro kryptonite</em></p>

<p>Gli <strong>Automated Tests</strong> rendono ogni correzione di bug un po’ più semplice. Man mano che queste carte iniziano a occupare spazio sul tavolo, il team inizia a raccogliere i benefici del miglioramento continuo.</p>

<p>La <strong>Continuous Integration</strong> aiuta il team a eliminare il Technical Debt. E man mano che il sistema di Continuous Integration migliora, migliora anche la facilità di eliminare questo fastidioso Technical Debt.</p>

<p>Tuttavia, queste carte verdi non sono gratuite. Devi spendere un’azione per giocarle. Ha senso, no? Come nella vita reale, Automated Tests e Continuous Integration non cadono dal cielo (anche se spesso girano nel cloud!).</p>

<h3 id="raccogliere-feedback">Raccogliere Feedback</h3>

<p>Dopo la fine dello Sprint, il facilitatore fa un semplice calcolo:</p>

<blockquote>
  <p>Feature Consegnate <strong>meno</strong> Feature Non Consegnate</p>
</blockquote>

<p>Questo è il numero di <strong>Carte Feedback</strong> che saranno disponibili per il Product Owner durante il prossimo Sprint.</p>

<p><img src="../assets/images/posts/f30e82ad0509.jpeg" alt="Carte Feedback del gioco" /><em>Ci sono anche Carte Feedback buone, lo prometto</em></p>

<p>Le carte feedback non vengono rivelate subito; il Product Owner deve spendere un’azione per raccogliere ogni <strong>Carta Feedback</strong>.</p>

<p>Le <strong>Carte Feedback</strong> restano sul tavolo e influenzano il Business Value di certe feature. Probabilmente avranno un impatto sulla prioritizzazione del Product Backlog, il che di conseguenza darà del lavoro al Product Owner.</p>

<p><strong>Consiglio pro</strong>: Come facilitatore, potresti voler scegliere quale <strong>Carta Feedback</strong> dare al Product Owner, dato che alcune avranno più impatto e quindi inizieranno dibattiti più ricchi.</p>

<h3 id="fine-del-gioco">Fine del Gioco</h3>

<p>Scrumchkin non finisce. Tutti vincono se hanno imparato qualcosa divertendosi, e tutti perdono se qualche amicizia è stata rovinata durante il processo.</p>

<blockquote>
  <p>L’arte non è mai finita, solo abbandonata.</p>

  <p><cite><strong>Leonardo da Vinci</strong></cite></p>
</blockquote>

<p>Il facilitatore deve percepire quando il gioco diventa più meccanico e meno rumoroso. È lì che finisce. Nella mia esperienza, la maggior parte dei gruppi raggiunge quel punto da qualche parte durante il 3° Sprint, ma questa non è assolutamente una regola.</p>

<p>È bello spendere 20 minuti facendo un piccolo debriefing così tutti possono condividere i loro insight e idee di esperimenti da fare nella vita reale.</p>

<p>A proposito, hai provato <a href="http://thedebriefingcube.com">il Debriefing Cube</a>?</p>

<p>Questo è tutto! Scriverò alcuni post di “livello Ra” nelle prossime settimane.</p>

<p><strong>Buon gioco!</strong></p>

<hr />

<p><a href="https://medium.com/scrumchkin/scrumchkin-instruction-guide-shu-level-182256430145">Scrumchkin Instruction Guide — Shu Level</a> è stato originariamente pubblicato in <a href="https://medium.com/scrumchkin">Scrumchkin</a> su Medium, dove le persone continuano la conversazione evidenziando e rispondendo a questa storia.</p>
]]>
    </content>
    <author>
      <name>Mario Melo</name>
    </author>
    
    <category term="Building" />
    
    <category term="Games" />
    
    <summary type="html">Guida alle Istruzioni di Scrumchkin — Livello Shu</summary>
  </entry>
  
</feed>
