SONO ARRIVATI I NUOVI CORSI

Iscriviti prima di fine luglio e RISPARMIA.

Scopri i corsi
Home
5 risposte su… insegnare il coding

09 Dicembre 2020

5 risposte su… insegnare il coding

di

Preziose e ricercate le persone capaci di formare i programmatori del futuro e trasmettere ai più piccoli, ma anche ai grandi, le basi del pensiero computazionale.

I programmatori di domani sono i maghi del futuro. Sembrerete avere poteri magici rispetto a tutti gli altri.
— Gabe Newell, fondatore di Valve

Di che cosa parliamo

  1. Prologo e installazione del linguaggio dei linguaggi
  2. Come scrivere una storia sempre diversa con un programma
  3. Come fare programmazione con foto di gattini
  4. Come siamo arrivati a parlare e scrivere nei nostri linguaggi naturali
  5. Come creare flashcard per imparare e alleggerire la mente
  6. Come approfondire quanto abbiamo imparato con il coding

Prologo e installazione del linguaggio dei linguaggi

  1. Qua e là utilizzeremo un particolare strumento chiamato Racket: un linguaggio per la creazione di linguaggi. Dopo avere installato Racket e scaricato i nostri linguaggi, gli esempi che si vedono in questo articolo si possono provare direttamente sul computer.
  2. Se non riesci a proseguire nel corso dell’installazione, non esitare a chiedere aiuto sul nostro forum.
  3. scarica e installa Racket nella versione giusta per il tuo computer.
  4. Installa il pacchetto Don’t Teach Coding. Ora che hai installato Racket, puoi avviare un programma chiamato DrRacket. Fallo.
  5. Quindi, fai clic su File > Install Package.
  6. Al prompt, digita dtc e premi Invio. L’installazione di questo pacchetto richiederà alcuni minuti.
  7. Infine, nell’angolo inferiore sinistro, DrRacket potrebbe indicare No Language Selected. Fai clic su quella opzione e seleziona Determine language from source.
  8. Scrivi alcuni programmi "Hello, world". Lo scopo di tali programmi non è tanto produrre sullo schermo le parole "Hello, World", quanto verificare che tutto sia impostato correttamente. Quindi sentiti in libertà di scrivere quello che desideri.
  9. Dopo aver scritto il programma, occorre eseguirlo, pensiamo che sarai in grado di capire da te come fare (suggerimento: cerca il pulsante Run). Se otteni qualcosa di significativo, tutto è impostato correttamente.

Se qualcosa è andato storto, scrivi sul forum dedicato al libro.

Scrivere in più linguaggi

Di tanto in tanto mostreremo esempi di codice come il seguente:

#lang dtc/hello/normal
(print "HELO")

Nota la prima riga. Questa sarà sempre presente: la cosiddetta riga #lang. Indica ai lettori umani e anche al computer il linguaggio con il quale interpretare quanto segue.

È in questo modo che svolgeremo la scrittura nei vari linguaggi. Ogni volta che vedrai una riga #lang nella parte superiore di un frammento di codice, saprai tre cose:

  • che è un frammento di codice che puoi digitare in DrRacket;
  • che il computer utilizzerà quel linguaggio per interpretare quanto segue;
  • che anche tu dovrai usare quel linguaggio per interpretare quanto segue.

Spesso, dopo un frammento di codice, mostreremo l’output. Sebbene anche l’output possa sembrare codice, non troverai mai una riga #lang.

Ecco l’output del codice precedente.

"HELO"

Torna all’inizio.

1. Come scrivere una storia sempre diversa con un programma

C’era una volta, un linguaggio che era semplicemente un modo per scrivere astrazioni di storie:

#lang dtc/story/images
beginning -> middle -> end

Poi ha iniziato a crescere e a cambiare forma, in un certo senso è diventato più compatto, ma pronto a un balzo di crescita:

#lang dtc/story+/images
(beginning middle end)

Le singole Storie hanno cominciato a includere altre Storie al loro interno.

#lang dtc/frames/animations
(animate
  `(beginning middle end))

E questo a una profondità arbitraria, Storie (annidate in Storie (annidate in Storie)).

#lang dtc/frames/animations
(animate
  `(beginning,(cat) end))

E ora, il linguaggio sta affrontando la sua vera maturità: ci concederemo il potere di dargli un nome. Senza troppi indugi, come quando i genitori piangono perché i figli vanno all’asilo. Lasciamo semplicemente che ciò accada.

Definizioni

#lang dtc/complete
(define the-story
  `(beginning middle end))

È stato facile. Ora, ogni volta che diciamo the-story, si ottiene `(beginning middle end). Questo ci consente di compattare Storie arbitrariamente lunghe in quelle che sembrano essere Storie molto brevi. Per estendere un linguaggio (per insegnare a un computer che cosa significa qualcosa) basta usare un define.

Dopo aver eseguito l’estensione linguistica precedente, puoi dire:

(image the-story)

Otterrai l’immagine prevista:

beginning-middle-end

Ma in realtà vi sono due tipi di definizioni. Eccone una del secondo tipo.

#lang dtc/complete
(define (the-story ____)
  `(beginning , ____ end))

Questa è veramente potente. Non definiamo solo un’altra parola del vocabolario; questa definizione definisce un’altra struttura grammaticale.

Questa potrebbe sembrare un’operazione banale, ma questo è il punto: questo è un oggetto. La definizione di un oggetto apre le porte a un numero infinito di nuovi oggetti.

Esploriamo questo semplice infinito con alcuni esempi.

(the-story `middle)

Questo ci dà:

`(beginning middle end)

Chiunque, ora, usi il tuo linguaggio esteso, può fornire tutto ciò che desidera come secondo Momento di una Storia che inizia con the-story. Per esempio un’altra parola.

(the-story `MIDDLE)

