# Dietro il coding/A che serve il coding?

Dietro il coding
Copertina Tutti i moduli · Sviluppo
    CopertinaDietro il coding/Copertina
* Che cos'è il codingDietro il coding/Che cos'è il coding
* Perché è così importante?Dietro il coding/Perché è così importante?
* Una valutazione storicaDietro il coding/Una valutazione storica
* Come si parla del coding?Dietro il coding/Come si parla del coding?
* Gli schieramenti in campoDietro il coding/Gli schieramenti in campo
* Primo Intermezzo: che significa opensource?Dietro il coding/Primo Intermezzo: che significa opensource?
* A che serve il coding?Dietro il coding/A che serve il coding?
* Chi può insegnare il coding?Dietro il coding/Chi può insegnare il coding?
* Secondo Intermezzo: le differenze tra linguaggiDietro il coding/Secondo Intermezzo: le differenze tra linguaggi
* Che linguaggio?Dietro il coding/Che linguaggio?
** AliceDietro il coding/Che linguaggio?#Alice
** Squeak/EtoysDietro il coding/Che linguaggio?#Squeak.21_.2FEtoys
** Snap!Dietro il coding/Che linguaggio?#Snap!
** CatrobatDietro il coding/Che linguaggio?#Catrobat
** OpenRobertaDietro il coding/Che linguaggio?#OpenRoberta
** Minecraft: Education EditionDietro il coding/Che linguaggio?#Minecraft: Education Edition
** Apple Swift PlaygroundDietro il coding/Che linguaggio?#Apple Swift Playground
** ToonTalkDietro il coding/Che linguaggio?#ToonTalk
** LinotteDietro il coding/Che linguaggio?#Linotte
* Il modello didattico dietro ScratchDietro il coding/Il modello didattico dietro Scratch
* Come va praticato il CodingDietro il coding/Come va praticato il Coding
* Un po' di storia…Dietro il coding/Un po' di storia…
** B.A.S.I.C.Dietro il coding/Un po' di storia…#B.A.S.I.C.
** LOGODietro il coding/Un po' di storia…#LOGO
** NETLOGODietro il coding/Un po' di storia…#NETLOGO.5B1.5D
** STARLOGODietro il coding/Un po' di storia…#STARLOGO.5B2.5D
** SMALLTALKDietro il coding/Un po' di storia…#SMALLTALK
* E oggi?Dietro il coding/E oggi?
* Come potrebbe funzionare davveroDietro il coding/Come potrebbe funzionare davvero
* Suggerimenti di letturaDietro il coding/Suggerimenti di lettura
Modifica il sommario
Tutti d'accordo, il coding è divertente. Ma a che serve?Un’attività didattica non può essere raccomandata solo perché è “carina” e facile, perché docenti e discenti si divertono. Deve avere uno o più obiettivi. Quali?
Ne ho raccolta una lista disordinata prendendo qua e là; alcuni secondo me sono condivisibili, altri meno. Alcuni sono molto alti, e forse poco raggiungibili; altri del tutto pratici ma chissà quanto sostenibili nel tempo. Non sono omogenei e anzi sullo sfondo si intravedono ideologie molto diverse.
Ma è fondamentale che chi organizza l’attività ce li abbia chiari, altrimenti si muove casualmente, spreca tempo ed energie e rischia pure di fare danni.

### Quello di sviluppare il Computational Thinking

La questione è spinosa. Intanto non è facile definire il pensiero computazionale. Il termine è stato usato da Papert ma è diventato famoso in seguito ad un breve scritto di Jeannette Wing, Microsoft Research.
Computazionale significa “calcolabile”. Una funzione è computabile se esiste un algoritmo – cioè una serie di passaggi predefiniti, eseguibili da una macchina senza necessità di intervento esterno – che la calcola in un tempo finito. Per chi volesse saperne di più, il libro di Batini citato più sopra lo spiega con un dettaglio maggiore e con termini corretti.
Ma insomma è chiaro che il pensiero computazionale non è sinonimo di “pensiero logico”. Il pensiero computazionale ha a che fare con obiettivi, risorse e vincoli. Imparare il pensiero computazionale serve ad affrontare problemi con un approccio molto concreto che tende a evitare quelli irrisolvibili, a individuare le soluzioni che presumibilmente siano praticabili con le risorse disponibili oggi, ma anche sostenibili nel tempo. Se si impara a valutare i problemi, a stimare le risorse, a definire i vincoli, con i computer, poi si potranno applicare le competenze apprese anche in situazioni diverse.
Però a volte sembra che si faccia confusione tra un’interpretazione che abbiamo chiamato “culturale” e una “metacognitiva”:
Non è proprio quello che dice Wing. Ma in ogni caso, c’entra poco con la programmazione.
Non si scrivono programmi solo per risolvere problemi, e programmare non è solo implementare algoritmi in un certo linguaggio di programmazione. L'ideazione (appunto, la creatività) serve quanto il rigore, altrimenti staremmo da anni a risolvere gli stessi problemi in maniera più efficiente.
Inoltre confesso che mi pare discutibile l’idea che sia davvero desiderabile introdurre il pensiero computazionale come competenza base, come maniera generale di affrontare la vita. Affidarsi solo al pensiero computazionale mi pare indizio di una visione davvero molto funzionalista del mondo.
In ogni caso: tanti anni fa un ricercatore del CNR, Giovanni Lariccia, proponeva nelle scuole un approccio didattico all’informatica senza computer (“carta e matita”).
Lo faceva sia perché di computer, onestamente, ce n’erano pochi, sia perché così era possibile collegare l’informatica all’esperienza quotidiana. Varrebbe la pena di andarsi a rileggere i suoi libri (li trovate in fondo).

