Qualità del codice

Arte, in ogni tempo e luogo, significa fare qualcosa che ha una qualità riconoscibile. E in questo senso, la programmazione non fa eccezione.

Dopo un lungo periodo in cui il problema da affrontare era solo avere abbastanza programmatori, ed un altro in cui il problema era avere abbastanza programmi, ad un certo punto è diventato chiaro che la qualità di un programma era più importante della quantità. Ma che si intende per qualità?

Gli stessi programmatori parlano spesso della bellezza del codice sorgente, intendendo una qualità che non ha a che fare con la correttezza, la velocità e l'efficienza. Il curriculum di informatica dell'Università di Berkeley si chiama "The Beauty and Joy of Computing":

We also think that computer programs (not just the pictures that programs can produce) can be things of beauty. Yes, programs can also be ugly, if they're long sequences of assignment statements with no structure. But good programmers develop a sense of programming aesthetics.
Source: https://bjc.berkeley.edu/curriculum/

Più spesso, per qualità si intende quella economica. Un software di qualità fa risparmiare perché costa di meno manutenerlo.

High-quality software is not expensive. High-quality software is faster and cheaper to build and maintain than low-quality software, from initial development all the way through total cost of ownership. (Casper Jones)
Più vicino alla qualità in un senso tradizionale, potremmo dire "scolastico", c'è la qualità intesa come sinonimo di leggibilità:
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. (Martin Fowler) A programmer is ideally an essayist who works with traditional aesthetic and literary forms as well as mathematical concepts, to communicate the way that an algorithm works and to convince a reader that the results will be correct. ... (Donald Knuth) Programs must be written for people to read, and only incidentally for machines to execute. (Abelson and Sussman)

Dietro queste concezioni, c'è una visione piuttosto ingenua dell'estetica, come se fosse qualcosa di eterno e condiviso.

Quando un programmatore parla della "bellezza" di un codice sorgente di solito pensa alle caratteristiche dell'estetica classica, ispirata all'arte greca del periodo d'oro ateniese, cioè il quinto secolo avanti Cristo. In quel periodo sono stati fissati i canoni della statua umana, del tempio religioso, del discorso retorico. In breve, ritiene che un codice di qualità debba soddisfare almeno questi requisiti:

  • semplicità
  • chiarezza
  • equilibrio

Non è detto che semplice e chiaro siano sinonimi di "facile da capire", anzi: un bel codice richiede competenze più alte per essere compreso.

Ad esempio, questa funzione Javascript restituisce il valore numerico più grande da un elenco di 3 numer iinteri:

function getMax(anArray){
    if ((anArray[0]>anArray[1]) && (anArray[0]>anArray[2])) {
        return anArray[0];
    } else if ((anArray[1]>anArray[0]) && (anArray[1]>anArray[2])) {
        return anArray[1];
    } else {
        return anArray[2];
    }
}

const array1 = [2, 3, 1];
alert(getMax(array1)); 

Chiunque conosca appena il linguaggio Javascript la trova facile da leggere e capisce come arriva al risultato. Chi ha un livello appena un po' più alto si rende conto che è una soluzione macchinosa, scomoda da modificare. Chi è più competente la trova chiaramente rozza e insomma brutta.

Quest'altra soluzione produce lo stesso risultato, ma è più corta, anche se più difficile da leggere, e da un programmatore più esperto verrebbe certamente considerata più elegante, insomma più bella:

    const array1 = [2, 3, 1];
    const getMax = (a, b) => Math.max(a, b);
    alert (array1.reduce(getMax)); 
La prima versione è ingenua e non fa che simulare quello che farebbe un bambino per confrontare uno ad uno gli elementi di un elenco per trovare il più grande. Per come è scritta, funziona solo con un elenco di 3 valori. Per applicarla ad un elenco di 4 valori andrebbero modificate molte righe, altrimenti andrebbe in errore.

La seconda invece usa un concetto più avanzato (l'applicazione ripetuta di una funzione ad una lista fino ad ottenere un solo valore) e risolve non solo il problema specifico, ma un'intera classe di problemi simili.

Quello che piace ai programmatori è proprio la sua potenza astratta che si esprime senza inutili giri di parole. "Elegante" si porta con sé l'idea di un gesto potente realizzato con un piccolo sforzo.

Ma non è una qualità assoluta, intrinseca di quel codice sorgente: è una caratteristica di un certa classe di programmatori, che sono cresciuti con il mito dell'efficacia minimallista, della soluzione astratta, potenzialmente universale.

Questa idea di bellezza è specifica di questo tempo e del mondo occidentale. Basta fare un salto di qualche secolo o di qualche migliaio di chilometri per trovare estetiche completamente diverse, con valori diversi. Basti pensare all'arte medievale del nord europa o quella barocca, che invece si basano su valori completamente diversi: la curiosità, il capriccio, la sorpresa, il contrasto, la pesantezza e l'oscurità.

Negli ultimi anni, l'estetica - anche quella ufficiale delle mostre e dei musei - è più facilmente legata alla trasgressione, all'esagerazione, alla violazione di regole considerate eterne. Tutte le riflessioni condotte nell'ambito dei "Critical Code Studies" puntano a dimostra come gruppi di persone diverse dai maschi bianchi occidentali possono avere una visione del codice sorgente specifica, differente da quella "mainstream". Anche le gare di codice offuscato, come lo IOCCC, esprimono un'idea di qualità del tutto diversa da quella classica della chiarezza e delle leggibilità.

Insomma: è davvero ingenuo pensare che un codice sorgente sia "bello" perché assomiglia ad un sonetto di Francesco Petrarca. Un codice sorgente è bello perché corrisponde ad un'ideale di un certo gruppo di persone, in un certo momento storico. Certamente l'ideale classico è molto comune tra i programmatori occidentali, che appertengono ad una cultura comune che affonda le radici proprio nella tradizione greca. Ma questo non significa che non possano essercene altri.

Prossimo pannello:  Regole



Versione: 02/02/2022 - 18:31:38

Parole: 487

Pannelli

Arte                        
Qualità                    
Regole                      
Vincoli                     
Combinatoria                
Caso                        
Gioco                       
Musica                      
Improvvisazione             
Poesie                      
ASCII art                   
IOCCC                       
Virus                       
Live Coding                 
🔎