Digi Tales

TDT: l’acronimo nuovo che nuovo non è

Giu
16

La DaD può essere vista come il risultato di un’addizione:

Didattica Tradizionale + Tecnologia Digitale Tradizionale

Il risultato è (spesso) la lezione frontale via videoconferenza, l’interazione come scambio di documenti da ufficio, la valutazione tramite quiz online.

Confusi o confuse?

Non c’è nessun errore, volevo proprio dire che la tecnologia usata per la DaD è del tutto tradizionale.
L’equivoco nasce perché “tecnologia” viene sempre associata a innovazione (nella tautologica espressione “nuove tecnologie”), ancora di più quando è sovraccaricata con il pleonastico “digitale”.
Ma non è vero. Non c’è nessuna innovazione nell’usare le piattaforme a cui siamo ormai abituati perché sono le stesse che usiamo a casa.
La TDT è onnipresente, è l’acquario dentro cui siamo tutti, ormai da tempo, per tutto il tempo.
Tradizionale in fondo significa trasparente, naturale. Significa usato e non costruito, né decostruito.
Tradizionale significa aderente ad un modello non esplicito, se non nascosto. Si fanno cose secondo una regola che non è percepita come tale. Si chiede di spegnere webcam, accendere microfoni, come se fosse una necessità didattica, mentre è un vincolo dell’ambiente tecnologico. Ci si preoccupa del problema del riconoscimento dello studente all’esame, del problema di come impedire che imbrogli e copi, di come superare il digital divide che impedisce agli studenti di famiglie disagiate di collegarsi in video, senza accorgersi che il contesto in cui questi diventano problemi è stato imposto dalla piattaforma, dalla TDT. Il modello della DaD è la somma del modello didattico tradizionale con quello delle tecnologie attuali.

Il problema della tecnologia didattica tradizionale è proprio la sua invisibilità. Lo condivide con tutto il resto delle tecnologie non didattiche. E non è un caso: si tratta dei primi passi di un processo di colonizzazione del mondo dell’educazione, dopo quello della formazione aziendale.
Un motore di ricerca non rende evidente l’algoritmo di indicizzazione (quindi di filtro) e di ordinamento dei risultati (quindi di indirizzamento).
Un catalogo online parte dal profilo del cliente (passato e futuro) nel costruire la rappresentazione virtuale del magazzino.

Tutte le piattaforme, o per lo meno quelle usate nella maggior parte dei casi, portano dentro di loro un modello non solo didattico tradizionale (la lezione, i compiti), ma anche un modello di relazione tra utente e fornitore basato sullo scambio servizi/dati. Servizi gratuiti contro dati personali: scelte, testi, agenda, rubrica. Siamo al di là del modello consumistica, in cui lo scambio merci/denaro almeno era visibile e riguardava oggetti, e in qualche modo controllabile da entrambi i lati.

Naturalmente se si vuole cambiare strada bisogna cambiare entrambi i termini dell’addizione.
Non basta una didattica aperta, ispirata ai Maestri, se si accettano gli strumenti tradizionali. Bisogna provare a scegliere e usare strumenti diversi, che siano aperti, che non abbiano dietro interessi estranei, che siano plurali.

E se non ci sono, bisogna costruirli e fare in modo che siano sostenibili.

Hello, world!

Giu
15

“Hello, world!” è uno dei luoghi comuni dell’universo della programmazione, nel senso di uno dei topic fondamentali, conosciuti magari solo superficialmente, ma su cui si ritorna in continuazione. Raccontare dell’origine di “Hello, world!”, e poi andare a cercarne le presenze nella cultura contemporanea, è un buon modo per fare un tuffo in questo mondo e rendersi conto di quanto sia ricco, complesso, e non così arido come immagina chi ne rimane fuori.

Banalmente, “Hello, world” (nel seguito: HW) è il nome convenzionale che si dà ad ogni programma che come unico risultato alla fine della sue esecuzione scrive sullo schermo la frase: “Hello, world!”.

E’ di solito il primo esempio che si fa per mostrare le caratteristiche di base di un linguaggio di programmazione all’interno di un manuale, un tutorial, un corso su quel linguaggio. Da un punto di vista puramente quantitativo permette di mostrare quanto codice deve essere scritto per ottenere un risultato in apparenza molto semplice. Perché a seconda del linguaggio scelto, questa quantità può essere molto diversa. D’altra parte anche per le lingue naturali è noto che ci sono lingue prolisse e lingue concise.
Ad esempio, in Pascal – che è un linguaggio didattico, inventato nel 1970 dall’austriaco Niklaus Wirth per insegnare la programmazione strutturata – occorre dichiarare un programma, con un nome, e al suo interno un blocco con un inizio e una fine:

program hello;  
uses crt;    
begin
  writeln('Hello, world');
  readln
end.

La stessa cosa succede in Java – uno dei linguaggi più usati al mondo, inventato dal canadese James Gosling nel 1994 – , dove ancora più informazioni sono necessarie per dichiarare l’usabilità del codice in contesti più grandi (public, static), o il riuso di librerie esistenti (System.out):

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world");
    }
}

Invece nei linguaggi interpretati, come in Perl – creato dallo statunitense Larry Wall nel 1987 con lo scopo di essere pratico, più che elegante – di solito non è necessaria tutta questa sovrastruttura, ma è sufficiente scrivere una sola istruzione, che in memoria dei tempi in cui terminali erano della stampanti si chiama “print”:

print "Hello, world\n"

Insomma: c’è più di un modo di fare la stessa cosa. Che è anche il motto del Perl: TIMTOWTDI (There Is More Than One Way To Do It). A dimostrazione che la programmazione non è un’attività ripetitiva, ma un’arte.

Questo “task” permette anche di far vedere come vengono trattate le sequenze di simboli, che è una parte fondamentale di tutti i linguaggi di programmazione, e come può essere gestito l’output verso lo schermo o verso altri dispositivi.

Per spiegare il versante più algoritmico dei linguaggi di solito si usano altri compiti, legati al mondo dei numeri, come quello di calcolare l’i-esimo numero di Fibonacci; oppure quello di scrivere tutto il testo della canzoncina da scout “99 bottles of beer“, tenendo conto delle varianti, con il minore numero di istruzioni.

Perché proprio “Hello, world!” e non “123 prova” o “tanto va la gatta al lardo”?

Non è affatto un testo casuale. C’è dietro una storia, che non è nota a tutti, anche tra i programmatori.

Nel 1972 Brian Kernighan, un fisico canadese che lavorava ai Laboratori Bell, si trovò a scrivere un tutorial sul linguaggio B, inventato proprio lì.

Nei primi capitoli del tutorial, dopo aver presentato gli operatori aritmetici, passa alla funzione “putchar” che scrive sul terminale l’argomento passato, in questo caso una costante:

main( ){
	auto a;
	a= ’hi!’;
	putchar(a);
	putchar(’*n’ );
}

Il valore della costante è in questo caso ‘hi!’, ciao.

Nell’ultima riga viene dimostrato come facilitare la formattazione usando dei codici particolari: ‘*n’ non sono due lettere da stampare, ma un codice unico che indica alla funzione putchar () che al termine deve aggiungere un ritorno a capo.

Poco più avanti, volendo mostrare come si creano e usano le variabili comuni, Kernighan ha bisogno di una frase più lunga, e abbastanza naturalmente da ‘hi!’ passa a ‘hello, world!’:

main( ) {
    extern a, b, c;
    putchar(a); putchar(b); putchar(c); putchar('!*n');
}
a 'hell';
b 'o, w';
c 'orld';

Il motivo per cui ci sono tre variabili anziché una sola è che il massimo numero di caratteri che una costante nel linguaggio B può contenere era 4.

Ancora più avanti la frase “hello, world” viene riusata per introdurre le stringhe, che invece possono essere più lunghe di 4 caratteri.

Sei anni dopo, lo stesso Kernighan riusa esattamente la stessa frase quando si trova a scrivere il manuale del linguaggio C (che era un erede del B):

main( ) {
        printf("hello, world\n");
}

In questa versione scompare il punto esclamativo (probabilmente perché ha un significato preciso nel linguaggio: è un operatore unario, una negazione, e lo studente potrebbe esserne confuso).

Perché sceglie “hello, world”? Evidentemente questa frase faceva parte della cultura popolare statunitense, tanto che in un’intervista di quarant’anni dopo Kernighan sostiene di non ricordare esattamente perché l’ha scelta, ma di avere in mente un cartone animato con un pulcino che dice “Hello, world”. In ogni caso, questa frase era usata negli anni cinquanta da uno speaker radiofonico, William B. Williams, come suo saluto (un po’ come “Good morning, Vietnam!” o “Cari amici vicini e lontani”). Era quindi un saluto, un’espressione orale, colloquiale. Un buongiorno, la prima frase che si dice quando si incontrano delle persone.Siccome il manuale di Kernighan è stato tradotto in 20 lingue ed è considerato unanimemente “il” riferimento per il linguaggio C, la versione “hello, world” divenne quella più conosciuta da migliaia o milioni di studenti e apprendisti programmatori.

