cat dijkstra-manifesto.md
N°006 Programmazione strutturata 18 min
Il manifesto di Dijkstra
Go To Statement Considered Harmful è la nascita della leggibilità
Il testo di Dijkstra contro il `go to` è spesso ricordato come slogan. Letto davvero, è un ragionamento sulla distanza tra testo statico e processo dinamico: come facciamo a sapere dove siamo dentro un programma mentre il programma evolve nel tempo?
- Anno
- 1968
- Era
- 1960-1969
- Linguaggio
- ALGOL
- Reperto
- EWD215
Oltre lo slogan
`Go To Statement Considered Harmful` è uno dei titoli più citati della storia dell'informatica, al punto da essersi staccato dal testo che lo contiene. Ma il documento EWD215, pubblicato nel 1968 su Communications of the ACM con quel titolo, non è un semplice divieto morale. È un'analisi del rapporto tra programma e processo.
Dijkstra parte da una domanda sottile: quando un programma è in esecuzione, come descriviamo in modo significativo il punto a cui è arrivato? Se il testo del programma è strutturato, il lettore può associare il progresso del processo a coordinate comprensibili. Se il flusso salta liberamente ovunque, queste coordinate diventano fragili.
Il testo statico e il tempo
Un programma scritto è statico. Un processo in esecuzione è temporale. Tutta la difficoltà della programmazione sta anche qui: dobbiamo usare un testo fermo per controllare una sequenza di eventi. Dijkstra osserva che le nostre capacità cognitive sono più adatte a dominare relazioni statiche che processi in evoluzione. Per questo conviene ridurre la distanza concettuale tra testo e comportamento.
La programmazione strutturata non è quindi solo questione di ordine visivo. È una tecnologia cognitiva. Blocchi, procedure, alternative e cicli danno al lettore mappe mentali. Non eliminano la complessità, ma la rendono localizzabile. Il `go to` incontrollato rompe questa geografia.
Indici testuali e indici dinamici
Uno dei passaggi più interessanti del testo riguarda gli indici. In una sequenza semplice, basta indicare una posizione nel testo. Con procedure e ricorsione serve una sequenza di posizioni, perché bisogna sapere anche in quale chiamata ci troviamo. Con i cicli entra in gioco un indice dinamico: quante volte abbiamo attraversato quella ripetizione?
Questa è una forma precoce e lucidissima di ragionamento sulla tracciabilità dell'esecuzione. Dijkstra non sta chiedendo codice bello per gusto. Sta chiedendo codice in cui lo stato del ragionamento possa essere ricostruito senza inventare una mappa privata per ogni programma.
Perché ALGOL conta
Il contesto di ALGOL e dei linguaggi strutturati è decisivo. Negli anni Sessanta la disciplina sta cercando modi più robusti per scrivere programmi grandi, dimostrabili, leggibili. Il problema non è più soltanto far eseguire istruzioni a una macchina: è costruire testi che altri esseri umani possano verificare.
In questa prospettiva, il `go to` non è il male assoluto. Dijkstra stesso riconosce sfumature storiche e pratiche. Il punto è che un costrutto troppo primitivo invita a trasferire sul lettore il costo dell'ordine. Un programma può funzionare e restare comunque intellettualmente opaco.
La lezione per il codice moderno
Oggi molti linguaggi limitano o scoraggiano il `goto`, ma il problema di Dijkstra non è sparito. Lo ritroviamo in callback annidate, stati globali, flussi asincroni difficili da seguire, eccezioni usate come controllo ordinario, effetti collaterali nascosti. Ogni volta che perdiamo coordinate, torniamo al cuore di EWD215.
Il manifesto resta attuale perché non parla davvero di una parola chiave. Parla della responsabilità di rendere il comportamento ricostruibile. La leggibilità non è gentilezza ornamentale: è la condizione che permette a un programma di essere corretto, discusso, modificato e fidato.
Punti chiave
- EWD215 fu pubblicato su Communications of the ACM nel marzo 1968.
- Il tema centrale è la perdita di coordinate nel ragionamento sul processo.
- La programmazione strutturata riduce la distanza tra testo e comportamento.
- La critica al `go to` resta utile come criterio generale di leggibilità del controllo.