23
07
06

Usabilità del Codice, o “Quante righe di codice per una iterazione”

02:19 Thoughts

Usabilità, user interaction, user experience. Tutte parole che in quest’ultimo periodo si sentono sempre più spesso all’interno dei gruppi di lavoro almeno per quanto riguarda l’informatica. Fortunatamente. Nomi ormai famosi costituiscono gli evangelizzatori di quella che si può chiamare una rivoluzione: Jakob Nielsen, Donald Norman, Jef Raskin (giusto per citarne alcuni, se pensate me ne sia scordato qualcuno segnalatemelo pure).

Rivoluzione che in altri termini può essere pensata come un ritorno alle origini, ma standardizzato in formalismi: in fondo un eccellente artigiano sapeva già queste cose, senza saperle. Oggi si tenta di insegnarle, anche in vece della quantità di persone che bisogna addestrare in merito.

Tutto splendido, se pensate a quante volte avete bestemmiato davanti al manuale per programmare il videoregistratore o quante volte vi siete fermati davanti ad un messaggio di Windows che vi chiedeva “Sei sicuro? Annulla, Riprova, Tralascia”.

Ma nell’informatica vi è un aspetto che viene in apparenza completamente ignorato anche dalle persone di cui sopra: è vero che su un computer ci girano un sacco di programmi fatti per non tecnici, come ad esempio Word… ma d’altronde questi sono necessariamente realizzati da due altri strumenti: un editor e un linguaggio di programmazione.

Salvo pochissimi miglioramenti soprattutto avvenuti negli ultimi anni e comunque di importanza quasi del tutto marginale, gli sviluppatori ancora realizzano programmi fondamentalmente con degli editor testuali, scrivendo a mano del testo chiamato codice sorgente.

Gli Editor

Vorrei quindi pormi ad osservare l’usabilità di questa coppia di elementi. Partiamo osservando gli IDE (Integrated Development Environment) che vengono utilizzati per programmare. Lungi da me voler realizzare une recensione dei più famosi (cito giusto per conoscenza Visual Studio, Eclipse, Zend Studio) che porterebbe via molto tempo e spazio, vorrei però porre l’attenzione sul fatto che questi IDE non portano tanto miglioramenti alla scrittura, quanto a tutto il contesto di sviluppo (debuggers, database, wizards, object browsers, integrated documentation, …).

La mia analisi però vorrebbe concentrarsi solamente sull’editor, ovvero la finestra contenuta anche in ogni IDE che consente la scrittura del codice. Ad oggi, credo che gli unici miglioramenti significativi in questo ambito siano stati:

  1. Le inline code suggestions, ovvero delle finestrelle che si aprono mentre si scrive il codice contenenti le varie possibilità disponibili a riguardo di quello che si sta scrivendo (es. scrivendo Form1., dopo il punto appariva una finestrella sotto la riga di testo che mostrava tutti gli attributi, le funzioni e gli oggetti disponibili sul Form1). Prima apparizione mainstream credo in Visual Basic 4, nel 1995.
  2. I foldable blocks, ovvero la possibilità di “chiudere” un blocco di codice in modo che appaia solamente la sua prima riga (es. chiudere una funzione mostra la dichiarazione della funzione e dei puntini che indicano che vi è altro). Prima apparizione mainstream credo in Visual Studio .Net, nel 2002.

Ad oggi credo che l’editor per programmatori più usabile in assoluto sia TextMate. Si, prendetemi pure per un Mac Fanatic ma è un editor solamente per Mac. Se avete capito che non sono un Mac Fanatic, vi verrà il dubbio che forse non è un caso che tale editor (peraltro, recentissimo come sviluppo) esista proprio su Mac.

Evitando ancora una recensione di questo software e rimanendo in tema, è abbastanza evidente come praticamente nessuno abbia mai pensato in modo continuo e coerente su come migliorare l’usabilità degli editor testuali: ad oggi un IDE è fatto “da ingegneri per ingegneri”, ovvero l’importante è avere una feature, non come questa viene resa disponibile.

Il Linguaggio

Esistono una quantità enorme di linguaggi di programmazione. Volendomi soffermare ad enumerare solamente quelli che ho avuto modo di conoscere personalmente, la lista è già parecchio lunga: Basic, Pascal, C, C++, Visual Basic, ObjectiveC, Assembly, Lisp, Prolog, C#, Perl, PHP, JavaScript, Python, Ruby, Java, …sicuramente ne ho scordati alcuni.

Perché esistono tanti linguaggi? Perché i creatori di ciascuno pensavano, in un modo o nell’altro, di realizzare un linguaggio “migliore” oppure “più adatto ad uno scopo specifico”. Queste sono a mio avviso le due cause primarie, ma cosa rende un linguaggio “migliore”? cosa lo rende “più adatto”?

