<?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>Gabriele Lana &#187; design</title>
	<atom:link href="http://www.gabrielelana.it/archives/category/design/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gabrielelana.it</link>
	<description>on Agile Methodologies and Programming</description>
	<lastBuildDate>Fri, 07 May 2010 14:12:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Se devi duplicare il codice almeno non duplicare i test</title>
		<link>http://www.gabrielelana.it/archives/76</link>
		<comments>http://www.gabrielelana.it/archives/76#comments</comments>
		<pubDate>Sat, 04 Oct 2008 09:55:59 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/76</guid>
		<description><![CDATA[Ci sono volte in cui è veramente difficile evitare di duplicare un pezzo di codice, tipicamente quando devi rappresentare lo stesso concetto in contesti differenti all&#8217;interno della stessa architettura. Il software è per sua natura estremamente flessibile ed è quindi sempre possibile inventarsi qualcosa, infatti nel passato mi sono sempre sforzato tantissimo per trovare soluzioni [...]]]></description>
			<content:encoded><![CDATA[<p>Ci sono volte in cui è veramente difficile evitare di duplicare un pezzo di codice, tipicamente quando devi rappresentare lo stesso concetto in contesti differenti all&#8217;interno della stessa architettura. Il software è per sua natura estremamente flessibile ed è quindi sempre possibile inventarsi qualcosa, infatti nel passato mi sono sempre sforzato tantissimo per trovare soluzioni <em>&#8220;creative&#8221;</em> per evitare questo tipo di duplicazione, in retrospettiva posso dire che tutte queste soluzioni sono risultate un po&#8217; <em>&#8220;tirate&#8221;</em>, artefatte, soluzioni che non mi davano quel senso di affidabilità che voglio dal mio codice e che mi fa dormire bene la notte.</p>
<p>Ultimamente ho dovuto affontare uno di questi problemi: in <a href="http://www.yourank.com">YouRank</a> abbiamo una definizione di <strong>domain</strong> che consente data un&#8217;url di ricavare quello che noi consideriamo essere il dominio di quell&#8217;url. Quello che facciamo è eliminare il protocollo, generalmente <strong>&#8220;http://&#8221;</strong> e la parte iniziale dell&#8217;url se e solo se questa corrisponde a <strong>&#8220;[wW]{3}[^.]+\.&#8221;</strong>. Quindi l&#8217;url <strong>&#8220;http://www.gabrielelana.it&#8221;</strong> avrebbe come identificativo di dominio <strong>&#8220;gabrielelana.it&#8221;</strong></p>
<p>Questo tipo di operazione (estrazione dell&#8217;identificativo univoco del dominio di un&#8217;url) deve essere eseguita in contesti differenti: sia durante l&#8217;elaborazione dei dati di navigazione grezzi (quindi in javascript), sia durante l&#8217;esecuzione di query sul database (banalmente per raggruppare i risultati per dominio). Inizialmente, proprio per evitare di duplicare il codice, ho optato per un&#8217;implementazione in javascript <strong>&#8220;yr.uri.Http#domainWithoutPrefix&#8221;</strong> (metodo domainWithoutPrefix della classe yr.uri.Http), che richiamavo all&#8217;interno delle query di sqlite <strong>&#8220;JS_CALL(&#8220;DOMAIN_WITHOUT_PREFIX&#8221;, urlOfDomain)&#8221;</strong> <a href="#1">[1]</a>, per ogni record del result set dovevo creare un oggetto <strong>&#8220;yr.uri.Http&#8221;</strong> solo per poter utilizzare il metodo <strong>&#8220;domainWithoutPrefix</strong>, questo unito al costo del marshalling fra sqlite e javascript, si è rivelato essere superiore al budget :-)</p>
<p>I miei sensi di ragno mi facevano venire la nausea tutte le volte che pensavo all&#8217;ovvia soluzione del problema: implementare in C la funzione <strong>&#8220;DOMAIN_WITHOUT_PREFIX&#8221;</strong> da richiamare direttamente in sqlite. Ho passato giorni a tentare di immaginarmi soluzioni alternative al problema senza trovare niente. Alla fine ho mollato, ho iniziato a scrivere il primo test automatico e subito ho capito</p>
<p>Stavo sostanzialmente riscrivendo i test che a suo tempo scrissi per <strong>&#8220;yr.uri.Http#domainWithoutPrefix&#8221;</strong>, questo si che sarebbe stato veramente sbagliato! Potevo ancora <strong>conservare in un&#8217;unico punto autorevole</strong> la definizione del concetto di identificato di dominio: nei <strong>test</strong>. In pseudo codice</p>
<pre class="code">
assertDomainWithoutPrefixIs("gabrielelana.it", "http://www.gabrielelana.it")
assertDomainWithoutPrefixIs("blog.yourank.com", "http://blog.yourank.com")
assertDomainWithoutPrefixIs("example.com", "http://www1.example.com")
assertDomainWithoutPrefixIs("example.com", "http://www123.example.com")
assertDomainWithoutPrefixIs("w12.example.com", "http://w12.example.com")
...
</pre>
<p>dove</p>
<pre class="code">
assertDomainWithoutPrefixIs = function(expected, given) {
    assertEquals(expected, storage.call("DOMAIN_WITHOUT_PREFIX", given));
    assertEquals(expected, yr.uri.Http(given).domainWithoutPrefix);
}
</pre>
<p>Quindi, la lezione che ho imparato è: <em>&#8220;Se non è possibile mantenere la definizione di un concetto in un unico punto all&#8217;interno del codice, testa tutte le implementazioni esistenti con un unico test automatico, in modo da far diventare il test quell&#8217;unico punto&#8221;</em></p>
<p><strong><a href="http://www.infoq.com/presentations/archaeopteryx-bowkett">Link of the week</a></strong><br />
<strong><a href="http://www.codeodor.com/index.cfm/2008/10/1/Ideas-for-Repetition-Detection-Automation-and-The-Importance-of-DRY/2546">Quote of the week</a></strong> </p>
<blockquote><p>
No problem. &#8220;Easy&#8221; in the developer sense, of course, which translates in real life to &#8220;theoretically possible and I have a vague plan&#8221;
</p></blockquote>
<p><a name="1">[1]</a> Abbiamo implementato un meccanismo attraverso il quale è possibile invocare delle funzioni javascript (previo setup) da delle query sqlite, niente di esoterico (anche il wrapper a sqlite di mozilla implementa lo stesso meccanismo) solo una precisazione nel caso qualcuno se lo fosse chiesto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/76/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Agile Design = Design++</title>
		<link>http://www.gabrielelana.it/archives/62</link>
		<comments>http://www.gabrielelana.it/archives/62#comments</comments>
		<pubDate>Fri, 13 Jul 2007 22:37:00 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/62</guid>
		<description><![CDATA[Negli ultimi giorni, parlando alcune persone, ho notato qualcosa che non mi piace affatto e ho pensato di scrivere questo post per chiarire come la penso. Apparentemente esiste la credenza che l&#8217;apprendimento della pratica del refactoring, o più in generale del TDD (che di fatto implica il refactoring), sostituisca lo studio del Design del software [...]]]></description>
			<content:encoded><![CDATA[<p>Negli ultimi giorni, parlando alcune persone, ho notato qualcosa che non mi piace affatto e ho pensato di scrivere questo post per chiarire come la penso. Apparentemente esiste la credenza che l&#8217;apprendimento della pratica del refactoring, o più in generale del <span title="Test Driven Development">TDD</span> (che di fatto implica il refactoring), sostituisca lo studio del Design del software in quanto (come da definizione) <em>&#8220;applicare il TDD significa fare continuamente Design&#8221;</em>. Discorsi come questi mi mettono un po&#8217; di paura.</p>
<p><span id="more-62"></span><em>&#8220;Cos&#8217;è, e come viene usato il refatoring?&#8221;</em> Dato il codice di un&#8217;applicazione e conoscendo la prossima funzionalità che dovrà essere implementata, posso domandarmi <em>&#8220;Il Design della mia applicazione è adatto ad accogliere l&#8217;implementazione della prossima funzionalità? Con la conoscenza che ho oggi della mia applicazione e del dominio del problema, posso migliorarne il Design?&#8221;</em> Rispondendo a queste domande identifico il Design che vorrei che la mia applicazione avesse e grazie al <strong>refactoring</strong>, sarò in grado di pianificare in piccoli passi il passaggio dal Design attuale a quello ideale, dopodichè sarò pronto ad implementare la funzionalità richiesta. Applicando il TDD questo ciclo (requirement/design/refactoring/test/coding/) diventa molto più frequente (da pochi minuti a pochi secondi), ma il discorso non cambia.</p>
<p>Non so se avete notato, ma per applicare questa pratica è <strong>necessario</strong>:</p>
<ul>
<li>Saper identificare il Design attuale leggendo il codice</li>
<li>Saper individuare, non solo i <a href="http://c2.com/xp/CodeSmell.html">bad smell</a> banali quali il &#8220;Long Method&#8221; o &#8220;Large Class&#8221;, ma anche quelli per cui occorre una visione più ad alto livello dell&#8217;applicazione, come: &#8220;Speculative Generality&#8221;, &#8220;Divergent Change&#8221;, &#8220;Shotgun Surgery&#8221;, ecc&#8230;</li>
<li>Saper indicare quale Design migliorerebbe quello attuale</li>
</ul>
<p>Ovvero è <strong>necessario</strong>:</p>
<ul>
<li>Conoscere il Design del software: pattern, principi, idiomi ecc&#8230; (alcuni strettamente dipendenti dal linguaggio utilizzato)</li>
<li>Imparare a leggere il codice sorgente di un&#8217;applicazione. Qualcuno potrebbe darlo per scontato, ma non lo è. Pensate agli scrittori di libri e a quanto mediamente leggono: leggono per imparare, leggono per farsi ispirare, leggono per poter trovare la propria identità letteraria come fusione fra gli stili appresi e la propria personalità. Voi quanto buon codice leggete?</li>
<li>Conoscere e saper identificare i bad smell</li>
<li>Conoscere e saper applicare i passi di refactoring per poterli eliminare</li>
</ul>
<p>Tutto questo per dire che l&#8217;applicazione della sola pratica del refactoring non giustifica in alcun modo un&#8217;ignoranza nel campo del Design del software. Il refactoring è solo una tecnica che ci permette di raggiungere un determinato Design in maniera incrementale, requisito dopo requisito, in modo da avere in ogni momento il miglior Design possibile per le funzionalità attualmente implementate. In pratica il design di oggi è frutto di un <span title="Big Design Up Front">BDUF</span> dilazionato durante tutto il progetto, ma la parte di design Design c&#8217;è, e <strong>deve</strong> essere studiata!</p>
<p>Vedo già qualcuno che salta in piedi dicendo <em>&#8220;Allora è vero, solo i programmatori preparati possono applicare le metodologie Agili!&#8221;</em> A questa frase replico con un estratto da <a href="http://video.google.com/videoplay?docid=-7230144396191025011">questo</a> intervento di Ken Schwaber</p>
<blockquote><p>
SCRUM works with idiots. You can take a group of idiots tha maybe even didn&#8217;t go to school, don&#8217;t understand computer science, don&#8217;t understand software, engineering techniques, hate each other, don&#8217;t understand business domain, have lousy engineering tools and uniformly they will produce crap every increment
</p></blockquote>
<p>UPDATE: Neanche a farlo apposta, oggi (18/07/2007) su <a href="http://www.infoq.com">InfoQ</a> Amr Elssamadisy ha <a href="http://www.infoq.com/news/2007/07/AgileBadForDesign">espresso</a> le stesse perplessità, <a href="http://www.jamesshore.com/">James Shore</a> ha subito <a href="http://www.jamesshore.com/Blog/The-Agile-Engineering-Shortfall.html">replicato</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/62/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
