Ciao, e benvenuto nella seconda puntata della sessantatreesima stagione. Oggi entriamo nel cuore della distinzione che dà il titolo alla stagione, quella da cui discende tutto il resto. È una frase che vale la pena scolpirsi in mente: concorrenza non è parallelismo. Sembra un gioco di parole, ma capirla fino in fondo cambia il modo in cui vedi qualunque programma. Oggi parliamo di struttura contro esecuzione.
Partiamo dai due significati, perché è tutto lì. Torniamo alle due idee. La concorrenza è una proprietà del programma, di come è scritto: è la sua struttura in tante attività che possono avanzare in modo indipendente, senza un ordine rigido, intrecciandosi. Il parallelismo è una proprietà dell'esecuzione, di come quel programma gira su una macchina reale in un dato momento: è quante di quelle attività, in un certo istante, stanno davvero girando fisicamente allo stesso tempo. Una è nel disegno, l'altra è nei fatti. La stessa identica struttura concorrente può girare con parallelismo zero, oppure con parallelismo altissimo, a seconda di quanti cervelli di calcolo ha la macchina.
Voglio farti vedere questa indipendenza, perché è la chiave. Prendi un programma scritto in modo concorrente, cioè organizzato in tante attività indipendenti. Mettilo su un computer con un solo cervello di calcolo: le attività ci sono tutte, ma vengono portate avanti una fettina alla volta, a turno, alternandosi così in fretta da sembrare simultanee. Zero parallelismo, ma piena concorrenza. Ora prendi lo stesso identico programma e mettilo su un computer con otto cervelli di calcolo: di colpo, otto di quelle attività possono davvero girare nello stesso istante. Stessa struttura, ma ora c'è parallelismo. Il programma non è cambiato: è cambiata la macchina sotto di lui.
Voglio darti l'immagine che rende chiara questa idea, perché la fissa. Pensa a un maestro di scacchi che gioca in contemporanea contro tante persone, in una di quelle esibizioni dove sta in mezzo a un cerchio di tavoli. Il maestro è uno solo. Va al primo tavolo, fa la sua mossa, passa al secondo, muove, poi al terzo, e avanti così, girando in tondo. Tutte le partite avanzano insieme, nessuna aspetta la fine di un'altra: questa è concorrenza. Ma le mosse, in ogni singolo istante, le fa una alla volta, perché il maestro è uno. Se invece volessimo il parallelismo, dovremmo mettere tanti maestri, uno per tavolo, che muovono davvero tutti insieme. La struttura a tanti tavoli è la concorrenza; il numero di maestri è il parallelismo.
Voglio dirti perché conviene pensare così, perché è pratico. Separare le due idee ti dà un superpotere: puoi progettare bene la concorrenza, la struttura, senza preoccuparti da subito di quanti cervelli di calcolo avrai. Scrivi il programma come un insieme di attività indipendenti e ben organizzate, pensando alla struttura giusta. Poi, il parallelismo è quasi un regalo che arriva dopo: se giri su una macchina potente, con tanti cervelli, la tua bella struttura concorrente si spalma da sola su tutti quei cervelli e vola. Ma se giri su una macchina modesta, funziona lo stesso, solo più adagio. Hai disaccoppiato il disegno dall'hardware.
Voglio collegarlo alla stagione scorsa, perché il filo è diretto. Ti ricordi la legge di cui abbiamo parlato, quella sul tetto della velocità? Diceva che il parallelismo, per quanto tu aggiunga cervelli di calcolo, è limitato dalla parte del lavoro che resta in sequenza. Ecco: la concorrenza ben fatta è proprio lo strumento con cui riduci quella parte in sequenza. Strutturando il programma in tante attività il più possibile indipendenti, offri al parallelismo più materiale da spalmare sui vari cervelli. La concorrenza è come apparecchi la tavola; il parallelismo è quanti commensali riescono davvero a mangiare insieme. Struttura buona, e l'esecuzione potrà volare.
Voglio darti la lezione generale, perché va oltre il codice. La lezione è che conviene sempre separare come una cosa è organizzata da come viene eseguita. Sono due domande diverse, che meritano risposte diverse. Confonderle porta a errori: ci si aspetta che una buona struttura sia automaticamente veloce, o che tanta potenza aggiusti una struttura sbagliata. Nessuna delle due è vera. Prima organizza bene, con attività indipendenti e chiare; poi pensa a quante risorse metterci per eseguirle davvero insieme. Disegno ed esecuzione: due piani, da tenere separati e limpidi.
Per oggi ci fermiamo qui. Abbiamo scolpito la frase: concorrenza non è parallelismo. La concorrenza è una proprietà del programma, la sua struttura in attività indipendenti; il parallelismo è una proprietà dell'esecuzione, quante ne girano davvero insieme in un dato istante. La stessa struttura concorrente gira con parallelismo zero su un cervello di calcolo, e con parallelismo alto su tanti. Come un maestro di scacchi che gira tra molti tavoli: i tavoli sono la concorrenza, i maestri sono il parallelismo. Il vantaggio: progetti la struttura una volta, e il parallelismo arriva dopo, in base alla macchina. La lezione: separa sempre come una cosa è organizzata da come viene eseguita. Nella prossima puntata: l'illusione del tutto insieme, come una macchina alterna i compiti. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.