Involuzione

Antenna parabolica sostituita con un camino
Antenna parabolica sostituita con un camino

La foto sopra l’ho scattata sul tetto di casa, mentre gli installatori della stufa a legna montavano il nuovo camino. Non avevano previsto di dover togliere l’antenna parabolica, ma abbiamo scoperto che il cammino ci sbatteva contro, per cui è stato inevitabile.

Quell’antenna è stata sul tetto una trentina d’anni, immagino sia stata una delle prime installate in paese. All’epoca non c’era ancora Sky, le antenne paraboliche le installavano pochi appassionati o curiosi. La mia era puntata sul satellite Astra. Ricordo di aver faticato non poco a farla salire sul tetto, con l’aiuto dei muratori che lo stavano ristrutturando, non passava dal sottotetto. Oggi si usano padelloni più piccoli, ma Il segnale da Astra era piuttosto debole e ci voleva quella.

Puntarla sul satellite era piuttosto complicato. Si usava una bussola per rivolgerla grosso modo verso Sud e un po’ più a destra (Astra è a 19,2 gradi Est), poi con un misuratore di segnale montato lungo il filo si aggiustava il tiro, fino a sentire un fischio costante. Un ulteriore aggiustamento guardando la lancetta dello strumento, finché segnava un massimo. Bisognava quindi scendere dal tetto e provare a sintonizzare il decoder per accertarsi di aver beccato il satellite giusto. In quella zona di cielo ci sono tanti satelliti e capitava di puntare su quello sbagliato, nel caso si ricominciava. Per qualche verso è un’attività simile alla pesca: si immagina che in una certa zona di cielo o di acqua ci siano satelliti o pesci e si punta la parabola o si getta l’esca per verificare se quanto immaginato corrispondeva o meno alla realtà.

Comunque sostituire una parabola con una stufa a legna sembra un po’ un involuzione. Anche se le stufe a legna moderne sono abbastanza tecnologiche. Hanno tutto un sistema per pilotare il percorso dell’aria fredda che entra e i fumi caldi che escono in modo da massimizzare l’efficienza. Per questa era disponibile anche un kit per inviare aria calda nelle stanze intorno e un telecomando per regolare il tiraggio dalla poltrona. Ma abbiamo evitato aggiunte che avessero a che fare con l’elettricità, il senso di una stufa a legna oggi è quello di prevedere tempi duri in cui i servizi che diamo per scontati non siano disponibili. Non so in effetti quanto sopravvivremmo senza elettricità, ma sapere che per qualche giorno ci si può scaldare anche senza può dare un briciolo di serenità. La spinta a installarla è stata comunque la possibilità (la certezza) che il costo del metano vada alle stelle.

Non so come stia messa la legna rispetto all’inquinamento ambientale. In teoria immette nell’aria molte più polveri del metano, ma gli alberi che servono per produrla sembra compensino per lo meno la CO2 emessa.

Intanto la macchina a metano la usiamo solo più a benzina, perché il gas costa troppo.

Personalmente sarei favorevole all’uso del nucleare, le tecnologie nuove sembrano più sicure, e sicuramente l’impatto ambientale è minore. E sarei sicuramente a favore di più metanodotti e di più degassificatori per diversificare la nostra dipendenza, e a quante più trivellazioni possibili per non foraggiare dittatori vari.

E invece bruciamo legna al posto del metano e tra un po’ non basterà nemmeno quella. Mi sembra proprio una conferma del vecchio detto “Il meglio è nemico del bene”.

Poesia, whisky e intelligenza artificiale

Poesia come whisky
Poesia come whisky

ignoranza

Connie mi ha inviato la lista degli albergue in cui ci siamo fermati nei 650 km percorsi insieme. L’ho aggiunta alla pagina che riassume i post scritti durante il Camino. Visto che ero lì mi è venuta voglia di rileggere quello che avevo scritto per vedere l’effetto che faceva a freddo. Ho scoperto con orrore di aver scritto da qualche parte

ho scuotuto la polvere dai miei calzari

Lo so che si dice scosso. Ogni tanto parlo in modo sgrammaticato un po’ per vezzo, un po’ per sperimentare varianti della lingua e vedere come suonano. A scriverli questi esperimenti, non fanno lo stesso effetto. Scuotuto non suona neanche tanto male, ma, insomma, ci tenevo a far notare che sono ignorante, ma non proprio fino a quel punto.

Ignorante, invece, lo sono moltissimo rispetto alla poesia.

cavalli

L’altro giorno ascoltavo su Morning Luca Sofri che parlava di Patrizia Cavalli, morta in questi giorni. Non sapevo chi era.

Mi ha incuriosito una frase (non so se l’ha citata Sofri o se l’ho trovata da qualche altra parte) che pare abbia pronunciato questa poetessa:

scrivo per essere amata

Che è già una poesia. E con me ha funzionato.

Insomma, ho comprato un suo libro, “Vita Meravigliosa”, e lo sto leggendo.

Lo leggo lentamente, non credo si possa fare altrimenti. È davvero bello.

Non si possono leggere più di tante poesie in un dato arco di tempo, almeno io non ci riesco, mi fanno l’effetto di un superalcolico. Una sferzata di energia che richiede un lungo tempo di assimilazione.

