<?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>Sat, 04 Jun 2011 15:51:16 +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>Il cravattato</title>
		<link>http://www.gabrielelana.it/archives/197</link>
		<comments>http://www.gabrielelana.it/archives/197#comments</comments>
		<pubDate>Wed, 06 Oct 2010 21:50:06 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=197</guid>
		<description><![CDATA[Chi è costui? Nell&#8217;ultimo post ho attaccato apertamente questa figura, quindi per dare la possibilità al lettore di capire se sto parlando di lui o meno ho pensato di descrivere un po&#8217; meglio questo grottesco personaggio.
Uso il termine &#8220;cravattato&#8221; in tono dispregiativo per identificare quella classe di &#8220;colletti bianchi&#8221; che si piazza fra chi produce [...]]]></description>
			<content:encoded><![CDATA[<p>Chi è costui? <a href="http://www.gabrielelana.it/archives/195">Nell&#8217;ultimo post</a> ho attaccato apertamente questa figura, quindi per dare la possibilità al lettore di capire se sto parlando di lui o meno ho pensato di descrivere un po&#8217; meglio questo grottesco personaggio.</p>
<p>Uso il termine &#8220;cravattato&#8221; in tono dispregiativo per identificare quella classe di &#8220;colletti bianchi&#8221; che si piazza fra chi <strong>produce</strong> valore, chi lo <strong>vende</strong> e chi lo <strong>finanzia</strong>. Questi sono i giocatori principali della partita, in un mercato <strong>libero</strong>, <strong>colto</strong>, virtuoso e meritocratico anche il venditore potrebbe essere eliminato (cosa che si sta verificando sempre più spesso nel nostro ambiente), gli altri fanno da supporto.</p>
<p>Il &#8220;cravattato&#8221; è un ruolo che è stato sapientemente ingegnerizzato nel tempo. Di seguito alcune sue caratteristiche peculiari</p>
<ul>
<li>E&#8217; in una posizione di potere ma spesso non ha competenze specifiche, vedi il <a href="http://en.wikipedia.org/wiki/Peter_Principle">principio di Peter</a></li>
<li>Comanda, ma trova sempre chi è responsabile al posto suo</li>
<li>E&#8217; ammaestratore della burocrazia aziendale</li>
<li>E&#8217; maestro delle cerimonie delle metriche</li>
<li>E&#8217; un anello forte della catena del nulla</li>
</ul>
<p>Certo, persone di questo genere se ne trovano ovunque, qual&#8217;è il problema? Il <strong>mio</strong> problema è che nel mondo del software (quello conosco, di quello parlo e quello m&#8217;interessa migliorare) sono <strong>veramente</strong> numerosi</p>
<p>La presenza di cravattati nel mondo del software dipende sicuramente dall&#8217;impalpabilità del prodotto e dalla difficoltà nel misurarne il valore nel breve periodo. Il cravattato quindi è nato come un indispensabile tramite fra l&#8217;investitore e il programmatore, nel seguito è degenerato inglobando e nascondendo all&#8217;investitore i meccanismi di produzione del valore. Devo ammettere che le ragioni storiche della loro proliferazione probabilmente devono essere ricercate in una inadeguatezza e immaturità nella figura dello sviluppatore, ma oggi è la loro presenza uno dei freni nello sviluppo di questa professione, perchè?</p>
<p>Perchè i numeri sono molto più facili da gestire rispetto alle competenze individuali, assemblare un team di professionisti sarebbe, al confronto, assurdamente complesso e probabilmente al di fuori della sua portata. La proprietà fondamentale che <strong>deve</strong> avere lo sviluppatore è la gestibilità, perchè quello è il lavoro del &#8220;cravattato&#8221; e quindi lo sviluppatore <strong>deve</strong> essere:</p>
<ul>
<li>Moderatamente competente, possibilmente con competenze mirate in modo che non possa vedere l&#8217;inadeguatezza del tutto</li>
<li>Moderatamente costoso, così da poterne comprare di più diminuendo contemporaneamente il budget (vedi sopra alla voce &#8220;maestro delle metriche&#8221;)</li>
<li>Giovane e manipolabile, sopratutto non deve essere conscio del proprio valore, ovvero non deve sapere quello che ho scritto nel post precedente</li>
<li>Facilmente intercambiabile, così che non possa sfruttare nessuna leva, ne nei confronti del cravattato, ne nei confronti dell&#8217;azienda</li>
</ul>
<p>Ovvero, affinchè il cravattato possa fare bene il suo lavoro il programmatore deve essere mantenuto mediocre. L&#8217;eccellenza, qual&#8217;ora crescesse spontanea della passione dei pochi, non verrebbe ripagata, strati e strati di cravattati filtrerebbero il flusso di valore prodotto in modo che chi di dovere non sappia mai chi ne è l&#8217;artefice.</p>
<p>Tutto questo mi fa incazzare, non solo perchè sono un programmatore, ma anche perchè sono conscio del fatto che buona parte dei soldi che spendo tutti i giorni vengono consumati dai cravattati, ovvero dai parassiti dei flussi di valore.</p>
<p>Tutto questo mi fa incazzare ancora di più perchè da che mondo e mondo l&#8217;intermediario dovrebbe prendere una piccola parte della transazione, non il 70-90% (mia valutazione assolutamente spannometrica derivata da esperienze professionali)</p>
<p>Tutto questo mi fa incazzare ancora di più perchè da che mondo e mondo l&#8217;intermediario è al servizio degli intermediati, secondo quale logica l&#8217;intermediario dovrebbe essere il &#8220;capo&#8221; di una delle due parti? Secondo quale logica la capacità produttiva dovrebbe essere limitata per favorire l&#8217;intermediario?</p>
<p>Concludendo: ben venga la figura <a href="http://www.gabrielelana.it/archives/167">dell&#8217;intermediario</a>, ben vengano le figure di supporto, ben venga tutto l&#8217;aiuto possibile, purchè non ci si dimentichi una cosa: nel mondo della produzione del software l&#8217;elemento principale è il programmatore, tutto il resto è eliminabile, che vi piaccia o no :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/197/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Non so niente di economia, ma&#8230;</title>
		<link>http://www.gabrielelana.it/archives/195</link>
		<comments>http://www.gabrielelana.it/archives/195#comments</comments>
		<pubDate>Sun, 03 Oct 2010 16:31:36 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=195</guid>
		<description><![CDATA[una cosa l&#8217;ho capita, il potenziale di un buon programmatore è stratosferico, talmente alto da essere considerato da molti una minaccia alla propria posizione di potere, talmente pericoloso da aver innescato (a partire dagli anni 90) un lavoro mediatico atto a denigrare l&#8217;immagine stessa della nostra professione. Vi spiego il perchè
Prendiamo in considerazione l&#8217;esempio di [...]]]></description>
			<content:encoded><![CDATA[<p>una cosa l&#8217;ho capita, il potenziale di un buon programmatore è stratosferico, talmente alto da essere considerato da molti una minaccia alla propria posizione di potere, talmente pericoloso da aver innescato (a partire dagli anni 90) un lavoro mediatico atto a denigrare l&#8217;immagine stessa della nostra professione. Vi spiego il perchè</p>
<p>Prendiamo in considerazione l&#8217;esempio di una casa automobilistica che chiameremo X e dell&#8217;azienda Z fornitrice di tappetini per la automobili prodotte da X. Z è felice di avere un cliente così importante che gli procura tanto lavoro, ma Z è anche preoccupata perchè qual&#8217;ora X dovesse decidere di cambiare fornitore si ritroverebbe con una montagna di tappetini che sul mercato non valgono niente</p>
<p>X è <strong>molto</strong> felice perchè tiene per le palle Z</p>
<blockquote><p>
X: Quanto ti costa produrre un tappetino?<br />
Z: 4,5<br />
X: Bene, te ne do 5 e ringraziami<br />
Z: &#8230;ok (pensando: come faccio a piazzare 500.000 tappetini per quel modello d&#8217;automobile?)
</p></blockquote>
<p>X sa il fatto suo, tiene in casa solo l&#8217;assemblamento delle parti più importanti in modo che i singoli fornitori non possano avere un mercato, ovvero non possano avere acquirenti se non loro o le case automobilistiche che comunque applicherebbero a Z lo stesso tipo di politica e quindi non costituirebbero una valida alternativa</p>
<p>Cosa succederebbe se X avesse un fornitore W in grado di produrre un&#8217;intera automobile da zero? Rivediamo la conversazione di cui sopra</p>
<blockquote><p>
X: Quanto ti costa produrre un&#8217;automobile?<br />
W: 4.500<br />
X: Bene, te ne do 5.000 e ringraziami<br />
W: AHAHAHAHAHAHAHAHAHAHAHAHAHA (pensando: sul mercato tu le vendi a 65.000, a questo punto mi conviene vendermele da solo le <strong>MIE</strong> macchine)
</p></blockquote>
<p>Eh si, X si è trasformato in un mero venditore, in questo caso W tiene per le palle X, infatti nessun imprenditore sano di mente farebbe mai una cosa del genere&#8230; aspetta un momento però&#8230; è esattamente quello che succede nel mondo del software (C.R.A.V.A.T.T.A.T.O? Lo senti vero? Lo senti che il tuo momento si avvicina? Stiamo arrivando baby, stiamo arrivandooo&#8230;)</p>
<p>Dopo vent&#8217;anni di fallimenti il cravattato si deve arrendere, la produzione industriale del software non funziona, il software lo produce chi lo scrive, non ci sono cazzi, ad oggi lo capirebbe anche una scimmia lobotomizzata, ma perchè c&#8217;è voluto così tanto? Semplice, perchè sarebbe come ammettere che i programmatori non sono come Z ma sono come W, una cosa <strong>semplicemente inaccettabile</strong></p>
<p>Chiaro, i tempi non sono ancora maturi, per due ragioni:</p>
<ul>
<li>Il cravattato venderà cara la sua pelle</li>
<li>Ad oggi di programmatori che hanno una professionalità tale da creare in autonomia un prodotto completo ce ne sono ancora troppo pochi, non abbiamo l&#8217;identità e l&#8217;orgoglio professionale che la nostra professione si merita, di strada da fare ne abbiamo ancora molta purtroppo</li>
</ul>
<p> Ma la realtà delle cose è questa, quindi vi faccio una domanda: volete essere tenuti per i coglioni o volete tenere per i coglioni? Il vostro potenziale è infinito, nel ventunesimo secolo l&#8217;uomo che sussurra alle macchine è Re</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/195/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>I Kanban non sono una metodologia</title>
		<link>http://www.gabrielelana.it/archives/174</link>
		<comments>http://www.gabrielelana.it/archives/174#comments</comments>
		<pubDate>Wed, 25 Aug 2010 17:21:43 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=174</guid>
		<description><![CDATA[E&#8217; noto che nel nostro campo ogni nome viene sovraccaricato di significati, l&#8217;ultimo esempio riguarda i Kanban
Prima si è iniziato a parlare di Lean, poi qualcuno ha iniziato ad usare e a parlare di Kanban Board, infine adesso Kanban è diventato quasi il nome di una metodologia. Adesso quando uno parla di Kanban non so [...]]]></description>
			<content:encoded><![CDATA[<p>E&#8217; noto che nel nostro campo ogni nome viene sovraccaricato di significati, l&#8217;ultimo esempio riguarda i <strong>Kanban</strong></p>
<p>Prima si è iniziato a parlare di <a href="http://www.lean.org/whatslean/">Lean</a>, poi qualcuno ha iniziato ad usare e a parlare di <a href="http://www.limitedwipsociety.org/2009/11/16/kanban-example/">Kanban Board</a>, infine adesso Kanban è diventato quasi il nome di una <a href="http://www.crisp.se/henrik.kniberg/kanban-vs-scrum.pdf">metodologia</a>. Adesso quando uno parla di Kanban non so a cosa pensare:</p>
<ul>
<li>Starà parlando di Kanban come sinonimo di Lean? Si ma Lean come sinonimo di <a href="http://www.amazon.com/o/ASIN/0743249275">Lean Thinking</a>, ovvero la filosofia Lean o <a href="http://www.amazon.com/o/ASIN/0321150783">Lean Development</a>, ovvero l&#8217;applicazione della filosofia Lean allo sviluppo del software?</li>
<li>Starà parlando di Kanban come sinonimo delle <a href="http://www.agilejournal.com/blogs/the-kanban-board.html">board</a> che adesso vanno tanto di moda negli Agile shop?</li>
<li>Starà parlando di Kanban come di una non meglio precisata metodologia? Come lo <a href="http://www.amazon.com/o/ASIN/0578002140">ScrumBan</a>, ovvero uno Scrum che fa uso di Kanban Board o come <a href="http://www.amazon.com/o/ASIN/0984521402">Kanban</a>, ovvero l&#8217;uso delle Kanban Board misto a qualche pratica presa da XP?
</ul>
<p>Insomma un delirio, la salvezza come al solito sta nella conoscenza: bisogna tornare alle origini della parola, studiarne l&#8217;evoluzione per capirne le implicazioni ed un eventuale contesto d&#8217;uso</p>
<p>Kanban si traduce in <a href="http://it.wikipedia.org/wiki/Kanban">cartellino</a>: I giardini imperiali giapponesi sono curati all&#8217;ossessione e sono considerati un patrimonio del giappone, per questo solo poche (supponiamo 100) persone alla volta sono autorizzate ad entrare, per garantirlo vengono usate delle tessere di plastica bianche, ne esistono solo 100, una persona può entrare solo se possiede una di queste tessere che possono essere prelevate da un contenitore all&#8217;ingresso, quando il contenitore è vuoto nessuno può entrare, quando una persona esce deposita la sua tessera che verrà automaticamente trasferita nel contenitore all&#8217;ingresso consentendo a qualcuno di prelevarla ed entrare. Le tessere di plastica sono Kanban</p>
<p>Quindi <strong>i Kanban sono la rappresentazione sistemica del vincolo sulla capacità produttiva dell&#8217;impianto</strong>. Cosa significa quesa frase e come può tornare utile allo sviluppo del software lo spiego subito</p>
<p>L&#8217;applicazione del pensiero Lean porta ad eliminare una classe di problemi e/o di sprechi nell&#8217;attività produttiva attraverso un <strong>approccio sistemico</strong> ovvero creando un ambiente di lavoro che <strong>rende difficile commettere errori</strong>. Un esempio tipico sono i <a href="http://www.wireshop.it/img_prod/Supplier_1/BIG/imgpr473-01-1.jpg">connettori</a> la cui forma impedisce fisicamente di sbagliare verso. Un altro bell&#8217;esempio ce lo forniscono gli ospedali in cui si applica il pensiero Lean, nei quali tutte le attrezzature hanno un posto <a href="http://www.gembapantarei.com/visual%20management%20lean%20hospital%201.png">dedicato</a> che solitamente viene marcato con un&#8217;immagine stilizzata del tipo di attrezzo che dovrebbe occupare quello spazio, in questo modo</p>
<ul>
<li>E&#8217; molto semplice accorgersi se uno strumento è fuori posto perchè ci sarebbe l&#8217;immagine dello strumento senza lo strumento stesso</li>
<li>Nei momenti d&#8217;emergenza non devi metterti a pensare dove si trova uno strumento perchè sta sempre nello stesso posto</li>
<li>L&#8217;ordine non è più una questione di gusto personale :-)</li>
<li>Essendo la distribuzione degli strumenti così rigorosa è possibile fare esperimenti per capire se un&#8217;eventuale riorganizzazione (che è quasi sempre microscopica seguendo il principio del <a href="http://en.wikipedia.org/wiki/Kaizen">Kayzen</a>) produce un miglioramento o meno
</ul>
<p>Quando si ha a che fare con dei sistemi complessi è molto più efficiente ed efficace applicare un controllo indiretto invece che tentare di forzare le singole parti al proprio volere, basta pensare all&#8217;acqua, le singole particelle costituiscono un sistema complesso con proprietà emergenti, come fai a trasportare l&#8217;acqua? tenti di convincere le singole particelle? La sposti fisicamente? O crei un canale e lasci che felicemente scorra seguendo le proprie leggi ma finendo esattamente dove vogliamo Quest&#8217;ultimo può essere definito un <strong>approccio sistemico</strong></p>
<p>Ahhhh se solo la maggior parte dei manager sapesse&#8230; il mondo girerebbe diversamente, ma la resa dei conti arriverà presto caro cravattato dall&#8217;ignoranza bovina&#8230; ma sto divagando</p>
<p>Le <a href="http://www.agileproductdesign.com/blog/2009/images/kanban_board.jpg">Kanban Board</a> creano un ambiente di lavoro dove è difficile commettere una serie di errori classici della produzione: avere molte user stories in lavorazione (semilavorati) che non portano valore al sistema, evitare il sovraccarico di lavoro del team, individuare molto velocemente eventuali parti critiche dello sviluppo di una user story, ecc&#8230; Bene, ma dove sono i Kanban nelle Kanban Board che si usano nella produzione di software? Non sono le carte delle user stories (come banalmente si potrebbe pensare), i kanban rappresentano i limiti della produttività del sistema, in questo caso il limite è sul numero delle user stories che possono essere in lavorazione ovvero i kanban sono i singoli &#8220;posti&#8221; che possono essere occupati dalle carte delle user stories.</p>
<p>Per ogni <strong>fase</strong> ci possono essere un numero limitato di user stories, in questo modo si possono facilmente identificare eventuali stalli, fasi problematiche, sprechi di vario genere ecc&#8230;, peccato che tutto questo sia molto lontano dall&#8217;essere Agile&#8230; perchè? Semplice il limite è imposto sulle fasi, si presuppone quindi che ogni fase sia un sottosistema dimensionabile a piacere per equilibrare il flusso delle user stories fino al loro completamento, una fabbrica insomma, alla fine siamo tornati al waterfall (il cravattato ci prova sempre, non c&#8217;è niente da fare)</p>
<p>Molto più Agile e sensato sarebbe limitare la capacità produttiva del team sulle dimensioni del team stesso, banalmente una user story per sviluppatore, al limite per coppia di sviluppatori. Ad ogni sviluppatore assegnamo una calamita, le user story appese alla lavagna sono in lavorazione, una user story può essere appesa usando solo una di quelle calamite, una calamita può essere usata solo con una user story alla volta ed il gioco è fatto. Le fasi possono essere ancora conservate, possono essere utili per stanare certi problemi, ma l&#8217;enfasi dovrebbe essere sugli sviluppatori e non sulle fasi (&#8220;Individuals and interactions over processes and tools&#8221; vi ricorda qualcosa?)</p>
<p>Concludo dicendo una cosa ovvia: più si studia uno strumento/pratica/tecnica e più è facile utilizzarlo saggiamente nel contesto in cui ci si trova per raggiungere i nostri obiettivi, il pericolo è quello di abusarne o peggio essrne abusati :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/174/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<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>
	</channel>
</rss>