Talmente famosa da diventare un oggetto artistico: la versione scritta a mano del codice è stata battuta ad un’asta nel 2015 per 5.000 dollari.

Da quel momento, l’uso di HW come task per introdurre un linguaggio è diventato una specie di standard de facto, un omaggio al lavoro dello stesso Kerninghan, e implicitamente a quello di Dennis Ritchie (l’autore del linguaggio C) e di Ken Thomson (l’autore del linguaggio B).

L’omaggio non può che essere piuttosto rigido, nel senso che sarebbe considerato di pessimo gusto utilizzare come primo esempio nel manuale di un nuovo linguaggio un codice sorgente che stampi “Hey Jude”.

Talmente è diffusa questa tradizione che qualcuno ha pensato di raccogliere esempi di programmi HW scritti in centinaia di linguaggi di programmazione diversi, come ha fatto Wolfram Rösler a partire dal 1994:

http://helloworldcollection.de/

La prima versione dei codici si atteneva ad un singolo modello (“Hello World!”), in cui anche la parola World, essendo un sostantivo, viene scritta in maiuscolo come è corretto fare in lingua tedesca da Lutero in poi. Mano a mano che la raccolta è cresciuta – 603 linguaggi censiti oggi – i codici si sono allontanati dal testo originale. Per essere esatti, la tradizione consente queste sole varianti al testo originale:

– si usa la H maiuscola (corretta in Inglese ad inizio di frase)

– si può usare la w o la W (benché la maiuscola sia un errore in Inglese a meno che World non si intenda come nome proprio)

– si può omettere la virgola (che nell’originale serviva a mostrare l’uso dei segni di interpunzione all’interno delle costanti e fuori)

– si può omettere il punto esclamativo finale, in omaggio alla versione in C

– si può omettere l’acapo finale (\n)

Ma a dimostrare la posizione particolare di HW all’interno dell’universo culturale dei programmatori non ci sono solo le sillogi di codice.

Proprio pochi giorni fa, il maestro Nicola Campogrande per l’apertura di Codefest 2021, il festival del codice sorgente organizzato dall’Università di Torino e da Codexpo.org, ha composto e diretto quattro lieder sul testo HW, scegliendo quattro linguaggi tra quelli proposti in helloworld.de. E’ un caso lampante di uso del codice sorgente al di là della sua funzione primaria. D’altra parte, anche Franco Berardi (Bifo) nel 2001 aveva effettuato una performance singolare leggendo a voce alta il codice sorgente di un virus scritto per l’occasione dal collettivo [epidemiC]. In fondo, anche le partiture musicali e le ricette si possono leggere a voce alta e, perché no, cantare. D’altra parte, ci sono stati casi di poesie scritte in linguaggi di programmazione, da quelle in ALGOL a quelle in Perl.

Un altro omaggio dal mondo esterno è quello di Tomohiko Itō che nel 2019 ha diretto un anime dal titolo originale “Harō Wārudo” , che significa proprio quello che pensate. In questo mix di fantascienza e sentimenti, il mondo viene registrato in un supercomputer dal nome evocativo, Alltales.

Ma per tornare nel campo della molteplicità dei linguaggi di programmazione, che è facile definire come nuova Babele visto che ce ne sono 8000, ci sono artisti del codice che hanno dato vita a veri pezzi di bravura, come questo HW che può essere correttamente compilato/eseguito in 8 linguaggi diversi e produce lo stesso risultato:

https://ideology.com.au/polyglot/polyglot.txt

Per divertirsi un po’ – non solo se si è programmatori – si può andare a leggere questo testo riportato sul sito della Free Software Foundation, in cui vengono raccolte e presentate sedici maniere diverse di scrivere HW, organizzate in base all’età, alla competenza professionale e al ruolo dell’autore, utilizzando linguaggi diversi (BASIC, Pascal, Lisp, C, C++, Perl,…) e contemporaneamente prendendo in giro le caratteristiche di ogni figura: dal giovane programmatore che vuole impressionare il datore di lavoro all’hacker che ricompila un codice già scritto, al guru che usa meno caratteri possibili, al manager che scrive una mail per farsi fare il lavoro da un sottoposto fino al CE che non è in grado di fare nemmeno quello.

https://www.gnu.org/fun/jokes/helloworld.html

Un’altra magnifica prova di umorismo è quella di Benno Evers, un programmatore di Amburgo, che descrive dai diversi punti di vista di un novizio, un apprendista, un avvocato, un pedante, un idealista, un ideologo, un ingegnere, un fisico e un illuminato cosa succede quando viene eseguito una variante in C++ di HW:

#include <iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
}

https://gist.github.com/lava/f8732a6802988fe8d0a41bd7979a4d54

Il codice sorgente dovrebbe essere sempre leggibile, per permettere ad altri di imparare e correggere. Ma siccome i programmatori sono tendenzialmente dei nerd e tendono a sfidarsi sul terreno della bravura, a volte si divertono a scrivere codice illeggibile solo per il gusto di far vedere che sono capaci di farlo. Non tutti sanno che ogni anno, dal 1984, si tiene una gara di abilità tra programmatori C in cui vengono premiati i programmi meno leggibili: si tratta dell’International Obfuscated C Code Context. Uno dei codici vincitori della prima edizione era appunto un HW (che usa la versione originale del testo):

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hello, wor\
ld!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}

Ma non è l’unico caso: ci sono state delle sfide aperte, come quella su codegolf.stackexchange.com che invitava a scrivere un HW senza usare nessuno dei caratteri seguenti:

h, l, w, d , e, o, r, 0, 1, 2 e 7

Per quanto possa sembrare strana, questa è una delle soluzioni (in Javascript) che fa anche un occhiolino all’ASCII Art:

https://codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Infine, HW è entrato anche nel mondo dei linguaggi (non solo dei codici sorgenti) dal 2001, l’anno in cui Cliff Biffle ha inventato HQ9+.

Questo linguaggio nasce dalla constatazione che la maggior parte degli studenti di programmazione cercano degli esempi da cui imparare, e gli esempi sono appunto “hello, world”, la poesia “99 bottiglie di birra” e i programmi che stampano il proprio codice sorgente ( i cosiddetti “quine”, in omaggio a Willard Van Orman Quine, logico statunitense ).

HQ9+ risponde in maniera molto precisa a questa esigenza. Infatti ha solo quattro istruzioni:

  • H scrive “Hello, world”
  • Q scrive il sorgente del programma stesso
  • 9 scrive la poesia “99 bottiglie di birra”
  • + incrementa l’accumulatore

Con HQ+9 abbiamo terminato il nostro viaggio intorno ad “Hello, world”, e speriamo di aver contribuito a dare una visione un po’ più allegra e umanizzata dell’universo della programmazione.

Le radici dell’ apprendimento

Giu
07

Sono fissato con le metafore, da sempre. Le ho studiate dai tempi della tesi sui modelli in fisica. Penso ancora che siano utili ad andare oltre i primi aspetti visibili di un fenomeno, utili come stimoli per andare a cercare qualche aspetto nascosto facendosi guidare dalle corrispondenze con gli aspetti di altri fenomeni. La metafora è una macchina per fare scoperte.
Ma perché dovrebbe funzionare? Forse perché alcuni processi naturali sono più simili di quello che sembra. Usare le metafore è anche un modo di riconoscere, o verificare, questa similitudine.
Per esempio, la radicazione delle piante e l’apprendimento degli umani.
Sono entrambi processi naturali. Hanno a che fare con la sopravvivenza.
Il primo l’abbiamo studiato per millenni, e abbiamo imparato a sostenerlo e favorirlo. Il secondo… qui siamo un po’ più scarsini, lo studiamo da troppo poco tempo. E usiamo le metafore sbagliate.

Breve riassunto di cosa è la radicazione. Abbiate pazienza perché potreste scoprire cose sorprendenti.
Le radici di una pianta crescono in verticale, in orizzontale, insomma dove e come possono.
Verso dove? principalmente verso dove c’è acqua o sostanze nutrienti. Se la pianta è stata infilata in un tubo di cemento, le radici sono costrette a crescere verso il basso. Se è nata in dieci centimetri di terriccio, le radici si allargheranno.
Ma ci sono anche delle preferenze legate alla specie: le radici degli abeti sono in genere superficiali, quelle dei larici vanno in profondità.

Le radici hanno anche altre funzioni, alcune note (reggere in piedi la pianta), alcune non chiarissime, come nel caso dei cipressi calvi.
Le radici da sole non riuscirebbero a nutrire la pianta, e spesso formano una simbiosi con alcuni funghi, un contratto in cui si scambiano nutrienti: le micorrize. E’ il motivo per cui i porcini si trovano vicino ai castagni e i tartufi vicino alle querce.
In alcuni casi le radici colonizzano il terreno, emettendo delle sostanze tossiche per le altre radici (lo fanno il pesco e il noce). Le radici di altre specie invece si intrecciano, per così dire, volentieri: è il caso dell’olmo e della vite.
Il processo di crescita delle radici è in generale lento, ma non continuo. Nelle nostre zone, ci sono due periodi di accrescimenti: la primavere e l’autunno. Quando fa troppo caldo, o troppo freddo, le radici non crescono.