E qui, volendo dare un assaggio della poesia di Patrizia Cavalli, non si può non sceglierne una sul whisky:

Avere il whisky in casa è un gran vantaggio,

in quattro sorsi passi dal peggio al meglio,

ogni parola splende e ne convieni

e i destini sfortunati li sollevi

all’esistenza nella gloria, o almeno

semplicemente a esistere cosí.

Questo dimostra che noi non siamo

quel che siamo, che il nostro essere

si accende quando è caldo, o si disperde

nel freddo buio della sobrietà.

Ma in ogni caso qui non si conclude

niente, è questo il bello, non si conclude

niente, per quanto vorrei dire

che sono soddisfatta di aver aperto

la bottiglia buonissima di whisky

che mi è costata tanto e che altrettanto

mi restituisce quel che deve – si tratta

di un Benrinnes novantasei, sedici

anni soli di vecchiaia, che non è niente

per un whisky con pretese, ma

che vi devo dire, a me mi ha steso

quasi felice, anzi, direi mi ha acceso

senza limite inoltrata non so

dove, di certo ora ubriaca.

Cavalli, Patrizia. Vita meravigliosa (Collezione di poesia) (Italian Edition) (p. 22). EINAUDI. Kindle Edition.

autoqualcosa

Mi viene spontaneo riprendere il discorso iniziato qui, sull’effetto delle parole nella nostra mente. Su quel qualcosa che le storie raccontate con immagini, ma soprattutto parole, scatenano dentro di noi. Le storie che auto produciamo in risposta a quelle che arrivano dall’esterno.

Credo che questo effetto trovi il suo massimo se quello che ci stimola è una poesia. Tornando alle diluizioni omeopatiche le poesie sono i 30 CH, quelle così diluite che siamo sicuri di non trovare più nessuna traccia della sostanza iniziale, quelle che paradossalmente scatenano la reazione più grande nel nostro organismo.

Midjourney

Ho scoperto Midjourney. Un software che usa l’intelligenza artificiale per creare immagini partendo da un testo.

Ne stanno nascendo parecchi, ogni tanto trovo un articolo su Medium che ne annuncia uno nuovo. Ho aderito alla Beta di Midjourney (non so quanto costerà a pagamento) e sono rimasto davvero impressionato.

Ho fatto qualche esperimento.

Questa immagine è stata prodotta dal testo “Mario Draghi as Mona Lisa”. È la mia sintesi delle ultime vicende politiche.

Quest’altra è partita dal testo: “a sick man being cured by a doctor and a wizard” e avrei potuta usarla nel post precedente.

L’immagine in cima a questo post viene invece dal testo “Poetry as whiskey”. (Ma si dice whisky o whiskey ? Ancora ignoranza)

Non credo sia in grado di digerire poesie come testo di input. Chissà, potrebbe forse in futuro produrre poesie sullo stile di un dato autore …

Certo si va verso tempi interessanti.

Il cielo in una stanza

Divagazioni tecno/psico/metafisiche sul parlare in stanze affollate

Pulizie di primavera

Ho iniziato, in questi ultimi giorni, la grande impresa di mettere ordine ai dati sui vari PC e hard disk e archivi online. Deve essere vero che i dati sono come i gas, e tendono a occupare tutto lo spazio che gli dai. Quando cerco un hard disk per metterci, che so, un backup, o qualcosa di interessante che trovo in giro, non ce n’è mai uno con spazio sufficiente. In genere sono pieni di cose inutili, o copie di cose che ho da altre parti. Se decido di fare spazio e cancellare il contenuto di un archivio c’è sempre qualche directory per cui dici: “no!, questo magari poi mi serve”. Se trovo due archivi di foto che sembrano identici non so più dire quale è quello più recente.

Beh, insomma, ho iniziato dalle mail. Avevo circa 25 mila messaggi nella inbox, risultato di anni di “poi metto a posto”. Mi sono disiscritto da decine e decine di mailing list a cui non mi ero mai iscritto (per molte non serve a niente cancellare le iscrizioni: continuano ad arrivare le mail). Mentre scrivevo l’ultimo paragrafo ne è arrivata una da ebay con consigli per San Valentino. Credo che l’unica sia mettere delle regole che cestinino questi messaggi automaticamente quando arrivano. Il fatto è che magari vorresti ricevere messaggi da ebay, quando vendi o compri qualcosa …

Sarà dura.

L’ Effetto Cocktail Party

Comunque, il primo effetto di questa pulizia è stato di cominciare a notare alcune mailing list che in effetti poteva interessarmi leggere.

Ad esempio, ieri ne ho ricevuta una da The Edition, newsletter per gli abbonati a Medium. Medium è una cosa a metà tra un social network e un contenitore di blog. Ognuno può scriverci quello che vuole, ma c’è un sistema di votazioni e preferenze che fa emergere le cose più interessanti per ognuno. La newsletter evidenzia le cose più interessanti dal punto di vista della redazione. In questo numero citavano questo bellissimo articoletto The Cocktail Party in Your Head. Parla dell’effetto cocktail party, la capacità che abbiamo di focalizzare la nostra attenzione sulle parole pronunciate da una particolare persona anche se siamo in un ambiente affollato, ambiente in cui avvengono, e percepiamo, diverse conversazioni.

