La semplicità migliora sempre la leggibilità?
Direi, forse con un po 'di polemiche, assolutamente no .
Potresti consegnarmi una classe con 200 funzioni membro nella sua interfaccia pubblica, e potrebbe essere l'interfaccia pubblica più umanamente leggibile là fuori. Potrebbe essere una gioia leggere casualmente questo codice e la sua documentazione. Tuttavia, non lo definirei "semplice", perché a dispetto della leggibilità, dovrei preoccuparmi di come tutte queste funzioni interagiscono tra loro e potenzialmente fare attenzione ai casi complicati derivanti da un uso improprio.
Preferirei una classe con 20 funzioni membro che non erano così facili da leggere a 200, perché la "leggibilità" non è la mia priorità in termini di prevenzione dell'errore umano e miglioramento della manutenibilità del codice (la facilità con cui possiamo cambiarlo, cioè).
Tuttavia, tutto ciò dipenderà dalla nostra definizione personale di "semplicità". La "leggibilità" in genere non varia così selvaggiamente tra noi, a meno che qualcuno non abbia acquisito così tanta competenza e fluidità da considerare regex molto "leggibile", ad esempio dimenticando il resto di noi semplici mortali.
Semplicità
C'è stato un tempo, tanto tempo fa, in cui pensavo che "semplicità" significasse "il più facile da leggere possibile". Quindi scriverei il codice C con molte funzioni utili, cercando di migliorare la sintassi e rendere le cose il più facili da leggere e scrivere possibile.
Di conseguenza ho progettato librerie molto grandi, ricche e di alto livello, cercando di modellare una funzione per ogni pensiero umano naturale: aiutanti su aiutanti su aiutanti, tutti per modellare il codice client su una sintassi più leggibile. Il codice che ho scritto allora potrebbe essere stato il più "leggibile", ma era anche il più "non mantenibile" e "complesso".
blesità
Eppure ho avuto una breve passione con LISP verso la metà degli anni '90 (ritardatario). Ha cambiato tutta la mia idea di "semplicità".
LISP non è la lingua più leggibile. Spero che nessuno pensi che l'estrazione di CDR e CAR mentre invoca una funzione ricorsiva con un carico di parentesi annidate sia molto "leggibile".
Tuttavia, dopo aver lottato per farmi avvolgere il cervello dalla strana sintassi della lingua e dai modi totalmente ricorsivi di fare le cose, ha cambiato in modo permanente la mia idea di semplicità.
Quello che ho trovato con il codice che ho scritto in LISP è che non stavo più commettendo errori sottili, anche se la delicatezza di pensare in quel modo mi ha fatto commettere errori più palesi (ma quelli sono facili da individuare e correggere). Non avevo frainteso quello che stava facendo una funzione e mi perdevo un effetto collaterale sottile e imprevisto. Mi stavo solo divertendo in generale a fare modifiche e scrivere programmi corretti.
Dopo LISP, la semplicità per me è diventata minimalismo, simmetria, flessibilità, meno effetti collaterali, meno funzioni ma più flessibili che si combinano in un'infinita varietà di modi.
Sono arrivato ad apprezzare la mentalità secondo cui il codice più affidabile di tutti è il codice che non esiste. Sebbene sia solo una metrica grezza, tendo a vedere il potenziale di inaffidabilità del codice in base alla sua quantità. Cercare la massima praticità e leggibilità sintattiche tende ad aumentare tale quantità di un fattore importante.
minimalismo
Con la mentalità LISP integrata in me, sono arrivato a preferire le API minimaliste. Preferirei una libreria con meno funzioni, ma più affidabili e flessibili, che sono meno convenienti e la potenzialità più difficile da leggere rispetto a una che offre un carico di aiutanti "convenienti" e tale che può rendere il codice facile da "leggere" ma potenzialmente inciampare più problemi con inaffidabilità e sorprese che derivano dall'incomprensione di ciò che fa una di queste migliaia di funzioni.
Sicurezza
Un'altra cosa su LISP era la sicurezza. Promuoveva effetti collaterali minimi e funzioni pure, ed era lì che non mi vedevo più commettere errori impercettibili, anche se la difficoltà di leggere e scrivere nella lingua aumentava errori più palesi che potevo individuare 10 secondi dopo.
Funzioni pure e stati immutabili sono diventati preferibili per me ogni volta che potevo permettermelo, anche se la sintassi di:
sword = sharpen(sword)
... è un po 'meno semplice e distaccato dal pensiero umano rispetto a:
sharpen(sword)
Leggibilità VS. Semplicità
Ancora una volta, LISP non è la lingua più "leggibile". Può racchiudere molta logica in una piccola sezione di codice (probabilmente più di un pensiero umano per riga). Tendo a preferire idealmente un pensiero umano per riga per "leggibilità", ma non è necessariamente per "semplicità".
Con questo tipo di definizione di "semplice", a volte "semplice" potrebbe in qualche modo competere con "leggibile". Questo sta prendendo in considerazione le cose più dal punto di vista della progettazione dell'interfaccia.
Una semplice interfaccia significa che devi imparare molte meno cose per usarlo e potenzialmente ha una maggiore affidabilità e un minor numero di problemi a causa del suo minimalismo. Una documentazione completa sull'argomento potrebbe adattarsi a un opuscolo piuttosto che a un enorme volume di libri. Tuttavia, potrebbe richiedere un po 'più di lavoro grugnito e produrre codice meno leggibile.
"Semplice" per me migliora la nostra capacità di comprendere la funzionalità del nostro sistema ad un livello ampio. "Leggibile" per me migliora la nostra capacità di connettere ogni piccola riga di codice al linguaggio naturale e al pensiero e potrebbe accelerare la nostra comprensione di ciò che fa una riga di codice, specialmente se non siamo fluenti nella lingua.
Regex è un esempio di ciò che considero "estremamente semplice". È "troppo semplice e troppo illeggibile" per i miei gusti personali. C'è un atto di bilanciamento per me tra questi due estremi, ma regex ha quella qualità di semplicità simile a LISP come la definisco io: minimalismo, simmetria, incredibile flessibilità, affidabilità, ecc. Il problema per me con regex è che è così semplice che è diventato così illeggibile al punto in cui non penso che diventerò mai fluente (il mio cervello non funziona in quel modo e invidio le persone che sanno scrivere il codice regex in modo fluido).
Quindi, comunque, questa è la mia definizione di "semplicità", ed è completamente indipendente dalla "leggibilità" e talvolta può persino interferire con l'altro, portando a un atto di bilanciamento tra una libreria più "sintatticamente conveniente" e leggibile ma più grande o una "sintattica scomoda ", meno leggibile, ma ancora più piccola libreria. Ho sempre trovato la vera "convenienza della comprensione" e le vere priorità di "manutenibilità" in linea con quest'ultima, con la forte preferenza per il minimalismo anche a un certo costo per la leggibilità e la sintassi umana più naturale (ma non al punto di regex) . YMMV.