La motivazione alla base dell’evoluzione dei linguaggi è quella di rendere più semplice la scrittura di un buon programma allo sviluppatore. Come potete notare anche questa definizione senza pretese va a scontrarsi contro una serie apparentemente infinita di domande: cosa significa “rendere più semplice”? cosa definisce un “buon programma”?

Qui si rischia di cadere in una spirale di definizioni, pignolerie e vere e proprie filosofie, cosa che vorrei evitare. Personalmente mi accontento di dire che:

Qualcuno più, qualcuno meno, conosco tutti i linguaggi sopra elencati. Recentemente mi è capitato di dover realizzare una cosa semplicissima con PHP, JavaScript, Python e Ruby così a memoria, ma questa volta in Java.

Ovvero, realizzare un array associativo (hash). Per chi non lo sapesse, significa creare un elenco di elementi, ognuno dei quali è identificato da una etichetta.

Vediamo quindi nei linguaggi qui citati come si esegue il terzetto dichiarazione + inserimento + iterazione:

PHP

$array = array();
$array['saluto'] = "Ciao!";
foreach ($array as $key => $value) {
...$key...$value...
}

JavaScript

var a = new Array();
a['saluto'] = "Ciao!";
for (var key in a) {
...key...a[key]...
}

Python

a = {}
a['saluto'] = "Ciao!"
for key, value in a.iteritems():
...key...value...

Ruby

a = {}
a['saluto'] = "Ciao!"
a.each { |key, value|
...key...value...
}

Java

Map a = HashMap();
a.put("saluto", "Ciao!");
for (Iterator iter = map.entrySet().iterator(); iter.hasNext();)
{
Map.Entry entry = (Map.Entry)iter.next();
String key = (String)entry.getKey();
String value = (String)entry.getValue();
...key...value...
}

Notate differenze?

Una obiezione che mi si potrebbe fare è che sto confrontando un linguaggio fortemente tipizzato (ovvero, la dichiarazione delle classi è obbligatoria) con linguaggi non tipizzati o debolmente tali.

L’obiezione è naturalmente valida per quanto riguarda la lunghezza delle linee di codice, non per la quantità di istruzioni, ed è egualmente notabile come il comando “for” per la sintassi Java impacchetti due istruzioni in una sola riga e non sia egualmente un costrutto nativo.

Aggiungiamo che le iterazioni sono un elemento piuttosto importante ed utilizzato nei linguaggi di programmazione e capiamo rapidamente come Java, per quanto sia un linguaggio valido, non è stato studiato minimamente per essere piacevole a scriversi.

Al contrario, questo risulta essere uno dei primi obiettivi di Python, linguaggio che segue una filosofia piuttosto distintiva, che al punto 7 cita: “Readability counts.“.

La domanda sulla quale vorrei fare riflettere ora è: quanto credete sia manutenibile un codice come quello che si è costretti a scrivere con Java, rispetto ad un equivalente teorico di Python? (Nota: dico teorico perché i due linguaggi non coprono esattamente gli stessi ambiti di sviluppo, per quanto alcuni si sovrappongano).

E questa non è questione di “cosa consente di fare il linguaggio” o di “Java però è stato fatto per consentire una maggiore scalabilità”, è pura questione di usabilità del codice, o per usare un neologismo inglese, quella che chiamo code usability.

Mi sto dilungando troppo, interrompo qui questa prima dissertazione che mi pare di aver comunque messo sufficiente carne al fuoco.

12 comments

1

Simbul 2006 07 23 at 10:22

Io credo che tutto sommato ci si vada sempre a scontrare con un trade-off: in tutti i linguaggi che ho visto (ed includo anche "linguaggi" grafici per la specifica ed il design) una maggiore semplicità nelle operazioni semplici si scontra con una maggiore complessità quando si tratta di implementare qualcosa di mimimamente meno aderente allo standard.
A quel punto si iniziano ad aggiungere estensioni, eccezioni, note a margine, che rendono di nuovo il linguaggio un casino indicibile :D
2

Folletto Malefico 2006 07 23 at 15:17

Il punto è proprio questo: in realtà il trade off non esiste dal punto di vista dell'usabilità. Non confondere le cose, attento: una cosa è un linguaggio di alto livello, una cosa è un linguaggio usabile. Son due dimensioni che seppure fino ad un certo livello si sovrappongono, risultano però essere distinte e diverse.

