The joy of programming

In questo secondo articolo (questo è il primo) dedicato ai linguaggi di programmazione parleremo di concetti come gioia, divertimento, serenità, estetica, pace mentale …

L’idea è di fare una carrellata delle features introdotte dai linguaggi moderni, e vorrei iniziare da quelle che mi sembrano più importanti: quelle che aiutano a creare e mantenere uno stato mentale adatto e a permettere quindi all’inconscio di fare le sue magie.

Photo by Dids ddd on Unsplash

« … a casa ho un libretto di istruzioni che apre grandi prospettive al miglioramento della prosa tecnica. Comincia così: “Il montaggio della bicicletta giapponese richiede una grande pace mentale”».

«Provate a osservare un apprendista o un operaio scadente e paragonate la sua espressione a quella di un artigiano di prim’ordine e vedrete la differenza. L’artigiano non si attiene mai alle istruzioni. Decide man mano quel che deve fare; sarà concentrato e attento senza il minimo sforzo. I suoi movimenti e la macchina sono come in sintonia. È la natura della materia su cui lavora a determinare i suoi pensieri e i suoi movimenti, e questi, a loro volta, cambiano la natura della materia. La materia e i pensieri dell’artigiano si trasformano insieme, cambiando gradualmente, fino al momento in cui la mente è in quiete e la materia ha trovato la sua forma».

Pirsig, Robert M.. Lo Zen e l’arte della manutenzione della motocicletta

Espressività, pulizia sintattica

Provo a raggruppare qui le features che hanno a che fare con l’espressività: quelle che permettono di esprimere concetti con meno rumore possibile.

Il legame con la pace mentale di cui sopra è che meno dettagli dobbiamo tenere in mente più il nostro cervello lavora bene. Quanto maggiore è la sintesi che il linguaggio permette, e minore è il boilerplate 1, tanto maggior è la possibilità di concentrarsi sul problema da risolvere.

String interpolation

Costruire una stringa inserendo il risultato di un espressione. Ad esempio questo codice “C”

int quanti = 3 * 7 * 2 ; 
char buff[200]; 
sprintf(buff, "Essi sono %d", quanti);

diventa in Ruby

"Essi sono  #{ 3 * 7 * 2 }."

Ruby è stato il primo ad introdurre questa feature, ora è presente ad esempio in CoffeeScript, JavaScript, Elixir, Groovy, Kotlin, Nim, Swift, Crystal.

No semicolon, No return statement

Può non sembrare una gran cosa, ma non avere la necessità di chiudere ogni linea di codice con un terminatore (in genere il punto e virgola), o di usare esplicitamente lo statement return ,rende i programmi più leggibili. Molti dei nuovi linguaggi vogliono il semicolon solo per separare due espressioni sulla stessa linea, e il valore ritornato da una funzione è generalmente l’ultima espressione calcolata.

Tuple

Un tipo di dato ormai presente in tutti i linguaggi nati in questo secolo e qualcuno di quello precedente: sono liste di lunghezza finita i cui elementi possono essere di tipi diversi. Permettono, tra le altre cose, di avere funzioni che ritornano valori multipli (cosa che in linguaggi più datati richiede un discreto lavoro e porta a programmi meno leggibili).

Un esempio in Rust:

fn main() {
    let x = (2, 3);
    let y = swap(&x);
    println!("Hello, world! {} {}", y.0, y.1);
}

fn swap(x:&(i32, i32)) -> (i32, i32) {
    (x.1, x.0)
}

// produce: Hello, world! 3 2

Rust quanto a leggibilità non eccelle, ma ha altre virtù.

Pattern Matching / Destruction

Questa è una delle più significative, permettere di smontare strutture dati dichiarando un set di variabili locali che assume i valori dei corrispondenti campi della struttura originale. Si può usare nelle assegnazioni, nei parametri di una funzione o in alcune strutture di controllo (if, case/switch).

Nell’esempio sotto un tuple literal in Elixir viene creato e poi scomposto o nei suoi valori.

{:ok, result} = {:ok, "good"}
# la variabile result a questo punto vale "good"

pippo = case {:ok, "bene"} do
              	{:ok, result} -> "Molto " <> result 
           	{:error, why} -> "Bad " <> why
                _ -> "Nothing matched"
         end
# pippo vale "Molto Bene", l'operatore <> concatena due stringhe, vedete che il case ha riconosciuto lo schema della tupla e ha estratto nella variabile result il secondo elemento.
# La variabile _ significa don't care.

Per quelli-che-sanno: lo so che Elixir non ha variabili 2

Questa feature è presente in parecchi linguaggi con sintassi diverse, ma Elixir qui eccelle. La sintesi che questo tipo di notazione raggiunge, è notevole. Il codice sopra, riscritto in “C” potrebbe, ad esempio, diventare:

enum flag {OK, ERROR};
typedef struct _T {
	flag res;
	char * result;
} Pair;
Pair stuff = {OK, "good"};
char * result;

if (stuff.flag == OK) {
	result = stuff.result;
} else {
	exit(1);
}

char pippo[300];
Pair stuff2 = {OK, "bene"}
if (stuff2.flag == OK) 
	sprintf(pippo, "%s %s", "Molto", stuff2.result);