Se decidiamo di piantare un albero, di solito scegliamo un terreno adatto: acido, non acido, fresco, argilloso. Adatto non significa sempre la stessa cosa: alcuni alberi vengono piantati in terreni aridi perché si sa che non hanno bisogno di molta acqua, altri in terreni acquitrinosi perché si sa che ne assorbiranno la maggior parte. Certo bisogna conoscere i tipi di terreni e le caratteristiche delle specie arboree.
Gli alberi giovani, quelli appena nati, hanno bisogno di molta attenzione. Devono cominciare a crearsi della radici solide, prima in giù e poi intorno. Perciò li aiutiamo con un terreno soffice e ricco, gli diamo l’acqua di cui hanno bisogno, controlliamo che stiano crescendo in maniera armoniosa. Poi, quando sono diventato un po’ più grandi, li trapiantiamo altrove e se la vedono da soli.
Ma spesso decidiamo di piantare un albero dove da solo non attecchirebbe mai, con la tipica attitudine dei colonizzatori. In questo caso la responsabilità ricade su di noi: senza un po’ di aiuto da parte nostra non arriverebbe a svilupparsi e a portare frutti. Un po’ d’aiuto, non troppo: si sa che fornire tutta l’acqua necessaria non è una buona idea, perché limita la radicazione, con effetti sia sulla quantità di nutrienti che la pianta riesce ad assorbire, sia sulla stabilità della pianta. I pini sui viali caduti alla prima burrasca ne sono un esempio evidente.


Ora mettiamo in moto la metafora, spostiamoci nell’altra area e proviamo a cercare corrispondenze.
L’apprendimento visto come un processo di radicazione. Cioè di esplorazione, di crescita di rami invisibili che servono ad acquisire risorse, a sorreggere l’organismo, insomma funzionali alla sopravvivenza e al benessere. Dell’individuo, della specie.
Un processo che si indirizza, nell’ambito delle direzioni possibili, verso quelle più promettenti.
Un processo che può essere aiutato o guidato dall’esterno. Ma non gestito.
Ci vogliono degli ambienti adatti, soprattutto nelle prime fasi. Ma è inutile fornire tutte le risorse, tutte in una volta. Ci deve essere una zona di sviluppo prossimale che si allarga (ah sì, qualcuno l’aveva già detto).
Certe aree (certe rizosfere) sono dure, secche, più difficili da penetrare per le radici; altre sembrano soffici, ma non contengono abbastanza sali minerali. Non ci si può aspettare che le radici si espandono alla stessa velocità e nella stessa direzione. Qualche volta si può andare in profondità, qualche volta si resta in superficie.
Inutile aspettarsi che sia un processo continuo e uguale per tutti: ci sono stagioni, momenti; ci sono stili personali.
Alcuni apprendono velocemente, altri lentamente. Bisogna seguirli tutto il tempo, non solo una volta l’anno.
Alcuni hanno bisogno di molto spazio e di molte risorse, altri se la cavano con poco. Bisogna evitare fame e indigestioni.
Alcuni apprendono meglio insieme ad altri. Alcuni infastidiscono gli altri per trovarsi da soli. Accorgersene e smistare non è una questione marginale, organizzativa, è proprio un pezzo del compito del supporto all’apprendimento.
Nei momenti difficili, possono essere aiutati con degli strumenti simbiotici, come i computer, che sono capaci di trasformare risorse indigeribili in nutrienti.
E così via.

Sono cose banali, che ogni insegnante sa? Può darsi. In teoria.
In pratica invece qualcuno pensa solo a trasmettere conoscenze, non a favorire l’apprendimento. Pensa che la conoscenza stia lì, nei libri, o su internet, e che sia sufficiente un cartello stradale per trovarla.


Pensa che educazione e formazione siano solo parole diverse per indicare un processo di vasi comunicanti: all’inizio uno è pieno e l’altro vuoto, poi piano piano, automaticamente, il liquido passa dall’uno all’altro. A volte si usa un imbuto per andare più veloci. Alla fine il risultato è un nuovo vaso pieno di quello stesso liquido, pronto per riempire altri vasi.

Pensa che il risultato finale sia proporzionale alla quantità di contenuti che ha fornito.
Pensa a trasmettere in fretta, perché “dieci anni fa in questo periodo eravamo già arrivati alle guerre d’indipendenza”.
Non tiene conto delle interazioni tra studenti, anzi se può le impedisce.
Non tiene conto della qualità dell’ambiente, solo della quantità.
Non monitora la velocità con cui gli studenti diventano sempre più autonomi, si limita a valutarne la conformità allo stadio previsto.
Si aspetta che tutti gli studenti raggiungano lo stesso livello. Se qualcuno non ce la fa, beh, è colpa sua. Come diceva Michele Apicella in Bianca: “Hai troppo sole, poco sole, cos’è che vuoi? Più acqua, meno acqua?”

Conoscete qualcuno che in pratica si comporta più o meno in questo modo? Sì?
Allora ditegli che non funziona. I suoi alberi, coltivati così, sarebbero crepati.

Garibaldi e i linguaggi napoleonici

Mag
18

I programmatori, a differenza degli eroi, sono persone normali, anche se a volte non sembra. Come tutte le persone normali hanno preferenze, fastidi, passioni, fobie. Queste idiosincrasie del tutto umane vengono applicate ai linguaggi di programmazione, agli strumenti per scrivere programmi, agli stili in cui si scrivono. Per questo, forse, sono stati creati così tanti linguaggi di programmazione (circa 8.000).

Una delle discussioni che durano da più tempo è quella sul modo migliore per programmare. In breve, si tratta della metafora generale con cui si pensa al rapporto tra umano e computer durante la programmazione. Ci sono almeno questi quattro modi maggiori:

Napoleonicol’umano ordina e il computer esegue
Aristotelicol’umano definisce regole e fatti e il computer trae le conseguenze e dimostra teoremi
Leibnizianol’umano progetta funzioni e il computer le calcola
Shakespearianol’umano descrive una situazione in cui degli attori che hanno una conoscenza limitata del mondo sanno compiere alcune azioni e interagire tra loro; il computer sovraintende a questa sessione

Il primo modo è quello che si insegna di solito per primo, ed è anche quello che spesso viene usato per definire il significato di “computazionale”: ci si immedesima nel computer e si cerca di descrivere come farebbe a risolvere il problema con le informazioni che ha. Gli altri modi cercano di venire incontro agli umani, al nostro modo di pensare. Il vantaggio di questi altri paradigmi dal punto di vista didattico è che permettono di scrivere un programma in maniera più naturale, descrivendo il problema, anziché la soluzione. Sono i computer a dover avvicinarsi agli umani, non viceversa. E questo vale anche, e soprattutto, quando si fa coding con dei ragazzini.

Snap! permette molti modi (tranne quello Aristotelico), anche se i suoi autori mostrano una preferenza spiccata per il terzo modo, quello Leibniziano. Nota: il nome tradizionale per questi modi è “paradigma”, e di solito si usano etichette un po’ meno fantasiose per indicarli. Ma qui non stiamo facendo un corso di informatica.

Siccome queste sono parole un po’ astratte, facciamo qualche esempio.

Il contesto è la canzoncina “Garibaldi fu ferito” che una volta i bambini sapevano a memoria e cantavano sull’aria della Canzone dei Bersaglieri. Il gioco era quello di sostituire tutte le vocali delle parole con una sola, ottenendo ad esempio “Garabalda fa farata” oppure “Gurubuldu fu furutu”, eccetera. I bambini sanno farlo, anche se non sanno esattamente dire come. Prima di continuare potete provare anche voi, e interrogarvi su come avete fatto.

Come facciamo per far fare la stessa operazione ad un computer? Per quello che abbiamo detto sopra, non c’è un solo modo, né un modo “giusto” (questo è uno dei motivi per cui fare coding ha un senso forte solo se non ci si limita a ricopiare tutorial e eseguire esercizi). Possiamo provare a seguire almeno tre strade diverse, per poi magari valutarne la semplicità, l’utilità in termini didattici, e se fossimo informatici anche l’efficienza.

I blocchetti realizzati in Snap! delle varie versioni potete vederli e provarli direttamente da qui:

https://snap.berkeley.edu/project?user=stefano63&project=Garibaldi%20fu%20ferito

Prima versione, imperativa

  1. prendi il testo della canzoncina
  2. conta la lunghezza del testo il lettere (sono 90)
  3. prepara una variabile – vuota – dove andrà a finire la versione trasformata
  4. prepara una variabile che servirà a contare le lettere e mettici dentro 1
  5. ripeti novanta volte:
    1. prendi la lettera I del testo
    2. se è una vocale, sostituiscila con la A, e mettila all’inizio della variabile finale
    3. altrimenti, metti la lettera originale all’inizio della variabile finale
    4. aumenta I di 1
  6. quando hai finito, restituisci la versione trasformata

