Corso di introduzione alla programmazione per bambini in età scolare.
1 Premessa
Il mondo moderno è immerso nella tecnologia. Oggi sarebbe impensabile pensare ad una vita slegata dagli strumenti tecnologici che usiamo tutti i giorni, che siano semplici interruttori o automobili. I computer oggi sono ubiquitari, che ce ne accorgiamo o no; sono nelle nostre lavatrici, nelle automobili, negli aerei, nei telefoni fino dal più semplice e non smart.
La popolazione è sostanzialmente divisa in nativi e non nativi digitali, persone che hanno potuto accedere al computer in età adulta o post-adolescenziale e persone che sono nate e si sono formate in piena rivoluzione informatica. Gli approcci delle due fasce di popolazione sono sostanzialmente diversi: La prima generalmente possiede una certa diffidenza naturale verso il mezzo informatico, mentre la seconda lo usa con naturalezza e propensione.
Il computer è un superbo mezzo di comunicazione, di lavoro e svago; sempre più potente ed inserito nella vita normale. È un mezzo, per cui né buono né cattivo, dipende solo dall'uso che ne viene fatto. Il nativo digitale a causa della sua naturalezza all'uso del mezzo informatico è oggi un soggetto potenzialmente a rischio. La maggior parte di noi è consapevole, per esempio, dell'approccio passivo alla televisione; della comunicazione a senso unico che porta e di come in taluni casi questa informazione possa essere manipolata e non corretta. Nessuno di noi però, è ancora propriamente consapevole dei pericoli insiti nell'uso acritico e non corretto dei nostri piccoli ed ubiquitari computer.
Abbiamo telefoni intelligenti, tablet o notebook che portiamo ovunque andiamo.
I nostri figli li hanno, mini e microcomputer perennemente connessi ad Internet, dove possono fruire più o meno liberamente dei contenuti più disparati.
Vietare non è la soluzione, impedirgli di usarli non è la soluzione ma solo un tampone temporaneo che presto imparerà a scavalcare.
Si dovrebbe insegnare ai nostri figli, nativi digitali, l'approccio consapevole ed informato.
Gli approcci agli insegnamenti informatici vanno rivisti e va rivista l'età in cui iniziare.
Le lezioni di avviamento al computer che venivano e vengono utilizzati oggi non sono più adatti per i nativi digitali. Accendere un computer e lanciare una applicazione per i nostri figli è naturale come per noi accedere il televisore e cambiare canale. Usare un gioco, che è un software, è naturale per loro.
Passivamente naturale, il mito della interattività è solo un percorso preordinato tra tanti progettati a monte dell'utente e si è passivi nell'illusione di non esserlo.
Bisogna passare dalla semplice visione strumentale e alfabetizzazione informatica alla fase di acquisizione delle competenze digitali.
Per questo motivo, si dovrebbe insegnare la programmazione dei computer ai bambini in età scolare. Non per creare una generazione di programmatori ovviamente, ma per rendere delle persone consapevoli ed attive di fronte al mezzo informatico.
Programmare un computer è affrontare e risolvere problemi, problem posing and solving, è imparare a ordinare i pensieri per poter realizzare le idee. L'approccio può essere multidisciplinare e il metodo applicabile in molti campi e non necessariamente informatici. Lo studio della programmazione è quindi, oltre alla sua mera applicazione, una formidabile palestra di logica che guida il ragazzo attraverso un percorso che passa per l'analisi, la scomposizione dei problemi, la verifica dei risultati e l'organizzazione del pensiero.
Imparare a programmare, insegna la collaborazione e la condivisione (se insegnata nella maniera adeguata) tramite un processo di trial and error e permette allo studente di esprimersi in molti modi. L'approccio produttivo ed anche ludico, potrebbe permettere di attirare e coinvolgere studenti problematici e creare interesse.
Quando i bambini creano un progetto come questo, imparano anche a programmare, ma, cosa ancora più importante, programmano per imparare. Perché imparando a programmare, imparano mille altre cose, aprendo nuove opportunità di apprendimento. Ripeto, è utile fare un'analogia con la lettura e la scrittura. Quando si impara a leggere e scrivere, si aprono nuove opportunità per imparare molte altre cose. Quando si impara a leggere, allora si potrà anche leggere per imparare. E imparare a programmare è la stessa cosa. Se si impara a programmare, allora si potrà anche programmare per imparare. Ora, alcune cose che si imparano sono piuttosto ovvie. Si impara qualcosa di più su come funzionano i computer. Ma questo è solamente il punto di partenza. Quando si impara a programmare, si apre la possibilità di imparare molte altre cose.
As kids are creating projects like this, they're learning to code, but even more importantly, they're coding to learn. Because as they learn to code, it enables them to learn many other things, opens up many new opportunities for learning. Again, it's useful to make an analogy to reading and writing. When you learn to read and write, it opens up opportunities for you to learn so many other things. When you learn to read, you can then read to learn. And it's the same thing with coding. If you learn to code, you can code to learn. Now some of the things you can learn are sort of obvious. You learn more about how computers work. But that's just where it starts. When you learn to code, it opens up for you to learn many other things.
Mitch Resnick (http://www.ted.com/talks/mitch_resnick_let_s_teach_kids_to_code/transcript)
È nel contempo importante, insegnare come l'approccio al software ed alla sua produzione debba essere morale spingendo lo studente verso il concetto di Open Source, spostando il valore dal prodotto in sé al produttore (il programmatore); combattendo la visione monopolistica delle grandi software house o software service verso un approccio sostanziale alle tipologie software (anche solo nel rispetto delle direttive ministeriali in materia di software da utilizzare nelle pubbliche amministrazioni).
Non va dimenticato inoltre, all'atto pratico, come in futuro la richiesta di programmatori diventerà altissima e quindi si potrebbe fornire agli studenti uno strumento in più. Esistono numerose esperienze, specialmente negli U.S.A., di insegnamento della programmazione a bambini in età scolare (k-12); mentre per l'Europa si potrebbero citare le esperienze fatte in UK ed Estonia.
1.1 Alcuni ambienti liberi per l'insegnamento della programmazione a bambini e ragazzi.
Per avvicinare gli studenti alla programmazione informatica esistono già numerosi strumenti con un approccio più o meno visuale. In questa sede si prenderanno in considerazione solo strumenti Open Source per i motivi espressi sopra.
1.1.1 Scratch
È una piattaforma sviluppata al MIT (Massachusetts Institute of Technology) nel Lifelong Kindergarten Group (http://scratch.mit.edu/) e progettata specificatamente per bambini di età scolare e prescolare. L'approccio è totalmente visuale con blocchi logici colorati e di facile comprensione. È adatto per insegnare la strutturazione del flusso delle istruzioni rendendola facilmente identificabile con risultati rapidi e non frustranti per il bambino. Ne esistono attualmente due versioni una scritta in Smalltalk (http://scratch.mit.edu/scratch_1.4), quella originale, mentre una seconda fruibile online e scritta in ActionScript il cui runtime è Adobe Flash/Air e quindi non aderente completamente alla filosofia Open Source (http://scratch.mit.edu/projects/editor/?tip_bar=getStarted) o scaricabile (http://scratch.mit.edu/scratch2download/).
Scratch ha dato vita a numerosi progetti simili, come per esempio AppInventor (http://appinventor.mit.edu/explore/), Blockly (https://code.google.com/p/blockly/), Stencyl (http://www.stencyl.com/), Snap! (ex BYOB, http://snap.berkeley.edu/) attualmente un progetto più valido dello stesso Scratch.
1.1.2 Alice
Alice (http://www.alice.org/index.php) è un ambiente visuale per la creazione di mondi virtuali in 3D ed è il risultato di un progetto della Carnegie Mellon University di Pittsburgh (Pennsylvania).
1.1.3 Hackety Hack
È un piccolo ambiente (http://hackety.com/) per l'insegnamento alla programmazione nel linguaggio Ruby (https://www.ruby-lang.org/it/). Il linguaggio di programmazione Ruby è nato nel 1992 scritto da Yukihiro Matsumoto. Oggi è un linguaggio molto popolare (anche se non popolarissimo in Italia). Le sue peculiari caratteristiche di immediatezza nell'utilizzo ne fanno un buon candidato per l'insegnamento anche a bambini in età scolare.
1.1.4 KidsRuby
KidsRuby (http://www.kidsruby.com/) è una evoluzione di Hackety Hack. Come il suo ispiratore usa Ruby come linguaggio.
1.1.5 Kojo
Kojo è sviluppato da Lalit Pant (Himjyoti school, Dehradun - India) ed è utilizzato in varie scuole indiane, statunitensi, inglesi e svedesi. L'approccio usato nella piattaforma Kojo (http://www.kogics.net/kojo) è più ampio dei precedenti. Può essere rivolto a più livelli di apprendimento ed è dotato di parti specifiche, per esempio per la sperimentazione in ambito matematico con un laboratorio basato su GeoGebra (http://www.geogebra.org/cms/it/). Il linguaggio utilizzato è Scala (http://www.scala-lang.org/). Scala è un linguaggio estremamente potente e multiparadigma (Orientato agli oggetti, funzionale) che può essere utilizzato a vari livelli, sufficientemente semplice nelle sue basi da poter essere insegnato in età scolare (dalla classe 4° primaria). La sua caratteristica di linguaggio funzionale lo fa particolarmente utile nella risoluzione di problemi matematici.
2 Cosa è la programmazione informatica?
Da wikipedia1:
La programmazione, in informatica, è l'insieme delle attività e tecniche che una o più persone specializzate, programmatori o sviluppatori (developer), svolgono per creare un programma, ossia un software da far eseguire ad un computer, scrivendo il relativo codice sorgente in un certo linguaggio di programmazione.
Questa la definizione in lingua italiana, quella in inglese è più articolata2:
La programmazione informatica è un processo che conduce da una formulazione originale di un problema computazionale a programmi eseguibili per un elaboratore elettronico. La programmazione prevede attività quali l'analisi, lo sviluppare la comprensione del problema, la generazione di algoritmi nonché la verifica dei requisiti degli stessi tra cui la loro correttezza, il consumo di risorse e la loro implementazione in un linguaggio di programmazione. Lo scopo della programmazione è quello di trovare una sequenza di istruzioni che automatizzi lo svolgimento di un compito specifico o risolva un determinato problema.
La definizione in italiano è presa come è, mentre quella in inglese è ovviamente tradotta ma una cosa risulta chiara: per gli italiani la programmazione è relegata a persone specializzate dotate di capacità tecniche mentre per lo scrittore in lingua inglese è un processo cognitivo.
Come detto giustamente dallo scrittore in inglese della premessa, la programmazione informatica è un processo ovvero un susseguirsi di attività cognitive ed implementative. Come l'arte concettuale è idea e realizzazione della sua rappresentazione.
In breve, ognuno di noi pensa, solo che ad alcuni manca la disciplina del pensare.
È interessante notare, come diverse culture affrontino il problema in modo diverso.
3 Finalità del corso
Il corso si propone principalmente di presentare ai bambini il cosiddetto pensiero computazionale come formulato da Seymour Papert nel 1996 e recentemente da Jeannette M. Wing nel 2006 nel suo saggio Computational Thinking. Si cercherà di introdurli alla programmazione dei computer stimolando un nuovo approccio critico ai sistemi informatici cosicché possano dominarli e non subirli.
La parola computazionale non deve fuorviare l'attenzione ponendola soltanto al mero mezzo informatico. Si tratta invece principalmente di un approccio alla ricerca di soluzioni che dovrebbe essere di utilizzo generale e solo incidentalmente è quello utilizzato nella programmazione dei computer.
L'abilità e l'abitudine alla scomposizione dei problemi ed alla loro risoluzione logica, travalica il semplice ambito informatico e può invece essere applicata in ambiti multidisciplinari durante la formazione e l'insegnamento ai bambini.
È importante cominciare nei primi anni di scuola, in quelli dove si forma e si comincia ad approfondire la conoscenza logica.
4 Fasi
Si cercherà di progredire nella finalità sopra espressa attraverso alcune fasi:
- Eliminare ogni informazione pregressa sul mezzo informatico che i bambini possono aver già acquisito. La probabilità che siano padroni di una informazione non corretta o distorta è molto alta.
- Stimolare l'analisi approfondita della realtà che li circonda, evidenziare come gli oggetti di uso comune siano composti di parti che interagiscono tra di loro. Stimolare la collaborazione come essi stessi parti di una macchina più grande.
- Abituarli ad essere incrementali ed iterativi, progettare significa affrontare un problema alla volta adattandolo alle richieste future.
- Abituarli ad una fase di prova e controllo delle attività che verranno svolte.
- Stimolare il riutilizzo delle parti, evidenziare i criteri generali di una parte che la rende riutilizzabile.
- Stimolare l'astrazione e la riduzione di complessità di una parte per poterne mantenere una idea generale da cui derivarne altre particolari.
- Modularizzazione, scomporre problemi complessi in problemi più semplici. Concetto del divide et impera.
- Stimolare la collaborazione tra di loro e non la competitività diretta. Nessuno è di per sé più bravo di altri ma ognuno può apportare beneficio al gruppo. La comunicazione è importante.
- Stimolarli al porsi delle domande, a mettere in dubbio certezze acquisite. Processo di analisi e conclusione.
- La conoscenza è di tutti e va condivisa.
Per cercare di finalizzare gli scopi prefissi, ci si avvarrà in itinere di esempi e materiali adatti allo scopo che saranno individuati durante lo svolgimento ed in relazione alla risposta dei bambini.
Per le fasi pratiche e direttamente indirizzate alla reale programmazione dei computer verrà utilizzato il software di nome Kojo (citato nella premessa) che è stato in parte tradotto in italiano per questa occasione. Inoltre saranno presentati anche altri software di ausilio alla comprensione dei concetti espressi.
Durante lo svolgimento si porrà molta attenzione alla presentazione del concetto di Software Open Source (codice aperto).
I punti cardine della programmazione software che verranno affrontati:
- I computer sono macchine stupide.
- Le istruzioni.
- Gli operatori.
- I valori e le variabili.
- Il concetto di dati.
- La dichiarazione e la definizione.
- Le sequenze.
- I cicli.
- Le condizioni.
- Le funzioni.
- I programmi.
Al termine del corso ed in base alle competenze raggiunte, i bambini dovrebbero essere in grado di elaborare e realizzare un piccolo software.