<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>JP&#039;s Web Place</title>
	<atom:link href="http://rejex.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://rejex.wordpress.com</link>
	<description>&#34;Simplicity is prerequisite for reliability.&#34; (E. W. Dijkstra)</description>
	<lastBuildDate>Wed, 01 Feb 2012 22:06:54 +0000</lastBuildDate>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='rejex.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>JP&#039;s Web Place</title>
		<link>http://rejex.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://rejex.wordpress.com/osd.xml" title="JP&#039;s Web Place" />
	<atom:link rel='hub' href='http://rejex.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Io, informatico&#8230;</title>
		<link>http://rejex.wordpress.com/2012/01/30/io-informatico/</link>
		<comments>http://rejex.wordpress.com/2012/01/30/io-informatico/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 06:25:25 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Ironia]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11967</guid>
		<description><![CDATA[Io sono un informatico e queste sono alcune riflessioni in ordine sparso sull&#8217;esserlo. Anzi, parafrasando The Mentor, potrei dire che questo è una sorta di manifesto. Ovviamente l&#8217;intento del post è ironico&#8230; Hollywood? No, davvero Non sono una una macchina nè permetterò mai che una di esse mi renda un suo schiavo: paragonarmi ad un [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11967&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Io sono un informatico e queste sono alcune riflessioni in ordine sparso sull&#8217;esserlo. Anzi, parafrasando <a href="http://it.wikipedia.org/wiki/Loyd_Blankenship"><em>The Mentor</em></a>, potrei dire che questo è una sorta di manifesto. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Ovviamente l&#8217;intento del post è ironico&#8230;</em></td>
</tr>
</table>
<p></p>
<p><span id="more-11967"></span></p>
<p><font size='+1' color='#005197'>Hollywood? No, davvero</font></p>
<p><a href="http://en.wikipedia.org/wiki/The_Matrix"><img width="100" border="0" src="http://upload.wikimedia.org/wikipedia/en/c/c1/The_Matrix_Poster.jpg" class="alignleft" alt="Matrix" /></a>Non sono una una macchina nè permetterò mai che una di esse mi renda un suo schiavo: paragonarmi ad un computer o preannunciarmi che prima o poi mi trasformerò in esso &#8220;<em>se continuo così</em>&#8221; è ridicolo. Idem lanciarsi in improponibili previsioni in merito, anche se Hollywood la pensa ben diversamente sul filone uomo-macchina (<em>cfr. <a href="http://it.wikipedia.org/wiki/Matrix">Matrix</a>, <a href="http://it.wikipedia.org/wiki/Terminator">Terminator</a></em>).</p>
<p>Io sono un informatico e, per la gizilionesima volta, l&#8217;informatica non coincide affatto e solamente con progettare ed usare computer:</p>
<blockquote><p><em>&#8220;What would we like our children &#8211; the general public of the future — to learn about computer science in schools? <strong>We need to do away with the myth that computer science is about computers</strong>. Computer science is no more about computers than astronomy is about telescopes, biology is about microscopes or chemistry is about beakers and test tubes. Science is not about tools, it is about how we use them and what we find out when we do.&#8221; (M. R. Fellows e I. Parberry, poi ripresa da Edsger W. Dijkstra)</em></p></blockquote>
<p><a href="http://en.wikipedia.org/wiki/Independence_day_film"><img width="100" border="0" src="http://upload.wikimedia.org/wikipedia/en/thumb/b/bb/Independence_day_movieposter.jpg/220px-Independence_day_movieposter.jpg" class="alignleft" alt="Matrix" /></a>Aggiustare i computer è un effetto collaterale del conoscere quello strumento, non lo scopo dell&#8217;esistenza professionale di un informatico e, probabilmente, neppure quella di un tecnico dell&#8217;assistenza IT. Il fatto che io sappia &#8220;usare un computer&#8221; non implica che debba (<em>ri</em>)conoscere istantaneamente qualunque sistema elettronico. Nè che lo sappia usare od aggiustare con la stessa disinvoltura di un protagonista di un film d&#8217;azione, che utilizza qualunque arma gli capiti a tiro, incluse quelle aliene (<em>cfr. <a href="http://it.wikipedia.org/wiki/Independence_Day_(film)">Independence Day</a></em>).</p>
<p>Non sono un &#8220;(piccolo) mago del computer&#8221; perchè di magia non ce n&#8217;è. Di nuovo, semplicemente conosco gli strumenti scientifici e tecnologici del mestiere e ne ho fatto una professione:</p>
<blockquote><p><em>&#8220;Any sufficiently advanced technology is indistinguishable from magic.&#8221; (<a href="http://en.wikipedia.org/wiki/Clarke%27s_three_laws">Tre leggi di Clarke</a>)</em></p></blockquote>
<p>Analogamente, nonostante le perssime abitudini umane ad antropomorfizzare ogni cosa (<em>cfr. pallone Wilson in <a href="http://it.wikipedia.org/wiki/Cast_Away">Cast Away</a></em>), i PC sono essenzialmente oggetti, entitità inorganiche, non viventi e non sperimentano sensazioni e sentimenti. Quindi non odiano gli incauti padroni, nonostante i guai che questi ultimi possono provocare. Al massimo siamo noi informatici a non raccapezzarci dei danni da sistemare in seguito a qualche &#8220;<em>Incontro ravvicinato</em>&#8221; utente-macchina e a sperimentare biechi sentimenti di vendetta nei riguardi dei bipedi-carnefici.</p>
<p><font size='+1' color='#005197'>Questione di etichette&#8230;</font></p>
<p><img src="http://i275.photobucket.com/albums/jj308/rejectedx/geek_inside.jpg" alt="" width="100" class="alignleft" />Quanto ai modi per definirci, <em>geek</em> e <em>nerd</em>, ormai &#8220;mainstream&#8221; come termini, non sono sinonimi di informatico, anche se esiste una certa correlazione causale fra queste etichette. Se anche mi riconoscessi in esse, nell&#8217;accezione negativa intendo, non chiederei comunque la solidarietà o la commiserazione del prossimo: non sono un cucciolo di cane maltrattato dalla società nè un Quasimodo rinchiuso in una torre di una cattedrale virtuale.</p>
<p>Non sono più fissato di molte altre persone che parlano ossessivamente dei loro problemi, delle loro fortune, delle loro famiglie, dei loro hobby ed interessi. Anzi, non mi capacito proprio del perchè parlare senza sosta di argomenti come la famigerata combo donne-calcio-motori sia considerato &#8220;normale&#8221;, mentre interessarsi di computer sia considerato innaturale, anche se magari non ne si parla mai in pubblico.</p>
<p><a href="http://dilbert.com/strips/comic/1998-07-03/"><img width="400" class="alignleft" src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/10000/2000/800/12805/12805.strip.gif" alt="Dilbert" /></a>Come tutte le categorie professionali, anche gli informatici indugiano in battute pietose e comunque comprensibili solamente dai propri &#8220;pari&#8221;. Avete mai sentito battute in <em>slang</em> fra studenti di medicina? <a href="http://plus.google.com/photos/106871502359109782595/albums/5635223264512791153">Stessa cosa</a><a href="http://plus.google.com/photos/106871502359109782595/albums/5635223264512791153"><img width="150" class="alignright" src="http://lh5.googleusercontent.com/-yHIKEfR3_WE/TjRV5XIzQEI/AAAAAAAAAjo/xelfv4FhXf0/s291-c-k/31682_126102307420511_125150967515645_180071_4422795_n_104.jpg" alt="Dilbert" /></a>. Con problemi con i familiari analoghi ai &#8220;nostri&#8221;.</p>
<p>Di professione sono programmatore, perchè mi piace ed anche per camparci, ma non so fare e non faccio solo quello. Non basta fare o sentirsi programmatori per definirsi anche informatici, anche se certamente la cosa aiuta. Di certo non sono un &#8220;<em>softwarista</em>&#8220;: amo forgiare neologismi, ma non ne userei mai uno così orribile, riduttivo, impreciso, per descrivere chi io sia.</p>
<p>Chi mi fa notare che scrivere codice sia un gioco da ragazzi, un lavoro facile, evidentemente non conosce bene questo mondo. Vero, non tutti i progetti sono <em>così</em> difficili, ma generalmente scrivere codice è una fase operativa avanzata rispetto ad altre, come la progettazione, dove iniziano i mal di testa.</p>
<blockquote><p><em>&#8220;In fact, my main conclusion after spending ten years of my life working on the TEX project is that software is hard. It’s harder than anything else I’ve ever had to do. (Donal Knuth)&#8221;</em></p></blockquote>
<p>A chi mi fa notare che programmare, in fondo, non sia un &#8220;lavoro&#8221; o che sia perfino sovrapagato (in Italia!?!) rispetto ad altre mansioni, spesso più &#8220;manuali&#8221;, mi viene da sorridere. Detto ciò, considerato che lavorare nell&#8217;informatica non è come accedere in una casta chiusa, non vedo perchè chi ha preparazione e <em>know-how</em> non possa ambire in alto, anche econonomicamente. Come per tutte le altre professioni, del resto. <a href="http://gowingassociates.com/?p=149">Ennesima variante</a> di un classico aforisma d&#8217;esempio (<a href="http://www.paloaltoscuola.it/moduli/html/racconti_sapere_dove_colpire.php">altra variante</a>):</p>
<blockquote><p><em><strong>Do You Know Where To Hit The Hammer?</strong></p>
<p>A company has developed the latest and greatest monster widget maker. They’ve sent out invitations for the grand reveal to the world’s press and major business players. 15 minutes before the coming out party is to start, with the grandstands bursting at the seams, television cameras trained on the dignitaries and company executives, and the place at full-tilt frenzy, the widget maker shuts down. No amount of fiddling by the operators could get the machine fired up. In a panic the company president remembers that the chief engineer of the machine had retired the week before. The president gets the engineer on the phone and pleads for him to come in and get the machine working. The engineer says he’ll fix it but he’s charging $10,000. The president readily agrees.</p>
<p>5 minutes later the engineer shows up. He looks over the machine, taking special note of several areas on the machine. He then takes a hammer out of his bag and hits one of the spots with a might whack! The machine immediately springs to life, producing widgets like there’s no tomorrow. The engineer puts the hammer back in his bag, walks up to the president and says “That will be $10,000″. The president looks at him and screams “$10,000??? You spent two minutes here just to hit it with a hammer!!!!”. The engineer pointedly looks at the president and says “I threw in the hammer hit for free. The $10,000 was for knowing where to hit it.”.</em></p></blockquote>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/informatica/'>Informatica</a>, <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/ironia/'>Ironia</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11967/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11967/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11967/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11967/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11967/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11967/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11967/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11967/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11967/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11967/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11967/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11967/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11967/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11967/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11967&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2012/01/30/io-informatico/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://upload.wikimedia.org/wikipedia/en/c/c1/The_Matrix_Poster.jpg" medium="image">
			<media:title type="html">Matrix</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/en/thumb/b/bb/Independence_day_movieposter.jpg/220px-Independence_day_movieposter.jpg" medium="image">
			<media:title type="html">Matrix</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/geek_inside.jpg" medium="image" />

		<media:content url="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/10000/2000/800/12805/12805.strip.gif" medium="image">
			<media:title type="html">Dilbert</media:title>
		</media:content>

		<media:content url="http://lh5.googleusercontent.com/-yHIKEfR3_WE/TjRV5XIzQEI/AAAAAAAAAjo/xelfv4FhXf0/s291-c-k/31682_126102307420511_125150967515645_180071_4422795_n_104.jpg" medium="image">
			<media:title type="html">Dilbert</media:title>
		</media:content>
	</item>
		<item>
		<title>Sull&#8217;affrontare codice altrui ed ignoto&#8230;</title>
		<link>http://rejex.wordpress.com/2012/01/23/sullaffrontare-codice-altrui-ed-ignoto/</link>
		<comments>http://rejex.wordpress.com/2012/01/23/sullaffrontare-codice-altrui-ed-ignoto/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 06:25:26 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Considerazioni personali]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Codice ignoto e altrui]]></category>
		<category><![CDATA[Doxygen]]></category>
		<category><![CDATA[Refactoring]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=12116</guid>
		<description><![CDATA[Qualche giorno fa l&#8217;amico JustB ha sollevato un interessante quesito su Meemi: &#8220;Avete consigli su come approcciare lo studio di un&#8217;applicazione legacy su cui dovrete lavorare ed effettuare modifiche, considerando che si tratta di un&#8217;infinita schiera di file salvati in n+1 cartelle, che si includono a vicenda, senza uno straccio di documentazione né commenti esplicativi?&#8221; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=12116&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Qualche giorno fa l&#8217;amico <a href="http://giustino.borzacchiello.it/">JustB</a> ha sollevato un interessante <a href="http://meemi.com/JustB/7487930#discussion">quesito su <em>Meemi</em></a>:</p>
<blockquote><p><em>&#8220;Avete consigli su come approcciare lo studio di un&#8217;applicazione legacy su cui dovrete lavorare ed effettuare modifiche, considerando che si tratta di un&#8217;infinita schiera di file salvati in n+1 cartelle, che si includono a vicenda, senza uno straccio di documentazione né commenti esplicativi?&#8221;</em></p></blockquote>
<p>Domanda molto interessante, a cui vorrei rispondere ora, seppur brevemente&#8230;</p>
<p><span id="more-12116"></span></p>
<p><font size='+1' color='#005197'>L&#8217;approccio al problema</font></p>
<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>A chi non è mai capitata una cosa del genere, ossia avere a che fare con codice di terzi, magari <a href="http://rejex.wordpress.com/2011/09/19/sul-software-legacy/"><em>legacy</em></a>? Ovviamente la risposta è banale &#8211; tutti! &#8211; e, salvo rari casi, il compito non è mai una passeggiata.</p>
<p>Il problema non è solo metterci le mani, quanto capirlo e comprenderlo per poi decidere il da farsi.</p>
<p>Questo tipo di strategia però non sempre è possibile ed è abbastanza normale dover ottenere in fretta dei risultati &#8211; quindi modificare direttamente quel codice! &#8211; senza avere il tempo di effettuare un&#8217;ispezione accurata. Un po&#8217; come buttarsi a scrivere un nuovo programma senza neppure avere un&#8217;idea di fondo di quello che dovrà fare e soprattutto come dovrà farlo.</p>
<p>Esiste poi una sorta di atteggiamento spocchioso e terribilmente comune nei programmatori che si approcciano al lavoro di terzi ed è quello di partire prevenuti nei confronti degli altri, salvo poi peggiorare facilmente nel giudizio man mano che va avanti nella lettura: al minimo errore individuato &#8211; reale o presunto che sia -, al minimo commento incompleto o inesatto, alla minima imprecisione nell&#8217;indentazione, ecco che iniziano i mugugni del programmatore di turno verso &#8220;<em>chi ha fatto quello scempio</em>&#8220;.</p>
<p>Le motivazioni di questo tipo di atteggiamento sono le più disparate: dal &#8220;<em>io queste cose le so fare meglio</em>&#8221; fino al diventare una buona scusa per giustificare ulteriori ritardi (<em>&#8220;è talmente ingarbugliato che in pratica lo sto riscrivendo!&#8221;</em>).</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Per esperienza, direi di concedere al codice altrui ed al suo autore il <em>beneficio del dubbio</em>, almeno finchè non si è conclusa un&#8217;attenta e relativamente lunga fase di ispezione.</p>
<p>Di rimando, mai fidarsi ciecamente delle impressioni di un programmatore alle prese con codice non suo, almeno finchè non si è sporcato le mani davvero, in profondità.</p>
<p>Anche perchè, finchè un dev non arriva ad un certo livello di intimità con del codice, di norma non può sapere quanto ne dovrà cambiare: in altre parole, a seconda del singolo progetto e a fronte anche di migliaia e migliaia di potenziali righe di codice da visionare, quelle effettivamente da modificare potrebbero essere molto poche.</p>
<p>Un conto sono valutazioni oneste, frutto di indagini serie e prolungate nel codice altrui, un conto sono supposizioni ed illazioni &#8220;spannometriche&#8221;, emesse in fretta e furia e, tavolta, anche con una certa malizia di fondo.</em></td>
</tr>
</table>
<p></p>
<p>Di certo leggere poche righe di codice e, senza nemmeno averle capite, decidere di riprogettare il codice da zero è una scelta radicale e spesso controproducente: posso capire quando il codice altrui fa veramente pietà e non c&#8217;è modo per manutenerlo, ma il capriccio di volerlo rifare a tutti i costi no. Non c&#8217;è <a href="http://rejex.wordpress.com/2009/04/06/la-sindrome-not-invented-here/"><em>sindrome &#8220;Not Invented Here&#8221;</em></a> (<em>NIH</em>) o volontà di dimostrarsi più bravi che tenga.</p>
<p><font size='+1' color='#005197'>Il problema: approcciare l&#8217;ignoto</font></p>
<p>Il problema più grosso con il codice è l&#8217;ignoto. L&#8217;ignoto è codice altrui, che vedete per la prima volta, e perfino codice che voi stessi avete scritto anni prima e che non avete più toccato da eoni.</p>
<p>È un ammasso minaccioso di righe che dovete comprendere prima ancora di poterle modificare. Naturale quindi che, impaurito, qualcuno si ribelli a questa situazione e, piuttosto di affrontarla, opti per ripartire da zero. Inoltre, come <a href="http://www.joelonsoftware.com/articles/fog0000000069.html">direbbe Sposlky</a>:</p>
<blockquote><p><em>It’s harder to read code than to write it.</em></p></blockquote>
<p><a href="http://rejex.files.wordpress.com/2011/12/purchases.png"><img src="http://rejex.files.wordpress.com/2012/01/dont_panic.jpg?w=300" alt="" title="Don't panic!" width="300" class="alignleft" /></a>Da questo punto di vista i programmatori sono l&#8217;esempio per antonomasia di persone che non sono mai contente fino in fondo e che bisogna in qualche modo controllare: è normale che un <em>dev</em> arrivi ad un certo punto del suo lavoro e pensi/provi insistentemente a ripartire da capo &#8211; un errore generalmente gravissimo! -, figuriamoci se il codice iniziale l&#8217;ha scritto qualcun altro.</p>
<p>Prima regola per affrontare l&#8217;ignoto: <strong>non andare in panico</strong>, non tirare i remi in barca prima di averlo affrontato e possibilmente compreso, anche solo parzialmente. Sono le fasi iniziali quelle critiche: l&#8217;autocontrollo è essenziale. Non appena si comincia a capire qualcosa, la paura passa di colpo, <em>automagicamente</em>.</p>
<p><font size='+1' color='#005197'>Un approccio personale</font></p>
<p>Dopo aver sconfitto il demone della riscrittura <em>from scratch</em>, è fondamentale circoscrivere ed analizzare l&#8217;ignoto. Ognuno di noi sviluppa col tempo le sue personali strategie per raggiungere i suoi scopi.</p>
<p>Il mio è relativamente semplice ed è sintetizzabile in <strong>analizza, circoscrivi e migliora, ripeti</strong>.</p>
<p><strong><font color='#005197'>1. Analizza</font></strong></p>
<p><em>Analizzare</em> il codice significa volerlo capire con un certo livello di dettaglio. Se le dimensioni del codice e dell&#8217;eventuale documentazione a corredo sono contenute, apro il codice in un IDE e provo a capire da solo.</p>
<p>Molto più spesso uso invece Doxygen, che considero alla stregua di un coltellino svizzero. Da <a href="http://it.wikipedia.org/wiki/Doxygen">Wikipedia</a>:</p>
<blockquote><p><em>&#8220;Doxygen è una applicazione per la generazione automatica della documentazione a partire dal codice sorgente di un generico software. È un progetto open source rilasciato sotto licenza GPL, scritto per la maggior parte da Dimitri van Heesch a partire dal 1997.</p>
<p>Doxygen è un sistema multipiattaforma (Windows, Mac OS, Linux, ecc.) ed opera con i linguaggi C++, C, Java, Objective C, Python, IDL (versioni CORBA e Microsoft), Fortran, PHP, C#, e D. Nell&#8217;ambito del C++, è compatibile con le estensioni Qt.</p>
<p>È il sistema di documentazione di gran lunga più utilizzato nei grandi progetti open source in C++. Due esempi per tutti, sono l&#8217;adozione di doxygen da parte di ACE e KDE. In Java invece, la posizione leader viene meno, in virtù della presenza del concorrente Javadoc.</p>
<p>Il sistema estrae la documentazione dai commenti inseriti nel codice sorgente e dalla dichiarazione delle strutture dati.&#8221;</em></p></blockquote>
<p>Non solo è utile per creare documentazione partendo dal codice, documentato tramite opportuni tag, ma è estremamente efficace nell&#8217;<em>estrarre</em> <strong>anche altro</strong>.</p>
<p>Ad esempio, recentemente ho deciso di dare un&#8217;occhiata al codice di <em><a href="http://it.wikipedia.org/wiki/Doom_3">Doom 3</a></em> di <em>ID Software</em>, rilasciato finalmente sotto licenza GPL e pubblicato sul sito <em>GitHub</em> in <a href="https://github.com/TTimo/doom3.gpl">questo <em>repository</em> pubblico</a>.</p>
<p>Non è certamente un progetto-giocattolo ed infatti richiede una buona competenza tecnica per maneggiarlo, nonostante sia generalmente ben scritto <em>(in realtà avrei alcune riserve da programmatore a programmatore &#8211; vedi sezione precedente -, ma non è la sede giusta per farlo</em>).</p>
<p>Capirci qualcosa non è quindi stato molto facile, ma Doxygen si è nuovamente rivelato utilissimo per esplorare il codice cercando di capire come è stato strutturato &#8211; non sempre l&#8217;organizzazione dei file è intuitiva nè i programmatori-autori lasciano spesso file di spiegazione esaustivi sull&#8217;argomento -.</p>
<p>Premesso che non volevo studiare il codice a fondo, ma solamente dargli un&#8217;occhiata rapida, ma con Doxygen questa &#8220;passeggiata&#8221; mi è diventata decisamente più godibile.</p>
<p>Usare Doxygen poi è veramente facile: basta installarlo, lanciare l&#8217;interfaccia grafica (<em>GUI</em>), configurare pochi parametri e fa tutto lui. Se poi avete installato anche la suite <a href="http://it.wikipedia.org/wiki/Graphviz"><em>Graphviz</em></a>, potrete attivare l&#8217;opzione per ottenere i diagrammi , anche simil-<a href="http://it.wikipedia.org/wiki/Uml"><em>UML</em></a>, con <em>dot</em>.</p>
<p>Un breve riassunto, <em>step-by-step</em>:</p>
<table>
<tr>
<td><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=doxygen_1.png" target="_blank"><img width="250" src="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_1.png" border="0" alt="Doxygen run on Doom3 Code (GPL)"></a><br /><em>1. Configurazione iniziale in Doxygen: nome progetto, directory di lavoro, eccetera</em></td>
<td><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=doxygen_2.png" target="_blank"><img width="250" src="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_2.png" border="0" alt="Doxygen run on Doom3 Code (GPL)"></a><br /><em>2. Configurazione della generazione dei diagrammi</em></td>
</tr>
<tr>
<td><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=doxygen_3.png" target="_blank"><img width="250" src="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_3.png" border="0" alt="Doxygen run on Doom3 Code (GPL)"></a><br /><em>3. Abilitazione della ricerca ricorsiva nelle sottodirectory di quella dove risiede il codice da analizzare</em></td>
<td><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=doxygen_4.png" target="_blank"><img width="250" src="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_4.png" border="0" alt="Doxygen run on Doom3 Code (GPL)"></a><br /><em>4. Avvio del programma (Run)</em></td>
</tr>
<tr>
<td><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=doxygen_5.png" target="_blank"><img width="250" src="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_5.png" border="0" alt="Doxygen run on Doom3 Code (GPL)"></a><br /><em>5. Completamento operazioni</em></td>
<td><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=doxygen_6.png" target="_blank"><img width="250" src="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_6.png" border="0" alt="Doxygen run on Doom3 Code (GPL)"></a><br /><em>6. Apertura dei risultati in un browser: si notino i diagrammi di ereditarietà e di collaborazione fra classi</em></td>
</tr>
</table>
<p></p>
<p>Dopo un&#8217;oretta buona di processamento &#8211; il codice è relativamente complesso e denso di informazioni estraibili &#8211; ho quindi potuto leggere i risultati direttamente in un browser. Trovo molto comodo che sia possibile includere nella documentazione generata da Doxygen anche i sorgenti stessi. In un colpo si riesce a:</p>
<ul>
<li>osservare il progetto nella sua interezza, a dispetto del suo essere eventualmente sparpagliato in mille file in mille directory diverse;</li>
<li>esplorarlo in vari modi: per classe, namespace, e così via, </li>
<li>leggerlo in un modo esteticamente piacevole: Doxygen uniforma tutto, alla faccia dei file/sorgenti scritti in modo diverso;</li>
<li>analizzarlo in modo efficiente: viva gli hyperlink per passare da un file ad un altro, da una funzione all&#8217;altra senza perdere tempo e con la possibilità di usare il tast &#8220;Indietro&#8221; del browser!.</li>
</ul>
<p>Inoltre Doxygen stesso è efficiente nel senso che se modificate un file, di norma non rigenererà da zero la documentazione, ma solo la porzione di essa che è toccata dai cambiamenti nel codice.</p>
<p><strong><font color='#005197'>2. Circoscrivi e migliora</font></strong></p>
<p>Ogni progetto di una certa taglia è il frutto del lavoro di uno o più individui nel corso del tempo. Il risultato è che raramente il suo codice appare ed è omogeneo.</p>
<p>Realisticamente, soprattutto per programmi con una certa <em>anzianità</em>, ci si trova con una pletora di file, ognuno col suo codice scritto in modo &#8220;<em>particolare</em>&#8220;: non di rado capita di trovare differenze abissali fra un file ed un altro nello stesso progetto.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>In C e C++ si parla di <a href="http://en.wikipedia.org/wiki/Single_Compilation_Unit">compilazione per unità singole</a> per indicare il modo con cui avviene normalmente la compilazione, ossia file per file. In sostanza, al netto del significato reale, ogni file sorgente fa storia a sè durante quella fase. </p>
<p>Avviene la stessa cosa anche in fase di scrittura: file diversi fanno storia a sè. Uno stesso programmatore nel tempo può cambiare in modo considerevole il suo stile di scrittura, al punto da non riuscire a identificare come suo del codice che ha sviluppato molto tempo prima.</p>
<p>Hic sunt leones&#8230;</em></td>
</tr>
</table>
<p></p>
<p>Dopo aver capito cosa fa grossomodo un progetto si passa all&#8217;analisi per &#8220;sottosistemi&#8221;, se è possibile individuarne dei limiti: di solito i file sorgenti nei progetti di una certa dimensione sono raggruppati in qualche modo, per agevolare lo sviluppo e la manutenzione di parti logicamente legate.</p>
<p>Ad esempio tutto quello che riguarda l&#8217;accesso ad un filesystem potrebbe essere stato posto in una directory <em>fs</em> oppure tutti i file potrebbero risiedere nell&#8217;unica directory con gli altri sorgenti ma essere rapidamente individuabili da un prefisso <em>fs</em> nel nome. Nel caso invece tutto fosse alla rinfusa, nuovamente, Doxygen torna utile per capire le interrelazioni fra file e funzioni.</p>
<p>A quel punto, in perfetto stile <em>divide et impera</em>, si può approcciare l&#8217;ignoto dedicandosi ad un &#8220;sottosistema&#8221; per volta, cercando di comprenderne la struttura ed il ruolo per poi modificarlo se è il caso.</p>
<p>Durante questa fase, se è il caso, di solito provo anche a ridurre il numero di file, per renderlo maneggiabile: detesto maneggiare una miriade di piccolissimi file ognuno con una classe di pochissime righe (<em>una certa filosofia nel mondo Java sembra favorire questo approccio</em>). Per cui si procede con una riorganizzazione per passi dei file e poi al <a href="http://it.wikipedia.org/wiki/Refactoring"><em>refactoring</em></a> del codice vero e proprio.</p>
<p>L&#8217;idea è capire cosa fa un pezzettino del programma ignoto e, compreso, ridurne le dimensioni per rendere le successive modifiche più efficienti. <em>Accorpare e semplificare</em> sono le due parole magiche:</p>
<blockquote><p><em>&#8220;La perfezione è raggiunta non quando non c&#8217;è più niente da aggiungere, ma quando non c&#8217;è più niente da togliere. (<a href="http://it.wikiquote.org/wiki/Antoine_de_Saint-Exup%C3%A9ry">Antoine de Saint-Exupéry</a>)</em></p></blockquote>
<p>Durante questa fase, procedendo per passi piccoli ma decisi, vale la pena uniformare il codice, ossia applicare e riapplicare un <a href="http://en.wikipedia.org/wiki/Style_guide">manuale di stile</a> e delle <a href="http://en.wikipedia.org/wiki/Coding_conventions">coding convention</a>, precisi e predeterminati.</p>
<p><em>A questo punto il trucco si ripete, ossia si riparte dall&#8217;analisi e si continua finchè l&#8217;ignoto diventa qualcosa di compatto, manutenibile ed assolutamente non spaventoso.</em></p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/considerazioni-personali/'>Considerazioni personali</a>, <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/category/software-engineering/'>software engineering</a> Tagged: <a href='http://rejex.wordpress.com/tag/codice-ignoto-e-altrui/'>Codice ignoto e altrui</a>, <a href='http://rejex.wordpress.com/tag/considerazioni-personali/'>Considerazioni personali</a>, <a href='http://rejex.wordpress.com/tag/doxygen/'>Doxygen</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/refactoring/'>Refactoring</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/12116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/12116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/12116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/12116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/12116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/12116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/12116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/12116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/12116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/12116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/12116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/12116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/12116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/12116/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=12116&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2012/01/23/sullaffrontare-codice-altrui-ed-ignoto/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2012/01/dont_panic.jpg" medium="image">
			<media:title type="html">Don&#039;t panic!</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_1.png" medium="image">
			<media:title type="html">Doxygen run on Doom3 Code (GPL)</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_2.png" medium="image">
			<media:title type="html">Doxygen run on Doom3 Code (GPL)</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_3.png" medium="image">
			<media:title type="html">Doxygen run on Doom3 Code (GPL)</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_4.png" medium="image">
			<media:title type="html">Doxygen run on Doom3 Code (GPL)</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_5.png" medium="image">
			<media:title type="html">Doxygen run on Doom3 Code (GPL)</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/doxygen_6.png" medium="image">
			<media:title type="html">Doxygen run on Doom3 Code (GPL)</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />
	</item>
		<item>
		<title>Sviluppatori come modelli di riferimento&#8230;</title>
		<link>http://rejex.wordpress.com/2012/01/16/sviluppatori-come-modelli-di-riferimento/</link>
		<comments>http://rejex.wordpress.com/2012/01/16/sviluppatori-come-modelli-di-riferimento/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 06:25:59 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Lavoro]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Formazione]]></category>
		<category><![CDATA[Imparare]]></category>
		<category><![CDATA[Modelli]]></category>
		<category><![CDATA[Modello di riferimento]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=8571</guid>
		<description><![CDATA[Di tanto in tanto mi viene chiesto qualche consiglio su come iniziare a programmare, &#8220;partendo con il piede giusto&#8220;. Non che io sia un guru ma questo non mi impedisce certo di provare a rispondere. Alcuni dei consigli sono emersi qua e là, nei miei post passati, ma ho notato di aver trascurato del tutto [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=8571&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Di tanto in tanto mi viene chiesto qualche consiglio su come iniziare a programmare, &#8220;<em>partendo con il piede giusto</em>&#8220;. Non che io sia un <em>guru</em> ma questo non mi impedisce certo di provare a rispondere.</p>
<p>Alcuni dei consigli sono emersi qua e là, nei miei post passati, ma ho notato di aver trascurato del tutto un &#8220;<em>fattore di crescita professionale</em>&#8221; molto importante, che mi si è rivelato utilissimo: i &#8220;<em><strong>modelli di riferimento</strong></em>&#8220;.</p>
<p><span id="more-8571"></span></p>
<p><font size='+1' color='#005197'>Modello?</font></p>
<p>È indubbio che esistano tanti modelli di programmatori quanti sono i programmatori stessi ma, come è lecito aspettarsi, non tutti sono altrettanto efficaci e, di conseguenza, non tutti meritano di essere seguiti. Così come avviene, del resto, per i <a href="http://it.wikipedia.org/wiki/Modello_di_sviluppo_del_software"><em>modelli di sviluppo software</em></a>.</p>
<p><img class="alignleft" style="border:0 none;margin:5px;" title="programming" src="http://i275.photobucket.com/albums/jj308/rejectedx/modello_di_sviluppo_altan.jpg" alt="" width="250" />Non è una semplice questione di conoscenza: un programmatore da prendere come esempio, come &#8220;<em>modello di riferimento</em>&#8220;, non è semplicemente qualcuno che ne sa più di noi.</p>
<p>È piuttosto qualcuno che ha le idee sufficientemente chiare per svolgere un determinato compito in modo ordinato, preciso e se possibile anche elegante.</p>
<p>Se poi la sua conoscenza è estremamente vasta ed è perfino in grado di insegnarla in modo comprensibile a terzi, tanto meglio. Tuttavia non è una condizione imprescindibile per essere un &#8220;<em>modello valido</em>&#8220;.</p>
<p><font size='+1' color='#005197'>Un modello non è necessariamente (anche) un buon maestro</font></p>
<p>Esattamente: un modello non è per forza un docente, professore, &#8230; ma chiunque può esserlo o diventarlo nell&#8217;atto di svolgere qualcosa.</p>
<p>Ad esempio, una decina e più di anni fa, all&#8217;inizio della mia carriera universitaria, ricordo di aver visto il codice C per un progetto d&#8217;esame, scritto da un mio compagno di università che all&#8217;epoca era certamente già ben più esperto di me. </p>
<p>L&#8217;esercizio da svolgere non era particolarmente complicato ma lui lo aveva svolto in modo <em>terribilmente elegante</em>: gli spazi dove servivano, tutte le parentesi al loro posto, i commenti dove e solo se servivano, eccetera. </p>
<p>Era così ben scritto che riuscivo a capire <em>al volo</em> cosa facevano alcune funzioni della libreria C, all&#8217;epoca a me ignota in molti punti, libreria che non è mai stata celebre per la sua chiarezza e &#8220;<em>intuitività</em>&#8220;.</p>
<p>Man mano che leggevo quel codice continuavo a ripetermi:</p>
<blockquote><p><em>&#8220;Wow! Questo sì che sa come si fanno le cose bene!&#8221;</em></p></blockquote>
<p>Quel giorno ho imparato il concetto di &#8220;<em>stile</em>&#8221; nella programmazione, per giunta nella sua accezione positiva. Non un libro, non un docente chiamato ad insegnarmi a programmare, ma uno studente come me ed attraverso il suo codice ben scritto.</p>
<p>Quel giorno trovai un modello da seguire, a cui ispirarmi e per giunta <strong>senza che questi ne fosse a conoscenza</strong>.</p>
<p>Quel giorno formulai quest&#8217;altra semplice (<em>banale?</em>) euristica:</p>
<blockquote><p><em>&#8220;Se qualcosa ti fa esclamare più di due volte &#8216;Wow!&#8217; mentre la osservi, allora è fatta dannatamente bene, almeno in parte!&#8221;</em></p></blockquote>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Come ho avuto modo di scrivere più volte, non sono un guru e quel poco che so lo devo all&#8217;aiuto, diretto ed indiretto, di molte persone. Non potendole ringraziare una ad una &#8211; anche se lo meriterebbero &#8211; le ringrazio tutte in blocco, &#8220;ecumenicamente&#8221;.</em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Non esiste un modello unico ed universalmente valido di programmatore!</font></p>
<p>Sono convinto che ogni programmatore deve e può crearsi una sua &#8220;<em><strong>personalità programmativa</strong></em>&#8220;, magari costruita a partire da più modelli validi di riferimento.</p>
<p>In altre parole il programmatore alle prime armi può crescere professionalmente in fretta se impara ad individuare ed a seguire modelli validi, che può trovare quotidianamente e senza che debba sussistere per forza un legame esplicito tipo <em>maestro-discepolo</em>. Possono bastare anche le sole opere, debitamente osservate ed analizzate, come nel mio caso.</p>
<p>Seguire non è copiare spudoratamente, piuttosto assimilare solo le parti che si ritengono davvero buone, perfino da più persone contemporaneamente. Il risultato è appunto una &#8220;<em>personalità programmativa</em>&#8221; in cui si annidano le esperienze altrui.</p>
<p>Ricordo quando, sempre in università eoni or sono, impararai a progettare e strutturare un sito in certo modo, semplicemente osservando alcuni miei amici intenti a scriverne uno ed a discutere fra di loro sul da farsi: non scambiai nemmeno una parola sull&#8217;argomento con loro, però in qualche modo furono miei maestri e io un loro <em>padawan</em>.</p>
<p><font size='+1' color='#005197'>Non esistono solo <em>&#8220;casi di successo&#8221;</em></font></p>
<p>Sulla strada per diventare buoni programmatori si trova di tutto, comprese soluzioni eccellenti e in opposizione. A quel punto entrano in gioco altri fattori come ad esempio il proprio &#8220;<em>gusto</em>&#8220;.</p>
<p>Quando mi son trovato in una situazione del genere, cioè dovendo scegliere fra più opzioni contrapposte (<em>es: due programmatori-modelli che risolvono un problema in modo diametralmente opposto e/o mutualmente esclusivo fra di loro</em>), ho optato per quella più semplice, anche solo apparentemente: il &#8220;<a href="http://it.wikipedia.org/wiki/Rasoio_di_Occam"><em>rasoio di Occam</em></a>&#8221; rappresenta anche un&#8217;ottima euristica per scegliere.</p>
<p>Spesso, come è logico supporre, mi è capitato di tornare sui miei passi, ossia rivedere e scartare &#8211; a fatica &#8211; alcune mie &#8220;fissazioni&#8221;.</p>
<p>Una soluzione che si è rivelata buona una volta non significa che lo sarà anche in futuro. Idem per le persone.</p>
<p>Fidarsi ciecamente di qualcosa o qualcuno o, peggio, rifiutare a priori il resto è un sintomo di <strong>fanatismo</strong>, da rifuggire. Il mondo cambia e insieme a nuovi problemi emergono anche nuove soluzioni: rimanere ancorati, cristallizati a qualcosa o qualcuno è rischioso e quindi sconsigliabile.</p>
<p>Ad esempio, per tornare con i piedi per terra, detesto profondamente l&#8217;<a href="http://en.wikipedia.org/wiki/Indent_style#K.26R_style">lo stile di indentazione K&amp;R</a> perchè ritengo che rovini l&#8217;ordine ed ostacoli la leggibilità del codice rispetto ad altri stili come l&#8217;<a href="http://en.wikipedia.org/wiki/Indent_style#Allman_style_.28bsd_in_Emacs.29">Allman</a>. Eppure, osservando il codice scritto da persone competenti, mi sono ricreduto. Inoltre ci sono casi in cui bisogna compattare il codice il più possibile, ad esempio pubblicando il codice su delle riviste. Ho quindi imparato a tollerarla.</p>
<p><font size='+1' color='#005197'>Migliorare!</font></p>
<p>L&#8217;idea alla base è provare a riflettere non solo sul <em>cosa</em> imparare, ma anche sul <em>come</em>: come accrescere le proprie conoscenze, come migliorarsi, come diventare più efficienti, eccetera.</p>
<p>Questa è la parte inizialmente più difficile ma è anche quella che sul medio-lungo termine garantisce i risultati migliori.</p>
<p>Saper individuare e seguire dei modelli validi è un buon modo per favorire questa crescita personale e professionale.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/lavoro/'>Lavoro</a>, <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/formazione/'>Formazione</a>, <a href='http://rejex.wordpress.com/tag/imparare/'>Imparare</a>, <a href='http://rejex.wordpress.com/tag/modelli/'>Modelli</a>, <a href='http://rejex.wordpress.com/tag/modello-di-riferimento/'>Modello di riferimento</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/8571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/8571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/8571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/8571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/8571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/8571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/8571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/8571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/8571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/8571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/8571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/8571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/8571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/8571/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=8571&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2012/01/16/sviluppatori-come-modelli-di-riferimento/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/modello_di_sviluppo_altan.jpg" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />
	</item>
		<item>
		<title>Le leggi sulla tecnologia di Kranzberg&#8230;</title>
		<link>http://rejex.wordpress.com/2012/01/09/le-leggi-sulla-tecnologia-di-kranzberg/</link>
		<comments>http://rejex.wordpress.com/2012/01/09/le-leggi-sulla-tecnologia-di-kranzberg/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 06:25:13 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Innovazione]]></category>
		<category><![CDATA[Tecnologie]]></category>
		<category><![CDATA[Kranzberg's laws of technology]]></category>
		<category><![CDATA[Storia della tecnologia]]></category>
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=12058</guid>
		<description><![CDATA[Gironzolando sulla rete mi sono imbattuto in queste sei &#8220;leggi&#8221; dello storico della tecnologia Melvin Kranzberg: Kranzberg&#8217;s laws of technology Technology is neither good nor bad; nor is it neutral. Invention is the mother of necessity. Technology comes in packages, big and small. Although technology might be a prime element in many public issues, nontechnical [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=12058&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Gironzolando sulla rete mi sono imbattuto in queste sei &#8220;leggi&#8221; dello storico della tecnologia <a href="http://en.wikipedia.org/wiki/Melvin_Kranzberg">Melvin Kranzberg</a>:</p>
<blockquote><p><em><a href="http://en.wikipedia.org/wiki/Kranzberg's_laws_of_technology"><strong>Kranzberg&#8217;s laws of technology</strong></a></p>
<ol>
<li>Technology is neither good nor bad; nor is it neutral.</li>
<li>Invention is the mother of necessity.</li>
<li>Technology comes in packages, big and small.</li>
<li>Although technology might be a prime element in many public issues, nontechnical factors take precedence in technology-policy decisions.</li>
<li>All history is relevant, but the history of technology is the most relevant.</li>
<li>Technology is a very human activity &#8211; and so is the history of technology.</li>
</ol>
<p></em></p></blockquote>
<p>Sulle prime ho riso, poi ho riflettuto, quindi ho convenuto con il loro autore. </p>
<p><span id="more-12058"></span></p>
<p><font size='+1' color='#005197'>1. &#8220;La tecnologia non è buona nè cattiva; ma neppure neutrale&#8221;</font></p>
<p>Interessante come punto di vista: la tecnologia risolve bisogno &#8211; reale o creato &#8211; e per quanto possa essere apparentemente neutra in sè, gli effetti non lo sono.</p>
<p>Verrebbe da citare <a href="http://it.wikipedia.org/wiki/Alfred_Nobel">Alfred Nobel</a>, inventore della dinamite e ideatore del celeberrimo premio che porta il suo nome: grande invenzione ma che a seconda di come viene impiegata ha avuto e ha effetti positivi o negativi, certamente non neutri.</p>
<p>Curiosamente la storia è fatta di scoperte ed invenzioni nate per scopi militari e poi impiegate successivamente anche per usi civili. Di sicuro ogni invenzione spinge avanti il progresso e non si può più tornare indietro, fare finta cioè che non sia mai esistita.</p>
<p><font size='+1' color='#005197'>2. &#8220;L&#8217;invenzione è la madre della necessità&#8221;</font></p>
<p>Questa frase ad effetto mi piace molto e suona ambigua. Personalmente la interpreto come un &#8220;<em>l&#8217;invenzione crea il bisogno</em>&#8220;, nel senso che molte invenzioni moderne nascono col preciso intento di creare nuovi bisogni e quindi spingere l&#8217;acquisto dei frutti derivanti da esse. La necessità intesa quindi in senso consumistico.</p>
<p>In realtà, la storia insegna, l&#8217;invenzione spesso appare come scoperta casuale e non voluta di ricerche con altri fini. L&#8217;esempio prediletto dagli spammer: il <a href="http://it.wikipedia.org/wiki/Viagra"><em>Viagra</em></a>,</p>
<blockquote><p><em>&#8220;inizialmente studiato per la cura dell&#8217;angina pectoris&#8221;</em></p></blockquote>
<p>In altri casi l&#8217;invenzione è invece la risposta a qualche problema specifico o a qualche &#8220;prurito&#8221; personale: </p>
<blockquote><p><em>&#8220;Every good work of software starts by scratching a developer&#8217;s personal itch.&#8221; (<a href="http://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar">The Cathedral and the Bazaar</a>, <a href="http://www.cooperationcommons.com/node/396">E.S. Raymond</a>)</em></p></blockquote>
<p><font size='+1' color='#005197'>3. &#8220;La tecnologia arriva in pacchetti, grandi e piccoli&#8221;</font></p>
<p>Altra frase ad effetto, dai molti significati.</p>
<p>Perchè una tecnologia si diffonda, deve essere possibile innanzitutto imbrigliarla, controllarla, trasformarla in qualcosa di pratico e riproducibile, dosarla, inscatolarla per poterla infine vendere in base a qualche criterio, incluso certamente quello dimensionale.</p>
<p><a href="http://it.wikipedia.org/wiki/ENIAC"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Eniac.jpg/320px-Eniac.jpg" alt="ENIAC (Wikipedia)" title="sandbox" width="250" class="alignleft" /></a>Un&#8217;altra interpretazione, abbastanza banale, è relativa al fatto che spesso i primi prodotti di una tecnologia che compaiono sul mercato sono relativamente grossi (es: primi cellulari e, volendo, perfino l&#8217;<a href="http://it.wikipedia.org/wiki/ENIAC">ENIAC</a>!) e man mano vengono miniaturizzati, arrivando a stare quindi in pacchetti molto piccoli e maneggevoli.</p>
<p>Infine, come non citare i pacchetti intesi come unità di trasporto di informazioni, quindi le moderne reti di telecomunicazioni di cui Internet è certamente l&#8217;emblema.</p>
<p>Chissà quante altre interpretazioni sono possibili partendo da questa frase&#8230;</p>
<p><font size='+1' color='#005197'>4. &#8220;Anche se la tecnologia potrebbe essere un elemento primario in molte discussioni pubbliche, fattori non-tecnici prendono il sopravvento nelle decisioni che riguardano l&#8217;uso della tecnologia&#8221;</font></p>
<p>Dato che gli effetti della tecnologia non sono mai neutri, è ovvio che il suo uso vada discusso ed opportunamente regolamentato. Quindi molti altri fattori non-tecnici hanno pressochè spesso il sopravvento su di essa:</p>
<blockquote><p><em><a href="http://thefrailestthing.com/2011/08/25/kranzbergs-six-laws-of-technology-a-metaphor-and-a-story/"><strong>Kranzberg’s Six Laws of Technology, a Metaphor, and a Story</strong></a></p>
<p>&#8220;<strong>Fourth Law</strong>: [...] many complicated sociocultural factors, especially human elements, are involved, even in what might seem to be ‘purely technical’ decisions.” “Technologically ‘sweet’ solutions do not always triumph over political and social forces.”</em></p></blockquote>
<p>Un recente esempio &#8220;scientifico&#8221;:</p>
<blockquote><p><em><strong><a href="http://arstechnica.com/science/news/2011/12/us-government-tries-to-restrict-publication-of-details-on-avian-flu-virus-that-spreads-among-mammals.ars">US Government tries to restrict publication of details on avian flu virus that spreads among mammals</a></strong></p>
<p>Although avian flu viruses have infected humans in the past (often with lethal effect), so far, these infections have come directly from birds. Over this past summer, however, researchers presented disturbing results at a scientific meeting. By growing the avian H5N1 virus in mammals for several generations, <strong>they had evolved a strain that can spread among mammals</strong> (ferrets, in this case) simply through the air. Additionally, researchers identified the mutations that enabled the virus to do so&#8211;the kind of information that would be enough to allow any competent molecular biologist to create an exact duplicate.</p>
<p>Like any scientists, these ones want to publish their results, but that&#8217;s where things are getting messy. The US National Science Advisory Board for Biosecurity has asked both Nature and Science to &#8220;delete details regarding both scientific methodology and specific viral mutations before publishing.&#8221; The journals recognize why the NSABB is concerned, but they also both feel that responsible researchers will need to know these details if they&#8217;re to effectively study the risk of an H5N1 pandemic.</p>
<p>Currently, both have issued statements that they&#8217;re considering the requests, but haven&#8217;t yet decided how to proceed.</em></p></blockquote>
<p>In questo caso l&#8217;aspetto scientifico, che di norma anticipa un eventuale sviluppo tecnologico, scatena reazioni pubbliche che arrivano addirittura alla richiesta di censura (che sempre un grosso errore: cfr. <em><a href="http://it.wikipedia.org/wiki/Effetto_Streisand">effetto Streisand</a></em>). Oltre a instillare dubbi sul buon senso di una tale ricerca: </p>
<blockquote><p><em>&#8220;Serviva davvero mutare il virus o lo scopo era semplicemente ottenere una pubblicazione su una rivista peer-reviewed di prestigio?&#8221;</em></p></blockquote>
<p>Ogni invenzione, ogni &#8220;<em>breakthough</em>&#8221; tecnologico comporta qualche sconvolgimento, non necessariamente negativo per tutti.</p>
<p>La Rete, si dice da tempo ad esempio, sta uccidendo l&#8217;editoria &#8220;classica&#8221; e si discute di come arginare questo fenomeno, addirittura a colpi di leggi e leggine. Ma se si valuta nel complesso umano, la sua sola esistenza ha portato anche molti effetti positivi, incluso l&#8217;avvicinare un certo grado di istruzione a persone che altrimenti ne resterebbero totalmente privi.</p>
<p><font size='+1' color='#005197'>5. &#8220;Tutta la storia è rilevante, ma la storia della tecnologia è la più rilevante&#8221;</font></p>
<p>Il fatto che uno storico, in seguito storico della tecnologia, emetta questo giudizio non mi sorprende più di tanto: si potrebbe dire che tira l&#8217;acqua al suo mulino. Però, a ben vedere, ogni aspetto umano è toccato da benefici &#8220;tecnologici&#8221;, frutto di innovazioni vere e proprie. Perfino negli aspetti umanistici fiori fior di letterati, poeti, scultori e artisti hanno innovato, ossia spinto più in alto l&#8217;asticella del progresso.</p>
<p>Tuttavia, la Storia raccontata e studiata a scuola tende più a parlare di fatti, date e persone che non a focalizzarsi sul progresso in quanto tale. Non che sia un male, ma ogni tanto è bello scoprire le &#8220;innovazioni&#8221;, perfino quelle più strane. Ricordo con piacere  quando da giovincello mi fu spiegato che fu Napoleone a imporci, fra le varie cose e <a href="http://it.wikipedia.org/wiki/Editto_di_Saint_Cloud">per editto</a>, che i cimiteri fossero collocati fuori dalle mura cittadine (anche) per motivi igienico-sanitari oltreché politici-ideologici.</p>
<p>Non credo che la storia della tecnologia avrà mai il suo spazio a scuola, però condivido la sua importanza fondamentale per il genere umano.</p>
<p><font size='+1' color='#005197'>6. &#8220;La tecnologia è un&#8217;attivà veramente umana &#8211; e così pure lo è la storia della tecnologia&#8221;</font></p>
<p>Esiste una specie di velato e sotterraneo disprezzo reciproco fra i propugnatori della scienze e quelli delle discipline umanistiche. I primi reclamano il progresso come loro bottino di guerra, mentre i secondi la cultura. In realtà tutte queste cose non sono altro che attività umane, spesso intimamente legate le une alle altre al punto che se esiste un confine che le separa, esso è certamente molto labile.</p>
<p>In tutto ciò la tecnologia è un esempio delle capacità del genere umano, qualcosa che ci distingue dalle altre specie animali e ci ha garantito anche la supremazia a livello planetario.</p>
<p>Di rimando, studiare la storia della tecnologia è importante per capire la storia umana e, forse, per favorirne nuovi impulsi. Non a caso su Slashdot è apparso recentemente questo articolo:</p>
<blockquote><p><em><strong><a href="http://developers.slashdot.org/story/12/01/07/1433205/want-to-get-kids-interested-in-programming-teach-them-computer-history">Want To Get Kids Interested In Programming? Teach Them Computer History</a></strong></p>
<p>&#8220;With poor IT teaching putting kids off pursuing a career in the computing it is time to look for a new approach. Taking kids back to the time of computing pioneers like John Von Neumann and the first machines — the likes of the Z3, the Eniac and the Colossus — would both inspire them and help get over the fundamentals about how computers work, argues silicon.com.&#8221;</em></p></blockquote>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/informatica/'>Informatica</a>, <a href='http://rejex.wordpress.com/category/innovazione/'>Innovazione</a>, <a href='http://rejex.wordpress.com/category/tecnologie/'>Tecnologie</a> Tagged: <a href='http://rejex.wordpress.com/tag/informatica/'>Informatica</a>, <a href='http://rejex.wordpress.com/tag/innovazione/'>Innovazione</a>, <a href='http://rejex.wordpress.com/tag/kranzbergs-laws-of-technology/'>Kranzberg's laws of technology</a>, <a href='http://rejex.wordpress.com/tag/storia-della-tecnologia/'>Storia della tecnologia</a>, <a href='http://rejex.wordpress.com/tag/tecnologia/'>Tecnologia</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/12058/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/12058/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/12058/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/12058/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/12058/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/12058/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/12058/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/12058/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/12058/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/12058/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/12058/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/12058/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/12058/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/12058/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=12058&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2012/01/09/le-leggi-sulla-tecnologia-di-kranzberg/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Eniac.jpg/320px-Eniac.jpg" medium="image">
			<media:title type="html">sandbox</media:title>
		</media:content>
	</item>
		<item>
		<title>&#8230;And Sandbox for All!</title>
		<link>http://rejex.wordpress.com/2012/01/02/and-sandbox-for-all/</link>
		<comments>http://rejex.wordpress.com/2012/01/02/and-sandbox-for-all/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 06:25:46 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Formazione]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[FAT32]]></category>
		<category><![CDATA[Informatica di base]]></category>
		<category><![CDATA[Sandbox]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11932</guid>
		<description><![CDATA[Cosa distingue un utente da quello che viene spregiativamente definito un &#8220;utonto&#8220;? Forse una particolare forma di intelligenza? Forse la coordinazione nell&#8217;uso degli strumenti di input? Forse la tenacia nell&#8217;imparare e nel contempo piegarsi poco a poco al modo di funzionare di una macchina? Dipende da caso a caso ma, dovendo generalizzare, credo che nessuna [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11932&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Cosa distingue un utente da quello che viene spregiativamente definito un &#8220;<em>utonto</em>&#8220;?</p>
<p>Forse una particolare forma di intelligenza? Forse la coordinazione nell&#8217;uso degli strumenti di <em>input</em>? Forse la tenacia nell&#8217;imparare e nel contempo piegarsi poco a poco al modo di funzionare di una <em>macchina</em>?</p>
<p>Dipende da caso a caso ma, dovendo generalizzare, credo che nessuna di queste caratteristiche sia più importante della <strong>mancanza di possibilità e di volontà di osare</strong>.</p>
<p><span id="more-11932"></span></p>
<p><font size='+1' color='#005197'>Sani errori di gioventù</font></p>
<p>Ricordo benissimo quando intorno ai 16 anni, insieme a Windows 95 OSR2, comparve la misteriosa <a href="http://en.wikipedia.org/wiki/FAT32#FAT32">FAT32</a>. Non sapevo cosa fosse realmente, non ne capivo necessità ed uso, ma volevo provarla <em>a tutti i costi</em>.</p>
<p>Tentai quindi la conversione da FAT16 a FAT32 del disco di sistema con il programma fornito dal sistema operativo, ma qualcosa andò storto. Problema: quello era <em>anche</em> il PC di mio papà. Follia giovanile è anche fare qualcosa senza sapere come e perchè: non avevo idea dell&#8217;importanza dei dati personali e quindi del rischio di comprometterli o perderli per una &#8220;<em>stupida prova</em>&#8220;, invasiva e distruttiva.</p>
<p>Le conseguenze furono migliori delle attese, nonostante la sacrosanta furia genitoriale nei miei confronti: un amico di mio papà, il nostro esperto locale di PC, salvò capra e cavoli, recuperando i dati con <em>chissà-quale-strumento</em> e tutto tornò a posto, seppure ancora con la FAT16.</p>
<p>Ovviamente non finì lì il discorso: ci riprovai, fallendo miseramente per la seconda volta.</p>
<p>Questa volta però, invece di darmi per vinto e nella speranza di evitare danni ben più gravi, cercai in tutto quello che avevo &#8211; all&#8217;epoca la documentazione erano per lo più le riviste specializzate con CD allegato &#8211; e riuscii in pieno nel mio intento: ora avevo un disco formattato in FAT32.</p>
<p>Quel giorno andai a letto spossato ma felice. Per evitare guai seri &#8211; la reiterazione di un misfatto li induce -, stavolta avevo dovuto imparare cosa fosse davvero un filesystem, cosa differenziasse la FAT32 dalla FAT16, cosa fosse e come usare <em>Partition Magic</em>.</p>
<p><font size='+1' color='#005197'>Cosa è ed a cosa serve una sandbox</font></p>
<p><a href="http://rejex.files.wordpress.com/2012/01/sandbox.jpg"><img src="http://rejex.files.wordpress.com/2012/01/sandbox.jpg?w=300" alt="" title="sandbox" width="300" class="alignleft wp-image-11945" /></a>Ripensando a quanti danni e quanti rischi mi sono accollato per imparare <em>sporcandomi le mani</em> &#8211; non crederete certo che mi sia limitato alla FAT32, vero? -, non mi sento di condannarmi. Affatto.</p>
<p>Col senno di poi, tuttavia, mi accorgo solo ora di <strong>quanto</strong> ho rischiato. Quando commisi quegli errori, i PC erano ancora molto costosi in proporzione al resto dei beni sul mercato ed io, nel corso del tempo, avevo messo a rischio stipendi interi dei miei genitori <em>senza neppure saperlo</em>.</p>
<p>Sostanzialmente avevo fatto di un <em>sistema in produzione</em> la mia personale <em><a href="http://it.wikipedia.org/wiki/Sandbox">sandbox</a></em>, la mia <em>scatola della sabbia con i giochi</em> in cui sperimentare liberamente.</p>
<p>Un grave errore di valutazione il mio, senza però il quale, probabilmente, non avrei proseguito nella mia carriera informatica. <em>Chi non risica, non rosica&#8230;</em></p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Gran parte dei programmatori che conosco si sono ritrovati nella mia stessa situazione, spesso fin dall&#8217;infanzia. </p>
<p>L&#8217;unica differenza sta nella <strong>precocità</strong> con cui hanno avuto accesso all&#8217;informatica, quindi alle rispettive famiglie: chi ha (avuto) genitori che lavoravano nell&#8217;informatica, ha potuto sperimentare prima. Nel mio caso, pur avendo giocato con i PC fin dalle elementari a scuola, ho scelto l&#8217;informatica come &#8220;stile di vita&#8221; solamente quando ho potuto veramente esplorarla da solo, con tutti i guai del caso.</p>
<p>Per questo, pur storcendo il naso quando penso alla FAT32 come filesystem &#8220;vecchiotto&#8221;, mi viene quasi da ringraziarlo, quale che sia una persona in carne ed ossa che mi ha fatto un grosso favore tanti e tanti anni fa.</em></td>
</tr>
</table>
<p></p>
<p>Qui sta il punto: nell&#8217;epoca dei dispositivi iperpotenti, tanto da gestire <em>virtual machine</em> come bazzecole, <strong>perchè non insegnare l&#8217;informatica in modo &#8220;sandboxed&#8221;</strong>?</p>
<p><font size='+1' color='#005197'>Un&#8217;umile proposta</font></p>
<p>Nel mio piccolo ho avuto anche qualche esperienza come insegnante di informatica, tanto per enti pubblici che per privati. Ebbene, lo confesso, non mi sono quasi mai attenuto ai libri o alle &#8220;linee guida&#8221; imposti dai miei committenti dei corsi perchè l&#8217;unico modo per insegnare l&#8217;informatica alle persone alle prime armi è <strong>liberarle dal rischio e farle sperimentare a piacere</strong>.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Un paio di lustri fa, rifiutai una proposta di regolarissimo lavoro part-time come insegnante di informatica di base presso una delle varie aziende di formazione del circondario.</p>
<p>Concluso il &#8220;training&#8221; plurigiornaliero ed appena prima di firmare per &#8220;entrare in servizio&#8221;, optai per salutare tutti ed andarmene.</p>
<p>Non era tanto il dover vestirmi in giacca e cravatta a darmi fastidio (beh, forse un po&#8217; sì: avevo vent&#8217;anni!), quanto il dettarmi per filo e per segno cosa dovevo dire e cosa dovevo omettere.</p>
<p>Lo scopo &#8220;fra le righe&#8221;, mai esplicitamente dichiarato, era ovviamente costringere le persone a ripetere il corso più in là.</p>
<p>Per mia fortuna me ne accorsi in tempo e fuggii a gambe levate.</p>
<p>Rispetto alle mie esperienze successive posso ora dire che quello fu di certo un caso isolato, come &#8220;modo di formare&#8221; le persone intendo. Nondimeno, ripensandoci di tanto in tanto, mi compiaccio di quella mia &#8220;fuga&#8221;.</em></td>
</tr>
</table>
<p></p>
<p>Chi ha mai insegnato ad usare un PC a qualcuno &#8211; cosa ben diversa da &#8220;<em>insegnare l&#8217;informatica di base</em>&#8220;! &#8211; sa benissimo che il primo contatto con &#8220;<em>la bestia elettronica</em>&#8221; può essere micidiale. Anche l&#8217;essere umano che si sente un guru nel suo campo tende ad accusare il colpo, spesso in modo drammaturgico al limite del tragicomico:</p>
<blockquote><p><em>&#8220;&#8230; come è possibile!? Ci riesce anche la zia Peppina e io no!?&#8221;</em></p></blockquote>
<p><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=risk-free.jpg" target="_blank"><img width="120" class="alignright" src="http://i275.photobucket.com/albums/jj308/rejectedx/risk-free.jpg" border="0" alt="Risk Free"></a>Qui si inserisce la mia banalissima proposta: perchè non un corso di informatica dentro una <em>virtual machine</em>? Una bella sandbox sicura in cui l&#8217;utente <strong>può sbagliare quanto gli pare e piace</strong>.</p>
<p>Perfino Wikipedia ha la <a href="http://it.wikipedia.org/wiki/Wikipedia:Sandbox">sua bella pagina-<em>sandbox</em></a> in cui gli utenti possono sbizzarrirsi e provare in totale sicurezza.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em><strong><a href="http://it.wikipedia.org/wiki/Virtual_machine">Da Wikipedia:</a></strong></p>
<blockquote><p>In informatica il termine macchina virtuale (VM) indica un software che crea un ambiente virtuale che emula il comportamento di una macchina fisica ed in cui alcune applicazioni possono essere eseguite come se interagissero con tale macchina. [...]</p>
<p>Gli usi possibili sono:</p>
<ul>
<li>la simulazione di piattaforme hardware ancora in fase di progettazione (è questo uno degli usi originari)</li>
<li>l&#8217;emulazione di un sistema operativo diverso da quello realmente installato sul proprio hardware al solo scopo di utilizzare applicazioni sviluppate solo per quello emulato e non per il proprio</li>
<li>operazioni di &#8220;consolidamento&#8221;. Passare cioè da avere x server fisici per x servizi, all&#8217;avere un unico server fisico con x istanze del sistema operativo, ognuna delle quali istanze può eseguire uno o più servizi.</li>
</ul>
</blockquote>
<p>Ebbene, io aggiungerei un quarto punto:</p>
<blockquote><ul>
<li>&#8220;didattica sandboxed&#8221;</li>
</ul>
</blockquote>
<p></em></td>
</tr>
</table>
<p></p>
<p>Potete sostituire le <em>virtual machine</em> con qualunque altro strumento che garantisca la certezza, reale o presunta, che si possa operare esattamente &#8220;come a casa&#8221;, potendo perfino distruggere tutto per imparare.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Uno degli aspetti più atroci per uno studente è la <strong>non ripetitibilità in solitaria delle nozioni acquisite</strong>.</p>
<p>In altre parole: si sta attenti, ci si segna tutto per filo e per segno, ma arrivati a casa non si riesce a ripetere da soli quello che si è visto e fatto a lezione. Argh! Disperazione e rovina!</p>
<p>Per evitare quella debacle didattica, un primo buon passo può essere il fornire gli stessi strumenti (<em>metodo scientifico docet</em>): l&#8217;adattamento o per meglio dire la capacità di uno studente di ripetere qualcosa in un contesto diverso (come può esserlo il PC di casa, diverso nell&#8217;HW e nel SO da quello usato a lezione) non è cosa immediata per tutti.</p>
<p>Per questo una virtual machine &#8220;moderna&#8221; (ossia corredata da un&#8217;interfaccia grafica semplicata), usabile, clonabile, letteralmente trasportabile e (ri)usabile a casa rappresenta un buon strumento didattico. Come un libro che si usa a lezione e altrove.</p>
<p>Di certo è meglio che costringere gli utenti a portare il loro PC &#8220;buono&#8221; da casa e rischiare di comprometterlo.</em></td>
</tr>
</table>
<p></p>
<p>Libertà di sperimentazione è l&#8217;unico modo per entusiasmare le persone e quindi spingerle ad imparare con le loro stesse mani. Ripudio l&#8217;idea dell&#8217;insegnante come miserrimo enunciatore e verificatore di nozioni preconfezionate: preferisco l&#8217;idea (<em>romantica?</em>) di insegnante come <strong>catalizzatore</strong>, come casella &#8220;<em>Via!</em>&#8221; del Monopoli.</p>
<p>Dopotutto, se pensate ai vostri trascorsi scolastici, quali insegnanti ricordate in modo pienamente positivo? Per estensione, non avete forse ricordi spensierati e gioiosi di qualcuno che vi consentiva di provare qualcosa in assoluta libertà e neppure vi sgridava nel caso commetteste qualche errore? Quanto siete migliorati grazie a quei momenti?</p>
<p>Liberate il vostro utente, concedetegli di sbagliare e lui imparerà da solo. Fornite linee guida per non farsi male, non ordini da eseguire. Dategli una <em>sandbox</em> per farsi le ossa e lui vi ringrazierà.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/formazione/'>Formazione</a>, <a href='http://rejex.wordpress.com/category/informatica/'>Informatica</a> Tagged: <a href='http://rejex.wordpress.com/tag/fat32/'>FAT32</a>, <a href='http://rejex.wordpress.com/tag/formazione/'>Formazione</a>, <a href='http://rejex.wordpress.com/tag/informatica-di-base/'>Informatica di base</a>, <a href='http://rejex.wordpress.com/tag/sandbox/'>Sandbox</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11932/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11932/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11932/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11932/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11932/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11932/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11932/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11932/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11932/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11932/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11932/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11932/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11932/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11932/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11932&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2012/01/02/and-sandbox-for-all/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2012/01/sandbox.jpg" medium="image">
			<media:title type="html">sandbox</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/risk-free.jpg" medium="image">
			<media:title type="html">Risk Free</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />
	</item>
		<item>
		<title>Sull&#8217;espansione del software nel tempo&#8230;</title>
		<link>http://rejex.wordpress.com/2011/12/27/sull-espansione-del-software-nel-tempo/</link>
		<comments>http://rejex.wordpress.com/2011/12/27/sull-espansione-del-software-nel-tempo/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 06:25:02 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[JP's Law on Software Expansion]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Zawinski's Law of Software Envelopment]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11882</guid>
		<description><![CDATA[Un celebre aforisma, spesso veritiero negli effetti, così recita: Zawinski&#8217;s Law of Software Envelopment &#8220;Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.&#8221; Una mia personale revisitazione generica di quella legge: JP&#8217;s Law on Software Expansion &#8220;Every software attempts to expand until [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11882&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Un celebre aforisma, spesso veritiero negli effetti, così recita:</p>
<blockquote><p><strong><a href="http://en.wikipedia.org/wiki/Jamie_Zawinski#Zawinski.27s_law_of_software_envelopment">Zawinski&#8217;s Law of Software Envelopment</a></strong></p>
<p>&#8220;Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.&#8221;</p></blockquote>
<p>Una mia personale revisitazione generica di quella legge:</p>
<blockquote><p><strong>JP&#8217;s Law on Software Expansion</strong></p>
<p>&#8220;Every software attempts to expand until it can even make coffee. Just before reaching that goal, someone else complains about that huge mess and will start a new tiny replacement project.&#8221;</p></blockquote>
<p><span id="more-11882"></span></p>
<p>Un buon software è spesso il frutto di un buon compromesso circa il numero di funzionalità incluse e &#8220;maneggiabili&#8221; da un utente medio.</p>
<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Quello che molti sviluppatori non digeriscono proprio o fanno finta di ignorare è che l&#8217;utente medio si stanca in fretta di trovare sempre nuove funzionalità da imparare nelle sempre nuove versioni di programmi che utilizza: presto o tardi quel tipo di utente si ancorerà a vita ad una specifica <em>release</em> di un dato programma, rifiutando qualunque <em>upgrade</em>, oppure inizierà a cercare qualcosa di alternativo, che soddisfi tutte le sue necessità, ma senza farlo ammattire.</p>
<p>Capisco anche che il marketing spinga costantemente per poter disporre e vendere nuovi prodotti con nuove fantasmagoriche funzionalità, tuttavia questo non coincide necessariamente (<em>o non coincide affatto</em>) con il &#8220;Bene&#8221; del cliente.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Quante funzionalità può avere uno spreadsheet come Excel, quante ne conoscete e quante ne usate davvero? (Perfino voi cultori di questo genere di programma!)</em></td>
</tr>
</table>
<p></p>
<p><a href="http://rejex.files.wordpress.com/2015/12/expand.png"><img src="http://rejex.files.wordpress.com/2015/12/expand.png?w=150" alt="" title="expand" width="150" class="alignleft wp-image-11898" /></a>Mi rendo conto che dare la colpa solamente al marketing sia un&#8217;ottima scusante, ma il problema è che noi stessi, gli sviluppatori, siamo i primi responsabili dell&#8217;espansione del software: se intravediamo la possibilità di aggiungere qualcosa ad un nostro progetto <em>perchè ci piace</em> o perchè sentiamo che <em>ci serve</em>, è molto probabile che l&#8217;aggiungeremo comunque, anche se non è fondamentale. </p>
<p>Arriviamo ad un punto essenziale: il bravo sviluppatore sa dire e sa dirsi no. Sa resistere cioè alle richieste che provengono dall&#8217;esterno per aggiungere questo e quest&#8217;altro (<em>spesso non necessari se non &#8220;per fare numero&#8221; sulle brochure</em>) ma <strong>sa soprattutto controllare il suo impeto creativo</strong>.</p>
<p>Non si tratta semplicemente di negare qualcosa ad un <a href="http://en.wikipedia.org/wiki/Power_user"><em>power user</em></a> (<em>ed uno sviluppatore lo è per definizione!</em>) o un utente alle prime armi, si tratta di <strong>bilanciare</strong> un prodotto perchè sia usabile da entrambi e senza che nessuno dei due prenda il sopravvento come pubblico-target (<em>a meno di software specifico, ovviamente</em>).</p>
<p>Anzi, diciamocelo, se il software che viene progettato non è pensato per un uso iperspecialistico, dovendo scegliere, è meglio dire no al <em>power user</em>. Tanto quel tipo di utente ha sempre qualcosa di cui lamentarsi, ha sempre qualcosa di cui avverte la mancanza e che vi rinfaccerà alla prima occasione. Se poi è così bravo, magari modificherà o ricrereerà comunque da zero il vostro progetto, a suo uso e consumo. Per cui, perchè inseguire questo tipo di <em>cliente difficile</em>?</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>I power user &#8211; per quanto possa dar loro fastidio ribadirlo &#8211; sono numericamente poca cosa rispetto alla restante massa di utenti. Costituiscono certamente una minoranza forte e combattiva, è vero, ma non per questo devono averla sempre vinta.</em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Nel mondo FOSS è anche peggio&#8230;</font></p>
<p>Il mondo <a href="http://it.wikipedia.org/wiki/Free_and_open_source_software"><em>FOSS</em></a> è una fucina di talento, un porto in cui le persone vanno e vengono, un ambito in cui il software non sta mai fermo. I progetti più importanti lo sono anche e soprattutto in virtù delle <strong>comunità</strong> che ruotano loro intorno; in ciascuna di esse si annida ogni genere di sviluppatore, da quello che spinge per fare il caffè istantaneo a quello che invece tende a frenare sistematicamente ogni novità.</p>
<p>Prima o poi, passo immancabile, tutti i progetti di successo si trovano alle strette fra &#8220;<em>progressisti</em>&#8221; e &#8220;<em>conservatori</em>&#8221; e l&#8217;esito di un tale scontro varia a seconda di molti fattori. Il vero problema, tuttavia, sono le frammentazioni del software a seguito di diverbi più o meno espliciti sull&#8217;evoluzione dei progetti FOSS.</p>
<p>Prendiamo un &#8220;caso storico&#8221;, il browser <a href="http://it.wikipedia.org/wiki/Epiphany_(browser)"><em>Epiphany</em></a>:</p>
<blockquote><p><em>Epiphany è la naturale evoluzione di Galeon (un progetto amministrato da Marco Pesenti Gritti) che aveva come obiettivo lo sviluppo di un programma che fungesse solo da browser. Il passaggio alla versione 2 delle librerie GTK+ ha portato molte novità (e incompatibilità), così si è optato per la riscrittura da zero del programma: Galeon è stato gradualmente inglobato in Epiphany.</em></p></blockquote>
<p>Wikipedia inglese è <a href="http://en.wikipedia.org/wiki/Epiphany_(web_browser)">più esplicita</a>:</p>
<blockquote><p><em>&#8220;Epiphany is an open source web browser for the GNOME desktop environment. The browser is a descendant of Galeon and <strong>was created after developer disagreements about Galeon&#8217;s growing complexity</strong>.&#8221;</em></p></blockquote>
<p>Questo è solo un esempio di un vastissimo elenco. L&#8217;ultimo in ordine di tempo è il progetto <a href="http://razor-qt.org/screenshots/"><em>Razor-Qt</em></a>, l&#8217;ennesimo desktop environment, nato leggero, che sembra una reimplementazione di KDE 2/3.</p>
<p>Sul fronte GNOME, il fork di GNOME2, <em>MATE</em>, è invece un buon esempio di progetto nato come prosecuzione di qualcosa di dichiarato deprecato (GNOME2, appunto). <a href="http://linuxmint.com/rel_lisa_whatsnew.php">Dal sito</a> della distribuzione Mint, a sua volta una derivata di Ubuntu:</p>
<blockquote><p><em>&#8220;MATE is a fork of Gnome 2 which is compatible with Gnome 3&#8243;</em></p></blockquote>
<p>Non proseguirò oltre negli esempi. Mi soffermerò però sul punto che reputo essenziale: un software rimane vivo se viene seguito e migliorato costantemente.</p>
<p><strong>&#8220;Migliorare&#8221; però non è solo &#8220;espandere&#8221;</strong>. Continuare ad aggiungere <em>feature</em> non è fare del bene nè al software (<em>&#8220;più roba c&#8217;è, più roba si può rompere&#8221;</em>) nè agli utenti (<em>&#8220;più roba c&#8217;è, più gli utenti si romperanno di usarlo&#8221;</em>).</p>
<p>Migliorare è prima di ogni altra cosa <strong>semplificare</strong>, agevolare l&#8217;utente medio, magari nascondendo ma non rimuovendo le funzionalità avanzate per i <em>power user</em>. In questo non mi piace nè l&#8217;approccio di KDE, zeppo di opzioni e parametri di configurazione anche per le quisquilie più superflue, nè quello di GNOME, troppo zelante nel levare tutto quello che &#8211; a sua detta &#8211; potrebbe confondere l&#8217;utente.</p>
<p>La virtù, al solito sta nel mezzo: un sistema semplice ma estendibile (<em>es: tramite <a href="http://rejex.wordpress.com/2011/11/21/sulle-architetture-a-plugin/">plugin</a></em>) può far felici tutti i tipi di utenti. Si dà il minimo che l&#8217;utente medio può usare, ma anche ai rompisc&#8230; ehm&#8230; <em>power user</em> la possibilità di personalizzarsi e perfino riprogettarsi il software a loro uso e consumo, senza infastidire il resto del mondo.</p>
<p>Questo è un modo semplice per estendere il software senza renderlo eccessivamente <em>carico</em> fin dall&#8217;inizio e, possibilmente, senza spingere qualcuno a reinventarlo da capo.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>La fluidità e l&#8217;impeto del variegato mondo FOSS sono indubbiamente la riprova che come modello funziona e funziona invero molto bene.</p>
<p>Sono però convinto che la <strong>frammentazione</strong> di questo mondo &#8211; e relativa dispersione delle energie &#8211; sia una cosa estremamente negativa. Diciamolo, è un effetto collaterale estremamente spiacevole, spesso motivato da egoismo, rancore, pigrizia, &#8230; o da qualcos&#8217;altro, come la <a href="http://rejex.wordpress.com/2009/04/06/la-sindrome-not-invented-here/">sindrome NIH</a>.</p>
<p>Come può sorgere qualcosa di positivo da un tale tipo di atteggiamento?</em></td>
</tr>
</table>
<p></p>
<p><em>Che ne pensate! ^^</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/foss/'>FOSS</a>, <a href='http://rejex.wordpress.com/category/gnome/'>GNOME</a>, <a href='http://rejex.wordpress.com/category/kde/'>KDE</a>, <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/foss/'>FOSS</a>, <a href='http://rejex.wordpress.com/tag/gnome/'>GNOME</a>, <a href='http://rejex.wordpress.com/tag/jps-law-on-software-expansion/'>JP's Law on Software Expansion</a>, <a href='http://rejex.wordpress.com/tag/kde/'>KDE</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/software/'>Software</a>, <a href='http://rejex.wordpress.com/tag/zawinskis-law-of-software-envelopment/'>Zawinski's Law of Software Envelopment</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11882/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11882/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11882/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11882&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/12/27/sull-espansione-del-software-nel-tempo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2015/12/expand.png" medium="image">
			<media:title type="html">expand</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />
	</item>
		<item>
		<title>&#8220;Copia cinese&#8221; e &#8220;copia giapponese&#8221;&#8230;</title>
		<link>http://rejex.wordpress.com/2011/12/19/copia-cinese-e-copia-giapponese/</link>
		<comments>http://rejex.wordpress.com/2011/12/19/copia-cinese-e-copia-giapponese/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 06:25:21 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Mercato]]></category>
		<category><![CDATA[Competitive intelligence]]></category>
		<category><![CDATA[Copia]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Paycheck]]></category>
		<category><![CDATA[Reverse engineering]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11171</guid>
		<description><![CDATA[È da quando sono bambino che in casa mia sento ripetere questo genere di discorso: &#8220;Esiste una differenza sostanziale fra il modo con cui ci hanno copiato il &#8216;made in Italy&#8217;. Prendi i cinesi: loro ci copiano e basta, puntano all&#8217;imitazione e la qualità non è così importante. I giapponesi invece copiano per migliorare.&#8221; Ora, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11171&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>È da quando sono bambino che in casa mia sento ripetere questo genere di discorso:</p>
<blockquote><p>&#8220;Esiste una differenza sostanziale fra il modo con cui ci hanno copiato il &#8216;made in Italy&#8217;. Prendi i cinesi: loro ci copiano e basta, puntano all&#8217;imitazione e la qualità non è così importante. I giapponesi invece copiano per migliorare.&#8221;</p></blockquote>
<p>Ora, questa frase <strong>ha almeno ventanni</strong>, nel senso che risale al periodo in cui mio papà lavorava per una celebre (<em>allora</em>) ditta italiana che produceva bambole, poi scomparsa più per <em>smania di outsourcing</em> che non per un qualche problema aziendale (<em>così sostiene lui, conti e prodotti alla mano</em>).</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Sia chiaro: l&#8217;intento di questo post non è polemico nè tantomeno razzista (orrore!).</p>
<p>Ho citato i nomi di due popolazioni, quella cinese e quella giapponese, ma in un contesto composto di stereotipi, ossia di presunti celebri &#8220;copiatori&#8221;. Un po&#8217; come quando fanno con noi italiani, appioppandoci pizza e mandolino.</p>
<p>Non è giusto, sono d&#8217;accordo, ma nascondere i nomi avrebbe reso il discorso un po&#8217; troppo generico per i miei gusti.</em></td>
</tr>
</table>
<p></p>
<p><span id="more-11171"></span></p>
<p>In questo post non parlerò di <em><a href="http://it.wikipedia.org/wiki/Outsourcing">outsourcing</a></em> quanto vorrei riallacciarmi alla sopracitata frase, ossia al &#8220;<em>modo di copiare</em>&#8220;.</p>
<p>Sono certo che in essa vi sia una buona dose di risentimento verso chi &#8220;<em>ha rubato il lavoro</em>&#8221; ma, a sentire mio papà, era la qualità finale che proprio non gli andava giù: spostare la produzione ci può stare, ma darla in mano a qualcuno che fa il lavoro al posto tuo, ma lo fa male seppur a prezzi inferiori, è una situazione imbarazzante ed umiliante.</p>
<p>Imbarazzante per il buon nome della ditta che ci (<em>ri</em>)mette il marchio, umiliante per chi viene sostituito e non si capacita di esserlo stato per colpa di qualcuno che lavora peggio e che &#8220;<em>costa meno</em>&#8220;.</p>
<p><font size='+1' color='#005197'>Cosa ho imparato</font></p>
<p>Io sono uno sviluppatore di software, non un ragioniere come mio papà, eppure non passa il tempo che non mi ritrovi in quelle parole. Non per gli stereotipi (<em>anche se motivati dall&#8217;andamento dalla ditta dove lui ha lavorato</em>), ma per il discorso fra le righe.</p>
<p>Il mercato lo fa chi investe, chi innova, chi si espone e rischia, chi ha un po&#8217; di fortuna (<em>o un surrogato</em>). Il resto del mondo può provare a fare altrettanto, ma molto spesso si può accontentare di ispirarsi o &#8220;copiare&#8221; quel che può. Ossia imitare l&#8217;imitabile, possibilmente evitando di finire vittima di qualche battaglia sui brevetti, magari intentata da qualche &#8220;patent troll&#8221; di professione.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Un esempio di &#8220;reimplementazioni&#8221; (eufemismo) di prodotti esistenti è costituito dai cosiddetti <a href="http://en.wikipedia.org/wiki/Clone_(computing)">cloni</a>:</p>
<blockquote><p><a href="http://rejex.files.wordpress.com/2011/12/attack-of-the-clones-jurassic-park-poster.jpg"><img src="http://rejex.files.wordpress.com/2011/12/attack-of-the-clones-jurassic-park-poster.jpg?w=580&#038;h=200" alt="" title="attack-of-the-clones-jurassic-park-poster" height="200" class="alignleft" /></a>In computing, a clone is a hardware or software system that is designed to mimic another system.</p>
<p>Compatibility with the original system is usually the explicit purpose of cloning hardware or low-level software such as operating systems (e.g. AROS and MorphOS are intended to be compatible with AmigaOS).</p>
<p>Application software can be cloned simply by providing similar functionality (all word processors have the same basic purpose), but may also be designed to support specific file formats (e.g., OpenOffice.org is intended to supplant Microsoft Office).</p>
<p>Clones are created for various reasons, including competition, standardization, and availability across platforms.</p></blockquote>
<p></em></td>
</tr>
</table>
<p></p>
<p>Il passo dopo non è da tutti e separa chi copia e basta da chi vuole emrgere: copiare e migliorare, per mantenersi competitivi. Una specie di partita a guardie e ladri dove qualcuno ti copia ma poi si differenzia &#8211; e magari si salva pure dal punto di vista legale &#8211; apportando dei miglioramenti.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Condividere le conoscenze è una cosa estremamente positiva e spesso anche necessaria quando si lavora con altre persone o con altre aziende. Attenzione però a chi ed a come si forniscono informazioni.</p>
<p>Da un articolo recente di <a href="http://www.theregister.co.uk/2008/05/09/bae_stealth_piracy_report/">The Register</a>:</p>
<blockquote><p>
Global arms and aerospace colossus BAE Systems this week released a high-profile audit into its internal ethics and served it up with a big slice of humble pie as it promised to be a better corporate citizen in future.</p>
<p>But even as BAE sought to draw a veil over previous alleged indiscretions, it emerged that US officials have speculated that BAE, collaborating with US firms to build the supersonic, stealthed Joint Strike Fighter (JSF), could have allowed secret American military technology to move overseas, raising the possibility that the UK could benefit from expensive American research and development &#8211; even perhaps sell it around the world. [...]</p></blockquote>
<p></em></td>
</tr>
</table>
<p></p>
<p>Parlare di copie significa chiamare in causa &#8220;processi&#8221; più o meno legali: si va dalla copia spudorata, magari ottenuta rubando segreti industriale, al <a href="http://it.wikipedia.org/wiki/Reverse_engineering">reverse engineering</a> brutale o quello più o meno legale (es: <a href="http://en.wikipedia.org/wiki/Clean_room_design">clean room design</a>).</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Per un esempio di furto di segreti industrali e relativa copia spudorata vi consiglio l&#8217;eccellente libro &#8220;<a href="http://www.amazon.com/Sticky-Fingers-Managing-Economic-Espionage/dp/0595301290/ref=sr_1_7?s=books&amp;ie=UTF8&amp;qid=1324133752&amp;sr=1-7">Sticky Fingers: Managing the Global Risk of Economic Espionage</a>&#8220;: veramente un bel libro.</p>
<p>Se vi affascina il mondo della &#8220;<a href="http://en.wikipedia.org/wiki/Competitive_intelligence">competitive intelligence</a>&#8221; più spinta, ne trovate un breve spezzone nel bel film &#8220;<a href="http://en.wikipedia.org/wiki/Competitive_intelligence">The Corporation</a>&#8220;, in cui parla un professionista di quel settore, Marc Barry.</p>
<p>Se vi interessa infine un esempio cinematografico di &#8220;copia e miglioramento&#8221;, potete trovarlo nel film di fantascienza &#8220;<a href="http://en.wikipedia.org/wiki/Paycheck_(film)">Paycheck</a>&#8220;, tratto da una storia di Dick, precisamente nel lavoro quotidiano del protagonista: </p>
<blockquote><p>&#8220;In the near future, Michael Jennings is a reverse engineer; he analyzes his clients&#8217; competitors&#8217; technology and recreates it, often adding improvements beyond the original specifications. [...]&#8220;</p></blockquote>
<p></em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Restando nel mondo informatico &#8230;</font></p>
<p>Un esempio famoso è il progetto <a href="http://en.wikipedia.org/wiki/Hadoop"><em>Hadoop</em></a>:</p>
<blockquote><p><em>&#8220;Apache Hadoop is a software framework that supports data-intensive distributed applications under a free license. It enables applications to work with thousands of nodes and petabytes of data. Hadoop was inspired by Google&#8217;s MapReduce and Google File System (GFS) papers.&#8221;</em></p></blockquote>
<p>Un progetto che è nato come reimplementazione di un&#8217;idea e pian piano ha preso piede e supporto: l&#8217;elenco delle ditte che lo supportano è lungo. Di qualche giorno fa <a href="http://www.pcworld.com/businesscenter/article/246051/microsoft_azure_hosts_hadoop_other_opensource_apps.html">la notizia</a> che anche Microsoft ha iniziato ad impiegarlo e permetterne l&#8217;uso nella sua piattaforma cloud, Azure. C&#8217;è addirittura <a href="http://rethrick.com/#waving-goodbye">chi dice che ormai sia meglio dell&#8217;originale</a> da cui trae spunto. </p>
<p>Notate il trucco: rendere le &#8220;copie&#8221; OpenSource oppure parteciparne allo sviluppo sembra un buon modo per poter copiare, poi estendere/migliorare ed infine guadagnarci, spendendo il giusto e senza esporsi troppo a livello legale.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2011/12/fun.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Chi dice che l&#8217;OpenSource fa male al capitalismo? (Sarcasmo)</em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Morale della fiaba</font></p>
<p>Con tutto ciò non sto invitando nessuno a copiare il lavoro di nessun altro, sia chiaro. Tuttavia, nel caso questa fosse la vostra scelta, vi invito a non fermarvi alla copia più o meno spudorata, ma a perfezionarla. Se proprio copia deve essere, almeno qualcosa di vostro e di nuovo, mettetecelo.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Rubare le idee di un altro è un atto ingiusto e reprensibile, ma buttarlo fuori dal mercato perchè una reimplementazione delle sue idee costa meno è pure un atto ignobile, di cui vergognarsi. A prescindere da quello che sostiene una certa teoria capitalistica.</em></td>
</tr>
</table>
<p></p>
<p><em>Salire sulle spalle dei giganti</em> per un giretto non previsto è un conto, approfittarne spudoratamente facendosi accompagnare ovunque (<em>cioè una copia spudorata ripetuta sistematicamente nel tempo</em>) è un&#8217;altra cosa.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/mercato/'>Mercato</a> Tagged: <a href='http://rejex.wordpress.com/tag/competitive-intelligence/'>Competitive intelligence</a>, <a href='http://rejex.wordpress.com/tag/copia/'>Copia</a>, <a href='http://rejex.wordpress.com/tag/hadoop/'>Hadoop</a>, <a href='http://rejex.wordpress.com/tag/opensource/'>OpenSource</a>, <a href='http://rejex.wordpress.com/tag/paycheck/'>Paycheck</a>, <a href='http://rejex.wordpress.com/tag/reverse-engineering/'>Reverse engineering</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11171/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11171&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/12/19/copia-cinese-e-copia-giapponese/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2011/12/attack-of-the-clones-jurassic-park-poster.jpg" medium="image">
			<media:title type="html">attack-of-the-clones-jurassic-park-poster</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2011/12/fun.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />
	</item>
		<item>
		<title>Sulla &#8220;razionalizzazione post-acquisto&#8221;&#8230;</title>
		<link>http://rejex.wordpress.com/2011/12/12/sulla-razionalizzazione-post-acquisto/</link>
		<comments>http://rejex.wordpress.com/2011/12/12/sulla-razionalizzazione-post-acquisto/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 06:25:16 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Mercato]]></category>
		<category><![CDATA[Strategie]]></category>
		<category><![CDATA[Brand]]></category>
		<category><![CDATA[Commercio]]></category>
		<category><![CDATA[Razionalizzazione post-acquisto]]></category>
		<category><![CDATA[Specchi dimagrenti]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11821</guid>
		<description><![CDATA[Tempo addietro lessi da qualche parte sulla Rete &#8211; sfortunatamente non trovo più l&#8217;URL &#8211; un articolo in cui si parlava dell&#8217;ennesimo studio scientifico &#8220;particolare&#8221;, in cui veniva &#8220;dimostrato&#8221; il legame indissolubile fra gli acquisti di una persona ed i sui gusti personali. Ovviamente, penso non serva uno studio per capirne la portata, mettere in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11821&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.files.wordpress.com/2011/12/purchases.png"><img src="http://rejex.files.wordpress.com/2011/12/purchases.png?w=200" alt="" title="purchases" width="200" class="alignleft wp-image-11836" /></a>Tempo addietro lessi da qualche parte sulla Rete &#8211; sfortunatamente non trovo più l&#8217;URL &#8211; un articolo in cui si parlava dell&#8217;ennesimo studio scientifico &#8220;particolare&#8221;, in cui veniva &#8220;dimostrato&#8221; il legame indissolubile fra gli acquisti di una persona ed i sui gusti personali.</p>
<p>Ovviamente, penso non serva uno studio per capirne la portata, mettere in dubbio un acquisto può equivalere a mettere in discussione il raziocinio dell&#8217;acquirente.</p>
<p>Come se sbagliare un acquisto fosse una prova della stupidità di una persona&#8230;</p>
<p><span id="more-11821"></span></p>
<p><font size='+1' color='#005197'>Indagando sugli acquisti</font></p>
<p>Non sono uno psicologo nè il marketing è il mio campo, però non credo serva una terza laurea in queste discipline per osservare ed interpretare le reazioni delle persone intorno a noi quando si prova a discutere di acquisti.</p>
<p>Indipendentemente dallo spirito con cui si tratta l&#8217;argomento, critico-indagatore o neutro che sia, è facile osservare che l&#8217;acquirente di turno tende a mettersi sulla difensiva <em>a priori</em>, soprattutto quando gli acquisti non sono esattamente economici o appaiono insoliti rispetto alle sue scelte abituali.</p>
<p>Ovviamente mi metto nel novero, nel senso che in questo non sono diverso da nessuno: il marketing sa il fatto suo (<em>cfr. bel post <a href="http://www.spring.org.uk/2011/03/why-we-buy-how-to-avoid-10-costly-cognitive-biases.php">&#8220;Why We Buy: How to Avoid 10 Costly Cognitive Biases&#8221;</a></em>).</p>
<p>Ad esempio, dovendo parlare di qualcosa appena comprato, si mette le mani avanti fin da subito con frasi come:</p>
<blockquote><p>&#8220;<em>Era in offerta!&#8221;,<br />
&#8220;L&#8217;ho trovato in Rete a poco!&#8221; o<br />
&#8220;Ho risparmiato un anno intero per togliermi questo sfizio!</em>&#8220;</p></blockquote>
<p>In alternativa lo si compara subito con qualcos&#8217;altro, magari ben più costoso e/o meno &#8220;potente&#8221;, in modo da salvarsi &#8220;<em>per comparazione</em>&#8220;.</p>
<p>C&#8217;è addirittura chi mente sul prezzo di acquisto, abbassandolo, pur di passare per un <em>genio-dell&#8217;acquisto-ipescontato</em> o per non farsi sbeffeggiare: salvo i ricchi <em>io-compro-solo-cose-al-top-nei-negozi-al-top-e-mi-bullo-di-questo</em>, il resto del mondo detesta spendere di più per lo stesso oggetto comprato dal vicino.</p>
<p>Tutta questa serie di trucchetti mentali, ho scoperto recentemente, rientra nella cosiddetta <em><strong>razionalizzazione post-aquisto</strong></em> (<em>&#8220;Post-purchase rationalization&#8221;</em>).</p>
<p><font size='+1' color='#005197'>No, non è una malattia!</font></p>
<p>Da <a href="http://en.wikipedia.org/wiki/Post-purchase_rationalization">Wikipedia</a>:</p>
<blockquote><p><em>&#8220;<strong>Post-purchase rationalization</strong> is a cognitive bias whereby someone who purchases an expensive product or service overlooks any faults or defects in order to justify their purchase. It is a special case of choice-supportive bias.&#8221;</em></p></blockquote>
<p>A sua volta, il <em>pregiudizio a supporto delle scelte</em> (<em>choice-supportive bias</em>) è così definito <a href="http://en.wikipedia.org/wiki/Choice-supportive_bias">su Wikipedia</a>:</p>
<blockquote><p>&#8220;In cognitive science, <strong>choice-supportive bias</strong> is the tendency to retroactively ascribe positive attributes to an option one has selected. It is a cognitive bias.&#8221;</p></blockquote>
<p>Sostanzialmente si medita seriamente sull&#8217;acquisto dopo averlo compiuto, cercando scuse per giustificarlo prima con sè stessi e poi, nel caso, a terzi. Penso sia chiaro che una spesa &#8220;insolita&#8221; urti prima noi stessi. <a href="http://en.wikipedia.org/wiki/Cognitive_dissonance">Da Wikipedia</a>:</p>
<blockquote><p><em>&#8220;<strong>Cognitive dissonance</strong> is a discomfort caused by holding conflicting ideas simultaneously. The theory of cognitive dissonance proposes that people have a motivational drive to reduce dissonance. They do this by changing their attitudes, beliefs, and actions. Dissonance is also reduced by justifying, blaming, and denying. [...]</p>
<p>Experience can clash with expectations as, for example, with buyer&#8217;s remorse following the purchase of an expensive item. In a state of dissonance, people may feel surprise, dread, guilt, anger, or embarrassment. People are biased to think of their choices as correct, despite any contrary evidence. This bias gives dissonance theory its predictive power, shedding light on otherwise puzzling irrational and destructive behavior.&#8221;</em></p></blockquote>
<p>Se poi nel frattempo dovessero emergere anche problemi, le &#8220;riflessioni interiori&#8221; aumentano. Come accettare lo smacco di qualcosa che, a caro prezzo, non ci soddisfa del tutto? Come accettare che il nostro costoso acquisto abbia dei difetti?</p>
<p>Gli esempi di sprecano: quello più comune è il vestito di un certo livello, magari più costoso del nostro &#8220;solito&#8221; vestito, che probabilmente indosseremo una sola volta o che &#8220;per magia&#8221; ci sta male appena varchiamo l&#8217;uscio del negozio.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2011/12/fun.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em><a href="http://lei.excite.it/camerini-con-specchi-dimagranti-le-donne-britanniche-N70288.html"><strong>Camerini con specchi dimagranti, le donne protestano</strong></a></p>
<p>Gran Bretagna palcoscenico di una singolare protesta: le donne inglesi infatti si sarebbero accorte (solo ora, vien da dire) che nei negozi di diverse catene di abbigliamento sono utilizzati strategici specchi dimagranti che traggono in inganno le clienti e le invogliano a comprare.</p>
<p>[...] hanno scoperto che, in effetti, diverse note catene di abbigliamento usano il trucco dello specchio magico. Ma come hanno fatto a capirlo? Molto semplice: mettendo davanti allo specchio sospetto un CD, l&#8217;immagine riflessa era ovale.</em></td>
</tr>
</table>
<p></p>
<p>Di esempi ne possiamo fare all&#8217;infinito. Quelli più tragicomici, probabilmente, sono quelli che riguardano i &#8220;fissati&#8221; delle varie marche: in quel caso l&#8217;elemento-<em>brand</em> amplifica ogni cosa.</p>
<p><font size='+1' color='#005197'>I <em>fanatici</em></font></p>
<p>Non vorrei dover citare nuovamente l&#8217;<a href="http://it.wikipedia.org/wiki/IPhone_4#Problemi_tecnici">antenna-gate</a> dell&#8217;iPhone 4, ma &#8211; viva la <a href="http://it.wikipedia.org/wiki/Preterizione">preterizione</a>! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  &#8211; è troppo gustoso e recente come fatto che proprio non mi riesce di trattenermi.</p>
<p>Non mi interessa il fatto tecnico in sè. Quello che veramente mi ha tramortito &#8211; al limite del tipo di risata definita dall&#8217;acronimo <a href="http://en.wiktionary.org/wiki/LMAO"><em>LMAO</em></a> &#8211; sono state le &#8220;<em>arrampicate sugli specchi</em>&#8221; di alcuni acquirenti per &#8220;<em>giustificare</em>&#8221; il bug, l&#8217;acquisto e quindi sè stessi. Curiosa questa sorta di &#8220;<em>catena di responsabilità</em>&#8220;: dall&#8217;oggetto costoso alla persona in carne ed ossa che l&#8217;ha comprato.</p>
<p>Ho sentito e letto di tutto. Da chi sparava ad alzo zero contro la concorrenza asiatica (<em>se avete pensato qualcosa come &#8220;i soliti comunisti sud-coreani!&#8221;, la battuta è divertente ma geograficamente e politicamente errata</em>), a chi minimizzava il problema dicendo di non averlo ancora incontrato o che si trattasse di una &#8220;leggenda urbana&#8221;, chi reagiva d&#8217;impeto con vari improperi verso gli intervistatori, eccetera.</p>
<p>Esattamente come i politici che cercano di dirottare le domande scomode sugli avversari: quando iniziano con &#8220;<em>e voi allora, che&#8230;</em>&#8221; o con &#8220;<em>non accetto lezioni da &#8230;</em>&#8221; sostanzialmente stanno ammettendo le colpe, ma non apertamente.</p>
<p>Il &#8220;consumatore&#8221; che diventa &#8220;difensore&#8221; di una marca specifica, penso rappresenti l&#8217;<em>azimut</em> del marketing per la marca stessa: più una persona diventa un &#8220;fan&#8221; dei prodotti di una qualche ditta, più &#8220;ci mette la faccia&#8221;, più ne prenderà a cuore la difesa.</p>
<blockquote><p><em><a href="http://techreport.com/discussions.x/21294"><strong>The science of fanboyism</strong></a></p>
<p>&#8220;We&#8217;ve all encountered them. They lurk in Internet message boards, comment threads, and chatrooms. Addressing anyone and everyone, they type up lengthy tirades with Cheeto-stained fingers, extolling the virtues of their product or brand of choice. They angrily accuse even the most impartial reviewers of taking handouts from reviled competitors of a beloved company, and they casually and systematically dismiss any evidence that might conflict with their worldview.</p>
<p>They&#8217;re known in our parlance as fanboys.&#8221;</em></p></blockquote>
<p><font size='+1' color='#005197'>Non è solo una questione di marche</font></p>
<p>Non vorrei passare per un saputello. Come ho detto, io stesso sono incline e vittima di questo meccanismo di razionalizzazione sugli acquisti. In realtà, credo, lo stesso discorso esuli da quell&#8217;aspetto commerciale, ossia interessi le scelte compiute.</p>
<p><strong>Scegliere è in qualche modo esporsi</strong>. Tanto tempo fa, quando ho attraversato il mio momento da <a href="http://rejex.wordpress.com/2011/03/21/fissato-col-foss/">fissato del FOSS</a>, mi ero spinto ben oltre quello che avrei voluto e dovuto fare: quando ci si fissa con qualcosa, si finisce ad eccedere nella sua difesa e, di riflesso, nella propria.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Curiosamente il FOSS non è un &#8220;brand&#8221; in senso stretto, ma è più una filosofia di vita, forse. Tuttavia molti dei suoi difensori lo fanno sembrare tale. Per non parlare dei veri &#8220;brand&#8221;, che lo usano come un elemento di marketing.</p>
<p>Un po&#8217; come la <a href="http://it.wikipedia.org/wiki/Green_economy"><strong>green economy</strong></a>: è una bella cosa, piace e suona bene, alleggerisce un poco la coscienza, fa presa sui &#8220;cuori&#8221; del pubblico &#8211; inclusi gli ambientalisti, incredibile! &#8211; e, cosa non da poco, è un marchio che in questo momento tira molto.</p>
<p>In questi casi, dove è il limite fra il promuovere il rispetto dell&#8217;ambiente ed il marketing di un prodotto?</em></td>
</tr>
</table>
<p></p>
<p>Schierarsi mette in moto qualcosa attorno a noi che va oltre noi stessi: in breve, mi ero costruito la nomea di &#8220;Pinguino&#8221;, un fatto che di per sè stesso non mi ha mai dato fastidio. Il problema è che quando qualcuno ti appioppa un&#8217;etichetta e tu non fai nulla per levartela di dosso (<em>o, peggio, incoraggi chi hai davanti a farlo</em>), finisce che ogni tua opinione, oggettiva o meno, viene interpretata come soggetta ad un ovvio pregiudizio di fondo. Un po&#8217; come chiedere un parere politico a qualcuno che ha in tasca la tessera di un partito.</p>
<p>Di più: la gente di aspetta che tu risponda sempre allo stesso modo. Se nel tempo rivedi la tua posizione, ammorbidendola o stravolgendola, passi automaticamente nella categoria &#8220;voltagabbana&#8221; e perfino &#8220;ingrato&#8221;.</p>
<p>Sostanzialmente sto dicendo che se sei un &#8220;<em>fanboy</em>&#8221; di qualcosa o la gente attorno a te ti percepisce come tale, è facilissimo finire in una spirale sempre più stretta in cui, ad un tratto, ti accorgi che stai &#8220;svolgendo una parte&#8221; da cui è difficile uscire. La spirale può portarti a dire cose che non ti saresti mai sognato di dire e quindi, per non rimetterci la faccia, difendere ad oltranza l&#8217;indifendibile. Non è facile cambiare idea &#8220;pubblicamente&#8221;, perchè la cosa ha un impatto non indiffferente anche sul piano sociale.</p>
<p>Nel tempo, non ho paura di dirlo, ho ammorbidito molto la mia visione sul software commerciale. In parte perchè faccio parte di quel mondo &#8211; non sono ipocrita -, in parte perchè nel frattempo ho parlato con un bel po&#8217; di persone e ho capito che &#8220;ammettere di aver ecceduto&#8221; non equivale a dichiararsi incapaci di intendere e di volere.</p>
<p>La stessa cosa negli acquisti: siccome ho imparato che nel prezzo di un bene concorrono alcune voci che non sono funzione della somma dei costi per realizzarlo e promuoverlo, non esito a condannare me stesso quando compro qualcosa di cui non ho davvero bisogno o per il quale potevo spendere di meno.</p>
<p>Credo che questo tentativo, per quanto di minima portata, sia un buon modo per cominciare a spezzare il vantaggio strategico del marketing su di me. Non funziona sempre, ma alcune piccole soddisfazioni me le sono tolte: di tanto in tanto <strong>il ricordo del rimorso dell&#8217;ultimo incauto acquisto razionalizzato mi spinge ad evitarne di nuovi con troppa facilità.</strong></p>
<p>Non voglio sentirmi nuovamente a disagio per un acquisto di cui non posso essere soddisfatto al 100%.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/mercato/'>Mercato</a>, <a href='http://rejex.wordpress.com/category/strategie/'>Strategie</a> Tagged: <a href='http://rejex.wordpress.com/tag/brand/'>Brand</a>, <a href='http://rejex.wordpress.com/tag/commercio/'>Commercio</a>, <a href='http://rejex.wordpress.com/tag/mercato/'>Mercato</a>, <a href='http://rejex.wordpress.com/tag/razionalizzazione-post-acquisto/'>Razionalizzazione post-acquisto</a>, <a href='http://rejex.wordpress.com/tag/specchi-dimagrenti/'>Specchi dimagrenti</a>, <a href='http://rejex.wordpress.com/tag/strategie/'>Strategie</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11821/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11821/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11821/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11821/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11821/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11821/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11821/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11821/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11821/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11821/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11821/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11821/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11821/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11821/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11821&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/12/12/sulla-razionalizzazione-post-acquisto/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/12/purchases.png" medium="image">
			<media:title type="html">purchases</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/12/fun.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />
	</item>
		<item>
		<title>L&#8217;importanza di scegliere un modello di sviluppo per sè stessi&#8230;</title>
		<link>http://rejex.wordpress.com/2011/12/05/limportanza-di-scegliere-un-modello-di-sviluppo-per-se-stessi/</link>
		<comments>http://rejex.wordpress.com/2011/12/05/limportanza-di-scegliere-un-modello-di-sviluppo-per-se-stessi/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 06:25:56 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Bear Programming]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Metodologie Agili]]></category>
		<category><![CDATA[Metodologie di sviluppo]]></category>
		<category><![CDATA[No SIlver Bullet]]></category>
		<category><![CDATA[Pair Programming]]></category>
		<category><![CDATA[Skunk Works]]></category>
		<category><![CDATA[Skunkworks]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11630</guid>
		<description><![CDATA[Esiste un&#8217;enorme quantità di modelli/metodologie di sviluppo. Ce ne sono così tanti che è davvero difficile non trovarne uno adatta a sè stessi. Mi accorgo però che, ripensando anche alla mia formazione accademica, parlare di queste tematiche sembra un voler &#8220;vendere fumo&#8220;, una vera e propria perdita di tempo. In questo post vorrei chiarire qualche [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11630&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Esiste un&#8217;enorme quantità di modelli/metodologie di sviluppo. Ce ne sono così tanti che è davvero difficile non trovarne uno adatta a sè stessi. Mi accorgo però che, ripensando anche alla mia formazione accademica, parlare di queste tematiche sembra un voler &#8220;<em>vendere fumo</em>&#8220;, una vera e propria perdita di tempo.</p>
<p>In questo post vorrei chiarire qualche punto che mi sta decisamente a cuore.</p>
<p><span id="more-11630"></span></p>
<p><font size='+1' color='#005197'>1. Cosa è una metodologia in soldoni?</font></p>
<p>Una metodologia è prima di tutto un modo rigoroso di fare le cose. Medesimo discorso parlando di filosofia o di modelli di sviluppo: cambiano i termini &#8211; spesso usati un po&#8217; a casaccio, come fossero sinonimi perfetti -, ma il succo è quello.</p>
<p>Quando uno sviluppatore si ferma per un attimo e cerca di riassumere cosa ha imparato fin lì, quali sono gli aspetti migliori e ripetibili del suo lavoro, quali sono i passi che sistematicamente ripercorre, ecco che sta già riflettendo sul suo personale modo di operare. Di più: se riesce ad individuare un filo conduttore, un <em>pattern</em> comportamentale ricorrente, probabilmente sta già avvicinandosi alla sua <strong>personalissima</strong> metodologia.</p>
<p>Detto questo possiamo aprire il discorso anche alle numerosissime e più o meno rigorose nonchè famose metodologie di sviluppo (<em>es: <a href="http://it.wikipedia.org/wiki/Metodologia_agile">metodologie agili</a></em>) che riempiono libri e <em>paper</em> a profusione. </p>
<p>O forse no: non importa quale metodologia uno segua. L&#8217;importante è che scelga quella più adatta a lui e, nel caso non esista già, crearla. L&#8217;importante è estrarre il modo di fare le cose per ripeterle in modo sistematico, senza forzarsi a farlo o perchè &#8220;<em>qualcuno ha detto di fare così</em>&#8220;.</p>
<p>Se ci si forza a fare le cose sempre allo stesso modo, anche quando non serve, si finisce poi a voler usare il proverbiale &#8220;<em>martello</em>&#8221; ovunque:</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em><strong><a href="http://en.wikipedia.org/wiki/Law_of_the_instrument">Law of the instrument</a></strong> (<a href="http://en.wikipedia.org/wiki/Abraham_Maslow">A. Maslow</a>):</p>
<blockquote><p>&#8220;It is tempting, if the only tool you have is a hammer, to treat everything as if it were a nail.&#8221;</p></blockquote>
<p></em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>2. Sceglierne una non equivale ad escludere le altre</font></p>
<p>Voglio qui ora affermare, in modo esplicito e diretto, un semplice concetto: <strong>non esiste una singola metodologia di sviluppo o un metodo/modello/filosofia/<em>quello-che-vi-pare</em> che vada bene a chiunque ed in tutti i contesti</strong>.</p>
<p>Questo fatto lapalissiano evidentemente tanto lapalissiano non è: viene spesso dimenticato con l&#8217;ovvia conseguenza delle continue <em>guerre di religione</em> fra i fautori di questa e quella metodologia che, al pari dei tifosi di una squadra di calcio, stravedono solo per la loro fazione, ed escludono le altre <em>a priori</em>.</p>
<p>In ambito informatico, voler essere troppo ortodossi nel rispettare alla lettera una qualche metodologia è come decidere di farsi dettare, punto per punto, il proprio lavoro: ho conosciuto persone che, trovatesi bene lavorando in un certo modo, lo impongono a loro stessi e a chiunque abbia la malaugurata idea di porsi loro di fronte.</p>
<p>Per questo genere di persona non esiste provare, sperimentare altro: trovata la loro scelta, quella è e quella rimarrà, almeno che non succeda qualcosa di grave (<em>ma davvero grave</em>), tale da costringerle al cambiamento. Una variazione estrema nonchè rischiosissima del celebre motto:</p>
<blockquote><p><em>Squadra che vince non si cambia.</em></p></blockquote>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Mai farsi <em>ingabbiare</em> da un insieme di regole troppo stringenti, mai accettare un &#8220;<a href="http://it.wikipedia.org/wiki/Lavaggio_del_cervello">lavaggio del cervello</a>&#8221; metodologico in nome di qualche presunto e duraturo beneficio. Basta davvero poco per passare dall&#8217;ortodossia nel rispettare un metodo al puro fanatismo e quindi alle guerre di religione.</em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>3. Non esiste una scelta assolutamente ottima</font></p>
<p>Non esiste una scelta ottima perchè i vari lavori, per quanto possano assomigliarsi, non sono mai esattamente uguali: il fatto che l&#8217;applicazione di un metodo in un certo contesto si sia rivelata una scelta azzeccata, non dovrebbe renderla l&#8217;<em>Unica Opzione</em>. Al massimo, dovrebbe renderla <em>una</em> delle opzioni favorite nel futuro.</p>
<p>Questo perchè nessuna metodologia, o metodo o filosofia è la migliore ed universalmente applicabile con successo: diffidate da chi vi promette la Luna se seguirete questa o quella metodologia. Nell&#8217;ambito della crittografia si parlerebbe di <a href="http://en.wikipedia.org/wiki/Snake_oil_(cryptography)"><em>snake oil</em></a>, con lo stesso medesimo significato: &#8220;<em>prodotto truffaldino o fasullo</em>&#8220;.</p>
<p>Analogamente non esiste &#8211; e probabilmente non esisterà mai &#8211; qualcosa in grado di aumentare <em>automagicamente</em> ed enormemente la produttività (<em>qualunque cosa essa sia</em>) o l&#8217;efficienza di un lavoro semplicemente applicandola.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em><strong><a href="http://en.wikipedia.org/wiki/No_Silver_Bullet">No Silver Bullet</a></strong> (<a href="http://en.wikipedia.org/wiki/Fred_Brooks">F. Brooks</a>):</p>
<blockquote><p>&#8220;There is no single development, in either technology or management technique, which by itself promises even one order of magnitude [tenfold] improvement within a decade in productivity, in reliability, in simplicity.&#8221;</p></blockquote>
<p></em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Il solito esempio personale</font></p>
<p>La mia posizione, circa le varie metodologie di sviluppo più famose è di <strong><em>scetticismo a priori</em></strong> (<em>cfr. <a href="http://rejex.wordpress.com/2011/08/08/recensione-agile-project-management-with-scrum/">recensione</a> di un libro sulla metodologia agile <a href="http://it.wikipedia.org/wiki/Scrum">Scrum</a></em>).</p>
<p>Forse perchè è naturale aspettarsi che chi ti vende qualcosa &#8211; ad esempio un libro &#8211; tenda ad esaltare i vantaggi della materia trattata e a dimenticarsi degli aspetti negativi o a diminuirne l&#8217;importanza.</p>
<p>La mia strategia sulle varie metodologie col tempo è divenuta <a href="http://it.wikipedia.org/wiki/Sincretismo"><strong><em>sincretica</em></strong></a>: fusione delle parti che reputo migliori, prese da ciascuna di esse. Nel caso di contrapposizione fra concetti &#8211; capita spesso che due metodologie si scontrino più o meno apertamente su determinati aspetti -, compio una scelta esclusiva.</p>
<p>Ad esempio mi piacciono singoli aspetti di <em>Scrum</em>, dell&#8217;<a href="http://it.wikipedia.org/wiki/Extreme_Programming"><em>Extreme Programming</em></a>, del <em>Tracer-Bullet Development</em>, eccetera. Tuttavia rifiuto di adottarne una &#8211; ed una soltanto &#8211; in nome della <strong>flessibilità di impiego</strong> nell&#8217;assemblarne una mia.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>In &#8220;<a href="http://it.wikipedia.org/wiki/Lord_of_war"><strong>Lord of War</strong></a>&#8220;, uno dei miei film preferiti, ad un tratto comprare questa <a href="http://it.wikiquote.org/wiki/Lord_of_War">bellissima frase</a>:</p>
<blockquote><p><em>&#8220;Ogni fazione in Africa si attribuisce questi nobili nomi: Libertà, Patriottismo, Repubblica Democratica. Credo che loro non ammetterebbero mai quello che sono in realtà, i peggiori oppressori degli ultimi oppressori. Spesso le maggiori atrocità avvengono quando entrambe le parti in lotta si proclamano combattenti per la libertà.&#8221;</em></p></blockquote>
<p>Credo che lo stesso tipo di ragionamento si possa applicare anche ad un discreto numero di metodologie &#8220;mainstream&#8221;: molte di esse parlano apertamente di flessibilità d&#8217;uso, di rifiuto dei fanatismi, di &#8220;libertà&#8221; del programmatore, eccetera.</p>
<p>Salvo poi indicarti &#8211; ooops! &#8211; schemi ultraprecisi da seguire e a prova di &#8220;eretico&#8221;, &#8220;consigli&#8221; più o meno velati sui libri da comprare, training &#8220;ufficiali&#8221; da frequentare (ovviamente tutti a caro prezzo), certificazioni da ottenere, eccetera, eccetera.</p>
<p>Non di rado da una metodologia si dipartono poi nel tempo varie &#8220;scuole di pensiero&#8221;, ognuna con i suoi pseudo-dogmi, i suoi pseudo-guru di riferimento, spesso &#8220;discepoli&#8221; del o dei &#8220;fondatori&#8221;.</p>
<p>Non di rado, infine, si aprono &#8220;guerre di religione&#8221; fra gli &#8220;adepti&#8221; delle varie metodologie.</em></td>
</tr>
</table>
<p></p>
<p><a href="http://en.wikipedia.org/wiki/Pair_programming"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Pair_programming_1.jpg/330px-Pair_programming_1.jpg" alt="" width="150" class="alignleft" /></a> Il <a href="http://en.wikipedia.org/wiki/Pair_programming"><em><strong>pair programming</em></strong></a>, ad esempio, sulla carta è un modo di scrivere e <em>debuggare</em> il codice molto interessante e probabilmente anche utile.</p>
<p>Tuttavia, salvo rari casi (<em>mentoring?</em>), è difficile pensare di adottarlo in pianta stabile, tantomeno dimostrarne in modo incontrovertibile l&#8217;efficienza/efficacia: sembra di sentire quella barzelletta sui carabinieri, che fanno sempre le cose in due ed uno si limita ad osservare o supervisionare.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2011/12/fun.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em><strong><a href="http://cm.bell-labs.com/cm/cs/tpop/debugging.html">Bear programming</a></strong> (<a href="http://en.wikipedia.org/wiki/Brian_Kernighan">B. W. Kernighan</a> e <a href="http://en.wikipedia.org/wiki/Rob_Pike">R. Pike</a>):</p>
<blockquote><p><a href="http://harvest.tumblr.com/post/3345003136/pair-bear-programming"><img src="http://28.media.tumblr.com/tumblr_lgroj48yWk1qz9v6wo1_500.png" alt="" width="150" class="alignright" /></a>“Another effective technique is to explain your code to someone else.</p>
<p>This will often cause you to explain the bug to yourself.  Sometimes it takes no more than a few sentences, followed by an embarrassed &#8220;Never mind, I see what&#8217;s wrong.  Sorry to bother you.&#8221;</p>
<p> This works remarkably well; you can even use non-programmers as listeners.  One university computer center kept a teddy bear near the help desk.  Students with mysterious bugs were required to explain them to the bear before they could speak to a human counselor.”</p></blockquote>
<p></em></td>
</tr>
</table>
<p></p>
<p>Credo che il punto principale sia proprio quello: <strong>è fondamentale imparare quanto più possibile di tutto, per scegliere al momento opportuno quale strada percorrere, ma fra più opzioni, non una sola</strong>. Il trucco sta nell&#8217;<em>infischiarsene</em> bellamente se su un dato libro di un certo autore su una data metodologia viene detto che, se non la si segue tutta ed in modo rigoroso, accadranno le &#8220;<em>peggio cose</em>&#8220;.</p>
<p>La mia personale strategia, alla base del mio sopra-citato &#8220;sincretismo metodologico&#8221;, è quello che gli anglofoni definiscono <em>cherry-picking</em>, ossia prendere qui e là le idee che reputo migliori e confezionare qualcosa di nuovo. Mi sono perfino capitati diversi casi in cui ho adottato una certa strategia o metodologia per poi ritrovarmi ad usarne una &#8220;opposta&#8221; in un altro progetto.</p>
<p>Questo vale anche per le <em><a href="http://en.wikipedia.org/wiki/Coding_conventions">coding convention</a></em>. Esempio classico, &#8220;metodologico&#8221; per come opero io: detesto lo stile di indentazione K&amp;R e nei progetti che seguo io, se posso, lo evito. Ma dovendo estendere del codice altrui già esistente e/o dovendo scrivere del codice in un linguaggio in cui è la norma, allora me ne faccio una ragione perchè reputo <strong>la consistenza del codice più importante dell&#8217;aspetto esteriore o dei miei gusti</strong>. Questa regolina fa parte della la mia personalissima &#8220;scala dei valori&#8221; nonchè del mio modo di fare.</p>
<p>Detto questo, possiamo aprire il discorso <em>sogni</em>.</p>
<p><font size='+1' color='#005197'><em>Skunkworks</em></font></p>
<p>Ogni sviluppatore presto o tardi si &#8220;invaghisce&#8221; professionalmente di qualcosa o di qualcuno, diventandone una sorta di &#8220;fan&#8221;. Il mio modello/non-modello preferito nonchè <em>sogno-ultimo-definitivo</em> si chiama <a href="http://en.wikipedia.org/wiki/Skunkworks"><em>Skunk Works</em></a>:</p>
<blockquote><p><em>Skunk Works is an official trademark for the Lockheed Martin Advanced Development Programs (formerly Lockheed Advanced Development Projects).</p>
<p>The designation &#8220;skunk works&#8221;, or &#8220;skunkworks&#8221;, is widely used in business, engineering, and technical fields to describe a group within an organization given a high degree of autonomy and unhampered by bureaucracy, tasked with working on advanced or secret projects.</em></p></blockquote>
<p><a href="http://rejex.files.wordpress.com/2015/11/sr71-blackbird.jpg"><img src="http://rejex.files.wordpress.com/2015/11/sr71-blackbird.jpg?w=150" alt="" title="sr71-blackbird" width="150" class="alignleft wp-image-11706" /></a>Perchè? Semplice: chiunque sia stato in grado di produrre l&#8217;<a href="http://en.wikipedia.org/wiki/SR71">SR71 &#8220;Blackbird&#8221;</a>, il mio aereo militare preferito fin da quando ero bambino (nonchè base dell&#8217;<a href="http://en.wikipedia.org/wiki/Blackbird_(comics)">aereo degli X-Men</a>), sa il fatto suo. E i tizi in questione hanno progettato gran parte degli aerei militari più &#8220;spettacolari&#8221; in circolazione, per cui conoscono davvero bene il loro mestiere.</p>
<p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Sia chiaro: non sono mai stato un &#8220;guerrafondaio&#8221; e nemmeno un amante delle armi. Tuttavia, da tecnico, non posso non rimanere affascinato dai continui e ben foraggiati progressi della tecnologia bellica. Non a caso il &#8220;Blackbird&#8221; non era un caccia ma un ricognitore strategico statunitense, capace di una velocità di Mach 3+.</em></td>
</tr>
</table>
<p></p>
<p>Anzi, sono così bravi nel loro ambito che ormai il nome del loro dipartimento è diventato l&#8217;emblema del loro modo di lavorare e viceversa:</p>
<blockquote><p><em>&#8220;A skunkworks project is one typically developed by a small and loosely structured group of people who research and develop a project primarily for the sake of radical innovation. [...]</p>
<p>A skunkworks project often operates with a high degree of autonomy and unhampered by bureaucracy, tasked with working on advanced or secret projects. These projects are often undertaken in secret with the understanding that if the development is successful then the product will be designed later according to the usual process.&#8221;</em></p></blockquote>
<p><strong>Innovazione radicale al limite del dovere alla segretezza, autonomia e poca burocrazia</strong>: credo sia il sogno di qualunque sviluppatore. Lo è anche il diventare un simbolo di efficienza, ovviamente.</p>
<p>Come dite? Non è un modello ma una filosofia o un contesto operativo o una metodologia? Beh, a dispetto della scelta della terminologia che si può impiegare per definirlo, &#8220;<em>skunkworks</em>&#8221; continua ad essere il mio <em>punto di riferimento &#8220;onirico&#8221;</em> ad alto livello, su cui poi <em>innestare</em> tutto il resto.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/bear-programming/'>Bear Programming</a>, <a href='http://rejex.wordpress.com/tag/extreme-programming/'>Extreme Programming</a>, <a href='http://rejex.wordpress.com/tag/metodologie-agili/'>Metodologie Agili</a>, <a href='http://rejex.wordpress.com/tag/metodologie-di-sviluppo/'>Metodologie di sviluppo</a>, <a href='http://rejex.wordpress.com/tag/no-silver-bullet/'>No SIlver Bullet</a>, <a href='http://rejex.wordpress.com/tag/pair-programming/'>Pair Programming</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/skunk-works/'>Skunk Works</a>, <a href='http://rejex.wordpress.com/tag/skunkworks/'>Skunkworks</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11630/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11630/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11630/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11630&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/12/05/limportanza-di-scegliere-un-modello-di-sviluppo-per-se-stessi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Pair_programming_1.jpg/330px-Pair_programming_1.jpg" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2011/12/fun.png" medium="image" />

		<media:content url="http://28.media.tumblr.com/tumblr_lgroj48yWk1qz9v6wo1_500.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2015/11/sr71-blackbird.jpg" medium="image">
			<media:title type="html">sr71-blackbird</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />
	</item>
		<item>
		<title>Il primo, vero utente della documentazione&#8230;</title>
		<link>http://rejex.wordpress.com/2011/11/28/il-primo-vero-utente-della-documentazione/</link>
		<comments>http://rejex.wordpress.com/2011/11/28/il-primo-vero-utente-della-documentazione/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 06:25:10 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Automedicazione]]></category>
		<category><![CDATA[Documentazione]]></category>
		<category><![CDATA[RTFM]]></category>
		<category><![CDATA[Troubleshooting]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11637</guid>
		<description><![CDATA[Documentare le cose richiede generalmente una buona quantità di tempo e di fatica: è incredibile quante parole si riescano e si debbano spendere anche per lavori di taglia modesta. Di più: non è raro che lo sforzo di gestire le scartoffie ecceda quello di produrre le cose a cui si riferiscono. Il trucco più banale [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11637&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Documentare le cose richiede generalmente una buona quantità di tempo e di fatica: è incredibile quante parole si riescano e si debbano spendere anche per lavori di taglia modesta. Di più: non è raro che lo sforzo di gestire le <em>scartoffie</em> ecceda quello di produrre le cose a cui si riferiscono.</p>
<p><span id="more-11637"></span></p>
<p>Il trucco più banale è che la documentazione &#8220;viva&#8221; parallelamente a ciò a cui si riferisce: un conto è doverla scrivere a lavoro concluso, un conto è farlo pian piano, a lavoro in corso.</p>
<p>Inoltre, per esperienza, fare le cose a lavoro concluso coincide spesso col doverle fare di fretta, all&#8217;ultimo momento utile. O, peggio, a distanza di qualche tempo, il che espone il <em>documentante</em> a dover ricostruire mentalmente e poi mettere nero su bianco quello che ha fatto.</p>
<p>A parte tutto questo, abbastanza logico e banale, vorrei sottolineare un paio di cose.</p>
<p><font size='+1' color='#005197'>Documentare è dimostrare</font></p>
<p><a href="http://rejex.files.wordpress.com/2011/11/documentation.png"><img src="http://rejex.files.wordpress.com/2011/11/documentation.png?w=150" alt="" title="documentation" width="150" class="alignleft size-medium wp-image-11649" /></a>Dal momento che, per ragioni pratiche, la documentazione viene generalmente scritta di pari passo con il relativo lavoro, essa appare come <strong>dimostrazione chiara ed accessibile</strong> del lavoro stesso: nessuna persona seria si sogna di scrivere di aver fatto qualcosa quando in realtà non l&#8217;ha compiuta; piuttosto scriverà meno, per omissione deliberata o per dimenticanza, non di più.</p>
<p>Corollario: la documentazione, se scritta in modo comprensibile, è l&#8217;equivalente di un &#8220;reperto&#8221; valido ed intellegibile per la &#8220;corte&#8221;-committente. Il codice di per sè stesso non è pressoché mai una prova accettabile, almeno fintanto che non lo si manda in esecuzione e si verifica che faccia tutto quello che dovrebbe fare.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Una buona documentazione è una valida autocertificazione del vostro operato.</em></td>
</tr>
</table>
<p><font size='+1' color='#005197'>Istantanea della situazione attuale</font></p>
<p>Se la documentazione viene scritta ed aggiornata di pari passo col lavoro, essa riflette esplicitamente lo stato di avanzamento lavori. </p>
<p>Nessuno vieta di mantenersi una traccia delle novità introdotte nel tempo (<em><a href="http://it.wikipedia.org/wiki/Changelog">changelog</a></em>), in modo da poter ricostruire i vari momenti di lavori (e le feauture inserite) anche e soprattutto in un secondo momento. Tuttavia, a differenza di un documento di specifica, non è utile nè elegante accludere l&#8217;eventuale <em>changelog</em> direttamente nella documentazione stessa.</p>
<p>Il cliente-medio non ha tempo nè voglia di spulciare in profondità anche quel tipo di informazione-extra &#8211; le novità introdotte a partire da una data versione -, per cui quello che deve ottenere deve essere sempre e solo l&#8217;ultima versione nota della documentazione, senza indicazioni di revisione o altro. Questo non significa però che, fornendo al committente una nuova e completa edizione della documentazione, non gli si possano anche indicare, magari in un altro piccolo documento (<em>mail?</em>) le singole novità rispetto alla versione precedente (<em>riassumere le modifiche rispetto a più di una versione fa rispetto a quella attuale, diventa improponibile e via via sempre più inutile</em>).</p>
<p>Nuovamente, la documentazione ed il suo eventuale <em>changelog</em> possono servire come <em>prova</em> chiare ed esibibile. </p>
<p>D&#8217;altra parte è ben difficile ricostruire la storia di un progetto partendo dal <em>log</em> dei <em><a href="http://en.wikipedia.org/wiki/Commit">commit</a></em> di un <em><a href="http://en.wikipedia.org/wiki/Software_versioning">versioning</a>/<a href="http://en.wikipedia.org/wiki/Revision_control">revision control</a></em> come <a href="http://it.wikipedia.org/wiki/Subversion">Subversion</a> o <a href="http://it.wikipedia.org/wiki/Git_(software)">Git</a>: nei sistemi come SVN ci finisce di tutto, soprattutto dettagli di basso livello (<em>es: modifiche al codice</em>) che poco hanno a che spartire con la documentazione di più alto livello.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Un conto è la documentazione del codice, un conto è la documentazione del progetto. Non confondete i livelli altrimenti correrete il rischio di porgere una mela a chi vi chiede una pera.</em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Il primo, vero utente della documentazione</font></p>
<p>Non ho stime o percentuali da riportare &#8211; supposto ne esistano &#8211; ma non mi pare proprio che la documentazione goda di grande successo presso il pubblico/utente finale (<em>eufemismo</em>): quante volte avete (<em>abbiamo</em>) comprato qualcosa e avete (<em>abbiamo</em>) deciso di usarlo subito, senza guardare la documentazione? Diciamocelo: il manuale viene letto quando le cose stanno già andando male o quando le cose non sono abbastanza facili ed intuitive da essere usate.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Sarò eretico: così come nella mia testa ogni nuova legge che uno Stato introduce è una sconfitta per la porzione di genere umano che esso amministra, incapace di stare a suo posto senza imposizioni dall&#8217;alto, ritengo che costringere l&#8217;utente medio a dover leggere un manuale per poter compiere azioni ragionevolmente banali con un prodotto sia uno scorno alla sua intelligenza ed ad una serie di &#8220;paroline magiche&#8221; come <a href="http://it.wikipedia.org/wiki/Usabilit%C3%A0">usabilità</a>, <a href="http://it.wikipedia.org/wiki/Accessibilit%C3%A0_(informatica)">accessibilità</a>, eccetera.</p>
<p>Detto questo e a prescindere dalla credenza popolare &#8211; che tende a fare di tutta l&#8217;erba un fascio &#8211; <strong>non tutto è sempre così intrinsecamente facile da non necessitare di un manuale per essere utilizzato</strong>, soprattutto quando c&#8217;è in gioco la vita di qualcuno. Continuare a semplificare le cose con la speranza di renderle alla portata di tutti può significare ridurre o limitare certe funzionalità, scontentando un po&#8217; tutti.</em></td>
</tr>
</table>
<p></p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Trovandomi recentemente a dover cambiare la batteria ad una bilancia elettronica da cucina da circa 30€, tutto mi sarei aspettato tranne il dover premere un&#8217;astrusa combinazione di tasti prima e dopo la sostituzione fisica della batteria per avviare la complicata fase di ricalibratura dello strumento. Fra l&#8217;altro una combinazione di tasti degna del peggiore dei videogiochi sulla piazza.</p>
<p>A quel punto il manuale utente, che alla fine mi sono rassegnato a consultare, ha certificato, qualora ve ne fosse il dubbio, l&#8217;incontestabile imbecillità di chi ha pensato quell&#8217;assurda procedura.</em></td>
</tr>
</table>
<p></p>
<p>Col software è la stessa cosa. Ditemi quante persone conoscete che hanno iniziato ad usare il computer avendo prima letto, almeno in parte, un qualche manuale. Probabilmente risponderete 1 o 2 in tutta la vostra vita e questi individui rientrano nella categoria paranoide al limite del <em>mi-muovo-solo-se-ben-informato-perchè-se-no-lo-rompo</em> per cui non contano ai fini statistici.</p>
<p>Per cui, non potendo comunque evitare di scrivere la documentazione, la domanda che ogni persona si dovrebbe porre è: chi è il suo primo pubblico e quale dovrebbe essere il suo scopo essenziale?</p>
<p>Rispondere è facile: <strong>il primo utente e pubblico è lo sviluppatore stesso ed il suo scopo è levarlo d&#8217;impiccio dalle emergenze del cliente</strong>.</p>
<p>Invece di perdersi in parole e parole per spiegare fin da subito, nei più infimi ed inutili dettagli, ogni singola funzionalità integrata, che nessuno ragionevolmente userà mai, basta spiegare al meglio come risolvere i problemi (<em>troubleshooting</em>) più comuni, come effettuare operazioni particolari o avanzate, come contattare il supporto e/o a chi rivolgersi in caso di necessità. <strong>Questi gli aspetti prioritari, poi ovviamente tutti gli altri</strong>.</p>
<p>La documentazione prolissa, al pari di quella sintetica e precisa, con tutta probabilità verrà ignorata fino a quando non sarà davvero necessario. Tuttavia, visto il momento più probabile in cui verrà effettivamente utilizzata nonchè la fretta di arrivare ad una piena soluzione, la documentazione asciutta ed accurata farà la differenza. Ed i clienti saranno immediatamente felici, evitando di dovervi ripetutamente infastidire: un effetto collaterale, normalmente molto piacevole, dell&#8217;essere contenti di essere riusciti a risolvere un problema <em>da soli</em>.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Date il giusto peso ai contenuti della documentazione in base all&#8217;uso più probabile. Non pensiate che la documentazione sia completa perchè descrive un po&#8217; di tutto: concentratevi e date al cliente quello che gli può ragionevolmente servire.</p>
<p>Se il cliente è in grado di risolvere i problemi più comuni dei vostri prodotti da solo, in fretta e senza impazzire a dover cercare informazioni in un mastodontico manuale utente, risparmierete &#8220;automagicamente&#8221; un sacco di tempo e di soldi: <strong>la documentazione come kit di automedicazione per il cliente</strong>.</p>
<p><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=rtfm.png" target="_blank"><img width="150" src="http://i275.photobucket.com/albums/jj308/rejectedx/rtfm.png" border="0" alt="Photobucket" class="alignright"></a>Fissate quello che la vostra documentazione-modello deve avere e revisionate questo modello nel tempo, rispetto a quello che i vostri clienti richiedono con maggior frequenza.</p>
<p>Partendo dal presupposto che, <a href="http://rejex.wordpress.com/2008/05/27/recensione-perche-il-software-fa-schifo/">come direbbe Platt</a>  </p>
<blockquote><p>&#8220;Il tuo utente non sei tu&#8221;</p></blockquote>
<p>voi non siete i destinatari finali della documentazione, però siete i primi a poterne beneficiare. <strong>Se la documentazione è a posto, potete rapidamente rimandare i clienti ad essa: la documentazione come kit di autodifesa per voi stessi.</strong></p>
<p>Come si dice in questi casi: <a href="http://it.wikipedia.org/wiki/Rtfm"><strong>RTFM</strong></a>!</p>
<p>(Ecco, magari non proprio con questi termini ma con parole più &#8220;tranquille&#8221;, ma il senso fra le righe è quello).</em></td>
</tr>
</table>
<p></p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/automedicazione/'>Automedicazione</a>, <a href='http://rejex.wordpress.com/tag/documentazione/'>Documentazione</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/rtfm/'>RTFM</a>, <a href='http://rejex.wordpress.com/tag/troubleshooting/'>Troubleshooting</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11637/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11637&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/11/28/il-primo-vero-utente-della-documentazione/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/11/documentation.png" medium="image">
			<media:title type="html">documentation</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/rtfm.png" medium="image">
			<media:title type="html">Photobucket</media:title>
		</media:content>
	</item>
		<item>
		<title>Sulle architetture a plugin&#8230;</title>
		<link>http://rejex.wordpress.com/2011/11/21/sulle-architetture-a-plugin/</link>
		<comments>http://rejex.wordpress.com/2011/11/21/sulle-architetture-a-plugin/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 06:25:40 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Reserved for future use]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11571</guid>
		<description><![CDATA[Sono sempre stato contrario ai progetti lasciati deliberatamente &#8220;troppo aperti&#8220;, che nascono cioè per uno scopo preciso &#8211; quello che il cliente si aspetta e per cui paga &#8211; ma contengono già riferimenti espliciti ad (improbabili) aggiustamenti futuri. L&#8217;esempio più semplice sono le strutture C, che compaiono qui e là, con campi marcati deliberatamente &#8220;reserved [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11571&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Sono sempre stato contrario ai progetti lasciati deliberatamente &#8220;<em>troppo aperti</em>&#8220;, che nascono cioè per uno scopo preciso &#8211; quello che il cliente si aspetta e per cui paga &#8211; ma contengono già <strong>riferimenti espliciti</strong> ad (<em>improbabili</em>) aggiustamenti futuri.</p>
<p><span id="more-11571"></span></p>
<p>L&#8217;esempio più semplice sono le strutture C, che compaiono qui e là, con campi marcati deliberatamente &#8220;<em><strong>reserved for future use</strong></em>&#8220;. L&#8217;idea di fondo, tuttavia, è ubiqua, direi quasi quotidiana per tutti: ogni volta che qualcuno individua un possibile reimpiego di un programma, ecco che nel codice ne compare per magia altro, che al momento non serve.</p>
<p>Esiste ma non viene (<em>ancora</em>) usato: rispetto allo scopo originale, è puro <em><a href="http://en.wikipedia.org/wiki/Dead_code">dead code</a></em> a livello semantico. Viene messo come <em>segnaposto</em>, come <em>warning</em> esplicito, per ricordarsi di quell&#8217;uso futuro e ancora non meglio precisato.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Talvolta ci si imbatte in campi di strutture marcati come &#8220;<strong>reserved for future use</strong>&#8221; ed impiegati solamente come riempitivi non utilizzati (filler/padding), per arrivare ad occupare una data dimensione di spazio oppure per rispettare qualche vincolo di allineamento.</p>
<p>In sostanza si tratta di spazio al momento sprecato, per cui marcarlo come &#8220;non usato&#8221; o come &#8220;riservato per usi futuri&#8221; sembrerebbe voler dire la stesa cosa. In realtà c&#8217;è una differenza abissale perchè la seconda variante suona come un preciso messaggio di avvertimento agli incauti programmatori utilizzatori:<br />
<blockquote>&#8220;Al momento non lo usiamo, ma questo non significa che puoi e devi usarlo tu. Gira al largo, bellimbusto!&#8221;</p></blockquote>
<p>In questo post mi riferisco invece a codice che contiene deliberatamente altro codice, al momento inutile, lasciato come un post-it sul frigorifero, in modo da annunciare a chi passa improbabili estensioni future. Lo stesso vale per quello che ruota intorno al codice, ad esempio la documentazione.</em></td>
</tr>
</table>
<p>Non è uno sbaglio di per sè, ma aggiungere fin da subito del codice per qualcosa che verrà è una scommessa col futuro che difficilmente può essere vinta.</p>
<p>Per esperienza, pur mettendoci tutto l&#8217;impegno e la passione del caso, devo ammettere che questo tipo di strategia non mi ha mai dato soddisfazione: 99 casi su 100, è più facile rifare qualcosa da zero, magari riusando del codice o dei piccolo moduli autocontenuti da qualcosa di esistente, che intestardirsi ad estendere qualcosa di grosso e particolareggiato. Già è spesso difficile arrivare alla fine di un progetto, con continui cambiamenti nei requisiti e nelle funzionalità offerte, figuriamoci predisporre un prodotto per un futuro e completo &#8220;<em>retargeting</em>&#8220;.</p>
<p>Non sto parlando certo di videogiochi, di &#8220;<a>modding</a>&#8221; e men che meno &#8220;<em>total conversion&#8221;</em>, che alla fine producono ancora videogiochi, quindi mantengono lo stesso target: parlo di prodotti customizzati per un dato cliente ed estesi, reinventati per altri tipi di clienti.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Pre-estendere qualcosa senza sapere come o perchè è come sparare a caso. Inoltre significa accettare l&#8217;idea di avere un piede in due scarpe ed una non si sa bene dov&#8217;è finita.</em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Un approccio migliore: l&#8217;architettura a <em>plugin</em></font></p>
<p>Credo che l&#8217;approccio migliore sia progettare la <em>struttura portante</em> del codice per essere estesa, non inserire già dei riferimenti ai futuri usi. </p>
<p>Cioè, se state scrivendo un programma che supporta diversi formati di file, è meglio pensare a come inserirne altri, in un secondo momento, non cominciare ad aggiungere già del codice per supportarne un altro (<em>presunto</em>) paio.</p>
<p>Progettare un sistema modulare, magari con un&#8217;architettura <em>a plugin</em>, è un ottimo esempio di strategia per aggiungere funzionalità a del codice pre-esistente, senza doverlo per forza riaprire se si tratta di un sistema a caricamento dinamico, a <em>runtime</em>. Da <a href="http://it.wikipedia.org/wiki/Plugin_(informatica)">Wikipedia</a>:</p>
<blockquote><p><em>&#8220;Il plugin in campo informatico, è un programma non autonomo che interagisce con un altro programma per ampliarne le funzioni. Ad esempio, un plugin per un software di grafica permette l&#8217;utilizzo di nuove funzioni non presenti nel software principale.</p>
<p><a href="http://rejex.files.wordpress.com/2011/11/plug-in.png"><img src="http://rejex.files.wordpress.com/2011/11/plug-in.png?w=150" alt="" title="plug-in" width="150" class="alignleft size-medium wp-image-11592" /></a>La capacità di un software di supportare i plugin è generalmente un&#8217;ottima caratteristica, perché rende possibile l&#8217;ampliamento e la personalizzazione delle sue funzioni da parte di terzi, in maniera relativamente semplice e veloce. </p>
<p>Ciò favorisce da un lato la minore obsolescenza del software e dall&#8217;altro la maggior diffusione, tanto più sono numerosi e funzionali i plugin scritti per uno specifico programma o secondo uno standard specifico: ne è un esempio il successo commerciale dei software di produzione audio di Steinberg, legato alla larga diffusione dei plugin musicali in standard VST.</p>
<p><a href="http://en.wikipedia.org/wiki/File:Plug-InExample.png"><img width="150" class="alignright" src="http://upload.wikimedia.org/wikipedia/en/4/46/Plug-InExample.png" alt="API - Plug-in" /></a>Per facilitare il compito agli sviluppatori di terze parti che intendono realizzare dei plugin, l&#8217;azienda produttrice del software o ideatrice dello standard distribuisce &#8211; spesso gratuitamente &#8211; dei sistemi detti Kit di Sviluppo Software (<a href="http://it.wikipedia.org/wiki/Software_development_kit">Software Development Kit</a> o SDK), che racchiudono funzionalità, esempi e documentazione per lo sviluppatore.&#8221;</em></p></blockquote>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Durante il periodo della &#8220;rivoluzione MP3&#8243; iniziata con <a href="http://it.wikipedia.org/wiki/Napster">Napster</a>, il lettore software per antonomasia era <a href="http://it.wikipedia.org/wiki/Winamp">WinAMP</a>, tuttora esistente.</p>
<p>Nel 1998 fu riscritto per supportare un&#8217;architettura a plugin che permettesse a terzi di estenderlo a piacere. Fu un imponente successo: ovunque comparvero plugin per aggiungere questo e quello a quel programma, aumentandone usi e quindi diffusione.</p>
<p>Ad agevolare il tutto, un buon kit si sviluppo, una buona documentazione e perfino un libro-manuale, &#8220;<a href="http://www.amazon.com/MP3-Power-Winamp-Ben-Sawyer/dp/0966288939/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1321781651&amp;sr=1-1"><em>MP3 Power! With Winamp</em></a>&#8220;.</p>
<p>Il bello è che WinAMP non è mai stato un progetto OpenSource ma freeware e poi shareware, quindi codice chiuso. Se ben pensato, un&#8217;architettura a plugin permette anche a programmi proprietari di essere estesi da terzi senza dover rivelare nulla dell&#8217;interno (black box). Nuovamente: le interfacce sono e fanno la differenza.</em></td>
</tr>
</table>
<p><font size='+1' color='#005197'>Perchè impiegarli?</font></p>
<p>L&#8217;approccio a plugin generalmente è un buon modo per costringersi a strutturare bene le cose, anche se un domani non li si userà davvero per estenderli.</p>
<p>Tuttavia modellare le cose a plugin non è sempre indicato &#8211; non tutti i programmi si prestano o necessitano davvero di questo tipo di soluzione &#8211; e può facilmente rivelarsi un overkill/overhead notevole, almeno nei primi momenti di vita di un software.</p>
<p>Molti prodotti famosi &#8211; lo stesso Winamp è un esempio &#8211; nascono come monolitici o modulari (librerie statiche e dinamiche) ma comunque intrinsecamente statici e solo successivamente, in una major release successiva (v2.0+), <strong>riscritti</strong> per includere il supporto ai plugin.</p>
<p>Ho detto riscritti e non semplicemente rivisti, perchè l&#8217;architettura a plugin è profondamente invasiva e permea/tocca tutto il software, che deve essere adeguato per supportarla. Il tutto, se fatto tardi, diventa facilmente costoso in termini di tempo e risorse da impiegare.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2011/06/ninja-tecnique.jpg?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Se dovete scrivere un programma ed immaginate fin da subito una o più espansioni successive, valutate bene se è il caso includere immediatamente un&#8217;architettura a plugin. Il tutto per tenervi aperta una porta verso sviluppi futuri, senza però sacrificare le funzionalità attuali e senza aggiungere dell&#8217;inutile codice segnaposto.</em></td>
</tr>
</table>
<p>Diventa quindi e prima di tutto un discorso di interfacce, di moduli pensati &#8220;<em>decoupled</em>&#8220;, ossia indipendenti, rimpiazzabili ed estendibili a piacere. Le interfacce sono tutto: se sono ben pensate, definite, modellate, sapranno servirvi in modi ed in tempi che non sospettate. Inoltre, come ben indicato da Wikipedia, si può arrivare addirittura a veri e propri <em>standard</em>.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Un esempio di &#8220;standard&#8221; per plugin è rappresentato da NPAPI, un sistema di creazione di plugin multipiattaforma per il &#8220;vecchio&#8221; browser Netscape.</p>
<p>Da <a href="http://it.wikipedia.org/wiki/NPAPI">Wikipedia</a>:</p>
<blockquote><p>La NPAPI (o Netscape Plugin Application Programming Interface) <strong>è un&#8217;architettura multipiattaforma per i plugin utilizzata da molti browser web</strong>. Sviluppata inizialmente per la famiglia di browser Netscape, a partire da Netscape Navigator 2.0, è stata implementata in seguito in altri browser, tra cui Mozilla Application Suite, Mozilla Firefox, Safari, Opera, Konqueror ed alcune versioni di Microsoft Internet Explorer.</p>
<p><strong>Il suo successo può essere in parte attribuito alla sua semplicità</strong>. Un plugin dichiara di gestire alcuni tipi MIME (ad esempio &#8220;audio/mp3&#8243;) mediante le informazioni sui file presentati. Quando il browser incontra tale tipo di contenuti carica il plugin associato, delimita lo spazio all&#8217;interno dell&#8217;area di visualizzazione da assegnare al plugin, e infine vi trasferisce dati.</p>
<p>Al plugin viene, quindi, assegnato il compito di gestire i dati nel modo più opportuno, sia esso visivo, audio o qualunque altra cosa. In questo modo, un plugin viene eseguito nella propria parte di pagina, a differenza dei browser precedenti, che dovevano lanciare un&#8217;applicazione esterna per gestire i tipi di contenuto a loro ignoti.</p>
<p>L&#8217;API richiede che ogni plugin implementi e pubblichi un numero abbastanza piccolo di funzioni. Si tratta approssimativamente 15 funzioni in totale per l&#8217;inizializzazione, la creazione, la distruzione e il posizionamento dei plugin. La NPAPI supporta anche lo scripting, la stampa, la visualizzazione a schermo intero, i plugin windowless e lo streaming dei contenuti.</p></blockquote>
<p>Non è un caso che questo &#8220;<em>standard</em>&#8220;, semplice e ben definito, sia sopravvissuto a tutte le traversie della società che l&#8217;ha prodotto, Netscape, e sia tuttora usato con successo anche da altre aziende e a dispetto della sua età.</em></td>
</tr>
</table>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Per quanto una strutturazione a plugin sia ottima per permettere estensioni di terzi, non fate l&#8217;errore di credere che siano adatti ed applicabili solo a quel caso: potete benissimo sfruttarli anche e solo per un uso interno!</p>
<p>Vi basta non rilasciare la documentazione delle interfacce all&#8217;esterno e solo voi godrete della possibilità di usarli.</em></td>
</tr>
</table>
<p></p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/category/software-engineering/'>software engineering</a> Tagged: <a href='http://rejex.wordpress.com/tag/plugin/'>Plugin</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/reserved-for-future-use/'>Reserved for future use</a>, <a href='http://rejex.wordpress.com/tag/software-engineering/'>software engineering</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11571/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11571/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11571/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11571&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/11/21/sulle-architetture-a-plugin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2011/11/plug-in.png" medium="image">
			<media:title type="html">plug-in</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/en/4/46/Plug-InExample.png" medium="image">
			<media:title type="html">API - Plug-in</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2011/06/ninja-tecnique.jpg" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />
	</item>
		<item>
		<title>Un blog come buona scusa per imparare&#8230;</title>
		<link>http://rejex.wordpress.com/2011/11/14/un-blog-come-buona-scusa-per-imparare/</link>
		<comments>http://rejex.wordpress.com/2011/11/14/un-blog-come-buona-scusa-per-imparare/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 06:25:43 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Consigli spassionati]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11445</guid>
		<description><![CDATA[Tempo fa, un amico dell&#8217;Università &#8211; Il Dodo -, tenne a noi del laboratorio Wiener una serie di interessanti seminari sulla teoria delle wavelet. Un giorno, prima di iniziare, volle precisare come il fatto di dover spiegare qualcosa a qualcuno fosse per lui uno stimolo enorme per impararla e bene. Quando si sente un tipo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11445&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img src="http://rejex.files.wordpress.com/2011/11/inspiration-exit1.png?w=180" class="alignleft size-thumbnail" width="180" alt="Inspiration" />Tempo fa, un amico dell&#8217;Università &#8211; <em>Il Dodo</em> -, tenne a noi del laboratorio Wiener una serie di interessanti seminari sulla teoria delle <a href="http://it.wikipedia.org/wiki/Wavelet"><em>wavelet</em></a>. Un  giorno, prima di iniziare, volle precisare come il fatto di dover spiegare qualcosa a qualcuno fosse per lui uno stimolo enorme per impararla e bene.</p>
<p>Quando si sente un tipo di affermazione come questa è normale restare perplessi, almeno sulle prime: è come se un maestro ammettesse candidamente alla sua classe di aver letto ed imparato una lezione giusto pochi minuti prima di spiegarla. Scioccante, sincero, sublime.</p>
<p>A tratti è la stessa cosa che capita anche a me quando scrivo un post&#8230;</p>
<p><span id="more-11445"></span></p>
<p><font size='+1' color='#005197'>Provocare l&#8217;ispirazione</font></p>
<p>Più volte mi è stato chiesto come produca i post ossia da dove provenga l&#8217;originale ispirazione ideatrice. Come per molte altre persone &#8211; pressochè tutte? &#8211; la mia ispirazione si origina da qualcosa che mi colpisce durante la settimana. Di solito, quando arriva, mi appunto giusto un&#8217;idea di titolo &#8211; o più di un appunto, se la settimana è particolarmente propizia -, che poi estendo durante il weekend, fino ad arrivare al post del lunedì.</p>
<p>Eppure, come molti seri scrittori &#8211; io non lo sono, sia chiaro! &#8211; sperimentano, non basta aspettare l&#8217;evento-manna dal Cielo settimanale: si arriva facilmente a prolungati momenti di &#8220;vuoto&#8221;, il cosiddetto e temuto &#8220;<em>blocco dello scrittore</em>&#8220;. Anzi, tantopiù si cerca qualcosa da cui ricavare un <em>pezzo</em>, tanto più si rimane incastrati dalla mancanza di argomenti utili ed interessanti da sviscerare. Sembra quasi che più cerchi l&#8217;ispirazione, più essa si nasconde, si volatilizza.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Nella mia modesta esperienza di gestione di un blog ho imparato a non forzare la mano, tentando di scrivere un post su qualcosa nato più per necessità (di avere il post del lunedì) che per convinzione (di avere un argomento valido).</p>
<p>In altre parole ammetto la possibilità che prima o poi rimarrò senza un post per una o più settimane: come una nave a vela che non si sposta senza un alito di vento e che attende che quest&#8217;ultimo riprenda a spirare, prima o poi.</p>
<p>Accettare di poter rimanere &#8220;a secco&#8221; ha un che di rilassante e toglie le basi al vero problema connesso al &#8220;blocco dello scrittore&#8221;: il panico, illogico ed immotivato, di sentirsi bloccati indefinitamente, ossia di non riuscire più a riprendersi.</p>
<p>A differenza di uno scrittore professionista, io non vivo di e per questo blog, per cui posso permettermi qualche rallentamento e perfino di smettere di scrivere da un giorno all&#8217;altro, senza preavviso alcuno. Questa è libertà.</em></td>
</tr>
</table>
<p></p>
<p>Col passare del tempo e, soprattutto, riflettendo sulle parole del Dodo, ho scoperto e notato che il suo discorso si può applicare con profitto anche allo scrivere i post: <strong>scrivere i post può essere il frutto dell&#8217;imparare e viceversa</strong>.</p>
<p>Il meccanismo e semplice: si può forzare l&#8217;ispirazione imparando qualcosa di utile e provando a descriverlo in un post, ad un pubblico teoricamente più ampio e meno definito rispetto al caso di una &#8220;classe&#8221; che segue le parole del suo docente.</p>
<p>Dico di più: scrivere qualcosa con l&#8217;intento di spiegare qualcosa a qualcuno &#8211; e quindi non solo per un mero egoismo intellettuale &#8211; spinge a fare le cose in modo migliore: <strong>si impara meglio per descriverlo meglio</strong>.</p>
<p>Ciò rappresenta uno stimolo incredibile, qualcosa che va ben oltre il sentirsi in qualche modo obbligati a produrre il solito, ennesimo post settimanale: <strong>si impara per poter scrivere e si scrive per poter imparare</strong>.</p>
<p>Se il risultato è decente, a questo punto, il gioco vale ampiamente la candela. </p>
<p><font size='+1' color='#005197'>Appunti di vita vissuta</font></p>
<p>Questo blog non è affatto un diario, anche se molte delle cose che leggete hanno una precisa collocazione temporale (<em>di solito le lascio decantare per un po&#8217;, ma non sempre</em>) e delle cause precise che mi hanno spinto a scrivere.</p>
<p>Lo confesso: non mi piace scrivere perchè sono intimamente pigro, ma quando sono ispirato posso tirare avanti per ore e ore senza rallentamenti o ripercussioni psicofisiche di sorta. Forse è proprio il fatto che non mi sforzo, che mi sento libero di scrivere o non scrivere, a facilitarmi il compito: <strong>dove c&#8217;è l&#8217;obbligo, la passione, l&#8217;entusiasmo ed il divertimento scemano</strong>.</p>
<p>Col tempo ho imparato a non cercare l&#8217;idea ma a provocarla, lasciandomi incuriosire da quello che mi accade intorno. Ho imparato a segnarmi da qualche parte quello che di nuovo e di curioso trovo ogni giorno e poi, col trucco del blog, fare leva ed impararlo in modo migliore, come se dovessi davvero esporlo ad un pubblico che si aspetta da me delle delucidazioni, che pende dalle mie labbra.</p>
<p>Un ottimo ed eccellente artificio mentale per battere la pigrizia, per spingersi ad approfondire qualcosa, per provare a migliorare un poco il proprio stile di scrittura, per progredire a livello professionale ed umano. Un esercizio di stile che, escluso il tempo e lo sforzo da impiegare in modo abbastanza costante, ha solo dei vantaggi.</p>
<p>Il mio professore di linguaggi di programmazione all&#8217;Università &#8211; e non solo lui a dire il vero &#8211; soleva ripeterci che l&#8217;unico modo per imparare davvero un dato linguaggio è scrivere codice su codice, non limitarsi ad impararne le relative nozioni, pedissequamente lette su un libro dedicato, col solo scopo di superare un esame.</p>
<p>Beh, credo che il discorso non valga solamente per i linguaggi di programmazione, ma sia generalizzabile a qualunque linguaggio, incluso quello naturale: più uno si sforza di scrivere, più migliorerà (<em>repetita iuvant</em>), anche solo per inerzia. O così voglio sperare che sia.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/blog/'>Blog</a>, <a href='http://rejex.wordpress.com/category/consigli-spassionati/'>Consigli spassionati</a> Tagged: <a href='http://rejex.wordpress.com/tag/blog/'>Blog</a>, <a href='http://rejex.wordpress.com/tag/consigli-spassionati/'>Consigli spassionati</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11445/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11445/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11445/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11445&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/11/14/un-blog-come-buona-scusa-per-imparare/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/11/inspiration-exit1.png" medium="image">
			<media:title type="html">Inspiration</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />
	</item>
		<item>
		<title>Sull&#8217;effetto demo&#8230;</title>
		<link>http://rejex.wordpress.com/2011/11/07/sull-effetto-demo/</link>
		<comments>http://rejex.wordpress.com/2011/11/07/sull-effetto-demo/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 06:25:05 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Considerazioni personali]]></category>
		<category><![CDATA[Consigli spassionati]]></category>
		<category><![CDATA[Demo / Presentazioni]]></category>
		<category><![CDATA[consigli]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[Effetto demo]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[Presentazioni]]></category>
		<category><![CDATA[Technical difficulties]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11164</guid>
		<description><![CDATA[L&#8217;effetto demo è l&#8217;equivalente informatico di una diretta televisiva interrotta per motivi tecnici. In termini ironici è la legge di Murphy che si concretizza di colpo, nel momento peggiore. In termini lavorativi può invece significare una strigliata o addirittura il licenziamento in tronco di qualcuno, anche se non ne ha colpe. Sfortunatamente evitare del tutto [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11164&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>L&#8217;<em>effetto demo</em> è l&#8217;equivalente informatico di una diretta televisiva interrotta per motivi tecnici.</p>
<p>In termini ironici è la <a href="http://it.wikipedia.org/wiki/Legge_di_Murphy">legge di Murphy</a> che si concretizza di colpo, nel momento peggiore. In termini lavorativi può invece significare una strigliata o addirittura il licenziamento in tronco di qualcuno, anche se non ne ha colpe.</p>
<p>Sfortunatamente evitare del tutto questi eventi è al di fuori della portata umana: si può ridurre il rischio di molto, ma non rimuoverlo del tutto.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><a href="http://rejex.files.wordpress.com/2011/11/technical-difficulties-star-wars.jpg"><img src="http://rejex.files.wordpress.com/2011/11/technical-difficulties-star-wars.jpg?w=170" alt="" title="technical-difficulties-star-wars" width="170" class="alignleft size-thumbnail wp-image-11453" /></a><em>Con i termini &#8220;effetto demo&#8221; mi riferisco a quello che gli anglofoni definiscono propriamente &#8220;technical difficulties&#8221; (problemi tecnici).</p>
<p>La traduzione letterale in inglese, &#8220;<a href="http://en.wikipedia.org/wiki/Demo_effect">demo effect</a>&#8221; si riferisce infatti a ben altro, ossia alle competizioni fra programmatori appartenenti alla cosiddetta <a href="http://en.wikipedia.org/wiki/Demoscene">demoscene</a>.</em></td>
</tr>
</table>
<p></p>
<p><span id="more-11164"></span></p>
<p><font size='+1' color='#005197'>Un&#8217;atroce, spiacevole esperienza in pubblico</font></p>
<p>Mi piace molto <a href="http://xmau.com/gergo/e.html">questa definizione</a>:</p>
<blockquote><p><em><strong>effetto demo</strong> loc.<br />
    &#8211; Una prova ontologica dell&#8217;esistenza di Dio. Non vi è nulla di strano nel vedere una persona che non riesce a ripetere un&#8217;azione per lui abituale in presenza di personaggi importanti: si sa che l&#8217;emozione gioca brutti scherzi. Un programma, però, non dovrebbe provare alcuna emozione. Eppure tutti coloro che hanno dovuto fare una demo sanno che il mattino della presentazione sicuramente qualcosa non funzionerà, nonostante non si sia modificato nulla. Come mai?</em></p></blockquote>
<p>L&#8217;effetto demo è il terrore di ogni persona che deve presentare qualcosa a qualcuno, sia esso un collega, un capo, un cliente, un fornitore, un passante sconosciuto. È quell&#8217;evento che si verifica quando, pur avendo provato e riprovato tutto mille volte, qualcosa inaspettatamente cede e vi ritrovate, follemente imbarazzati, a:</p>
<ol>
<li>tentare di sistemare il problema sui due piedi, nel giro di pochi istanti, spesso senza riuscirci e davanti alla platea che vi scruta perplessa e/o rumoreggia;</li>
<li>tentare di spiegare alla platea cosa è successo;</li>
<li>elemosinare la pietà del pubblico, magari alleggerendo la tensione con qualche battuta;</li>
<li>cedere all&#8217;impossibilità pratica di sistemare il problema e proseguire &#8220;a voce&#8221;.</li>
</ol>
<p>Esistono infinite variazioni sul tema, ma il risultato pratico è che, senza un colpo di reni scenografico, la presentazione fallisce. Sopratutto se entra in scena il <em><strong>panico</strong></em> o si avvicina a spron battuto il momento di andare a mangiare un boccone o di bersi un caffè.</p>
<p><font size='+1' color='#005197'>1. Quello che si può fare <em>prima</em></font></p>
<p>Non sono un esperto di presentazioni però ho avuto il piacere di osservarne alcuni, di persona o via Internet, per cui prendete quello che scrivo con le molle.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Il bello di Internet è che vi si trova di tutto: c&#8217;è così tanto materiale che spesso non serve conoscere qualcuno di persona per conoscerne le opere e le idee.</em></td>
</tr>
</table>
<p></p>
<p>Un buon presentatore prepara tutto e lo ricontrolla mille volte: situazioni particolari a parte &#8211; es: ritardi -, non arriva all&#8217;ultimo momento utile per allestire al volo la presentazione. </p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Ad essere onesti, ho visto persone farlo, ma evidentemente non erano persone alle prime armi: preparavano il materiale e nel frattempo iniziavano subito a presentare, per non perdere tempo.</p>
<p>La cosa che mi ha colpito è che erano in grado di mantenere il pubblico coinvolto su di loro, sulle loro parole, e non su quello che stavano frettolosamente montando. Il tutto senza fermarsi, senza dover interrompere il discorso per cercare qualcosa o qualcuno (forse è questo il perchè il pubblico rimane concentrato).</em></td>
</tr>
</table>
<p></p>
<p>Ogni cosa deve andare bene. C&#8217;è chi si porta un <strong>sistema ridontato/ridondante in valigia</strong>: non un doppio portatile, ma tutti i suoi cavi doppi, alimentatori universali, dischi esterni di <strong>backup</strong> a profusione (<em>cfr. &#8220;<a href="http://www.cedma-europe.org/newsletter%20articles/WorkplaceXpert/Avoiding%20Technical%20Difficulties%20in%20Presentations%20(May%2007).pdf">Avoiding Technical Difficulties in Presentations</a>&#8220;</em>). <a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=trust-no-one.jpg" target="_blank"><img width="180" class="alignleft size-thumbnail" src="http://i275.photobucket.com/albums/jj308/rejectedx/trust-no-one.jpg" border="0" alt="Trust none"></a>Il tipo di persona che se, nonostante tutto, non ha qualcosa, potete stare tranquilli che la prossima volta non mancherà di portarne almeno un paio. </p>
<p>Se anche l&#8217;organizzazione fornisce e spergiura sulla qualità del materiale, il bravo speaker, notorio paranoico forgiato dal fuoco di mille presentazioni, si porta <em>comunque</em> le sue cose da casa e preferisce usare quelle perchè <strong>si fida</strong> solamente delle cose su cui ha il controllo.</p>
<p><font size='+1' color='#005197'>2. Quello che si può fare <em>durante</em></font></p>
<p>Nonostante tutti gli accorgimenti possibili ed immaginabili, non c&#8217;è verso di sfuggire all&#8217;effetto demo. Perfino gente collaudata come il compianto Jobs, un&#8217;autorità incontestata delle presentazioni in pubblico, si è trovata a fronteggiare questo problema <a href="http://www.melablog.it/post/4967/steve-jobs-e-keynote-alcuni-incidenti-di-percorso">più di una volta</a>.</p>
<p>Memorabile, ad esempio, quando ha &#8220;convinto&#8221; la platea a spegnere gli hotspot Wifi per consentirgli di proseguire con la demo di <a href="http://it.wikipedia.org/wiki/FaceTime">FaceTime</a>.</p>
<span style="text-align:center; display: block;"><a href="http://rejex.wordpress.com/2011/11/07/sull-effetto-demo/"><img src="http://img.youtube.com/vi/649TlfDCozc/2.jpg" alt="" /></a></span>
<p>Osservate bene questo video: non capita tutti i giorni una richiesta di quel genere proveniente dallo <em>speaker</em>. Una sala piena zeppa di connessioni wireless &#8211; decisamente troppe per poter presentare senza interferenze e crash &#8211; e Jobs che &#8220;velatamente&#8221; (<em>una specie di &#8220;o così o ce ne andiamo a casa: scegliete voi!&#8221;</em>) ordina al pubblico di spegnerle e, per giunta, di guardarsi attorno per controllare che tutti lo facciano <em>davvero</em>. Poi, un paio di battute, giusto per alleggerire la tensione.</p>
<p>Si sentono le persone ridere e poi eseguire l&#8217;ordine: l&#8217;oratore ha superato l&#8217;<em>impasse</em> dell&#8217;effetto demo, senza andare in panico, addirittura interagendo con la platea. La richiesta insolita e l&#8217;<strong>autorità</strong>/<strong>autorevolezza</strong> trasmessa da Jobs hanno fatto la magia, capovolgendo la situazione da <em>sfavorevole-ma-comunque-sotto-controllo</em> a <em>risolta-senza-panico-e-col-sorriso-sulle-labbra</em>.</p>
<p>Ad un evento negativo durante una presentazione, sia essa a poche o a molte persone, si reagisce prontamente:</p>
<ul>
<li>senza perdere tempo a spiegare nel dettaglio cosa è successo al pubblico (<em>errore madornale, anche se il pubblico è in grado di capire le spiegazioni</em>);</li>
<li>senza spiegare i passi che si intendono intraprendere per risolvere il problema (<em>perdita di tempo: &#8220;fallo e basta, se puoi!&#8221;</em>);</li>
<li>senza buttarla sull&#8217;(<em>auto</em>)ironico o piangersi addosso per l&#8217;accaduto;</li>
<li>senza cercare la solidarietà del pubblico;</li>
<li>senza fermare lo show, invocare l&#8217;aiuto &#8211; spesso tardivo &#8211; di qualcun altro;</li>
<li>senza infuriarsi, imprecare, manifestare eccessivo fastidio per la situazione;</li>
<li>senza lasciar trasparire sul suo volto o con i suoi atteggiamenti la benchè minima goccia di panico.</ul>
<p>Jobs ha reagito cercando la collaborazione del suo pubblico, anzi ha sostanzialmente ordinato loro cosa fare: queste, fra lo stupito ed il divertito, hanno ceduto all&#8217;autorità <em>che-sembrava-sapere-benissimo-cosa-fare</em>, senza farne una tragedia ed in maniera composta. Dopotutto, erano lì per lui, in un rapporto di dipendenza esplicita, tipo <em>pubblico-adorante-pende-dalle-labbra-del-suo-speaker</em>: non avrebbe dovuto approfittarne, vista la necessità?</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Il &#8220;pro&#8221; non si lascia spaventare facilmente dagli eventi e, piuttosto di dare forfait, impone le sue condizioni per proseguire.</em></td>
</tr>
</table>
<p></p>
<p>Probabilmente, avendo il tempo, si poteva arrivare a soluzioni meno <em>invasive</em>, ma il tempo è tiranno. O si reagisce prontamente oppure è la fine, nel senso che immancabilmente le persone (<em>e la stampa nel caso di Jobs!</em>) fisseranno nella loro memoria l&#8217;incidente tecnico, vanificando lo scopo della presentazione stessa. Esattamente come durante certi matrimoni, che tutti i partecipanti ricordano distintamente come perfetti <em>fino al momento che è successo&#8230;</em></p>
<p>Tutto ciò è certamente un buon modo per <em><strong>contenere il danno</strong></em> e, anzi, volgerlo a proprio favore, coinvolgendo il pubblico. Esattamente come certi cantanti che, durante un concerto, fanno cantare il pubblico e intanto tirano il fiato: il bello è che poi il pubblico è contento e non pensano minimamente al perchè quei cantanti agiscono in quel modo.</p>
<p>Potete star certi che Jobs, finita quella presentazione, avrà dato immediate indicazioni per evitare questa situazione nei successivi <em><a href="http://en.wikipedia.org/wiki/Keynote">keynote</a></em>. Poi, sappiamo benissimo <a href="http://rejex.wordpress.com/2011/10/10/sulla-pietas-mediatica-dopo-la-morte-di-jobs/">cosa è successo dopo</a> (<em>RIP</em>).</p>
<p><em>Sbagliando si impara (e la perfezione di raggiunge quando non ci sono più bug da correggere).</em></p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/considerazioni-personali/'>Considerazioni personali</a>, <a href='http://rejex.wordpress.com/category/consigli-spassionati/'>Consigli spassionati</a>, <a href='http://rejex.wordpress.com/category/demo-presentazioni/'>Demo / Presentazioni</a> Tagged: <a href='http://rejex.wordpress.com/tag/considerazioni-personali/'>Considerazioni personali</a>, <a href='http://rejex.wordpress.com/tag/consigli/'>consigli</a>, <a href='http://rejex.wordpress.com/tag/demo/'>demo</a>, <a href='http://rejex.wordpress.com/tag/effetto-demo/'>Effetto demo</a>, <a href='http://rejex.wordpress.com/tag/jobs/'>Jobs</a>, <a href='http://rejex.wordpress.com/tag/presentazioni/'>Presentazioni</a>, <a href='http://rejex.wordpress.com/tag/technical-difficulties/'>Technical difficulties</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11164&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/11/07/sull-effetto-demo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2011/11/technical-difficulties-star-wars.jpg" medium="image">
			<media:title type="html">technical-difficulties-star-wars</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/trust-no-one.jpg" medium="image">
			<media:title type="html">Trust none</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />
	</item>
		<item>
		<title>Funzionalità e sottopassaggi non usati&#8230;</title>
		<link>http://rejex.wordpress.com/2011/10/31/funzionalita-e-sottopassaggi-non-usati/</link>
		<comments>http://rejex.wordpress.com/2011/10/31/funzionalita-e-sottopassaggi-non-usati/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 06:25:51 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Brontolo]]></category>
		<category><![CDATA[Consigli spassionati]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[consigli]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[Piste ciclabili]]></category>
		<category><![CDATA[Programming by permutation]]></category>
		<category><![CDATA[Rotonde]]></category>
		<category><![CDATA[Sottopassaggi]]></category>
		<category><![CDATA[UAC]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11168</guid>
		<description><![CDATA[Qualche giorno fa mi sono imbattuto nell&#8217;ennesimo pedone che ha attraversato una strada trafficata, infischiandosene bellamente dell&#8217;apposito sottopassaggio modello deluxe gentilmente messo a disposizione dall&#8217;amministrazione comunale. Poco dopo, la solita comitiva di ciclisti della domenica transitava in mezzo alla strada e non sull&#8217;enorme ed immacolata pista ciclabile a lato della carreggiata. Cosa si può imparare [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11168&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.files.wordpress.com/2011/10/pista_ciclabile1.jpg"><img src="http://rejex.files.wordpress.com/2011/10/pista_ciclabile1.jpg?w=230" alt="" title="pista_ciclabile" width="230" class="alignleft size-thumbnail wp-image-11330" /></a>Qualche giorno fa mi sono imbattuto nell&#8217;ennesimo pedone che ha attraversato una strada trafficata, infischiandosene bellamente dell&#8217;apposito <a href="http://it.wikipedia.org/wiki/Sottopassaggio">sottopassaggio</a> <em>modello deluxe</em> gentilmente messo a disposizione dall&#8217;amministrazione comunale.</p>
<p>Poco dopo, la solita comitiva di ciclisti della domenica transitava in mezzo alla strada e non sull&#8217;enorme ed immacolata pista ciclabile a lato della carreggiata.</p>
<p>Cosa si può imparare da queste situazioni? Riformulo: </p>
<blockquote><p><em>Cosa può un programmatore imparare da queste situazioni &#8220;urbane&#8221;?</em></p></blockquote>
<p><span id="more-11168"></span></p>
<p><font size='+1' color='#005197'>Si può sempre imparare, da qualunque cosa</font></p>
<p><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=swearing.jpg" target="_blank"><img width="170" src="http://i275.photobucket.com/albums/jj308/rejectedx/swearing.jpg" border="0" class="alignleft" alt="swearing"></a>Sarà che sono un informatico e ho una certa deformazione professionale &#8211; anche nell&#8217;osservare le cose -, ma le due situazioni sopra descritte risultano in qualche modo istruttive, perfino nel campo del software.</p>
<p>Passati i 30 secondi di furia nei confronti di quelle persone (<em>che, sul momento, avrei definito incivili senza battere ciglio</em>), ho provato ad analizzare il contesto, le cause e gli effetti di questa &#8220;<em>debacle urbana</em>&#8220;. Volevo capire cosa è <em>andato storto</em>.</p>
<p><font size='+1' color='#005197'>Caso di studio #1: il sottopassaggio (e le funzionalità nuove, più complicate delle precedenti)</font></p>
<p>Da buon pignolo-paranoico, ho deciso di ispezionare quel sottopassaggio: decisamente ben fatto &#8211; almeno all&#8217;apparenza -, con due lunghe rampe senza scalini (<em>cioè senza <a href="http://it.wikipedia.org/wiki/Barriere_architettoniche">barriere architettoniche</a></em>), prima e dopo il sottopassaggio vero e proprio.</p>
<p><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=sottopassaggio.png" target="_blank"><img width="100" src="http://i275.photobucket.com/albums/jj308/rejectedx/sottopassaggio.png" border="0" class="alignleft" alt="segnale sottopassaggio"></a>Sfortunatamente questo piccolo gioiello ha una grave mancanza: costringe le persone, normodotate e non, ad allungare il percorso di un fattore 2.5x. Attraversare la strada, rischioso che sia, richiede una camminata di 6 metri mentre percorrere tutto il sottopassaggio ne richiede quasi 15: per sfruttarlo, bisogna percorre una stradina chiusa, laterale alla strada, protetta da barriere e muri. </p>
<p>Insomma il percorso è più lungo ed anche rigorosamente preimpostato: quello che è certo &#8211; almeno questo! &#8211; è che una volta lì dentro, si sbuca da uno dei due lati in modo perfettamente sicuro.</p>
<p>Poco importa che questo sottopassaggio sia stato costruito per evitare <em>nuovi</em> incidenti mortali &#8211; ennesimo caso di opera pubblica prodotta dopo una lunga serie di mesti eventi -, le persone lo ignorano sistematicamente, rischiando l&#8217;attraversamento in nome del risparmio di tempo.</p>
<p>Chiamatela pure pigrizia se vi pare, ma la pigrizia in questo caso nasconde un discorso geometrico, energetico, economico ed altro ancora: mettere a disposizione qualcosa di migliore non garantisce il successo, ossia che poi verrà usata davvero, soprattutto se non c&#8217;è vantaggio pratico tangibile per il beneficiario.</p>
<p>Nel mondo informatico, digitale, vale la stessa cosa, sia per gli utenti che per i programmatori.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Così come una persona &#8211; magari una che ha problemi a deambulare &#8211; sceglierà la strada più corta, nel mondo informatico, uno sviluppatore sceglierà la soluzione più rapida per arrivare alla soluzione.</em></td>
</tr>
</table>
<p></p>
<p>Se questo significa continuare a usare puntatori, puntatori a funzioni, <a href="http://it.wikipedia.org/wiki/Application_programming_interface">API</a> documentate poco o non documentate affatto, funzioni standard del C intrinsecamente insicure come la <font face="monospace"><a href="http://www.cplusplus.com/reference/clibrary/cstring/strcpy/">strcpy</a></font>, e chissà quale altra <em>worst practice</em>, non ha la minima importanza. Soprattutto se, per quanto insicura, è stata usata fino a quel momento e con profitto.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Le API non sufficientemente documentate sono fra le cause più note della &#8220;programmazione per permutazione&#8221;, che è l&#8217;esatto opposto della programmazione accorta, disciplinata ed affidabile. Da <a href="http://en.wikipedia.org/wiki/Programming_by_permutation">Wikipedia</a>:</p>
<blockquote><p>&#8220;<strong>Programming by permutation</strong>, sometimes called &#8216;programming by accident&#8217;, is an approach to software development wherein a programming problem is solved by iteratively making small changes (permutations) and testing each change to see if it behaves as expected. This approach sometimes seems attractive when the programmer does not fully understand the code and believes that one or more small modifications may result in code that is correct.</p>
<p>[...]</p>
<p>Programmers are often compelled to program by permutation when an API is insufficiently documented. This lack of clarity drives others to copy and paste from reference code which is assumed to be correct, but was itself written as a result of programming by permutation.&#8221;</p></blockquote>
<p>In modo del tutto similare, ribadisco quanto affermato in un <a href="http://rejex.wordpress.com/2010/12/13/trial-and-error-non-e-una-metodologia-di-sviluppo/">precedente post</a>: il &#8220;trial and error&#8221; non è una metodologia di sviluppo!</em></td>
</tr>
</table>
<p></p>
<p>Nel caso degli utenti, si potrebbe citare il meccanismo di sicurezza noto come <em>User Account Control</em>, inserito in Vista e poi rivisto e migliorato in 7. Da <a href="http://it.wikipedia.org/wiki/User_Account_Control">Wikipedia</a>:</p>
<blockquote><p><em>&#8220;User Account Control (UAC &#8211; Controllo Account Utente) è un modulo di protezione introdotto da Microsoft in Windows Vista, che gestisce i permessi dei singoli utenti del computer in modo da impedire l&#8217;esecuzione di software dannoso o il danneggiamento di dati o componenti del sistema. Uno dei principali difetti delle precedenti versioni dei sistemi Windows era infatti legato alla sicurezza ed al problema della esecuzione di molti processi ed applicazioni in modalità &#8220;amministratore di sistema&#8221;.</p>
<p>[...]</p>
<p>Molte critiche si sono levate circa il numero eccessivo di segnalazioni, ovvero di richieste di intervento da parte dell&#8217;utente, che rendono tale soluzione poco pratica: diversamente da altri sistemi operativi, le scelte operate non vengono memorizzate e questo implica che continuamente l&#8217;utente viene bersagliato dalle richieste di conferma, che alla fine perdono significato.&#8221;</em></p></blockquote>
<p>Tradotto: alla fine gli utenti o provano a disattivare in blocco questa funzionalità oppure si limitano ad accettare pedissequamente tutte le notifiche e richieste di conferma, maledicendo il giorno in cui è stata introdotta questa <em>feature</em>.</p>
<p>Come opporsi a questo inghippo? Due sono le chiavi di successo perchè qualcosa sia davvero usata: </p>
<ol>
<li>sia (<em>più</em>) facile da usare;</li>
<li>garantisca un uso e prestazioni in linea con le soluzioni rimpiazzate.</li>
</ol>
<p>Se poi si riesce a rendere anche più sicure &#8211; e la sicurezza di norma porta un qualche <em><a href="http://it.wikipedia.org/wiki/Overhead">overhead</a></em>, che non sia però l&#8217;<em>UAC</em> &#8211; tanto meglio: l&#8217;utente-medio ed il programmatore-medio tendono generalmente a dare la priorità alle prime due caratteristiche ed a ignorare &#8211; se non costretti &#8211; tutto il resto. Salvo poi farsi male ed imprecare contro chi non li ha debitamente protetti.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Sta al programmatore l&#8217;onere di fornire al suo cliente (utente o altro programmatore che sia) qualcosa che sia usabile con profitto ed intrinsecamente sicuro.</em></td>
</tr>
</table>
<p></p>
<p>Se, in nome di un presunto livello di sicurezza superiore, complicate le cose, l&#8217;utente ignorerà il vostro sforzo e tirerà dritto sulla strada vecchia, nota e collaudata. Anche se, nei fatti, è più rischiosa.</p>
<p><font size='+1' color='#005197'>Caso di studio #2: la pista ciclabile (e le funzionalità inserite di fretta, per &#8220;gola&#8221; o perchè ritenute &#8220;facili&#8221;)</font></p>
<p><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=pista-ciclabile.png" target="_blank"><img width="100" src="http://i275.photobucket.com/albums/jj308/rejectedx/pista-ciclabile.png" border="0" class="alignleft" alt="segnale pista ciclabile"></a>Il caso della pista ciclabile è del tutto simile a quella del sottopassaggio ma con una differenza: la pista ciclabile è di norma una specie di <em><a href="http://it.wikipedia.org/wiki/Corsia_preferenziale">corsia preferenziale</a></em> che, per quanto sia spesso condivisa con i pedoni, di solito corre parallela alla strada vera e propria. In altre parole: non è il sottopassaggio che allunga e spesso di molto il percorso.</p>
<p>Ebbene, ho discusso con ed ascoltato diversi ciclisti lamentarsi delle piste ciclabili e sul perchè non le adoperano. In certi casi ho udito motivazioni francamente ridicole, sul genere: </p>
<blockquote><p><em>&#8220;Sulle piste ciclabili ci sono spesso i pedoni che mi danno fastidio ed io devo mantenere un certo tempo!&#8221;</em></p></blockquote>
<p>In altri casi ho dovuto ammettere un discreto fondo di verità. Ad esempio:</p>
<blockquote><p><em>&#8220;Per accaparrarsi i fondi europei, hanno ricavato la pista ciclabile dal preesistente marciapiede. Il risultato è che, in 1 chilometro di &#8216;nuova&#8217; pista ciclabile, ci sono tantissimi sali-scendi, buche, paletti, attraversamenti, perfino dossi! Ed è un continuo intralciare e discutere con i pedoni, non certo meno sbadati di noi ciclisti nel muoversi.&#8221;</em></p></blockquote>
<p>Un&#8217;API o una <em>feature</em> inserita di fretta, con l&#8217;idea di sfruttare al volo un&#8217;occasione e perciò non pianificata in modo accorto, è prima di tutto un nuovo costo aggiuntivo e poi, sul medio-lungo periodo, rischia di diventare un&#8217;inutile zavorra, anche solo per il doverla supportare a lungo (<em>chi ha detto: rotatorie inutili, mal progettate e mal realizzate?</em>).</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Le cose si devono fare se c&#8217;è una reale necessità e sempre con criterio, non solo per la fretta del guadagno sul breve periodo (es: &#8220;i fondi europei&#8221;). In ogni caso la priorità va alle esigenze di chi paga e che poi sfrutterà le novità introdotte.</em></td>
</tr>
</table>
<p></p>
<p>Il caso delle piste ciclabili, &#8220;<em>ricavate</em>&#8221; da strade e non &#8220;<em>progettate</em>&#8220;, si riflette nell&#8217;inserimento frettoloso di nuove feature che, appoggiandosi ed agganciandosi al codice preesistente, possono intralciarlo, rallentarlo o addirittura bloccarlo.</p>
<p>Pensate alle piste ciclabili ottenute trasformando strade a doppia corsia in sensi unici: in certi casi, per poche biciclette al giorno (<em>o, per essere più precisi, per lucrare i finanziamenti</em>) si è complicato il traffico di interi quartieri. Salvo poi dover correre ai ripari e dover ripristinare, almeno in parte, i vecchi percorsi.</p>
<p>Quanti sono i programmi avete visto e/o usate che, da una versione all&#8217;altra, hanno cominciato ad aver problemi dopo l&#8217;inserimento dell&#8217;ennesima inutile funzionalità che, probabilmente, nessuno davvero userà?</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Sto ancora aspettando un clone di <a href="http://en.wikipedia.org/wiki/Microsoft_Calculator">Calc.exe</a> <a href="http://it.wikipedia.org/wiki/Cloud_computing">cloud</a>-oriented&#8230; <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></td>
</tr>
</table>
<p>Medesimo discorso per le aggiunte apparentemente alla portata e quindi ritenute &#8220;facili e poco costose&#8221;: il fatto che qualcosa sia facile da implementare ed inserire non implica che lo si debba fare davvero e per forza: ogni nuova feature ha un costo in qualche modo calcolabile, più tutta una serie di costi addizionali, spesso non facilmente preventivabili (<em>cfr. bellissimo post &#8220;<a href="http://blogs.msdn.com/b/ericlippert/archive/2003/10/28/53298.aspx">How many Microsoft employees does it take to change a lightbulb?</a>&#8221; di Eric Lippert</em>).</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Ogni programmatore ogni giorno si sveglia e sa che prima o poi dovrà scontrarsi con l&#8217;ennesimo cliente che, pur non avendo le conoscenze basilari per farlo, stimerà come &#8220;facile&#8221; l&#8217;aggiunta di questa o quella nuova funzionalità.</p>
<p>Ogni programmatore ogni giorno si sveglia e sa anche che qualcuno, interposto fra lui ed il cliente, darà comunque ragione a quest&#8217;ultimo.</p>
<p>Non importa quello che dice il tuo cervello, la buona creanza, la logica, la televisione, &#8230; o anche la persona interposta: l&#8217;importante è che il cliente, prima di decidere, sia debitamente informato da te cosa comporterà e quanto costerà davvero aggiungere quella sua &#8220;bazzecola&#8221;.</p>
<p>Se poi deciderà di proseguire, almeno non potrà obiettare nulla sul tuo operato, al momento di saldare il conto.</em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Caso di studio #3 (bonus track): la nuova via, più sicura, ma ignota ai più</font></p>
<p>Uno degli aspetti estremamente importanti tanto della vita reale quanto di quella informatica è che non basta creare qualcosa di nuovo in sostituzione di qualcos&#8217;altro, ma bisogna anche <em>pubblicizzarlo adeguatamente</em>.</p>
<p>Tempo fa, recandomi in montagna con i miei genitori per le vacanze estive, ricordo di aver trovato e seguito sul nostro percorso abituale una deviazione opzionale, seguita da una nuova lunga galleria: era una scorciatoia vera e propria, che ci ha fatto risparmiare un bel po&#8217; di tempo rispetto al percorso &#8220;canonico&#8221;.</p>
<p>Per quanto una galleria sia un <em><a href="http://it.wikipedia.org/wiki/Single_point_of_failure">single point of failure</a></em> (<em>SPOF</em>) notevole nel caso di incidenti, quella <em>istanza</em> era migliore sotto tutti i punti di vista. Anche solo per il fatto di risparmiare ai conducenti &#8211; noi! &#8211; qualche chilometro di strada impervia, con tornanti e strapiombi nel mezzo del nulla e per questo non particolarmente entusiasmanti.</p>
<p>Inoltre, a conti fatti, quella galleria &#8211; pur con i limiti di velocità del caso &#8211; garantiva un&#8217;andatura costante, che si traduceva in un risparmio di tempo e carburante notevole rispetto alla soluzione precedente. Insomma, l&#8217;equivalente di aggiungere un nuovo &#8220;<a href="http://en.wikipedia.org/wiki/Fast_path"><em>fast path</em></a>&#8221; nel proprio codice.</p>
<p>Qui arriva il bello. Il problema, a mio modo di vedere, non è (<em>solo</em>) l&#8217;aver lasciato aperta anche l&#8217;altra strada, quella vecchia e terribilmente insicura, ma il non preoccuparsi di avvertire dell&#8217;esistenza di un&#8217;alternativa sicura, rapida, migliore: non uno straccio di cartello chiaro a segnalarne la presenza.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Creare una soluzione nuova e migliore vale zero se poi non si informano le persone della sua esistenza. Magari evidenziandola, anche se a scapito di una vecchia.</em></td>
</tr>
</table>
<p></p>
<p>Appurato che non si può chiudere una strada da un giorno all&#8217;altro &#8211; immancabilmente c&#8217;è sempre qualcuno che ci abita in quei posti sperduti ed usa quelle strade per tornare a casa &#8211; il passo successivo alla pubblicità sarebbe la <em>fase di incentivo+disincentivo</em>: incentivo ad usare la strada nuova e/o disincentivo ad usare quella vecchia.</p>
<p>Per esempio basterebbe risistemare i cartelli già esistenti in modo da spingere l&#8217;ignaro automobilista (<em>ignaro del posto, ovviamente, e solamente in transito</em>) a prendere la strada migliore: occhio non vede, cuore non duole.</p>
<p>Tralasciando anche gli evidenti costi di manutenzione doppi &#8211; che sicuramente gonfiano il portafogli di qualcuno -, questo atteggiamento è l&#8217;equivalente reale del limitarsi a creare l&#8217;ennesimo <em>set di API</em> che fa più o meno le stesse cose di quelli precedenti.</p>
<p>Alla fine continuare a supportare tutto diventa insostenibile e si arriva alla fatidica decisione di &#8220;<em>deprecare</em>&#8221; qualcosa, ossia marchiarlo come vecchio e superato. A quel punto è buona prassi aggiungere qualche controllo addizionale d&#8217;utilizzo, in modo che l&#8217;utente/programmatore sia informato non appena prova ad usarla. È un po&#8217; come avvertire l&#8217;utente del precipizio qualche metro prima che ci finisca dentro: magari è tardi, ma non <em>troppo</em> tardi.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Basta un &#8220;warning&#8221; in un compilatore a scoraggiare un programmatore da usare qualcosa di vecchio, deprecato ed insicuro?</p>
<p>La mia esperienza dice di no. Troppi messaggi di warning ed il programmatore farà come qualunque utente alle prese con l&#8217;UAC di vista: se ne infischierà, magari cercando il modo di disabilitarli.</p>
<p>Esattamente come avviene con i copri-pacchetti per le sigarette, che &#8220;risparmiano&#8221; al fumatore la visione dei <a href="http://en.wikipedia.org/wiki/Tobacco_packaging_warning_messages">giganteschi avvertimenti</a> come il celebre &#8220;Nuoce gravemente alla salute&#8221;.</p>
<p>Potete inventarvi sempre nuovi modi per avvertire qualcuno. Ma se risultate troppo insistenti &#8211; o l&#8217;&#8221;obiettivo&#8221; vi riterrà tali &#8211; i vostri messaggi cadranno inascoltati.</p>
<p>Mai sottostimare l&#8217;ingegno di qualcuno che si sente &#8220;stressato&#8221; dai vostri ripetuti messaggi d&#8217;allarme.</em></td>
</tr>
</table>
<p></p>
<p>Arriviamo al punto cruciale: se si fa qualcosa a fin di bene &#8211; e lo si può dimostrare -, perchè mantenere la soluzione vecchia <em>ad libitum</em>?</p>
<p>Perchè non pubblicizzare il tutto in modo che l&#8217;utente &#8211; che contrariamente a quanto si dice non è del tutto scemo &#8211; si decida ad abbandonare appena può la strada vecchia per la nuova (<em>e nonostante il celebre proverbio insegni l&#8217;opposto</em>)?</p>
<p>Perchè non fornire date certe per forzare il cambiamento? Non come quelle, &#8220;ballerine&#8221;, del digitale terrestre: conosco gente che, all&#8217;ennesimo annuncio dello spostamento della data dello <em>switch off</em>, ha optato per attendere l&#8217;evento reale.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Ogni decisione, draconiana o meno che sia, va portata in porto nei tempi previsti ed annunciati. Altrimenti, dopo un po&#8217;, nessuno crede più a chi grida &#8220;Al lupo, al lupo!&#8221;&#8230;</em></td>
</tr>
</table>
<p></p>
<p>Lasciare più soluzioni aperte, pur deprecandone alcune, oltre a confondere l&#8217;utente, significa accettare che qualcuno possa continuare a rifiutarsi di passare al nuovo. E tanto prima o poi protesterà comunque: i seguaci del &#8220;<em>si fa all&#8217;ultimo momento utile!</em>&#8221; sono sempre in agguato.</p>
<p>Posso capire il discorso <em>retrocompatibilità</em>, che per certe aziende è fonte di reddito ma è anche una causa di staticità e di perduranti problemi. </p>
<p>Sono dell&#8217;idea che se una nuova soluzione serve ad impedire danni enormi, va introdotta subito, senza esitazioni e senza &#8220;<em>periodi di grazia</em>&#8221; per le soluzioni precedenti.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Lo smart pointer &#8220;<a href="http://en.wikipedia.org/wiki/Auto_ptr">auto_ptr</a>&#8221; dello standard C++98/03. Lo standard nuovo, C++11, lo ha definito deprecato, sostituendolo con smart pointer migliori e (più) sicuri da usare. </p>
<p>Marcare come deprecata una funzionalità esistente &#8211; per quanto sia un buon esempio di &#8220;pubblicità&#8221; proveniente da una fonte autorevole &#8211; significa da un lato garantire un certo livello di (<em>retro</em>)compatibilità, dall&#8217;altra permettere ancora l&#8217;uso di qualcosa di insicuro e/o superato, che continuerà comunque a comparire sui libri come il <em>non-plus-ultra</em> e per chissà quanto tempo ancora.</p>
<p>Se poi si rimanda ad un &#8220;futuro standard&#8221; la rimozione definitiva di quel qualcosa e fra una versione e l&#8217;altra dello standard passano 5 o perfino 10 anni&#8230;</em></td>
</tr>
</table>
<p></p>
<p>Deprecare qualcosa è come abbassare la velocità massima consentita su una strada invece di precipitarsi a coprirne le vistose buche. Apprezzo il fatto che qualcuno mi avverta di un pericolo concreto, ma se mi impedisse a priori di rischiare gradirei di più. Sbaglio?</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/brontolo/'>Brontolo</a>, <a href='http://rejex.wordpress.com/category/consigli-spassionati/'>Consigli spassionati</a>, <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/api/'>API</a>, <a href='http://rejex.wordpress.com/tag/brontolo/'>Brontolo</a>, <a href='http://rejex.wordpress.com/tag/consigli/'>consigli</a>, <a href='http://rejex.wordpress.com/tag/feature/'>Feature</a>, <a href='http://rejex.wordpress.com/tag/piste-ciclabili/'>Piste ciclabili</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/programming-by-permutation/'>Programming by permutation</a>, <a href='http://rejex.wordpress.com/tag/rotonde/'>Rotonde</a>, <a href='http://rejex.wordpress.com/tag/sottopassaggi/'>Sottopassaggi</a>, <a href='http://rejex.wordpress.com/tag/uac/'>UAC</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11168/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11168/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11168/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11168&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/10/31/funzionalita-e-sottopassaggi-non-usati/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/10/pista_ciclabile1.jpg" medium="image">
			<media:title type="html">pista_ciclabile</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/swearing.jpg" medium="image">
			<media:title type="html">swearing</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/sottopassaggio.png" medium="image">
			<media:title type="html">segnale sottopassaggio</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/pista-ciclabile.png" medium="image">
			<media:title type="html">segnale pista ciclabile</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />
	</item>
		<item>
		<title>Un piccolo esempio di generatore in C++&#8230;</title>
		<link>http://rejex.wordpress.com/2011/10/24/un-piccolo-esempio-di-generatore-in-cpp/</link>
		<comments>http://rejex.wordpress.com/2011/10/24/un-piccolo-esempio-di-generatore-in-cpp/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 06:25:41 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[C++ (C Plus Plus)]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Continuazioni]]></category>
		<category><![CDATA[Generatori]]></category>
		<category><![CDATA[setjmp / longjmp]]></category>
		<category><![CDATA[Yield]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11263</guid>
		<description><![CDATA[Qualche giorno fa ho partecipato ad un&#8217;interessante discussione, iniziata dall&#8217;amico JustB, sull&#8217;uso della coppia di chiamate setjmp/longjmp del C e se valesse la pena sfruttarle per emulare le eccezioni del C++ in C. Avendoci già provato a suo tempo &#8211; con esito positivo -, ho confermato questa possibilità, osservando però che l&#8217;utilità pratica, a mio [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11263&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Qualche giorno fa ho partecipato ad un&#8217;interessante discussione, iniziata dall&#8217;amico <a href="http://giustino.borzacchiello.it/">JustB</a>, sull&#8217;uso della coppia di chiamate <a href="http://en.wikipedia.org/wiki/Setjmp"><font face="monospace">setjmp/longjmp</font></a> del C e se valesse la pena sfruttarle per emulare le eccezioni del C++ in C.</p>
<p><a href="http://rejex.wordpress.com/2009/02/19/emulare-la-gestione-delle-eccezioni-cplusplus-in-c/">Avendoci già provato</a> a suo tempo &#8211; con esito positivo -, ho confermato questa possibilità, osservando però che l&#8217;utilità pratica, a mio giudizio, è scarsa o nulla: </p>
<blockquote><p><em>&#8220;&#8230; il 99% delle guide sul C++ sconsiglia di usare le eccezioni (cfr. <a href="http://rejex.wordpress.com/2009/03/09/una-occhiata-alla-google-cpp-style-guide_seconda_parte/">post</a>), figurati reimplementarle in C&#8221;</em></p></blockquote>
<p>Questo però non significa che non si possano fare altre cose interessanti con quelle due funzioni. Così, mi sono ripromesso di mostrargli un altro uso di quelle due &#8220;chiamate&#8221;. Ed ecco qui l&#8217;esempio-risultato.</p>
<p><span id="more-11263"></span></p>
<p><font size='+1' color='#005197'>Costruire un <em>generatore</em> in C</font></p>
<p>Prima di tutto, giusto per evitare equivoci, è bene precisare a che tipo di <em>generatore</em> mi stia riferendo. Da <a href="http://it.wikipedia.org/wiki/Generatore_(informatica)">Wikipedia</a>:</p>
<blockquote><p>In computer science, a generator is a special routine that can be used to control the iteration behaviour of a loop. A generator is very similar to a function that returns an array, in that a generator has parameters, can be called, and generates a sequence of values.</p>
<p>However, instead of building an array containing all the values and returning them all at once, <strong>a generator yields the values one at a time</strong>, which requires less memory and allows the caller to get started processing the first few values immediately. </p>
<p>In short, a generator looks like a function but behaves like an iterator. Generators can be implemented in terms of more expressive control flow constructs, such as coroutines or first-class continuations.</p></blockquote>
<p><a href="http://rejex.files.wordpress.com/2011/10/yield.png"><img src="http://rejex.files.wordpress.com/2011/10/yield.png?w=150" alt="" title="yield" width="150" class="alignleft size-medium wp-image-11293" /></a>Detto ciò, lo scopo di questi post è semplice: voglio costruire qualcosa a cui, data una lista, chiedo via via tutti gli elementi, uno per volta. Quel qualcosa, una funzione, deve tuttavia essere in grado di fornire l&#8217;elemento successivo rispetto a quello della richiesta precedente.</p>
<p>Nulla di particolarmente complicato di per sè &#8211; un paio di variabili dichiarati statici e via -, ma quello che volevo tentare di emulare &#8211; o anche solo avvicinare negli effetti &#8211; è la <font face="monospace"><a href="http://msdn.microsoft.com/it-it/library/9k7k7cf0(v=vs.80).aspx">yield</a></font> del C#. Questa istruzione fa da sola tutto quello che ci si aspetta. Prendiamo l&#8217;<a href="http://en.wikipedia.org/wiki/Generator_(computer_science)#C.23">esempio di Wikipedia</a> in C# 2+:<br />
<pre class="brush: csharp;">
// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable&lt;int&gt; GetEven(IEnumerable&lt;int&gt; numbers) {
    foreach (int i in numbers) {
        if ((i % 2) == 0) {
            yield return i;
        }
    }
}
</pre></p>
<p>La funzione <font face="monospace">GetEven</font> riceve una lista (<em>tipo enumerato</em>) di numeri e restituisce il primo elemento pari rispetto all&#8217;ultima invocazione. Il meccanismo per cui, trovato un elemento pari nella lista, la funzione torna subito per poi riprendere la ricerca da quel punto nel caso di un&#8217;invocazione successiva della funzione è gestita dal compilatore attraverso l&#8217;istruzione <font face="monospace">yield</font>.</p>
<p>In pratica appena prima di ritornare un numero, il compilatore C# in automatico salva dove è arrivato cosicché può riprendere da lì in un secondo momento.</p>
<p>Ecco, lo scopo di questo <strong>esempio didattico</strong>, è ottenere qualcosa di simile in C++ attraverso il duo <font face="monospace">setjmp/longjmp</font> &#8220;ereditato&#8221; dal C.</p>
<p><font size='+1' color='#005197'>Qualche spiegazione</font></p>
<p>L&#8217;idea chiave è banale: con la <font face="monospace">setjmp</font> salviamo il punto dove saltare e con la <font face="monospace">longjmp</font> ri-saltiamo &#8220;dove c&#8217;eravamo lasciati alla puntata precedente&#8221;.</p>
<p>La realizzazione è un filo più complessa nel senso che il codice che gestisce i salti è racchiuso in una funzione <em>templated</em>, <font face="monospace">stlNext</font>, adatta ad essere usata su <em>container <a href="http://it.wikipedia.org/wiki/Standard_Template_Library">STL</a></em> diversi, come <em>vector</em> e <em>deque</em>. Lo spostamento vero e proprio in avanti fra gli elementi  viene effettuato attraverso un iteratore costante (<em>giusto per non usare indici e rendere le cose più interessanti</em>).</p>
<p>Per verificare la bontà del meccanismo, un&#8217;altra piccola funzione <em>templated</em> di test, <font face="monospace">printAllElements</font>, itera su tutti gli elementi di un container, fino ad arrivare alla fine, in cui verrà lanciata l&#8217;eccezione standard <font face="monospace"><a href="http://www.cplusplus.com/reference/std/stdexcept/out_of_range/">out_of_range</a></font>.</p>
<p>Potete verificare i salti osservando come l&#8217;assegnamento iniziale del riferimento al container input (<em>&#8220;[assignment]&#8221; verrà stampato sullo standard output</em>) avviene solamente la prima volta che la funzione <font face="monospace">stlNext</font> viene invocata su quel container.</p>
<p>Per rendere le cose più divertenti, ho aggiunto la possibilità di resettare (<em>cioè ripartire dall&#8217;inizio o quasi</em>) <font face="monospace">stlNext</font>, impostando a <em>true</em> l&#8217;omonimo parametro-flag.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Come ho già detto, questo codice va considerato come un <strong>puro esempio didattico</strong>. Non lo userei mai nè francamente ne vedo l&#8217;utilità, avendo fra l&#8217;altro già a disposizione gli iteratori nel caso dei <em>container STL</em>.</p>
<p>Ero in vena di sperimentare e ho sperimentato, fine della traccia. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></td>
</tr>
</table>
<p></p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>In questo post ho parlato di generatori realizzati salvando l&#8217;&#8221;ambiente&#8221; (stack) con la <font face="monospace">setjmp</font> per poi ritornarci con la <font face="monospace">longjmp</font>.</p>
<p>Questo è il concetto-chiave delle <a href="http://it.wikipedia.org/wiki/Continuazione"><strong>continuazioni</strong></a>:</p>
<blockquote><p>In informatica, una continuazione (continuation in inglese) è un modo per rappresentare lo stato di esecuzione di un programma (vedi anche <a href="http://it.wikipedia.org/wiki/Stack">Stack</a>) ad un punto dato. Molti linguaggi hanno un costrutto che permette di salvare lo stato corrente di esecuzione per poi riprendere l&#8217;esecuzione a partire da questo stato in un momento successivo.</p></blockquote>
<p>Tuttavia, non ho voluto indicare esplicitamente questo post come &#8220;esempio di continuazione&#8221; perchè c&#8217;è chi sostiene che quel duo di chiamate C sia troppo semplice e limitato per ottenerne una &#8220;seria&#8221;, al contrario della ben più potente famiglia di chiamate C di cui fa parte <font face="monospace"><a href="http://en.wikipedia.org/wiki/Setcontext">setcontext</a></font>:</p>
<blockquote><p>setcontext is one of a family of C library functions (the others being getcontext, makecontext and swapcontext) used for context control. The setcontext family allows the implementation in C of advanced control flow patterns such as iterators, fibers, and coroutines. <strong>They may be viewed as an advanced version of setjmp/longjmp; whereas the latter allows only a single non-local jump up the stack, setcontext allows the creation of multiple cooperative threads of control, each with its own stack.</strong></p></blockquote>
<p>Altri invece sostengono che <font face="monospace">setjmp/longjmp</font> bastino già a creare delle continuation, addirittura per <a href="http://community.schemewiki.org/?call-with-current-continuation-for-C-programmers">emulare in C la <font face="monospace">Call-with-current-continuation</font></a> (<font face="monospace">call/cc</font>) dei linguaggi funzionali come <a href="http://it.wikipedia.org/wiki/Scheme">Scheme</a>.</p>
<p>Non volendo generare nè partecipare a flamewar sull&#8217;argomento, lascio a voi la scelta sulla terminologia che ritenete più corretta e adatta a questo post-esempio.</em></td>
</tr>
</table>
<p><font size='+1' color='#005197'>Il codice</font></p>
<p><pre class="brush: cpp;">
/**
 *	FILE     : CppGeneratorTest.cpp
 *	AUTHOR   : Gian Paolo &quot;JP&quot; Ghilardi (http://rejex.wordpress.com)
 *	LICENSE  : released under the terms of GPL v2.0 (&quot;only&quot;)
 *	COMPILE  : g++ -Wall -pedantic CppGeneratorTest.cpp -o CppGeneratorTest
 *	PURPOSE  : simple example showing how to create a sort of generator [1]
 *             in C++ and test it against some standard STL containers
 *
 *	TESTED ON:
 *	- Linux Debian 6.0.3 32-bit, GCC 4.4.5
 *	- Linux Ubuntu 11.10 64-bit, GCC 4.6.1 &amp; Clang++ 2.9
 *	- Windows 7,  x86 32-bit, GCC 4.6.1 &amp; MS VSC++ 2010 SP1 (Release Mode)
 *	- Windows XP, x86 32-bit, GCC 4.6.1 &amp; MS VSC++ 2010 SP1 (Release Mode)
 *
 *	REFERENCES:
 *	[1]: http://en.wikipedia.org/wiki/Generator_%28computer_science%29#C.23
 *	[2]: http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx
 *	[3]: http://www.sgi.com/tech/stl/Container.html
 *	[4]: http://www.cplusplus.com/reference/clibrary/csetjmp/
 *	[5]: http://www.cplusplus.com/reference/clibrary/csetjmp/longjmp/
 *	[6]: http://www.cplusplus.com/reference/std/stdexcept/out_of_range/
 *	[7]: http://www.cprogramming.com/tutorial/templated_functions.html
 */

#include &lt;csetjmp&gt; // [3, 4]
#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;stdexcept&gt;
#include &lt;string&gt;
#include &lt;deque&gt;
#include &lt;vector&gt;

using namespace std;

template&lt;typename T&gt;
static typename T::value_type stlNext(const T&amp; input, bool reset = false)
{
	static jmp_buf env;
	static int val = -1;

	if(val != -1) // Jump to first saved point (if already set)
	{
		cout &lt;&lt; &quot;[jumping]&quot; &lt;&lt; endl;
		longjmp(env, 0);
	}

	static typename T::const_iterator iter = input.begin();
	cout &lt;&lt; &quot;[assignment]&quot; &lt;&lt; endl;

	val = setjmp(env); // Save calling environment for jumps (jump point)
	if(reset == true)  // Handle reset (rewind) request
	{
		cout &lt;&lt; &quot;[re-assignment]&quot; &lt;&lt; endl;
		iter = input.begin();
	}

	if(iter != input.end()) // Check if we've reached the last jump point
	{
		cout &lt;&lt; &quot;[returning next iter]: &quot;;
		return *(iter++);
	}
	else
		throw out_of_range(&quot;[ok: last element reached]&quot;);
}

template &lt;typename T&gt;
static void printAllElements(T&amp; input, bool reset = false)
{
	  try
	  {
		  while(true)
		  {
			  // Fetching the next element from the generator
			  // Note: using template function type inference (no &lt;&gt;) [7]
			  cout &lt;&lt; stlNext(input, reset) &lt;&lt; endl;
			  reset = false; // (Just once!)
		  }
	  }
	  catch (out_of_range&amp; oor)
	  {
	      cerr &lt;&lt; &quot;Out of Range error: &quot; &lt;&lt; oor.what() &lt;&lt; endl;
	  }
}

int main (int argc, char ** argv)
{
	cout &lt;&lt;
		&quot;\nC++ GENERATOR EXAMPLE:\n&quot;
		&quot;Simple C example showing how to create/fake\n&quot;
		&quot;a generator in C++ via setjmp/longjmp\n&quot; &lt;&lt; endl;

	vector&lt;int&gt; v1;
	for(int i=0; i&lt;10; i++)
	  v1.push_back(i);

	cout &lt;&lt; &quot;[Test #1 - int vector]: &quot; &lt;&lt; endl;
	printAllElements(v1);

	vector&lt;string&gt; v2;
	v2.push_back(&quot;A&quot;);
	v2.push_back(&quot;B&quot;);
	v2.push_back(&quot;C&quot;);
	cout &lt;&lt; &quot;\n[Test #2 - string vector]: &quot; &lt;&lt; endl;
	printAllElements(v2);

	v2.push_back(&quot;E&quot;);
	v2.push_back(&quot;F&quot;);
	v2.push_back(&quot;G&quot;);
	cout &lt;&lt; &quot;\n[Test #3 inserts and rewind of previous vector]: &quot; &lt;&lt; endl;
	printAllElements(v2, true);

	deque&lt;string&gt; d1;
	d1.push_back(&quot;H&quot;);
	d1.push_back(&quot;I&quot;);
	d1.push_back(&quot;L&quot;);
	cout &lt;&lt; &quot;\n[Test #4 - string deque]: &quot; &lt;&lt; endl;
	printAllElements(d1);

	cout &lt;&lt; &quot;\n[end]&quot; &lt;&lt; endl;

	return EXIT_SUCCESS;
}
</pre></p>
<p><font size='+1' color='#005197'>Il codice dal vivo</font></p>
<p>A dispetto degli avvertimenti sulle diverse implementazioni di <font face="monospace">setjmp/longjmp</font>, dichiarate spesso come incompatibili, ho testato il codice su diverse piattaforme, ottenendo lo stesso comportamento atteso.</p>
<p>Di seguito uno <em>screenshot</em> del codice, compilato con <a href="http://it.wikipedia.org/wiki/G%2B%2B">G++</a> 4.6.1 e con <a href="http://en.wikipedia.org/wiki/Clang%2B%2B">Clang++</a> 2.9, in esecuzione sulla recentissima Ubuntu 11.10 64-bit.</p>
<p><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=CppGeneratorTest-Ubuntu-Run.png" target="_blank"><img src="http://i275.photobucket.com/albums/jj308/rejectedx/CppGeneratorTest-Ubuntu-Run.png" border="0" alt="CppGeneratorTest Run On Ubuntu 11.10 64-bit" width="400"></a></p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/c-c-plus-plus/'>C++ (C Plus Plus)</a>, <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/c/'>C</a>, <a href='http://rejex.wordpress.com/tag/c-c-plus-plus/'>C++ (C Plus Plus)</a>, <a href='http://rejex.wordpress.com/tag/continuazioni/'>Continuazioni</a>, <a href='http://rejex.wordpress.com/tag/generatori/'>Generatori</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/setjmp-longjmp/'>setjmp / longjmp</a>, <a href='http://rejex.wordpress.com/tag/yield/'>Yield</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11263/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11263&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/10/24/un-piccolo-esempio-di-generatore-in-cpp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/10/yield.png" medium="image">
			<media:title type="html">yield</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/CppGeneratorTest-Ubuntu-Run.png" medium="image">
			<media:title type="html">CppGeneratorTest Run On Ubuntu 11.10 64-bit</media:title>
		</media:content>
	</item>
		<item>
		<title>Sulla morte di Ritchie o sul perchè non tutti fanno notizia pur meritandolo&#8230;</title>
		<link>http://rejex.wordpress.com/2011/10/17/sulla-morte-di-ritchie-o-sul-perche-non-tutti-fanno-notizia-pur-meritandolo/</link>
		<comments>http://rejex.wordpress.com/2011/10/17/sulla-morte-di-ritchie-o-sul-perche-non-tutti-fanno-notizia-pur-meritandolo/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 06:25:43 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Linguaggi]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Sistemi operativi]]></category>
		<category><![CDATA[Filosofia UNIX]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[K&R]]></category>
		<category><![CDATA[Lutti]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Ritchie]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11174</guid>
		<description><![CDATA[Trovo singolare che, mentre la stampa continui ad &#8220;esplorare&#8221; l&#8217;evento-morte di Jobs da ogni punto di vista &#8211; incluse oscure teorie cliniche e relative smentite -, sia passata in sordina la morte di Dennis Ritchie (asso-pigliatutto, il primo?). Si tratta di un fatto singolare perchè &#8211; ebbene sì, oso dirlo! &#8211; Ritchie ha rappresentato e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11174&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Trovo singolare che, mentre la stampa continui ad &#8220;esplorare&#8221; l&#8217;evento-morte di Jobs da ogni punto di vista &#8211; incluse oscure <a href="http://www.corriere.it/esteri/11_ottobre_14/jobs-tumore-cure-giuste-potevano-salvarlo_56088194-f68f-11e0-abf0-c6818ffd4921.shtml">teorie cliniche</a> e relative <a href="http://www.corriere.it/esteri/11_ottobre_15/medico-harward-tumore-jobs-oncologo-manco-laureato_1a28a114-f747-11e0-9ce3-b3213c3a5a87.shtml">smentite</a> -, sia passata in sordina la morte di <a href="http://it.wikipedia.org/wiki/Dennis_Ritchie">Dennis Ritchie</a> (<em>asso-pigliatutto, il primo?</em>).</p>
<p>Si tratta di un fatto singolare perchè &#8211; ebbene sì, oso dirlo! &#8211; Ritchie ha rappresentato e rappresenta per il mondo, con le sue invenzioni, una figura non meno importante di Jobs.</p>
<p>D&#8217;accordo, non ha avuto lo stesso impatto come persona pubblica del fondatore di Apple: non lo si è mai visto presentare un <em><a href="http://en.wikipedia.org/wiki/Keynote">keynote</a></em> nè si ha notizia di suoi discorsi pubblici particolarmente ispirati, <a href="http://news.stanford.edu/news/2005/june15/jobs-061505.html">in stile Jobs</a>. Tuttavia, da informatico, devo togliermi il cappello in segno di rispetto nei suoi confronti. <em><strong>Kudos</strong>!</em></p>
<p>Sto forse esagerando?</p>
<p><span id="more-11174"></span></p>
<p><font size='+1' color='#005197'>Reperto #1: il linguaggio C</font></p>
<p><a href="http://rejex.files.wordpress.com/2011/10/dennis_ritchie.jpg"><img src="http://rejex.files.wordpress.com/2011/10/dennis_ritchie.jpg?w=200" alt="" title="dennis_ritchie" width="200" class="alignleft size-medium wp-image-11184" /></a>Richie è uno dei padri del <a href="http://it.wikipedia.org/wiki/C_%28linguaggio%29"><em>C</em></a>, il linguaggio <strong>con cui gira il mondo dalla fine degli anni &#8217;70</strong>. A dispetto dei difetti &#8211; e ne ha un bel po&#8217; &#8211; questo linguaggio sopravvive tuttora, anzi è vivo e vegeto, al punto che il comitato apposito dell&#8217;ISO sta lavorando al prossimo standard, soprannominato <a href="http://en.wikipedia.org/wiki/C1X"><em>C1X</em></a>.</p>
<p>In un mondo informatico frammentato ed in perenne cambiamento, è un fatto decisamente inusuale un ciclo di vita così lungo. Degno di nota anche che, a differenza di altri linguaggi vetusti <a href="http://rejex.wordpress.com/2011/09/19/sul-software-legacy/">come il COBOL</a>, il C sia così tuttora così usato da comparire al secondo posto fra quelli più usati nella <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">classifica mensile redatta da Tiobe</a>. </p>
<p>Per non parlare della discendenza di questo linguaggio: molti linguaggi sono nati prendendo spunto da esso, almeno inizialmente. Curioso che i primi 6 linguaggi di quella classifica  &#8211; la fetta più significativa di questo mercato! &#8211; siano proprio il C stesso più alcuni derivati, ossia Java, C++, C#, ObjC e PHP.</p>
<p>Prendete ora un qualunque vostro <em>gadget</em> elettronico: ci sono altissime probabilità che il <em><a href="http://it.wikipedia.org/wiki/Firmware">firmware</a></em>, ossia il programma essenziale al suo funzionamento, sia stato scritto in C. Idem una buona parte dell&#8217;eventuale sistema operativo e delle librerie software di basso livello per poter <em>pilotare</em> quel dispositivo.</p>
<p>Checché se ne dica, nel mondo <em><a href="http://it.wikipedia.org/wiki/Embedded">embedded</a></em> il C domina ancora, indisturbato, con buona pace tanto dei suoi limiti, dei suoi difetti progettuali e di tutte le persone che continuano a detestarlo, senza per altro riuscire a rimpiazzarlo. <a href="http://en.wikipedia.org/wiki/Dennis_Ritchie#Quotes">Citando</a> Ritchie:</p>
<blockquote><p><em>&#8220;C is quirky, flawed, and an enormous success.&#8221;</em></p></blockquote>
<p>E <a href="http://www.brainyquote.com/quotes/quotes/d/dennisritc274074.html">ancora</a>:</p>
<blockquote><p><em>&#8220;For infrastructure technology, C will be hard to displace.&#8221;</em></p></blockquote>
<p>Non è più <em>cool</em> da tempo (<em>lo è mai stato?</em>), non ha funzionalità o caratteristiche &#8220;moderne&#8221; come la <em>garbage collection</em>, ha una sintassi contorta che facilita gli errori, ha librerie incoerenti con funzioni dotate di interfacce deliranti, ma nonostante questo fa egregiamente il suo lavoro.</p>
<p>E lo fa <em>dannatamente</em> in fretta, a differenza di molti linguaggi moderni, pieni di <em>feature</em> e per questo estremamente lenti in fase di esecuzione. Per non parlare del livello di <em>portabilità</em> di codice raggiungibile con esso, ossia la possibilità di trasportare il codice, adattandolo e ricompilandolo, fra piattaforme diverse.</p>
<p><strong>All&#8217;utente finale non importa minimamente con cosa e come un oggetto funzioni</strong>, però almeno <em>noi informatici</em> dobbiamo riconoscere al C &#8211; ed ai suoi autori &#8211; i suoi meriti storici ed attuali. Anche se poi lo abbiamo detestato e siamo passati ad altri linguaggi.</p>
<p><strong>Siamo una società informatica ancora basata sul C, almeno in parte.</strong></p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em><a href="http://en.wikipedia.org/wiki/The_C_Programming_Language"><img src="http://upload.wikimedia.org/wikipedia/en/thumb/8/8b/The_C_Programming_Language_2nd_edition_cover.jpg/220px-The_C_Programming_Language_2nd_edition_cover.jpg" alt="" title="K&amp;R" width="150" class="alignleft size-medium wp-image-10804"></a>Il mio rapporto col C non è stato così conflittuale come lo è stato per la maggior parte delle persone che conosco.</p>
<p>Anzi, ammetto di aver perfino apprezzato le migliorie introdotte con lo standard <a href="http://en.wikipedia.org/wiki/C99">C99</a>.</p>
<p>I miei unici due &#8220;nei&#8221; sono legati al libro qui a fianco, il <a href="http://it.wikipedia.org/wiki/Brian_Kernighan">Kerninghan</a> &amp; Ritchie (&#8220;<a href="http://en.wikipedia.org/wiki/The_C_Programming_Language">K&amp;R</a>&#8220;), ed allo stile di indentazione omonimo, nato con quest&#8217;opera.</p>
<p>Nel caso del libro, ricordo di aver trovato diversi errori macroscopici man mano che lo leggevo: chiesi lumi al mio professore, il quale lo bollò come &#8220;blasfemo&#8221;, rimandandomi allo standard (che per altro il K&amp;R diceva di riflettere).</p>
<p>Per quanto concerne l&#8217;indentazione, ho sempre detestato lo <a href="http://en.wikipedia.org/wiki/Indentation_style">stile</a> introdotto da quel libro, l&#8217;omonimo <a href="http://en.wikipedia.org/wiki/Indentation_style#K.26R_style">stile K&amp;R</a>, <a href="http://rejex.wordpress.com/2009/04/30/la-sindrome-apl/">preferendogli</a> il più &#8220;simmetrico&#8221; <a href="http://en.wikipedia.org/wiki/Indentation_style#Allman_style">Allman</a>.</p>
<p>Nonostante ciò, il mio rispetto verso il C ed i suoi autori, Ritchie incluso, permane.</em></td>
</tr>
</table>
<p></p>
<p><font size='+1' color='#005197'>Reperto #2: il sistema operativo UNIX</font></p>
<p><a href="http://www.unix.org/unix_plates.html"><img src="http://www.unix.org/images/unix_plate.jpg" alt="" title="UNIX License Plate" width="250" class="alignleft size-medium wp-image-10804"></a>Con il linguaggio C, Ritchie ed i suoi colleghi, hanno (<em>ri</em>)scritto <a href="http://it.wikipedia.org/wiki/Unix">UNIX</a>, il sistema operativo che volente o nolente continua a comparire qui e là, nelle fattezze di questo o quel discendente-<em>clone</em>.</p>
<p>Non mi va di decantarne le lodi, magari facendo copia &amp; incolla della sua <a href="http://it.wikipedia.org/wiki/Unix#Storia">storia</a> da Wikipedia, ma voglio sottolineare che Linux ed una parte di MacOSX sono sostanzialmente dei discendenti (<em>e rappresentanti di quella famiglia di cui Unix è il capostipite</em>), evoluti e modificati quanto volete, ma pur sempre dei discendenti sotto vari aspetti.</p>
<p><strong>Sì, il vostro iPhone o cellulare con Android (<em>che è Linux</em>), sotto sotto, ha qualcosa a che fare con UNIX</strong>. Per non parlare del linguaggio con cui questi sistemi operativi sono scritti: <em>assembly</em>, C e poi quello volete (<em>C++, Java, ObjC&#8230;</em>).</p>
<p>Mi verrebbe da citare anche <a href="http://it.wikipedia.org/wiki/Microsoft_XENIX">Xenix</a>, lo Unix di Microsoft, ma finiremmo a parlare di protostoria, per cui soprassediamo.</p>
<p>Quello che mi è sempre piaciuto della <em><strong><a href="http://en.wikipedia.org/wiki/Unix_philosophy">filosofia UNIX</a></strong></em>, tramandata nei suoi successori, è la sua semplicità di fondo. <a href="http://www.brainyquote.com/quotes/quotes/d/dennisritc172475.html">Citando</a> ancora una volta Ritchie:</p>
<blockquote><p>&#8220;UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.&#8221;</p></blockquote>
<p>Da <a href="http://en.wikipedia.org/wiki/Unix_philosophy#Mike_Gancarz:_The_UNIX_Philosophy">Wikipedia</a>:</p>
<blockquote><p><a href="http://www.linuxjournal.com/article/2877"><img src="http://images.bizrate.com/resize?sq=254&amp;uid=3839146" alt="" title="The UNIX Philosophy" width="150" class="alignright size-medium wp-image-10804"></a>In 1994 Mike Gancarz (a member of the team that designed the X Window System), drew on his own experience with Unix, as well as discussions with fellow programmers and people in other fields who depended on Unix, to produce The UNIX Philosophy which sums it up in 9 paramount precepts:</p>
<ol>
<li>Small is beautiful.</li>
<li>Make each program do one thing well.</li>
<li>Build a prototype as soon as possible.</li>
<li>Choose portability over efficiency.</li>
<li>Store data in flat text files.</li>
<li>Use software leverage to your advantage.</li>
<li>Use shell scripts to increase leverage and portability.</li>
<li>Avoid captive user interfaces.</li>
<li>Make every program a filter.</li>
</ol>
</blockquote>
<p><strong>Questa è la saggezza informatica lasciataci in eredità dagli autori di UNIX.</strong></p>
<p><font size='+1' color='#005197'>Il valore di una morte</font></p>
<p>Premetto che è giusto piangere ogni singola persona per tutto ciò che essa ha o non ha fatto.</p>
<p>Tuttavia, solo ora che è morto Ritchie e a pochi giorni da quella di Jobs, mi rendo conto che <strong>neppure da morti siamo uguali</strong>. Di più: nel caso di figure in qualche modo pubbliche, non esiste proprio gara fra chi appare e chi, pur non apparendo, cambia il mondo.</p>
<p>Jobs era l&#8217;<em>uomo-immagine</em> della sua azienda, un&#8217;azienda dinamica che continua a far notizia e che, vista l&#8217;esposizione mediatica dovuta al lutto &#8211; sapientemente gestita -, probabilmente ora incrementerà ulteriormente le sue vendite (<em>come è avvenuto <a href="http://en.wikipedia.org/wiki/Death_of_Michael_Jackson#Record_sales">dopo la morte di Michael Jackson</a></em>).</p>
<p>La morte di Ritchie &#8211; triste dirlo &#8211; non fa notizia, almeno all&#8217;infuori di un certo ambito informatico e nonostante il progresso recato dalle sue invenzioni.</p>
<p>E&#8217; lo stesso discorso che capita con le band: nel 99% dei casi, pensando ad una band, ci si ricorda del suo <em><a href="http://it.wikipedia.org/wiki/Frontman">frontman</a></em> &#8211; normalmente il cantante &#8211; ma non degli altri componenti. Ennesimo caso di <a href="http://rejex.wordpress.com/2010/11/22/la-supremazia-del-frontend/">supremazia del <em>frontend</em></a>.</p>
<p>Detto questo, umanamente e professionalmente parlando, mi sarei aspettato un <em>saluto</em> pubblico a Ritchie un po&#8217; più <em>intenso</em>. Non parlo di cordoglio e commozione pubblica al limite del pianto di massa, come è successo con Jobs (<em>ribadisco: ognuno è liberissimo di piangere chi vuole e come vuole</em>), ma nemmeno le poche stringate righe che sono apparse qui e là come funghi, per giunta (<em>temo</em>) prese ed incollate da qualche sito come Wikipedia.</p>
<p>Sono onesto: non mi aspettavo nulla di più dai siti dei quotidiani nazionali, ma qualche riga in più dai cosiddetti &#8220;<em>siti di tecnologia</em>&#8221; francamente sì.</p>
<p>Con, ovviamente, tutte le eccezioni del caso, come l&#8217;articolo &#8220;<a href="http://techcrunch.com/2011/10/15/what-can-we-learn-from-dennis-ritchie/"><em>What Can We Learn From Dennis Ritchie?</em></a>&#8221; di Techcrunch o quello intitolato &#8220;<a href="http://www.wired.com/wiredenterprise/2011/10/thedennisritchieeffect/"><em>Dennis Ritchie: The Shoulders Steve Jobs Stood On</em></a>&#8221; di Wired: due letture estremamente consigliabili.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/c/'>C</a>, <a href='http://rejex.wordpress.com/category/linguaggi/'>Linguaggi</a>, <a href='http://rejex.wordpress.com/category/linux/'>Linux</a>, <a href='http://rejex.wordpress.com/category/mac/'>Mac</a>, <a href='http://rejex.wordpress.com/category/sistemi-operativi/'>Sistemi operativi</a> Tagged: <a href='http://rejex.wordpress.com/tag/c/'>C</a>, <a href='http://rejex.wordpress.com/tag/filosofia-unix/'>Filosofia UNIX</a>, <a href='http://rejex.wordpress.com/tag/jobs/'>Jobs</a>, <a href='http://rejex.wordpress.com/tag/kr/'>K&amp;R</a>, <a href='http://rejex.wordpress.com/tag/linux/'>Linux</a>, <a href='http://rejex.wordpress.com/tag/lutti/'>Lutti</a>, <a href='http://rejex.wordpress.com/tag/macosx/'>MacOSX</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/ritchie/'>Ritchie</a>, <a href='http://rejex.wordpress.com/tag/unix/'>UNIX</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11174&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/10/17/sulla-morte-di-ritchie-o-sul-perche-non-tutti-fanno-notizia-pur-meritandolo/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/10/dennis_ritchie.jpg" medium="image">
			<media:title type="html">dennis_ritchie</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://upload.wikimedia.org/wikipedia/en/thumb/8/8b/The_C_Programming_Language_2nd_edition_cover.jpg/220px-The_C_Programming_Language_2nd_edition_cover.jpg" medium="image">
			<media:title type="html">K&#38;R</media:title>
		</media:content>

		<media:content url="http://www.unix.org/images/unix_plate.jpg" medium="image">
			<media:title type="html">UNIX License Plate</media:title>
		</media:content>

		<media:content url="http://images.bizrate.com/resize?sq=254&#38;uid=3839146" medium="image">
			<media:title type="html">The UNIX Philosophy</media:title>
		</media:content>
	</item>
		<item>
		<title>Sulla pietas mediatica dopo la morte di Jobs&#8230;</title>
		<link>http://rejex.wordpress.com/2011/10/10/sulla-pietas-mediatica-dopo-la-morte-di-jobs/</link>
		<comments>http://rejex.wordpress.com/2011/10/10/sulla-pietas-mediatica-dopo-la-morte-di-jobs/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 06:25:05 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Brontolo]]></category>
		<category><![CDATA[Considerazioni personali]]></category>
		<category><![CDATA[Dijkstra]]></category>
		<category><![CDATA[FOSS]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[Petri]]></category>
		<category><![CDATA[RMS]]></category>
		<category><![CDATA[Software libero]]></category>
		<category><![CDATA[Stallman]]></category>
		<category><![CDATA[stay foolish]]></category>
		<category><![CDATA[Stay hungry]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11085</guid>
		<description><![CDATA[Ognuno ha il diritto e forse il dovere di piangere chi gli è stato a cuore, chi gli ha dato qualcosa in qualche modo. Ricordo con tristezza quando nel 2002 apparve la notizia su Slashdot della morte di Dijkstra. Ai più il suo nome non dirà nulla, ma non a chi ha studiato algoritmi. Non [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11085&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ognuno ha il diritto e forse il dovere di piangere chi gli è stato a cuore, chi gli ha dato qualcosa in qualche modo.</p>
<p>Ricordo con tristezza quando nel 2002 apparve la <a href="http://developers.slashdot.org/story/02/08/07/2254216/edsger-wybe-dijkstra-1930-2002">notizia su Slashdot</a> della morte di <a href="http://it.wikipedia.org/wiki/Edsger_Dijkstra">Dijkstra</a>. Ai più il suo nome non dirà nulla, ma non a chi ha studiato <em>algoritmi</em>. </p>
<p>Non so chi fosse davvero &#8211; a quanto pare, neanche lui <a href="http://en.wikiquote.org/wiki/Edsger_W._Dijkstra#About_E.W._Dijkstra">passava sempre per un simpaticone</a> &#8211; però durante gli studi ne avevo visto e apprezzato l&#8217;opera, per cui ero felice di &#8220;<em>averlo conosciuto</em>&#8220;, seppur in modo effimero e mediato.</p>
<p>Potrei proseguire a lungo negli esempi (<em>es: <a href="http://en.wikipedia.org/wiki/Dennis_Ritchie">Ritchie</a>, uno dei padri del C, scomparso l&#8217;altroieri e <a href="http://en.wikipedia.org/wiki/Carl_Adam_Petri">Petri</a>, inventore delle reti che portano il suo nome</em>), ma il punto chiave è che capisco perfettamente e non sottovaluto affermazioni come:<br />
<blockquote>&#8220;<em>Jobs ha cambiato la mia vita!</em>&#8220;</p></blockquote>
<p>Soprattutto se queste affermazioni provengono da persone che sono riuscite ad affacciarsi ed a destreggiarsi finalmente nel mondo informatico attraverso i prodotti di Apple.</p>
<p>Quello che però non mi piace troppo &#8211; eufemismo &#8211; è la sistematica santificazione o condanna mediatica del defunto Jobs.</p>
<p><span id="more-11085"></span></p>
<p><font size='+1' color='#005197'><em>Pietas</em> ed oltre</font></p>
<p>Esiste una plurisecolare e collaudatissima regola non scritta che impone rispetto verso i defunti, qualcosa secondo cui almeno (<em>almeno!</em>) nel periodo dei funerali, non si dovrebbe parlare male del compianto, chiunque esso sia stato e qualunque azione abbia mai commesso.</p>
<p>Qualcuno ci vede un rispetto più verso il dolore dei congiunti che verso il morto in sè, però è una consuetudine tutto sommato ragionevole ed incoraggiabile.</p>
<p>Quello che invece non è accettabile, per una mera questione di eccesso, sono i corollari abituali per i defunti importanti: l&#8217;incensazione istantanea da un lato, la scarsità di sentimento o perfino l&#8217;inflessibile cattiveria nel ricordarli dall&#8217;altro.</p>
<p>Nella prima categoria annovero tranquillamente l&#8217;immenso <em>baillamme</em> santificatorio attorno alla dipartita di Jobs. Perfino persone che fino a qualche istante prima detestavano Jobs, senza nemmeno provare a nasconderlo pubblicamente, ora si strappano i vestiti in segno di rispetto verso il nemico caduto. <a href="http://it.wikipedia.org/wiki/Onore_delle_armi">Onore delle armi</a>, direbbe qualcuno.</p>
<p>Credo esista però un limite preciso ed estremamente facile da superare oltre il quale si scade nella ruffianeria più becera. Esempio lampante:<br />
<blockquote><em>&#8220;Per rispetto a Jobs rimandiamo la presentazione di questo o quel prodotto.&#8221;</em></p></blockquote>
<p>Diciamo le cose come stanno: il mondo in qualche modo piange Jobs e qualunque presentazione di un prodotto concorrente passerebbe in secondo ordine. Peggio: qualcuno potrebbe arrivare a vedere in ogni azione di un <em>competitor</em> in questo periodo come uno scorno alla morte del capo di Apple ed a invocare una qualche attività di boicottaggio di massa (<em>mai sfidare i fan di qualcosa o di qualcuno: se la prendono sul personale, è la fine!</em>).</p>
<p>Detesto e provo un orrore viscerale per tutti questi tipi di atteggiamento ipocrita &#8211; anche se intuisco benissimo le motivazioni di fondo -, così come non capisco l&#8217;opposto, ossia il non riuscire a tapparsi la bocca per qualche giorno, prima di criticare un defunto, a torto o ragione che sia.</p>
<p>Mi riferisco alle frasi di <a href="http://en.wikipedia.org/wiki/Richard_Stallman">Stallman</a>, il padre del <a href="http://it.wikipedia.org/wiki/Progetto_GNU">progetto GNU</a> e del <a href="http://it.wikipedia.org/wiki/Software_libero">software libero</a>, che ha scelto davvero il momento peggiore per esternare la sua personale opinione sulle azioni di Jobs.</p>
<p>Con la stampa sempre in attesa di trovare il cattivo di turno, che non sa trattenersi, basta mezza parola in più per essere male interpretato e finire sulla pubblica gogna.</p>
<p><font size='+1' color='#005197'>Vediamo un attimo queste parole&#8230;</font></p>
<p>Dal sito ufficiale di <a href="http://stallman.org/archives/2011-jul-oct.html#06_October_2011_">RMS</a>:</p>
<blockquote><p><em>Steve Jobs, the pioneer of the computer as a jail made cool, designed to sever fools from their freedom, has died.</p>
<p>As Chicago Mayor Harold Washington said of the corrupt former Mayor Daley, &#8220;I&#8217;m not glad he&#8217;s dead, but I&#8217;m glad he&#8217;s gone.&#8221; Nobody deserves to have to die &#8211; not Jobs, not Mr. Bill, not even people guilty of bigger evils than theirs. But we all deserve the end of Jobs&#8217; malign influence on people&#8217;s computing.</p>
<p>Unfortunately, that influence continues despite his absence. We can only hope his successors, as they attempt to carry on his legacy, will be less effective.</em>
</p></blockquote>
<p>Tralasciando la discutibile scelta dei tempi ed il tono, a dire il vero non noto qualcosa di particolarmente sconvolgente in queste parole, considerando ovviamente l&#8217;autore di questa affermazione ed il fatto che per i bene informati non sia altro che un <em>déjà vu</em>.</p>
<p>Stallman, per quanto traspare dai suoi scritti, pare avere una visione fortemente ideologizzata della vita, dell&#8217;universo e di tutto quanto. O sei con lui o sei contro ed il metro di giudizio minimo in questo caso è come ti poni rispetto al &#8220;problema&#8221; della libertà del software. Perchè quello per lui è un grosso problema ed una fonte potenziale di Male. Volenti o nolenti, ognuno ha le sue priorità ed i suoi criteri di giudizio. Qualcuno, visto il soggetto in questione, ha perfino pensato di creare un <a href="http://stallmanfacts.com/">sito umoristico</a> in stile Chuck Norris, su di lui ed il suo pensiero.</p>
<p>Jobs nella testa di Stallman non ha mai giocato nella sua squadra del cuore, per cui non mi stupisco del tipo di affermazione-sentenza semplicemente perchè non è la prima volta che <a href="http://daily.wired.it/news/tech/stallman-ipad-io-lo-chiamo-ibad.html">la emette</a>.</p>
<p>Tuttavia, se devo trovare una qualche colpa in tutto questo e prima ancora di entrare nel merito delle affermazioni, è quella di <strong>aver esternato pubblicamente quello che molta gente si limita a pensare &#8211; e non dire! &#8211; di persone appena morte e con la quale non si era in ottimi rapporti</strong>.</p>
<p>Rimane il dubbio se sia meglio chi ogni giorno dice di te pesta e corna, ma al tuo funerale si traveste da agnellino in lutto, o chi osa affermare <em>a caldo</em> che non ti rimpiangerà per le tue azioni. La prima è ipocrisia ed insincerità, la seconda è sincerità al limite della più totale mancanza di tatto.</p>
<p>Una bella gara, non c&#8217;è che dire&#8230;</p>
<p><font size='+1' color='#005197'>Come la penso</font></p>
<p>Dal punto di vista di questo lutto globale, mi colloco <a href="http://www.lastampa.it/_web/cmstp/tmplRubriche/editoriali/hrubrica.asp?ID_blog=41">nella scia di Gremellini</a>, giornalista con cui per altro mi trovo spesso in questa situazione:</p>
<blockquote><p><em>Steve Jobs era un genio, non un santo. Invece i siti e i giornali di tutto il mondo grondano di allusioni celestiali e riferimenti a Buddha e a Gesù, francamente eccessivi. Sono sicuro che lui si accontenterebbe di essere paragonato a Leonardo: un altro che ha cambiato il mondo nutrendosi di conoscenze spirituali per iniziati. Il discorso di Jobs all’università di Stanford &#8211; «La morte è la migliore invenzione della vita» &#8211; non smette di commuovermi, ma devo riconoscere di averlo già letto da qualche parte: in qualsiasi testo ispirato di new (e old) age. [...]</em></p></blockquote>
<p><a href="http://rejex.files.wordpress.com/2011/10/whole-earth-catalog-stay-hungry-stay-foolish.jpg"><img src="http://rejex.files.wordpress.com/2011/10/whole-earth-catalog-stay-hungry-stay-foolish.jpg?w=150" alt="" title="whole-earth-catalog-stay-hungry-stay-foolish" width="150" class="alignleft wp-image-11097" /></a>Anche la &#8220;sua&#8221; celebre frase &#8220;<em><strong>Stay hungry, stay foolish</strong></em>&#8221; in realtà non è sua (<em>grazie all&#8217;amico Samuele per avermelo ricordato</em>), ma è una citazione dal messaggio di addio di una rivista degli anni 70, tale <a href="http://en.wikipedia.org/wiki/Whole_Earth_Catalog"><em>Whole Earth Catalog</em></a>, fra l&#8217;altro esplicitamente indicata da Jobs nel suo famoso discorso di Stanford.</p>
<p>Se proprio vogliamo, potremmo dire che, in puro stile Jobs, ha perfezionato quella frase, riportandola in auge, rendendola celebre e probabilmente imperitura.</p>
<p>Ma non è l&#8217;autore ed è bene dirlo, se no si rischia un effetto simile a quanto prodotto da Fiorello quando mise in musica la poesia <a href="http://it.wikipedia.org/wiki/San_Martino_(poesia)"><em>San Martino</em></a> di Carducci: gli studenti dell&#8217;epoca in cui comparve la canzone, intervistati dai soliti TG, erano certi che Fiorello ne fosse l&#8217;autore, vanificando d&#8217;un colpo il senso ed il significato che il poeta, il vero autore, voleva trasmettere in quell&#8217;opera.</p>
<p><font size='+1' color='#005197'>L&#8217;impatto di Jobs su di me &#8230;</font></p>
<p>Sia chiaro: riconosco a Jobs di aver semplificato l&#8217;accesso al mondo informatico a tante persone, riconosco il suo immenso potere-Jedi sulle folle noto come <a href="http://en.wikipedia.org/wiki/Reality_distortion_field"><em>Reality Distortion Field</em></a>, riconosco la sua dote eccezionale dal punto di vista delle scelte estetiche e nel saper vendere la sua arte a carissimo prezzo a schiere di adoranti acquirenti, ma non altro. Sono ovviamente triste per la sua morte ma, umanamente parlando, non mi ha toccato nel profondo.</p>
<p>Ok, non è del tutto esatto: il già-citato <a href="http://news.stanford.edu/news/2005/june15/jobs-061505.html">discorso-testamento del 2005 a Stanford</a> mi è piaciuto molto. Ricordo con piacere quando lo vidi nel 2005, su suggerimento di un amico in Università, e di come ora, come un buon vino invecchiato, mi sembri migliorato.</p>
<p>A parte quello però, null&#8217;altro. Chissà, magari mi colpirà ora, in modo più profondo, tramite la sua <a href="http://timesofindia.indiatimes.com/tech/news/hardware/Steve-Jobs-authorized-biography-so-his-kids-can-know-him/articleshow/10261690.cms">annunciata biografia autorizzata e postuma</a> &#8211; che verrà data alle stampe a breve -, così come fecero a suo tempo quella di Linus Torvalds, &#8220;<a href="http://en.wikipedia.org/wiki/Just_for_Fun"><em>Just For Fun</em></a>&#8220;, e quella su Stallman, &#8220;<a href="http://static.fsf.org/nosvn/faif-2.0.pdf"><em>Free As in Freedom</em></a>&#8220;. Lo spero vivamente.</p>
<p>A voler ben vedere e ricordare, confesso di aver riso più volte, da informatico, delle mirabolanti feature introdotte da Apple e presentate da lui in persona nel corso del tempo. Ad esempio il meraviglioso, fantasmagorico <em><a href="http://it.wikipedia.org/wiki/Multitasking">multitasking</a></em> nell&#8217;iOS 4. Ricordo di aver pensato in quel frangente: </p>
<blockquote><p><em>Jobs è un genio! È riuscito a spacciare per nuovo, moderno, trendy ed irrinunciabile per l&#8217;utente comune qualcosa di intangibile, che concettualmente è nato negli anni &#8217;70 e funzionava già su macchine che erano ordini di grandezza meno performanti di un iPhone!</em></p></blockquote>
<p>Questo fa di me un bieco oppositore di Jobs e della sua fruttosa creatura?</p>
<p>Non credo: per quasi 6 anni la mia macchina principale è stato un PowerBook G4 Alu e mi sono trovato benissimo, al punto che a volte lo rimpiango ancora. Ma non mi riesce di venerare il capo dell&#8217;azienda che l&#8217;ha prodotto, come se fosse davvero un &#8220;<em>guru di una setta quotata in Borsa</em>&#8221; (<em>cit. sempre da Gremellini</em>). Mio limite? Ovvio che sì!</p>
<p><font size='+1' color='#005197'>&#8230; e quello di Stallman</font></p>
<p>Pur non condividendo affatto la cosa, non mi stupisco però che qualcuno, dimentico delle basilari consuetudini sociali, osi lanciare strali anche nel periodo di grazia che segue un lutto, per giunta così <em>mass-mediatico</em>.</p>
<p>Dico di più: per quanto non abbia apprezzato affatto la tempistica con cui Stallman ha &#8220;salutato&#8221; a suo modo Jobs, per quanto mi trovi spesso sconcertato dall&#8217;uomo-Stallman, dovendo scegliere fra i due, sceglierei comunque quest&#8217;ultimo senza battere ciglio, per rispetto di quello che fa e continua a fare nonostante i suoi modi socialmente grezzi e reprensibili.</p>
<p>Sarà che sono un informatico (<em>lato programmazione</em>) e non ho una naturale predisposizione verso l&#8217;estetica, ma <strong>fra la libertà d&#8217;uso propugnata da RMS e la perfezione estetica di cui Jobs era una sorte di profeta laico, scelgo la prima</strong>. </p>
<p>Ripudio apertamente i bordi taglienti dell&#8217;ideologia fondamentalista libertaria di Stallman, ma so leggere fra le righe e so cosa significhi essere liberi di scegliere, senza restrizioni, ricondividendo quanto ci è stato dato come se si trattasse di un prestito.</p>
<p><a href="http://www.gnu.org/gnu/thegnuproject.html"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Heckert_GNU_white.svg/220px-Heckert_GNU_white.svg.png" width="150" alt="Progetto GNU" class="alignleft" /></a>Se oggi c&#8217;è Linux e lo posso usare così è perchè un certo Linus Torvalds ha scelto di rilasciare il suo kernel con una licenza, la <a href="http://it.wikipedia.org/wiki/GNU_General_Public_License"><em>GPL</em></a>, che è stata creata dal <a href="http://it.wikipedia.org/wiki/Progetto_GNU">Progetto GNU</a> di Stallman. E con Linux molto, molto altro software.</p>
<p>Se ora, da utente finale, ho tanta scelta di software libero ed OpenSource di qualità decente &#8211; perfino dentro i prodotti Apple &#8211; è perchè quel qualcuno <em>taaaanto</em> tempo fa ha intrapreso quella strada. Il cruccio di Stallman è quello che le persone continuino a soffermarsi sugli effetti pratici della sua filosofia, ossia poter usare software a titolo gratuito, e non cosa significhi poter disporre di software libero. A occhio e croce, questa cosa lo <em>manda in bestia</em>.</p>
<p>Detto questo, c&#8217;era davvero qualcuno che si aspettasse che un tipo di persona come è Stallman, riponesse in un angolo, anche solo per un attimo, i suoi ideali per assecondare la diplomazia imposta dalla <em>pietas</em>? Beata ingenuità. Nel caso specifico di RMS, era perfino lecito aspettarsi un suo qualche epitaffio polemico, epitaffio che, come un orologio svizzero, è arrivato puntualmente.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/brontolo/'>Brontolo</a>, <a href='http://rejex.wordpress.com/category/considerazioni-personali/'>Considerazioni personali</a> Tagged: <a href='http://rejex.wordpress.com/tag/brontolo/'>Brontolo</a>, <a href='http://rejex.wordpress.com/tag/considerazioni-personali/'>Considerazioni personali</a>, <a href='http://rejex.wordpress.com/tag/dijkstra/'>Dijkstra</a>, <a href='http://rejex.wordpress.com/tag/foss/'>FOSS</a>, <a href='http://rejex.wordpress.com/tag/gnu/'>GNU</a>, <a href='http://rejex.wordpress.com/tag/jobs/'>Jobs</a>, <a href='http://rejex.wordpress.com/tag/petri/'>Petri</a>, <a href='http://rejex.wordpress.com/tag/rms/'>RMS</a>, <a href='http://rejex.wordpress.com/tag/software-libero/'>Software libero</a>, <a href='http://rejex.wordpress.com/tag/stallman/'>Stallman</a>, <a href='http://rejex.wordpress.com/tag/stay-foolish/'>stay foolish</a>, <a href='http://rejex.wordpress.com/tag/stay-hungry/'>Stay hungry</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11085/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11085/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11085/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11085/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11085/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11085/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11085/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11085/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11085/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11085/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11085/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11085/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11085/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11085/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11085&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/10/10/sulla-pietas-mediatica-dopo-la-morte-di-jobs/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/10/whole-earth-catalog-stay-hungry-stay-foolish.jpg" medium="image">
			<media:title type="html">whole-earth-catalog-stay-hungry-stay-foolish</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Heckert_GNU_white.svg/220px-Heckert_GNU_white.svg.png" medium="image">
			<media:title type="html">Progetto GNU</media:title>
		</media:content>
	</item>
		<item>
		<title>Emulare i namespace in JavaScript&#8230;</title>
		<link>http://rejex.wordpress.com/2011/10/03/emulare-i-namespace-in-javascript/</link>
		<comments>http://rejex.wordpress.com/2011/10/03/emulare-i-namespace-in-javascript/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 06:25:32 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Namespace]]></category>
		<category><![CDATA[Self-Executing Anonymous Function]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=11015</guid>
		<description><![CDATA[Mi rendo conto che è un po&#8217; che parlo di programmazione ma senza codice. Pongo rimedio (spero) alla cosa, proponendo alcuni trucchetti che ho imparato per &#8220;fare le cose per bene&#8221; in JavaScript. Uno di questi, in particolare, riguarda l&#8217;emulazione dei namespace in questo linguaggio. I namespace Tanto per cominciare, è bene definire cosa sia [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11015&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Mi rendo conto che è un po&#8217; che parlo di programmazione ma senza codice. Pongo rimedio (<em>spero</em>) alla cosa, proponendo alcuni trucchetti che ho imparato per &#8220;<em>fare le cose per bene</em>&#8221; in JavaScript.</p>
<p>Uno di questi, in particolare, riguarda l&#8217;emulazione dei <em>namespace</em> in questo linguaggio.</p>
<p><span id="more-11015"></span></p>
<p><font size='+1' color='#005197'>I <em>namespace</em></font></p>
<p>Tanto per cominciare, è bene definire cosa sia e a cosa serva un <em>namespace</em>. Da <a href="http://it.wikipedia.org/wiki/Namespace">Wikipedia</a>:</p>
<blockquote><p><em>Un <strong>namespace</strong>, o in italiano spazio dei nomi, è &#8211; nella terminologia relativa all&#8217;informatica &#8211; una collezione di nomi di entità, definite dal programmatore, omogeneamente usate in uno o più file sorgente.</p>
<p>Lo scopo dei namespace è quello di evitare confusione ed equivoci nel caso siano necessarie molte entità con nomi simili, fornendo il modo di raggruppare i nomi per categorie: attualmente il concetto di namespace è presente esplicitamente nell&#8217;XML, nel linguaggio di programmazione C++ e nelle ultime versioni di PHP, ed implicitamente in altri linguaggi.</em></p></blockquote>
<p><font size='+1' color='#005197'>Perchè servono in JavaScript</font></p>
<p>JavaScript è un linguaggio estremamente potente ma il fatto che tutto sia visibile a tutti &#8211; tutto finisce in un grande calderone, ossia lo <em>scope globale</em> -, può diventare un problema. </p>
<p>Esempio canonico: si crea una funzione e, senza saperlo, questa va a sovrascriverne una omonima, già esistente, creando effetti terribilmente spiacevoli in fase di esecuzione.</p>
<p>Inoltre, per ragioni di opportunità e di qualità di codice, è bello poter <em>compartimentare</em> il proprio codice, suddividendolo in opportune <em>librerie di classi</em> pronte all&#8217;uso e &#8220;<em>sicure</em>&#8220;.</p>
<p>Arriviamo al problema: a differenza di altri linguaggi, il concetto di namespace in JavaScript non esiste in senso stretto. Tuttavia, il linguaggio è sufficientemente potente e flessibile da permettere di emularlo in modo intelligente usando, tanto per cambiare, le <em>funzioni</em>.</p>
<p><font size='+1' color='#005197'>L&#8217;esempio: note implementative</font></p>
<p>Nell&#8217;esempio che vi riporto di seguito mostrerò come è possibile creare e gestire un namespace in modo sicuro, ossia evitando di buttare tutto nel calderone.</p>
<p><a href="http://rejex.files.wordpress.com/2011/10/js-namespace-test.png"><img src="http://rejex.files.wordpress.com/2011/10/js-namespace-test.png?w=300&#038;h=83" alt="" title="js-namespace-test" width="300" height="83" class="alignleft size-medium wp-image-11074" /></a>In particolare i due file &#8220;<em>namespace-test-1.js</em>&#8221; e &#8220;<em>namespace-test-2.js</em>&#8221; contengono la definizione di 2 classi &#8211; <em>MyObject</em> il primo, <em>MyObject2</em> il secondo &#8211; che appartengono entrambi allo stesso namespace &#8211; &#8220;<em>MyNamespace.Sub</em>&#8221; &#8211; senza intromissioni e senza l&#8217;obbligo di caricare un file prima dell&#8217;altro: il primo dei due file caricati, crea il namespace anche per l&#8217;altro.</p>
<p>Per ottenere il namespace sfrutteremo delle semplici funzioni, le quali definiscono uno <a href="http://it.wikipedia.org/wiki/Scope"><em>scope</em></a> (<em>ambito di visibilità</em>) preciso e ristretto per le variabili e le funzioni contenute. Da <a href="http://stackoverflow.com/questions/500431/javascript-variable-scope/500435#500435">StackOverflow</a>:</p>
<blockquote><p>Variables declared globally have a global scope. Variables declared within a function are scoped to that function, and shadow global variables of the same name.</p></blockquote>
<p>In particolare, il trucco per ottenere un namespace &#8220;sicuro&#8221;, consiste nell&#8217;usare una <strong><em>Self-Executing Anonymous Function</em></strong>. Il nome è altisonante ma il concetto è semplicissimo: <strong>si crea una funzione-contenitore e la si esegue immediatamente</strong>, isolando quindi il suo contenuto dal resto del mondo. Da <a href="http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/">qui</a>:</p>
<blockquote><p><em>Another common technique that you can use to protect the global namespace is to use a <strong>Self-Executing Anonymous Function</strong>.</p>
<p>This is just a fancy term to refer to a function with no name that is immediately executed after it’s defined. The value of this technique is that you can create a wrapper around your code that protects it from the global namespace. </p>
<p>By using the most simple version of the Self-Executing Anonymous Function you can create code that is exclusively private.</em></p></blockquote>
<p>Il mio esempietto, che riprende quello della pagina sopra-citata, è anch&#8217;esso basato e modellato sulla celebre libreria <a href="http://it.wikipedia.org/wiki/JQuery"><em>jQuery</em></a> e lo si può notare nel modo in cui è possibile inizializzare gli oggetti, tramite un singolo parametro-mappa (<em>propriamente un oggetto creato tramite <a href="http://www.dyn-web.com/tutorials/obj_lit.php">literal notation</a></em>) contenente le &#8220;<em>opzioni</em>&#8221; per il costruttore.</p>
<p>Nel momento in cui l&#8217;oggetto viene creato (<em>cioè la funzione viene chiamata</em>) questa mappa-parametro viene unita ad un&#8217;altra mappa (<em>tramite la funzione <a href="http://api.jquery.com/jQuery.extend/">$.extend()</a> di jQuery</em>), interna, contenente le opzioni di base, eventualmente sovrascrivendole.</p>
<p>In questo modo si ha la flessibilità del poter variare i nomi dei parametri partendo però da valori di default accettabili e senza dover inserire tonnellate di blocchi &#8220;<em>if</em>&#8221; per gestire tutti i parametri richiesti ma non inseriti dall&#8217;utente.</p>
<p>Inoltre, usare una mappa con i nomi dei campi definiti esplicitamente aumenta enormemente la leggibilità nella creazione degli oggetti.</p>
<p>Infine, sempre <a href="http://www.tvidesign.co.uk/blog/improve-your-jquery-25-excellent-tips.aspx#tip10">in stile jQuery</a>, ogni oggetto creato ritorna un riferimento a sè stesso (<font face="monospace">return this</font>), in modo da permettere il &#8220;<em>chaining</em>&#8221; delle funzioni/metodi.</p>
<p><font size='+1' color='#005197'>L&#8217;esempio in dettaglio</font></p>
<p>L&#8217;esempio è abbastanza semplice ed è pensato a mo&#8217; di <em>template</em>, ossia come base riciclabile all&#8217;infinito.</p>
<p>Nella funzione <em>$(document)<a href="http://api.jquery.com/ready/">.ready()</a></em>, una sorta di <em>main</em>, del file <em>index.html</em> creo 4 oggetti, i primi 3 di tipo <em>MyNamespace.Sub.MyObject</em> mentre l&#8217;ultimo di tipo <em>MyNamespace.Sub.MyObject2</em>.</p>
<p>Un fatto abbastanza comodo è la possibilità di crearsi degli &#8220;<em>alias</em>&#8221; per accorciare la dichiarazione dei tipi, emulando quindi anche la parola chiave <a href="http://msdn.microsoft.com/en-us/library/sf0df423%28v=vs.80%29.aspx"><em>using</em></a> di linguaggi come C# e C++.</p>
<p>Inizializzerò i primi 3 oggetti in modo diverso, sovrascrivendo a piacere i valori di default e poi invocando immediatamente per ciascuno la funzione che scriverà il contenuto delle opzioni in altrettanti tag <em>span</em>. L&#8217;ultimo oggetto invece viene invocato direttamente e non fa altro che riempiere un altro tag <em>span</em>.</p>
<p><font size='+1' color='#005197'>Il codice</font></p>
<p><pre class="brush: xml;">
&lt;!--
 FILE      : index.html
 AUTHOR    : Gian Paolo &quot;JP&quot; Ghilardi (http://rejex.wordpress.com)
 LICENSE   : released under the terms of GPL v2.0 (&quot;only&quot;)
 PURPOSE   : showing how to create and use a namespace in JavaScript
 --&gt; 
 &lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
        &lt;!-- Basic jQuery library import --&gt;
    	&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-1.6.3.min.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;namespace-test-1.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;namespace-test-2.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot;&gt;
        // &quot;Main&quot; function, automatically called by browser when the page is fully loaded
        $(document).ready(function () {	
				
            // Create an alias (emulate C++/C# &quot;using&quot;)
            var MyObject = MyNamespace.Sub.MyObject; 
			
            new MyObject // 1. Create an object via the alias
            ({
                target: $('#data-contents-1') // No data redefinition
            }).initialize();	
				
            // 2. Create an object via the full namespace &quot;path&quot;
            new MyNamespace.Sub.MyObject 
            ({
                a: &quot;redefined!&quot;, // Redefine one of the defaults
                target: $('#data-contents-2')
            }).initialize();	
				
            // 3. Create (again) an object via the alias
            new MyObject 
            ({
                d: &quot;augmented!!&quot;, // Add a new option
                target: $('#data-contents-3')
            }).initialize();	
				
            // 4. Create an object of the 2nd kind via the full namespace &quot;path&quot;				
            new MyNamespace.Sub.MyObject2('hello world!').fill('#data-contents-4');						
            });		
        &lt;/script&gt;
        &lt;title&gt;JavaScript Namespace Test&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;Testing Namespace in JS:&lt;/h1&gt;
        Contents of the 1st object: &lt;span id='data-contents-1'&gt;&lt;/span&gt;&lt;br&gt;
        Contents of the 2nd object: &lt;span id='data-contents-2'&gt;&lt;/span&gt;&lt;br&gt;
        Contents of the 3rd object: &lt;span id='data-contents-3'&gt;&lt;/span&gt;&lt;br&gt;
        Contents of the 4th object: &lt;span id='data-contents-4'&gt;&lt;/span&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre></p>
<p><pre class="brush: jscript;">
/**
 *	FILE      : namespace-test-1.js
 *	AUTHOR    : Gian Paolo &quot;JP&quot; Ghilardi (http://rejex.wordpress.com)
 *	LICENSE   : released under the terms of GPL v2.0 (&quot;only&quot;)
 *	PURPOSE   : showing how to create and use a namespace in JavaScript
 *
 *	REFERENCES:
 *	[1]: http://stackoverflow.com/questions/881515/javascript-namespace-declaration/5947280#5947280
 *	[2]: http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/
 *	[3]: http://api.jquery.com/jQuery.extend/
 *	[4]: http://javascript.crockford.com/private.html
 */

// Generate or append to MyNamespace namespace [1,2]
(function (MyNamespace, $) {

    MyNamespace.Sub = MyNamespace.Sub || {}; // Define a subnamespace Sub if it doesn't already exist

    // Inject the object class in the subnamespace Sub
    MyNamespace.Sub.MyObject = function (options) {

        /*********************
         * PRIVATE VARIABLES *
         *********************/

        var defaults = {
            target : $('body'),
            a: 'a',
            b: 'b',
            c: 'c'
        };

        /********************
         * PUBLIC VARIABLES *
         ********************/

        // Merge the options into the defaults to create the final data variable
        this.data = $.extend({}, defaults, options);

        /**********************
         * PRIVILEGED METHODS *
         **********************/

        // Initialize the object
        this.initialize = function () {
            var my = this.data;
            my.target.html(dumpObj(this));
        };
       
        /*******************
         * PRIVATE METHODS *
         *******************/

        // Dump the &quot;data&quot; variable contents [3]
        function dumpObj(self) {
            var my = self.data;
            var arr = [];
            $.each(my, function(key, val) {
                var next = key + &quot;: &quot;;
                next += $.isPlainObject(val) ? printObj(val) : val;
                arr.push( next );
            });
            return '{ ' +  arr.join(', ') + ' }';
        }
		
        return this;
    };

} (window.MyNamespace = window.MyNamespace || {}, jQuery)); // End of namespace [1,2]
</pre></p>
<p><pre class="brush: jscript;">
/**
 *	FILE      : namespace-test-2.js
 *	AUTHOR    : Gian Paolo &quot;JP&quot; Ghilardi (http://rejex.wordpress.com)
 *	LICENSE   : released under the terms of GPL v2.0 (&quot;only&quot;)
 *	PURPOSE   : showing how to create and use a namespace in JavaScript
 *
 *	REFERENCES:
 *	[1]: http://stackoverflow.com/questions/881515/javascript-namespace-declaration/5947280#5947280
 *	[2]: http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/
 *	[3]: http://api.jquery.com/jQuery.extend/
 *	[4]: http://javascript.crockford.com/private.html
 */

// Generate or append to MyNamespace namespace [1,2]
(function (MyNamespace, $) {

    MyNamespace.Sub = MyNamespace.Sub || {}; // Define a subnamespace Sub if it doesn't already exist

    // Inject the object class in the subnamespace Sub
    MyNamespace.Sub.MyObject2 = function (message) {
		
       /**********************
        * PRIVILEGED METHODS *
        **********************/

        // Fill the input object with the message
        this.fill = function (objId) {
            $(objId).html(message);
        };
		
        return this;
    };

} (window.MyNamespace = window.MyNamespace || {}, jQuery)); // End of namespace [1,2]
</pre></p>
<p><font size='+1' color='#005197'>Il codice dal vivo</font></p>
<p><a href="http://s275.photobucket.com/albums/jj308/rejectedx/?action=view&amp;current=js-namespace-test.png" target="_blank"><img width="400" src="http://i275.photobucket.com/albums/jj308/rejectedx/js-namespace-test.png" border="0" alt="Namespace in JS: example"></a></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/javascript/'>Javascript</a>, <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/javascript/'>Javascript</a>, <a href='http://rejex.wordpress.com/tag/jquery/'>jQuery</a>, <a href='http://rejex.wordpress.com/tag/namespace/'>Namespace</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/self-executing-anonymous-function/'>Self-Executing Anonymous Function</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/11015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/11015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/11015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/11015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/11015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/11015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/11015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/11015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/11015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/11015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/11015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/11015/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/11015/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/11015/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=11015&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/10/03/emulare-i-namespace-in-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/10/js-namespace-test.png?w=300" medium="image">
			<media:title type="html">js-namespace-test</media:title>
		</media:content>

		<media:content url="http://i275.photobucket.com/albums/jj308/rejectedx/js-namespace-test.png" medium="image">
			<media:title type="html">Namespace in JS: example</media:title>
		</media:content>
	</item>
		<item>
		<title>La velocità è tutto&#8230;</title>
		<link>http://rejex.wordpress.com/2011/09/26/la-velocita-e-tutto/</link>
		<comments>http://rejex.wordpress.com/2011/09/26/la-velocita-e-tutto/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 06:25:38 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Prestazioni]]></category>
		<category><![CDATA[Software bloat]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=9017</guid>
		<description><![CDATA[Non passa giorno che mi debba scontrare con la lentezza di questo o quel dispositivo (PC, tablet, &#8230;) ad accendersi e ad essere realmente usabile. Medesimo discorso per i vari programmi, partendo ovviamente dai sistemi operativi. Nonostante il continuo aumento di prestazioni di questo fatato mondo, non c&#8217;è corrispondenza con un aumento di prestazioni reale, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=9017&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Non passa giorno che mi debba scontrare con la lentezza di questo o quel dispositivo (<em>PC, tablet, &#8230;</em>) ad accendersi e ad essere realmente usabile. Medesimo discorso per i vari programmi, partendo ovviamente dai sistemi operativi.</p>
<p>Nonostante il continuo aumento di prestazioni di questo fatato mondo, non c&#8217;è corrispondenza con un aumento di prestazioni <em>reale</em>, concreto, visibile cioè dal lato utente. Riformulo: hardware e software vanno di pari passo e sussiste qualcosa tipo:</p>
<blockquote><p><em>prestazioni(software * hardware) al tempo t = costante</em></p></blockquote>
<p><span id="more-9017"></span></p>
<p><font size='+1' color='#005197'>Software bloat Vs Prestazioni</font></p>
<p>Penso sia naturale, dopotutto: più le &#8220;macchine&#8221; migliorano e più si possono aggiungere <em>feature</em> nel software, dimenticandosi o non dando troppa attenzione all&#8217;ottimizzazione del codice (<em>&#8220;tanto i PC attuali ce la fanno lo stesso&#8221;</em>). Questo è un esempio di <a href="http://en.wikipedia.org/wiki/Software_bloat"><em>software bloat</em></a> istituzionalizzato:</p>
<blockquote><p><em>Software bloat is a process whereby successive versions of a computer program include an increasing proportion of unnecessary features that are not used by end users, or generally use more system resources than necessary, while offering little or no benefit to its users.</em></p></blockquote>
<p>Questo è dovuto anche alla necessità per le aziende produttrici di hardware e di software di presentare sul mercato sempre qualcosa di nuovo e non sempre le novità introdotte sono così utili, diciamo così.</p>
<p>Ad esempio, perchè per fare le stesse azioni che un utente-medio svolgeva su un PC con Windows XP e 256-512MB di RAM ora serve un PC con Vista/7 e 2+ GB di Ram? Cosa ci ha guadagnato davvero l&#8217;utente finale nel passaggio? <a href="http://en.wikipedia.org/wiki/Windows_Aero"><em>Aero</em></a> può da solo giustificare tutto questo? Ok, il sistema operativo sotto sotto è migliorato, ma dopo 6 mesi di uso relativamente intenso le prestazioni delle due piattaforme, vecchia e nuova, sono tristemente simili (<em>cfr. <a href="http://rejex.wordpress.com/2010/09/06/eutrofizzazione-ed-entropia-dei-sistemi-operativi/">vecchio post</a></em>). Erro?</p>
<p><a href="http://en.wikipedia.org/wiki/Joel_Spolsky">Spolsky</a> in un celebre post, &#8220;<a href="http://www.joelonsoftware.com/articles/fog0000000020.html"><em>Strategy Letter IV: Bloatware and the 80/20 Myth</em></a>&#8220;, tratta questo concetto &#8211; il &#8220;<em>bloatware</em>&#8221; &#8211; dal lato economico, spiegando come tutto debba essere sempre preso in considerazione rispetto ai tempi di rilascio sul mercato, ossia tenendo bene in mente i costi via via ridotti e le prestazioni via via in aumento dei PC.</p>
<p>Tuttavia, concordando anche con Spolsky sugli aspetti economici del suo ragionamento, non mi viene da concordare con lui sugli effetti pratici: perchè comprando un hardware nuovo con del software nuovo, io, utente, devo pagare anche questa tassa occulta sulle prestazioni?</p>
<p><font size='+1' color='#005197'>Dal desktop al web il discorso non cambia</font></p>
<p>Osservando questo &#8220;problema&#8221; dal punto di vista del web, la situazione si ripropone pari pari. Mi riferisco al fatto che una discreta quantità di siti sembrano pensati e testati per lo stesso tipo di hardware e software con cui sono stati sviluppati. O non vengono affatto testati.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><strong>Mai considerare la propria macchina di sviluppo come indicativa per i test</strong>.</p>
<p>Di solito uno sviluppatore sceglie per sè una macchina adeguata al suo lavoro, personalizzata a suo uso e consumo e di solito ben diversa dal tipo di macchina dell&#039;utente finale.</p>
<p>Vista l&#8217;impossibilità pratica di disporre di più macchine diverse per i test, una batteria di virtual machine con differenti configurazioni &#8211; magari browser diversi, <a href="http://john.resig.usesthis.com/">come fa John Resig</a>, l&#8217;autore di <a href="http://it.wikipedia.org/wiki/JQuery"><em>jQuery</em></a> &#8211; potrebbe rappresentare un onesto palliativo.</em></td>
</tr>
</table>
<p></p>
<p>Per cui è facile imbattersi in siti relativamente ben fatti che però richiedono letteralmente megabyte di dati scaricati prima di vedere la sola homepage completa. Il discorso-scusa &#8220;<em>tanto c&#8217;è la cache del browser</em>&#8221; in questo caso non regge: se un utente visita per la prima volta il vostro sito la cache è ovviamente vuota.</p>
<p><font size='+1' color='#005197'>Quantificare la pazienza dell&#8217;utente</font></p>
<p><a href="http://rejex.files.wordpress.com/2011/09/crono.jpg"><img src="http://rejex.files.wordpress.com/2011/09/crono.jpg?w=150" alt="" title="crono" width="150" class="alignleft size-medium wp-image-10991" /></a>Da utente dotato di un ASDL decente trovo fastidioso ben oltre l&#8217;accettabile attendere più di 10 secondi per riuscire a leggere qualcosa &#8211; qualunque cosa &#8211; in un sito. Trovo la cosa doppiamente irritante se ho atteso il caricamento di tonnellate di dati per poi scoprire che quel sito non fa il caso mio, un evento relativamente comune. </p>
<p><strong>La pazienza dell&#8217;utente è quantificabile</strong>. La mia è pari a 30 secondi: se un sito ci mette più di quel tempo a caricare &#8211; e da bravo utente non mi interessa minimamente sapere il perchè &#8211; <strong>cambio sito</strong>.</p>
<p>Sono così stanco di queste futili attese quando navigo, che ormai ho sviluppato una strategia semplice e spesso efficiente. Quando ricerco qualcosa, apro almeno più siti-risultato in parallelo ossia in altrettanti tab del browser. Se il primo tab ci mette più di quei 30 secondi, lo chiudo da tastiera, passando automaticamente al secondo e così via. Se i tab finiscono torno da Google e cambio i termini di ricerca e riprendo da capo.</p>
<p>Non sopporto i rallentamenti nè tollero chi progetta siti senza tener in minimo conto che <strong>il tempo dell&#8217;utente è prezioso</strong> e non va sprecato costringendolo ad attendere il caricamento di inutili orpelli.</p>
<p><font size='+1' color='#005197'>Un altro fattore di rallentamento: la creazione delle pagine dinamiche</font></p>
<p>Non c&#8217;è solo il tempo effettivo di ricezione e caricamento dei dati nel browser, non ci sono solo i ritardi di trasmissione sulla rete, ma nel calderone vanno inclusi i tempi di generazione delle pagine, ossia la composizione delle pagine dinamiche prima dell&#8217;invio all&#8217;utente.</p>
<p>Nel bellissimo post <em>&#8220;<a href="http://www.codinghorror.com/blog/2011/06/performance-is-a-feature.html">Performance is a Feature</a>&#8220;</em> di CodingHorror si parla proprio di questo:</p>
<blockquote><p><em>&#8220;[Google found that] the page with 10 results took 0.4 seconds to generate. The page with 30 results took 0.9 seconds. Half a second delay caused a 20% drop in traffic. Half a second delay killed user satisfaction.</p>
<p>In A/B tests, [Amazon] tried delaying the page in increments of 100 milliseconds and found that even very small delays would result in substantial and costly drops in revenue.</p>
<p>I believe the converse of this is also true. <strong>That is, the faster your website is, the more people will use it</strong>. This follows logically if you think like an information omnivore: the faster you can load the page, the faster you can tell whether that page contains what you want. Therefore, you should always favor fast websites.</p>
<p>The opportunity cost for switching on the public internet is effectively nil, and whatever it is that you&#8217;re looking for, there are multiple websites that offer a similar experience.</p>
<p>So how do you distinguish yourself? <strong>You start by being, above all else, fast.</strong>&#8220;</em></p></blockquote>
<p>Se ne deduce che io, con i miei &#8220;30 secondi di pazienza&#8221;, rientro nella classe di utenti tutto sommato pazienti. Voi in che classe di utenti vi ponete? Quanti secondi di &#8220;latenza&#8221; riuscite a tollerare prima di abbandonare un sito?</p>
<p>Curioso che in tutto questo l&#8217;aspetto dei contenuti sia secondario: i migliori contenuti che si possano trovare sulla Rete valgono poco se l&#8217;utente è già scappato, esasperato dalla lentezza complessiva del sito che li ospita.</p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/category/web/'>Web</a> Tagged: <a href='http://rejex.wordpress.com/tag/prestazioni/'>Prestazioni</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/software-bloat/'>Software bloat</a>, <a href='http://rejex.wordpress.com/tag/web/'>Web</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/9017/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/9017/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/9017/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/9017/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/9017/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/9017/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/9017/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/9017/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/9017/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/9017/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/9017/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/9017/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/9017/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/9017/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=9017&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/09/26/la-velocita-e-tutto/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2011/09/crono.jpg" medium="image">
			<media:title type="html">crono</media:title>
		</media:content>
	</item>
		<item>
		<title>Sul software legacy&#8230;</title>
		<link>http://rejex.wordpress.com/2011/09/19/sul-software-legacy/</link>
		<comments>http://rejex.wordpress.com/2011/09/19/sul-software-legacy/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 06:25:05 +0000</pubDate>
		<dc:creator>jp</dc:creator>
				<category><![CDATA[Mercato del lavoro]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[COBOL]]></category>
		<category><![CDATA[Sistemi legacy]]></category>
		<category><![CDATA[Software legacy]]></category>
		<category><![CDATA[VB6]]></category>

		<guid isPermaLink="false">http://rejex.wordpress.com/?p=10929</guid>
		<description><![CDATA[Per quanto a chiunque piaccia avere a che fare con cose nuove ed originali, generalmente usiamo e continuiamo ad usare anche cose &#8220;vecchie&#8221;, di cui vorremmo disfarci prima o poi, ma che per qualche motivo non possiamo. Naturalmente questo tipo di situazione si verifica anche nel mondo informatico e, nelle vesti delle &#8220;cose vecchie&#8221;, ritroviamo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=10929&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://rejex.wordpress.com/tag/programmazione/"><img class="alignleft wp-image-8676" style="border:0 none;margin:5px;" title="programming" src="http://rejex.files.wordpress.com/2010/09/programming.png?w=100&#038;h=100" alt="" width="100" height="100" /></a>Per quanto a chiunque piaccia avere a che fare con cose nuove ed originali, generalmente usiamo e continuiamo ad usare anche cose &#8220;vecchie&#8221;, di cui vorremmo disfarci prima o poi, ma che per qualche motivo non possiamo.</p>
<p>Naturalmente questo tipo di situazione si verifica anche nel mondo informatico e, nelle vesti delle &#8220;cose vecchie&#8221;, ritroviamo i sistemi legacy. Da <em>Wikipedia</em>:</p>
<blockquote><p><em>Il sistema legacy (tradotto letteralmente &#8220;sistema eredità&#8221;) è un sistema informatico esistente o un&#8217;applicazione che continua ad essere usata poiché l&#8217;utente (tipicamente un&#8217;organizzazione) non vuole o non può rimpiazzarla.</p>
<p>Le ragioni che inducono a mantenere sistemi legacy sono soprattutto dovute ai costi sostenuti per la loro implementazione e ai costi da sostenere per la migrazione a nuovi sistemi. Molte persone usano questo termine per riferirsi a sistemi &#8220;antiquati&#8221; (ma spesso di gran lunga migliori di quelli di nuova concezione).</p>
<p>Con questo termine si indicano quindi i sistemi IT che utilizzano tecnologie meno recenti e per questo motivo sono molto difficili da interfacciare con i sistemi più recenti. Per tale interfacciamento si può ricorrere a sistemi middleware ma il costoso utilizzo di questi ultimi spesso decreta la sostituzione del legacy con tecnologie odierne.</em></p></blockquote>
<p>Generalmente dei sistemi legacy si dicono peste e corna, spesso più per la foga di voler cambiare a tutti i costi qualcosa di ritenuto vecchio (<em>e voler vendere un rimpiazzo</em>) che non per una reale necessità.</p>
<p><span id="more-10929"></span></p>
<p><font size='+1' color='#005197'>Sistemi legacy e sviluppo</font></p>
<p>Da sviluppatore non sono immune al fascino dello speriementare costantemente cose nuove. Da sviluppatore con qualche anno di esperienza ho imparato a non disprezzare quel software che, seppur vecchio, ha contribuito a pagarmi lo stipendio.</p>
<p>Sviluppo è continuare a supportare i sistemi legacy, manutenerli (<em>es: bugfix</em>) ed eventualmente anche estenderli. Quando si inizia a lavorare presso qualcuno è normale doversi impratichire col codice già esistente ed è normale imbattersi in qualcosa che già presenta i segni del tipico sistema legacy oppure lo è già diventato. Non è solo una questione di questa o quella piattaforma, di questo o quel linguaggio di programmazione: prima o poi i componenti dei sistemi legacy, a loro volta legacy, escono di produzione, rendendo tutto più complicato.</p>
<p>C&#8217;è anche da dire che se una cosa funziona, non è necessario sostituirla. In altri casi è necessario farlo e sarebbe utile non aspettare l&#8217;ultimo momento, pena figur&#8230; situazioni spiacevoli come quella che accadde qualche anno fa in California (<em>da <a href="http://developers.slashdot.org/story/08/08/05/1816206/California-Cant-Perform-Pay-Cut-Because-of-COBOL">Slashdot</a></em>):</p>
<blockquote><p><em>&#8220;Last week, California Governor Arnold Schwarzenegger ordered a pay cut, to minimum wage of $6.55/hr, for 200,000 state workers — because a state budget hadn&#8217;t been approved yet.</p>
<p>The state controller, who has opposed the pay cut on principle and legal grounds, now says the pay cut <a href="http://www.sacbee.com/111/story/1132588.html">isn&#8217;t even feasible because the state&#8217;s payroll systems are so antiquated</a>. He says it would take six months to go to minimum wage, and nine months more to restore salaries once a budget is passed.</p>
<p><strong>The system is based on COBOL, according to the Sacramento Bee, and the state hasn&#8217;t yet found the funds or resources, in ten years of trying, to upgrade it.</strong>&#8221; </p>
<p>The article quotes a consultant on how hard it is to find COBOL programmers; he says you usually have to draw them out of retirement. Problem is, if there were any such folks on the employment rolls in California, Gov. Schwarzenegger fired them all last week, too.</em></p></blockquote>
<p>Questo è un esempio di sistema legacy che, come spesso accade, probabilmente ha vissuto ben oltre quanto originariamente previsto (<em>tutto ha una scadenza, anche se non è dichiarata esplicitamente</em>), esattamente come per quei satelliti e sonde spaziali la cui durata di vita viene estesa arbitrariamente per ragioni di costi: finchè vanno, perchè non usarle?</p>
<p>Il problema è quando questo tipo di <em>estensioni di vita arbitrarie</em> toccano la vita delle persone.</p>
<p><a href="http://alexruvinskiy.netau.net/xhtml_css/ex_6_xhtml/factoids_page/cobol_factoids.html"><img src="http://rejex.files.wordpress.com/2011/09/cobol_programmer.png?w=250" alt="" title="cobol_programmer" width="250" class="alignleft wp-image-10943" /></a>Curioso che nel &#8220;fattaccio californiano&#8221; sopra-citato ritorni il solito problema-COBOL, un linguaggio di programmazione dato ingenuamente per morto troppe volte e troppe volte riemerso dal nulla. Una <a href="http://www.codinghorror.com/blog/2009/08/cobol-everywhere-and-nowhere.html">citazione tratta da <em>Coding Horror</em></a> dà un&#8217;idea di come i sistemi scritti in questo linguaggio tuttora siano importanti e <em>rilevanti</em>:</p>
<blockquote><p><em>&#8220;The statistics that surround COBOL attest to its huge influence upon the business world. </p>
<p>There are over 220 billion lines of COBOL in existence, a figure which equates to around 80% of the world&#8217;s actively used code. There are estimated to be over a million COBOL programmers in the world today.</p>
<p><strong>Most impressive perhaps, is that 200 times as many COBOL transactions take place each day than Google searches &#8211; a figure which puts the influence of Web 2.0 into stark perspective.</strong>&#8220;</em></p></blockquote>
<p>Curioso anche che esso e molti sistemi costruiti con esso siano sopravvissuti ai loro programmatori originari, ormai in pensione da tempo e, in mancanza di nuove leve, riesumati a caro prezzo quando serve. Sempre dallo <a href="http://www.codinghorror.com/blog/2009/08/cobol-everywhere-and-nowhere.html">stesso articolo</a>:</p>
<blockquote><p><em>&#8220;<strong><a href="http://en.wikipedia.org/wiki/Y2k">Y2k</a> was like a second gold rush for Cobol programmers who were seeing dwindling need for their skills</strong>. But six-and-a-half years later, there&#8217;s no savior in sight for this fading language.</p>
<p><strong>At the same time, while there&#8217;s little curriculum coverage anymore at universities teaching computer science, &#8220;when you talk to practitioners, they&#8217;ll say there are applications in thousands of organizations that have to be maintained,&#8221;</strong> says Heikki Topi, chair of computer information services at Bentley College in Waltham, Mass., and a member of the education board for the Association for Computing Machinery.&#8221;</em></p></blockquote>
<p><a href="http://dilbert.com/strips/comic/1997-11-04/" title="Dilbert.com"><img width="400" src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/10000/2000/500/12563/12563.strip.gif" border="0" class="alignright" alt="Dilbert.com" /></a>Sottostimare l&#8217;impatto di questi sistemi, anche come prospettiva di impiego è negare l&#8217;evidenza ed illudersi: non si tratta di qualcosa che morirà tanto presto. Si tratta di mercato di nicchia dal punto di vista professionale, ma non dal punto di vista della rilevanza industriale per cui <strong>saper trafficare con questi sistemi legacy, in certi casi, può risultare ben più redditizio di lavorare su cose nuove, moderne e che conoscono tutti</strong>.</p>
<p>Perfino per i neofiti della programmazione.</p>
<p><font size='+1' color='#005197'>Esempio dall&#8217;esperienza</font></p>
<p><a><img src="http://rejex.files.wordpress.com/2011/09/vb6.gif?w=350" width="350" alt="" title="vb6" class="alignleft wp-image-10943" /></a>Durante la mia personale carriera professionale mi sono ritrovato a dover sviluppare e mantenere codice scritto in <a href="http://it.wikipedia.org/wiki/Visual_Basic">Visual Basic 5/6</a>. Ho anche dovuto supportare ed estendere altro codice in quel linguaggio quando era già chiaro che Microsoft stava dedicandosi totalmente alla piattaforma .Net.</p>
<p>Nel mentre cercavamo un modo per &#8220;portare&#8221; il codice verso i più recenti <em>VB.Net</em> o <em>C#</em>, il codice legacy doveva continuare a funzionare: ossia dovevamo fornire supporto ed integrare tutte quelle funzionalità che non richiedessero qualcosa di troppo recente.</p>
<p>In alcuni casi aggiornare il programma equivaleva ad ammodernare la veste estetica: bastava cercare qualche libreria che fornisse un look moderno a certi <em>widget</em> (<em>bottoni, listview, &#8230;</em>) per togliere qualche anno all&#8217;applicazione di turno. Esattamente come fanno (<em>o sostengono di fare</em>) certe creme per la pelle.</p>
<p>Era chiaro tuttavia che, nonostante i trucchi estetici (<em>doppio senso voluto</em>), in poco tempo ci saremmo ritrovati nell&#8217;impossibilità pratica di continuare ad estendere quei programmi dal punto di vista delle <em>feature</em> mentre sviluppavamo i loro rimpiazzi. Tuttavia potevamo contare su un fatto, che spesso viene trascurato da molti programmatori: fornire software nuovo significa, nella maggior parte dei casi, imporre nuovi requisiti a livello di piattaforma per i clienti. Questo, a meno di dover presentare qualcosa in fretta e furia, permette di guadagnare tempo con i clienti, che normalmente si riservano un periodo sufficientemente lungo per decidere il da farsi.</p>
<p>Se la nuova versione di un software richiede un PC più potente per funzionare, visto che sfrutta questa o quella recente tecnologia, il cliente può tranquillamente non accettare questa imposizione. Non basta dire ad un cliente &#8220;<em>funziona meglio!</em>&#8221; per giustificare nuovi investimenti hardware e software: <strong>il cliente deve essere più che convinto della necessità non ulteriormente rimandabile di aggiornare qualcosa, altrimenti semplicemente non lo farà</strong>. Soprattutto se le presunte novità software servono a sostituirne dell&#8217;altro che, nonostante gli anni, continua a funzionare adeguatamente, <strong>per quello che serve al cliente</strong>.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Perchè abbia successo il software nuovo deve fare almeno tutto quello che faceva quello vecchio, possibilmente <strong>nello stesso modo esatto</strong>, ed anche di più. Di certo è ben difficile che un cliente cambi qualcosa senza vantaggi tangibili e senza una qualche garanzia di retrocompatibilità col passato.</p>
<p>Quando dico &#8220;allo stesso modo&#8221;, intendo anche i bug! Ad esempio, parlando di <a href="http://en.wikipedia.org/wiki/Microsoft_Excel#Date_problems">Excel e di retrocompatibilità</a>:</p>
<blockquote><p><strong>Date problems</strong></p>
<p>Excel includes January 0, 1900 and February 29, 1900, incorrectly treating 1900 as a leap year.</p>
<p><strong>The bug originated from Lotus 1-2-3, and was purposely implemented in Excel for the purpose of backward compatibility.</strong> </p>
<p>This legacy has later been carried over into Office Open XML file format.</p></blockquote>
<p></em></td>
</tr>
</table>
<p></p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/attenzione.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Se le cose andranno male, sentirete spesso il cliente lamentarsi con frasi come:</p>
<blockquote><p>&#8230; ma io questa cosa la facevo in un altro modo col vecchio programma!</p></blockquote>
<p>O anche:</p>
<blockquote><p>La versione precedente era più facile da usare!</p></blockquote>
<p>Più questo genere di frase verrà ripetuta e più si farà strada nel cliente la volontà di ripristinare il vecchio sistema o programma. Finchè, stanco di ripetersi, lo farà davvero (o ci tenterà) e per giunta senza dirvi nulla! A buon intenditor&#8230;</em></td>
</tr>
</table>
<p></p>
<p>Ricordo discussioni con amici che, in piena epoca Windows XP SP2+, si trovavano ancora alle prese con programmi per Windows 95, perchè il cliente di turno non ne voleva sapere di aggiornamenti. Fra l&#8217;altro aggiornare può significare fermare qualcosa fino alla fine dell&#8217;intervento. E se quel qualcosa è un impianto che sforna prodotti 24 ore su 24, ininterrottamente? Quanto costa <em>aggiornare per aggiornare</em>?</p>
<p>Io stesso mi sono trovato a dover fornire consulenza per come far funzionare programmi vecchi, progettati addirittura per il DOS e funzionanti in Windows95 (<em>la sopra-citata retrocompatibilità</em>), su sistemi più moderni, basati su Windows2000/XP.</p>
<p>In quel caso il problema non era il vetusto codice a 16bit con cui quei programmi erano stati scritti, quanto le nuove restrizioni di accesso e di uso per le periferiche (<em>seriali e parallele</em>) che non consentivano più ai programmi di fare i propri comodi, incontrollati. Dal sito di uno dei produttori di <a href="http://www.beyondlogic.org/porttalk/porttalk.htm">driver che fornivano una soluzione</a> al problema:</p>
<blockquote><p><em>&#8220;A problem that plagues Windows NT/2000 and Windows XP, is it&#8217;s strict control over I/O ports. Unlike Windows 95 &amp; 98, Windows NT/2000/XP will cause an exception (Privileged Instruction) if an attempt is made to access a port that you are not privileged to talk too.</p>
<p>Actually it&#8217;s not Windows NT that does this, but any 386 or higher processor running in protected mode.&#8221;</em></p></blockquote>
<p><font size='+1' color='#005197'>Il mondo legacy come ambito professionale</font></p>
<p>Il software ed i sistemi possono essere anche legacy, ma i programmatori di certo non lo sono. Trovo normale, ma anche assolutamente controproducente sul lungo periodo, che il mondo dello sviluppo software si concentri solamente sul software nuovo. O dia questa impressione.</p>
<p>Non vedrei male corsi, anche universitari, dedicati a questo mondo. A dire il vero non mancano libri sull argomento (<em>come <a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052">questo</a>, che prima o poi recensirò</em>), ma sono infinitamente pochi rispetto alla massa che propugna solamente il nuovo.</p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Probabilmente scrivere nel proprio CV di essere degli &#8220;esperti nel trattare software legacy&#8221; non vi renderà più &#8220;trendy&#8221;. Però, per quanto mi riguarda, non lo considererei affatto come un demerito, semmai l&#8217;opposto: non tutti accettano di buon grado o sono portati ad aggiustare cose sviluppate da altri, magari anni or sono.</em></td>
</tr>
</table>
<p></p>
<table width="90%">
<tr>
<td style="padding:.2cm;"><img src="http://rejex.files.wordpress.com/2008/10/checkmark.png?w=30&#038;h=30" alt="" width="30" height="30" class="alignnone wp-image-1487" /></td>
<td style="border:ridge 2px;font-family:sans-serif;padding:.25cm;"><em>Con rispetto a quanto detto nel <a href="http://rejex.wordpress.com/2011/09/12/estendere-luso-della-propria-arte/">mio post precedente</a> e in <a href="http://www.yourinspirationweb.com/2011/09/06/ma-si-guadagna-facendo-i-web-designer/">quello</a> originario di Nando Pappalardo, mi verrebbe di suggerire ai web designer/developer la possibilità di ritagliarsi una fetta di mercato nella manutenzione (o anche <a href="http://it.wikipedia.org/wiki/Refactoring">refactoring</a>/redesign se serve) di siti &#8220;legacy&#8221;, creati da altri.</p>
<p>Non è facile da fare, anche per una questione di codice sorgente non sempre disponibile (anche legalmente), ma <strong>non sempre è davvero necessario rifare da zero un sito</strong>, perfino nel caso di progetti apparentemente disastrosi.</p>
<p>Cioè, un professionista web, oltre a soluzioni &#8220;tutto-nuovo-di-zecca&#8221;, potrebbe proporne al cliente anche di meno radicali e costose, che magari riprendono il vecchio ma con come una serie di ritocchi qui e là per ammodernarlo. O perfino soluzioni di assistenza/manutenzione su qualcosa sviluppato da altri.</p>
<p>Non è detto che sia sempre fattibile come cosa, ma è un&#8217;altra <a href="http://rejex.wordpress.com/2009/12/03/lavoro-e-strategia/">strategia</a> su cui può valere la pena riflettere.</p>
<p>Se è il caso e si può farci qualche soldo senza impazzire, perchè no?</em></td>
</tr>
</table>
<p></p>
<p><em>Che ne pensate?</em></p>
<br />Filed under: <a href='http://rejex.wordpress.com/category/mercato-del-lavoro/'>Mercato del lavoro</a>, <a href='http://rejex.wordpress.com/category/programmazione/'>Programmazione</a> Tagged: <a href='http://rejex.wordpress.com/tag/cobol/'>COBOL</a>, <a href='http://rejex.wordpress.com/tag/programmazione/'>Programmazione</a>, <a href='http://rejex.wordpress.com/tag/sistemi-legacy/'>Sistemi legacy</a>, <a href='http://rejex.wordpress.com/tag/software-legacy/'>Software legacy</a>, <a href='http://rejex.wordpress.com/tag/vb6/'>VB6</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rejex.wordpress.com/10929/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rejex.wordpress.com/10929/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rejex.wordpress.com/10929/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rejex.wordpress.com/10929/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rejex.wordpress.com/10929/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rejex.wordpress.com/10929/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rejex.wordpress.com/10929/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rejex.wordpress.com/10929/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rejex.wordpress.com/10929/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rejex.wordpress.com/10929/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rejex.wordpress.com/10929/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rejex.wordpress.com/10929/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rejex.wordpress.com/10929/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rejex.wordpress.com/10929/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rejex.wordpress.com&amp;blog=2279580&amp;post=10929&amp;subd=rejex&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rejex.wordpress.com/2011/09/19/sul-software-legacy/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2ccb6e3091c03063f240ba4a9f1bef68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jp</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2010/09/programming.png" medium="image">
			<media:title type="html">programming</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/09/cobol_programmer.png" medium="image">
			<media:title type="html">cobol_programmer</media:title>
		</media:content>

		<media:content url="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/10000/2000/500/12563/12563.strip.gif" medium="image">
			<media:title type="html">Dilbert.com</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2011/09/vb6.gif" medium="image">
			<media:title type="html">vb6</media:title>
		</media:content>

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/attenzione.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />

		<media:content url="http://rejex.files.wordpress.com/2008/10/checkmark.png" medium="image" />
	</item>
	</channel>
</rss>
