Ho insegnato programmazione introduttiva a livello universitario. È stato un corso di pane e burro, lo ha fatto tutta la facoltà e penso che l'abbiamo fatto abbastanza bene. Abbiamo seguito un testo comune e abbiamo avuto esami comuni, ma ognuno di noi ha avuto il proprio metodo di classe che ha funzionato. È passato molto tempo da allora, ma a volte riesco a insegnare un bambino a programmare, e l'intera immagine è più o meno la stessa.
Il modo in cui lo faccio è iniziare dal basso, il più concreto possibile. Ciò che gli studenti sanno è una struttura. Hanno già molti concetti. Sto costruendo ulteriori concetti oltre a quelli e sto eliminando i concetti che possono formare che sono controproducenti. Allo stesso tempo, li faccio imparare facendo .
Avevo costruito un piccolo computer con un chip Intel 8008, alcuni EPROM e alcuni circuiti. L'avevo programmato per riprodurre un piccolo duetto quando il chip I / O era collegato a un paio di altoparlanti. Spiegherei come funzionava il piccolo programma, con un ciclo interno per il conto alla rovescia di un contatore. Sarebbe un ritardo. Quindi alterna il bit di output e lo fa di nuovo. Lo farebbe per un po ', quindi passerebbe a un altro ritardo, dando un altro tono e così via. Il chip di memoria aveva un piccolo timer e, se avessi inserito un cavo del condensatore sotto uno degli ingressi del timer, il programma avrebbe eseguito lentamente la visualizzazione . La classe poteva sentire i relatori che facevano clic, clic, clic ... Volevo che la classe capisse che il computer stava facendo cose molto semplici un passo alla volta. Quindi sgancerei il cavo del condensatore e la "musica" scoppierebbe. (applausi)
Quindi avevo creato un simulatore per un computer decimale molto semplice, con 1000 posizioni di memoria, ognuna con un numero decimale a 4 cifre con segno. Aveva codici operativi molto semplici come "aggiungi all'accumulatore", "salta se negativo" e così via. Vorrei che scrivessero piccoli programmi in questo "linguaggio macchina", come aggiungere due numeri o aggiungere un elenco di numeri. Quindi potrebbero vederlo funzionare facendo un singolo passo o tenendo premuto il tasto Invio per vederlo correre "veloce".
Il punto era quello di mettere in atto il concetto che i computer possono eseguire solo un numero molto piccolo di diverse operazioni di base, e le eseguono una alla volta. Questo per contrastare l'impressione che i computer siano complicati e che facciano tutto allo stesso tempo, e leggano la tua mente nell'affare.
Da lì siamo passati alla programmazione in un linguaggio "reale" (BASIC :), iniziando con programmi molto semplici ma interessanti, lavorando su condizionali, loop, array, file, fusione e così via. Lo scopo era mettere a punto un set di abilità sufficiente per poter intraprendere un progetto di propria scelta, perché questa è l'unica cosa che rende interessante la programmazione: l'uso a cui puoi metterlo. Avrei buttato via alcune idee per i progetti, e poi le avrebbero prese da lì. Chiederei idee scritte e poi rapporti sui progressi, per impedire loro di rimandare all'ultimo minuto e poi andare nel panico. Penso che i progetti siano stati la parte migliore, perché stavano imparando con le proprie forze.
Quella base iniziale in una comprensione molto concreta di ciò che fanno i computer ha reso molto più facile insegnare concetti in seguito che altrimenti sarebbero veri e propri dossi, come array o (in un corso successivo) puntatori. Tendiamo a glorificare il concetto di "astrazione" come questa cosa meravigliosa, ma deve essere costruita su una base concreta, non sull'aria.