else if (stuff2.flag == ERROR)
	strcpy(pippo, "Bad"
else
	strcpy(pippo, Nothing matched)

Enum con valori

Il miglioramento qui è permettere di dichiarare enumerativi che contengono dati. Anche questa è stata introdotta in parecchi linguaggi.

Al posto di

enum DayFitness {SVEGLIA, COLAZIONE, CORSA, WORKOUT}

posso dire

enum DayFitness {Sveglia(ora: DateTime), Colazione(calorie: i32), Corsa(km: f32), Workout(minuti: i32}

Di fatto funziona un po’ come le union del C: con l’aggiunta che l’enum dice anche qual’è l’assetto corrente della union.

I linguaggi che hanno questo tipo di enum le combinano col pattern-matching, per cui, sempre in Rust posso scrivere:

let oggi:DayFitness = Corsa(20.0);
match oggi {
        Corsa(km) if km > 0.5 => 
		println!("Naaa, {} km di corsa oggi te li fai te !", km),
        Corsa(km) => 
		println!("Dai che un po' di attività fisica fa sempre bene"),
	_ => println!("non dovevamo andare a correre ?")
    }

e ottenere un secco rifiuto.

Closures

Una volta qualcuno ha detto che le closures erano le classi dei poveri, e gli hanno risposto che erano le classi a essere le closures dei poveri.

Sono uno strumento espressivo straordinario. Nascono col Lisp, sono tipiche di un approccio funzionale, si tratta infatti di assegnare una funzione a una variabile, ci hanno messo un po’ ad affermarsi, ma ora le hanno praticamente tutti i linguaggi moderni.

Un piccolo esempio in JavaScript, tanto per cambiare:

<!DOCTYPE html>
<html>
<body>

<button id="Click" type="button">Click Me!</button>
<button id="Increment" type="button">Click Inc!</button>

<p id="demo"></p>

<script>
function buildClosures() {
  var a = 4;
  
  myF = () => {
    document.getElementById("demo").innerHTML = a * a;
  } 
  incF = () => {
    a = a + 1;
  } 
return [myF, incF]
}
data = buildClosures()
myFunction = data[0]
incFunction = data[1]
document.getElementById("Click").onclick = myFunction
document.getElementById("Increment").onclick = incFunction
</script>

</body>

La pagina che viene fuori da questo HTML (potete caricarlo in un browser per provare) crea due bottoni. Premendo il primo viene visualizzato il quadrato della variabile a (inizialmente 16). Ogni volta che si preme il secondo bottone la variabile a viene incrementata di 1. Alternando quindi il click sui due bottoni vedrò la sequenza 16, 25, 36, 49, 64 …

La funzione buildClojures, che viene chiamata al caricamento della pagina ritorna due closures (myF e incF) che vengono assegnate ai due bottoni, verranno eseguite ad ogni click.

Guardate dentro a buildClosures. La variabile a, inizializzata a 4, è una variabile locale, esiste solo finché la funzione buildClosures è in esecuzione, eppure viene usata/modificata dalle due funzioni. Le due funzioni sopravvivono alla fine della buildClosures (essendo depositate nei bottoni), e quindi continuano a usare la variabile a anche quando questa è uscita di scena.

Questo ritornare un puntatore a una variabile locale sarebbe stato un peccato mortale in “C”, per chi c’è passato, diventa invece qui un valore. Una closure cattura le variabile a cui accede, assieme al loro valore e le conserva in un posto sicuro.

E’ notevole, tra l’altro, che siano state implementate anche in linguaggi statici e compilati, come Rust, Go e Crystal.

Easy thread creation syntax / Green threads

E quale uso migliore di una closure si può trovare che farne il corpo di un thread ?

La sintassi con cui questi nuovi linguaggi permettono la creazione di thread è sempre molto limpida. In genere è della forma

thread_id = spawn(closure)

esegui questa closure in un thread separato.

Ma parlando di thread non possiamo tralasciare un accenno ai green thread o light thread. Il problema è quello di voler usare molti thread per esigenze espressive del programma, ma non voler usare troppi thread veri (quelli offerti dal sistema operativo) che sono risorsa preziosa. I green thread sono la risposta a questo: il runtime (o la virtual machine) del linguaggio alloca un pool di thread veri e permette al programma di crearne molti di più di tipo green, gestendo lui (il runtime/VM) la concorrenza interna e allocando con uno scheduling l’esecuzione dei thread green su quelli veri.

What’s next

Nella prossima puntata parleremo delle features più caratteristiche dell’approccio funzionale (ma che ormai in buona parte sono presenti in molti linguaggi non rigorosamente functional). Sono features che considero a metà tra espressività e robustezza/preformance del programma.

In quella dopo pensavo di parlare delle features che hanno più a che vedere con l’organizzazione del codice, gestione della macro-complessità anziché della micro (l’espressività appartiene a quest’ultima categoria).

E, infine, vorrei fare una piccola passerella dei linguaggi che a me sembrano più significativi: quelli che bisogna assolutamente imparare quest’anno 😜.

  1. Viene chiamato così l’insieme di istruzioni che devo inserire nel programma per far contento il linguaggio, non finalizzate al mio lavoro.
  1. Per i curiosi, a questo punto. In Elixir non ci sono assegnazioni: i dati sono assolutamente immutabili, ne parleremo la prossima volta. Quell’uguale è ancora un pattern-matching, sta dicendo: “Se il primo parametro della tupla è :ok associa al simbolo ‘result’ il valore del secondo parametro, altrimenti fai crashare il programma. Che sembra drastico, ma Elixir ha una filosofia di eutanasia rapida che prescrive di far morire un task alla prima anomalia (in genere si tratta di green thread il cui lifecycle è sotto il controllo del programma). Per errori previsti il pattern-matching si fa in un case come mostrato nell’esempio.

Piccoli Schrödinger crescono: il credente e l’Option<T>

È che volevo scrivere di linguaggi di programmazione, stavo raccogliendo materiale mentale per il prossimo post di quella serie, ma è anche Pasqua … insomma, mi si sono incasinati i concetti e ne è venuta fuori una cosa tecno religiosa.

Dallo spaghetti like programming all’Option<T>

Stavo riflettendo su questo Option<T>. È una piccola perla apparsa in linguaggi di programmazione piuttosto recenti 1. E’ un modo di gestire l’incertezza. Giusto un esempio, per capirsi. Supponete di dover scrivere un programma che regola un termostato, quello che deve fare è semplice: leggere la temperatura da un sensore, confrontarla con la temperatura impostata dall’utente e accendere o spegnere la caldaia in funzione del risultato del confronto. Ma nel mondo reale niente va come previsto: il sensore di temperatura potrebbe essere difettoso, ad esempio, o rotto o non esserci proprio, e il nostro povero programma il valore della temperatura potrebbe non riceverlo. È necessario quindi un controllo e questo controllo porta a diramazioni. In pratica ad ogni passo il programma dovrebbe chiedersi se tutto sta andando come previsto e, eventualmente, prendere direzioni diverse. In breve diventa illeggibile per i troppi rami di cui tenere conto.

Così nasce l’Option<T>. Si tratta semplicemente di una scatola che può contenere un valore oppure no. Ma questa scatola può essere usata per fare operazioni. Ad esempio posso prendere la scatola “Option<temperatura>”, che contiene il valore del sensore oppure no, e confrontarla con un 20 gradi e produrre la scatola “Option<accendi-o-spegni-la-caldaia>” e quest’ultima può essere vuota o contenere l’azione da fare. Alla fine posso aprire la scatola e se è piena eseguire l’azione. Se è vuota dico “pazienza” e magari segnalo la cosa a qualcuno.

Insomma l’informatica impara a lavorare con l’incertezza.

Io credo che sarebbe sano applicare un principio analogo all’esistenza di Dio.

Non c’è nessun modo, per un essere umano, di stabilire con certezza né che Dio esista né che non esista. È una scatola chiusa, che non apriremo noi. Forzarne l’apertura, e pronunciarsi sul suo contenuto, si chiama fanatismo. Possiamo decidere che sia piena o che sia vuota, ma in ogni caso stiamo facendo una scemenza: non era in nostro potere pronunciarci. Aprire la scatola è cercare la rissa, è cercare un gruppo di cui sentirsi parte o qualcuno di parte opposta da combattere.

Il punto è che siamo tutti pazzi

Ci presentiamo all’esterno come un’unica persona, anzi, come una personalità, un’astrazione di persona, quasi definita a tavolino, ma all’interno siamo vulcani in piena attività, arene su cui decine di pulsioni, esigenze, abitudini, paure, dipendenze, lottano per prendere il sopravvento e prendere la decisione del momento presente. Ma la nostra vita sociale non sarebbe possibile se ognuno di noi non proiettasse all’esterno una facciata coerente, stabile, affidabile. Abbiamo bisogno di catalogare gli altri, ridurli a concetti gestibili, e perché sia possibile gli altri devono presentarsi a noi (e di conseguenza noi a loro) con un avatar prevedibile, affidabile, coerente.

L’ipocrisia, come il pettegolezzo, non sono difetti in sé, hanno una precisa funzione nella costruzione della società, ma è importante mettere a fuoco questa loro funzione e non esserne vittime noi stessi. Invece spesso cadiamo nell’equivoco di credere di essere davvero questa finzione che costruiamo ad uso sociale: no, noi siamo altro, ben più complessi e imprevedibili di quello che vogliamo far credere.

La scatola del dubbio

Il problema, riguardo alle nostre convinzioni più profonde e’ che vogliamo inserirle in questo profilo pubblico, quello con cui ci presentiamo agli altri: vogliamo dire “io sono cristiano”, “io sono buddista”, “io sono ateo” per poter far parte di quel particolare gruppo: fingiamo di conoscere il contenuto della scatola, ma di fatto, razionalmente, nessuno può farlo.

Potremmo fare tutto quello che facciamo o non facciamo, potremmo fare del bene o fare del male, impegnare il nostro tempo approfondendo temi filosofici e religiosi o ubriacarci alla follia conservando la nostra sana dose di dubbio.

L’essenza del fatto religioso appartiene al vulcano, al tumulto interiore che processa senza sosta emozioni e ogni tanto fa affiorare alla coscienza l’aver notato qualche “coincidenza” importante, qualche eco di un assoluto che ci parla, la filigrana di un disegno di cui, per un attimo ci sentiamo parte. E tutto questo avviene all’interno della scatola del dubbio, non abbiamo bisogno di aprirla.

Secondo me fingere di conoscere il contenuto della scatola Option<Dio> e’ follia non solo per i Gentili, come diceva Paolo di Tarso, ma anche per i credenti.

Buona Pasqua.

(P.S. Il roveto ardente della foto è solo quello su cui ho appena grigliato le costine.)

  1. Ce l’hanno, ad esempio, Scala e Rust, in Swift si chiama Optional, ma e’ la stessa cosa.

Deve comandare lui o noi ?

Mi è venuta voglia di parlare di Dittatura e Democrazia dopo aver visto alcuni dei commenti alla favola di “Anna, Marco e Raffaello”. Mi sembra di aver inavvertitamente toccato il nervo scoperto della voglia di dittatura che coviamo un po’ tutti. Riflettendoci, poi, credo che questo tema possa far parte a pieno titolo del discorso sul contrasto tra Evoluzione e Cultura, insomma è uno dei punti focali della nostra esistenza.

Il mio nemico non ha divisa
Ama le armi ma non le usa
Nella fondina tiene le carte visa
E quando uccide non chiede scusa
Il mio nemico non ha nome
Non ha nemmeno religione
E il potere non lo logora
Il potere non lo logora
Il mio nemico mi somiglia
È come me
Lui ama la famiglia
E per questo piglia più di ciò che da
E non sbaglierà
Ma se sbaglia un altro pagherà
E il potere non lo logora
Il potere non lo logora

Daniele Silvestri (Il mio nemico)

Photo by Felix Mittermeier on Unsplash

Il Re.

Decisamente l’esistenza, nei vari gruppi di persone in cui da sempre si è strutturata l’umanità, di un regnante, di una persona che prende decisioni per tutti è un meccanismo evolutivo. L’Evoluzione aveva bisogno di raggiungere due obiettivi apparentemente contrastanti:

  • selezionare i geni migliori.
  • assicurarsi che il maggior numero possibile di individui della specie sopravviva.

Se avesse puntato solo sul primo obiettivo, il maschio alfa di ogni gruppo avrebbe potuto semplicemente sterminare i concorrenti maschi, perpetuando la specie attraverso le femmine rimaste. Questo modello ovviamente non avrebbe mai funzionato: il gruppo sarebbe restato indifeso da attacchi di predatori animali o umani, sarebbe mancato il sostentamento, e in definitiva, i figli stessi del maschio alfa sarebbero presto diventati i suoi concorrenti.

L’unico modello che l’evoluzione lasciava aperto era che i competitors del re sopravvivessero (diventando tra l’altro anche dei backup in caso di morte del primo), e restassero subordinati a lui, sotto il profilo riproduttivo, ma anche sotto quello decisionale. L’Evoluzione operava anche selezionando i vari gruppi, per cui la bontà delle decisioni del re veniva premiata con la sopravvivenza del suo gruppo rispetto agli altri.

Ma come fa il maschio alfa a dominare gli altri ? Forse non è una domanda così banale. La prima risposta che viene in mente è “li mena”. Ed è vero: la brutalità fisica è la sua arma, ma il sottomettersi degli altri è legato ad altro. E’ un calcolo. Ed è anch’esso un meccanismo evolutivo. Gli animali e gli esseri umani non passano il loro tempo a farsi guerra, se non in casi eccezionali: hanno un meccanismo di simulazione per cui capiscono in anticipo come andrebbe a finire un eventuale scontro e si comportano di conseguenza. Orazi e Curiazi all the way insomma. Quindi i sudditi si assoggettano volontariamente perché hanno precalcolato che in un eventuale scontro col capo soccomberebbero.

Il popolo

A questo punto la domanda sorge spontanea: “Ok, il singolo suddito soccomberebbe alla lotta col capo, ma se lo affrontassero tutti insieme, il calcolo darebbe sicuramente per perdente il boss. Perché non succede ?”.

Beh, per succedere succede. Magari non frequentemente, ma le rivoluzioni accadono. In genere, però, accadono quando il popolo è portato all’esasperazione. Finché il governante riesce a mantenere una forma di benessere anche moderato per i sudditi, o finché il suo Divide et imperat funziona, è difficile che il popolo si ribelli.

Quello che ostacola questa ribellione, secondo me, è la difficoltà, per i sudditi, di immaginarsi un ordine diverso da quello gerarchico. Se la presa del potere da parte del popolo si traduce in una nuova dittatura (come normalmente succede) dove sta il guadagno? E se non è un nuovo singolo a prendere le redini cosa succede ? Come viene regolato il nostro stare insieme ?

Il fatto è che non abbiamo meccanismi evolutivi che ci guidino nella realizzazione di questo nuovo tipo di organizzazione. La Democrazia è davvero un faticoso frutto della Cultura, di quel qualcosa che stiamo creando in sostituzione dei meccanismi evolutivi. E siamo ben lontani dall’averla realizzata la Democrazia, i problemi sono tanti. Ma andiamo con ordine: vediamo prima di capire di cosa stiamo parlando.

Giochi

Conoscete il Dilemma del prigioniero ? E’ un gioco in cui viene simulata la situazione di due carcerati, che si suppone abbiano compiuto un crimine insieme. I due vengono tenuti separati, non possono quindi mettersi d’accordo, e a ciascuno viene proposto di confessare (inguaiando in tal modo il compagno) con le seguenti regole:

  • Se uno dei due confessa e l’altro no, il primo esce subito e all’altro vengono dati 7 anni.
  • Se tutti e due confessano si beccano 6 anni ciascuno.
  • Se nessuno dei due confessa escono entrambi dopo 1 anno.

La soluzione razionale, dal punto di vista del singolo, è di confessare, e il risultato normale è quello tutto sommato non ottimale in cui entrambi stanno sei anni in carcere.

La soluzione migliore, se consideriamo la coppia nel suo insieme, è che nessuno dei due confessi, ma questo richiede una grande fiducia nell’altro. La costruzione della democrazia, secondo me, passa dalla capacità di un gruppo di vincere a questo gioco.

Ma mettiamo altra carne al fuoco: il gioco dell’ultimatum. A due persone viene data una somma di 100 euro da dividersi con le seguenti regole:

  • A fa una proposta di divisione (ad esempio “Mi tengo 60 euro e ne do 40 a te”)
  • Se B accetta si dividono i soldi come proposto da A
  • Se B non accetta nessuno prende niente.

E’ chiaro che se B reagisse solo razionalmente accetterebbe qualsiasi cifra superiore a 0. Sapendo questo la proposta più ovvia per A sarebbe “Ti do 0.1 e mi tengo 99.9”. Sembra invece che il risultato sia spesso che offerte minori del 30% vengono rifiutate, qualcuno spiega la cosa dicendo che consideriamo l’equità un obiettivo più importante del guadagno, secondo me è solo il nostro senso del derby: la cosa importante è misurarsi con l’altro e uscirne vincenti, perdere molto tutti e due è meno peggio del caso in cui io perda poco ma l’altro guadagni molto.

Gossip

Leggevo tempo fa, credo in un libro che ho già citato in questo blog “The Happiness Hypothesis”, che tra le ipotesi sul perché la specie umana abbia sviluppato un linguaggio così sofisticato c’è quella che servisse uno strumento per fare gossip. Oggi la predisposizione a fare o ascoltare pettegolezzi è considerata un tratto deteriore di una persona, almeno tra le persone che frequento, e almeno a parole, ma ha avuto una funzione importante nel progresso dell’umanità. E continua ad averla, magari in altre forme, come la reputazione dei profili sui social networks.

Il pettegolezzo serve a costruire una reputazione. La reputazione è la base della possibilità di cooperazione. Se decidiamo di mettere insieme il raccolto di un gruppo di famiglie o le catture di un gruppo di cacciatori o pescatori e dividerle equamente come forma assicurativa contro i momenti meno fortunati di qualcuno, è importante assicurarsi che tutti collaborino davvero. Se uno non lavora, perché tanto la pappa è assicurata dal lavoro degli altri, il gossip lo smaschera. La reputazione permette di estendere il gruppo: possiamo fare affari con persone che personalmente non conosciamo perchè la loro reputazione fa da garanzia.

La reputazione è quello che permette ad un gruppo di ottenere la soluzione migliore al dilemma del prigioniero. Letteralmente: il senso dell’onore, il non essere additato come spia, sono le forze che fanno si che una persona faccia la scelta meno individualmente razionale in quel gioco: rischio di farmi 7 anni di carcere e lasciare l’altro libero perché so che il gruppo fuori me la farebbe pagare se facessi una scelta diversa, e il sapere che anche l’altro è sotto lo stesso tipo di pressione facilita questa scelta.

Ma funziona anche fuori dagli ambienti malavitosi: negli stati un po’ più avanti di noi, credo, sulla strada della democrazia, atteggiamenti come non pagare le tasse, sporcare o rovinare beni pubblici, non riciclare, in alcuni casi anche usare l’auto quando una bici sarebbe sufficiente, sono viste come riprovevoli e sono oggetto di sanzione sociale. Il vicino non ti saluta più, nessuno ti presta qualcosa, nessuno vuol fare affari con te, se hai un negozio chiudi e i tuoi figli hanno vita difficile a scuola. E questo funziona: anche qui il dilemma del prigioniero viene tendenzialmente vinto dal gruppo: le tasse le pagano tutti e quindi ognuno deve pagare meno, i beni pubblici e le strade sono funzionanti e puliti, la corruzione è molto minore e via dicendo.

Ccà nisciuno è fesso

Nei paesi come il nostro, che, credo, sono un po’ più indietro su questa strada, il pensiero dominante è d’altro tipo: il singolo che riesce a farla franca e, ad esempio, a non pagare le tasse o a far funzionare bene la propria azienda grazie alla corruzione dei politici è visto come un furbo, come un eroe che ce l’ha fatta contro lo stato tiranno.

Forse c’è anche del buono in questo: magari è un retaggio di situazioni diverse, in cui questo atteggiamento aveva più senso. Sotto una monarchia assoluta e tirannica, che depreda il popolo per mantenere la corte negli agi sfrenati, non pagare le tasse è davvero eroismo: è una sfida al tiranno, un modo di riequilibrare una situazione inefficace per il gruppo. In questo caso il gossip è giustamente premiante.

Questo atteggiamento riportato in una società democratica ci dice semplicemente che molte persone non la ritengono tale: “la politica è una cosa sporca”, chi fa politica è lì per nutrire il proprio interesse, è la nuova corte che ingrassa a spese dei poveracci. E il bello è che, almeno in parte, è vero.

In fondo è di nuovo un dilemma del prigioniero tra l’elettore e l’eletto: pago le tasse perché mi fido che una volta al potere non ruberai, gestirai al meglio le cose e alla fine io pagherò meno tasse e avrò più servizi o non mi fido, non le pago, accetto che il paese vada sempre più a ramengo, ma almeno io mi faccio tre amanti e uno yacht (tanto so che te li fai anche tu).

Il primo che ha comprato il telefono

Ma non vogliamo parlare di quello che non confessa mentre l’altro sì, e finisce per prendersi i 7 anni mentre il complice va via libero ?

In fondo è lui il vero eroe.

E’ come il primo che ha comprato il telefono: sapeva di non poter parlare con nessuno, ma se l’è comprato e l’ha tenuto lì, aspettando che qualcun altro facesse la stessa scelta, inizialmente, idiota, rischiando tra l’altro che nessuno lo seguisse nella pazzia.

Ci sono persone che fanno queste cose, persone irrazionali che si comportano come se il mondo fosse già migliore. Queste persone lo costruiscono il mondo migliore. Ogni volta che uno si becca i 7 anni sta piantando un seme nel gruppo fuori, il gossip lo farà crescere. Più pazzi di questo tipo ci saranno, più rapidamente si creerà una cultura di gruppo che indirizzerà anche la razionalità dei più pavidi a scelte più intelligenti dal punto di vista del gruppo.

L’alveare

Dicevamo, la Democrazia è una strada in salita, è la costruzione di questa pressione psicologica che premia atteggiamenti virtuosi.

Ho citato il non buttare la carta per terra, ma credo che gli atteggiamenti virtuosi più importanti riguardino la partecipazione, l’interessarsi alla cosa comune, a come viene gestita. Guardare da vicino cosa fa chi ci governa e guardare con occhio sereno a chi propone scelte diverse da quelle che ci piacciono, senza partiti presi perché nessuno ha la sfera di cristallo, e perché quello a cui stiamo giocando non è il gioco dell’ultimatum ma il dilemma del prigioniero.

Il tutto con un pizzico di ottimismo e quel pizzico di pazzia che ci permette di essere, almeno ogni tanto, eroi.

Anna, Marco e Raffaello

Sono primo io e sono l’ultimo

Sono primo io e sono l’ultimo

È un fatto tipico

Del gioco ciclico del ritmo mantrico

Perciò

Parole su parole

Su milioni di parole

Come cellule si scontrano

Si moltiplicano

Conto quanto kunta kinte

E in quanto kunta kinte canto

(Daniele Silvestri – Kunta Kinte)

“Ciao, io sono Enzo, benvenuti.”

“Anna, ciao”

“Io sono Marco, buon giorno.”

“Venite, vi faccio strada. Avete finito tutto con Carla ?”. Annuiscono.

“Quindi da oggi siete ufficialmente parte di Raffaello!, complimenti, c’è una discreta concorrenza ormai.”

“Sì, nel mio corso si sarebbero volentieri fatti assumere tutti. Sorprende un po’ visto che qui la paga è così bassa. Senti, abbiamo capito di essere stati selezionati, e ne siamo contenti, ma in base a quali criteri non è stato molto chiaro …”

“Ora capirete tutto, quanto alla paga vedrai che guadagnerete molto più dei vostri colleghi in altre aziende.”

“Ma, ci hanno detto che avremo il minimo sindacale per la categoria …”

“Sì, ma quella è la parte di stipendio che percepisci se non fai niente.”

“Si può non fare niente ?”

“Certo!, anzi, per qualche tempo è anche consigliato. Alla lunga poi uno deve rendersi utile, se no ti licenziano, ma vedrai che avrete più voglia di darvi da fare che di impigrirvi: è un ambiente molto coinvolgente.”

“Ecco, siamo arrivati, ho prenotato la sala 37, è una delle sale jolly. In questi giorni, se decidete di venire in ufficio potete sistemarvi qui, è prenotata per voi per tutta la settimana, poi avrete imparato a destreggiarvi. Io comunque sono a vostra disposizione per qualsiasi cosa, io e Carla siamo i vostri mentor, lei si occupa un po’ più della parte organizzativa io un po’ più di quella tecnica, ma per la maggior parte delle cose potete chiedere indifferentemente a me o a lei.”

“Scusa, hai detto -se decidete di venire in ufficio- ?”

“Sì, molti trovano più confortevole lavorare da casa, soprattutto chi abita lontano. Molti, comunque, vengono a lavorare qui perchè abbiamo creato davvero un bell’ambiente.”

“Sì, ho visto, tutti questi fiori, è bellissimo”

“Oh, beh, non solo quello: io apprezzo molto la caffetteria. Poi abbiamo una piccola palestra, una bella piscina, una sala per la meditazione, bellissime sale per lavorare, laboratori di ogni tipo …”

“Non ci sono uffici chiusi ?”

“Ce n’è qualcuno, ma non sono mai nominativi, bisogna prenotarli, come le sale, e in genere ci piace stare a contatto con gli altri.”

“Allora, questi sono i vostri notebook e smartphone, questi sono i tuoi Marco credo .. sì, sono i tuoi e quelli allora i tuoi Anna. Cominciate ad accenderli, qui ci sono le vostre credenziali, poi ve li configurate come volete. Ecco, questi sono i token per l’accesso alla rete aziendale. Accedendo al wifi della sala siete collegati a internet, come se foste a casa, alle applicazioni della rete di Raffaello si accede con il numerello del token e le credenziali che vi ho dato. Per questo, dicevo, lavorare da qui o da casa è esattamente uguale, d’altra parte non ci sono orari né lavorando da casa né in sede. Pensate che abbiamo assunto persone, soprattutto in altre nazioni che non sono mai state in una sede dell’azienda. Ah, riguardo alla selezione, buona parte della decisione viene presa in base alla vostra presenza online: progetti open-source in particolare, ma anche blog e altre iniziative, abbiamo valutato il modo in cui interagite con gli altri in particolare. Tornando alla sede, ovviamente se vi scegliete un lavoro per cui è necessario usare attrezzature che sono qui dovrete venirci.”

“Ci scegliamo noi il lavoro ?”

“Sì, non lo sapevate ? E’ uno …”

“Io lo sapevo, l’avevo letto”

“Sa sempre tutto lei ..”

“Va beh, non c’è niente di male a non saperlo, comunque è uno dei punti fondamentali del nostro modo di lavorare. Riteniamo che se uno decide lui cosa fare sceglierà molto meglio di quanto farebbe un manager al posto suo: sceglierà un lavoro che gli interessa e quindi sarà più motivato, misurerà le proprie capacità in modo da darsi compiti alla sua portata, visto che verrà pagato solo in base ai risultati”.

“Ma il responsabile del progetto saprà meglio di chiunque altro cosa è necessario fare …”

“Saprà quello che farebbe lui, i dipendenti, nelle organizzazioni gerarchiche tradizionali sono braccia aggiuntive per una sola testa. La nostra scommessa qui è stata che le teste aggiuntive fossero una risorsa quanto e più delle braccia. Tu potrai conoscere meno il progetto, ma magari sei esperto in qualche campo che entra in sinergia col progetto in modi inaspettati, la maggior parte delle innovazioni sono frutto di cross-impollinazione, la gerarchia è garanzia di inaridimento.”

“Ma io posso sbagliare a valutare le mie competenze, magari perdo tempo o ne faccio perdere.”

“Sono rischi che siamo preparati a correre, ma tieni conto che il journal di progetto aiuta molto, perché i nuovi arrivati hanno a disposizione la storia delle scelte fatte, dei tentativi falliti etc., e poi considera che il fatto di essere tutti pagati in base al successo del progetto focalizza molto e aumenta la collaborazione, nessuno è mai solo nel fare una scelta.”

“Sì, ma non succede che ci siano lavori che tutti vogliono fare e altri che non vuole fare nessuno ?”

“Certo che succede. Per questo assegnamo un valore ai vari task: le cose che vogliono fare tutti saranno pagate molto meno, in modo da invogliare chi vuole monetizzare a dedicarsi ai problemi meno frequentati.”

“Ma chi è che assegna questi valori ? Ci sono dei manager quindi ?”

“No, non ci sono manager, i valori sono calcolati da un meccanismo in parte automatizzato, ma con la supervisione di un team che si occupa del meccanismo tenendo conto anche dell’andamento dei progetti, del costo totale del prodotto verso i clienti, dei costi fissi etc.”

“Ma chi decide la composizione di questo team?”

“Nessuno. Puoi farne parte anche tu, se ritieni di essere adatta a quel mestiere, anzi puoi iniziare anche da subito, apri Confluence.”

“Cosa ?”

“Guarda, se vai al sito intranet, è preimpostato vedi ? Accedi con le tue credenziali e vedi le varie applicazioni, la più importante è Confluence, è un enterprise-wiki, sapete cosa significa ?”

Sia Anna che Marco guardano nel vuoto.

“Avete presente wikipedia ? E’ un posto in cui ogni utente può dare il proprio contributo creando nuove pagine, le voci dell’enciclopedia, o migliorando quelle esistenti. Il wiki è questa tecnologia di base che permette di creare un sito web modificabile dagli utenti. Per noi è un grosso foglio attorno al quale è seduta tutta l’azienda. Salvo alcune parti che devono essere riservate per le esigenze di certi progetti o clienti ogni dipendente può vedere tutto quello che c’è sul foglio.”

“E cosa ci scrivete ?”

“Anzitutto ognuno di noi è incoraggiato, eufemismo: se non lo fai non ti pagano, a tenere aggiornate una pagina di presentazione personale e un journal. Nella prima ognuno scrive chi è, cosa sa fare, cosa gli piace, insomma tutto quello che può servire a facilitare la sua collaborazione con altri. Nel journal, sulla base di periodi che uno si sceglie, all’inizio di un periodo scrive cosa si propone di fare in quella fase e alla fine tira le somme sul come è andata. C’è chi lo mantiene giornalmente, chi settimanalmente o mensilmente, di più è sconsigliato, altro eufemismo. Vale per qualsiasi cosa tu faccia nel periodo: sia che studi, che partecipi a un progetto che altro.

Inoltre i vari stakeholders manutengono due di queste pagine per ogni progetto e ogni meccanismo interno, compreso il Task Prizing Team, che è il nome del team di cui dicevamo. Se vai nella pagina di questo team trovi documentazione sui criteri che stanno adottando correntemente e puoi cominciare a farti un’idea. Tengono, come tutti i progetti una lista dei sotto task da completare, se la sfogli e trovi qualcosa che sai già fare puoi cominciare a dargli una mano (i sotto task hanno assegnato il loro valore 😀) altrimenti scoprirai che tipo di formazione ti serve per entrare nel giro.”

“Ma questo foglio comune non crea problemi di sicurezza, non ci sono informazioni che devono essere ristrette a pochi ?”

“Ci sono, e, come ho detto, Confluence è attrezzato per gestire delle access list, ma tendiamo a minimizzare la necessità di usarle. Vedi la maggior parte del software che produciamo è open-source, è per definizione visibile a chiunque”

“Ma di cosa vive l’azienda ?”

“Noi vendiamo sistemi completi e servizi. L’open-source è la nostra vetrina, è dove dimostriamo di avere ottime conoscenze nei campi in cui operiamo, e i clienti ci pagano per spendere questa conoscenza nei servizi che offriamo loro: il software è a disposizione di tutti, ma pochi lo conoscono bene come noi e questo ci mette in una posizione di vantaggio commerciale.”

“Quindi è tutto qui ? Uno si cerca lavori e viene pagato a progetto ?”

“Se fosse solo questo già non sarebbe male, ma non è tutto qui. Quello che cerchiamo di promuovere è un vero spirito imprenditoriale. I soldi che guadagni puoi prenderteli o reinvestirli nell’azienda stessa, se decidi di farlo, anche in parte, puoi decidere di finanziare dei progetti tuoi, o creati assieme ad altri, pagare il lavoro di tuoi colleghi per farli lavorare ai tuoi progetti etc … Sui progetti di cui sei finanziatore hai una bella fetta dell’eventuale guadagno, anche qui la percentuale reale è decisa da meccanismi complessi, in continuo adattamento e comunque sempre trasparenti. Quello che cerchiamo di evitare sono le rendite di posizione, se uno è stato bravo per un periodo non guadagnerà per sempre di più per questo motivo, anche se cerchiamo di creare un po’ di isteresi per non essere troppo ossessionati dall’efficienza.”

“Ma, quindi, non succede mai che qualcuno decida di non fare niente e accontentarsi della paga minima ?”

“Finora non è mai successo. Ci sono due meccanismi che tendono ad evitarlo: uno è punitivo: abbiamo tutti firmato un accordo per cui dopo un periodo di due anni in cui si guadagni in media meno del doppio della paga base veniamo automaticamente licenziati, l’altro è proattivo: i vostri mentori, io e Carla in questo caso, hanno tutto l’interesse a farsi in quattro perché voi vi inseriate a pieno nel giro: il cinque per cento dei vostri guadagni dei primi due anni va a loro”

“Come i navigator di Di Maio !”

“Esatto, solo che qui funzionano”

“Ma come siete riusciti a creare questo ? I dirigenti dove sono finiti ? E’ nata così questa azienda ?”

“Non è nata così: è nata in un momento in cui eravamo con le spalle al muro. L’azienda stava fallendo e avevamo pochi mesi prima che chiudesse. Ma ci rendevamo conto che all’interno avevamo grandi professionalità, sia tecniche che commerciali e qualcuno ha proposto un buy-out dei dipendenti per sfruttarle. Girava questa proposta organizzativa ed è sembrato il modo migliore di stimolare chi era capace a darsi da fare e rimettere a galla la baracca, a quel punto si è visto che funzionava e il resto è venuto da sé. I dirigenti non sono affatto spariti: hanno accettato una paga minimale e rinunciato a tutti i benefit e al ruolo decisionale, ma si sono rimessi in gioco. Chi aveva delle capacità guadagna ben più di prima perché la torta è più grande e viene decisamente premiato il merito.

Bene ! potete passare il resto della mattinata a leggere sul wiki, così cominciate a farvi un’idea. Vengo a prendervi per pranzo così vedete la nostra meravigliosa caffetteria. E vi faccio conoscere Rocco, il cuoco, prepara delle cose stupende.”

“E’ un dipendente ?”

“Ovvio !, probabilmente è quello che guadagna di più in sede. Pensate che nella ditta originale era all’ufficio acquisti ! Si era stufato di quel lavoro e ha deciso di rigiocarsi quest’altra competenza.

Posso lasciarvi, avete ancora dubbi ?”

“Solo uno. Una curiosità. Il logo dell’azienda è strano, cosa significa ?”

“Non ridete: è una stilizzazione delle tartarughe Ninja”

“Daaai, perché ?”

“Non vogliamo pubblicizzare troppo la cosa perché è un riferimento culturale un po’ terra terra, ma ci era piaciuto: sembrava conciliare l’eccellenza individuale con lo spirito di gruppo, che è in fondo l’idea di lavoro che portiamo avanti.

Buon lavoro ragazzi, buona prima mattinata e benvenuti in Raffaello.”

Linguaggi & Linguaggi

Give me six hours to chop down a tree and I will spend the first four sharpening the ax

(Abraham Lincoln)

Photo by Markus Spiske on Unsplash

Credo di aver scritto il mio primo programma intorno al 1977. In Fortran. Non so come fossi finito a fare informatica, ricordo di aver comprato un numero di “Nuova Elettronica”, anche questo chissà perché, che parlava di microprocessori. Avevo sfogliato un po’ la rivista, senza capirci praticamente niente, ma mi era piaciuto, credo, il tono di trionfo, l’entusiasmo per qualcosa di importante che stava succedendo e di cui loro, quelli che scrivevano gli articoli, facevano parte.

Durante il corso di macchine (Teoria e applicazioni delle macchine calcolatrici, come dire non sapevamo proprio come chiamarlo questo corso, si poteva accedere al centro di calcolo e far girare i propri programmi. Era in via S. Massimo a Torino, non so se c’è ancora. Il centro ospitava un grosso calcolatore IBM, erano ancora grossi come caldaie condominiali all’epoca, e una sala con delle macchine per perforare schede. Ti davano un pacco di schede vergini. Facevi la coda per accedere a queste strane macchine da scrivere e cominciavi a copiare il programma che ti eri scritto a casa. Una linea per scheda. Ne usciva un pacco di schede che, dopo un’altra coda, consegnavi a uno studente che faceva girare il tuo job sul mainframe. Dopo qualche tempo, anche ore a volte, tornavi e ti consegnavano un tabulato col risultato del tuo programma. In genere era una pagina con scritto a caratteri cubitali “JOB FAILED”, che era il modo del computer di dirti che avevi sbagliato qualcosa. C’era anche qualche informazione per guidarti nel capire cos’è che non andava.

Per riuscire a far girare quel programma credo di aver impiegato diverse settimane, ma alla fine lo studente mi consegnò, al posto del solito foglio striminzito un bel pacco di fogli. In ogni foglio c’era il disegno di una scacchiera. L’insieme dei fogli conteneva la progressione delle mosse che doveva fare un cavallo per occupare tutte le posizioni della scacchiera senza mai ripassare dallo stesso posto.

Era un esercizio trovato su un libro che insegnava quattro linguaggi contemporaneamente, per mostrare le differenze e le comunalità tra di essi. Non so perché mi piacque quell’esercizio, ancora adesso penso di aver avuto una fortuna incredibile a farlo funzionare. I linguaggi che insegnava il libro erano Cobol, Fortran, Algol e PL/I.

Io il Fortran e il Lisp siamo praticamente coetanei. Beh, loro sono un pelo più giovani, sono nati un anno o due dopo. Ma il Lisp l’ho conosciuto parecchio dopo, era già scattato il nuovo millennio. E’ strano come spesso siamo circondati da cose belle che non vediamo. Magari nessuno ce ne parla, o quelli che ce ne parlano ci sembrano strani e non gli diamo retta, e invece, a volte, hanno scoperto un tesoro. Credo valga per molte cose, tra cui l’arte e la meditazione. Certo anche per il Lisp.

Così tanti

C’è qualcosa di affascinante nel numero di linguaggi esistenti. Parlo dei linguaggi naturali, quelli parlati e ascoltati da persone. Sembra che la bibbia sia stata tradotta in più di 2500 lingue e che da un censimento il numero dei linguaggi superi i 6000.

Mi sono chiesto spesso perché nasca un nuovo linguaggio. Se guardo alla mia personale esperienza di come il linguaggio, l’italiano in questo caso, evolve, quello che noto è che c’è una spinta da parte di gruppi di persone a differenziare il linguaggio per farne strumento di appartenenza al gruppo (“parlo come voi quindi faccio parte del vostro ambiente”). Il linguaggio quindi evolve assieme alla nascita di nuove formazioni, e finisce per assorbire e trasportare le idee di questi conglomerati. La storia ci mette del suo, e così pure fa la geografia: man mano che l’uomo ha popolato la terra si sono creati sicuramente gruppi più o meno isolati, che hanno fatto evolvere il loro modo di esprimersi creando parole per oggetti o eventi che non esistevano nel linguaggio/gruppo di origine.

Il linguaggio contiene la cultura dei gruppi. La difficoltà di imparare un’altra lingua è in gran parte la novità, la differenza, non tanto nei termini usati, ma nel vissuto delle popolazioni che hanno sviluppato quella lingua. La loro lingua trasporta le sfide che hanno affrontato e il modo in cui le hanno risolte.

Le macchine e gli uomini

L’intuizione evangelica della Parola che crea/trasforma il mondo è applicabile non solo alla parola di Dio, ma anche ai linguaggi naturali, e diventa ancora più vera applicata ai linguaggi di programmazione, Parole che muovono cose, che le producono, che creano immagini, musica, che interpretano e predicono il comportamento umano.

Anche i linguaggi di programmazione sono tanti, al momento più di 700. Se pensiamo che sono nati nell’arco di poco più di 50 anni è davvero notevole.

Le ragioni per cui nascono credo siano simili a quelli visti sopra: c’è certamente voglia di distinguersi, forse qualche influenza estetica, voglia di appartenere a qualche gruppo, sicuramente qualche aspetto economico, ma in sostanza i linguaggi nascono perché si trovano modi sempre migliori di risolvere i problemi. Qui la geografia reale ha poco impatto, internet ormai rende il mondo un posto che si attraversa in un attimo/click, ma ci sono nuove geografie che plasmano le differenze nel modo di esprimersi: i vari campi di specializzazione diventano ogni giorno di più continenti che si separano. Chi scrive programmi per applicazioni di commercio elettronico sul web ha problematiche completamente diverse da chi programma dispositivi medici o sistemi operativi o controlli industriali. Le tecnologie di base tentano di restare comuni, la maggior parte dei linguaggi dichiara di essere general purpose, ma quanto meno il tempo di adozione delle novità è molto diverso nei vari settori.

I linguaggi di programmazione non servono tanto a far parlare gli uomini con le macchine, questo ormai è diventato quasi un effetto collaterale. Questi linguaggi servono a parlare in modo non ambiguo tra uomini, servono a scambiarsi idee, soluzioni ai problemi. Servono al singolo a ricordarsi come ha risolto un certo problema in passato. Servono a fare in modo che una persona possa collaborare con un’altra o continuare il suo lavoro, permettono a gruppi di persone di dividersi il lavoro e assemblare a tempo debito i vari frammenti, servono a qualcuno per verificare il lavoro di un altro.

Secondo me non è lontano il tempo in cui si useranno questi linguaggi non tanto per dire alle macchine cosa fare, ma per produrre e conservare conoscenza in modo non ambiguo. La matematica, la musica e la scienza lo fanno da tempo, ma mi stupisco sempre quando leggo il testo di una legge espresso in un linguaggio comunque specialistico e per addetto ai lavori, ma così ambiguo da necessitare di stuoli di avvocati per essere interpretato. Credo che presto vedremo i linguaggi di programmazione invadere campi come la legge, la stesura dei contratti (le blockchain ci costringeranno a brevissimo a questo), le ricette di cucina e la medicina.

Cartoni animati, flipper e insaccatori di salsicce

Dicevamo, modi diversi di risolvere i problemi. Ma il problema di fondo è uno: manipolare la complessità. In genere un programma ha un fine complesso, un obiettivo unico ma scomponibile nella somma di particolari più piccoli: le informazioni anagrafiche nel profilo di un utente, la sequenza di movimenti di un robot, le informazioni di mille sensori nei dispositivi che tengono in volo un aereo. Il programma, in definitiva, è la somma di azioni applicate a questi singoli particolari, ma queste micro azioni nel loro insieme devono tendere al fine principale, e, spesso, è un’arte da giocolieri. La storia dei linguaggi di programmazione è la storia del progressivo perfezionamento di questa capacità di governare la complessità con astrazioni sempre più ricche.

Un conto è dire “procedi per dieci metri, ripeti per 90 volte: – curva di un grado e procedi di 15 centimetri-”, un altro è dire “gira a destra con un raggio di venti metri”. Le astrazioni si costruiscono una sull’altra, come un castello di carte. Un programma che identifica il percorso migliore tra due località potrà fare uso delle astrazioni “gira a sinistra”, “gira a destra” per realizzare l’astrazione “vai da questo posto a quell’altro” e uno che programma le consegne di un corriere userà quest’ultima astrazione e così via.

Photo by Denise Jans on Unsplash

Questo modo di gestire la complessità elencando azioni da fare 1 assomiglia un po’ al creare un film di animazione o alla sceneggiatura di un film. E’ il modo naturale in cui un computer si lascia programmare ed è stato il primo e più diffuso (lo è tuttora) modo di farlo. Tutte i linguaggi che abbracciano questo tipo di soluzione si rifanno alle teorie di un matematico inglese, Alan Turing (quello del film “The Imitation Game”), che ha immaginato un ipotetico automa (la macchina di Turing, appunto) in grado di risolvere, potenzialmente, qualsiasi problema di calcolo. I linguaggi di programmazione vengono classificati “Turing complete” quando possono essere usati per affrontare qualsiasi problema.

Sulla strada del creare astrazioni come ho accennato sopra, per composizione di astrazioni più elementari, non si va molto avanti. E’ sempre possibile “comporre” piccoli mattoncini Lego in mattoni più grandi ovviamente, il gioco che non riesce, praticamente mai, è di poter riutilizzare questi mattoni più grandi in altri contesti.

Negli anni novanta questa ansia di riuso ha portato alla nascita di altri paradigmi, altri modi di affrontare il problema. Qualcuno ha provato a immaginare il problema da risolvere come collezione di piccole entità (non si è trovato nome migliore di oggetti, e il paradigma lo si è chiamato object orented) ognuna delle quali si comportava come un micro calcolatore specializzato per un particolare scopo, possedeva i suoi dati, il suo carattere (un suo modo di reagire agli eventi) e colloquiava col mondo esterno inviando e ricevendo messaggi. Si può immaginare la cosa come costruire un flipper: si piazzano i vari elementi: funghetti, trappole, barriere, insegnando loro cosa fare quando vengono urtati, si lancia la pallina e il gioco è fatto.

E’ sembrata per un po’ la panacea di tutti i problemi e per un bel periodo sembrava impensabile che nascesse un nuovo linguaggio che non supportasse questo modo di lavorare. Oggi l’idea viene ridimensionata perché si è messo a fuoco che ciò che rende davvero difficile creare programmi robusti (un programma che non lo è non serve a niente) è la presenza di uno stato. Un programma imperativo, o a oggetti non si comporta in maniera ripetibile: a fronte degli stessi stimoli può produrre risultati diversi a seconda del suo stato interno, che è a sua volta modificato dalle azioni precedenti. Questo rende il programma, a meno che sia davvero elementare, impossibile da provare nella sua completezza (la casistica diventa infinita) e spesso anche impossibile da pensare, da comprendere in modo logico.

A tutto questo ha dato risposta un altro matematico (ha risposto in anticipo in effetti, visto che è contemporaneo di Turing), di nome Alonzo Church, che ha inventato un modo di programmare da matematico. L’implementazione più famosa delle sue idee è apparsa nel linguaggio Lisp (1958), ed oggi il suo modo di risolvere i problemi viene chiamato programmazione funzionale, tra le altre cose è Turing complete 😉

Photo by Clem Onojeghuo on Unsplash

Una funzione in senso matematico la possiamo immaginare come un tritacarne, o una macchina per fare le salsicce: inserisco ingredienti da una parte, giro la manovella, e dall’altra esce il prodotto. E funziona sempre nello stesso modo: se inserisco gli stessi ingredienti e giro la manovella lo stesso numero di volte esce sempre lo stesso prodotto. Questo, come ho detto, non è vero per le funzioni dei linguaggi imperativi: rimane sempre nella macchina un po’ della salsiccia di prima, che inquina la successiva.

Queste funzioni senza effetti collaterali si chiamano pure functions. Da notare che una funzione pura non è legata neanche al tempo, non può dire ad esempio “aspetto due secondi e poi faccio questo”, non c’è il poi e non c’è nemmeno il faccio. C’è solo “con questi valori di ingresso il risultato sono questi altri”, una dichiarazione senza tempo, non un’azione.

Con queste premesse è impossibile produrre un programma che faccia qualcosa nel mondo reale, per cui i programmi funzionali sono in genere divisi in due strati: uno che traduce gli eventi del mondo esterno (anche il tempo) in puri dati che vengono dati in pasto allo strato di funzioni pure, che esegue i calcoli e passa indietro i risultati alla parte reale. Il vantaggio è che la parte non pura, può essere ridotta al minimo e convenientemente testata, la parte pura, generalmente più complessa, è immensamente più facile da provare e da pensare. Oggi nessun linguaggio moderno non permette almeno una minima forma di programmazione funzionale.

Alta montagna

Programmare in un linguaggio funzionale è difficile, soprattutto per chi ha iniziato con linguaggi imperativi, o forse serve una forma mentis particolare.

Tra i linguaggi funzionali iniziare a programmare in Lisp, o uno dei suoi dialetti, compreso il modernissimo Clojure, è un’esperienza terrorizzante ed esaltante insieme: un po’ come salire in alta montagna dove l’ossigeno scarseggia, ma il panorama in qualche modo ripaga. Trovarsi a dover usare un linguaggio che non ha variabili e non ha loop, lascia qualsiasi programmatore tradizionale con la sensazione di non potersi muovere. Credendoci se ne esce e si scopre che McCarthy, il creatore (qualcuno dice scopritore, intendendo che il Lisp sia una specie di archetipo universale della programmazione) ha creato qualcosa che che non si finisce mai di imparare eppure è incredibilmente semplice.

Di peso da Wikipedia

(cercando Paul Graham, uno degli evangelisti del Lisp).

Graham ha ipotizzato un fittizio linguaggio di programmazione, Blub, che si collocherebbe “esattamente a metà nel continuum dell’astrazione”. Ha usato tale linguaggio per illustrare il confronto tra il potere espressivo di differenti linguaggi di programmazione, al di là della Turing equivalenza, in particolare per mostrare la difficoltà nel paragonare un linguaggio che uno conosce con uno che non conosce.

Graham considera un ipotetico programmatore Blub. Quando questi guarda in basso nel “continuum della potenza”, considera i linguaggi inferiori come meno potenti, in quanto mancano di caratteristiche ai quali un programmatore Blub è abituato. Ma quando guarda verso l’alto, è incapace di rendersi conto che sta guardando verso l’alto: egli semplicemente vede degli strani linguaggi, con delle caratteristiche aggiuntive apparentemente non necessarie, che assume essere equivalenti in potere. Quando Graham considera il punto di vista di un programmatore che usa un linguaggio più in alto rispetto a Blub, invece, questi realizza le caratteristiche mancanti a Blub rispetto ad un linguaggio superiore.

Graham descrive questo fenomeno come il “paradosso di Blub” (Blub paradox) e conclude che “per induzione, gli unici programmatori in grado di vedere tutte le differenze di potenza tra i vari linguaggi di programmazione sono quelli che capiscono il linguaggio più potente”

Prossimo articolo della serie

The joy of programming. Le features dell’espressività

  1. oggi viene chiamato programmazione imperativa, ma solo per distinguerlo dalla programmazione funzionale.

La Santissima Trinità

Amor mio, amor mio

Per amico c’è rimasto solo Dio

Ma lui lo sa

E sorride

Lui ci guarda e sorride

(Amor mio – Mina, Battisti, Mogol)

Mi ero ripromesso di scrivere più che altro di temi religiosi o spirituali in questo blog e non l’ho ancora fatto, se non prendendola un po’ alla lontana. E’ ora di cominciare.

In questo post vorrei parlare di un aspetto particolare della religione cristiana, quello della Santissima Trinità, ma merita fare una piccola premessa per far capire con che tipo di atteggiamento mi avvicino al discorso.

Da quando, tanti anni fa, ho sentito parlare per la prima volta della visione buddista del mondo, ho iniziato a considerare quella cristiana un po’ grezza e stonata. Il buddismo, per come l’ho capito allora, descriveva il rapporto tra l’uomo e l’assoluto come un mare che si increspa, creando delle onde, le coscienze degli esseri viventi, che temporaneamente si dimenticano di essere mare esse stesse, e vivono un oggi illusorio, separato dal tutto di cui fanno parte e a cui torneranno appena ripresa consapevolezza. Era un immagine per me molto bella. In contrasto la visione tradizionale del cristianesimo (o delle altre religioni monoteistiche) suonava falsa. L’idea di un rapporto personale tra Dio e ogni uomo, con associata la promessa di un paradiso o di un inferno sembrava richiamare alla mente una qualche forma di Matrix, un universo finto, creato al solo scopo di mettere l’uomo su un banco di prova per vedere se superava il test. E questa impressione toglieva molta attrattiva alla spiegazione del mondo cristiana.

Il Dio che ti guarda e sorride

Con gli anni, però, mi sono progressivamente reso conto di provare una forte nostalgia per questo Dio che ti conosce, che ti guarda e sorride, che ti vuol bene, che non necessariamente interviene per renderti la vita più facile, ma che forse ha un piano che ti riguarda.

Trovo che questo aspetto, sia importante e si integri senza problemi con la visione buddista, come descritto, ad esempio, da Paul Knitter nel suo bellissimo Senza Buddha non potrei essere cristiano.

Sull’onda di questo pensiero ho poi anche rivalutato un concetto, quello della trinità, che viene in genere presentato dalla chiesa con ridicoli arzigogoli teologici (l’uomo è sempre ridicolo quando usa la ragione per parlare di Dio), che in genere si concludono con un Ghe pensi mi ! da addetti ai lavori: “Guarda, questa è roba che non puoi capire, ti dico io che è così, fidati, Dio è uno e trino, è un mistero ed è un dogma”.

Gesù non sapeva di essere la seconda persona della Trinità

La Santissima Trinità non c’era ai tempi di Gesù. Qualcuno ha cominciato a parlarne nel secondo secolo, ed è solo quattrocento e più anni dopo la morte di Gesù che la chiesa ha confezionato quest’idea con tutti gli orpelli teologici atti a sconfessare le varie eresie. In effetti la trinità è stata più che altro un modo di affermare un altro concetto, anch’esso non presente nei primi anni successivi alla morte di Gesù: quello che Gesù fosse Dio.

Raccontato meglio

Benché probabilmente non facesse parte del messaggio evangelico originario, e sia parto di riflessioni successive, il concetto di trinità ha perfettamente senso per l’uomo di oggi, e non c’è bisogno di ricorrere a nessun mistero per capirlo.

Hans Kung nel libro Ciò che credo lo spiega più o meno nel modo che segue.

Una volta deciso/accettato che un Dio esiste e vuole bene all’uomo (il Dio Padre di Gesù) va da sé che con l’uomo voglia comunicare. Ma questa comunicazione è ostacolata da un paio di problemi: un limite intrinseco nell’uomo (quanto l’uomo è in grado di capire è limitato, rispetto all’enormità dell’assoluto), e il fatto che l’uomo stesso non sia un target molto preciso. L’uomo racchiude almeno un paio di entità fuse insieme: un essere razionale che analizza le cose, le elabora, le cataloga e uno o più altri esseri che si manifestano sotto forma di sensazioni, emozioni, per lo più inconsce che popolano la scena del primo come le bolle o i fumi di un vulcano in attività. Questo Dio che vuole comunicare con l’uomo, lo fa con entrambi gli aspetti dell’uomo.

Comunica con la parte razionale per mezzo della scienza, della storia. Dio arriva a noi racchiuso nel ricordo degli eventi trascorsi, nelle memorie, negli scritti delle persone che hanno riflettuto su di lui prima di noi. Tra queste persone una è stata eletta a simbolo di tutte, questo Gesù di Nazareth vissuto un paio di migliaia di anni fa, ma il messaggio di Dio che ci arriva razionalmente contiene il pensiero di tutti quelli che ci hanno tramandato questa buona novella e anche di quelli vissuti prima, che l’hanno preparata.

Ma Dio parla soprattutto alla parte inconscia dell’uomo. Tutti i profeti di questo mondo non avrebbero saputo cosa dire se non avessero saputo ascoltare questo altro dialogo. Dio parla direttamente con la parte più preziosa, più potente dell’uomo: la parte inconscia, non razionale, istintiva, quella che una volta si chiamava spirito.

E’ questa alla fine la trinità:

  • Un Dio buono (Padre) ma a noi incomprensibile.
  • Un suo discorso che percepiamo con la nostra Razionalità e che proiettiamo in un “Dio Razionale”, chiamandolo Logos, Parola.
  • Un altro discorso che intuiamo col nostro spirito e proiettiamo in un “Dio Emotivo”, chiamandolo Spirito di Dio, Spirito Santo.

Tu chiamale se vuoi Emozioni

Un piccolo inciso sull’inconscio.

Viviamo in un’epoca dominata dalla razionalità, sembra che le grandi conquiste della scienza siano da considerare il trionfo di una mente analitica e di un metodo, quello scientifico, che unico può garantire il benessere e il progresso dell’umanità. In effetti si tratta dell’ennesimo mito che l’umanità si crea. La razionalità della scienza è il mito dei tempi moderni.

In nessun campo, scientifico o altro, nessun successo è mai raggiunto senza una forte partecipazione dell’intuizione, dell’istinto, insomma della parte dell’uomo che niente ha a che vedere con la razionalità.

Lo stesso metodo scientifico è una balla paurosa:

Fate caso ai punti sopra, in particolare ai punti 2 e soprattutto 3. Formulare ipotesi ? Detta in altre parole potremmo dire: “Aspetta che ti venga un intuizione”, nessun processo razionale produce ipotesi.

Qualsiasi attività di problem solving è un inno all’intuizione. Qualsiasi scoperta è frutto di curiosità, di meraviglia, tutti aspetti non razionali. Le cose che consideriamo più importanti, l’amore, l’amicizia,la musica, l’arte sono espressioni dell’inconscio. Anche la buona salute non è frutto della razionalità, influenzata com’è dalle emozioni.

La razionalità ha un ruolo, altrettanto importante, ed è quello di catalogare, correlare, comunicare (ma qui anche le emozioni hanno un ruolo cruciale), consolidare, ma è importante considerare l’uomo come l’insieme, non sempre armonioso, di queste diverse entità.

Ma tutto questo il prete non lo sa

Non mi è più capitato, da parecchi decenni ormai, di parlare di teologia, in particolare della trinità con un prete, per cui metto le mani avanti: magari le cose sono cambiate. Ma dal ricordo che ne ho dall’ultima volta che è successo la spiegazione che la chiesa dà della trinità è racchiusa in formule vuote (“Dio è uno e trino”, “Lo Spirito Santo discende dal Padre e dal Figlio”) seguite da parole come mistero e dogma.

L’idea che mi son fatto è che il motivo per cui i preti non sanno spiegare in modo sensato questo concetto, che, ripeto, sensato lo è, ed è anche molto bello, sia che non ci credono. La chiesa ha rifiutato il concetto di trinità quasi dai suoi albori. L’ha strumentalizzato per veicolare il concetto di divinità di Cristo, ma l’ha immediatamente svuotato di significato, perché l’ultima cosa che la chiesa, almeno quella cattolica, vuole è un Dio che parli direttamente all’uomo, né razionalmente né, anzi meno che mai, intuitivamente. La chiesa, dal Papa in giù, ha da sempre inteso il suo ruolo come interprete di Dio. Se c’è qualcuno con cui Dio deve parlare sarà bene che siamo noi, ragazzi non scherziamo che qua si perde il posto.

I mistici

Misticismo è il nome che, storicamente, è stato dato al dialogo emozionale, esperienziale, tra lo Spirito di Dio e quello dell’uomo. La pratica fondamentale di questo tipo di approccio spirituale è la meditazione. In questo ritroviamo un parallelismo con moltissime altre forme di spiritualità: Dio non parla solo ai cristiani. Il misticismo è stato presente nel cristianesimo fin dall’inizio, e costituiva, secondo me, il vero fascino dell’insegnamento di Gesù. Ci sono molti episodi dei vangeli che richiamano la pratica di meditazione di Gesù, dai giorni nel deserto fino alla meditazione prima della morte nel giardino del Getsemani, ma un episodio in particolare, quello della trasfigurazione, sembra raccontare una vera esperienza mistica.

I mistici cristiani hanno convissuto, o forse è meglio dire lottato, con i teologi, i razionalizzatori, per quasi tutta la storia della chiesa, fino a che i secondi hanno preso il sopravvento e hanno consegnato al rinascimento e quindi all’età moderna una chiesa in cui quello che lo Spirito di Dio aveva da dire all’uomo non era più così importante. E’ stata un po’ come la lotta tra chi si accontenta di leggere il menu e chi vuole assaggiare i piatti: hanno vinto i primi. Gli ultimi mistici cristiani risalgono al medioevo e avevano nomi come Meister Eckhart o Ildegarda da Bingen

La spiritualità del creato

Oggi c’è chi ripesca queste tradizioni.

Matthew Fox, è stato un domenicano statunitense che nel 1983 ha scritto un bellissimo libro “Original Blessing” (“In principio era la gioia”). In questo libro recupera il pensiero della tradizione mistica, tra l’altro fondendolo con numerosi altri fermenti culturali tra cui l’attenzione all’ambiente, il femminismo, il recupero della spiritualità dei nativi americani, e rifiutando la cupa visione del peccato originale (“original sin”). A seguito della pubblicazione di questo libro Fox è stato allontanato dall’ordine domenicano dalla congregazione per la dottrina della fede, allora guidata da Joseph Ratzinger. Un eretico diplomato, insomma, in anni più antichi sarebbe stato pronto per il rogo.

Nel suo libro propone una spiritualità in cui prevale l’aspetto emozionale, descrive un vero dialogo con Dio, secondo me. La sua proposta si dipana su quattro viae che raggruppano ed esplorano in qualche modo le nostre emozioni, facendole diventare canali di comunicazione con l’assoluto. Queste vie sono:

  1. La meraviglia, la gioia di fronte al creato. L’esplorazione, la scienza, ma anche il gustare tutto quello che di buono la vita ci offre continuamente.
  2. La profondità del dolore e del silenzio. L’accettazione o la contemplazione dei nostri limiti, delle nostre tensioni e contraddizioni.
  3. L’euforia della creatività, dello scoprirsi capaci di magia, di capacità non solo di assaporare la bellezza, ma di produrla.
  4. La passione per rinnovare, migliorare il mondo. Per l’aiuto ai più deboli o per l’impegno politico.

C’è in Italia un’associazione che si propone di diffondere questa idea mediante seminari esperienziali in cui si cerca di creare le condizioni per sentire più che capire la spiritualità.

Insomma

La Trinità è viva e lotta insieme a noi, ma forse va cercata dove non vi aspettereste.