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.