La parte da 5.2 a 5.3 può essere affidata ad una funzione a parte (l’abbiamo chiamata “cambia vocale con…”) per evitare di rendere i blocchetti troppo complicati da leggere. E’ una funzione molto semplice, che si limita a verificare che una lettera sia una di queste: a,e,i,o,u. Non tiene conto delle maiuscole né delle vocali accentate.

Seconda versione, ricorsiva

Un’altra versione possibile è quella che sfrutta una caratteristica di alcuni linguaggi di programmazione, cioè la possibilità di richiamare una funzione al suo stesso interno. In pratica, si usa la tecnica di dividere un problema in sotto-problemi sempre più piccoli finché non si arriva ad un problema risolvibile.

In questo caso, sappiamo come trasformare una lettera (con la funzione “cambia vocale con”) ma non sappiamo come trasformare un intero testo.

  1. se la frase ha lunghezza 1 (cioè è se è composta da una sola lettera) si applica la funzione “cambia vocale con” e si restituisce il risultato (questo è il passo in cui sappiamo come risolvere il problema);
  2. altrimenti, si chiama di nuovo la stessa funzione “cambia frase” ma passando due valori diversi:
  • la prima lettera della frase
  • tutto il resto della frase
  1. si unisce il risultato che proviene da queste due funzioni e lo si restituisce

Una volta superato lo shock di un programma che non si capisce come fa a funzionare, la soluzione è di una semplicità imbarazzante.

Terza versione, funzionale

In questo caso si sfruttano due caratteristiche di Snap!, tipiche dei linguaggi funzionali:

  • la possibilità di applicare una funzione su tutti gli elementi di una lista, uno per uno, ottenendo una nuova lista
  • la possibilità di ridurre una lista ad un solo elemento, applicando un’operazione agli elementi, due alla volta.

Anche in questo caso l’algoritmo è molto semplice ed è basato su una concatenazione di funzioni:

  1. si applica la funzione “cambia vocale ” alla lista ottenuta separando la frase ad ogni lettera
  2. si combinano gli elementi di questa lista in una nuova frase e la si restituisce

Preferenze per uno dei tre? Quale vi sembra più chiaro? Quale vi sta più simpatico?

A me, personalmente, l’ultimo. Proprio perché non si perde a misurare, a tenere il conto del punto in cui siamo arrivati, non ha bisogno di appoggiare il risultato parziale da qualche parte. In fondo non fa altro che trasformare in blocchetti quello che volevamo fare: applicare una trasformazione a tutte le vocali di un testo.

A proposito: che ne è di quel famoso adagio “I computer sono stupidi, sanno fare solo una cosa e la fanno sempre nello stesso modo”?

Imbuti metaforici

Apr
14

A proposito della questione dell’imbuto di Norimberga, mi è tornata in mente una lezione di Bruno Cermignani, il mio amato professore di Filosofia della Scienza a Villa Mirafiori, che ci avvertiva dei rischi che si corrono quando si usa una metafora astratta per comprendere un’esperienza concreta. L’esempio che faceva era quello della conoscenza come specchio del mondo. Astratta, perché del fenomeno del rispecchiamento prendeva solo l’idea, ma non la realtà. Uno specchio non riflette sempre l’oggetto che gli sta di fronte, e l’immagine non è affatto realistica. Ci sono le leggi dell’ottica (la riflessione e l’inversione dell’immagine), ma anche altre condizioni reali, come l’umidità (lo specchio appannato) e la temperatura che può distorcere lo specchio, fino a fonderlo. Uno specchio in un forno non riflette un bel niente.

L’insegnamento come riversamento della conoscenza nella testa di uno studente tramite un imbuto è un caso dello stesso fenomeno. Prima di ridere dell’ingenuità di chi parla di riempire gli imbuti, proviamo a prenderla sul serio (la metafora) e a toglierle la dose di astrattezza. Se l’imbuto fosse una buona metafora dell’insegnamento, allora…

Quando

Prima di tutto: quando si usa un imbuto? Per esempio: da una damigiana di vino o di olio voglio riempire tanta bottiglie più piccole: si chiama travaso. E’ utile per distribuire un bene, per farlo viaggiare, o conservarlo meglio. Magari perché da un Sangiovese volgare si vuole ottenere un magnifico Brunello, che come ognuno sa deve stare in bottiglia almeno cinque anni.

E perché ha quella forma? Il flusso che esce dalla damigiana (che ha una bocca più larga) è maggiore di quello che potrebbe assorbire la bottiglia, che ha un collo piccolo. Se non ho una buona vista e una mano più che ferma rischio di rovesciare e disperdere il prezioso liquido. L’imbuto ha una bocca ancora più larga di quella della damigiana, e poi si restringe. Così si può sbagliare, sia in termini orizzontali (se sbaglio la direzione il liquido non va nel buco) che verticali (se esagero con l’inclinazione verso un flusso troppo importante che la bottiglia non riesce ad assorbire). L’imbuto ha senso perché ha una tolleranza all’errore maggiore di quello del collo della bottiglia; e ha senso se il liquido che si vuole travasare è prezioso.

Cosa e come

Che tipo di contenuto si può travasare con un imbuto? Beh, non uno qualsiasi. Deve avere della caratteristiche fisiche precise: i liquidi vanno bene, i gas no (perché sono più leggeri dell’aria; ma in questo caso si potrebbe pensare ad usare un imbuto al contrario, con la bocca in basso?). Si può travasare il mercurio? C’è la questione dell’attrito: alcuni liquidi sono più viscosi di altri e vanno versati più lentamente perché altrimenti non riescono a passare.

I solidi? Anche, ma devono essere aggregati in particelle molto piccole (come lo zucchero, il sale, la farina); ma questi aggregati, soprattutto se umidi, tendono a creare degli intasamenti perché si aggregano troppo, in malloppi più grandi della tubo dell’imbuto. Se sono troppo leggeri, mentre si versano si disperdono nell’aria, quindi bisogna tener conto di una percentuale di perdita maggiore di quella dei liquidi.

Quindi bisogna fare attenzione non solo al contenuto, ma anche alle condizioni intorno, per esempio a quelle meteorologiche.

Certo non basta averlo, l’imbuto: bisogna anche usarlo bene. Bisogna assicurarsi che l’imbuto stia ben fermo, quindi sarebbe meglio tenerlo con una mano mentre con l’altra si versa il contenuto; ma se si parte dalla famosa damigiana di Brunello, è difficile che ci si riesca. Allora ci si può far aiutare da qualcun altro.

Bisogna assicurarsi che sia pulito: l’olio irrancidisce a contatto con l’aria, il vino diventa aceto, la benzina è velenosa. Va pulito alla fine dell’operazione, oppure all’inizio, o meglio tutte e due le volte. Va anche controllato che non si fessurato, per usura o per un colpo, altrimenti fuoriesce tutto lungo i bordi. E’ un modo per dire che gli strumenti vanno manutenuti.

Alla fine dell’operazione, buttato via l’imbuto, bisogna tappare la bottiglia, altrimenti è tutto inutile.

Conclusioni

Che possiamo concludere? Che l’imbuto non è una (buona o cattiva) metafora dell’insegnamento, ma dei metodi e degli strumenti che si usano quando si vuole travasare conoscenza per distribuirla nel mondo.

Metodi che servono a controllare il travaso, a evitare che ci sia dispersione.

Strumenti che funzionano con certi tipi di conoscenze, o conoscenze in certa forma (fluida, cioè non strutturata fortemente, o molto parcellizzata). Strumenti che vanno manutenuti, verificati, controllati.

E poi c’è il rischio di intasamento: a cosa corrisponde? Per esempio ad un ritmo esagerato di versamento; o a una condizione sociale invasiva, oppure ad una conoscenza che tende a coagulare, a fare “mappazza”.

E se uno non vuole travasare conoscenza? Si poteva usare una metafora diversa? Certo. Per esempio, mescolare farina burro e uova per fare una torta. Oppure piantare un seme nel terriccio e innaffiarlo. O covare un uovo. Far cadere un granello di sabbia in una soluzione sovrassatura.

E per ogni metafora si poteva andare a scavare sulle sue condizioni reali d’uso.

Unire o dividere

Mar
24