L’autore dell’articolo prova ad applicare questa capacità all’ascolto della cacofonia di pensieri che affollano la nostra mente. Fa notare che è possibile selezionare le personalità che ci interessano di più. È possibile mettere a fuoco i nostri diversi “Io”.

Questa “attenzione a chi parla” nella nostra mente tende a far emergere un wisest self, un Io che ci piace di più, un Io più saggio degli altri, un Io che ci dà più stabilità, più pace.

Per certi versi, e lo nota anche l’articolista, è quello che si fa nella Meditazione Vipassana. Bello.

Conversare via radio

Il problema di riuscire ad ascoltare uno che parla in una stanza affollata è uno dei principali problemi che ha dovuto risolvere l’evoluzione della tecnologia cellulare.

Canali fissi

All’epoca delle trasmissioni analogiche, cellulari compresi, il problema di parlare in tanti in uno spazio ristretto (l’etere per le trasmissioni radio, ma anche il filo di rame di una rete di telecomunicazioni) veniva risolto creando tante stanzette (bande di frequenza) in cui la gente si chiudeva (due a due) per parlare. Questa soluzione implicava che qualcuno assegnasse le stanze (e i microfoni).

Per i canali radiofonici e televisivi si dava il microfono a uno solo, e a tutti gli altri nella stanza veniva permesso solo l’ascolto. Per le radio uno a uno, i walkie talkie, la stanzetta (frequenza) era pre-definita dal costruttore. I sistemi radio molti a molti, ad esempio le radio della polizia o dei radio amatori si accettava che più persone decidessero di parlare insieme e, se il risultato non era comprensibile, qualcuno urlava “Ripeti”. La telefonia via filo risolveva il problema usando una rete di switch, interruttori che creavano un canale fisico diretto (una stanzetta) tra due individui per la durata della conversazione.

La telefonia cellulare ha dovuto inventarsi qualcosa di meglio, semplicemente perché il numero di canali possibili (frequenze) era estremamente ridotto rispetto alla quantità di fili di rame che era stato possibile stendere per i telefoni. Inoltre le frequenze radio hanno confini indefiniti. Mentre posso essere sicuro che al mio telefono arriva un solo filo, se lo sostituisco con una radio diventa meno chiaro stabilire a priori con quali ripetitori può connettersi, specialmente se si muove.

Soluzioni tecnologiche

Le soluzioni a questo problema sono tutte interessanti, e in qualche modo ricalcano le equivalenti soluzioni umane.

L’ALOHA (“Ciao” in hawaiano, questo tipo di protocollo per il collision avoidance è stato inventato negli anni 70 alla University of Hawaii), ricalcava la soluzione dei radio amatori: uno prova a parlare e contemporaneamente ascolta sul canale comune. Se non risente esattamente il suo messaggio vuol dire che qualcun altro gli parlava sopra, e ritenta dopo un po’.

Il GSM (Global System for Mobile communications) usava una tecnica nota come Time Division Multiplexing per permettere la comunicazione di più persone assegnando a ogni conversazione una frazione di tempo, pochi millisecondi a testa. Come se nello stanzone ognuno potesse pronunciare una sillaba alla volta, a turno, se ascolti solo nell’intervallo assegnato al tuo interlocutore senti solo lui. Certo, poi devi rimettere insieme il contenuto.

Il CDMA (Code-division multiple access) torna allo stanzone in cui tutti danno sulla voce a tutti. Ma prescrive che ognuno parli con dei simboli che permettono di distinguere una conversazione dall’altra. Come se ogni conversazione avvenisse in una lingua diversa. Io sento anche il suono dei due cinesi che mi stanno parlando vicino, ma capisco meglio il mio amico che parla italiano dal fondo della stanza.

Una tecnica interessante usata dal moderno 5G è quella di usare per ogni canale frequenze parzialmente sovrapposte e ortogonali. In soldoni usano delle caratteristiche fisiche delle frequenze per riconoscerle anche quando si sovrappongono. Un analogia col nostro stanzone potrebbe essere tracciare nella stanza dei percorsi mediante linee per terra, in modo da costringere a parlare in una direzione ben precisa e magari con un tono di voce diverso per ogni percorso (in questa conversazione si parla in quella direzione e con voce da soprano).

Le tecniche di error correction aiutano a capire se il messaggio è arrivato integro. Se al fondo di ogni parola aggiungo il numero di lettere della parola, aiuto chi la sente a riconoscere un eventuale errore in modo che possa chiedermi di ripetere.

Il forward error correction aggiunge ad ogni messaggio informazioni che permettono al ricevente di ricostruire il messaggio errato senza dover chiedere la ripetizione. Se assieme al messaggio mi dicono il numero delle vocali, delle consonanti gutturali, plosive etc. posso capire che aveva detto “pazzo”, anche se io ho sentito “cazzo”. La tecnica usata non è questa ovviamente, stiamo parlando di codifiche digitali, ma il risultato è analogo.

Con chi parlare (o chi ascoltare)

La capacità di ascoltare chi vogliamo ce l’ha data l’evoluzione. L’abbiamo ricostruita con la tecnologia e, con un po’ di esercizio, possiamo ritrovarla anche nel discernere i nostri processi mentali. Un problema ben più complicato è capire con chi vale la pena parlare o chi vale la pena ascoltare.

