sabato 19 ottobre 2013

GeekLife ∞ Coder Dojo

Cosa sono i CoderDojo? Come è nata l'iniziativa? Come funzionano?
Ce lo spiega Gianluca Bertani in questo guest post per la rubrica GeekLife.

Negli anni ’80 c’è stata una generazione di persone, oggi quarantenni, che hanno imparato a programmare un computer quando avevano 10 anni o poco più. È la generazione dell’Apple II, del Commodore 64 e del Sinclair ZX Spectrum. Ne faccio parte anch’io.

Questi primi “microcomputer” erano piuttosto differenti da quelli odierni. Una volta accessi ti presentavano un cursore lampeggiante e poco altro. L’unica interfaccia* che fornivano ai propri utenti era il linguaggio BASIC, un linguaggio di programmazione tanto semplice quanto potente. Niente puntatore del mouse, niente icone, niente documenti, niente hard disk. Un cursore lampeggiante e basta. Praticamente erano scatole vuote.

C’è una bella differenza tra trovarsi davanti una scatola vuota e una scatola piena di roba inutile. Una scatola vuota è come una tela bianca, stimola la creatività. Così si cominciava a leggere qualche riga del manuale di istruzioni e si scopriva che con una “PRINT” e una “GO TO” si faceva già un programma. Si scopriva che programmare un computer non è poi così difficile: basta pensare bene ciò che si vuole che la macchina faccia, e mettere le istruzioni bene in fila. Si trovavano i listati dei programmi (tipicamente videogame) sulle riviste di computer dell’epoca. Si ricopiavano e magari si provava a cambiare qualcosa.

Un programma è una procedura, una sequenza di passi. Ci sono molte cose nella vita quotidiana che assomigliano ad un programma. Vestirsi, per esempio, ma anche una ricetta di cucina. Le ricette in particolare hanno una somiglianza straordinaria: hanno una fase dichiarativa (“servono 500 gr di farina, 1 bicchiere d’acqua, una bustina di lievito” ecc.) ed una fase procedurale (“unisci l’acqua e la farina, impasta, aggiungi il lievito, metti in forno” ecc.). Nella fase procedurale si può addirittura riconoscere l’uso di subroutine* (ad es. “aggiungi la crema pasticciera”, che richiede l’esecuzione di una ricetta a parte).

Chi non ha mai avuto a che fare con la programmazione può pensare che assomigli più ad un complicato sistema di equazioni. Non è così, la matematica c’entra pochissimo con la programmazione, ed è per questo che le equazioni si imparano alle scuole medie, mentre un programma può scriverlo anche un bambino di 7-8 anni. Anzi, senza saperne niente di neurologia infantile, credo di poter dire con sicurezza che quella è l’età migliore per addestrare la memoria procedurale di un individuo.

L’industria dell’informatica personale, però, non ha mai avuto l’obiettivo di formare le menti dei bambini, ma piuttosto di fare soldi vendendo più macchine possibile. Non c’è niente di immorale in questo, è nella natura delle cose. Questo obiettivo ha portato alla creazione dei sistemi operativi ad icone, come Windows e Macintosh, e alla realizzazione di computer estremamente potenti, relativamente facili da usare e con costi contenuti. Se i computer fossero ancora come i Commodore 64 difficilmente ne avremmo uno in tasca: vi mettereste a scrivere un programma per fare una telefonata con il vostro iPhone? Io no.

Già a metà degli anni ’90 un computer era un oggetto piuttosto differente. Acceso, si presentava con una serie di programmi preinstallati, tutti perfettamente inutili: paint, notepad e altri diecimila aggeggi, che molti non hanno mai neanche saputo di avere. Un click e il programma partiva.
L’interprete BASIC, per scrivere un proprio programma, c’era ancora ma era ben nascosto. Il computer era poi diventato un oggetto delicato, cosa che prima non era. Un Commodore 64 si poteva spegnere e riaccendere come un tostapane, semplicemente ripartiva con il suo bel cursore lampeggiante. Ma se uno spegneva e riaccendeva un PC con Windows senza aver fatto lo shutdown*, la macchina si metteva a dare ogni sorta di problema. Con il rischio di perdere tutto quello che ci si era messo dentro.

Allo stesso tempo, scrivere un programma per computer era diventato estremamente difficile. Può sembrare un paradosso, ma un programma semplicissimo da usare è difficilissimo da scrivere. Questo è dovuto alla differenza tra come la macchina funziona al suo interno e come invece deve presentarsi all’utente. Più l’utente si aspetta un’interfaccia vicina al suo mondo reale e più la macchina deve lavorare. I sistemi operativi moderni usano questa metafora della scrivania per essere più vicini all’utente, ma per ottenerla spremono la macchina fino all’ultimo bit.

Così, in 10-15 anni si è passati da computer:
  • robusti;
  • con un’interfaccia rudimentale;
  • relativamente facili da programmare;
  • sostanzialmente vuoti;
a computer:
  • delicati;
  • con un’interfaccia sofistica e facile da usare;
  • difficilissimi da programmare;
  • pieni di roba inutile.