L'esempio è banalmente Java: abbiamo gli iteratori che sono la cosa più "ovvia" di un linguaggio di programmazione e still devi scrivere 5 righe di codice ogni volta che devi usarne uno. Capisci anche tu che non è un problema di potenza espressiva del linguaggio (Java è di alto livello) quanto un problema dettato dal fatto che nessuno ha pensato a fattori come semplicità di scrittura e leggibilità del codice.

Non puoi venirmi a dire che un loop Python è meno espressivo di un loop Java, ed è evidente: svolgono esattamente la stessa funzionalità.

L'esempio l'ho scelto di proposito come un caso significativo di questa dicotomia fra linguaggio di alto livello, linguaggio semplice e linguaggio usabile.
3

Bru 2006 07 24 at 15:18

1. se nella routine ruby metti a.each al posto di t.each funziona meglio ;)

2. ora, non per fare il geek at all costs, ma Vim al foldable code ci e' arrivato molto prima. Ed e' abbastanza mainstream, o almeno lo era... e' un po' che non sono in contatto col mondo unix. Ci sono altri aspetti di Vim che me lo fanno considerare molto usabili, non a 360 gradi certo (e non alzare il sopracciglio) ma ci tornero' su.
Ora devo scappare ;)
4

Folletto Malefico 2006 07 24 at 17:50

(1) Corretto. Whops. :P

(2) Vim lo fa? Si, sarebbe allora sua la prima apparizione mainstream di sicuro. Sai come si fa/da quando è stato introdotto?

...hai sgamato il sopracciglio :P
5

Bru 2006 07 24 at 23:35

il comando è fold (abbreviabile con fo), a cui si applicano poi tutte le variazioni tipiche di vim.

Ad esempio se vuoi foldare da linea 7 a 20
:7,20 fo
6

Carlo 2006 07 25 at 10:06

per quanto riguarda gli editor.. come si fa a copiaincollare una riga con Visual Studio (o qualunque editor grafico):
1) alza le mani dalla tastiera e prendi il mouse
2) punta all'inizio (fine) della riga e trascina, tenendo cliccato fino all'altra estremità
3) click destro, "copia" (o Crtl + C, se uno fa il figo)
4) click destro, "incolla" ( o Ctrl + V)

sarò io che sono pazzo, ma secondo me gli ambienti di scrittura modali offrono qualche comodità in più, agli utenti "hard-core"

copiaincolla con vim
1) sposto il cursore sulla riga
2) "yy"
3) "p"

senza aggiungere che posso ripetere i comandi n volte, semplicemente facendo precedere il numero di ripetizioni al comando stesso.

tutto questo evitando di muovere le mani dal piano di scrittura e quindi con una interruzione minima del flusso di lavoro.


Poi boh, ma io quando apro VS mi perdo nella miriade di cose che permette di fare. Io credo di dover Scrivere / Compilare, cosa sono tutte le altre cose? (nn lo ho sottomano per fare esempi seri) Perchè devo per forza fare un Progetto? Dove imposto le opzioni del compilatore?
7

Folletto Malefico 2006 07 25 at 10:20

Carlo, guarda che Vim mica è l'unico a poter fare copia-incolla senza spostare le mani dalla tastiera eh :D

Esempio banale:
1) sposto il cursore sulla riga
2) shift+mela+dx | shift+fine
3) mela+c | ctrl+c
4) mela+v | ctrl+v

Calcolando che tutto questo lo faccio senza dovermi "ricordare" la modalità e senza cambiare modalità, la differenza in velocità non è così rilevante (seppur esistente) mentre la differenza in termini di usabilità è notevole.


Per quanto riguarda il resto, è piuttosto evidente che non hai mai dovuto gestire un progetto sufficientemente grosso con VS. Già solo quando scrivevo programmi in VB4-5-6 se non avessi avuto una IDE come VS, con stack trace puntuale, step-by-step in tempo reale, interfaccia wysiwyg per realizzare i form etc, capisci che *non* sarei stato così veloce a linea di comando e con un editor normale. VS ad oggi è a mio avviso uno dei migliori se non il miglior IDE in circolazione. :)
Per quanto riguarda il progetto... non è così differente dalla necessità di avere un makefile... ;)


Però son tutti discorsi che seppur inerenti esulano dall'intento dell'articolo: ok copia incolla da tastiera, ma questo lo si faceva già nel 1980. Siamo nel 2006...
8

Francesco 2006 08 01 at 13:29

...scusami, devo aver letto velocemente ...a che serve ciclare sulle chiavi?
Inoltre altri linguaggi non-java, proprio per tipizzazione poco spinta, possono usare costrutti array-like su mappe:
myarray['key'] = "ciccio"
In java non è così. I casi in cui ti serve una map, usi una map, altrimenti usi un array (o implementazioni di Collection).