Qui l’evoluzione dà una risposta parziale. Siamo attrezzati per vivere in piccoli gruppi.

Per creare comunità più allargate abbiamo dovuto inventare strumenti come il gossip. Quello è un bravo cacciatore. Quel commerciante è un ladro. Quella è un po’ zoccola.

Abbiamo creato storie per sentirci parte di gruppi più vasti. Noi siamo quelli protetti dal grande castoro bianco, o dal tal santo. Noi siamo i portatori della democrazia, o quelli che libereranno i poveri dall’oppressione. Noi siamo quelli che difendono i valori della nazione. Noi siamo quelli che amano la musica del tal gruppo. Noi siamo quelli che credono nel futuro dei Bitcoin.

Queste storie ci permettono di rapportarci con dei perfetti estranei come se fossero amici di lunga data. Se partecipiamo ad una manifestazione o ad un concerto possiamo abbracciare persone che non conosciamo o esultare con loro.

Ma man mano che la comunità di cui vogliamo essere parte si allarga. Man mano che aumenta il numero di possibili storie che possiamo decidere di guardare con favore. Man mano che aumenta il numero di persone che potenzialmente potremmo considerare amiche, fino a comprendere virtualmente tutti gli esseri umani, il cui numero tra l’altro aumenta costantemente, non ce la facciamo più. Non abbiamo più strumenti neanche più per contare questi elementi. Contare le storie. Contare le persone. Figurarsi vagliarle, selezionarle.

E qui, di nuovo, la cultura e la tecnologia ci vengono in aiuto. Abbiamo creato il linguaggio scritto, i libri, i giornali, i media, i social media. Questi ultimi fanno uso di una nuova, pericolosa e potente, magia: l’Intelligenza Artificiale.

Il Wisest Self della nostra specie

Mi chiedo se non stiamo, finalmente, dotando la nostra specie di un’anima.

Accennando, sopra, al nostro discorso interiore facevo notare che l’articolo sul Cocktail party interiore dava per scontato che un Io particolare, più saggio degli altri, un Io unificante, fosse facilmente identificabile. Qualcuno lo chiama Coscienza, forse. O anima.

Se siamo destinati, come penso, a diventare un unico organismo di cui i singoli esseri umani sono le cellule, qual’è l’Io Saggio di questo organismo ?

I pensieri di questo organismo possono essere le varie storie, teorie, memorie, spiegazioni, modelli che, di volta in volta, due o più esseri umani condividono. Ci saranno pensieri che si impongono sugli altri, le idee/storie/miti condivise da più persone. Ma non dovrà essercene anche qui uno che prevale su tutti ? Non uno che prende decisioni per tutti, ma uno che, se ascoltato, tende a dare un senso al tutto.

Ci sono scienziati, forse la maggior parte di quelli che studiano a vario titolo la mente umana, convinti che questa sia il risultato del lavorio delle cellule cerebrali (o intestinali). A me piace pensare che questo wisest self sia esterno alla nostra fisicità. Mi piace pensare che il nostro essere fisico sia semplicemente in sintonia con qualcosa che vive su un piano diverso.

Se ci pensate l’IA rappresenta un’intelligenza esterna alla specie umana. Benché nasca dalla nostra tecnologia si evolve in modi che non comprendiamo. Un’intelligenza, ancora in embrione, che dimostra già le potenzialità per diventare la coscienza della nostra specie.

Deepak Chopra, parlando in un suo libro di argomenti, in qualche modo, legati a questo, fa l’esempio di una calamita sotto il foglio di carta coperto di limatura di ferro. Noi, i nostri neuroni, sono la limatura di ferro, la scienza non sa (ancora ?) vedere sotto il foglio, ma la vera intelligenza, la vera mente è la calamita.

Magari c’è un calamitone anche per la specie umana, magari possiamo metterci in comunicazione anche con lei.

Magari ci ha fatto sviluppare l’IA.

Recensione Misuratore Energia Emporia Vue

Ho comprato e installato questo aggeggio, e registro le mie impressioni.

A cosa serve

A misurare i consumi elettrici. Fornisce un indicazione, aggiornata ogni secondo, della potenza prelevata o, se si ha un impianto solare, della potenza fornita alla rete.

Sapere quanto si sta consumando è utile per ridurre i consumi, ma diventa essenziale se si dispone di un impianto fotovoltaico.

L’energia prodotta in eccesso dai pannelli viene, in genere, venduta alla rete, che in teoria funge da batteria economica. Quando ho energia in più la vendo e la ricompro nei tempi di magra. Tutto questo se si ha un contratto di scambio sul posto, cosa comune alla maggior parte delle installazioni.

Lo scambio sul posto sulla carta suona bene, di fatto è molto penalizzante sul piano economico. È molto più vantaggioso usare la propria energia che metterla in rete e riprenderla successivamente, perché questo scambio riguarda solo il valore dell’energia, non vengono calcolate le tasse, che incidono in percentuale significativa sul costo al kWh.

Usare al meglio l’energia prodotta non è semplice. Impone anzitutto un cambio di abitudini. Accendo la lavatrice quando c’è il sole, per dire. Ma non basta. Se, ad esempio, voglio accendere anche la lavastoviglie mi conviene ancora ? C’è abbastanza sole per reggere i due elettrodomestici e quant’altro è acceso in casa in quel momento ? Poter visualizzare il consumo serve a questo. Certo posso andare a leggerlo sul contatore, ma è meno agevole e lì non ho la storia dei consumi e non posso innescare automatismi legati alle varie condizioni.