Sì è passati da programmi così*:

10 PRINT “CIAO”
20 GO TO 10


a così*:

#include <stdio.h>
int main(int argc, char *argv[]) {
    while (1) {
          printf(“CIAO\r\n”);

    }
    return 0;
}


Quindi non c’è da meravigliarsi se mettendo computer con Windows davanti a bambini di 7-8 anni non si è ottenuta una nuova generazione di piccoli programmatori. Si è ottenuta una generazione di utenti. Che è ben diverso.

Da allora ai bambini si insegna al massimo qualche rudimento sull’uso del computer, non certo sulla programmazione. E se un bambino chiede timidamente come si fa ad aggiungere un’altra icona che faccia quello che vuole lui, la risposta è sempre: “Uuuh! E’ una cosa complicata! Lo imparerai poi all’università!”. Infatti la programmazione oggi è materia da scuole superiori e università, apparentemente riservata a teenager dall’aria disadattata e antisociale.

Ma siamo sicuri che questo sia l’unico modo? Che non ci siano altri modi di programmare un computer che non richiedano 10 anni di studi? Possibile che non si possa realizzare uno di questi complicatissimi programmi per rendere la programmazione semplice com’era sul Commodore 64?

Certo che si può. Ci sono stati numerosi tentativi, ma quello che si è dimostrato più efficace l’ha realizzato il Massachusetts Institute of Technology (MIT) nel 2006, ed è un linguaggio di programmazione visuale di nome Scratch. In questo linguaggio il programma di prima si scrive così:
Scratch impiega la metafora del teatro: l’area di lavoro è un palcoscenico (“stage”), su cui si possono appoggiare numerosi oggetti visuali (“sprite”), la cui forma può essere disegnata o caricata da un insieme fornito con il programma (tra cui ci sono animali, astronavi, persone in varie posizioni, elementi di paesaggio, ecc.). Ad ogni sprite è associato un programma, che si costruisce montando tra loro blocchi componibili come quelli più sopra. I blocchi hanno una forma tale da rendere evidente il loro funzionamento.

Scratch è gratuito e scaricabile liberamente*. Funziona su Windows, Mac OS X e Linux, e i programmi scritti con Scratch possono passare senza problemi da un sistema operativo all’altro. Ah, dimenticavo: è tradotto in 40 lingue diverse. Scusate se è poco.


Se avessi avuto uno strumento del genere 30 anni fa, non oso immaginare cosa avrei potuto ricavarne.

Lo strumento da solo, però, vale poco se rimane chiuso in un cassetto. Così, nel 2011 è nato CoderDojo*, dall’iniziativa di James Whelton e Bill Liao. E’ un movimento non-profit mondiale, nato in Irlanda, con lo scopo di fornire gratuitamente l’insegnamento della programmazione (ma non solo) a bambini e ragazzi.

Il nome è l’unione di un termine inglese: “coder”, cioè colui che scrive codice (cioè il programmatore), e di uno giapponese: “dojo”, cioè palestra di arti marziali (anche se il termine ha sfumature filosofiche). CoderDojo è quindi una “palestra per programmatori”.

La scelta di utilizzare Scratch come strumento di apprendimento non è del movimento CoderDojo mondiale: il movimento si limita a consigliare l’uso di tecnologie open source*, di cui Scratch fa parte. Ogni CoderDojo locale sceglie liberamente. In Italia è arrivato prima a Milano, dove si è consolidato rapidamente, e da lì si è poi propagato ad altre città tra cui Bologna*, dove io ho partecipato. Milano, Bologna e gran parte dei CoderDojo italiani usano Scratch.

Una sessione di CoderDojo tipicamente avviene ogni 1-2 settimane. Sono invitati bambini e ragazzi da 7 a 13 anni. Ogni sessione dura 3 ore, con una pausa in mezzo per la merenda. Tipicamente è organizzata in un tutorial nella prima parte e in uso libero di Scratch nella seconda.
Il tutorial viene presentato su un grande schermo e fatto passo per passo, insieme ai bambini.
Di solito l’obiettivo è arrivare a costruire un piccolo videogame di esempio. Durante tutte le 3 ore, sono a disposizione dei mentor (di cui io sono stato uno) con lo scopo di aiutare i bambini se si trovano bloccati o rimangono indietro rispetto al tutorial. I genitori naturalmente sono presenti, ma gli è vietato intervenire.

Questo un piccolo vademecum per i mentor:
  • essere curiosi verso il bambino, prestare attenzione alla domanda che fa;
  • il bambino è competente, avere fiducia nelle sue capacità;
  • intervenire solo su richiesta;
  • non temere gli errori, sbagliando si impara;
  • incoraggiare il bambino, premiare ciò che fa di giusto;
  • non dire “non”, mettere le frasi in modo positivo;
  • ma soprattutto: divertirsi!