Leggo un post di Davide Lamanna (amico da anni e esperto di tante cose, tra cui private cloud opensource) in cui segnala il disegno di legge della senatrice Laura Mantovani “Istituzione della Rete di interconnessione unica nazionale dell’istruzione – UNIRE”.
Non ho ancora letto il DDL (lo faccio appena possibile), ma l’intento di creare un cloud privato di proprietà dalla PA italiana per sostenere la digitalizzazione dei servizi della scuola è sicuramente buono, e va in una direzione che condivido: creare una rete che colleghi le scuole tra loro e con Internet, fornire servizi di memorizzazione dati o altri servizi che si possano decentrare. Tutto questo per superare il digital divide tra paesini e metropoli, tra province ricche e povere, tra nord-nord-est e sud-sud-ovest. Non tanto perché si difende la Nazione contro lo Straniero, ma perché si difendono gli studenti e il loro dati personali, perché non si creano dipendenze e abitudini a usare certi strumenti particolari che oggi ci sono, e sono gratis, e domani chissà.
Non sono però d’accordo su un punto riportato da Davide, che deriva mi pare da un’intervista alla Senatrice Mantovani, e cioè che “Nell’articolo 2 è previsto di sviluppare e fornire il servizio unico nazionale per la didattica digitale integrata. “
Aiuto: ancora il Servizio Unico Nazionale per la DDI?
Messo insieme ai “servizi amministrativi e connessi alle procedure di assunzione del personale della scuola.” Spero di sbagliarmi, ma mi sa ancora una volta di progetto di Piattaforma Unica di Stato. (Che in Francia ce l’hanno già, eh. Sì ma mica è detto che funzioni bene.)
Provo a dire ancora una volta perché non sono d’accordo.

  1. Una piattaforma per la didattica non è un’infrastruttura neutra. C’è una differenza enorme tra i servizi amministrativi, o quelli informatici come i DNS, e quelli didattici. I servizi didattici si rivolgono a studenti, che sono persone, non enti o macchine. Quindi devono essere pensati per loro e intorno a loro, in termini di interfaccia, di linguaggio, di funzionalità. Oltre agli studenti ci sono i docenti e poi i genitori. Una piattaforma unica per la didattica dovrebbe essere adatta a tutte queste persone diverse.
  2. Ma non c’è solo la differenza di età, c’è una differenza di scopo (corsi obbligatori e facoltativi, corsi teorici e pratici, laboratori e corsi che si costruiscono dal basso), di tipo di scuola e pure di tipo di formazione. Perché la scuola dovrebbe comprendere anche la formazione superiore e i CPIA. Insomma, la piattaforma dovrà essere personalizzata e personalizzabile.
  3. Quindi le competenze per progettare questa PUN non sono solo informatiche. Ci vuole un’équipe molto composita, e non fatta solo di esperti universitari, ma anche di docenti dall’infanzia all’università, e magari di studenti e studentesse, e perché no di genitori. Come si selezionano? Come si pagano? Da dove si parte? Con che modello di interazione e decisione? Come si pubblicano le scelte prima di adottarle?
  4. Immaginiamo quindi il tempo necessario per fare un’unica piattaforma con tutte queste varianti e tutte queste possibilità di personalizzazione. Quando sarà pronta la piattaforma unica? Diciamo entro tre anni? Un po’ tardi: tra tre anni non ci ricorderemo nemmeno più che esisteva un altro browser oltre Chrome. O invece, per sbrigarsi, si prenderà una cosa esistente e la si “rimarcherà” PiattaUnica? Temo che – a parte ADA, naturalmente 😉 – un’applicazione che soddisfi tutti i requisiti elencati sopra non esista.
  5. Ora pensiamo al futuro. Un mostro del genere va mantenuto, aggiornato. Non solo perché cambiano gli standard (con i browser che si adeguano oppure no) e i sistemi operativi mobile evolvono. Ma perché cambiano i modelli d’uso, gli obiettivi, le attività possibili. Cambiano proprio i ragazzini, cambia il mondo fuori dalla scuola. Dando per scontato che la licenza sia open, deve essere rilasciato tutto il codice sorgente. Ma poi che si fa, si attende che i bug emergano e che qualcuno li corregga? E chi verifica le correzioni, visto che andrebbero sulla Piattuna usata da TUTTE le scuole italiane? Come le si testano? Oppure si lascia sempre all’opera una task force che ha risorse economiche per i prossimi 5, 10 anni?
    Quanti software meravigliosi finanziati sono morti il giorno dopo la scadenza del progetto che li ha generati?
  6. “Si vabbè, allora vuoi che rimaniamo nelle grinfie delle multinazionali…”

    No. Dico solo che la soluzione per la didattica non è la Piattaforma Unica, ma un ecosistema di piattaforme diverse basato su questi tre punti:

  • delle linee guida nazionali che dicano cosa deve essere e cosa deve fare una piattaforma digitale per la didattica (licenze, supporto, privacy, funzioni, accessibilità). Linee guida estese, pubbliche e riviste ogni anno.
  • un registro nazionale dove venga iscritta ogni piattaforma in uso dalle scuole, in modo che sia verificabile e verificata. Ma anche in modo che sia possibile interrogarla in maniera automatica.
  • dei protocolli di interscambio di dati e di contenuti tra piattaforme.
    Se la scuola Rodari di Finaliquà ha prodotto dei contenuti, delle attività, dei test per la classe Terza che sono interessanti anche per la scuola Deledda di Pontedisopra, se i suddetti contenuti sono rilasciati con licenza adeguata, deve essere possibile collegarli, o clonarli e modificarli. Se la scuola Carducci di Montedisotto li ha comprati, quei contenuti, e sono protetti da una licenza che ne impedisce il riuso, allora la piattaforma non ne permetterà il riuso.

Credo che la varietà sia sempre preferibile, se non prolifera in una giungla impenetrabile. Una varietà che permetterebbe la compresenza di piattaforme e applicazioni più semplici, dedicate magari ad un solo livello di scuola, piccole e grandi, scritte in linguaggi diversi, fornite con contratti diversi (magari sponsorizzate) e soprattutto che danno da vivere a centinaia o migliaia di piccole imprese locali.
Che poi non vi lamentate se i giovani programmatori vogliono andare tutti a Mountain View o a Redmond.

Pensiero computazionale sì o no? Boh, dipende dal linguaggio.

Gen
27

Una delle motivazioni dietro la spinta all’introduzione della programmazione dei computer in giovane età (=coding) è quella per cui questa pratica insegna il pensiero computazionale, che è un modo di affrontare i problemi in maniera scientifica. Anche se Jeannette Wing si è affannata a dire che non si tratta di insegnare ai bambini a pensare come i computer, e Seymour Papert a predicare che bisogna insegnare ai computer come se fossero bambini, questo tema resta nell’aria. Computazionale significa “razionale, finito, corretto, misurabile” eccetera. In pratica, imparare il pensiero computazionale significa, per ogni problema, saper immaginare un algoritmo che lo risolva. Questo algoritmo deve essere eseguibile praticamente da un computer: non deve contenere errori, non deve basarsi su termini ambigui, non deve richiedere un tempo infinito o una memoria infinita per arrivare alla soluzione.

Però gli algoritmi si pensano (e poi si scrivono) diversamente a seconda del linguaggio, e a seconda del tipo di linguaggio che si ha in mente. Usare un linguaggio semplice quando si è ai primi passi è sicuramente una buona idea; ma cosa significa “semplice”? Può significare che costringe ad usare dei concetti e delle operazioni di base, vicine a quelle che sa fare il computer; oppure che spinge a nascondere i dettagli e a concentrarsi “semplicemente” sulla struttura dei dati e sugli obiettivi.

Insegnare ai bambini una forma di pensiero computazionale che li abitua a pensare nei termini del primo significato di “semplicità” rischia di creare più problemi – in futuro – di quelli che risolva adesso.

Voglio provare a spiegare questa differenza con un piccolo esempio.

Partiamo da Snap!, un ambiente di programmazione che pochi conoscono, che assomiglia molto a Scratch (ne è derivato) ma ha delle differenze importanti. Intanto è nato all’Università di Berkeley, dall’altra parte degli USA rispetto a Stanford, dove è nato Scratch. Poi ha un target più ampio, nel senso che può essere usato da bambini ma anche da ragazzi più grandi, perché è basato su un modello di linguaggio più potente di quello che sta sotto Scratch. Le differenze tra Snap! e Scratch sono poco visibili ad un primo approccio (si possono disegnare girandole o creare scenette animate con entrambi), ma sono molto profonde. Ne elenco solo tre fondamentali:

  1. A differenza di Scratch, in Snap! si possono creare funzioni, cioè procedure che alla fine restituiscono un valore, e questo è molto comodo perché permette di costruire delle catene di funzioni che si applicano ai risultati di altre funzioni.
  2. In secondo luogo, in Snap! ci sono delle funzioni per creare e gestire vere liste (di numeri, di lettere, di parole, ma anche di sprite, o di qualsiasi oggetto).
  3. Inoltre le funzioni possono essere usate come oggetti da altre funzioni. In altre parole: una funzione si può applicare non solo a oggetti semplici (come numeri, lettere) ma anche ad altre funzioni. In aritmetica conosciamo questo tipo di cose: la moltiplicazione è l’applicazione ripetuta della funzione somma.

Il terzo punto è particolarmente utile quando si vogliono trattare delle serie di dati. Se vogliamo trasformare una lista di numeri, o di lettere, o di parole, in qualche altra cosa dobbiamo applicare una trasformazione ad ognuno degli elementi della lista per ottenere una nuova lista; avere un linguaggio che permetta di fare direttamente questo tipo di operazioni permette di concentrarsi sul problema, e non sul meccanismo delle soluzione.

Mettiamo, per esempio, di voler generare la lista dei quadrati dei primi 10 numeri interi. Partendo da una lista di numeri interi, vogliamo moltiplicare ogni numero per se stesso. Cioè da 1,2,3,4,5… vogliamo ottenere 1,4,9,16,25 …