Ad esempio potrei voler accendere automaticamente una stufa elettrica o una pompa di calore quando ho energia in eccesso e la temperatura in casa è sotto una certa soglia, e spegnerla, sempre automaticamente, quando una di queste condizioni venga meno.

Gli impianti solari più recenti, soprattutto se dotati di batterie di accumulo, arrivano con questa funzionalità di serie, per quelli più vecchiotti occorre risolvere con apparati esterni.

Installazione

La visualizzazione dei dati di consumo istantanei e storici viene fornita da un’app sul telefono (Android o IOS).

L’oggetto arriva senza manuali di istruzioni. L’app, una volta creato un account offre una guida, ma è fatta per il pubblico americano ed è di scarso aiuto.

L’alimentazione dell’apparecchio richiede un attacco 120/240V. Si può quindi collegare direttamente al contatore (con le dovute cautele) se non si dispone di una presa nei paraggi. Non è dotato di presa, comunque, ma di quattro fili di colore diverso. I diversi colori servono per il collegamento a un impianto trifase. Per un normale contatore monofase italiano vanno connessi in questo modo: il nero alla fase, bianco, rosso e blu al neutro. Per capirlo ho dovuto giracchiare in internet. Ho inserito queste connessioni in una presa volante e le ho infilate in una presa.

Serve anche una connessione wifi che arrivi nei pressi del contatore, perché il dispositivo parla con qualche server in internet, a questo server si accede con l’app sul telefono.

L’ultima cosa da collegare è la pinza amperometrica. Un gancetto che va messo intorno al filo di fase che esce dal contatore. Nel caso si disponga di impianto fotovoltaico la pinza deve prendere anche il cavo che arriva dai pannelli. Ci sono vari tipi di schemi per il montaggio dei pannelli, la situazione può essere differente in altre installazioni. Comunque per il collegamento della pinza ho cercato, senza successo, indicazioni su internet. Alla fine ho scritto una mail al loro supporto e mi hanno risposto nel giro di poche ore.

Uso

Una volta connesso il tutto l’app visualizza, oltre al consumo istantaneo, lo storico dei dati. Si può scegliere come granularità i secondi, i minuti, ore, giorni, settimane, mesi o anni.

L’indicazione dei consumi appare con barrette blu, che diventano verdi quando i consumi sono negativi (si sta producendo più energia di quanta se ne consuma).

È possibile in teoria attivare degli automatismi, tipo accendere qualcosa quando si produce energia in eccesso, ma questa funzionalità è prevista solo se si usano prese intelligenti prodotte da Emporia. La cosa sarebbe già di per sé penalizzante. Se si aggiunge il fatto che queste prese sono prodotte solo per lo standard USA e non sono vendute da noi è chiaro che la funzionalità è semplicemente assente.

L’azienda dichiara che è prevista l’integrazione con i vari Google Assistant, Alexa e Siri. Questo aprirebbe la possibilità di usare smart plugs di altri fornitori, ma non dichiarano quando la cosa sarà possibile.

Pro

Economico

Oggetto abbastanza economico, paragonato ad altri della stessa categoria. Su Amazon costa circa € 83.

Buon supporto

Supporto clienti molto veloce a rispondere alle mail, addirittura di sabato.

Contro

Nasce per gli Americani

È chiaramente pensato per il mercato americano. L’installazione è piuttosto complicata e poco chiara per i nostri contatori.

Poco accurato

Questa è la nota più dolente, ma sinceramente non so se i dispositivi concorrenti facciano meglio. Le caratteristiche tecniche non vengono dichiarate in modo chiaro da nessun venditore.

Per misurare la potenza bisogna moltiplicare la lettura dell’intensità di corrente per il voltaggio. Di base il device assume che il voltaggio sia 120 V e usa un moltiplicatore (un numero configurabile nell’app) per adattare il calcolo alla tensione 220 Volt. Armeggiando con questo numero si riesce a ottenere una lettura simile a quella del contatore in un dato istante. Il problema è che la tensione di rete cambia continuamente (+- 10% rispetto alla tensione nominale di 220V).

Un apparato serio dovrebbe quindi leggere questa tensione in tempo reale per dare una lettura corretta. La cosa strana è che il voler fornire questa funzionalità sarebbe l’unico motivo che giustifica l’esistenza dei fili colorati da connettere alle varie fasi. Per cui resto un po’ basito.

Alternative

Un’alternativa che merita qui citare, è l’Open Energy Monitor. Si tratta di un progetto Open Source. Sono open sia il software che l’HW, basato sui popolari Arduino e Raspberry PI.

Il sito ha il merito, tra l’altro, di spiegare bene non solo l’implementazione e l’uso del dispositivo, ma anche la teoria alla base. Ovviamente non soffre di nessuno dei difetti menzionati sopra, ma richiede di essere un po’ più smanettoni.

Si trova già montato, ad un prezzo più alto di quello richiesto per acquistare un oggetto simile sul mercato normale, lo vende una ditta a gestione familiare in Inghilterra, per cui anche le spese e il tempo di spedizione non sono trascurabili.

