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

<channel>
	<title>Gabriele Lana &#187; programming</title>
	<atom:link href="http://www.gabrielelana.it/archives/category/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gabrielelana.it</link>
	<description>on Agile Methodologies and Programming</description>
	<lastBuildDate>Fri, 07 May 2010 14:12:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CouchDB Performance</title>
		<link>http://www.gabrielelana.it/archives/131</link>
		<comments>http://www.gabrielelana.it/archives/131#comments</comments>
		<pubDate>Sun, 11 Oct 2009 09:36:43 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[couchdb]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=131</guid>
		<description><![CDATA[Finalmente sono riuscito a provare CouchDB con una quantità di dati interessante e su una macchina interessante. L&#8217;obiettivo era quello di verificare se CouchDB poteva reggere un carico di milioni di documenti e se il tempo per il calcolo delle view è effettivamente incrementale e con complessità logaritmica.
Una brevissima introduzione: CouchDB è un database documentale, [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente sono riuscito a provare <a href="http://couchdb.apache.org/">CouchDB</a> con una quantità di dati interessante e su una macchina interessante. L&#8217;obiettivo era quello di verificare se CouchDB poteva reggere un carico di milioni di documenti e se il tempo per il calcolo delle view è effettivamente incrementale e con complessità logaritmica.</p>
<p>Una brevissima introduzione: CouchDB è un database documentale, ogni documento (il record di una tabella in un database relazionale) è insieme di coppie chiave/valore, non esiste uno schema dei dati, ogni documento può contenere qualsiasi insieme di coppie chiave/valore, ad ogni database possono essere associati una o più view (query in un database relazione), ogni view è composta da due funzioni javascript, una funzione <em>map</em> che consente di trasformare ogni documento contenuto nel database in un altro insieme di coppie chiave/valore e di associarle ad una chiave, e una funzione <em>reduce</em> (opzionale) che prende in pasto l&#8217;output della funzione map precedente raggruppata per chiave (una sorta di <em>group by</em> dei database relazionali) e che può essere utilizzata per computare valori aggregati</p>
<p>Un piccolissimo esempio che è molto vicino al test che ho fatto. Supponiamo di avere un database (ovvero un insieme di documenti) di questo tipo</p>
<blockquote><p>
[<br />
  {<br />
    "url": "http://salute.corriere.it/news/some-news.html",<br />
    "visits": 3<br />
  },<br />
  {<br />
    "url": "http://lavoro.corriere.it/index.html",<br />
    "visits": 10<br />
  }<br />
]
</p></blockquote>
<p>Ovvero associamo ad ogni url il numero di volte che è stata visitata. Noi vogliamo sapere il numero di visite per ogni <em>&#8220;sezione&#8221;</em> delle url presenti nel nostro database. Definiamo intuitivamente il significato di <em>&#8220;sezione&#8221;</em> dicendo che l&#8217;url <em>&#8220;http://salute.corriere.it/news/some-news.html&#8221;</em> appartiene a tre sezioni <em>&#8220;corriere.it&#8221;</em>, <em>&#8220;salute.corriere.it&#8221;</em> e <em>&#8220;salute.corriere.it/news&#8221;</em>. Supponiamo di avere a disposizione una funzione <em>&#8220;forEachSectionOf(url,doSomething)&#8221;</em> che prede in pasto una <em>url</em> e richiama la funzione <em>doSomething</em> per ogni sezione dell&#8217;url passandogli la sezione stessa come parametro. La nostra funzione map sarebbe una cosa del tipo</p>
<blockquote><p>
function(doc) {<br />
  forEachSectionOf(doc['url'], function(section) {<br />
    emit(section, doc['visits'])<br />
  });<br />
}
</p></blockquote>
<p>La funzione <em>emit</em> viene chiamata tutte le volte che vi vuole produrre un output, il primo parametro è la chiave del risultato e il secondo è il valore (sia la chiave che il valore possono essere strutture dati complesse, non devono essere per forza valori come in questo caso, ma questa è un&#8217;altra storia). L&#8217;output prodotto dalla <em>map</em> applicata al database di cui sopra sarà</p>
<blockquote><p>
[<br />
  { "corriere.it": 3 },<br />
  { "salute.corriere.it": 3 },<br />
  { "salute.corriere.it/news": 3 },<br />
  { "corriere.it": 10 },<br />
  { "lavoro.corriere.it": 10 }<br />
]
</p></blockquote>
<p>Abbiamo detto che l&#8217;imput alla <em>reduce</em> è l&#8217;output della <em>map</em> raggruppato per chiave, quindi</p>
<blockquote><p>
[<br />
  { "corriere.it": [ 3, 10 ] },<br />
  { &#8220;salute.corriere.it&#8221;: [ 3 ] },<br />
  { &#8220;salute.corriere.it/news&#8221;: [ 3 ] },<br />
  { &#8220;lavoro.corriere.it&#8221;: [ 10 ] }<br />
]
</p></blockquote>
<p>Ricordandoci che vogliamo calcolare il numero di visite per ogni sezione, la reduce è molto semplice</p>
<blockquote><p>
function(keys, values, rereduce) {<br />
  return sum(values)<br />
}
</p></blockquote>
<p>Che produce il risultato atteso</p>
<blockquote><p>
[<br />
  { "corriere.it": 13 },<br />
  { "salute.corriere.it": 3 },<br />
  { "salute.corriere.it/news": 3 },<br />
  { "lavoro.corriere.it": 10 }<br />
]
</p></blockquote>
<p>Il grosso vantaggio di CouchDB in termini di perfomance è che le view vengono calcolate in maniera incrementale, ovvero tutte le volte che interroghi una view CouchDB ricalcola solo i valori relativi ai documenti che sono cambiati o che sono stati aggiunti dall&#8217;ultima volta che la stessa view era stata calcolata (la cosa più vicina a questa nel mondo dei database relazionali sono le <a href="http://download.oracle.com/docs/cd/B10500_01/server.920/a96567/repmview.htm">materialized view</a> di Oracle). Inoltre il costo del calcolo dell&#8217;incremento dovrebbe aumentare in maniera logaritmica rispetto all&#8217;aumentare della dimensione del database.</p>
<p>Ho voluto toccare con mano e quindi ho fatto il seguente esperimento:</p>
<ul>
<li>Fetch di 10000 record da una tabella di mysql contenente 15 milioni di record</li>
<li>Store di ogni record come documento in CouchDB (i documenti non sono stati salvati singolarmente, ma in modalità batch che è molto più performante)</li>
<li>Query della view di CouchDB che equivale al ricalcolo della view stessa</li>
</ul>
<p>Ho misurato ognuna delle tre fasi e l&#8217;ho ripetuto fino a consumare tutti e 15 i milioni di record, di seguito i risultati</p>
<p><a href="http://www.gabrielelana.it/wp-content/uploads/2009/10/urls_per_domain.times.gif"><img src="http://www.gabrielelana.it/wp-content/uploads/2009/10/urls_per_domain.times-300x225.gif" alt="urls_per_domain.times" title="urls_per_domain.times" width="300" height="225" class="aligncenter"/></a></p>
<ul>
<li>Pro: la complessità del ricalcolo della view è effettivamente logaritmico</li>
<li>Pro: il costo d&#8217;inserimento dei documenti in CouchDB è costante (la struttura dati utilizzata è append-only, quindi c&#8217;era da aspettarselo, ma fa comunque piacere verificarlo)</li>
<li>Pro: una volta calcolata la view, i tempi di risposta sono stupefacenti, praticamente istantanei</li>
<li>Pro: il tempo totale d&#8217;inserimento di 15 milioni di documenti è stato di 26 minuti</li>
<li>Pro: l&#8217;occupazione di memoria durante tutto il processo non ha mai superato i 50MB</li>
<li>Contro: il tempo totale di calcolo della view è stato di circa 17 ore. Bisogna tener conto che le view vengono calcolate da funzioni javascript in un processo separato e che la comunicazione fra CouchDB e l&#8217;interprete javascript è stdin/stdout, quindi a parte la velocità dell&#8217;interprete javascript (di default spidermonkey) c&#8217;è anche un costo notevole di serializzazione/deserializzazione. Scommetto che scrivendo le map/reduce direttamente in Erlang questo numero cambierebbe sensibilmente
<li>Contro: lo spazio occupato dal database è di 21GB contro i 7.5GB di mysql (anche se ci metterei un bel chissene visto il costo degli storage)</li>
<li>Contro: lo spazio occupato dalla view è di 32GB (again chissene)</li>
<li>Contro: per ogni database CouchDB usa uno ed un solo processore, quindi anche se avete 16 processori come nel mio caso, non ve ne fate niente a meno di non avere database multipli. Il modello map/reduce implementato da CouchDB potrebbe tranquillamente consentire il partizionamento dei dati su più database, ma attualmente gli sviluppatori si stanno concentrando solamente sulla replicazione, se volete dovete implementare voi il meccanismo di reduce finale</li>
</ul>
<p>Conclusione: se vi trovate in una situazione per cui avete una grande quantità di dati e le query che fate non cambiano spesso, un database come CouchDB potrebbe essere un bel passo in avanti rispetto ad un database tradizionale</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/131/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Code Katas</title>
		<link>http://www.gabrielelana.it/archives/109</link>
		<comments>http://www.gabrielelana.it/archives/109#comments</comments>
		<pubDate>Sun, 04 Oct 2009 16:55:50 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[kata]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=109</guid>
		<description><![CDATA[ Avendo apprezzato Peter Seibel in &#8220;Founders at Work&#8221; ( consigliatissimo) in questi giorni sto leggendo con piacere il suo ultimo lavoro &#8220;Coders at Work&#8221;, stando all&#8217;ultimo suo post anche Joel Spolsky lo sta leggendo.
Joel ha elogiato Jamie Zawinski (uno dei programmatori intervistati da Seibel nel suo libro) per la sua capacità di scrivere velocemente [...]]]></description>
			<content:encoded><![CDATA[<p><img class="on_the_left" src="http://www.gabrielelana.it/wp-content/uploads/2009/10/21nk4xz-150x150.jpg" alt="Coders at Work" title="Coders at Work"/> Avendo apprezzato Peter Seibel in &#8220;Founders at Work&#8221; ( consigliatissimo) in questi giorni sto leggendo con piacere il suo ultimo lavoro &#8220;Coders at Work&#8221;, stando all&#8217;ultimo suo <a href="http://www.joelonsoftware.com/items/2009/09/23.html">post</a> anche Joel Spolsky lo sta leggendo.</p>
<p>Joel ha elogiato Jamie Zawinski (uno dei programmatori intervistati da Seibel nel suo libro) per la sua capacità di scrivere <strong>velocemente</strong> codice <strong>funzionante</strong> e <strong>fruibile</strong> da un utente finale. Joel ha chiamato questo tipo di programmatore &#8220;Duct Tape Programmer&#8221;, un&#8217;etichetta che ha suscitato un bel <a href="http://blog.objectmentor.com/articles/2009/09/24/the-duct-tape-programmer">polverone</a>.</p>
<p>Insomma si parla del solito tradeoff <a href="http://en.wikipedia.org/wiki/Project_triangle">&#8220;time, quality, money &#8211; pick two&#8221;</a>, che poi ufficialmente si traduce <strong>sempre</strong> in &#8220;scegliamo tempo e denaro, per la qualità speriamo di farla franca&#8221;.</p>
<p>Cosa centra tutto questo con i <a href="http://codekata.pragprog.com/">kata</a>? Quando qualcuno si lamenta del fatto che le tecniche che propongo non sono praticabili nella loro realtà perchè non c&#8217;è il tempo (la solita storia del &#8220;bello, ma da noi non si può fare&#8221;), mi ricordo quando anch&#8217;io mi lamentavo della stessa cosa, vedevo la carenza di tempo come la prima ragione di tutti i miei fallimenti, poi però ho iniziato a chiedermi: &#8220;se fino ad oggi non ho <strong>mai</strong> avuto tempo per fare le cose <strong>bene</strong>, come faccio ad essere sicuro di saperle fare? Come faccio ad essere sicuro di riuscire a scrivere codice <strong>pulito</strong> se non ho mai avuto il tempo di scriverlo?&#8221;&#8230; Interessante quesito che ci porta ai kata e alla nozione generale di esercizio</p>
<p>Gli esercizi di programmazione hanno due obiettivi</p>
<ul>
<li>Darci la possibilità di lavorare in un ambiente controllato e privo di vincoli. Il fallimento è visto in maniera positiva, venire a conoscenza dei nostri limiti è l&#8217;unico modo per poterli superare</li>
<li>Visto che non avrete mai il tempo che volete, l&#8217;unica cosa che potete fare è diventare più veloci nello scrivere codice di qualità</li>
</ul>
<p>Il secondo punto ci riporta al tema iniziale: dove sta scritto che per scrivere del buon codice serve tanto tempo? Io sono fermamente convinto che l&#8217;unica ragione per la quale intuitivamente lo pensiamo è perchè quando ci proviamo  facciamo fatica, e l&#8217;unica ragione per la quale facciamo fatica è perchè non siamo abituati/allenati.</p>
<p>Ultimamente ho dedicato un po&#8217; di tempo a pensare ai kata e ad esercitarmi, venerdì della settimana scorsa ho partecipato al <a href="http://www.javascriptcamp.com/">primo javascript camp italiano</a> organizzato da <a href="http://www.ideato.it/">Ideato</a> e ho presentato il kata &#8220;the game of life&#8221; in javascript, è stato molto divertente ed istruttivo</p>
<p>Gli ingredienti per un buon kata/esercizio sono</p>
<ul>
<li>Un problema sfidante per le vostre capacità e per la vostra preparazione</li>
<li>Una o più persone pronte a darvi il loro feedback, fondamentale per capire come e dove migliorarsi</li>
<li>Ripetere l&#8217;esercizio più e più volte finchè sentite che ormai il problema non ha più niente da insegnarvi</li>
</ul>
<p>Il mio consiglio è di provare e di mettervi in gioco, per quanto mi riguarda le prossime mosse saranno: pubblicare gli screencast dei miei kata ed organizzare dei gruppi di esercizio/studio, se siete interessati contattatemi o iscrivetevi <a href="http://groups.google.com/group/milano-codingdojo">milano-codingdojo</a> (non preoccupatevi se non siete di Milano, stiamo organizzandoci per fare qualcosa di distribuito ;-))</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/109/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bowling kata in Erlang</title>
		<link>http://www.gabrielelana.it/archives/102</link>
		<comments>http://www.gabrielelana.it/archives/102#comments</comments>
		<pubDate>Fri, 24 Jul 2009 14:10:54 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[erlang]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/102</guid>
		<description><![CDATA[Qualche giorno fa Robert Martin come esercizio per imparare Clojure ha risolto il kata del bowling (da lui stesso ideato). Qualche programmatore più avvezzo al mondo funzionale ha cassato la soluzione ritenendola troppo &#8220;imperativa&#8221;, accusando non tanto Martin stesso quanto la presenza dei test :-D
L&#8217;argomentazione utilizzata per minimizzare l&#8217;utilità dei test è la semplicità dell&#8217;esercizio, [...]]]></description>
			<content:encoded><![CDATA[<p>Qualche giorno fa <a href="http://objectmentor.com/omTeam/martin_r.html">Robert Martin</a> come esercizio per imparare <a href="http://clojure.org/">Clojure</a> ha <a href="http://blog.objectmentor.com/articles/2009/07/19/uncle-bob-jsps-learning-clojure">risolto</a> il <a href="http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata">kata del bowling</a> (da lui stesso ideato). Qualche programmatore più avvezzo al mondo funzionale ha cassato la soluzione ritenendola troppo &#8220;imperativa&#8221;, accusando non tanto Martin stesso quanto la presenza dei test :-D</p>
<p>L&#8217;argomentazione utilizzata per minimizzare l&#8217;utilità dei test è la semplicità dell&#8217;esercizio, al che ho pensato a come l&#8217;avrei risolto in <a href="http://erlang.org/">Erlang</a>, mi sono detto che &#8220;effettivamente la soluzione è semplice&#8221;, ho iniziato a scriverla provandola nella shell del linguaggio e subito ho provato un senso di fastidio</p>
<p>Continuavo a scrivere e riscrivere (va bhe, la shell ti da la possibilità di richiamare i comandi passati, ma il discorso non cambia) le stesse invocazioni verificando ad occhio il risultato, al che ho capito il senso di fastidio: che differenza c&#8217;è fra quello che stavo facendo e scrivere dei test unitari? Nessuna, tranne che i primi sono effimeri e non ti possono venire in aiuto quando sarai chiamato a fare refactoring. Quindi, amici dei linguaggi funzionali, perchè non vedete i test unitari come delle sessioni di interazione con la shell permanenti e automatiche?</p>
<p>Vi dirò di più, la soluzione che avevo inizialmente pensato era sbagliata :-) Dopo aver passato tutti i test che Martin aveva fatto nella presentazione di cui sopra, mi sono chiesto se potevo rompere il codice in qualche modo, ho visto che non erano coperti dei corner case, per esempio c&#8217;è la partita peggiore (tutti 0), ma non c&#8217;è la partita migliore (tutti strike), scrivo un test&#8230; e non passa :-)</p>
<p>Come vedete qui sotto, utilizzo una variabile per tenere il conto dei frame elaborati, inizialmente non lo facevo e nel caso di uno strike nell&#8217;ultimo frame, i due tiri di bonus successivi metchavano con la terza clausola e venivano considerati dei frame normali, quindi il &#8220;perfect game&#8221; che dovrebbe avere uno score di 300 aveva score 320</p>
<p><script src="http://gist.github.com/154187.js"></script></p>
<p>Alla fine ho guardato il codice e quella variabile arbitraria per contare il numero dei frame proprio non mi andava giù e senza cambiare i test sono arrivato a questa seconda soluzione</p>
<p><script src="http://gist.github.com/154189.js"></script></p>
<p>Che non mi piace perchè anche se rende più esplicito (forse anche più imperativo?) il conto dei frame, secondo me si capisce di meno, sopratutto non mi piace <strong>score_frame</strong> perchè si occupa sia di calcolare lo score di un frame (e fin qui), sia di selezionare i tiri rimanenti eliminando quelli del frame corrente</p>
<p>Cosa ne dite? Quale vi piace di più?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/102/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Quanto ci metterà il resto del mondo a capirlo?</title>
		<link>http://www.gabrielelana.it/archives/101</link>
		<comments>http://www.gabrielelana.it/archives/101#comments</comments>
		<pubDate>Mon, 20 Jul 2009 12:24:50 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/101</guid>
		<description><![CDATA[Semplicemente perfetto:

I&#8217;m gradually coming to the conclusion that software engineering is an idea whose time has come and gone. [...] Consistency and predictability are still desirable, but they haven’t ever been the most important things. For the past 40 years, for example, we’ve tortured ourselves over our inability to finish a software project on time [...]]]></description>
			<content:encoded><![CDATA[<p>Semplicemente perfetto:</p>
<blockquote><p>
I&#8217;m gradually coming to the conclusion that software engineering is an idea whose time has come and gone. [...] Consistency and predictability are still desirable, but they haven’t ever been the most important things. For the past 40 years, for example, we’ve tortured ourselves over our inability to finish a software project on time and on budget. But this never should have been the supreme goal. The more important goal is transformation, creating software that changes the world or that transforms a company or how it does business. [...] Software development is and always will be somewhat experimental. The actual software construction isn&#8217;t necessarily experimental, but its conception is. And this is where our focus ought to be. It&#8217;s where our focus always ought to have been.
</p></blockquote>
<p>Estratto da l&#8217;<a href="http://www2.computer.org/cms/Computer.org/ComputingNow/homepage/2009/0709/rW_SO_Viewpoints.pdf">ultimo</a> articolo di Tom DeMarco. Consideriamo anche che DeMarco non è proprio uno di quei &#8220;giovani rivoluzionari delle metodologie Agili che non hanno ancora capito niente e che vogliono reinventare la ruota&#8221;, è uno dei padri fondatori che si è sparato un po&#8217; tutte le ere geologiche dell&#8217;informatica. Il problema è che di solito passa qualche lustro prima che il pensiero degli illuminati diventi di comune dominio&#8230; speriamo di esserci quando avverrà :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/101/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conferenze di primavera (all4web)</title>
		<link>http://www.gabrielelana.it/archives/99</link>
		<comments>http://www.gabrielelana.it/archives/99#comments</comments>
		<pubDate>Wed, 20 May 2009 06:05:58 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/99</guid>
		<description><![CDATA[Venerdì 08/05/2009, oggi si va ad All4Web, Milano, home sweet home, sono riuscito a svegliarmi ad un&#8217;ora decente, peccato che questa volta mi sono perso :-D Ho seguito pedissequamente le indicazioni che c&#8217;erano sul sito della conferenza, incredibilmente mi hanno condotto al luogo descritto (ero molto fiero di me stesso) peccato che il posto fosse [...]]]></description>
			<content:encoded><![CDATA[<p>Venerdì 08/05/2009, oggi si va ad <a href="http://all4web.kemen.it/jsp/Wiki?Welcome">All4Web</a>, Milano, home sweet home, sono riuscito a svegliarmi ad un&#8217;ora decente, peccato che questa volta mi sono perso :-D Ho seguito pedissequamente le indicazioni che c&#8217;erano sul sito della conferenza, incredibilmente mi hanno condotto al luogo descritto (ero molto fiero di me stesso) peccato che il posto fosse quello sbagliato, ovvero indicazioni giuste per il posto sbagliato, fortunatamente conoscendomi mi ero dato un margine di un&#8217;ora che anche in questo caso purtroppo non è stato sprecato, dopo 2.5 Km a piedi sono arrivato a destinazione (nota: l&#8217;università della Bicocca è enorme, ho anche trovato la <a href="www.guidafinestra.it/allegati/43072.pdf">sede</a> ideale della mia startup&#8230; mmm loft)</p>
<p>Durante la giornata ho incontrato dei <a href="http://www.esteco.com/">ragazzi</a> di Trieste che mi hanno chiesto qualche consiglio su come iniziare ad introdurre le metodologie Agili nella propria azienda, per le due chiacchiere che abbiamo fatto posso dire che sono sulla strada buona, il fatto stesso che economicamente se la stanno passando bene, che non soffrono più di tanto (la sofferenza è uno dei motori principali del cambiamento) e che nonostante questo abbiano tanta voglia di migliorare, gli fa veramente onore, in bocca al lupo ragazzi!</p>
<p>Nota mentale: Milano capitale dell&#8217;IT in Italia&#8230; io direi più Milano capitale della consulenza in Italia, incontro sempre più persone che sviluppano prodotti, anche leader di mercato (come i ragazzi di Trieste), che non hanno niente a che fare con Milano  </p>
<p>Il giudizio generale sulla conferenza è molto buono sopratutto se consideriamo che: è al suo primo anno e che è stata organizzata gratuitamente dalle community locali in collaborazione con l&#8217;università. Nonostante il classico antipattern delle conferenze gratuite (generalmente si presentano molte meno persone rispetto a quelle che si iscrivono), il numerico presente era buono (un centinaio?), gli interventi erano tutti di ottimo livello, unica nota negativa della giornata è stata l&#8217;assenza di studenti in una conferenza universitaria&#8230; no comment&#8230;</p>
<p>Racconto brevemente la storia della presentazione qui sotto: un paio di mesi fa <a href="http://www.agilemovement.it/profile/Marco">Marco Abis</a> mi chiama e mi chiede se voglio parlare ad una coferenza rappresentando <a href="http://www.agilemovement.it">l&#8217;Italian Agile Movement</a>, io: &#8220;certo perchè no&#8221;, vado a vedere di cosa tratta la conferenza&#8230; RIA (Ritch Internet Applications), bene, io e <a href="http://federico.galassi.net/">Federico</a> stiamo sviluppando proprio quello, chiedo a Federico di scrivere la descrizione (scrive meglio di me), la pubblichiamo, al che però Marco sottolinea il fatto che, come rappresentanza delle metodologie Agili dobbiamo trattare quei temi&#8230; ooops, la descrizione era già stata scritta&#8230;</p>
<p>Pensandoci sopra poi ho capito che in realtà le tecnologie che abbiamo scelto io e Federico (tecnologie che erano l&#8217;oggetto della presentazione che volevamo fare) servivano per sostenere il processo produttivo che avevamo in mente, un processo produttivo fortemente iterativo, incrementale ed adattivo, capace di sopravvivere in un contesto di estrema incertezza come quello di una startup. La conclusione è che non è vero che le tecnologie che scegliamo prescindono dalla metodologia di sviluppo, e non vero che la metodologia che scegliamo prescinde dall&#8217;ambiente dal progetto e dal suo ambiente. L&#8217;unico modo per ottenere il <a href="http://en.wikipedia.org/wiki/Lean_software_development#Lean_principles">Total Flow</a>, ovvero l&#8217;eliminazione di tutti gli sprechi, è necessario considerare tutti questi aspetti nella loro globalità</p>
<div style="width:425px;text-align:center;margin:0 auto" id="__ss_1415787"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20090508chesszenall4web-090511005755-phpapp02&#038;stripped_title=sustainable-agile-development" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=20090508chesszenall4web-090511005755-phpapp02&#038;stripped_title=sustainable-agile-development" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/gabriele.lana">gabriele.lana</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/99/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conferenze di primavera (bettersoftware)</title>
		<link>http://www.gabrielelana.it/archives/98</link>
		<comments>http://www.gabrielelana.it/archives/98#comments</comments>
		<pubDate>Thu, 14 May 2009 14:13:56 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/98</guid>
		<description><![CDATA[Non so per quale ragione, ma le conferenze tendono a raggrupparsi in alcuni periodi dell&#8217;anno (probabilmente la ragione c&#8217;è solo che non la conosco), fatto sta che quest&#8217;anno me ne sto facendo una scorpacciata, la ragione per la quale vado alla conferenze è sostanzialmente rivedere alcune persone che incontro soltato in queste occasioni e per [...]]]></description>
			<content:encoded><![CDATA[<p>Non so per quale ragione, ma le conferenze tendono a raggrupparsi in alcuni periodi dell&#8217;anno (probabilmente la ragione c&#8217;è solo che non la conosco), fatto sta che quest&#8217;anno me ne sto facendo una scorpacciata, la ragione per la quale vado alla conferenze è sostanzialmente rivedere alcune persone che incontro soltato in queste occasioni e per conoscerne di nuove, persone stimolanti che mi danno la carica per tutte le attività che porto avanti.</p>
<p>I talk m&#8217;interessano relativamente, è raro assistere ad un talk che parla di un&#8217;argomento di mio interesse all&#8217;interno del quale si dicano cose che non ho già letto e/o sentito, chiaramente questo non dipende dalla preparazione dell&#8217;oratore ma dal fatto che non può dar per scontato che <strong>tutti</strong> i presenti conoscano già determinati argomenti. Alcuni tipi di talk però fanno eccezione, per esempio gli experience report mi piacciono molto</p>
<p>Giovedì 07/05/2009, la giornata inizia subito bene, parto con il treno delle 6:30 da Milano con l&#8217;iphone pieno di <a href="http://www.oredev.org/topmenu/video.4.45b270a411a9ed8e1278000948.html">conferenze</a> (quale cosa migliore di andare ad una conferenza guardandosi altre conferenze), direzione: Firenze, scopo: partecipare a <a href="http://www.bettersoftware.it/">bettersoftware</a>. Arrivati  a Firenze sto per scendere dal treno e becco Simone Genini, grazie al suo aiuto riesco a raggiungere appena in tempo l&#8217;albergo della conferenza (io ho una capacità di perdermi incredibile, talmente incredibile che neanche iphone + google maps mi salvano)</p>
<p>Primo talk (mannaggia a chi ha deciso di far iniziare la conferenza così presto) è stato quello di <a href="http://antoniocangiano.com/">Antonio Cangiano</a> sul mondo delle startup, lui stesso ne sta facendo partire <a href="http://thinkcode.tv/">una</a> e ha condiviso con la platea i suoi pensieri. Sabato (durante <a href="http://www.pycon.it">pycon3</a>) ho avuto modo di parlare con Antonio, è una persona molto simpatica e socievole, mi ha spiegato le idee che stanno alla base di <a href="http://thinkcode.tv/">thinkcode</a> (la sua startup) e devo dire che sarò sicuramente uno dei loro primi clienti (se siete appassionati di programmazione vi consiglio di iscrivervi alla loro ml, se non siete appassionati di programmazione avete sbagliato blog :-))</p>
<p>La giornata è proseguita con i talk di <a href="http://matteo.vaccari.name/">Matteo Vaccari</a>, <a href="http://www.metodiagili.it/">Francesco Cirillo</a> e <a href="http://www.agilemovement.it/profiles/profile/show?id=SimoneCasciaroli&#038;">Simone Casciaroli</a> (Simone perchè non hai un blog?), tre experience report degni di nota. </p>
<p>Scena madre della giornata: Francesco Cirillo sale sul palco e attacca con la <a href="http://www.antiifcampaign.com/">campagna anti-if</a>, dice che ha delle magliette da regalare, ma le regalerà solo a chi dirà qualcosa in grado di colpirlo, al che <a href="http://www.sviluppoagile.it/">Jacopo Romei</a> che era seduto di fianco a me si alza e urla &#8220;Sei Bellissimoooo!!!&#8221;, scoppiano tutti a ridere e lui si becca la maglietta, grande Jacopo, uno ottimo esempio di pensiero creativo :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/98/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction to Erlang @ milano-xpug</title>
		<link>http://www.gabrielelana.it/archives/95</link>
		<comments>http://www.gabrielelana.it/archives/95#comments</comments>
		<pubDate>Sat, 28 Feb 2009 11:04:58 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[erlang]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/95</guid>
		<description><![CDATA[
View more presentations from gabriele.lana. (tags: erlang introduction)

Mi piacerebbe raccontare di più su questo fantastico linguaggio/ambiente, è che mi manca proprio il tempo&#8230;
]]></description>
			<content:encoded><![CDATA[<div style="width:425px;text-align:center;margin:0 auto" id="__ss_1082526"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=20092502erlangmilano-xpug-090228045848-phpapp01&#038;stripped_title=20092502erlangmilano-xpug" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=20092502erlangmilano-xpug-090228045848-phpapp01&#038;stripped_title=20092502erlangmilano-xpug" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/gabriele.lana">gabriele.lana</a>. (tags: <a style="text-decoration:underline;" href="http://slideshare.net/tag/erlang">erlang</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/introduction">introduction</a>)</div>
</div>
<p>Mi piacerebbe raccontare di più su questo fantastico linguaggio/ambiente, è che mi manca proprio il tempo&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/95/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PhpCon 2009</title>
		<link>http://www.gabrielelana.it/archives/94</link>
		<comments>http://www.gabrielelana.it/archives/94#comments</comments>
		<pubDate>Sat, 21 Feb 2009 08:16:59 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/94</guid>
		<description><![CDATA[

  

Quest&#8217;anno sarà ricco d&#8217;impegni pubblici, il primo è alla phpcon in cui terrò due talk: &#8220;Javascript The Good Parts&#8221; insieme a Federico Galassi e &#8220;REST e Resource Oriented Architectures in PHP&#8221;

Come al solito gli argomenti sono un po&#8217; borderline, speriamo bene :-)

]]></description>
			<content:encoded><![CDATA[<p style="clear:left;">
<a class="on_the_left" href="http://phpcon.it/"><br />
  <img src='http://www.gabrielelana.it/wp-content/uploads/2009/02/phpcon_italia_speakerbutton_en-dataesatta.gif' alt='phpcon' /><br />
</a><br />
Quest&#8217;anno sarà ricco d&#8217;impegni pubblici, il primo è alla phpcon in cui terrò due talk: <a href="http://phpcon.it/konferenzen/phpconitalia/sessions/?tid=1156&#038;l=it#session-3">&#8220;Javascript The Good Parts&#8221;</a> insieme a Federico Galassi e <a href="http://phpcon.it/konferenzen/phpconitalia/sessions/?tid=1158&#038;l=it#session-5">&#8220;REST e Resource Oriented Architectures in PHP&#8221;</a></p>
<p>
Come al solito gli argomenti sono un po&#8217; borderline, speriamo bene :-)
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/94/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quanti ne hai letti?</title>
		<link>http://www.gabrielelana.it/archives/90</link>
		<comments>http://www.gabrielelana.it/archives/90#comments</comments>
		<pubDate>Wed, 21 Jan 2009 15:27:10 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/90</guid>
		<description><![CDATA[Fabio, sapendo la mia passione per i libri mi ha mandato una mail chiedendomi quanti dei Top 100 Best Software Engineering Books avessi letto, prontamente ecco la risposta
legenda

* significa comprato e letto (in tutto 58)
+ significa comprato e da leggere (in tutto 6)
- significa non comprato e non letto (in tutto 36)


* Steve McConnell Code [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fabiobeta.it">Fabio</a>, sapendo la mia passione per i libri mi ha mandato una mail chiedendomi quanti dei <a href="http://knol.google.com/k/jurgen-appelo/top-100-best-software-engineering-books/z7e4mx2g6lir/3#">Top 100 Best Software Engineering Books</a> avessi letto, prontamente ecco la risposta</p>
<p>legenda</p>
<ul>
<li><em>*</em> significa comprato e letto (in tutto 58)</li>
<li><em>+</em> significa comprato e da leggere (in tutto 6)</li>
<li><em>-</em> significa non comprato e non letto (in tutto 36)</li>
</ul>
<blockquote><p>
* Steve McConnell Code Complete: A Practical Handbook of Software Construction (2nd Edition)<br />
+ Elisabeth Freeman, etc.  Head First Design Patterns<br />
* Steve McConnell Rapid Development<br />
* Erich Gamma Design Patterns: Elements of Reusable Object-Oriented Software<br />
- Bruce Schneier Applied Cryptography: Protocols, Algorithms, and Source Code (2nd Edition)<br />
* Robert C. Martin Agile Software Development: Principles, Patterns and Practices<br />
* Joel Spolsky Joel on Software<br />
* Tom DeMarco, Timothy Lister Peopleware: Productive Projects and Teams (2nd Edition)<br />
* Frederick P. Brooks The Mythical Man-Month, Anniversary Edition (2nd Edition)<br />
* Martin Fowler Refactoring: Improving the Design of Existing Code<br />
* Mike Cohn Agile Estimating and Planning<br />
* Alistair Cockburn Writing Effective Use Cases<br />
* Bertrand Meyer Object-Oriented Software Construction (2nd Edition)<br />
+ Steve McConnell Software Estimation: Demystifying the Black Art<br />
* Mike Cohn User Stories Applied: For Agile Software Development<br />
- Donald E. Knuth The Art of Computer Programming, Volumes 1-3 Boxed Set (2nd Edition)<br />
* Martin Fowler Patterns of Enterprise Application Architecture<br />
* Jeffrey Friedl Mastering Regular Expressions<br />
* Andrew Hunt, David Thomas The Pragmatic Programmer: From Journeyman to Master<br />
- Karl E. Wiegers Software Requirements (2nd Edition)<br />
* Craig Larman Applying UML and Patterns (3rd Edition)<br />
* Alistair Cockburn Agile Software Development: The Cooperative Game (2nd Edition)<br />
- Gary McGraw Software Security: Building Security In<br />
* Gregor Hohpe, Bobby Woolf Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions<br />
* Tom DeMarco The Deadline: A Novel About Project Management<br />
* Craig Larman Agile and Iterative Development: A Manager&#8217;s Guide<br />
- Eric A. Marks, Michael Bell Service-Oriented Architecture: A Planning and Implementation Guide for Business and Technology<br />
* Thomas H. Cormen, etc.  Introduction to Algorithms, Second Edition<br />
- Thomas Erl Service-Oriented Architecture: A Field Guide to Integrating XML and Web Services<br />
* Martin Fowler UML Distilled: A Brief Guide to the Standard Object Modeling Language (3rd Edition)<br />
* Kent Beck Extreme Programming Explained: Embrace Change (2nd Edition)<br />
+ Alan Shalloway, James Trott Design Patterns Explained: A New Perspective on Object-Oriented Design (2nd Edition)<br />
+ Grady Booch, etc.  Object-Oriented Analysis and Design with Applications (3rd Edition)<br />
* Jim Highsmith Agile Project Management: Creating Innovative Products<br />
* Scott Berkun Making Things Happen: Mastering Project Management<br />
* Jon Bentley Programming Pearls (2nd Edition)<br />
* Paul Duvall, etc.  Continuous Integration: Improving Software Quality and Reducing Risk<br />
- Andrew Stellman, Jennifer Greene Applied Software Project Management<br />
- Clemens Szyperski Component Software: Beyond Object-Oriented Programming<br />
- Arthur J. Riel Object-Oriented Design Heuristics<br />
- Thomas Erl SOA Principles of Service Design<br />
* Mary Poppendieck, Tom Poppendieck Lean Software Development: An Agile Toolkit<br />
* Ken Schwaber Agile Project Management with Scrum<br />
* Ken Schwaber, Mike Beedle Agile Software Development with Scrum<br />
* Joshua Kerievsky Refactoring to Patterns<br />
* Alistair Cockburn Crystal Clear: A Human-Powered Methodology for Small Teams<br />
- Steve McConnell Software Project Survival Guide<br />
* Tom DeMarco, Timothy Lister Waltzing With Bears: Managing Risk on Software Projects<br />
* Venkat Subramaniam, Andy Hunt Practices of an Agile Developer: Working in the Real World<br />
- Kathy Schwalbe Information Technology Project Management<br />
- Randall Hyde Write Great Code: Volume 1: Understanding the Machine<br />
* Scott Rosenberg Dreaming in Code: Two Dozen Programmers, Three Years, 4,732 Bugs, and One Quest for Transcendent Software<br />
* Cem Kaner, etc.  Lessons Learned in Software Testing<br />
* Andy Oram, Greg Wilson Beautiful Code: Leading Programmers Explain How They Think<br />
- Luke Hohmann Beyond Software Architecture: Creating and Sustaining Winning Solutions<br />
- Grady Booch Unified Modeling Language User Guide, The (2nd Edition)<br />
* Karl Fogel Producing Open Source Software: How to Run a Successful Free Software Project<br />
* Michael Feathers Working Effectively with Legacy Code<br />
* Kent Beck Test Driven Development: By Example<br />
- Per Kroll, Philippe Kruchten The Rational Unified Process Made Easy: A Practitioner&#8217;s Guide to the RUP<br />
- Thomas Erl Service-Oriented Architecture: Concepts, Technology, and Design<br />
* Cem Kaner, etc.  Testing Computer Software (2nd Edition)<br />
- Frank Buschmann, etc.  Pattern-Oriented Software Architecture Volume 1: A System of Patterns<br />
* Harold Abelson, Gerald Jay Sussman Structure and Interpretation of Computer Programs &#8211; 2nd Edition<br />
- Dan Pilone UML 2.0 in a Nutshell<br />
- Brett D. McLaughlin, etc.  Head First Object-Oriented Analysis and Design<br />
* Johanna Rothman Manage It!: Your Guide to Modern, Pragmatic Project Management<br />
* James Shore, Shane Warden The Art of Agile Development<br />
- Brian W. Kernighan, Rob Pike The Practice of Programming<br />
* Ron Jeffries, etc.  Extreme Programming Installed<br />
* Scott W. Ambler, Pramodkumar J. Sadalage Refactoring Databases: Evolutionary Database Design<br />
* Jared Richardson, William Gwaltney Ship it! A Practical Guide to Successful Software Projects<br />
- Greg Hoglund, Gary McGraw Exploiting Software: How to Break Code<br />
* Michael Nygard Release It!: Design and Deploy Production-Ready Software<br />
* Edward Yourdon Death March (2nd Edition)<br />
* Stephen P. Berczuk, etc.  Software Configuration Management Patterns: Effective Teamwork, Practical Integration<br />
- Elfriede Dustin, etc.  Automated Software Testing: Introduction, Management, and Performance<br />
- Donald C. Gause, Gerald M. Weinberg Exploring Requirements: Quality Before Design<br />
- Tom Gilb Competitive Engineering<br />
- David J. Agans Debugging<br />
- Eldad Eilam Reversing: Secrets of Reverse Engineering<br />
* Robert L. Glass Facts and Fallacies of Software Engineering<br />
- Martin Fowler Analysis Patterns: Reusable Object Models<br />
+ Matt Weisfeld The Object-Oriented Thought Process (2nd Edition)<br />
* John M. Vlissides Pattern Hatching: Design Patterns Applied<br />
* Johanna Rothman Behind Closed Doors: Secrets of Great Management<br />
- Robert K. Wysocki Effective Project Management: Traditional, Adaptive, Extreme<br />
+ Ellen Gottesdiener Requirements by Collaboration: Workshops for Defining Needs<br />
* Eric Evans Domain-Driven Design: Tackling Complexity in the Heart of Software<br />
- Nick Rozanski, Eóin Woods Software Systems Architecture: Working With Stakeholders Using Viewpoints and Perspectives<br />
- Peter Rob, Carlos Coronel Database Systems: Design, Implementation, and Management (8th Edition)<br />
- Robert Orfali, etc.  Client/Server Survival Guide (3rd Edition)<br />
- Douglas Schmidt, etc.  Pattern-Oriented Software Architecture Volume 2: Patterns for Concurrent and Networked Objects<br />
- Michael Lopp Managing Humans: Biting and Humorous Tales of a Software Engineering Manager<br />
* Paul Graham Hackers and Painters: Big Ideas from the Computer Age<br />
- Philippe Kruchten The Rational Unified Process: An Introduction (3rd Edition)<br />
* Joel Spolsky The Best Software Writing I: Selected and Introduced by Joel Spolsky<br />
* James O. Coplien, Neil B. Harrison Organizational Patterns of Agile Software Development<br />
* Esther Derby, etc.  Agile Retrospectives: Making Good Teams Great<br />
- Henry S. Warren Hacker&#8217;s Delight
</p></blockquote>
<p>In retrospettiva</p>
<ul>
<li>Non esiste la categoria non acquistati ma letti, il che fa trasparire il mio feticismo nei confronti dei libri</li>
<li>Compro più libri di quanti non ne riesca effettivamente a leggere, male, dovrei limitarmi, subisco uno strano effetto: il solo atto di comprare libri mi fa sentire meno ignorante, un po&#8217; come quando vai ad iscriverti in palestra e fai subito l&#8217;abbonamento di 6 mesi perchè tanto questa volta fai sul serio ;-P</li>
<li>&#8220;Structure and Interpretation of Computer Programs&#8221; 64° è un delito, probabilmente nella mia classifica personale, ora come ora, occupa il primo posto</li>
<li>Mi dispiaccio un po&#8217; per non aver letto &#8220;The Practice of Programming&#8221; (fa parte della storia dell&#8217;informatica), &#8220;Exploring Requirements: Quality Before Design&#8221; (tutto cio che ha scritto Gerald M. Weinberg dovrebbe essere letto) e &#8220;Analysis Patterns: Reusable Object Models&#8221; (non so, non l&#8217;ho comprato all&#8217;epoca, poi ho sempre sentito Fowler stesso dichiararlo come &#8220;datato&#8221;, ciò non toglie che a pelle mi sa che mi sono perso qualcosa)</li>
<li>Un po&#8217; di roba l&#8217;ho letta, qualcosa me la ricordo anche, come mai mi sento sempre così ignorante?</li>
</ul>
<p>Per finire, ecco le prove, per lo meno del possesso ;-)</p>
<p><a href='http://www.gabrielelana.it/wp-content/uploads/2009/01/libreria1.jpg' title='liberia'><img style="width: 50%" src='http://www.gabrielelana.it/wp-content/uploads/2009/01/libreria1.jpg' alt='liberia' /></a></p>
<p><a href='http://www.gabrielelana.it/wp-content/uploads/2009/01/libreria2.jpg' title='liberia'><img style="width: 50%" src='http://www.gabrielelana.it/wp-content/uploads/2009/01/libreria2.jpg' alt='liberia' /></a></p>
<p>P.S. Non avevo notato la preoccupante imbarcatura della libreria che tra l&#8217;altro sta sopra la mia testa in questo momento&#8230; 8-O</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/90/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Hidden Value</title>
		<link>http://www.gabrielelana.it/archives/89</link>
		<comments>http://www.gabrielelana.it/archives/89#comments</comments>
		<pubDate>Sat, 10 Jan 2009 11:15:08 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/89</guid>
		<description><![CDATA[Due quote dal libro Hidden Value

If people come for money, they will leave for money


We don’t pay you to work here, we pay you so you can work here

]]></description>
			<content:encoded><![CDATA[<p>Due quote dal libro <a href="http://www.amazon.com/o/ASIN/0875848982">Hidden Value</a></p>
<blockquote><p>
If people come for money, they will leave for money
</p></blockquote>
<blockquote><p>
We don’t pay you to work here, we pay you so you can work here
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/89/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
