Ciao, e benvenuto nella quinta puntata della sessantatreesima stagione. Oggi arriva la puntata più onesta della stagione, quella che ti mostra il lato oscuro. Perché finora la concorrenza è sembrata solo un vantaggio: fai più cose, sfrutti le attese, tutto bene. Ma c'è un prezzo, e può essere terribile. È il prezzo che paghi nel momento esatto in cui due attività, che avanzano insieme, toccano lo stesso dato. Oggi parliamo di quando due si pestano i piedi: lo stato condiviso e i conflitti.
Partiamo dal momento in cui nasce il guaio, perché è preciso. Finché ogni attività lavora sui propri dati, per conto suo, non c'è alcun problema: mille attività indipendenti convivono in pace. Il guaio nasce in un istante ben definito: quando due o più attività, che procedono insieme, hanno bisogno di leggere e scrivere la stessa informazione condivisa. Lo stesso contatore, lo stesso saldo, la stessa lista. In quel momento, l'ordine con cui si alternano smette di essere un dettaglio invisibile e diventa la cosa da cui dipende, letteralmente, se il risultato sarà giusto o sbagliato.
Voglio darti l'esempio classico, perché è illuminante. Immagina un conto in banca con cento euro, e due operazioni che avvengono insieme, ognuna vuole prelevare cinquanta euro. Ogni operazione fa tre passi: legge il saldo, calcola il nuovo saldo, scrive il risultato. Nel mondo giusto, avvengono in fila, e alla fine restano zero euro. Ma immagina che si intreccino male: la prima legge cento, la seconda legge cento anche lei, prima che la prima abbia scritto. Poi la prima calcola cinquanta e lo scrive. Poi la seconda, che aveva letto cento, calcola cinquanta e lo scrive anche lei. Risultato: hai prelevato cento euro, ma sul conto ne restano cinquanta. Cinquanta euro sono apparsi dal nulla, per colpa dell'ordine sbagliato.
Voglio dare un nome a questo mostro, perché è famoso. Questo fenomeno, in cui il risultato dipende dall'ordine imprevedibile con cui due attività si intrecciano su un dato condiviso, è il grande nemico di questo campo. È una corsa: due attività corrono sullo stesso dato, e chi arriva prima, in quel preciso giro, decide il risultato. Il problema è che quell'ordine non è fisso: cambia a ogni esecuzione, a seconda di come il regista dei turni ha smistato il lavoro in quel momento. Lo stesso identico programma, con gli stessi identici dati, può dare il risultato giusto mille volte e quello sbagliato la milleunesima.
Voglio dirti perché sono i bug peggiori, perché è importante saperlo. Questi errori sono i più temuti che esistano, per una ragione crudele: sono imprevedibili e quasi impossibili da riprodurre. Un errore normale, se sbagli qualcosa, sbaglia sempre allo stesso modo: lo trovi e lo aggiusti. Questi, invece, compaiono una volta su mille, magari solo quando il sistema è molto carico, e quando vai a cercarli, spariscono. Il solo atto di osservarli, magari rallentando il programma per studiarlo, cambia i tempi, e il conflitto non si ripresenta. Sono fantasmi: sai che ci sono, perché hai visto il danno, ma quando accendi la luce non ci sono più.
Voglio darti la radice di tutto, perché è una sola. E qui c'è la verità profonda della puntata: tutti questi guai hanno un'unica radice, ed è la combinazione di due ingredienti. Primo, cose che accadono insieme, intrecciandosi. Secondo, un dato condiviso che queste cose modificano. Togli uno dei due, e il problema svanisce. Se le attività non si intrecciano, nessun conflitto. Se non condividono nulla da modificare, nessun conflitto. È da questa constatazione che nascono tutte le soluzioni di cui parleremo: o metti ordine negli accessi al dato condiviso, oppure fai in modo che quel dato condiviso non esista proprio.
Voglio darti la lezione generale, perché vale ovunque. La lezione è che la condivisione, quando le cose accadono insieme, è la fonte di quasi ogni complessità. Vale per il codice, ma anche per gli esseri umani: due persone che modificano lo stesso documento nello stesso momento, senza coordinarsi, creano un pasticcio esattamente per la stessa ragione. Il mondo concorrente ci insegna una prudenza sana: prima di condividere qualcosa che verrà modificato da più parti insieme, fermati e chiediti come eviterai che si pestino i piedi. Perché, se non ci pensi prima, i fantasmi arriveranno.
Per oggi ci fermiamo qui. Abbiamo guardato il lato oscuro. Finché ogni attività lavora sui propri dati, tutto è in pace. Il guaio nasce quando due attività che avanzano insieme leggono e scrivono lo stesso dato condiviso: allora l'ordine con cui si intrecciano decide se il risultato è giusto o sbagliato, come i due prelievi che fanno sparire cinquanta euro. È una corsa sul dato, e l'ordine cambia a ogni esecuzione: perciò questi bug sono fantasmi, che compaiono una volta su mille e spariscono quando li cerchi. La radice è sempre una: cose che si intrecciano più un dato condiviso da modificare. Togline uno, e il problema sparisce. Nella prossima puntata: mettere ordine, uno alla volta, e i suoi pericoli. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.