Viene a costare molto meno se si ha voglia di assemblarlo da sé, meno ancora se si ha qualche Arduino o Raspberry PI sparsi per casa (capisco che non sia da tutti 😄).

Se poi avete qualche esperienza nell’usare un saldatore e qualche linguaggio di programmazione le possibilità di customizzazione sono infinite.

Democrazia Assistita

Photo by Bonnie Kittle on Unsplash

Un mio amico che in gioventù frequentava ambasciatori e nobiltà varie, mi raccontava di non so quale contessa che sosteneva che le tre cose di cui non bisogna mai parlare in società sono: sesso, religione e politica. Delle prime due un po’ ho già accennato. Per allontanare definitivamente questo blog dai conviti sociali mi mancava la terza, e l’occasione possono essere le imminenti elezioni europee.

Software che ti consiglia il partito

L’idea per questa chiacchierata arriva dal fatto di aver trovato, via FaceBook, un link ad un sito (euandi2019) che ti suggerisce quale partito votare in base alle risposte che dai ad una serie di domande proposte. Un software divinatorio simile è presente sul sito de LaStampa, ne ha uno anche Repubblica e c’è anche questo (isidewith), che non è male. Perlomeno offre link di approfondimento sui temi che ti propone.

Dopo aver giocato un po’ con tutti ed aver visto i risultati e i commenti di qualche amico che ha fatto lo stesso, la sensazione generale è che questi test proiettino una visione appiattita della politica: i partiti sembrano tutti uguali. Sensazione anche più acuta nel caso i test emettano percentuali di aderenza ad un partito o all’altro: ti viene detto, in genere, di essere allineato a partiti da cui ti senti molto distante.

Il test de LaStampa produce meno questo effetto, ma c’è il trucco. Credo che per ogni argomento abbiano chiesto ai vari partiti la domandina/filtro da mettere. Il risultato è che a seconda della formulazione della domanda scelta, si seleziona molto nettamente un partito o l’altro, ma spesso è solo uno scherzo retorico: le risposte non sono poi così diverse. Guardate, ad esempio, le domande sul problema migranti:

  • Le leggi sull’immigrazione le fa l’Italia, non l’Ue. Protezione frontiere e respingimenti dei migranti
  • Redistribuire migranti, strategia comune per bloccare irregolari e rimpatriare chi non ha diritto. Piano Marshall per l’Africa
  • Ricollocazione obbligatoria dei migranti, rimpatri volontari e più fondi all’Africa
  • Ingresso per ricerca lavoro, canali per richiedenti asilo, soldi per inclusione sociale, chiusura Cie, abolizione norme contro soccorso in mare
  • Ripartire migranti tra Stati, sanzioni per chi non li accetta, gestione comune delle frontiere, vie legali per profughi e più fondi per l’Africa
  • Difendere propri confini aumenta conflitto tra Stati. Serve piano europeo per ingressi, espulsioni, garanzie, integrazione

Si delineano bene i due schieramenti opposti di chi vuole il totale respingimento da una parte o la incondizionata accoglienza dall’altra, e in mezzo varie proposte moderate che di fatto non si escludono a vicenda. Francamente non saprei attribuirle ad un partito o all’altro, ma sembrano destinate a riconoscere un’appartenenza di pancia più che una posizione su cui ha senso esprimere un parere.

Insomma, mi piace l’idea di questi orientatori al voto, ma la si potrebbe realizzare meglio. Ho apprezzato il fatto che il test euandi 2019 si prenda la briga di dirti da chi è fatto, e con quale metodologia.1.

Forse il problema è che le differenze tra i partiti non sono davvero così evidenti, o, più probabilmente, fanno tutti attenzione a non dire con troppa precisione come la pensano davvero. Ma allora su che base votiamo? Riusciremo mai ad uscire davvero dal tifo calcistico e decidere su cose concrete? Paradossalmente la ventata populista sembra produrre un effetto positivo in questo: almeno riesci a trovare delle posizioni da cui nettamente ti senti respinto. Insomma, si ha un po’ la sensazione di stare scegliendo qualcosa, ma è una magra consolazione.

Come lo si potrebbe fare

Credo che Il software applicato al voto, alla democrazia in generale, potrebbe fare molto di più. Proviamo a ragionarci un po’, e magari a stendere delle specifiche preliminari.

Di cosa abbiamo bisogno? Il problema di fondo è come permettere ad un gruppo numeroso (50 milioni se consideriamo l’Italia o 400 milioni per l’Europa) di persone di prendere decisioni per il bene collettivo.

Queste decisioni possono riguardare:

  • direttamente i vari temi
  • le persone a cui delegare queste scelte
  • i gruppi (partiti) a cui deleghiamo la scelta delle persone a cui verranno delegate le scelte
  • varie sfumature tra le tre.

Tutti i test elencati sopra sembrano indirizzare la scelta sui temi, il che, per inciso, è strano. Se alla fine quello che voto sono nomi di persone, quello che veramente mi servirebbe per decidere seriamente è l’Anagrafe degli Eletti proposta dai Radicali e la voglia/il tempo per analizzarli. E magari giornali/blog/social networks che predigeriscano per me le informazioni che contiene.

Sicurezza, trasparenza … ca va sans dire.