Questo in Scratch si può fare così:

  • crea una lista di numeri interi e dagli il nome “numeri”
  • crea una seconda lista e dagli un nome “quadrati”
  • crea un contatore e dagli il nome “i”, e valore 0
  • ripeti tante volte quanto è la lunghezza della lista “numeri”:
    • aumenta “i” di 1
    • moltiplica l’elemento i della lista “numeri” per se stesso
    • aggiungi il risultato alla lista “quadrati”

Saltando la parte di creazione delle variabili, ecco i blocchetti:

E’ semplice, sì, ma è anche un modo di pensare molto meccanico, che segue esattamente quello che succede “sotto il cofano”. Siamo noi che ci adeguiamo al modo di lavorare del computer, e non viceversa. Arrivare a questa formulazione non è banale: bisogna imparare a pensare in un certo modo. Bisogna imparare il concetto di contatore, di indice di una lista, quello di ciclo, di test di terminazione, eccetera. Sono gli elementi di base della programmazione classica.

Proprio questo è uno dei limiti dell’approccio “computazionale” di cui parlavamo sopra: si impara a pensare come un computer, o meglio secondo gli schemi che il linguaggio di programmazione che usiamo (in questo caso Scratch) mette a disposizione.

Da un lato questo apprendimento ha degli aspetti positivi: ogni volta che ci poniamo un limite impariamo nuovi modi di risolvere problemi. Dall’altro, restare dentro quei limiti non ci permette di andare molto lontano. Potrebbe esserci (non è mai stato studiato a fondo) una forma di imprinting per cui il primo modello di programmazione imparato resta quello fondamentale, un po’ come la lingua madre. Se i bambini imparano a usare i cicli per scorrere le liste, poi continueranno a farsi venire in mente questa modalità anche in futuro.

Ma usare i cicli è solo uno dei possibili modi di risolvere il problema dei quadrati. Ce ne sono altri, che dipendono dal linguaggio che si usa.

In Snap! si possono disporre i blocchetti esattamente nello stesso modo che in Scratch:

Ma si può fare anche qualcosa di diverso, più semplice e soprattutto più vicino alla struttura del problema.

Per risolvere il problema dei quadrati dei numeri interi non siamo costretti a pensare in termini di contatori e di indici, non dobbiamo per forza preoccuparci di sapere quando fermare il processo, dove mettere i risultati. Queste sono cose che riguardano la meccanica dell’algoritmo, non il problema in sé.

Qual era la cosa che volevamo fare, l’idea iniziale? Applicare la funzione “moltiplica per se stesso” a tutti gli elementi di una lista. Bene, allora cominciamo dalla lista

Questo blocchetto è una funzione che restituisce una lista costruita con gli oggetti che mettiamo negli spazi bianchi, in questo caso i primi cinque numeri interi. Non abbiamo bisogno di creare una variabile perché la funzione restituisce sempre quello che ci serve. Ora possiamo disporre i blocchetti in modo da rispettare esattamente l’idea originale di applicare la moltiplicazione alla lista:

Finito. Non c’è altro da fare. Questo blocchetto (“applica”) fa da solo tutto il lavoro: prende il primo elemento della lista, lo inserisce nei due buchi del blocchetto verde, esegue la moltiplicazione e mette da parte il risultato, poi passa al successivo. Alla fine restituisce una nuova lista con i risultati.

La presenza del blocchetto “applica” è una delle caratteristiche di Snap! (e dei linguaggi funzionali a cui si ispira) a cui facevamo riferimento prima. E’ una funzione che lavora su altre funzioni. Usando questo approccio, non ci servono variabili, contatori, cicli. Per certi versi, è molto più intuitivo e vicino al problema questo approccio di quello precedente, in cui dovevamo introdurre una serie di concetti di supporto.


In Snap! c’è un’altra maniera di ottenere questo risultato, ancora più semplice di quella che abbiamo visto adesso. Torniamo all’idea di partenza: “moltiplicare ogni numero di una lista per se stesso”. Ma invece di moltiplicare ogni numero per se stesso, possiamo partire da due liste identiche, e moltiplicare ogni elemento della prima lista per il corrispondente elemento della seconda.

Proviamo a fare esattamente questo:

Il risultato è lo stesso. In sostanza, l’operazione “moltiplicazione” normalmente si applica a dei numeri; ma in Snap! è stata estesa per applicarsi anche a delle liste. Naturalmente potremmo pensare di utilizzarla anche per moltiplicare due liste diverse, o per moltiplicare una lista per un numero singolo. Forse funziona anche con altre operazioni? Proviamo con l’operazione “elevamento a potenza”:

Funziona. Ed è abbastanza chiaro che è molto più semplice di tutto l’ambaradam che avevamo dovuto mettere in campo prima. Questa modalità ci libera di tutta la parte meccanica e ci spinge invece verso una maniera diversa di concepire il problema che volevamo risolvere, che a sua volta ci apre la strada verso altre possibilità.

In conclusione: attenzione al linguaggio che si sceglie, e non confondiamo la razionalità con la meccanicità.

Tecniche e tecnologie per la fantasia

Dic
11

Fantasia e tecnica non vanno d’accordo, si direbbe. Meno ancora fantasia e tecnologia: se c’è una, scompare l’altra. Quando entra in campo la tecnologia, il libero gioco dell’immaginazione dove va a finire? Però, però…

La tecnica del sasso nello stagno è descritta da Gianni Rodari nel secondo capitolo della Grammatica della Fantasia, come parte dello strumentario che serve a chi vuole inventare storie per i bambini, o con i bambini.
E’ una tecnica fondata sulle relazioni che uniscono parole nella mente, ma anche sul potere del caso nel sorprenderci e generare l’inizio di una storia.

Si pensa una parola… o meglio: la si chiede a qualcuno che passa di là, oppure la si pesca da un dizionario, o da un libro. Perché un libro? Perché è ancora più casuale, e dunque più sorprendente. Apri il libro a pagina 27, prendi la terza parola della quinta riga.
Poi si parte da quella parola per esplorare una serie di associazioni che servono a far emergere altre parole.
Per esempio, partendo da stasera possiamo andare a cercare:

le parole che cominciano allo stesso modo: stabilire, staccare, stagione, storia, studiare, stupido, …

le parole che finiscono allo stesso modo , cioè che sono più o meno in rima con stasera: camera, eccetera, lettera, maniera, opera

le parole simili, che si usano nello stesso contesto: stamattina, stanotte, prima, dopo, più tardi

E già nasce una storia:

Stasera, in camera, apro una lettera: sempre la stessa storia, la solita maniera, come un’opera eccetera eccetera – stupido! –

fino ad usare la lettere che compongono la parola per fare un acrostico:

  • Strada
  • Treno
  • Anima
  • Sangue
  • Egli
  • Ritornare
  • Appunto

Tutte queste parole nuove possono essere usate per creare una storia o una filastrocca.
Posiamo programmare un computer per fare (almeno una parte di) queste operazioni?
Sì, ed è quello che ho fatto qui con iKojo, la versione online di Kojo:
http://ikojo.in/sf/vylXgjC/10
Cliccate su RUN, prendete nota delle parole che vengono fuori (compreso l’acrostico) e poi iniziate a scrivere.
A me, partendo dall’acrostico di sopra – generato appunto dal programma – viene in mente una storia titanica (nel senso del film):

Lui è partito, col treno, chissà quanta strada ha fatto, ma ama lei fin nel profondo dell’anima. Lo ha giurato col sangue. Le aveva detto che sarebbe tornato, una sera di queste, e appunto, stasera…

Fa piangere già così, immaginate se poi lui stasera non dovesse arrivare …

Un altro risultato del Sasso nello Stagno

Il binomio fantastico è un’altra tecnica notissima, sempre dai primi capitoli della Grammatica.
Qui si prendono due parole a caso, possibilmente dalla mente di due persone diverse, o ancora una volta da un dizionario, da un giornale (dal web?).
Gli esempi di Rodari riguardano due sostantivi, ma non si vede perché non si potrebbero usare aggettivi o verbi; anzi, ci sono splendidi esempi di applicazione di questa variante nei racconti che mettono in scena i gemelli terribili, Marco e Mirko: “il leone bela”, “il lupo è dolce”, “il cielo è maturo”.
I due sostantivi si mettono insieme usando delle preposizioni: con, di, su, in (ma io aggiungerei: sotto, sopra, con, senza…).
Cosa fanno? si incontrano, si scontrano, vanno d’amore e d’accordo?
Per esempio: sasso, stagno (guarda un po’ che fantasia…)

  • il sasso nello stagno
  • il sasso di stagno
  • il sasso sotto lo stagno
  • lo stagno del sasso
    eccetera.

Ogni frase può essere l’inizio di una storia.
A me il sasso di stagno piace molto, mi fa pensare ad una palla di carta stagnola, di quelle della cioccolata, che usavo per giocare a calcio in corridoio da piccolo. E’ un sasso gentile e bellissimo, luccica come una pepita.

Una volta un minatore che lavorava a Canale Serci, sul monte Mannu, volle fare una sorpresa a suo figlio di tre anni e gli portò un sasso di stagno. Ma non era un sasso, era …

