Seleziona una pagina

Di recente ho completato l’Applied Functional Programming Workshop organizzato da Avanscoperta da Matteo Baglini.

attestato functional programming

Ho dunque voluto scrivere brevemente quesa recensione per raccontare la mia esperienza positiva a questo workshop e condividere qualche concetto imparato grazie a Matteo 🙂

Cos’è la programmazione funzionale

programmazione funzionale

Cerco di dare una brevissima overview di quello di cui stiamo parlando. Sarò volutamente semplicistico per brevità 🙂

La programmazione funzionale è un paradigma di programmazione dove invece di programmare stile “lista di comandi”, quasi che fosse una lista della spesa, si va a dare delle “definizioni matematiche” di quello che ci si aspetta.

Detto in modo più astratto, la programmazione imperativa (quella che è stata diffusa con linguaggi come C, Java, ecc.) descrive il “come” il programma deve comportarsi. La programmazione funzionale descrive il cosa ovvero quello che ci si aspetta da un programma.

Un’altra proprietà importante della programmazione funzionale è la trasparenza referenziale. Ovvero, avendo tutti tipi di dato immutabili, la stessa chiamata a funzione fatta due volte, ritornerà per forza di cose lo stesso risultato. Questo potrebbe non essere vero nella programmazione funzionale se siamo in presenza di side effect. Ovvero, se la nostra funzione all’interno cambia anche lo stato globale del programma.

Questo ci permette dunque di poter dimostrare anche matematicamente che l’output è quanto è atteso. Potendo avere un’idea precisa di quelle che sono le precondizioni di ingresso alla nostra funzione e quelle che sono le postcondizioni. Ovvero quali sono gli input e gli output attesi.

A livello di mantenibilità dunque, ci è più facile garantire che il programma fa quanto ci si aspetta. E molte volte è anche più chiaro e ovvio che quanto viene proposto è corretto.

Tutto ciò sta venendo sempre di più integrato nella programmazione Android e in generale nella programmazione moderna. Specialmente il concetto di Unidirectional data flow ormai è l’asse portante della programmazione Android.

unidirectional data flow in Android

Molto in breve, ci si sposta dall’idea di “lista di comandi” o del “modificare la vista a seconda di varie condizioni” a reagire a cambi di stato. C’è dunque uno stato del programma e ci sono vari cambi di stato. La UI dunque accetta questo stato e si ridisegna a seconda dello stato che deve mostrare.

In questo modo non ci sono continui scambi tra vista, modello e presenter (o viewModel, controller, ecc.) ma semplicemente lo stato viene “emesso” dal viewModel e la UI reagisce a questo cambio di stato. Successivamente, se l’utente interagisce con la vista, questi eventi vengono ripassati indietro e processati. Portando ad eventuali ulteriori cambi di stato.

Ti piacciono questi argomenti? Seguimi su instagram per non perdere i prossimi articoli 🙂

Questo permette anche l’utilizzo di un’architettura esagonale o ports/adapter o Clean Architecture ovvero un’architettura che va a segregare i vari layer permettendo dunque che la comunicazione avvenga solo tramite “porte” e “adapter”. In altri termini, attraverso interfacce.

ports adapter architecture

Questo permette dunque di avere i vari livelli che non sono collegati in modo stretto gli uni con gli altri. E pertanto, li rende più facili da testare. Ogni livello del nostro “unidirectional data flow” potrà quindi essere testato in modo unitario simulando degli input dello strato precedente e verificando che gli output passati allo strato successivo siano quelli attesi.

In buona sostanza, oramai questi sono concetti che se uno vuole affacciarsi al modo moderno di programmare, sono essenziali da apprendere e mettere in pratica.

Perché ho scelto di fare il corso

perché ho scelto questo corso

Mi sono avvicinato alla programmazione funzionale all’università ancora nel 2012 grazie al corso di Filè, uno dei miei professori all’epoca. Per l’occasione ancora veniva utilizzato ML. Le logiche da allora non sono cambiate, semmai sono maturati gli strumenti venendoli integrati in soluzioni commerciali più efficaci.

Grazie al supporto del mio collega Davide abbiamo progressivamente introdotto molte di queste logiche nel codice applicativo dell’app Android della nostra compagnia, Neato. Ho anche letto di recente un libro sulla programmazione funzionale per Kotlin per approfondire il topic.

Tuttavia, essendo passato molto tempo dal primo approccio teorico e non essendomi mai confrontato con un professionista al riguardo, volevo avere la certezza che il nostro approccio fosse corretto. E magari scoprire qualcosa in più sull’argomento 🙂

Struttura del corso

La scaletta degli argomenti è possibile consultarla all’indirizzo del corso e qui sotto è possibile vedere una presentazione di Matteo sui topic affrontati.

Molto in breve, l’idea del corso è quella di partire dai fondamenti del linguaggio e della programmazione funzionale. “Salendo” un po’ alla volta creando i vari pezzi del modello dell’applicazione che andremo a realizzare. Per poi, alla fine, riuscire a realizzare un interno web service che risponde ai comandi dell’utente.

L’applicazione non sarà altro che l’implementazione del Mars Rover Kata, ovvero un esercizio di programmazione dove dobbiamo modellare un robot che atterra su Marte e può muoversi su delle caselle e ha dunque dei comandi operativi.

Nel mentre che Matteo ci spiega come fare le cose, ci illustra anche la parte teorica di supporto utilizzando schemi, disegni e diagrammi in modo molto chiaro e preciso. Tra una spiegazione e l’altra abbiamo il tempo di applicare subito in pratica quanto appreso con degli esercizi molto puntuali e chiari. La presenza di test unitari e/o end to end a ogni step ti guida nella risoluzione degli esercizi.