Questo ci dà:

`(beginning MIDDLE end)

O un’immagine:

(the-story (cat))

Questo ci dà:

`(beginning beginning-gattino-end end)

Ma potremmo anche annidarle un’altra storia:

(the-story `(start-middle middle-middle end-middle))

Ecco l’output:

`(beginning
(start-middle middle-middle end-middle)
  end)

Anche questa costruzione apparentemente strana va perfettamente bene:

(the-story (the-story (the-story `MIDDLE)))

Ecco l’output:

`(beginning
(beginning
(beginning MIDDLE end)
end)
  end)

In teoria, questo potrebbe continuare indefinitamente. Prima di definire the-story, non si poteva dire nulla di simile a (the-story …) senza generare un errore. Ora, puoi dire un numero infinito di cose che non avresti potuto dire prima.

Quali tesori potranno mai nascondersi in quell’infinito?

Iscriviti alla nostra newsletter

Diventare la macchina

Come diceva Alan Perlis nel 1982:

Per capire un programma dovete diventare sia la macchina sia il programma.

E allora diventiamo la macchina (o in questo caso il linguaggio) e chiediamoci in quale modo il linguaggio gestisce i programmi come quelli sopra riportati. Attraverseremo lentamente una Storia che in realtà dura solo un istante.

All’inizio c’era la Storia a tre annidamenti:

(the-story (the-story (the-story `MIDDLE)))

In matematica, innanzitutto viene considerata la coppia di parentesi più interna. Lo stesso vale per la maggior parte dei linguaggi di programmazione. Puoi immaginare che il computer gestisca quelle espressioni sostituendole semplicemente con la loro definizione (con il codice che avresti scritto se non avessi usato la parola che hai definito) automatizzando un piccolo compito cognitivo per tuo conto.

Per rendere più concreta l’idea, le parentesi più interne sarebbero state convertite (per tuo conto) in `(beginning MIDDLE end), che è la definizione di (the-story `MIDDLE). Ciò produrrà:

(the-story (the-story `(beginning MIDDLE end)))

Ma il computer non ha ancora finito! Ora l’automazione deve procedere. Verrà valutata la successiva Storia interpretabile, dall’interno che fornisce:

(the-story `(beginning (beginning MIDDLE end) end))

E infine:

`(beginning (beginning (beginning MIDDLE end) end) end)

Ora che l’intero risultato è una Storia non ulteriormente interpretabile, non c’è più niente da fare. Tali storie significano quello che significano. Quindi ora il programma è completo.

Puoi animare i passaggi dell’interpretazione della Storia dei computer in questo modo:

#lang dtc/complete
(animate
`((the-story (the-story (the-story`MIDDLE)))
(the-story (the-story `(beginning MIDDLE end)))
(the-story `(beginning (beginning MIDDLE end) end))
    `(beginning (beginning (beginning MIDDLE end) end) end)))

A volte le animazioni sono più chiare di qualsiasi cosa possiamo stampare sulle pagine di un libro.

Torna all’inizio.

2. Come fare programmazione con foto di gattini

Considera questi programmi, identici tranne per il linguaggio.

#lang dtc/story/images
cat -> rotate
#lang dtc/story/cats
cat -> rotate

Entrambi producono anche immagini, rispettivamente:

cat-rotate

e

gattino ruotato

In altre parole, il secondo produce l’immagine ruotata di un gatto, mentre il primo produce l’immagine della Storia che descrive come produrre l’immagine ruotata di un gatto.

Fuori dal contesto, la Storia cat -> rotate può essere interpretata in molti modi.

  • È nato un gatto. Poi è ruotato.
  • C’era una volta l’immagine di un gatto, e poi venne ruotata.
  • Innanzitutto, prendi un gatto. Poi ruota il gatto.
  • Il computer carica l’immagine di un gatto da un file, quindi trasforma quell’immagine ruotandola di 45° in memoria per produrre una bitmap del risultato, che viene visualizzata sullo schermo.

E così via. Le Storie hanno sempre più interpretazioni. Ma quando dai una Storia al computer e gli chiedi di usare #lang dtc/story/image, stai chiedendo al computer di usare una specifica interpretazione, in base alla quale alcuni Momenti hanno significati predefiniti. La parola cat non conserva più il suo significato così generico. Si riferisce proprio a questo gatto:

gatto

Vi sono molte parole legate ai gatti in #lang dtc/story/cats, ognuna con il suo significato.

#lang dtc/story/cats
first-viral-cat

Questa Storia di un solo Momento produce:

fotogramma di gatti

Questo è un frame ben poco definito tratto dal primissimo video di gatti caricato su YouTube (era il 2005). Poi la tecnologia video (anche per i gatti) è molto migliorata nel corso dei primi anni 2000, portando alla nostra attuale era d’oro dei video virali sui gatti.

Il gatto di YouTube non è stato il primo a essere immortalato in un video. Se usi il simbolo edison-cat, otterrete un fotogramma dal primo video di gatti della storia, girato nel 1894 da Thomas Edison. Senza dubbio, la sua decisione di filmare la boxe fra due gatti è stata uno dei suoi momenti più ispirati.

Quindi, per esempio, potresti dare la seguente Storia in pasto al computer, chiedendogli di caricare i gatti di Edison:

#lang dtc/story/cats
edison-cat

Questo produce:

gatti boxeur

Oppure potresti chiedere una Storia più complessa, comprendente una rotazione:

#lang dtc/story/cats
edison-cat -> rotate

Nota che sono accettabili anche storie più lunghe:

#lang dtc/story/cats
edison-cat -> rotate -> rotate

Dato quello che ormai sai su come funziona #lang dtc/story/cats, probabilmente puoi indovinare che la traduzione in lingua parlata di questo codice è qualcosa come:

Carica l'immagine del gatto di Thomas Edison.
Ruotala.
Ruotala di nuovo.

Esercizio: Esegui il programma qui sopra e scopri se la tua previsione è corretta. Quindi, scrivu una Storia che produca l’immagine capovolta del gatto.

Torna all’inizio.

3. Come siamo arrivati a parlare e scrivere nei nostri linguaggi naturali

I termini linguaggio per computer, linguaggio di programmazione o linguaggio formale possono significare il fatto che sono alieni e disumani; in effetti, a volte, sono tali astrazioni del linguaggio quotidiano che è difficile considerarli amichevoli, invitanti, calorosi o umani.

Purtuttavia, tra linguaggi naturali e linguaggi formali, solo uno di essi è una consapevole invenzione umana: creati da esseri umani, per aiutare altri esseri umani a fare lavori utili per altri esseri umani.

Quello che vogliamo dire è che la creazione di linguaggi non naturali è un processo naturale. A mano a mano che il linguaggio naturale si è evoluto, è cresciuta anche la nostra capacità di creare nuovi linguaggi: linguaggi più precisi, linguaggi con maggiore capacità di astrazione, linguaggi che aiutano la mente in modo differente.

È sempre una sorpresa per molti dei nostri studenti che la coevoluzione dei linguaggi naturali e formali sia antica quanto la lingua stessa. All’alba della lingua scritta, l’abbiamo impiegata per creare nuove e più precise forme di lingua scritta, forme che si discostavano sempre più dal linguaggio naturale, acquisendo una sintassi sempre più specializzata.

Lo sappiamo, in parte, dalle tavolette di argilla rinvenute nell’antica Babilonia, vecchie di migliaia di anni, ma coperte da notazioni matematiche e algoritmi. L’evoluzione del linguaggio scritto e l’invenzione del linguaggio formale. Entrambe fanno parte della storia dell’umanità e sono fra le cose più strane che abbiamo fatto, se consideriamo il quadro generale della storia umana: il nostro talento per il linguaggio scritto ci ha portato a creare macchine che possiamo controllare con i nostri scritti; il nostro talento per la costruzione di strumenti ci ha portato a creare strumenti con i quali scrivere; abbiamo trasformato il linguaggio scritto in uno strumento per la creazione di nuovi strumenti linguistici; il nostro talento nel raccontare storie ci ha portato a creare dispositivi in grado di trasformare le storie in linguaggi formali.

unwritten-written

Questa Storia (più breve perfino di quella presumibilmente scritta da Hemingway!) è in realtà abbastanza lunga da illustrare i due grandi momenti della storia del linguaggio. Ci fu un tempo prima della parola scritta (lo chiamiamo preistoria) e un tempo successivo, quello in cui viviamo.

Certo, questa Storia di due Momenti astrae il periodo di transizione, nascondendolo e implicandolo nella presenza della Freccia. Forse sarebbe più chiaro espandere quella freccia in un Momento a se stante:

unwritten-transitional-period-written

Questo periodo di transizione è stato un momento che è durato alcune migliaia di anni e in cui sono nati vari sistemi di scrittura: nel 3400 a.C. nell’antica Mesopotamia, nel 3100 a.C. in Egitto (probabilmente in modo indipendente), nel 1200 a.C. in Cina (probabilmente in modo indipendente), nel I secolo a.C. in Mesoamerica (probabilmente in modo indipendente; Houston 2004, Daniels e Bright 1996, Martínez et al. 2006).

Dallo studio di ciò che ci resta di questi sistemi di scrittura, i linguisti hanno costruito una linea temporale nello sviluppo di tali sistemi. Sebbene tali sistemi impieghino simboli e regole differenti, le fasi di sviluppo astratte di tali sistemi possono essere illustrate con la seguente Storia generale:

pictures-phonetics

Oppure, se preferisci reificare la transizione:

pictures-transitional period-phonetics

In altre parole, i primi sistemi di scrittura iniziarono con un vocabolario di immagini, i cui simboli somigliavano agli oggetti o alle idee che rappresentavano. Questi simboli iniziarono gradualmente a rappresentare parole (cioè i suoni delle cose), non le cose stesse. Infine, iniziarono a rappresentare i suoni (privi di senso) che potevano essere usati per creare parole dotate di un significato, un po’ come le lettere di questo libro.

Ognuna di queste fasi, e persino le sottofasi al loro interno, sono come piccole lezioni di astrazione. Prendi semplicemente il Momento pictures nell’evoluzione di un sistema di scrittura. Nelle Storie seguenti, adattate da (Wallis e King 1908), possiamo vedere come i primi sistemi di scrittura sono passati da disegni più dettagliati a disegni più astratti.

Ecco come il simbolo stella parte come una stella, ma implode fino a diventare un semplice simbolo.

da una stella a un simbolo

Qui il simbolo per cerchio e sole fanno un tentativo di diventare più circolari prima di decidere di astrarsi completamente in qualcosa di diverso.

cerchio e sole

Qui, i dettagli nel simbolo per pioggia vengono quasi cancellati.

pioggia

E infine, il simbolo per pesce si avvizzisce in un semplice scheletro.

pesce

Senza tale astrazione, non sarebbe stato facile incidere questi sistemi di scrittura sulle tavolette di argilla che troviamo oggi. Astrazione, accorciamento, semplificazione: sono strumenti potenti. L’astrazione opera sia a livello dei simboli sia a livello delle storie.

Le lettere dell’alfabeto sono 26, ma con esse formiamo molte più parole. È certamente più facile apprendere solo 26 simboli e i loro suoni rispetto alla necessità di imparare un nuovo simbolo per ogni parola. Le prime versioni del cuneiforme sumerico avevano 1.500 simboli per 1.500 parole e richiedevano che gli scribi andassero alla edubba (scuola di scrittura), dove in genere studiavano per 12 anni solo per imparare a scrivere (History on the Net 2019).

I sistemi con una serie molto piccola di elementi costitutivi (per esempio i piccoli linguaggi come Scheme o gli umili strumenti come il pianoforte) possono comunque ricreare una grande espressività attraverso le combinazioni. L’idea di esprimere molto combinando pochi segni è uno strumento così utile nella progettazione del linguaggio moderno che non dovremmo avere problemi a credere che fosse altrettanto utile durante quella transizione chiave avvenuta così tante migliaia di anni fa: dai sistemi di scrittura pittorica a quelli fonetici.

Torna all’inizio.

4. Come creare flashcard per imparare e alleggerire la mente

Nel 1885 lo scienziato tedesco Hermann Ebbinghaus scoprì che distribuire l’apprendimento nel tempo è più efficace che apprendere gli stessi contenuti in un’unica sessione di studio.

Perché questa ricerca scientifica non sia stata adottata appassionatamente dalle istituzioni scolastiche del mondo è una domanda che è stata posta fin dagli anni Ottanta (Dempster 1988). E gli scienziati se lo stanno chiedendo ancora oggi (Kang 2016).

Negli anni Settanta, un giornalista scientifico tedesco di nome Sebastian Leitner sviluppò un sistema per lo studio su schede basato sulla ripetizione distanziata. Da allora questo sistema è stato più volte riprodotto come algoritmo software, consentendo agli utenti di creare schede (flashcard) digitali che il computer mostrerà loro a intervalli chiave. Qui inizieremo a creare la nostra implementazione.

Realizzare le schede è davvero la parte più difficile, quindi le dedicheremo più tempo. Giusto per scegliere un argomento di esempio del tutto casuale, realizzeremo flashcard di alcuni concetti tratti esattamente dal nostro libro.

Una scheda deve avere un fronte e un retro.

#lang dtc/complete
(image
  `(to-name powerful-act))

Mostreremo le cose diversamente, in seguito, ma per ora, questo produce la nostra ormai familiare immagine della Storia.

to-name powerful-act

Oppure, se vogliamo incorporare nei Momenti del testo (completo di spazi e punteggiatura), possiamo scrivere il contenuto del Momento tra virgolette:

#lang dtc/complete
(image
`("Denominare le cose"
    "Potente atto linguistico"))

Ora invochiamo il potere della denominazione:

#lang dtc/complete
(define naming-is-powerful-card
`("Denominare le cose"
"Potente atto linguistico"))
(image naming-is-powerful-card)

Esercizio: probabilmente è più utile visualizzare una flashcard come una animation. Trasformiamo quindi il codice precedente in un’animazione. E aggiungiamo altre carte denominate.

Eccone un altro:

#lang dtc/complete
(define cuneiform-year-card
`("Il sistema di scrittura cuneiforme risale al _____"
"3500 a.C. Mezzaluna fertile. Antica Mesopotamia."))
(image cuneiform-year-card)

Nota che per aggiungere al testo delle interruzioni di riga, puoi utilizzare il carattere \n ovunque all’interno delle virgolette. È un carattere equivalente alla pressione del tasto Invio. Il nome di questo carattere è newline.

Esercizio: aggiungi dei newline tra i frammenti di frase sul retro della carta precedente.

Supponi di non voler dimenticare il nome di quella cosa che hai appena imparato. Facciamone una flashcard.

#lang dtc/complete
(define adding-newlines-card
`("Come si crea un carattere \"newline\"?"
"Inserisci un \\n tra i caratteri \"."))
(image adding-newlines-card)

Hmmm. Che cosa sono tutte quelle barre rovesciate? Accade spesso nella progettazione di un linguaggio: decidiamo di creare qualcosa con un significato speciale, come \n, ma a volte vogliamo parlare di quel qualcosa senza innescarne il significato speciale.

Per esempio, il testo che decidiamo di incorporare nel codice (come "HELO"), deve essere racchiuso fra virgolette, ma a volte il testo stesso contiene virgolette. Quindi dobbiamo essere in grado di distinguere sintatticamente tra il simbolo con valore sintattico e il simbolo citato nel testo. Per poter fare ciò, si usa una barra rovesciata, backslash. Un backslash prima di un simbolo lo utilizza come una citazione letterale (ovvero così come è), non ne interpreta il significato speciale.

Esercizio: crea una flashcard per ricordare come si visualizzano i doppi apici, le virgolette:

#lang dtc/complete
(image
`("Come si visualizza\nil carattere delle\nvirgolette?"
    "____"))

Nota che questo esercizio è più complicato di quello che sembra. Vuoi che il risultato sia qualcosa come:

virgolette ed escape

Nota che il testo da visualizzare contiene sia le virgolette sia il backslash.

Suggerimento:: per creare un backslash, devi fargli precedere un altro backslash. Il backslash è un simbolo-uscita, di escape, per altri simboli, compreso lo stesso backslash.

Se hai trovato quell’ultimo esercizio fastidioso e speri di non dovervelo ricordare (cioè, che sia solo una bizzarria valida solo per i linguaggi di questo libro)… spiacenti. Queste regole per gestire il testo sono presenti in quasi tutti i moderni linguaggi di programmazione: Java, Ruby, Python, Racket e così via.

Esercizio: crea una flashcard che ti ricordi come produrre un backslash.

L’output dovrebbe mostrare due barre rovesciate, perché è così che si inserisce un backslash. Ma il codice che produce l’output potrebbe dover contenere più di due barre rovesciate.

virgolette doppio escape

Non abbiamo ancora dato un nome ai Momenti testuali, che iniziano e finiscono con una citazione. Queste sono chiamate stringhe, perché metaforicamente formano sequenze di lettere, numeri o segni di punteggiatura allineate insieme. Tutti i linguaggi moderni offrono un modo per gestire le stringhe. È ciò che consente al computer di dire "Helo" al mondo, senza avere la minima idea di cosa significhi la parola "Helo" o che sia errata. Le stringhe sono un tipo di dati: significano quello che significano.

Esercizio: crea una flashcard per ricordarti che cos’è una stringa.

Le stringhe e i caratteri di escape possono essere complicati, quindi non preoccuparti se all’inizio non verranno. Molto più importante è l’idea di base delle flashcard, per la quale potresti anche creare una flashcard, in questo modo:

#lang dtc/complete
(image
`("Qual è la Storia di base che descrive una flashcard?"
  `(front back)))

Sì, quella era una flashcard su una flashcard. Più in generale, poiché stiamo creando flashcard che riguardano la programmazione, potrebbe essere utile visualizzare il codice come un’immagine. Sarebbe strano avere un mazzo di flashcard di programmazione senza nemmeno una riga di codice:

#lang dtc/complete
(image
`("Come si trasforma una Storia di flashcard in un'immagine?"
,(image-code
`(image
        `(front back)))))

La sub-Storia qui sopra che inizia con image-code prende una Storia e ne ricava un’immagine, come il codice che avete scritto, con i colori e tutto il resto.

Esercizio: crea una flashcard per ricordarti come trasformare una Storia in un’animazione.

Definisci una flashcard per ricordarti come definire una nuova flashcard.

Del codice fortemente annidato può aumentare il carico cognitivo.

#lang dtc/complete
(image
`("Come uscire da una Storia non interpretata per\n
trasformare uno dei suoi Momenti in un'immagine?\n
Esempio: animate una flashcard con l'immagine\n
di un gatto sul retro."
(image-code
`(animate
        `(cat,(cat))))))

Le definizioni possono aiutare a ridurre il livello di annidamento. Ecco una riscrittura del listato qui sopra. Fa la stessa cosa, ma utilizza un flusso di definizioni, ognuna delle quali consente di utilizzare una forma più breve e concisa, più vicina al nostro linguaggio naturale. Ogni riga, presa da sola, diventa più facile da comprendere, il carico cognitivo ridotto dal potere della denominazione (inserendo le cose all’interno di un nome di tua scelta).

#lang dtc/complete
(define question
"Come uscire da una Storia non interpretata per\n
trasformare uno dei suoi Momenti in un'immagine?\n
Esempio: animate una flashcard con l'immagine\n
di un gatto sul retro.")
(define answer
(image-code
`(animate
`(cat,(cat)))))
(define animation-card
`(,question ,answer))
(image animation-card)

Le definizioni suddividono il codice in pezzi più piccoli, ognuno con un nome che consente di identificarlo e usarlo.

Impiega questo stile di scrittura a flusso di definizioni per definire una tua flashcard con una domanda sulla programmazione davanti e il codice corretto sul retro.

Cerca di diventare fluente in questo stile. La fluenza implica che sarai in grado di inventare nomi logici per i frammenti di codice che stai scrivendo. Potrebbe non sembrare molto, ma considera: un buon brainware deve essere in grado di tradurre nel migliore dei modi il linguaggio parlato in codice.

Questo non è affatto un cattivo aggiornamento del brainware di un programmatore, il cui compito è quello di compiere tale traduzione. Inoltre, è uno stile che aiuterà chi leggerà il tuo codice.

Hai appena imparato a scrivere del codice per creare flashcard digitali sulla programmazione, una tecnica che può essere utilizzata da insegnanti o studenti di programmazione. Inoltre, la stessa tecnica funziona anche per ogni altro tipo di flashcard.

Questo è il potere offerto dagli strumenti astratti. Più sono astratti, più è probabile che possano essere applicati da più persone a più cose.

Progetta il tuo mazzo

Adesso sappiamo come creare flashcard, `(front back), e visualizzarle, con (image `(front back)) o (animate `(front back)). Siamo pronti per creare un mazzo di carte.

Se una Storia con due Momenti descrive una singola flashcard, come può essere una Storia che descrive un mazzo di flashcard? Una soluzione molto naturale consiste semplicemente nel rendere la Storia di una flashcard una sottostoria (o un Momento) di una grande Storia per il mazzo:

#lang dtc/complete
`((front back)
  (front-2 back-2))

È proprio così. Per farti studiare un mazzo di flashcard, abbiamo creato un comodo animate-deck, che è come animate, ma introduce una pausa e ti consente di riflettere sulla flashcard finché non premi un tasto per proseguire.

#lang dtc/complete
(animate-deck
`((front back)
    (front-2 back-2)))

Esercizio: esegui il seguente esperimento in omaggio al metodo scientifico. Imposta un timer. Copia il seguente codice (formato da 15 flashcard), oppure puoi andare alla fine della pagina della nostra documentazione e copiarlo/incollarlo (ma in inglese).

Inizia a studiare le flashcard. Ma seriamente, senza barare. Quanti minuti hai impiegato prima di poter rispondere correttamente a tutte le schede? Quante volte hai eseguito il programma?

#lang dtc/complete
(define dtc-trivia-deck
`(("Anno del primo studio fMRI sulla comprensione dei programmi?"
"2014")
("Il linguaggio dei segni condivide quale \"modalità\" o
\"canale\" con i linguaggi per computer? "
"La modalità o canale visuale-spaziale")
("La più antica storia-in-una-storia risale al?"
"Antico Egitto (dal 18° al 16° secolo a.C.).
I cinque figli del faraone Cheope raccontano cinque storie di magia
e miracoli. ")
("Sia il backslash sia il backtick hanno
un significato astratto simile. Qual è?"
"Fare un \"escape\" di ciò che segue.
Il backslash precede le virgolette o un altro backslash.
Il backtick invece precede una storia
letterale (non interpretata)")
("La comprensione della programmazione, la comprensione del linguaggio
dei segni e la lettura del testo si è dimostrato che attivano
quale parte del cervello?"
"L'area di Broca.")
("In una Storia che descrive una flashcard,
quanti Momenti vi sono?"
2)
("In una Storia che descrive una scacchiera da tris,
quanti Momenti vi sono?"
9)
("In una Storia che descrive un mazzo di flashcard,
quanti Momenti vi sono?"
"Dipende. Da quante schede vi sono nel mazzo.")
("In una Storia che descrive una partita a scacchi,
quanti Momenti vi sono?"
"Dipende. Tanti quante sono le mosse della partita.")
("In una Storia che descrive una partita di tris,
quanti Momenti vi sono?"
"Dipende. Tanti quante sono le mosse della partita.
Ma non più di 9 e non meno di 3.")
("Scrivete un semplice programma che anima un mazzo
di due schede, entrambe con immagini di gatti
sul retro."
(image-code
`(animate-deck
`("Che aspetto ha il primo gatto su YouTube?"
,(first-viral-cat))
`("Che aspetto ha una vecchia foto di un gatto?"
,(cat))))))
("Scrivete un semplice programma che anima
i numeri da 1 a 10."
(image-code
`(animate
`(1 2 3 4 5 6 7 8 9 10))))
("Scrivete un semplice programma che mostri l'immagine di una Storia
i cui tre momenti sono tre immagini di gatti."
(image-code
`(image
`(,(cat),(edison-cat),(first-viral-cat)))))
("Scrivete un programma che mostri l'immagine di una Storia
il cui primo Momento è una stringa e il cui
secondo Momento è una scacchiera."
(image-code
`(image
`("Che aspetto ha lo stato iniziale
di una scacchiera? "
,(napoleon/turk 1)))))))
(animate-deck dtc-trivia-deck)

Il sistema

Il passaggio finale del sistema Leitner è proprio quello che in realtà lo rende il sistema Leitner. Invece di organizzare le tue schede in un unico mazzo, devi organizzarle in mazzi da studiare con frequenze differenti. E poi riorganizzare le schede in funzione di quelle che ricordi e quelle che invece devi ancora imparare.

Torna all’inizio.

5. Come approfondire quanto abbiamo imparato con il coding

  • How People Learn. Un libro che dovrebbe essere una lettura obbligatoria per chiunque sia dotato di un cervello. È ciò che più si avvicina a un manuale di istruzioni.
  • Learning How to Learn. Un corso online che ti renderà più efficace nell’apprendimento, in qualsiasi ambito.

Per un trattato sull’uso della teoria sull’acquisizione di un secondo linguaggio per l’insegnamento e apprendimento della programmazione, consigliamo l’eccellente articolo di Scott R. Portnoff: The Introductory Computer Programming Course Is First and Foremost a Language Course.

Consigliato anche: acquisire fluenza in un’altra lingua, completamente nuova, una fluenza che non hai acquisito gratis nell’infanzia. L’apprendimento delle lingue da adulti non è facile. La fatica che impiegherai ti insegnerà di più sull’acquisizione di un secondo linguaggio di quanto questo libro abbia mai potuto fare.

A proposito, considera il linguaggio dei segni. Come i nostri linguaggi di programmazione, è visuale. Impararlo amplierà anche la tua definizione del significato stesso della parola linguaggio.

I prossimi passi: linguaggi da imparare

Se vuoi prendere la strada meno battuta e diventare programmatori con idee differenti rispetto allo sviluppatore medio, cerca di diventare fluente nei seguenti linguaggi:

Ma attenzione! Quando sarai fluente in questi linguaggi, non capirai più perché mai qualcuno dovrebbe incontrare difficoltà a capire linguaggi come Python, Java o C. Faticherai, quindi, a entrare in empatia con i principianti.

I prossimi passi: programmazione

Se vuoi studiare davvero la Computer science (non solo un linguaggio, ma qualcosa di più), hai a disposizione molti percorsi. Ti consigliamo alcuni dei nostri preferiti, che abbiamo visto impiegare più volte con profitto dai principianti. Ne escono sempre cambiati in meglio.

  • How to Code: Simple Data – Un corso online offerto dalla University of British Columbia attraverso la piattaforma edX. Potete partecipare al corso online gratuitamente. Raccomandiamo anche il secondo corso della serie, How to Code: Complex Data.
  • How To Design Programs – Uno dei migliori libri di testo introduttivi alla computer science. È gratuito. Non limitarti a leggerlo. Svolgi gli esercizi tutte le volte che sarà necessario per sentirti fluente. Suggerimento: usa le flashcard.
  • Beautiful Racket – Un libro online gratuito sulla creazione di nuovi linguaggi di programmazione.
  • The Little Schemer – Un libro che insegna a programmare tramite il dialogo socratico. Platone ne sarebbe orgoglioso.

I prossimi passi: ingegneria del software

Dalle dimensioni del manufatto software, dipende il tipo di programmazione: la microprogrammazione (poche righe di codice) richiede un insieme di conoscenze differente dalla miniprogrammazione (alcune centinaia di righe) e dalla macroprogrammazione (migliaia, a volte molte migliaia, di righe).

Lo studio di come noi programmatori dobbiamo scrivere, comportarci e interagire a vari livelli di complessità si chiama ingegneria del software. Ecco alcune risorse.

  • The Mythical Man Month affronta lo strano paradosso secondo il quale l’aggiunta di più programmatori a un progetto rallenta le cose. Aumentano le ore-persona, calano i risultati.
  • No Silver Bullet è un saggio che affronta il fatto che a volte i progetti software diventano mostri indistruttibili.

I prossimi passi: cultura da hacker

Non dovremmo mai dimenticare che essere programmatori dipende più da noi che dalle aziende per le quali potremmo finire per lavorare. È una faccenda personale, come la libertà di parola, l’espressione di sé: è un’attività autoriale. Noi autori torniamo frequentemente a rileggere queste risorse, per ricordarci chi siamo.

I prossimi passi: storia

Se hai apprezzato lo scorcio storico offerto da questo libro, abbiamo per te alcuni consigli.

  • Breaking Smart – Season 1 – Una serie di saggi online sul passato e sul futuro dell’ingegneria del software. Leggili, lasciati ispirare, cambia il mondo.
  • Computerphile e Numberphile – Canali YouTube e altro con una vasta selezione di affascinanti video storici e tecnici.
  • Extra Credits – Un canale YouTube con una grande quantità di cose interessanti. Il loro primo video sulla storia della scrittura è un ottimo punto di partenza. I loro video sui giochi e sulla progettazione di giochi saranno di grande interesse per i programmatori. La loro focalizzazione sul gioco rende le loro analisi storiche ancor più adatte ai programmatori.

Dare un nome alle cose: computer science

Ora apriremo il sipario e proveremo a dare un nome ad alcune delle idee che abbiamo affrontato solo tangenzialmente in questo libro. Le denomineremo esplicitamente, in modo da aiutarti a trovarle, d’ora in poi.

  • Programmazione Orientata al Linguaggio (LOP). Concetto introdotto per la prima volta negli anni Novanta, è un’idea potente ed emergente che ha il potere di trasformare il modo in cui si impara a programmare e si impara anche a comunicare fra programmatori professionisti. È una visione del mondo che vale la pena di adottare. Il linguaggio Racket è all’avanguardia in questo impegno.
  • Teoria del Calcolo. Questo ramo della Computer science esorta a porsi domande. Che cos’è il calcolo? Chi è interessato alla completezza di Turing dovrebbe occuparsi di gemme simili. Gödel, Escher, Bach: An Eternal Golden Braid è uno dei migliori libri mai scritti sull’argomento.
  • Termini vari.
    – L’idea di una funzione la cui definizione contiene se stessa è chiamata funzione ricorsiva.
    – Lo stile di programmazione che prevede l’estensione dei linguaggi tramite la creazione di nuove funzioni è chiamato programmazione funzionale.
    – I linguaggi con molte parentesi sono spesso chiamati, cumulativamente, in stile Lisp. Scheme è un Lisp.
    – Scrivere programmi che leggono altri programmi si chiama scrivere un interprete o scrivere un compilatore o creare un linguaggio di programmazione.
    – Scrivere programmi che producono altri programmi si chiama metaprogrammazione. Ma va’…
    – L’idea di una gerarchia di linguaggi che contiene linguaggi sempre più difficili da analizzare è stata definita formalmente da Chomsky. Vedi Gerarchia di Chomsky.
    – Quelle che abbiamo chiamato Storie si chiamano anche espressioni o, in Lisp, s-espressioni. La definizione però è la stessa: un elenco di cose tra parentesi.

Dare un nome alle cose: filosofia della mente

  • L’idea che menti e calcoli si possano estendere nell’ambiente è chiamata mente estesa o conoscenza distribuita. Cognition in the Wild è un bellissimo libro sull’argomento, che esamina complessi sistemi cognitivi/computazionali che coinvolgono più menti umane e i loro numerosi mezzi di comunicazione.
  • L’idea che il linguaggio influenzi il pensiero si chiama Ipotesi Sapir-Whorf.
  • L’idea di creare un computer in grado di ingannare gli esseri umani ed essere considerato una persona intelligente è chiamata fare in modo che una macchina superi il test di Turing. È una definizione di macchina intelligente.
  • L’idea che una macchina in grado di ingannare gli esseri umani possa non essere intelligente è discussa in una famosa risposta a Turing chiamata The Chinese Room.

Dare un nome alle cose: scienza dell’apprendimento

  • L’apprendistato cognitivo è sia una pratica sia un campo di ricerca relativo all’insegnamento, con particolare attenzione al modo in cui i docenti possono modellare i comportamenti cognitivi dei loro allievi.
  • Le comunità di pratica sono l’espressione dell’idea che l’apprendimento extrascolastico avvenga (e forse dovrebbe avvenire) nelle comunità di pratica: reti di professionisti variamente qualificati. Tali comunità possono (e dovrebbero) essere rivolte ai docenti di Computer science. Secondo un modello, un docente master geograficamente localizzato aiuta a formare altri docenti nella sua area geografica. I docenti che vogliono creare un ambiente in cui diventano sempre più fluenti con l’andar del tempo, si consiglia di creare una rete di questo tipo, attorno a loro geograficamente o virtualmente (con l’aiuto di Internet).

Torna all’inizio.

Epilogo

Grazie per averci letto. In qualsiasi momento, per qualsiasi motivo, puoi trovarci su Don’t Teach Coding.

Torna all’inizio.

Questo articolo richiama contenuti da Insegnare il coding.

Immagine di apertura di Robo Wunderkind su Unsplash.

L'autore

  • Stephen R. Foster
    Stephen R. Foster è ricercatore, autore e co-fondatore di diverse imprese sociali il cui obiettivo è spiegare a formatori di ogni tipo come insegnare il coding in modo efficace. Esperto nella programmazione di videogiochi e nell'educazione informatica, ha svolto ricerca scientifica, creato soluzioni tecnologiche per insegnanti e studenti e avviato startup educative e organizzazioni senza scopo di lucro.
  • Lindsey D. Handley
    Lindsey D. Handley è insegnante, ricercatrice, autrice e co-fondatrice, insieme a Stephen R. Foster, di ThoughtSTEM e MetaCoders.org, organizzazioni che hanno aiutato centinaia di migliaia di persone nell'apprendimento dei fondamenti della programmazione.

Vuoi rimanere aggiornato?
Iscriviti alla nostra newletter

Novità, promozioni e approfondimenti per imparare sempre qualcosa di nuovo

Gli argomenti che mi interessano:
Iscrivendomi dichiaro di aver preso visione dell’Informativa fornita ai sensi dell'art. 13 e 14 del Regolamento Europeo EU 679/2016.

Corsi che potrebbero interessarti

Tutti i corsi
Comunicazione-digitale-food-wine-cover Corso Online

Comunicazione digitale Food & Wine - Iniziare Bene

Per il settore enogastronomico le reti sociali sono una grande opportunità per raccontarsi e trasmettere la qualità di un prodotto o di un locale. Se vuoi capire come farlo al meglio, il corso di Barbara Sgarzi può aiutarti.

99,00

con Barbara Sgarzi

machine-learning-per-tutti-cover Corso Online

Machine Learning & Big Data per tutti

Vuoi scoprire cosa significano Machine Learning e Big Data e come i computer possono realmente imparare in maniera automatica? Questo corso di Andrea De Mauro fa al caso tuo.

con Andrea De Mauro

corso-data-governance Simone Aliprandi Corso Online

Data governance: diritti, licenze e privacy

I dati sono ovunque intorno a noi ma per poterli utilizzare in sicurezza bisogna confrontarsi con temi complessi che riguardano licenze, proprietà intellettuale e privacy. Se non ti senti sicuro o hai paura di prendere la decisione sbagliata, il corso di Simone Aliprandi fa per te.

con Simone Aliprandi


Libri che potrebbero interessarti

Tutti i libri

Insegnare il coding

La guida per formare i programmatori del futuro

28,30

41,89€ -32%

23,66

24,90€ -5%

16,99

di Stephen R. Foster, Lindsey D. Handley


Articoli che potrebbero interessarti

Tutti gli articoli