Se preferite, partiamo con una filastrocca. Il sasso di stagno richiama subito un ragno dispettoso, forse geloso, ma di chi? facile: di un cigno

Quel sasso di stagno
tirato da un ragno
geloso di un cigno
più bianco del regno…

Di nuovo vi chiedo: potremmo programmare un computer per fare (almeno una parte di) queste operazioni?
Sì, ed è quello che ho fatto qui:
http://ikojo.in/sf/EnNhE3O/12
Cliccate su RUN e state a guardare.


Sull’importanza del caso, sulla sua magia che ci costringe a renderci conto di quello che siamo (esseri che non possono impedirsi di dare senso a qualsiasi configurazione casuale, che vedono strutture chiuse ovunque) e sulla sua importanza per la didattica ho già scritto qui.

Se date un’occhiata al codice sorgente (a sinistra) vedete che a dispetto della semplicità apparente c’è invece parecchio lavoro sotterraneo per riuscire a mettere un articolo davanti ad un nome, o per costruire la preposizione articolata corretta. Non perché sia difficile la programmazione: perché è difficile la grammatica italiana, che deve dar conto di quasi mille anni di storia, di prestiti, di varianti locali, di sovrapposizioni. Anche questo è un esercizio di coding interessante, che richiede riflessione su come funzionano i meccanismi della lingua per poterli trasformare in algoritmi. Non è sempre necessario ricostruire tutto da capo, si può partire da pezzettini già pronti – è quello che ho fatto io e che fa chiunque programmi un computer.
L’idea più generale di accoppiare a caso sostantivi, proprietà, azioni, luoghi sta all’origine delle creazione di Limericks casuali a partire da una struttura (sintattica, ma anche narrativa): qualcuno, in qualche posto, fa qualcosa, e allora succede qualche altra cosa. Come finisce? E’ lo schema di tanti giochi, e anche delle fiabe a ricalco, un’altra tecnica descritta nella Grammatica della Fantasia nel capitolo 21 (ma ripresa anche in molti di quelli seguenti).
Entrambe queste possibili “applicazioni rodariane” del coding le ho descritte in “Lingua, coding e creatività”, che è un libro che cerca di scardinare l’idea che fare coding sia solo un’attività carina o che si debba fare solo per studiare le STEM; i codici sorgenti relativi, in Logo, Prolog e Kojo, sono nel sito di accompagnamento al libro e li possono scaricate tutti.

Bene, ora arriva la domanda cruciale: ma se usiamo un computer per tirar fuori tutte queste parole, non stiamo limitando la creatività nostra o dei bambini?
Io non credo. Per due motivi che mi pare possano fondarsi proprio su quello che Rodari ha scritto, come ho cercato di spiegare in “Rodari digitale“, l’ultima fatica di quest’anno.

Primo: la parte creativa non è quella di andare a cercare le parole, ma quella di costruire la storia. La ricerca delle parole è la parte meccanica, che richiede l’accesso ad un archivio di parole e alcune regole. Altrimenti basterebbe avere nove parole per fare una poesia (“Si sta come d’autunno sugli alberi le foglie”).

Secondo motivo: non sto proponendo di usare un programma bello e pronto, e nemmeno di cominciare da zero. Propongo di partire da un codice sorgente che funziona, ma di metterci le mani da subito. Cambiando le parole di partenza, cambiando le regole (per esempio: solo sostantivi o anche verbi? quali preposizioni?). Variando la tecnica: tre parole invece di due; oppure aggiungendo i prefissi e i suffissi, i diminutivi e vezzeggiativi.

Terzo motivo (non era previsto, ma lo aggiungo lo stesso): un computer sarà pure ottuso, ma non c’è limite alle cose creative che possono fare un umano e un computer, insieme.

Caso amico ti scrivo

Dic
04

Il ruolo del caso nella sperimentazione è fondamentale. Lo sanno gli artisti, che l’hanno usato come motore di generazione di opere. Basta andarsi a riprendere gli esempi di Queneau, di Calvino, dei dadaisti.
Ma a me il caso interessa come strumento didattico, di didattica della lingua e delle letteratura.
Per la precisione, come strumento che mette in evidenza la relazione tra semantica e sintassi, o meglio tra la staticità semantica e la tensione sintattica. La sintassi vista come una forza che spinge in una direzione precisa, mentre la semantica cerca di opporsi. Chiaro? Non tanto? Vediamo.

Partiamo da questa affermazione: “Un testo ha un significato complessivo che dipende dalle parole che lo compongono“.
Sembra una teoria banale. Ma è proprio vera?

Prendiamo un esempio: la poesia di Chamie Gorkin “Worst Day Ever?”. Questa poesia ha la particolarità di potersi leggere dall’inizio alla fine, oppure dalla fine all’inizio; ma offre un’interpretazione diversa, anzi opposta, a seconda della direzione. Non è un caso, naturalmente, è stata scritta apposta, sulla base delle convinzioni chassidiche dell’autrice.
Allora possiamo riformulare la nostra teoria: “Un testo ha un significato complessivo che dipende dalle parole che lo compongono e dal loro ordine. Se l’ordine delle parti del testo cambia, cambia anche il significato”.

Che succede se invece si mescolano i versi a caso? Beh, se gli elementi vengono mescolati a caso, il significato del testo si perde del tutto.
Ho scritto un frammento di codice in Snap! che fa proprio questo: scrive la poesia della Gorkin al dritto, al rovescio, e poi mescola i versi, ogni volta in maniera diversa. Lo trovate qui: https://snap.berkeley.edu/project?user=stefano63&project=worst_day

A priori potremmo dire che mescolando non si capirà nulla; ma se provate avrete delle sorprese. Compaiono dei frammenti, a volte lunghi tre-quattro versi, che sembrano avere un significato compiuto.
Perché? E’ una caratteristica di questa poesia particolare? Delle poesie in generale? O della maniera con cui sono stati scritti i versi?

In effetti, alcuni versi sono composti da una singola parola molto generica, che non ha valore di per sé, ma solo come aggancio tra il verso precedente e quello seguente (es. “Perché”, “Anche se”), oppure possono avere facilmente sia il ruolo di soggetto che di oggetti (“La realtà”, “Il mio atteggiamento”).
Altri sono fatti per rovesciare l’interpretazione del verso seguente (“E non è vero che”, “Non provare a convincermi che”). Insomma, il significato dei frammenti si costruisce in base all’accostamento di due o più versi, e il significato complessivo – se esiste – risulta dall’aggregazione di questi sotto-significati. Anzi: il significato si stabilizza alla fine della lettura, come una specie di media tra i sotto-significati.

Si può fare la stessa analisi, in maniera più semplice, a livello di frase. Prendiamo una frase semplice, di tre parole: due sostantivi (lupo, pecora) e un verbo transitivo (insegue).
La sintassi ci dice che quando il verbo è transitivo, il primo sostantivo è il soggetto e il secondo l’oggetto dell’azione espressa dal verbo. Il significato di:
lupo insegue pecora
è molto chiaro. Invertendo l’ordine delle parole la frase diventa
pecora insegue lupo
Dopo un momento di attrito, di sorpresa Rodariana, l’interpretazione torna ad assestarsi su quella precedente. Anzi, tutta la poesia che abbiamo imparato a scuola ci ha abituato a questo tipo di inversioni. Quella pecora messa all’inizio è un rafforzativo: è proprio la pecora che il lupo insegue, non un coniglio o una gallina.
Anche se si mescolano le parole, così:
pecora lupo insegue
insegue pecora lupo

il significato sembra resistere a tutti i nostri tentativi di scardinarlo.

Prendiamo una frase più complessa e mescoliamola.
il vorace gatto insegue un furbo topo
Potremmo ottenere:
topo gatto un vorace furbo insegue il
oppure
furbo un insegue gatto vorace il topo
Anche qui, il significato generale si capisce lo stesso, no? Perché?
Perché le parole sono semanticamente dense, e il rapporto tra esse si definisce indipendentemente dalla posizione reciproca. C’è una conoscenza implicita, anche se non diretta (non tutti hanno visto un gatto inseguire un topo) ma derivata dalle storie che abbiamo ascoltato o letto, che ci spinge verso un’interpretazione statisticamente più accettabile di quella opposta. I topi non sono descritti come voraci, e di solito non inseguono i gatti, tranne appunto nelle opere di Rodari.

Cambiamo frase di partenza:
credi che la vita sia felice non triste
Ora facciamo delle variazioni:
vita triste la credi non felice sia
la non credi felice vita sia triste

sia la vita credi triste non felice

Qui invece è evidente che l’ordine è fondamentale. “Triste” e “felice” si possono entrambi abbinare con “vita” senza che si possa sapere a priori quale relazione è più probabile (almeno, senza altre informazioni contestuali sulla biografia dell’autore, sul suo obiettivo, il destinatario).
Ci sono poi delle parole che acquistano un senso diverso a seconda della posizione. “Sia” è una parola ambigua, come un attore che può recitare parti diverse: può funzionare da verbo o da congiunzione; “credi” può essere un indicativo o un imperativo e anche “la” può essere articolo o pronome. Ovviamente la punteggiatura aiuterebbe a precisarne il ruolo (“ecco a che serve! ecco perché se non si usa succedono pasticci…”).