Ma torniamo al software: un requisito fondamentale dovrà ovviamente essere l’identificazione univoca del votante, e la sicurezza che non voti sotto coercizione. L’anonimità del voto potrebbe non essere un requisito fondamentale: se voto persone o partiti è importante, per evitare voti di scambio o rappresaglie, ma se voto idee, diventa fondamentale non solo l’appoggio ad un’idea altrui, ma la discussione, la partecipazione a crearla, modificarla. Tutte cose che sembrano quasi in contrasto con l’anonimato. Il voto palese (o meglio la discussione palese) sembra, tra l’altro, di per sé una soluzione all’identificazione del chiamante: se quello che esprimo non è solo un sì o un no, ma un pensiero un minimo più elaborato, è difficile che qualcuno lo possa fare al mio posto, per lo meno in massa.

Altri requisiti di carattere generale dovrebbero essere l’assoluta trasparenza: il codice deve essere open source, le basi dati devono essere ispezionabili da chiunque. Deve essere robusto, a prova di hacker, ospitato su server pubblici (altro inciso: non è strano che i 5S, anche una volta al potere, non abbiano reso statale ed estesa a tutti la piattaforma Rousseau ?).

Niente partiti precostituiti

Supponiamo di eliminare i partiti. Lo scopo del partito in fondo è proprio quello che assumerebbe questo software: identificare i contorni di insiemi di idee che possano essere votati da una maggioranza di votanti e realizzati da un gruppo di eletti.

Fermiamoci a questo “identificare un insieme di idee”. E’ questo che dovremmo fare: dato un pool di idee, possibili soluzioni a problemi, sceglierne un sottoinsieme che sia appoggiato da una maggioranza. O forse, meglio: scegliere più sottoinsiemi appoggiati da gruppi significativi.

La differenza tra queste due formulazioni è la differenza tra democrazia diretta e rappresentativa (vedi sotto).

Le idee

Immaginiamo di essere riusciti, in qualche modo, ad inserire in una base dati una serie di proposte politiche. Non so, cose del tipo: “Liberalizziamo le droghe leggere”, “Fermiamo la TAV”, “Spariamo ai migranti quando li vediamo in mare”, “Diamo 10000 euro al mese a quelli che si chiamano Vincenzo” etc.. Il tutto magari affiancato da un insieme di link a documenti, discussioni (ad es. su Kialo) che ne permettano l’approfondimento.

La base dati e il software permettono ad ognuno di esprimere la sua preferenza o avversione verso un insieme molto ampio di queste idee. E’ già una sfida di per sé, soprattutto la formulazione, l’inserimento, la discussione, l’evitare doppioni lasciando però respiro alle diverse sfumature. Supponiamo, però, di esserci riusciti: le idee sono lì e sono solo più da votare.

I votanti

Supponiamo a questo punto di aver trovato il modo per far votare tutto a tutti (in realtà è il votare stesso a definire l’insieme utile delle idee: quelle che nessuno vota è come non esistessero).

Supponiamo anche di essere stati capaci di dare pesi diversi ai diversi votanti in modo sensato (potreste non essere d’accordo, ma a me sembra che, come per l’anonimato, passare dal votare persone al votare idee comporti il superamento di qualche tabù: se voto idee sarebbe davvero triste se non tenessi in qualche modo conto di quanto un votante ha davvero capito l’argomento, ad esempio).

Ma supponiamo di aver superato anche questo ostacolo e di avere in questa base dati l’elenco delle idee e, associato ad ogni idea, la valutazione di ogni singolo votante, assieme all’importanza che il votante dà alla questione, e alla competenza del votante stesso.

Democrazia diretta o partiti dinamici

A questo punto può partire un’elaborazione con due obbiettivi abbastanza diversi:

  • posso cercare di individuare un’insieme di idee appoggiato dalla maggioranza più ampia e qualificata possibile.
  • posso cercare di identificare gruppi di votanti coesi e più ampi possibile.

In pratica è la scelta tra democrazia diretta e rappresentativa.

Diretta

Nel primo caso ho tirato fuori dai votanti le decisioni finali: quello che mi serve sono dei tecnici che le attuino. Ho sicuramente scontentato più gente: il set di scelte che emerge sarà quello che scontenta un po’ di meno. Non genererà grandi passioni, ma sarà immediatamente chiaro cosa fare.

Rappresentativa

Nel secondo caso ho creato dei partiti. Ho selezionato gruppi di persone che la pensano in modo simile su molti temi. Ho identificato idee ben rappresentate. Gli appartenenti a questi gruppi saranno appassionati, vitali. Ma nessun singolo gruppo potrà prevalere in assoluto sugli altri. Per attuare le idee di un gruppo ho bisogno di rappresentanti che sappiano mediare con gli altri gruppi/insiemi-di-idee. I rappresentanti, in questa seconda ipotesi saranno politici, non tecnici.

Variabile

La cosa interessante è che questa distinzione, tra democrazia diretta e rappresentativa, può non essere netta, (posso dosare quanto il sistema deve cercare ampio consenso a scapito di coesione, in pratica posso scegliere a priori il numero di partiti da 1 a N) e soprattutto questa scelta può essere essa stessa oggetto di voto.

Le persone

