Giusto per divagare un momento: il punto che secondo me viene spesso sottovalutato quando viene insegnato il primo linguaggio è che si stanno insegnando contemporaneamente due cose: in primis il linguaggio scelto, ma soprattutto si sta insegnando a programmare.
Questo secondo aspetto non è per nulla scontato, come ho riscoperto di recente vedendo dei miei compagni di corso in difficoltà di fronte a problemi per cui tutta la questione era semplicemente impostare un singolo ciclo for.
Per questo, secondo me, il primo linguaggio non deve né essere un giocattolo inutile e avulso da quelli che sono i linguaggi "veri", ma d'altra parte deve fondato su concetti chiari e senza mille eccezioni strane rispetto al "modello mentale" di base del linguaggio, in modo che le paturnie specifiche del linguaggio che si sta utilizzando non vadano ad intralciare l'apprendimento dei "concetti trasversali" della programmazione (la cosa ideale sarebbe un linguaggio per quanto possibile senza "leaky abstractions").
Infine, c'è il solito discorso della scelta di apprendimento top-down o bottom-up, ovvero parto da un linguaggio di livello relativamente basso (tipicamente il C) o parto da un VHLL (Ruby, Python & co.); entrambe hanno i loro pro e contro, e secondo me il successo di uno o dell'altro metodo dipende fortemente dalla disposizione mentale di chi sta studiando (voglio imparare cosa sta sotto il cofano/voglio divertirmi subito a fare cose) e dall'obiettivo che ci si prefigge (sviluppo embedded e sviluppo web tipicamente prevedono percorsi impostati in maniera diversa).
Qualche articolo che mi aveva colpito che c'entra tangenzialmente con queste questioni:
http://www.codinghorror.com/blog/200...ing-goats.html
http://www.codinghorror.com/blog/200...s-program.html