vita triste, la credi!, non felice sia
la non credi felice vita sia triste

sia vita – la credi triste? – non felice

Ecco allora spiegato il senso dell’esperimento: mescolare a caso consente di evidenziare il peso semantico, l’inerzia dei segmenti (delle parole, dei versi, delle frasi) rispetto alla tensione della sintassi, la quale invece spinge verso un’interpretazione che dipende dall’ordine degli elementi, secondo uno schema che si sovrappone alle parole. A seconda del valore di questo peso, la sintassi riesce, o non riesce, a rompere l’inerzia e a trascinare il significato nella direzione che vuole.
Questo è il valore didattico dell’uso del caso: rompere con l’abitudine a vedere le cose sempre nello stesso modo. Il caso ci propone un mondo non semplicemente al contrario, ma retto da regole diverse da quelle che conosciamo. Ci spinge ad esplorare queste regole, a confrontarle con quelle abituali e a capirle meglio.


Seconda parte: questo esercizio di applicazione del caso alla lingua si può fare a mente? Sì; ma è complicato se il testo è lungo. Si può fare su carta? Sì; ma se vogliamo cambiare testo dobbiamo ricominciare ogni volta da capo. Allora si può far fare ad un programma di computer? Eccoci qua.
Intanto sappiate che non è un’idea nuova; smontare e rimontare frasi lo si faceva anche con il linguaggio Logo, quello delle tartarughe, che oltre a permette di disegnare girandole e casette permette molto, ma molto facilmente di lavorare con liste di parole, rigirarle, estrarre pezzetti. Inoltre i computer sono abbastanza bravi a tirare fuori un numero a caso; più bravi di noi, che in qualche modo rischiamo di essere orientati da qualche associazione inconsapevole. Quindi sì, si può fare, e in più ha il vantaggio di permetterci di sperimentare con tanti testi diversi senza modificare il programma. Per esempio, invece della poesia della Gorkin si può provare con i versi della Divina Commedia. Come ho fatto qui: https://www.stefanopenge.it/inferno/

Il sommo poeta avrebbe amato
i computer?

Ma non c’è solo il vantaggio della forza bruta del computer.

Prima di provare a scrivere un pezzetto di codice che permette di rovesciare una poesia, bisogna domandarsi come si farebbe a mano, sulla carta. La risposta probabilmente è questa: si prende l’ultima riga della poesia, si cancella, e si ricopia in testa, e così via. E invece no, questa modalità non funziona: alla fine si ottiene la stessa poesia iniziale (provate). Quindi?
Quindi si possono usare due liste: quella iniziale (la poesia originale) e quella finale (la poesia rovesciata). Si prende l’ultimo verso dalla prima, lo si cancella e lo si mette come primo della seconda, e così via, finché la prima lista di versi è vuota.
Lo stesso sistema si può usare per mescolare a caso i versi di una poesia. Si prende una riga a caso dalla poesia originale, la si cancella da lì e la si inserisce in testa alla seconda lista. Quando la prima lista è vuota, la seconda contiene una copia mescolata.
Perché questa attenzione alla modalità carta-e-matita? Perché il coding serve soprattutto a questo: a riflettere sulla maniera in cui facciamo le cose, esplicitarla, discuterla, verificarla. A volte alcune cose pensiamo di saperle fare, ma non è vero; in questo caso, è l’occasione per andare a cercare dei metodi, che poi potremo mettere in pratica. In generale, il percorso è da dentro a fuori, e non il contrario. Una volta fatto questo, si può cominciare a scrivere codice (o a trascinare blocchetti, come preferite).
Ma ci sono tanti modi diversi di mescolare un testo. Possiamo aggiungere dei vincoli: nessun verso deve restare nella posizione originale; oppure le coppie di versi presenti nella poesia originale non devono ripresentarsi insieme in quella mescolata. Questo sarebbe un po’ noioso da fare sulla carta, ma non particolarmente con la versione digitale.
Usare un computer per programmare questo frullatore di testi offre però un altro vantaggio che è legato alla “consapevolezza” dei programmi, cioè al fatto che quando fanno un’azione possono registrarne il risultato, cosa che per noi umani è più lungo e faticoso, e soggetto ad errore. Siccome le azioni che fa il programma le possiamo accelerare e rallentare a piacere, possiamo fargli generare cento volte una nuova versione mescolata a caso e registrarle tutte.
Potremmo misurare il grado di mescolamento della frase in termini di distanza dalla versione originale. Poi possiamo “votare” le versioni in cui il significato è più chiaro, e mettere i voti in relazione con il grado di mescolamento degli elementi. Alla fine potremo verificare se è proprio vero che un’insalata più assomiglia all’originale, più mantiene il significato; o forse scopriremo altre regolarità. Per esempio, pensando ad una frase: ci sono parole che galleggiano più facilmente di altre? i verbi hanno un ruolo più importante? oppure le preposizioni? o le parole astratte? E le relazioni transitive soffrono di più dello spostamento rispetto alle descrizioni di una qualità o di uno stato? Eccetera.

Insomma ecco un altro esempio di come fare coding possa servire a mettere alla prova una teoria implicita e a imparare qualcosa su come funziona il mondo.

Della solitudine e i suoi rimedi

Nov
22

Chi ha la fortuna di abitare in campagna, o in montagna, o al mare, o insomma ovunque meno che in città, vive in mezzo ad altre vite. Se si guarda intorno scopre cani e gatti, volpi e tassi, scoiattoli e topi; e poi passeri, corvi, merli, upupe. Per non parlare di mosche api e zanzare, farfalle ragni e scarafaggi, vermi e lumache. Ci sono alberi, cespugli, erbe, funghi, muffe e cose ancora più piccole di cui non sappiamo nemmeno il nome. Insomma avete capito.

Ognuno di questi esseri è un soggetto a tutti gli effetti, ha una vita propria che si intreccia con quella degli altri. Fa delle cose indipendentemente da noi, esiste indipendentemente da noi. Ognuno, se ci facciamo caso, ci sorprende. La sensazione generale è che se noi stiamo fermi, il resto del mondo invece si muove.

In un appartamento di città, invece… a parte qualche zanzara, qualche scarafaggio e qualche tarma (ospiti non graditi), qualche animale importato dall’esterno (Fido, Micio e Cocorito), il ficus Benjamin sofferente nell’angolo del soggiorno, la stella di Natale perenne e i gerani sul balcone… insomma, di esseri viventi in un appartamento di città se ne vedono pochini.

In questa scatola piena di oggetti se noi stiamo fermi, non succede niente. Il libro che abbiamo messo in quello scaffale continua a stare lì. Il maglione nello sportello in alto, sepolto sotto gli altri maglioni, non cambia di posto, di colore, di dimensione. Le cose di cui ci siamo circondati non sono soggetti, sono davvero solo oggetti.

E allora si capisce perché uno si circondi di macchine: orologi, lampadine, scaldabagni, radio, televisori, telefoni, computer, ognuno con il suo linguaggio visivo e sonoro, con le lucine colorate, i ronzii, crepitii.

Questi sì che sono soggetti: se carico un orologio, quello va avanti da solo. La radio parla e parla, il televisore mostra cose che io non conosco. Per non parlare di telefoni e computer che completano l’illusione che da qualche parte ci sia qualcun altro come noi, in un appartamento, circondato di macchine amichevoli e autonome. Per non parlare, ovviamente, dei vari Alexa e compagnia, con cui possiamo conversare anche quando l’ultimo degli amici è andato a dormire.

Certo non sono organismi del tutto indipendenti, sono solo giocattoli, nel senso che possiamo sempre spegnerli e riaccenderli a volontà, o almeno così ci sembra. Sono tutto sommato prevedibili, a grandi linee, e questo ce li rende ancora più cari e indispensabili.

Peraltro funzionano bene anche nell’altro senso, come parafulmini. Se dormo troppo, la colpa è della sveglia. Prendo chili nel posto sbagliato per colpa dell’e-reader. Strade violente: me la prendo con la TV. Se c’è una pandemia, la colpa è del PC. Non mi chiama nessuno? E’ colpa del telefonino, che anzi adesso me lo cambio e prendo quello che ha più cose e vedrai te.

Ma allora smettiamola di lamentarci della tecnologia fredda, distante, che ci rende tutti robot e ci fa perdere le capacità empatiche e ci addestra a tarpare la nostra emotività. E’ una storiella che non corrisponde più alla realtà e nemmeno alla nostra esperienza quotidiana.
Questa tecnologia è stata costruita apposta per non essere più fredda e distante: il suo chiacchiericcio continuo, come il borbottio dei robot di Star Wars, è la colonna sonora delle nostre vite. Altro che distante: è sempre più presente e si mette in mezzo proprio come un cucciolo che ci gioca tra i piedi, e che ogni tanto prendiamo a calci.

Questa tecnologia è la nostra coperta di Linus.
Ne parliamo male tutti i giorni, ma non potremmo mai rinunciarci.

Ah, io abito in campagna.