### Quello di preparare le nuove generazioni ai nuovi lavori?

Questa è una delle argomentazioni che sembra più difficile da confutare.
Negli USA, entro il 2022 ci saranno 2.600.000 posti di lavoro nel settore dell’informazione; di questi, 750.000 per i programmatori, con una crescita del 22,8 %. Con le parole di un articolo di qualche anno fa di Rebecca Lindegren.
“[...] This means that U.S. companies would be forced to outsource valuable coding jobs to India, China, Eastern Europe, and other countries with growing IT sectors, while thousands of Americans remain unemployed or stuck in low-skilled, low-wage positions”
Quindi bisogna cominciare subito a preparare le future generazioni di programmatori. Purtroppo (o per fortuna) non c’è nessuna connessione diretta tra un ambiente educativo come Scratch e gli ambienti di programmazione professionali (come quello mostrato prima). E vista la distanza che c’è tra concetti, modelli, strumenti di dieci anni fa e quelli di adesso, la pretesa che insegnare oggi quello che sarà utile tra dieci anni è davvero troppo ambiziosa.
Fra l’altro: l’informatica non è solo programmazione. Ci sono (forse) milioni di posti di lavoro in attesa nel comparto informatico, là nel 2022, ma solo un terzo circa è riservata ai programmatori propriamente detti, mentre la maggioranza è lasciata a tutti gli altri lavoratori del settore (analisti, progettisti, sistemisti, grafici, esperti di reti, di sicurezza, commerciali, docenti, installatori, …).
Ci possono anche essere ragioni un po' meno "nobili". Per esempio, una generazione di ragazzini che sono in grado di produrre in poche ore un’app con un certo linguaggio, su un certo sistema operativo, significa da un lato un serbatoio immenso da cui andare a pescare i migliori developers senza doversi assumere l’impegno e la responsabilità di formarli adeguatamente; e dall’altro un enorme mercato futuro per quelle app, per quel sistema operativo…

### Quello di far costruire ai ragazzi delle storie in maniera alternativa alla scrittura?

Bene, è un’attività molto utile e interessante, ma che si può fare benissimo in altri modi, dal disegno al teatro, dai fumetti al video. Perché proprio col coding? In qualche modo, però, questa è la motivazione che condivido di più, ma per un motivo diverso. Programmare – progettare e scrivere qualsiasi programma – è un altro modo di raccontare una storia: inventare un contesto, degli attori, un plot. Sapere creare delle storie (o saperle smontare) è una competenza significativa in tanti campi, e mostrare come questi campi non siano poi così lontani è un obiettivo sensato. Un po’ paradossalmente: se a scuola si insegnasse diffusamente e coerentemente a costruire storie, allora farlo scrivendo un programma sarebbe un’applicazione utile. Però di attività di costruzione in classe di problemi di matematica, o di scenari storici alternativi, non ne vedo tante in circolazione. "Inventare le storie" mi fa subito pensare alla Grammatica della Fantasia di Gianni Rodari:
Qui la creatività viene riconosciuta come universale, naturale (ma educabile) e soprattutto possibile fonte di soddisfazione personale. Siamo in un altro mondo, spaziale e temporale, rispetto alla creatività come "furbizia", come ingegno applicato a risolvere un problema. Tuttavia questi due sensi di creatività sono evidentemente apparentati e bisognerebbe ricordarsi di tenere conto di entrambi.

### Quello di vaccinare i giovani?

