Dijkstra, nel suo saggio Sulla crudeltà di insegnare davvero la scienza informatica , fa la seguente proposta per un corso introduttivo di programmazione:
Da un lato, insegniamo ciò che assomiglia al calcolo del predicato, ma lo facciamo in modo molto diverso dai filosofi. Per addestrare il programmatore inesperto alla manipolazione di formule non interpretate, lo insegniamo più come algebra booleana, familiarizzando lo studente con tutte le proprietà algebriche dei connettivi logici. Per interrompere ulteriormente i collegamenti all'intuizione, rinominiamo i valori {true, false} del dominio booleano come {black, white}.
D'altra parte, insegniamo un linguaggio di programmazione semplice, pulito e imperativo, con un salto e un'assegnazione multipla come istruzioni di base, con una struttura a blocchi per variabili locali, il punto e virgola come operatore per la composizione delle istruzioni, un bel costrutto alternativo, un bel ripetizione e, se desiderato, una chiamata di procedura. A questo aggiungiamo un minimo di tipi di dati, ad esempio valori booleani, numeri interi, caratteri e stringhe. L'essenziale è che, per qualunque cosa introduciamo, la semantica corrispondente è definita dalle regole di prova che ne derivano.
Fin dall'inizio, e per tutto il corso, sottolineiamo che il compito del programmatore non è solo quello di scrivere un programma, ma che il suo compito principale è quello di fornire una prova formale che il programma che propone soddisfa le specifiche funzionali ugualmente formali. Mentre progetta prove e programmi mano nella mano, lo studente ha ampie opportunità di perfezionare la sua agilità manipolativa con il calcolo del predicato. Infine, al fine di portare a casa il messaggio che questo corso introduttivo di programmazione è principalmente un corso di matematica formale, facciamo in modo che il linguaggio di programmazione in questione non sia stato implementato nel campus in modo che gli studenti siano protetti dalla tentazione di testare i loro programmi .
Sottolinea che si tratta di una proposta seria e delinea varie possibili obiezioni, inclusa la sua idea "assolutamente irrealistica" e "decisamente troppo difficile".
Ma quell'aquilone non volerà né per il postulato è stato smentito: dai primi anni '80, un tale corso di programmazione introduttiva è stato tenuto con successo a centinaia di matricole del college ogni anno. [Perché, nella mia esperienza, dire questo una volta non è sufficiente, la frase precedente dovrebbe essere ripetuta almeno altre due volte.]
A quale corso si riferisce Dijkstra e c'è qualche altra letteratura disponibile che ne discute?
Il saggio è apparso nel 1988 quando Dijkstra era all'Università del Texas ad Austin, il che è probabilmente un indizio: ospitano l'archivio Dijkstra ma è enorme, e sono particolarmente interessato a sentire gli altri su questo corso.
Non voglio discutere se l'idea di Dijkstra sia buona o realistica qui. Ho pensato di pubblicare questo su cstheory.se o cs.se ma mi sono stabilito qui perché a) una comunità di educatori potrebbe avere maggiori probabilità di avere qualcuno che possa rispondere facilmente, e b) Dijkstra stesso sottolinea che il suo corso è "principalmente un corso in matematica formale ". Sentiti libero di segnalare la migrazione se non sei d'accordo.