Il cambio delle lampadine

Una metafora sul codice, che ne riprende mille altre simili, e’ tornata alla mia attenzione negli ultimi giorni :

“Devi cambiare una linea di codice, sai gia’ qual’e’, e’ come sostituire una lampadina!”

Non ero coinvolto nella discussione e non ho commentato subito, ma in questi giorni ci ho riflettuto molto.

Credo che questa, e altre metafore dello stesso tipo, nascano dalla limitatezza espressiva del codice nel descrivere le proprie interconnessioni.

Se ci si limita a un’occhiata, la linea di codice “sembra” isolata, come sono isolate le voci di un elenco telefonico. Questa carenza espressiva nel codice permette di creare metafore del tutto fuorvianti, ma dal forte appeal.

Cosi’ come il codice, progetto della macchina che il compilatore costruira’, lo schema elettrico di un edificio, progetto della successiva installazione concreta del sistema elettrico, espone dei punti in cui e’ possibile effettuare una semplice sostituzione e aspettarsi di mantenere la coerenza del resto del sistema.

L’attacco di una lampadina e’ proprio uno di questi punti.

Altri punti dello schema elettrico invece non condivideranno questa qualita’ : come non citare l’esempio della ventola del mio bagno, che ha cominciato a funzionare solo dopo aver attaccato i fili della lampadina del bagno, perche’ proprio da questi alimentata?

La metafora del cambio della lampadina per descrivere la modifica di una linea di codice e’ corretta solo se quella linea di codice condivide le caratteristiche della lampadina : un oggetto che incapsula completamente le funzionalita’ desiderate (produrre luce) con un’interfaccia (l’attacco, il consumo, la polarita’) che ne astrae i dettagli implementativi.

Non a caso, quando nel codice si ci trova a rispettare tali proprieta’, sostituire una linea e’ semplice proprio come cambiare una lampadina.

Queste proprieta’ pero’ non sono comuni: tipicamente le linee di codice che le rispecchiano sono quelle in cui avviene l’istanziazione di una classe concreta dentro ad una variabile astratta (supposto che l’implementazione rispetti pienamente il contratto dell’astrazione).

Ecco, linee di questo tipo sono rapidamente sostituibili :

CalcolatoreDelMutuo calcolatore = new CalcolatoreMutuoQuinquennaleBancaIbs();

con altre lampadine :

CalcolatoreDelMutuo calcolatore = new CalcolatoreMutuoDecennaleBancaOpl();

Da qui nasce il valore della composizione : moltiplica le linee di questo tipo.

Sfortunatamente nel classico sistema di media-alta complessita’, dal design, diciamo, non perfetto, ci sono pochissimi punti di astrazione con il necessario grado di disaccoppiamento e sostituibilita’. Cosi’ pochi da rendere statisticamente improbabile che una linea da modificare ricada tra quelle fortunate.

La maggior parte sono linee che non rappresentano punti di aggancio di lampadine, quanto piuttosto fili di interconnessione, che su uno schema elettrico sono proprio rappresentati da linee, giunzioni e altri elementi non modulari.

Cambiare quindi una linea di codice corrisponde piu’ comunemente a cambiare un filamento a incandescenza che corre da una stanza all’altra e finisce dritto nelle prese a muro di due stanze diverse.

Visto che il filamento non e’ mai uguale agli altri ed essendo in serie a tutto il circuito, cambiarlo corrisponde a modificare lo schema elettrico del sistema.

Se ogni linea di codice ci sapesse mostrare le sue interconnessioni a monte e a valle sarebbe un gran guazzabuglio, ma sicuramente non nascerebbe l’idea di poterla “sostituire”. Infatti non diciamo “Facile come creare una derivazione al terzo piano”. Lo schema elettrico e’ molto chiaro nel definire cio’ che e’ modulare ed astratto da cio’ che e’ particolare, concreto e quindi fragile.

La sostituibilita’ e’ una caratteristica rara che richiede accurata levigatura per poterla raggiungere e anche cosi’, sempre e solo nel senso di definizione dell’astrazione. Non diciamo certo “facile come cambiare una lampadina con un asciuga capelli”.

Quindi, volendo proprio trovare una metafora elettrica per la modifica di un software fortemente interconnesso potremmo fare cosi’:

1000 linee di codice sono lo schema elettrico di un piano di un palazzo e ogni linea tracciata sul piano puo’ collegarsi a una delle linee di uno qualunque degli altri piani.

Dunque quando si pensa di cambiare una linea di codice nel classico sistema legacy, la metafora corretta non e’ il cambio di una lampadina, piuttosto e’ “cambiare lo schema elettrico cosi’ che la’ dove adesso c’e’ un cavo che corre tra i piani 15,16 e 289 ci sia invece una resistenza di 5 ohm tra i piani 15 e 289. Il palazzo ha 300 piani in cui l’illuminazione e’ data da filamenti a incandescenza che corrono sospesi tra una stanza e l’altra, tutti simili, ma a loro modo diversi e quindi non intercambiabili, inoltre c’è una lavatrice in soffitta che si accende solo se premi un pulsante in cantina e altri tre pulsanti sconosciuti che incidentalmente fanno anche altre cose, oltre a garantire il funzionamento della lavatrice”.

Naturalmente per il palazzo la lavatrice e’ mission-critical.

Descritta cosi’ i costi di modifica diventano di colpo comprensibili. Non si tratta di giustificarli, quanto piuttosto ammettere il problema.

E’ subito evidente che il problema e’ lo schema elettrico e che si deve lavorare sul definire degli attacchi per lampadine, loro si’, sostituibili.

Ogni giorno si lavora per aggiungere una lavatrice in giardino e un ferro da stiro nella hall, ma con pari priorita’ si deve anche evitare in qualche modo di essere costretti ad alimentarli con un pannello solare nello sgabuzzino illuminato coi filamenti a incandescenza del pianerottolo di sotto.

Il vero guaio, a livello di comunicazione tra persone di ambiti diversi, e’ che certe metafore, valide per sistemi fortemente ingegnerizzati, trovano riscontro in quasi tutta la tecnologia che ci circonda e quindi hanno una componente di innegabilita’ che contagia anche coloro che sanno perfettamente cosa significhi davvero cambiare una linea di codice. Figuriamoci qualcuno il cui principale, e comprensibile, interesse e’ guadagnare il pane mettendo un’altra lavatrice in giardino.

Per il committente l’immagine di associare alle linee di codice altrettanti punti di sostituibilita’ ha una forza data dall’immediatezza delle proprie esperienze in contesti diversi.

Guardandoci attorno troviamo migliaia di esempi di sostituibilita’ bella e pronta : il cibo, le lampadine, le lavatrici, i vestiti.

Se la nostra esperienza quotidiana fosse invece quella di usare prototipi di microprocessori e dover cambiare la loro struttura per fargli smettere di moltiplicare e iniziare a sommare i grammi della nostra bilancia, assoceremmo le linee di interconnessione alle linee di codice, e i moduli intercambiabili delle memorie alle astrazioni definite nel codice.

Credo che da qui nasca l’esasperazione e l’idea che il software aziendale sia per sua natura un macello: la mancanza di vicinanza “estetica” tra una linea di codice e cio’ che e’ realmente : un dettaglio concreto dello schema progettuale di un sistema complesso, fa pensare che cio’ che abbiamo in mano sia facilmente malleabile. Una volta subìto l’ennesimo smacco a questo ordine di idee inizia a nascere ogni sorta di ritrosìa nel guardare il problema da piu’ vicino e a darlo invece per insolubile.

Come andare a spiegare a un non-tecnico che non siamo ancora stati in grado di trasformare la nostra linea di codice in un prodotto ingegnerizzato, controllato e sostituibile? Come spiegare che un tale lavoro ha un costo pari alla moltiplicazione per 5 del costo iniziale di creazione del prototipo?

Spesso, piuttosto che questa ammissione di debolezza, la forza di una metafora “di per se’ evidente” come quella della lampadina, fornisce il necessario momento di escapismo di cui ogni tecnico responsabile ha prima o poi bisogno : il committente ha le sue buone ragioni! Cambiamo questa lampadina!

Quello che conta e’, dopo aver sbottato, tornare a lavorare sul creare gli attacchi e le lampadine, ricordandosi il premio che ci aspetta: una volta che le lampadine sono state create, a un programmatore non ci vuol niente a cambiarne una o cento, proprio come ci aspetteremmo da un buon omino di casa.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s