Coding e programmazione sono due cose molto diverse. Leslie Lamport spiega perché
Leslie Lamport, celebre informatico e creatore di LaTeX, ribadisce che programmare non è solo scrivere codice, ma pensare astrattamente agli algoritmi prima di implementarli.

La programmazione, nella sua essenza, è un’attività di astrazione e ragionamento rigoroso, distinta dalla semplice traduzione di un’idea in un linguaggio di sviluppo. Classe 1941, Leslie Lamport è uno dei pionieri nel campo dell’informatica, noto per i suoi contributi fondamentali alla teoria dei sistemi distribuiti, alla progettazione di algoritmi e alla matematica formale applicata all’informatica. Lamport è anche l’inventore di LaTeX, uno degli strumenti di markup più utilizzati nel campo della scrittura scientifica. La sua carriera, segnata da una costante ricerca nell’ottimizzazione delle comunicazioni tra sistemi complessi, ha reso Lamport una figura di riferimento per gli sviluppatori, i ricercatori e gli esperti di informatica in tutto il mondo.
Fare coding non equivale a programmare: parola di Leslie Lamport
Durante un lungo intervento in occasione del Southern California Linux Expo (SCaLE) 22x, Lamport ha voluto spostare l’accento, con forza, dalla mera attività di codifica al più ampio e cruciale processo di pensare astrattamente ai programmi prima di scriverli.
Lamport inizia chiarendo la distinzione fondamentale tra algoritmi e programmi. Un algoritmo è definito come un’entità di livello superiore, più astratta di un programma. Esso rappresenta una sequenza di passi logici per risolvere un problema e può essere implementato in molteplici linguaggi di programmazione. Al contrario, un programma è una realizzazione concreta di un algoritmo in un linguaggio specifico, vincolato dalle necessità di efficienza esecutiva e gestione di grandi quantità di codice.
Il matematico e informatico statunitense sottolinea che “non dovremmo scrivere algoritmi direttamente in un linguaggio di programmazione“. I linguaggi di programmazione, pur essendo strumenti potenti, sono intrinsecamente complessi. Tale complessità può oscurare la chiarezza e la correttezza dell’algoritmo stesso. L’enfasi dovrebbe essere invece posta sulle idee, indipendentemente dal linguaggio con cui sono espresse.
Le sfide della programmazione concorrente
Lamport dedica una parte significativa del suo intervento alle difficoltà intrinseche della programmazione concorrente. I programmi concorrenti contengono molteplici thread di controllo, che possono essere eseguiti simultaneamente. I programmi distribuiti sono un caso particolare di programmi concorrenti in cui i thread possono essere eseguiti su computer diversi.
Questa moltitudine di esecuzioni rende estremamente difficile prevedere e gestire tutti i possibili scenari in cui un programma concorrente potrebbe fallire. Di conseguenza, il debugging tradizionale si rivela inadeguato per garantire la correttezza di tali programmi. Un programma concorrente può funzionare apparentemente senza problemi per lungo tempo, ma una minima variazione nel sistema che alteri le velocità relative di esecuzione dei thread può innescare un bug latente. Inoltre, la correzione di un bug in un sistema concorrente è spesso foriera dell’introduzione di nuovi errori.
Per affrontare queste sfide, Lamport suggerisce un approccio basato sull’identificazione e sulla progettazione di un algoritmo corretto per la parte del programma che gestisce la concorrenza, ovvero quella che sincronizza i thread. Lamport sottolinea che, mentre i programmatori sono generalmente abili nella codifica, spesso mancano delle competenze necessarie per trovare e validare algoritmi concorrenti corretti.
L’imperativo dell’Astrazione
La chiave per superare le complessità della programmazione, specialmente quella concorrente, risiede nell’astrazione. Un algoritmo stesso è una forma di astrazione, essendo utile in molte applicazioni diverse. Lamport propone di considerare una abstract view del programma o un abstract program come una descrizione di come il programma gestisce la concorrenza a un livello superiore rispetto al codice.
L’astrazione implica un nuovo modo di pensare: pensare prima di fare coding, a un livello superiore al codice. Questa abilità non viene spesso insegnata ai programmatori, che tendono a concentrarsi sull’apprendimento dei linguaggi e delle tecniche di codifica.
Per la maggior parte dei programmi, Lamport suggerisce di definire chiaramente “cosa fa il programma” (il “what“) e “come lo fa” (“how“).
Esecuzione come sequenza di stati
Per ragionare sulla correttezza di un programma, Lamport introduce il concetto di esecuzione come sequenza di stati. Uno stato descrive i valori delle variabili rilevanti in un dato momento.
Un passo di esecuzione è la transizione da uno stato al successivo. Questa astrazione è preferibile a una sequenza di passi di codice perché si concentra sull’effetto del codice piuttosto che sui dettagli di esecuzione. Un principio fondamentale è che il possibile stato successivo deve dipendere unicamente dallo stato corrente, non da stati precedenti.
Invarianti: la chiave della correttezza di un programma, per non essere rimpiazzati dall’AI
La correttezza di un programma astratto, secondo Lamport, si dimostra attraverso l’identificazione di un invariante. Un invariante è una proprietà che è vera in ciascuno stato di ogni possibile esecuzione dell’algoritmo. Se si conosce un invariante utile ad assicurare che il programma raggiunga lo stato desiderato, si può concludere che il programma è corretto.
L’informatico dimostra come l’invariante sia vero nello stato iniziale e come implichi la correttezza del programma nello stato terminale. Tuttavia, lascia come esercizio per lo spettatore dimostrare che l’invariante si mantiene ad ogni passo. Sottolinea inoltre che la comprensione degli invarianti è cruciale: i programmatori che non riescono in questo passaggio rischiano di essere sostituiti dall’intelligenza artificiale.
L’importanza del pensiero e della scrittura
Lamport conclude la sua presentazione sottolineando che a suo avviso la riflessione è essenziale prima di cimentarsi con le attività di sviluppo software. E cita un fumettista che afferma che “scrivere è il modo in cui la natura ti fa sapere quanto è sciatto il tuo pensiero“. La scrittura aiuta a chiarire i pensieri, e un pensiero migliore porta a una scrittura migliore, creando un circolo virtuoso. È fondamentale imparare a leggere ciò che si è scritto come farebbero gli altri, per identificare ambiguità e incomprensioni. Questo è cruciale anche nell’ambito della programmazione.
Nell’ingegneria hardware, in cui la necessità di “fare le cose bene la prima volta” è molto più sentita, la necessità di usare un pensiero rigoroso è molto più sentita. Lamport ritiene che lo stesso approccio debba essere utilizzato nel mondo della programmazione. L’astrazione e il ragionamento rigoroso devono essere insomma al centro del processo di sviluppo software. Ed è questo che fa la differenza con lo schema stocastico utilizzato dai modelli generativi.
Nell’immagine in apertura Leslie Lamport. La foto è tratta dal sito ufficiale del matematico e informatico.