<?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</title>
	<atom:link href="http://www.gabrielelana.it/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>Italia !== Silicon Valley</title>
		<link>http://www.gabrielelana.it/archives/200</link>
		<comments>http://www.gabrielelana.it/archives/200#comments</comments>
		<pubDate>Sat, 04 Jun 2011 14:23:53 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[rant]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=200</guid>
		<description><![CDATA[&#8220;Grazie al ca@@o, non se n&#8217;era accorto nessuno, dovevi scriverci un post?&#8221;
No, é vero, non c&#8217;é bisogno di un post, ma penso che il problema sia profondo e debba essere analizzato meglio. Come tutti i sabati sono andato a prendere del sushi d&#8217;asporto, come tutti i sabati mentre aspettavo mi sono letto gli ultimi tweet, [...]]]></description>
			<content:encoded><![CDATA[<p><i>&#8220;Grazie al ca@@o, non se n&#8217;era accorto nessuno, dovevi scriverci un post?&#8221;</i></p>
<p>No, é vero, non c&#8217;é bisogno di un post, ma penso che il problema sia profondo e debba essere analizzato meglio. Come tutti i sabati sono andato a prendere del sushi d&#8217;asporto, come tutti i sabati mentre aspettavo mi sono letto gli ultimi tweet, fra le mille cose <a href="http://www.smartup.biz/2011/06/02/aaa-19-anni-developer-cercasi-per-cambiare-il-mondo/">questo post</a> di <a href="http://www.smartup.biz/">Massimo Sgrelli</a> ha catturato la mia attenzione, l&#8217;ho letto accuratamente e mi é partito il rant</p>
<p>Premesso che non conosco Massimo (male, mi piacerebbe conoscerlo), premesso che gli faccio comunque i complimenti per l&#8217;iniziativa (parlare é facile, fare lo é decisamente meno), premesso che la digestione del sushi non aiuterà le mie capacità cerebrali, devo dire che non concordo per niente con quello che ha scritto, ma proprio per niente</p>
<blockquote><p>
[...] mi accorgo che anche da noi alcuni paladini visionari del mondo che sta arrivando sono impegnati anima e corpo nella creazione di strutture in grado di coltivare e diffondere la cultura delle startup: Riccardo Donadon, Luigi Capello, Francesco Inguscio, Emil Abirascid e tanti altri ancora. Ognuno di loro sta sperimentando modi diversi per far maturare il nostro tessuto imprenditoriale giovanile nella convinzione che il prossimo Skype possa nascere e diffondersi a partire anche dall’Italia
</p></blockquote>
<p>Stiamo scherzando? Ma quale Skype? Ma quale Facebook? Ma quale Twitter? Qui non ci sono le risorse per fare bene neanche il sito del mio salumiere!?!?! Faccio notare che <strong>tutti</strong> questi signori hanno un modello di business a perdere, nel senso che per <strong>anni</strong> bruciano quantità inimmaginabili di denaro sia per acquisire che per mantenere un numero sempre maggiore di utenti per il semplice fatto che milioni di utenti hanno un valore a se stante, un valore che prescinde dal servizio erogato. </p>
<p>Questi dovrebbero essere proprio gli esempi da evitare, per tre ragioni:</p>
<ul>
<li>In Italia quel tipo di soldi per queste cose non ci sono e non ci saranno (sicuramente non nei prossimi anni), e anche se ci fossero prego tutti gli Dei degli uomini che non vengano utilizzati per questo. In Italia abbiamo bisogno di successi, tanti successi, abbiamo bisogno di dimostrare che investire in questo settore può essere una concreta forma di guadagno. Dirò di più, anche un grande successo isolato non sarebbe utile, per dare fiducia serve continuità e metodo, di SuperEnalotto ne abbiamo già uno e ci basta</li>
<li>Se di soldi da investire ce ne sono pochi, e penso che su questo siamo tutti d&#8217;accordo, logicamente scegliereste tanti piccoli investimenti in business concreti portati avanti da persone che hanno alle spalle anni di successi professionali, o in pochi e grossi investimenti in idee &#8220;geniali&#8221; dove <strong>se ti va bene</strong> fai il botto? Ripeto, già ce l&#8217;abbiamo il SuperEnalotto</li>
<li>Questi business sono parassitari, lo scopo é quello di accumulare utenti per poi venderli (sto parlando dei loro dati ovviamente) al miglior offerente. Insomma fuffa che verrà usata per vendere altra fuffa, ecc&#8230;, come ho già detto più volte non sono un economista, ma il mondo non può campare di social network, il mondo non può vivere di veline, ci vuole quello che zappa la terra e tira fuori le patate (ops&#8230; velina&#8230; patata, giuro che non era intenzionale), questa é l&#8217;economia del nulla, é l&#8217;economia del <strong>cravattato duepuntozero</strong>. Possiamo andare oltre ed investire in business che creano valore per chi li usa?</li>
</ul>
<blockquote><p>
Io mio rendo conto che la differenza maggiore tra noi e gli USA sta nel fatto che il processo di maturazione del talento imprenditoriale e l’ingresso nel mondo del lavoro dall’altra parte dell’oceano inizia molto prima che da noi. A 22 anni le persone sono già da qualche tempo in campo, il riscaldamento è ormai fatto ed i muscoli sono già ben visibili. Le persone a quell’età hanno già il fiato e la determinazione sufficiente a reggere l’intera partita e forse anche i supplementari. Allora mi chiedo se non ci sia un modo per affiancare al lavoro che i vari incubatori stanno facendo un modello diverso di “training” dei talenti, una palestra sul mondo del lavoro che li prepari a cambiare il sistema con la forza e determinazione dei big. Prendere i giovani 24 o 25-enni non è forse sufficiente, perché la loro vena creativa e forse anche di incoscienza è in fase troppo avanzata e si è quasi tutta consumata nelle aule dell’università
</p></blockquote>
<p>Ho i brividi ovunque e giuro che il sushi non c&#8217;entra. Penso che in Italia le risorse siano poche, non c&#8217;é spazio per il prossimo social network, ne per i mash-up dei social network già esistenti :-). Penso che in Italia ci sia bisogno di successi rapidi e concreti, di progetti con modelli di business win/win == l&#8217;utente paga X perché tu gli fai guadagnare/risparmiare Y dove Y >> X. Penso che in Italia i 19-enni buttati allo sbaraglio nel mondo dell&#8217;informatica abbiano fatto sufficienti danni (mi ci metto dentro anch&#8217;io), non abbiamo bisogno di altri 19-enni, abbiamo bisogno che quei pochi 30/40-enni che sono restati si mettano insieme e dimostrino che l&#8217;eccellenza fa la differenza, abbiamo bisogno che quei pochi 30/40-enni che sono restati passino la loro conoscenza a quei 19-enni la cui unica colpa é quella di non sapere di non sapere. Penso che in Italia non ci sia <strong>assolutamente</strong> bisogno di creatività, non c&#8217;è bisogno d&#8217;inventarsi cose nuove, basterebbe fare bene le migliaia di servizi che ad oggi sono implementati in maniera oscena, quelle stessi servizi che invece di creare valore sono dei debiti senza fine.</p>
<p>Insomma, l&#8217;Italia non é la Silicon Valley e fin qui ci siamo, quello che volevo dire é che sarebbe un errore gravissimo tentare di diventarlo, non ci sono neanche lontanamente i presupposti minimi, possiamo fare cose meravigliose ma dobbiamo partire da quello che abbiamo e dobbiamo sfruttarlo al massimo, vedetela così, costruireste un palazzo di 40 piani su delle fondamenta di legno marcio?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/200/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<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>20</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 sono Agili?</title>
		<link>http://www.gabrielelana.it/archives/188</link>
		<comments>http://www.gabrielelana.it/archives/188#comments</comments>
		<pubDate>Sun, 12 Sep 2010 16:10:09 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=188</guid>
		<description><![CDATA[Leggendo un commento di Piergiorgio e un post di Tony entrambi riferiti al mio ultimo post, ho capito che probabilmente non mi sono spiegato bene sulla faccenda del &#8220;poco Agile&#8221;, termine che suona molto vicino all&#8217;offesa :-)
Parto quotanto la parte incriminata

Per ogni fase ci possono essere un numero limitato di user stories, in questo modo [...]]]></description>
			<content:encoded><![CDATA[<p>Leggendo un commento di <a href="http://www.gabrielelana.it/archives/174">Piergiorgio</a> e un <a href="http://tonyxzt.blogspot.com/2010/09/wash-dishes-using-kanban.html">post</a> di Tony entrambi riferiti al mio ultimo <a href="http://www.gabrielelana.it/archives/174">post</a>, ho capito che probabilmente non mi sono spiegato bene sulla faccenda del &#8220;poco Agile&#8221;, termine che suona molto vicino all&#8217;offesa :-)</p>
<p>Parto quotanto la parte incriminata</p>
<blockquote><p>
Per ogni fase 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…, peccato che tutto questo sia molto lontano dall’essere Agile… 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’è 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’enfasi dovrebbe essere sugli sviluppatori e non sulle fasi (“Individuals and interactions over processes and tools” vi ricorda qualcosa?)
</p></blockquote>
<p>Premettendo che ognuno può fare quello che vuole (ammesso che ne paghi direttamente le conseguenze), sarebbe meglio che lo facesse sapendo quello che sta facendo e perchè lo fa. Quello che ho notato è che chi ha adottato le Kanban Board lo ha fatto senza porsi delle domande fondamentali: qual&#8217;è l&#8217;oggetto della limitazione? Qual&#8217;è la misura del miglioramento? Come misuro la capacità produttiva del mio sistema? Ecc&#8230;</p>
<p>Ok lo ammetto, è una mia supposizione il fatto che la maggior parte non si ponga queste domande. Questa supposizione derivata dal fatto che mi sembra applicata troppo &#8220;by the book&#8221;, dove il &#8220;book&#8221; non riguarda affatto la produzione del software ma una catena produttiva manifatturiera.</p>
<p><a href="http://www.gabrielelana.it/wp-content/uploads/2010/09/kanban_board.jpg"><img src="http://www.gabrielelana.it/wp-content/uploads/2010/09/kanban_board-300x184.jpg" alt="" title="kanban_board" width="300" height="184" class="aligncenter size-medium wp-image-189" /></a></p>
<p>Le Kanban Board nel mondo del software generalmente sono divise per <strong>fasi</strong> e la limitazione è applicata appunto su queste fasi, perchè? Partendo dal presupposto che lo scopo è quello di stabilizzare e velocizzare il flusso delle user story nelle varie fasi, stiamo dicendo che è possibile &#8220;dimensionare&#8221; ogni fase a piacere? Quindi, per esempio, chi sviluppa non fa deploy di quello che ha sviluppato? Evidentemente, altrimenti non si spiega perchè la fase dello sviluppo è dimensionato a 5 user story e il deployment a 1</p>
<p>Sempre a proposito delle fasi, negli impianti manifatturieri il fatto che ogni fase sia limitata è una coseguenza banale del fatto che le linee produttive sono per loro natura limitate, ma vale la stessa cosa nel software? Nel nostro team siamo in 5, non possiamo essere nella fase di test tutti e 5? O non possiamo fare deploy tutti e 5? Perchè? A meno che non ci siano 3 analisti che si occupano della fase di analisi, 5 sviluppatori che si occupano della fase di sviluppo, 2 persone che si occupano dei test, ecc&#8230; Allora sarebbe un&#8217;altra storia, ma trattare il team a dipartimenti specializzati e ridimensionabili a piacere è quello che vogliamo? Personalmente mi fa venire la nausea, ma basta esserne consapevoli</p>
<p>Domanda ancora più importante: il total flow in questo caso come lo si immagina? O meglio, qualcuno misura il <a href="http://en.wikipedia.org/wiki/Lead_time">Lead Time</a>? Domanda lecita visto che non ne sento molto parlare, almeno non tanto quanto sento parlare di Kanban Board, e visto che la riduzione del Lead Time dovrebbe essere l&#8217;obiettivo finale&#8230; </p>
<p>Insomma, non vorrei che il seguire una moda possa fare più male che bene, sopratutto quando non ci si prende la briga di studiarla, di comprenderne il funzionamento e sopratutto senza domandarsi come misurare il miglioramento secondo i propri obiettivi. In particolare l&#8217;applicazione classica per <strong>fasi</strong> mi sembra pericolosa da questo punto di vista e suggerivo un&#8217;alternativa che mi sembrava meno rischiosa. Dato che l&#8217;approccio è di tipo sistemico, una volta messa in campo una Kanban Board &#8220;storta&#8221; si corre il rischio di stortare tutto :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/188/feed</wfw:commentRss>
		<slash:comments>5</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>&#8220;Ma quanto vuoi guadagnare?&#8221;</title>
		<link>http://www.gabrielelana.it/archives/167</link>
		<comments>http://www.gabrielelana.it/archives/167#comments</comments>
		<pubDate>Fri, 07 May 2010 07:47:29 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[human]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=167</guid>
		<description><![CDATA[Un bel giorno un uomo si presenta da un costruttore mostrandogli il disegno di una casa e gli chiede

Vorrei costruire una casa fatta esattamente in questo modo. Quanto ci metti a costruirmela? Quanto mi costerebbe?

Il costruttore stoicamente risponde

Tre mesi e 100.000 euro

L&#8217;uomo, guarda il costruttore con uno sguardo diretto&#8230; semplice&#8230; come se stesse parlando delle [...]]]></description>
			<content:encoded><![CDATA[<p>Un bel giorno un uomo si presenta da un costruttore mostrandogli il disegno di una casa e gli chiede</p>
<blockquote><p>
Vorrei costruire una casa fatta <strong>esattamente</strong> in questo modo. Quanto ci metti a costruirmela? Quanto mi costerebbe?
</p></blockquote>
<p>Il costruttore stoicamente risponde</p>
<blockquote><p>
Tre mesi e 100.000 euro
</p></blockquote>
<p>L&#8217;uomo, guarda il costruttore con uno sguardo diretto&#8230; semplice&#8230; come se stesse parlando delle condizioni metereologiche</p>
<blockquote><p>
Ti do una settimana e 5.000 euro
</p></blockquote>
<p>Il costruttore rimane sbigottito&#8230; non sa se lo stanno prendendo per il culo o se fanno sul serio: se lo stanno prendendo per il culo è il momento d&#8217;incazzarsi, se fanno sul serio è il momento di mettersi a piangere; decide in buona fede di cercare di capire meglio</p>
<blockquote><p>
Scusami, ammesso e non concesso che umanamente sia possibile farlo in una settimana, significherebbe utilizzare molte più risorse di quelle spese per farcela in tre mesi&#8230; quindi al limite ti costerà di più di 100.000 euro, perchè dovrebbero bastarne 5.000???
</p></blockquote>
<p>L&#8217;uomo, sempre con la stessa faccia risponde</p>
<blockquote><p>
Accidenti, ma quanto vorresti guadagnare in una settimana?!?!?!
</p></blockquote>
<p>&#8230; Ve lo dico io, non c&#8217;è dubbio, ci stanno prendendo per il culo</p>
<p>A questo proposito faccio un appello a chiunque può essere interessato, secondo me c&#8217;è (e crescerà sempre di più) un <a href="http://en.wikipedia.org/wiki/Blue_Ocean_Strategy">oceano blu</a>, ovvero un mercato di opportunità non ancora esplorato, che è quello del &#8220;Procuratore per sviluppatori&#8221;</p>
<p>Il procuratore dovrebbe trovare il cliente (anche se non è necessario, potrebbe trovarlo direttamente lo sviluppatore) e trattare gli aspetti economici e burocratici del progetto per conto dello sviluppatore, in cambio il procuratore si becca il 20% del fatturato, gli aspetti tecnici vengono gestiti direttamente dallo sviluppatore, esattamente come succede per i calciatori/sportivi (anche se ammetto di non saperne molto ;-P)</p>
<p>Ci sono molti dettagli che devono essere definiti, ma potrebbe funzionare, da gennaio/febbraio sto lavorando in questo modo e sono abbastanza soddisfatto, se qualcuno è interessato, mi contatti direttamente :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/167/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Una metrica per i professionisti</title>
		<link>http://www.gabrielelana.it/archives/160</link>
		<comments>http://www.gabrielelana.it/archives/160#comments</comments>
		<pubDate>Mon, 08 Mar 2010 10:38:43 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[human]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=160</guid>
		<description><![CDATA[Parto da un assunto fondamentale

Il desiderio di controllo nasce dalla paura di non averlo

Da cui una metrica molto semplice da misurare per colui che si definisce professionista

Tutte le volte che un cliente ti chiede a che punto sei in merito ad un lavoro che stai facendo per lui, hai perso 10 punti. Se non rispondi [...]]]></description>
			<content:encoded><![CDATA[<p>Parto da un assunto fondamentale</p>
<blockquote><p>
<em>Il desiderio di controllo nasce dalla paura di non averlo</em>
</p></blockquote>
<p>Da cui una metrica molto semplice da misurare per colui che si definisce professionista</p>
<blockquote><p>
<em>Tutte le volte che un cliente ti chiede a che punto sei in merito ad un lavoro che stai facendo per lui, hai perso 10 punti. Se non rispondi in tempo reale, hai perso 1000 punti</em>
</p></blockquote>
<p>Inutile dire che perdere punti è molto più semplice che guadagnarli&#8230; Quello che penso è che il &#8220;command &#038; control&#8221; non lo voglia spontaneamente nessuno, neanche il cliente, ci si arriva quando costretti, sopratutto per la mentalità italiana dove il 90% della popolazione vorrebbe fare <em>&#8220;l&#8217;intermediario&#8221;</em> nullafacente</p>
<p>Analizziamo il processo mentale del cliente</p>
<ul>
<li><em>Gli ho chiesto di fare questa &#8220;piccola&#8221; cosa due giorni fa e non ho più saputo niente, cosa starà facendo? Starà lavorando? E&#8217; una cosa importante, deve essere pronta per questa sera&#8230; Forse è meglio lasciarlo lavorare, fra poco si farà sentire&#8230;</em></li>
<li><em>Sono le 16:00 e non si è ancora sentito nessuno&#8230; eh no, adesso basta, gli faccio il culo, non è possibile, aveva detto che avrebbe consegnato prima di sera e sono due giorni che non si fa sentire, gli mando una e-mail</em></li>
<li><em>Non risponde <strong>neanche</strong> alle e-mail!!! Lo sapevo, non ha fatto niente!!! Per questa sera non sarà pronto niente e sarò nella merda!!! La prossima volta non ci casco più!!!</em></li>
</ul>
<p>Ora, poco importa se il nostro <em>&#8220;professionista&#8221;</em> era in meditazione per riuscire a finire in tempo, poco importa se effettivamente la consegna è avvenuta in tempo, l&#8217;ansia e il dubbio sono comunque entrati nella mente del cliente che vorrà avere sempre più <em>&#8220;controllo&#8221;</em>, anche se la sua forma di <em>&#8220;controllo&#8221;</em> sarà letale per il progetto :-)</p>
<p><strong>Ogni</strong> volta che un vostro cliente vi chiede informazioni su qualcosa, lo fa perchè si sente <strong>obbligato</strong> a farlo, se potesse eviterebbe, confrontatevi <strong>immediatamente</strong> con lui per capire come fornigli in anticipo le risposte ai suoi dubbi, siate <strong>veri professionisti</strong>, non ve ne pentirete</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/160/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Agilecamp2010 e Code Katas</title>
		<link>http://www.gabrielelana.it/archives/150</link>
		<comments>http://www.gabrielelana.it/archives/150#comments</comments>
		<pubDate>Mon, 01 Mar 2010 12:23:00 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[kata]]></category>
		<category><![CDATA[milano-codingdojo]]></category>
		<category><![CDATA[milano-xpug]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/?p=150</guid>
		<description><![CDATA[Non dirò che è un bel po&#8217; di tempo che non scrivo e non dirò che nel frattempo sono successe troppe cose, dirò solo che sabato scorso sono stato in quel di Lugano al AgileCamp ospitato da Sketchin è stata veramente una bella giornata, a formare la &#8220;spedizione del milano-xpug&#8221; con me c&#8217;erano Giordano, Indrit [...]]]></description>
			<content:encoded><![CDATA[<p>Non dirò che è un bel po&#8217; di tempo che non scrivo e non dirò che nel frattempo sono successe troppe cose, dirò solo che sabato scorso sono stato in quel di Lugano al <a href="http://barcamp.org/AgileCamp">AgileCamp</a> ospitato da <a href="http://www.sketchin.ch/">Sketchin</a> è stata veramente una bella giornata, a formare la &#8220;spedizione del milano-xpug&#8221; con me c&#8217;erano <a href="http://giordano.scalzo.biz/">Giordano</a>, Indrit (Selimi) e Andrea (Francia)</p>
<p>L&#8217;atmosfera e il clima sono stati perfetti per un barcamp: bel posto (tra l&#8217;altro ero in poltrona in prima fila, l&#8217;unica cosa difficile è stata mantenere la lucidità dopo pranzo), bella gente, <a href="http://www.lucamascaro.info/blog">Luca</a> è stato un ottimo padrone di casa e sopratutto le competenze dei presenti erano molto eterogenee (programmatori, designer e product manager/owner)</p>
<p>Personalmente mi sono giocato la presentazione sui kata della programmazione</p>
<p><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=programmingkatas-100301054644-phpapp02&#038;stripped_title=programmingkatas" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=programmingkatas-100301054644-phpapp02&#038;stripped_title=programmingkatas" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></p>
<p>La stessa che ho portato al javaday</p>
<p><object width="480" height="390"><param name="movie" value="http://www.uniroma.tv/uniroma_network_player.swf?p=&#038;v=20100206201244_561025187.flv&#038;autoplay=false&#038;ext=true"></param><param name="allowFullScreen" value="true"></param><param name="base" value="http://www.uniroma.tv/"></param><embed src="http://www.uniroma.tv/uniroma_network_player.swf?p=&#038;v=20100206201244_561025187.flv&#038;autoplay=false&#038;ext=true" type="application/x-shockwave-flash" allowfullscreen="true" base="http://www.uniroma.tv/" width="480" height="390"></embed></object></p>
<p>Se siete interessati al tema vi consiglio di iscrivervi alla ml del <a href="http://tech.groups.yahoo.com/group/milano-xpug/">milano-xpug</a> e/o a quella del <a href="http://groups.google.com/group/milano-codingdojo">milano-codingdojo</a>, stiamo organizzando alcune attività anche non strettamente legate all&#8217;area di Milano :-)</p>
<p>P.S. Alla fine del talk dico di aver seguito la scuola di Martin Fowler del Clean Code, imperdonabile errore, ovviamente stavo parlando di Robert C. Martin :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/150/feed</wfw:commentRss>
		<slash:comments>2</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>
	</channel>
</rss>