Non si tratta quindi di una lezione frontale, tutt’altro: ogni bambino ha il proprio computer, segue il tutorial con il suo ritmo, ed è libero di prendere strade alternative se vuole sperimentare. Nella seconda parte i bambini sono liberi di espandere su quello che hanno visto con il tutorial, oppure ripartire da zero e fare qualcosa di completamente diverso. Non ho idea se Whelton e Liao abbiano mai sentito parlare della pedagogia di Loris Malaguzzi*, ma questo approccio le assomiglia in modo sorprendente.

Il risultato di solito è esplosivo: dopo 3 ore si vedono tanti videogame diversi quanti bambini sono presenti. Sottomarini, astronavi, squali, asteroidi, gatti, cani... di tutto. I bambini si dimostrano entusiasti dello strumento, e di solito si rifiutano di andar via.

Vedere questa esplosione di creatività materializzarsi sotto al naso è un’esperienza unica, che lascia senza parole. Un’esperienza che contraddice il luogo comune che la programmazione sia qualcosa per nerd* cervellotici: è in realtà uno strumento per esprimere la creatività come qualsiasi altro: come una tela, come una chitarra o come carta e penna. Come diceva Steve Jobs.
“I think everyone should learn how to program a computer,
because it teaches you how to think.
I view computer science as a liberal art,
something everyone should learn to do.”
- Steve Jobs

Note {nel testo sono segnalate con *}
  • Una “interfaccia” è un meccanismo di dialogo tra due componenti diverse, in questo tra la macchina e il suo utente.
  • Una “subroutine” di un programma è un sottoprogramma autonomo con una funzione ben specifica, che solitamente viene richiamato più volte.
  • Lo “shutdown” è la procedura che la macchina esegue quando le si chiede di spegnersi. E’ una procedura di una certa delicatezza, se non viene fatta il sistema operativo può malfunzionare.
  • Questo programma si limita a scrivere sullo schermo “CIAO” in continuazione, ed scritto in linguaggio Microsoft BASIC.
  • Questo programma fa la stessa cosa del precedente, ma è scritto in linguaggio C. Dall’inizio degli anni ’90 in poi questo linguaggio (e le sue derivazioni, come C++, Java e Objective-C) è diventato quello d’elezione per la programmazione dei sistemi operativi moderni. A differenza del BASIC, il cui nome non è un caso, il C espone tutta la complessità della macchina: tipi di dati diversi, puntatori e funzioni di sistema.
  • scratch.mit.edu
  • coderdojo.com
  • Il software FOSS (“free and open source”) nasce dall’idea di Richard Stallman di distribuire i propri programmi insieme al codice (cioè il listato del programma) in modo che gli utenti possano modificarlo liberamente. L’idea è poi diventata la base del movimento FSF (Free Software Foundation) che si fa promotrice di questa filosofia di distribuzione del software nel mondo. Oltre a Scratch, anche il sistema operativo Linux ne fa parte, così come una parte importante del sistema operativo Mac OS X.
  • www.coderdojobologna.it
  • it.wikipedia.org/wiki/Loris_Malaguzzi
  • Da Wikipedia: “nerd” è un termine della lingua inglese con cui viene definito chi ha una certa predisposizione per attività particolari, quali giochi di ruolo, film fantasy e innovazioni tecnologiche, ed è al contempo tendenzialmente solitario e con una più o meno ridotta propensione alla socializzazione. Aggiungo che di solito ha un’accezione piuttosto negativa.


L'Autore si presenta
Gianluca scrive software da 30 anni, di cui 18 professionalmente. Attualmente è software architect presso Weswit di Milano, società nota per Lightstreamer. Ha inoltre un proprio studio di sviluppo software a Bologna di nome Flying Dolphin Studio.

4 commenti:

  1. Mi ha fatto sorridere il paragone all'inizio, a 15 anni di sviluppo e diffusione dei pc. Io ho perso il primo giro e rientro fra quelli che a programmare hanno iniziato all'università... ma alle elementari, prima quindi di una lunga pausa, ho fatto a tempo a imparare qualcosina con Logo. Mi chiedevo giusto come le scuole avessero iniziato a introdurre l'informatica nei programmi... Buona l'idea di Scratch, ma ho come il sospetto che il concetto di software libero non entrerà facilmente nelle aule scolastiche.

    RispondiElimina
    Risposte
    1. Le scuole si sono rivelate straordinariamente resistenti ai cambiamenti; non solo nel campo della tecnologia.
      È bello che esistano iniziative come CoderDojo che propongono percorsi educativi alternativi.

      Elimina
  2. Bel post, l'idea dei CoderDojo è davvero interessante :)

    RispondiElimina
  3. Oddio.. nei due esempi di codice hai paragonato un qualcosa che esisteva negli anni '60 con qualcosa che è stato poi sviluppato negli anni '70 (Basic e C), che son due cose rivolte a un pubblico completamente diverso sin dalla progettazione.

    Il fatto che i linguaggi di programmazione si siano evoluti è inconfutabile, ma se proprio vogliamo prendere due estremi di paragone, suggerirei la differenza tra la schermata del Basic e la schermata base del Flash (ok, nemmeno io ne ho particolare stima, ma di sicuro la facilità d'uso ha attirato un sacco di giovani creativi verso il mondo della programmazione).

    RispondiElimina