Tra uno step e l’altro c’è sempre una breve pausa per recuperare le energie e un giro di feedback su una board dedicata di Miro 🙂 a livello didattico dunque penso che sia uno dei corsi meglio strutturati che abbia visto. Non lasciando nulla al caso ma sapendo esattamente come dividere i vari concetti in modo digeribile.

Da Kotlin a Scala e viceversa

kotlin versus scala

Quando ho lavorato per XPeppers, ora Claranet, ho avuto una breve esperienza con Scala e il mondo funzionale. Non ricordavo molto, ma mi ricordavo che partendo da Java l’impatto non è stato così tremendo.

Ripartendo di nuovo da Kotlin devo dire che è molto semplice fare un parallelo delle varie keywords. Le case class sono di fatto delle data class. Gli enum di scala sono di fatto delle sealed class su kotlin. Il pattern matching di scala su Kotlin è praticamente il when. Il for di scala è praticamente una combine in kotlin. E così via.

Una volta dunque che si capiscono i corrispettivi, se uno già ha dimestichezza, la situazione si semplifica notevolmente. Fare gli esercizi dunque è abbastanza semplice e lineare. A chi non ha proprio dimestichezza magari la cosa potrebbe sembrare più ostica e meno ovvia. Però nel corso ho trovato molte persone capaci che avevano già molta esperienza sull’ambito, quindi era facile venire aiutato dagli altri nelle sessioni di gruppo.

Alla fine la scelta di scala era stata fatta perché certi costrutti avanzati erano propri di scala. Mentre in altri linguaggi non erano presenti. Purtroppo però quella parte del corso è stata tolta e devo dire che è stato un grande peccato perché mi sarebbe piaciuto vedere qualcosa di più “avanzato” rispetto a quanto visto finora nella “normalità”. Anche per capirne l’effettiva necessità e se poteva portare migliorie ulteriori a quanto utilizziamo nel quotidiano.

Ti piacciono questi argomenti? Seguimi su instagram per non perdere i prossimi articoli 🙂

Allo stesso tempo però comprendo che chi vedeva questi concetti da zero per la prima volta sarebbe stato forse un salto troppo grande in pochi giorni di corso. Rendendo complessa la realizzazione degli esercizi e il seguire il materiale.

Alla luce di questo dunque scala è più una scelta di comodità visto che molti linguaggi implementano la programmazione funzionale in modo analogo.

Lo consiglierei?

consiglierei questo corso?

Come detto sia la struttura del corso che le modalità che il docente si vede che sono di primissimo livello. Matteo è sempre chiaro e preciso nelle spiegazioni. Ed Enrico di Avanscoperta è stato sempre di aiuto nei momenti di difficoltà.

Diciamo che a mio avviso l’utente perfetto per questo corso è chi ha già un po’ letto in giro della programmazione funzionale e ha provato qualcosa. Senza tuttavia farne un uso intensivo nel quotidiano. Questo corso sicuramente gli permetterà di entrare nella logica giusta e capire come usare la programmazione funzionale più semplicemente con il suo linguaggio.

Per un programmatore che già usa Elixir o che magari fa già uso della programmazione funzionale, può essere un utile ripasso. E anche un utile confronto con Matteo su dubbi e tematiche un po’ avanzate. Allo stesso tempo però rimarrà un po’ di amaro in bocca per non aver visto i costrutti tipici di scala più avanzati che effettivamente un po’ di curiosità la mettevano 🙂

Per cui se la vostra azienda, come nel mio caso, ve lo fa rientrare nel budget formazione è un corso che consiglio a tutti. Altrimenti è particolarmente indicato per un soggetto intermedio che vuole apprendere appieno questi concetti.

Cosa mi porto a casa

key take away che mi porto a casa

Sicuramente approfondirò Arrow, la libreria funzionale scritta per Kotlin, alla ricerca di qualche altra chicca più “avanzata” che il kotlin “vanilla” non permette. In particolare Either, Try e le altre monadi che permettevano di avere una computazione lazy sono qualcosa di interessante che vorrei vedere com’è affrontato in Arrow.

In kotlin “vanilla” c’è il buon Result con il relativo runCatching che però non è esattamente la stessa cosa. E il risultato è vicino ma porta a molto più boiler plate visto che l’errore non si può valutare solo alla fine, quindi addirittura a livello UI, ma dev’essere gestito e rimappato ai livelli più bassi.

Inoltre, mi è piaciuto capire come utilizzare questa mentalità anche per la parte più “operativa” del programma. Già comunque avevo abbastanza questo approccio, che tuttavia adesso sto cercando di adoperare ancora di più. Per noi finora la programmazione funzionale era “obbligatoria” sulla gestione dello stato e degli eventi, ma per il resto era a discrezione del singolo.

Per dire fare un map su un qualcosa che non sia un flow, per me era qualcosa di veramente molto raro. Negli esercizi invece che abbiamo fatto era tutto un map dietro l’altro 🙂

Infine, la lista dei libri da leggere per approfondire è sicuramente molto interessante e ho già nel radar qualche cosa da andare a spulciare 🙂

Conclusioni

Ringrazio Matteo per l’opportunità e Avanscoperta per aver organizzato il corso, spero di poter fare a breve altri corsi con loro perché l’esperienza è stata davvero molto positiva.

Se non vuoi perderti i miei prossimi articoli, puoi seguirmi su Instagram e/o su Linkedin.