Infine in java puoi usare i Set: Set keys = myMap.keySet()
e ciclare direttamente sulle chiavi evitando così un passaggio!

Sugli IDE possiamo essere d'accordo oppure meno. In Eclipse e altri esistono i fold di parte del codice + template pronti o da scrivere da soli al bisogno.
Jedit poi ha anche macro sulla stessa linea dei template, anche questi piuttosto facili da scrivere e personalizzare con poco sforzo.

Infine una nota: quando l'IDE scrive "troppo" ci lamentiamo di non avere il controllo del codice o che la re-ingegnerizzazione poi diventa costosa, se scrive "poco" ci lamentiamo lo stesso??

my 2 cents!
Francesco
9

Folletto Malefico 2006 08 01 at 15:11

Si, probabilmentee hai letto in fretta. :)

Ciclare su un array con chiavi era un esempio (che è appunto diverso dal voler ciclare solo sulle chiavi) per mostrare con qualcosa di pratico cosa intendevo per "usabilità del codice".
Mostra in modo piuttosto evidente come una banale operazione di loop su un elemento strutturale base del linguaggio sia qualcosa di estremamente complesso - dal punto di vista dell'usabilità - rispetto ad altri linguaggi.

Sugli IDE, il punto non era elencare quale sia il migliore o quale abbia certe feature. Il punto era dire che non ci sono stati miglioramenti sensibili. Il fatto che Eclipse abbia fold e template, mi pare solamente una comprova di quanto non si sia fatto sotto questo punto di vista.

La nota è invece fuori luogo: non mi pare di aver citato da nessuna parte un IDE che scrive "troppo", la questione era ben differente ed era orientata all'usabilità, non a quanto codice scrive da solo. Il fatto che tu me l'abbia annoverato come un difetto mi fa però di contro notare come il problema non sia sentito neppure da chi sviluppa, che crede che "le cose sono così e stop" e il massimo a cui riesce a fare riferimento è "quanto codice scrive l'IDE", che mi pare un assurdo sul concetto usabilità.
10

naarani 2006 11 03 at 11:16

Php o C# non hanno un Jsr-170, non hanno community con una natura come quella di un gruppo che sviluppa jsr-170.

Non siamo piu' ai tempi del Drdos o di dos 2.0, le cose sono molto piu' complesse ora: limitarsi ad un analisi di un linguaggio avulsa dal resto che gira attorno al linguaggio e' un errore.

Per aprire un file in java il sorgente e' ancora piu' lungo:
fatti una libreria, saluta tutte queste righe. La marea di meta-linguaggi che sono in sviluppo mica li fanno su PHP (con tutto il rispetto del caso). Un bel giorno da OO si passera' ad uno step successivo, e lo si sta sperimentando con java.

Un'orm come hibernate se lo inventano in Java, poi nella rincorsa c'e' gente che ne fa un nhibernate, etc

Infine vorrei programmare il mio cellulare, il sito web, il web service, l'applicazione desktop e qualle enterprise con un linguaggio che sia supportato da piu' fornitori, standardizzato, maturo, che viva a lungo, e magari per piu' piattaforme:
se mi dici c# neanche rido, c'e' m$ che piange, mi basta questo.

Il fatto che poi in java ci siano svariate pecche non e' affatto escluso da quanto dico qui sopra, ma c'e' differenza tra e .

ciao :-)
11

Folletto Malefico 2006 11 03 at 13:32

Infatti la riflessione è *avulsa* da qualunque considerazione di ordine tecnico, di community, di scalabilità, di metalinguaggio o di qualsivoglia aspetto tecnico/tecnologico.

Non è un errore: le stesse cose in linea del tutto teorica potresti dirmele parlando di Assembly. Sono tutte considerazioni *fuori* sintassi di linguaggio. Il problema qui citato è *proprio* la sintassi del linguaggio e nient'altro. Se ancora, invece di Java SUN avesse sviluppato qualcosa con una sintassi Ruby-like, non cambierebbe una virgola del tuo discorso, ma cambierebbe tutto nel mio.

E' come se io ti dicessi che il sistema di guida delle automobili rispetto ai jet ha dei problemi e tu mi rispondessi che comunque le automobili sono più standardizzate, diffuse, economiche, funzionali e comode.

Capisci che sono due considerazioni completamente diverse e non ha senso di dire che una è un "errore". ;)
12

Intense Minimalism » Il puzzle di Apollo: dettagli, demo, storia 2006 11 05 at 05:44

[...] XHTML, CSS, JavaScript sono tutti linguaggi “facili” da apprendere perché hanno i gradini iniziali che consentono di vedere i progressi anche quando si conosce poco (questo argomento meriterebbe un discorso a sé stante legato alla code usability). [...]