Contro quale virus? Contro lo sfruttamento indebito dei loro dati raccolti da un’app o da un social network system, o contro la pratica di spacciare come utilities gratuite programmi e siti che hanno scopi diversi da quelli dichiarati.
Ad esempio, sempre con le parole di Rebecca Lindegren:
Questo passaggio dell’articolo è, a mio avviso, il più interessante. Senza la capacità di programmare, i bambini diventeranno passivi consumatori etc etc. Con la capacità di programmare invece saranno vaccinati e potranno interagire significativamente con il mondo virtuale che li circonda.
D'accordo. Ma va definito cosa intendiamo per “capacità di programmare”. Un’attitudine? Un’esperienza, anche limitata? Una competenza specifica e verificata da terzi?
Stiamo parlando della buona abitudine di leggere il codice sorgente di ogni programma che si utilizza? Della curiosità verso ogni nuova soluzione che viene presentata, curiosità che non si contenta di un’etichetta o di una descrizione ma vuole arrivare a capire come funziona oggi e come funzionerà domani? O della capacità di progettare, sviluppare e manutenere soluzioni alternative?
Sono “capacità” completamente diverse. Si raggiungono, e si perdono, in tempi diversi e in modi diversi. Alcune di queste non sono generiche, ma possibili solo in connessione con certi contesti tecnologici e legali, primo fra tutti quello dell’apertura del codice sorgente.
La seconda cosa da notare è che la possibilità di interagire pienamente con la realtà (virtuale, nel senso dell’insieme di dispositivi, reti, server, …) non sembra dipendere solo da queste competenze. Anche qui, andrebbe forse ricordato che, oggi molto più di ieri, ognuno di noi ha comprato già preinstallati o consentito a installare sui propri dispositivi digitali – pc, tablet, smartphone, televisori, frigoriferi,… – centinaia di programmi del cui funzionamento effettivo non possiamo sapere quasi nulla, se non quello che esplicitamente ci dicono i produttori.
Il codice sorgente di questi programmi (che a volte chiamiamo “applicazioni” o amichevolmente “app” per farceli sembrare meno complessi e e pericolosi) non è disponibile per la lettura o la modifica. Sapere programmare non aiuta minimamente a evitare che raccolgano i nostri dati e ne facciano un uso non previsto (da noi). Sapere programmare non ci permette di evitare di usarli: alzi la mano chi si può permettere di non avere un account gmail o una pagina FB. Senz’altro non ci aiuta a modificarli, a impedire che svolgano azioni se non illecite, almeno non gradite.
Interagire significativamente con gli altri tramite app e reti, ricevere e fornire dati – filtrandoli – richiede delle competenze, che oggi fanno sicuramente parte di quelle di base di ogni cittadino. Ma allora non è sufficiente un pomeriggio di manipolazione di Scratch, serve anche qualche informazione in più. Informazione che in effetti né la scuola dell’obbligo, né quella superiore, né l’università consegnano. Occorre parlare anche di altro: di codice aperto e licenze, di privacy, di diritti, di mercato dei dati, di equilibrio tra gratuità e sostenibilità. C’è da affrontare un discorso vasto sul ruolo egemone di Google e di Facebook, sul diritto all’anonimato o all’oblio.
Niente che non si possa spiegare ai bambini, con qualche attenzione, ma vorrei almeno vedere qualche passo in questa direzione critica.

### Quello di dare ad ognuno le competenze minime per scriversi un programma per risolvere i propri problemi?

Che so: una app per ricordarsi di prendere le medicine. Una che mi dice come devo riciclare il tetrapak. Questo sarebbe un bell’obiettivo pratico, utile almeno quanto far sì che uscendo dalla scuola un ragazzo sappia sostituire un interruttore, curarsi una ferita, fare la dichiarazione dei redditi o cambiare l’olio alla macchina (temo che non sia così). Un recupero delle Applicazioni Tecniche. Una riappropriazione dell'universo di macchine in cui siamo immersi.
Ma allora il linguaggio da proporre dovrebbe essere qualcosa in grado di produrre programmi che girano su PC, smartphone, tablet, su sistemi operativi diversi. E di nuovo, occorre quanto meno spiegare perché con certi elettrodomestici si può "parlare" (perché adottano uno standard di comunicazione aperto) e con altri no.

### Quello di affrontare la didattica di qualsiasi disciplina in maniera costruttiva?

Nessuno più di me sarebbe d'accordo, e tra l’altro questo è uno degli obiettivi dichiarati di Scratch. Qui però il centro non è la tecnologia, è la didattica. Che un ambiente di apprendimento debba essere aperto, modificabile, che si capisca meglio qualcosa se si sperimenta e si costruisce, dovrebbero essere tutte premesse che una didattica moderna accetta senza troppi problemi (ma probabilmente nei fatti le cose stanno diversamente). Ma allora deve essere chiaro che il punto non è né divertirsi, né imparare le iterazioni, ma comprendere il funzionamento di una cellula o la struttura di un romanzo. Cioè: l'obiettivo è la didattica della biologia, non quella della programmazione. E direi anche che non serve per forza partire sempre da zero: si potrebbe iniziare interagendo con simulazioni già preparate e poi modificarle, estenderle, riapplicarle altrove.
Come si vede, di obiettivi possibili ce ne sarebbero molti. Alcuni raggiungibili, altri meno.
Ma servono revisioni dei programmi (quelli scolastici) e risorse umane preparate.
Ci sono?

## Note

* ↑ http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing06.pdf
* ↑ http://www.bls.gov/news.release/pdf/ecopro.pdf
* ↑ http://opensource.com/education/13/4/teaching-kids-code
* ↑ http://opensource.com/education/13/4/teaching-kids-code