Ovviamente bisognerà votare anche gli eletti, tecnici o politici che siano. Se uno vuole candidarsi semplicemente lo dice: io sono a disposizione. Siccome i potenziali eletti sono anche votanti il sistema potrebbe proporre ad ogni votante i candidati che hanno votato in modo simile a lui e, in puro stile social network, tirare fuori la squadra di governo o il partito in base alle reputazioni dei vari profili. La partecipazione alle discussioni, l’aver proposto le idee più votate, la competenza, diventano punti che portano ad essere eletti.

Vincoli

Nessun’idea è un’isola. Le idee si condizionano a vicenda, specialmente sul piano economico. Potrebbe non avere senso votare per il reddito di cittadinanza e contemporaneamente votare per un abbassamento delle tasse. O comunque, se auspico che determinate scelte, che comportano nell’immediato introiti minori, abbiano un effetto economico positivo nel tempo devo tenere conto della variabile temporale. Se voto per una scommessa devo tenere conto del suo piano B. Ci sono scelte che sono ambientali (non nel senso di Greta, ma nel senso che condizionano molte altre scelte). Il software che permette di votare dovrebbe tenere conto di questi vincoli, e non permettere voti incoerenti. Votare dovrebbe essere, in qualche modo, simile a giocare a Sim City.

Vincoli a lungo termine

Un ultimo aspetto che questo software dovrebbe tenere in conto è quello del tempo. Le scelte di governo hanno uno span temporale. Anche quelle che sembrano di portata immediata acquistano o perdono valore a seconda di scelte che vengono fatte prima o dopo. Le scelte economiche soffrono del debito prodotto dalle generazioni precedenti e migliorano o peggiorano il futuro delle prossime. Alcune scelte, come i piani di ricostruzione a fronte di guerre o crisi, hanno span più lunghi di quelli di un singolo governo.

Per evitare che un periodo di cattivo governo possa avere conseguenze nefaste a lungo termine, ai singoli governi vengono posti pesanti limiti, ad esempio sulla possibilità di indebitarsi. Un’altra fonte di limitazioni sono gli accordi economici tra gli stati.

Il software di voto deve tenere conto di tutto questo e permettere le scelte che ipotecano maggiormente il futuro solo sulla base di maggioranze estremamente ampie, o in casi estremi, vietarle del tutto. Potrebbe esserci un rispetto per le prossime generazioni cablato nel codice.

Photo by Markus Spiske on Unsplash

Ma si può fare ?

Direi di si, e sono pronto a scommettere che un social network con caratteristiche simili a queste verrà fuori in tempi brevi. Credo che a quel punto non sia nemmeno necessario che qualcuno lo incoroni e lo metta al potere. Milioni di persone che convergono su un insieme di idee governano. Punto. Il resto sono chiacchiere e distintivo.

  1. Dicono anche che il programma deriva da un SW su GitHub, chiamato Societly. Sono andato a vedere ed è presentato come “Web application to help university clubs and societies manage their members”. Bah …

The Game

Appena finito di leggere il libro di Baricco: bello bello bello.

Però, va bene dover scegliere le montagne più alte, ma non parlare né di Linux, né di Firefox mi sembra eccessivo. Saranno un po’ correnti sotterranee e non montagne, ma se tutto questo è stato possibile è in gran parte merito dell’open-source, che, tra l’altro, ha valenze filosofiche mica da ridere: la sfida tra la protezione della proprietà intellettuale e la diffusione aperta a tutti delle idee, l’auto-organizzazione di migliaia di menti che collaborano ad un singolo progetto. Secondo me questi aspetti erano importanti almeno quanto il resto.

Il plumbing di internet, il lavoro, in massima parte open che rende disponibile la maggior parte di questi nuovi strumenti è un esempio di posto in cui non dominano le verità veloci, le informazioni viaggiano, velocemente sì, ma complete e ricche, tra menti esperte e senza bisogno di sintetizzazioni estreme: in confronto alle piccole forme areodinamiche delle verità veloci queste sono astronavi: sono sia aerodinamiche sia piene di un sacco di roba. E’ un mondo in cui la gente si confronta, per ora su temi tecnici certo1, ma con rispetto e competenza, un mondo in cui se non sai sei invitato e aiutato ad imparare. Un mondo in cui si riesce a conciliare, in qualche strano modo, fama, successo e umiltà e generosità.

Il giorno in cui il tipo di collaborazione che c’è nel mondo open-source si estenderà ad altri aspetti delle relazioni umane avremo davvero fatto un passo avanti enorme, l’oltremondo somiglierà davvero ad un paradiso.

Credo sia da ammirare l’approfondimento, anche tecnico, che Baricco ha fatto, ma credo che se avesse liquidato meno velocemente i nerd, se li avesse guardati non solo come “i programmatori che non si vedono e non disturbano”, ma come portatori, con la loro passione, di una filosofia un po’ più ricca del “Ci piace giocare”, ne avrebbe tirato fuori di più.

La filosofia nerd non è solo liberiamoci dei vecchi privilegi ed eliminiamo gli intermediari. Anche, certo, ma credo ci sia la capacità di assaporare, in anticipo su altre categorie, la possibilità di un mondo di abbondanza e armonia. Un gioco sì, ma di quelli da cui non hai più bisogno di uscire.

Stanno creando una musica che Baricco non sente. Ancora.

  1. Ma non solo: guardate cose come kialo, o medium. ↩︎

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.

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.