<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Old Intense Minimalism &#187; codeusability</title>
	<atom:link href="http://im.digitalhymn.com/tag/codeusability/feed/" rel="self" type="application/rss+xml" />
	<link>http://im.digitalhymn.com</link>
	<description>Looking for a new self</description>
	<lastBuildDate>Mon, 11 Apr 2011 11:53:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Se stai scrivendo la stessa cosa due volte, c&#8217;è qualcosa di sbagliato</title>
		<link>http://im.digitalhymn.com/2007/12/02/se-stai-scrivendo-la-stessa-cosa-due-volte-ce-qualcosa-di-sbagliato/</link>
		<comments>http://im.digitalhymn.com/2007/12/02/se-stai-scrivendo-la-stessa-cosa-due-volte-ce-qualcosa-di-sbagliato/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 15:40:47 +0000</pubDate>
		<dc:creator>Folletto Malefico</dc:creator>
				<category><![CDATA[Technocracy]]></category>
		<category><![CDATA[codeusability]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[semplicità]]></category>
		<category><![CDATA[sviluppo]]></category>

		<guid isPermaLink="false">http://im.digitalhymn.com/2007/12/02/se-stai-scrivendo-la-stessa-cosa-due-volte-ce-qualcosa-di-sbagliato/</guid>
		<description><![CDATA[Ormai è persa nei meandri della memoria, non so dove l&#8217;abbia letta o come l&#8217;abbia formulata, non so la sua origine. Uno dei concetti che più ha influenzato il mio stile di programmazione attuale è riassunto nella frase: Se stai scrivendo la stessa cosa due volte, c&#8217;è qualcosa di sbagliato Il concetto è una estremizzazione [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://im.digitalhymn.com/wp-content/uploads/2007/12/array-prototype.jpg" alt="Array.prototype.chain (AS)" /></p>
<p>Ormai è persa nei meandri della memoria, non so dove l&#8217;abbia letta o come l&#8217;abbia formulata, non so la sua origine. Uno dei concetti che più ha influenzato il mio stile di programmazione attuale è riassunto nella frase:</p>
<blockquote><p><strong>Se stai scrivendo la stessa cosa due volte, c&#8217;è qualcosa di sbagliato</strong></p></blockquote>
<p>Il concetto è una estremizzazione utopica, ovviamente è impossibile applicarla nella sua totalità. La trovo però di particolare rilevanza per la sua portata estensiva su più livelli e per la sua leggera carica provocatrice.</p>
<p>Il concetto da cui nasce è che la programmazione, per sua stessa natura, è un algoritmo in grado di <strong>eseguire automaticamente processi ripetitivi e meccanici</strong>.<br />
Sarebbe stupido se un programmatore lavorasse per automatizzare processi, e non riuscisse ad automatizzare il codice stesso che sta scrivendo. Non sarebbe un controsenso?</p>
<p>La portata di questa frase è notevole perché impone di <strong>riflettere sull&#8217;impatto globale che ogni singola riga di codice porta con sé</strong>: nell&#8217;istante in cui ci si accorge che si è appena scritto qualcosa che esiste con quello stesso significato altrove, immediatamente dovrebbe scattare una riflessione. Ci si dovrebbe chiedere a questo punto:</p>
<ol>
<li>Posso accorpare le due righe di codice in una <strong>funzione richiamata</strong> nei due punti?</li>
<li>C&#8217;è una logica ad un <strong>livello superiore di astrazione</strong> che mi è sfuggita?</li>
<li>Ha <strong>senso</strong> farlo?</li>
</ol>
<p>Le tre domande non sono banali, soprattutto se vi abituate a farvele in ogni istante. Derivano tutte dalla frase sopra riportata, esplicandone il significato simbolico.</p>
<p>La realizzazione di una funzione è già di per sé una forma di astrazione: il codice &#8216;<em>grezzo</em>&#8216; viene &#8216;<em>promosso</em>&#8216; e si astrae nella funzione corrispondente. Questo processo è più interessante di quello che può sembrare perché implica anche ottimizzazione: quali sono i parametri che tale funzione richiede per funzionare? Posso minimizzarli?<br />
E&#8217; interessante anche perché è <strong>indipendente dal paradigma di programmazione</strong> che si utilizza, che sia funzionale o a oggetti. Lo scopo è salire un gradino nella scala dell&#8217;astrazione, semplificando da quel momento in poi la scrittura di quel particolare codice.</p>
<p>La riflessione su una logica superiore di astrazione è egualmente importante, perché nel momento in cui ci si accorge che si sta replicando funzionalità (anche se il codice non è identico 1:1) è possibile che sia <strong>solo la punta di un concetto molto più ampio</strong> che potrebbe essere astratto e non solo di quella specifica funzionalità</p>
<p>Domandarsi infine se ha senso è rilevante perché rappresenta la possibilità di valutare <strong>possibili aspetti negativi dell&#8217;astrazione</strong>. A volte non ha davvero senso astrarre quel pezzo di codice. Altre volte i vantaggi apportati sarebbero minori degli svantaggi. Oppure si rischierebbe di rovinare una struttura semplice, elegante e leggibile. Soprattutto in quest&#8217;ultimo caso, ritengo che &#8220;una ripetizione&#8221; non sia sufficiente a giustificare il cambiamento.</p>
<p>Se notate quella banale frase che mi si fissò nella mente quasi 10 anni fa è analoga ai principi <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself" title="Wikipedia: Don't Repeat Yourself">DRY (Don&#8217;t Repeat Yourself)</a> e anche ad alcune parti della <a href="http://www.extremeprogramming.org/" title="Extreme Programming">Extreme Programming</a>.</p>
<p><em>Astraiamo? </em>Già il fatto che questo concetto sia indipendente dallo stile di programmazione utilizzato è significativo, non è obbligatorio programmare a oggetti per farlo.<br />
<em>Astraiamo? </em>Il concetto non è strettamente inerente alla programmazione! Potrei in questo senso citare <a href="http://lawsofsimplicity.com/category/laws?order=ASC" title="Maeda: 10 laws of Simplicity">Maeda e il concetto di Simplicity</a> che porta con sé.<br />
<em>Astraiamo? </em>Potremmo risalire e scoprire che per esempio la ripetizione meccanica è qualcosa di innaturale (i.e. <a href="http://video.google.com/videosearch?q=tempi+moderni+chaplin" title="Charlie Chaplin, Tempi Moderni (video search)">Tempi Moderni</a>). Il nostro organismo è una infinità di strati biologici con livelli di astrazione crescente.</p>
]]></content:encoded>
			<wfw:commentRss>http://im.digitalhymn.com/2007/12/02/se-stai-scrivendo-la-stessa-cosa-due-volte-ce-qualcosa-di-sbagliato/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Usabilità del Codice, o &#8220;Quante righe di codice per una iterazione&#8221;</title>
		<link>http://im.digitalhymn.com/2006/07/23/usabilita-del-codice-o-quante-righe-di-codice-per-una-iterazione/</link>
		<comments>http://im.digitalhymn.com/2006/07/23/usabilita-del-codice-o-quante-righe-di-codice-per-una-iterazione/#comments</comments>
		<pubDate>Sun, 23 Jul 2006 00:19:42 +0000</pubDate>
		<dc:creator>Folletto Malefico</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[codeusability]]></category>
		<category><![CDATA[programmazione]]></category>

		<guid isPermaLink="false">http://im.digitalhymn.com/2006/07/23/usabilita-del-codice-o-quante-righe-di-codice-per-una-iterazione/</guid>
		<description><![CDATA[Usabilità, user interaction, user experience. Tutte parole che in quest&#8217;ultimo periodo si sentono sempre più spesso all&#8217;interno dei gruppi di lavoro almeno per quanto riguarda l&#8217;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 [...]]]></description>
			<content:encoded><![CDATA[<p>Usabilità, user interaction, user experience. Tutte parole che in quest&#8217;ultimo periodo si sentono sempre più spesso all&#8217;interno dei gruppi di lavoro almeno per quanto riguarda l&#8217;informatica. Fortunatamente. Nomi ormai famosi costituiscono gli evangelizzatori di quella che si può chiamare una rivoluzione: <a href="http://www.useit.com/" title="Use It">Jakob Nielsen</a>, <a href="http://www.jnd.org/" title="JND.org">Donald Norman</a>, <a href="http://jef.raskincenter.org/" title="Jef Raskin">Jef Raskin</a> (giusto per citarne alcuni, se pensate me ne sia scordato qualcuno segnalatemelo pure).</p>
<p>Rivoluzione che in altri termini può essere pensata come un ritorno alle origini, ma standardizzato in formalismi: in fondo un eccellente <strong>artigiano</strong> sapeva già queste cose, <em>senza saperle</em>. Oggi si tenta di insegnarle, anche in vece della quantità di persone che bisogna addestrare in merito.</p>
<p>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 &#8220;Sei sicuro? Annulla, Riprova, Tralascia&#8221;.</p>
<p>Ma nell&#8217;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&#8230; ma d&#8217;altronde questi sono necessariamente realizzati da due altri strumenti: un <strong>editor</strong> e un <strong>linguaggio</strong> di programmazione.</p>
<p>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 <strong>testuali</strong>, scrivendo a mano del testo chiamato codice sorgente.</p>
<h3>Gli Editor</h3>
<p>Vorrei quindi pormi ad osservare l&#8217;usabilità di questa coppia di elementi. Partiamo osservando gli IDE (<a href="http://en.wikipedia.org/wiki/Integrated_development_environment" title="Wikipedia: IDE">Integrated Development Environment</a>) 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&#8217;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, &#8230;).</p>
<p>La mia analisi però vorrebbe concentrarsi solamente sull&#8217;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:</p>
<ol>
<li>Le <strong>inline code suggestions</strong>, ovvero delle finestrelle che si aprono mentre si scrive il codice contenenti le varie possibilità disponibili a riguardo di quello che si sta scrivendo (<em>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</em>). Prima apparizione mainstream credo in Visual Basic 4, nel <strong>1995</strong>.</li>
<li>I <strong>foldable blocks</strong>, ovvero la possibilità di &#8220;chiudere&#8221; un blocco di codice in modo che appaia solamente la sua prima riga (<em>es. chiudere una funzione mostra la dichiarazione della funzione e dei puntini che indicano che vi è altro</em>). Prima apparizione mainstream credo in Visual Studio .Net, nel <strong>2002</strong>.</li>
</ol>
<p>Ad oggi credo che l&#8217;editor per programmatori più usabile in assoluto sia <a href="http://macromates.com/" title="Macromates: TextMate">TextMate</a>. 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.</p>
<p>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&#8217;usabilità degli editor testuali: ad oggi un IDE è fatto &#8220;da ingegneri per ingegneri&#8221;, ovvero l&#8217;importante è avere una feature, non come questa viene resa disponibile.</p>
<h3>Il Linguaggio</h3>
<p>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, &#8230;sicuramente ne ho scordati alcuni.</p>
<p>Perché esistono tanti linguaggi? Perché i creatori di ciascuno pensavano, in un modo o nell&#8217;altro, di realizzare un linguaggio <strong>&#8220;migliore&#8221;</strong> oppure <strong>&#8220;più adatto ad uno scopo specifico&#8221;</strong>. Queste sono a mio avviso le due cause primarie, ma cosa rende un linguaggio &#8220;migliore&#8221;? cosa lo rende &#8220;più adatto&#8221;?</p>
<p>La motivazione alla base dell&#8217;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 &#8220;rendere più semplice&#8221;? cosa definisce un &#8220;buon programma&#8221;?</p>
<p>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:</p>
<ul>
<li><strong>Rendere più semplice la scrittura di un programma</strong> significa diminuire il tempo necessario per la stesura di un ipotetico programma a parità di funzionalità.</li>
<li><strong>Un buon programma</strong> è invece un programma veloce, stabile e che soddisfa le necessità dell&#8217;utente, rimanendo però facilmente manutenibile dall&#8217;autore.</li>
</ul>
<p>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.</p>
<p>Ovvero, realizzare un <a href="http://en.wikipedia.org/wiki/Associative_array" title="Wikipedia: Associative Array">array associativo</a> (hash). Per chi non lo sapesse, significa creare un elenco di elementi, ognuno dei quali è identificato da una etichetta.</p>
<p>Vediamo quindi nei linguaggi qui citati come si esegue il terzetto dichiarazione + inserimento + iterazione:</p>
<p><strong>PHP</strong></p>
<pre>$array = array();
$array['saluto'] = "Ciao!";
foreach ($array as $key =&gt; $value) {
...$key...$value...
}</pre>
<p><strong>JavaScript</strong></p>
<pre>var a = new Array();
a['saluto'] = "Ciao!";
for (var key in a) {
...key...a[key]...
}</pre>
<p><strong>Python</strong></p>
<pre>a = {}
a['saluto'] = "Ciao!"
for key, value in a.iteritems():
...key...value...</pre>
<p><strong>Ruby</strong></p>
<pre>a = {}
a['saluto'] = "Ciao!"
a.each { |key, value|
...key...value...
}</pre>
<p><strong>Java</strong></p>
<pre>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...
}</pre>
<p>Notate differenze?</p>
<p>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.</p>
<p>L&#8217;obiezione è naturalmente valida per quanto riguarda la lunghezza delle linee di codice, <strong>non per la quantità di istruzioni</strong>, ed è egualmente notabile come il comando &#8220;for&#8221; per la sintassi Java impacchetti due istruzioni in una sola riga e non sia egualmente un costrutto nativo.</p>
<p>Aggiungiamo che le iterazioni sono un elemento piuttosto importante ed utilizzato nei linguaggi di programmazione e capiamo rapidamente come <strong>Java</strong>, per quanto sia un linguaggio valido, <strong>non è stato studiato minimamente per essere piacevole a scriversi</strong>.</p>
<p>Al contrario, questo risulta essere uno dei primi obiettivi di Python, linguaggio che segue una <a href="http://en.wikipedia.org/wiki/Python_philosophy" title="Wikipedia: Python philosophy">filosofia piuttosto distintiva</a>, che al punto 7 cita: &#8220;<strong>Readability counts.</strong>&#8220;.</p>
<p>La domanda sulla quale vorrei fare riflettere ora è: quanto credete sia <strong>manutenibile</strong> un codice come quello che si è costretti a scrivere con Java, rispetto ad un equivalente teorico di Python? (<em>Nota: dico teorico perché i due linguaggi non coprono esattamente gli stessi ambiti di sviluppo, per quanto alcuni si sovrappongano</em>).</p>
<p>E questa non è questione di &#8220;cosa consente di fare il linguaggio&#8221; o di &#8220;Java però è stato fatto per consentire una maggiore scalabilità&#8221;, è pura questione di usabilità del codice, o per usare un neologismo inglese, quella che chiamo <strong>code usability</strong>.</p>
<p>Mi sto dilungando troppo, interrompo qui questa prima dissertazione che mi pare di aver comunque messo sufficiente carne al fuoco.</p>
]]></content:encoded>
			<wfw:commentRss>http://im.digitalhymn.com/2006/07/23/usabilita-del-codice-o-quante-righe-di-codice-per-una-iterazione/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

