<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
    <channel>
        <title />
        <link>http://blogs.ugidotnet.org/BlogEma/Default.aspx</link>
        <description />
        <language>it-IT</language>
        <copyright>Emanuele DelBono</copyright>
        <generator>Subtext Version 2.1.0.5</generator>
        <image>
            <title />
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/BlogEma/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/blogema" type="application/rss+xml" /><item>
            <title>Sull'adozione degli "strumenti agili"</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/469323569/sulladozione-degli-strumenti-agili.aspx</link>
            <description>&lt;font face="Arial"&gt;In questo periodo sto tenendo parecchi corsi dedicati al Test Driven Development in aziende in cui questa pratica è praticamente sconosciuta. Per il corso faccio largo uso di librerie e strumenti non Microsoft (&lt;a href="http://www.mbunit.com/"&gt;mbUnit&lt;/a&gt;,  &lt;a href="http://www.ayende.com"&gt;RhinoMocks&lt;/a&gt;, &lt;a href="http://www.testdriven.net/"&gt;TestDriven.NET&lt;/a&gt;, &lt;a href="http://www.jetbrains.com/resharper/"&gt;Resharper&lt;/a&gt;, ecc...) e noto che uno degli scogli psicologici più grossi è proprio l'adozione di questi strumenti.&lt;br /&gt;
Mi sono chiesto quali potessero essere le cause. &lt;br /&gt;
Secondo me la risposta è abbastanza semplice ma può essere duplice.&lt;br /&gt;
Quella più immediata è: i programmatori sono "pigri" e non hanno voglia di installarsi tutti quegli strumenti che non sempre funzionano al primo colpo e a volte vanno configurati nel modo corretto. &lt;br /&gt;
La risposta di riserva è: molti degli strumenti citati sopra non sono perfettamente integrati con l'ambiente di sviluppo e soprattutto all'inizio è difficile capire per quale motivo le cose non funzionano come dovrebbero.&lt;br /&gt;
Quindi credo che per una adozione massiva di pratiche quali il Test Driven Development, la Continuous Integration, l'uso di un Source Control i vari produttori di componenti devono investire più tempo nell'integrazione con Visual Studio.&lt;br /&gt;
In alternativa possiamo aspettare che Microsoft rilasci degli strumenti più adatti (ed economicamente sostenibili ;-))  all'utilizzo delle pratiche agili e da quel che ho visto VS2010 è sulla buona strada!&lt;/font&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/94799.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/469323569" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/11/29/sulladozione-degli-strumenti-agili.aspx</guid>
            <pubDate>Sat, 29 Nov 2008 13:21:22 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/94799.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/11/29/sulladozione-degli-strumenti-agili.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/94799.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/11/29/sulladozione-degli-strumenti-agili.aspx</feedburner:origLink></item>
        <item>
            <title>TechEd 2008 un riassunto di idee</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/462743006/teched-2008-un-riassunto-di-idee.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;In questi giorni sono stato al &lt;a href="http://www.microsoft.com/emea/teched2008/developer/default.aspx"&gt;teched&lt;/a&gt; di &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=it&amp;amp;geocode=&amp;amp;q=barcelona&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=53.741627,113.90625&amp;amp;ie=UTF8&amp;amp;ll=41.390976,2.1698&amp;amp;spn=0.194977,0.444946&amp;amp;z=12&amp;amp;g=barcelona&amp;amp;iwloc=addr"&gt;Barcellona&lt;/a&gt;. A differenza dello scorso anno ho preferito seguire sessioni più tecniche e meno metodologiche e il risultato è stato decisamente migliore dell'anno prima.&lt;br /&gt;
Ecco alcuni spunti di riflessione:&lt;/font&gt;&lt;/p&gt;
&lt;font face="Arial"&gt;
&lt;p&gt;&lt;br /&gt;
- WindowsForms è morto. Su più di 300 sessioni solo una era dedicata a WindowsForms e l'hanno pure annullata (non conosco il motivo). Quindi se state iniziando a realizzare una nuova applicazione usando Winforms....beh pensateci bene, WPF rulez.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
- &lt;a href="http://www.microsoft.com/azure/"&gt;Cloud Services&lt;/a&gt;. Annunciati alla &lt;a href="http://www.microsoftpdc.com/"&gt;PDC&lt;/a&gt; qualche settimana fa sono la grossa novità dei prossimi anni. Le nostre applicazioni potranno essere hostate "in the clouds". Sicuramente impiegherà tempo a prendere piede e Microsoft deve ancora spiegare come funzionerà il licensing. Un grosso scoglio sono i dati, per quel che vedo in giro le imprese sono molto gelose dei loro database e difficilmente si fideranno e li sposteranno all'esterno. Credo che ci voglia un cambio di mentalità e quindi acquisire fiducia riducendo costi, consumi e grattacapi.&lt;br /&gt;
- Ecologia. Interessante la sessione di &lt;a href="http://blogs.msdn.com/pathelland/"&gt;Patt Helland&lt;/a&gt; sul green computing. Anche noi sviluppatori possiamo in qualche modo aiutare l'ambiente.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
- &lt;a href="http://weblogs.asp.net/ROsherove/"&gt;Roy Osherove&lt;/a&gt; è sempre un grande speaker e se fallisse come programmatore avrebbe una carriera come cantastorie a zelig.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
- &lt;a href="http://blogs.msdn.com/pfxteam/"&gt;Parallel Programming&lt;/a&gt;. Tante sessioni su questo tema. Nei prossimi anni non potremo farne a meno. Processori multicore sono ormai su tutti i PC e il numero dei core aumenterà ancora nei prossimi anni. E le nostre applicazioni? Non possiamo più permetterci di scrivere applicazioni che non sfruttano in pieno la potenza dei nostri processori. Per questo MS sta lavorando molto sulle Parallel Extension che troveranno il loro spazio in prima fila nel framework 4.0. Nell'attesa possiamo dare un'occhiata &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3"&gt;qui&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
- Il database relazionale è sempre meno visibile. Sia Pat Helland che &lt;a href="http://www.davidchappell.com/blog/"&gt;David Chappel&lt;/a&gt; parlano di dati sempre più destrutturati. I &lt;a href="http://www.microsoft.com/azure/sql.mspx"&gt;Sql Data Services&lt;/a&gt; della piattaforma Azure lavorano con dati gerarchici ma non con dati relazionali: possiamo costruire entità composte da proprietà che hanno un tipo, un nome e un valore. Ma le fonti dati sono sempre più eterogenee e non possiamo garantire che le proprietà siano sempre e solo quelle. Con i cloud services quindi lavoreremo con entità che verranno salvate "da qualche parte", ma non sta a noi sapere dove e soprattutto come...quanto mi piace questa cosa. Il database è ancora uno strumento importante ma forse nel giro di qualche anno sarà più trasparente il suo utilizzo.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
- &lt;a href="http://msdn.microsoft.com/en-us/vs2008/products/cc948977.aspx"&gt;Visual Studio 2010&lt;/a&gt;. Rivoluzionario. La CTP che possiamo scaricare e usare è molto lontana da quello che sarà il vero VS 2010. Dicono di aspettarci grosse novità nei prossimi mesi.&lt;br /&gt;
- GAC. Durante una sessione di livello 300 ci hanno detto che esiste una cosa che si chiama GAC nella quale possiamo mettere i nostri assembly. ;-)&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Quindi i prossimi anni saranno movimentati per noi sviluppatori (come del resto quelli appena trascorsi!!) e conviene fin da subito iniziare a guardarsi intorno e provare le novità che sono disponibili.&lt;/font&gt;&lt;/p&gt;
&lt;/font&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/94647.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/462743006" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/11/16/teched-2008-un-riassunto-di-idee.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 23:00:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/94647.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/11/16/teched-2008-un-riassunto-di-idee.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/94647.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/11/16/teched-2008-un-riassunto-di-idee.aspx</feedburner:origLink></item>
        <item>
            <title>TDD come metodologia</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/443682415/tdd-come-metodologia.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;Il TDD viene spesso considerato una pratica per scrivere test. Non è cosi: il TDD è principalmente una pratica per fare design.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Tempo fa, durante lo sviluppo di un'applicazione, mi è capitato di dover scrivere un algoritmo per la schedulazione delle risorse. Non sono un esperto di algoritmi di  schedulazione, ho letto un po' di materiale al riguardo, so che esistono metodi più o meno complessi  e con più o meno variabili, ma siccome quello che mi serviva era abbastanza semplice ho preferito affrontare il problema per piccoli passi ed eventualmente arrivare ad una soluzione già documentata tramite refactoring del codice. Inutile dire che il TDD ha semplificato ulteriormente lo sviluppo.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Ho raccolto i requisiti del cliente sotto forma di storie, una storia per ogni caso che l'algoritmo doveva risolvere. Ho ordinato le storie per complessità e ho iniziato a scrivere un test.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Il primo test provava a schedulare una risorsa sempre disponibile su un periodo di tempo illimitato e non occupato. &lt;br /&gt;
Una volta che questo è diventato verde,sono passato a due risorse, poi a 3 e poi a N.&lt;br /&gt;
Poi ho scritto altri test per ridurre il tempo a disposizione e altri ancora che introducevano sovrapposizioni di risorse, fino ad arrivare a test complessi che riproducevano situazioni reali con N risorse, N progetti già schedulati, e poco tempo a disposizione.&lt;br /&gt;
In pratica ogni test aggiungeva una variabile in più e complicava un poco le cose, implementavo la nuova funzionalità avendo comunque i vecchi test che verificavano che la nuova feature non rovinasse ciò che era già scritto. Quindi potevo tranquillamente fare refactoring per migliorare continuamente il design che emergeva man mano implementavo nuovi test.&lt;br /&gt;
Dopo circa una trentina di test avevo l'algoritmo pronto ma non solo, la correttezza dell'algoritmo era supportata e verificata da una suite di test che considerava tutti i casi emersi durante l'analisi.&lt;br /&gt;
Non so se è l'algoritmo migliore che si poteva scrivere, non è sicuramente il più performante ma per i requisiti attuali va benissimo.&lt;br /&gt;
Naturalmente dopo la consegna, il cliente ci ha giocato un po' ed ha richiesto alcune modifiche  (ma dai? Strano!). &lt;br /&gt;
Ma se in genere queste modifiche risultano molto pericolose (soprattutto su problemi di questo tipo che vedono numerose variabili in gioco) avendo a disposizione una serie di test su tutto il codice già scritto aggiungere nuove funzionalità vuol dire semplicemente scrivere altri test o modificare quelli esistenti e una volta implementata la modifica rilanciare tutti i test per verificare che tutto sia ancora verde.&lt;br /&gt;
Quindi il vantaggio è doppio: da un lato il TDD mi aiuta a risolvere un problema step-by-step tenendo sempre sotto controllo l'avanzamento verso la soluzione  (ogni step mi avvicina al risultato), dall'altro mi permette di introdurre modifiche e migliorie in poco tempo ma soprattutto senza paura di introdurre nuovi bug.&lt;br /&gt;
Secondo me impagabile.&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/94530.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/443682415" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/11/05/tdd-come-metodologia.aspx</guid>
            <pubDate>Wed, 05 Nov 2008 21:31:08 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/94530.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/11/05/tdd-come-metodologia.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/94530.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/11/05/tdd-come-metodologia.aspx</feedburner:origLink></item>
        <item>
            <title>Agile Day 2008</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/434470223/agile-day-2008.aspx</link>
            <description>&lt;p&gt;Per chi ancora non lo sapesse il 21 Novembre a Bologna si terrà &lt;a href="http://www.agileday.it/"&gt;l'AgileDay&lt;/a&gt;. Questo è il 5° anno e per me sarà la terza partecipazione, quest'anno con una novità: insieme a &lt;a href="http://blogs.ugidotnet.org/makka/Default.aspx"&gt;Claudio&lt;/a&gt; terrò una sessione dedicata al Test Driven Development. &lt;/p&gt;
&lt;p&gt;Sarà una sessione in formato workshop, quindi i partecipanti sono invitati a portarsi il laptop e a lavorare insieme a noi allo sviluppo di un progetto rigorosamente in modalità TDD (bella l'idea di far lavorare i partecipanti, vero? ;-))&lt;/p&gt;
&lt;p&gt;Il programma completo della giornata lo trovate qui: &lt;font face="Arial"&gt;&lt;a href="http://www.agileday.it/index.php?page=program"&gt;http://www.agileday.it/index.php?page=program&lt;/a&gt;. Iscrivetevi!!&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/94421.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/434470223" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/10/28/agile-day-2008.aspx</guid>
            <pubDate>Tue, 28 Oct 2008 08:06:27 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/94421.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/10/28/agile-day-2008.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/94421.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/10/28/agile-day-2008.aspx</feedburner:origLink></item>
        <item>
            <title>Scrivere buoni Unit Test</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/428494394/scrivere-buoni-unit-test.aspx</link>
            <description>&lt;p&gt;Quando ci si avvicina per la prima volta alla pratica dello Unit Test non sempre si riescono a scrivere buoni test. Ricordo che i miei primi esperimenti consistevano in decine di righe di codice per configurare i mock objects  e per eseguire diverse assert nello stesso test.   &lt;br /&gt;Test scritti in questo modo in genere creano sconforto  e conseguente sfiducia nella pratica dello Unit Testing perché non appena è richiesta la modifica di una funzionalità e i test si rompono si perde un tanto tempo per capire cosa testava e perché ora si è rotto. &lt;/p&gt;  &lt;p&gt;Considerate il seguente test:   &lt;br /&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:95a0b332-d2c3-4c21-b1a0-1458ef49b54f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000;"&gt;[Test]
&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Constructor_ShouldDoSomeThingOnViewAndModel()
{
    IDtoMapper mapper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateMock&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IDtoMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyView view &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateMock&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyModel model &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateMock&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyModel&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DomainModelData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dummyData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DomainModelData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DtoData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dummyDto &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DtoData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    view.Expect(v  &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; v.Save &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;).IgnoreArguments();
    model.Expect(m &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; m.GetData()).Return(dummyData);
    mapper.Expect(m &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; m.ToDto(dummyData)).Return(dummyDto);
    view.Expect(v  &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; v.SetDataContext(dummyDto);
    &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyPresenter(view, model, mapper);
    view.VerifyAllExpectation();
    model.VerifyAllExpectation();
    mapper.VerifyAllExpectation();
} &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;Puzza vero?
  &lt;br /&gt;Quali sono i problemi?

  &lt;br /&gt;Sta testando troppe cose,  quindi è poco leggibile e dipende da troppi oggetti . Ciò significa che, tra 2 settimane se lo devo modificare impiego tanto tempo a  capire cosa fa e nel caso in cui diventi rosso non riesco ad identificare puntualmente il problema.&lt;/p&gt;

&lt;p&gt;La soluzione verso la quale sono andato è un test molto più snello e semplice in cui ho &lt;strong&gt;un solo oggetto mockato e verifico una sola cosa&lt;/strong&gt;. 

  &lt;br /&gt;Questo significa che il test sopra viene spezzato in 4 test differenti:

  &lt;br /&gt;1) Uno che verifica che il presenter si sottoscrive correttamente  all'evento Save della view

  &lt;br /&gt;2) Uno che verifica che il presenter utilizzi il model per farsi dare i dati da visualizzare 

  &lt;br /&gt;3) Uno che verifica che il presenter chiami il metodo ToDto del mapper per convertire l'oggetto del DM in un DTO da poter passare alla user interface

  &lt;br /&gt;4) Uno che verifica che il presenter passi alla view il DTO contenente i dati da visualizzare &lt;/p&gt;

&lt;p&gt;Sembra uno sforzo inutile, invece:
  &lt;br /&gt;- I test ottenuti sono decisamente più leggibili

  &lt;br /&gt;- I test documentano molto meglio le funzionalità dell'applicazione

  &lt;br /&gt;- Se un test fallisce so esattamente cosa non ha funzionato perché ogni test verifica una singola funzionalità

  &lt;br /&gt;- Scrivere 4 test al posto di quello sopra non è che sia un grande sforzo ;-) &lt;/p&gt;

&lt;p&gt;Il risultato potrebbe essere questo: &lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f9b4ad9e-ca59-4621-b862-e9787325b757" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:White;;overflow: auto;"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000;"&gt;[Test]
&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Constructor_ShouldSubscribeToViewEvents()
{
    IDtoMapper mapper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateStub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IDtoMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyView view &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateMock&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyModel model &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateStub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyModel&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    view.Expect(v  &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; v.Save &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;).IgnoreArguments();
    MyPresenter presenter &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyPresenter(view, model, mapper);
    view.VerifyAllExpectation();
}
[Test]
&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Constructor_ShouldGetDataFromModel()
{
    IDtoMapper mapper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateStub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IDtoMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyView view &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateStub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyModel model &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateMock&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyModel&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DomainModelData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dummyData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DomainModelData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    model.Expect(m &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; m.GetData()).Return(dummyData);
    MyPresenter presenter &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyPresenter(view, model, mapper);
    model.VerifyAllExpectation();
} 

[Test]
&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Constructor_ShouldGetDtoUsingMapper()
{
    IDtoMapper mapper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateMock&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IDtoMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyView view &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateStub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyModel model &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateStub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyModel&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DomainModelData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dummyData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DomainModelData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DtoData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dummyDto &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DtoData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    mapper.Expect(m &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; m.ToDto(dummyData)).Return(dummyDto);
    MyPresenter presenter &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyPresenter(view, model, mapper);
    mapper.VerifyAllExpectation();
} 

[Test]
&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Constructor_ShouldSetDataContextOnView()
{
    IDtoMapper mapper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateStub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IDtoMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyView view &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateMock&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyView&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IMyModel model &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MockRepository.CreateStub&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMyModel&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DtoData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dummyDto &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;DtoData&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();
    view.Expect(v  &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; v.SetDataContext(dummyDto);
    MyPresenter presenter &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyPresenter(view, model, mapper);
    view.VerifyAllExpectation();
} 

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/94337.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/428494394" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/10/22/scrivere-buoni-unit-test.aspx</guid>
            <pubDate>Wed, 22 Oct 2008 12:08:03 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/94337.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/10/22/scrivere-buoni-unit-test.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/94337.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/10/22/scrivere-buoni-unit-test.aspx</feedburner:origLink></item>
        <item>
            <title>Un progetto con il Composite WPF</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/389580984/un-progetto-con-il-composite-wpf.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;Ho iniziato da poco a sviluppare un'app WPF utilizzando il &lt;a href="http://www.codeplex.com/CompositeWPF"&gt;Composite WPF&lt;/a&gt; rilasciato da MS all'inizio dell'estate.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;La prima impressione è buona, leggendo la documentazione (molto ben fatta) in poche ore si riesce a capire e definire la struttura generale del progetto e ad iniziare a realizzare le triadi MVP da infilare nelle varie region.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Cosa offre?&lt;br /&gt;
Sono 4 le cose principali che mette a disposizione:&lt;br /&gt;
- &lt;strong&gt;Moduli&lt;/strong&gt;: la possibilita di suddividere l'applicazione in moduli caricati staticamente o a dinamicamente a runtime. Ogni modulo ha le sue view ed è indipendente dagli altri.&lt;br /&gt;
- &lt;strong&gt;Regions&lt;/strong&gt;: la finestra principale (Shell) viene suddivisa in region che vengono riempite dalle view definite nei vari moduli.&lt;br /&gt;
- &lt;strong&gt;Commands&lt;/strong&gt;: derivati dai Command nativi di WPF aggiungono funzionalità che permettono di mettere in comunicazione Presenter/View di regioni diverse senza creare dipendenze.&lt;br /&gt;
- EventAggregators: dove i command non bastano ossia dove la comunicazione deve andare al di fuori del modulo gli eventi sono il meccanismo che permette di far dialogare moduli diversi.&lt;br /&gt;
- &lt;strong&gt;Linee guida&lt;/strong&gt;: questa non è una feature documentata ma indotta dall'utilizzo del composite WPF, l'applicazione ottenuta è ben organizzata e strutturata grazie  hai "vincoli" indotti dal Framework&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Nota dolente: si dice che Composite WPF sia indipendente da altre lib (vedi Unity). Io e Alessandro abbiamo faticato non poco a rimuovere i riferimenti a Unity e ad implementare il meccanismo di risoluzione dei componenti tramite Spring.NET. IMHO qui la cosa si poteva fare meglio, magari facendo in modo che lo UnityBootsrapper non avesse un riferimento all'interfaccia IUnityContainer ma ad una interfaccia IContainer generica rendendo di fatto il Composite WPF _veramente_ indipendente da Unity.&lt;br /&gt;
Agli interessati lascio il link al blog di &lt;a href="http://blogs.ugidotnet.org/AMelchiori/Default.aspx"&gt;alessandro&lt;/a&gt; dove entro pochi giorni verrà pubblicata la soluzione con i sorgenti.&lt;br /&gt;
&lt;/font&gt;&lt;font face="Arial"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt;&lt;/p&gt;
Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/CompositeWPF"&gt;CompositeWPF&lt;/a&gt;
&lt;div&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/93988.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/389580984" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/09/11/un-progetto-con-il-composite-wpf.aspx</guid>
            <pubDate>Thu, 11 Sep 2008 11:28:46 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/93988.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/09/11/un-progetto-con-il-composite-wpf.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/93988.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/09/11/un-progetto-con-il-composite-wpf.aspx</feedburner:origLink></item>
        <item>
            <title>How I Got Started in Software Development</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/340639537/how-i-got-started-in-software-development.aspx</link>
            <description>&lt;p&gt;Visto che pure io sono stato &lt;a href="http://blogs.ugidotnet.org/ThinkingInGrava/archive/2008/07/16/how-i-got-started-in-software-development.aspx" target="_blank"&gt;taggato&lt;/a&gt; non mi resta che fare la mia parte e taggare altri amici.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;A quale età hai cominciato a programmare?     &lt;br /&gt;&lt;/strong&gt;Intorno ai 12 anni. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Come hai cominciato a programmare?     &lt;br /&gt;&lt;/strong&gt;Mio padre mi regalò un &lt;a href="http://en.wikipedia.org/wiki/Texas_Instruments_TI-99/4A" target="_blank"&gt;Texas Instruments TI-99/4a&lt;/a&gt;. Dopo pochi mesi dall'acquisto la Texas interruppe la produzione del TI-99 e come ovvia conseguenza il software a disposizione iniziò a scarseggiare cosi presi in mano il manuale e iniziai ad imparare il BASIC per scrivermi qualche semplice giochino. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Qual’è stato il tuo primo linguaggio di programmazione?&lt;/strong&gt;&lt;strong&gt;     &lt;br /&gt;&lt;/strong&gt;Il BASIC per il TI-99 &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Qual’è stato il primo programma vero che hai scritto?     &lt;br /&gt;&lt;/strong&gt;Se tralasciamo i programmi in BASIC fu al tempo dell'università quando per l'elaborato di Informatica 1 realizzai un programma per la gestione di un impianto sportivo. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Quali linguaggi hai usato da quando hai cominciato a programmare?&lt;/strong&gt;     &lt;br /&gt;In ordine cronologico BASIC, PASCAL, Assembly per x86, C, C++, Visual Basic, Java, VBScript/ASP, C#/VB.NET &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Quando è stato il tuo primo vero lavoro da programmatore?      &lt;br /&gt;&lt;/strong&gt;Il primo lavoro vero è stata la parentesi Java della mia carriera. Durante l'ultimo anno di università iniziai a lavorare presso una software house che realizzava applicazioni in Java e collaborai allo sviluppo di un gestionale e (udite udite) un ORM (ma solo dopo alcuni anni capii cosa stavo realizzando a quel tempo sinceramente l'idea mi sembrava strana e inutile :-)) &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Con il senno di poi, rifaresti lo stesso il programmatore? Ricominceresti a programmare?&lt;/strong&gt;    &lt;br /&gt;Credo di si. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Se ci fosse una cosa che hai imparato nella tua carriera e che vorresti dire ai giovani programmatori, cosa diresti?&lt;/strong&gt;     &lt;br /&gt;Leggete blog, articoli e frequentate le community. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Qual’è la cosa più divertente che hai programmato?&lt;/strong&gt;    &lt;br /&gt;Ai tempi dell'università facevo parte di un piccolo gruppo di geek e ci incontravamo una volta alla settimana per chiacchierare e portare avanti qualche progettino. Io al tempo mi ero appassionato di &lt;a href="http://en.wikipedia.org/wiki/A-life" target="_blank"&gt;A-Life&lt;/a&gt; scrissi un simulatore di "esseri pseudo-intelligenti" che cercavano il cibo, si muovevano in uno spazio 2D, mangiavano, combattevano, si riproducevano e morivano. Lo scrissi in Pascal. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Adesso è l’ora di taggare qualcun’altro...&lt;/strong&gt;    &lt;br /&gt;&lt;a href="http://www.didoo.net/" target="_blank"&gt;Cristiano Rastelli&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://alessandrocirelli.it/" target="_blank"&gt;Alessandro Cirelli&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://blogs.ugidotnet.org/danblog/Default.aspx" target="_blank"&gt;Daniele Armanasco&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://community.ugiss.org/blogs/dmauri/default.aspx" target="_blank"&gt;Davide Mauri&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://community.ugiss.org/blogs/abenedetti/default.aspx" target="_blank"&gt;Andrea Benedetti&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ef9a15cb-06b1-42d0-bec0-2329fb00d7a6" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/How%20I%20Got%20Started%20in%20Software%20Development" rel="tag"&gt;How I Got Started in Software Development&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/93467.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/340639537" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/07/20/how-i-got-started-in-software-development.aspx</guid>
            <pubDate>Sun, 20 Jul 2008 12:41:51 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/93467.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/07/20/how-i-got-started-in-software-development.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/93467.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/07/20/how-i-got-started-in-software-development.aspx</feedburner:origLink></item>
        <item>
            <title>Region di Visual Studio (reprise)</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/329128119/region-di-visual-studio-reprise.aspx</link>
            <description>&lt;p&gt;Tempo fa ne parlai &lt;a href="http://blogs.ugidotnet.org/BlogEma/archive/2007/12/01/uso-delle-region-in-visual-studio.aspx"&gt;qui&lt;/a&gt;  e molti non erano d'accordo con la mia idea. Io sono ancora convinto di quanto dicevo e oggi leggo con piacere che anche illustri &lt;a href="http://www.codinghorror.com/blog/"&gt;bloggatori&lt;/a&gt; la &lt;a href="http://www.codinghorror.com/blog/archives/001147.html"&gt;pensano&lt;/a&gt; come me.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/93314.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/329128119" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/07/07/region-di-visual-studio-reprise.aspx</guid>
            <pubDate>Mon, 07 Jul 2008 19:14:34 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/93314.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/07/07/region-di-visual-studio-reprise.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/93314.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/07/07/region-di-visual-studio-reprise.aspx</feedburner:origLink></item>
        <item>
            <title>Piccoli interventi, grandi risparmi</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/320669902/piccoli-interventi-grandi-risparmi.aspx</link>
            <description>&lt;p&gt;"La Brussel Airlines ha annunciato che ridurrà la velocità dei voli europei per consumare meno. Secondo i calcoli della compagnia belga, aumentare di poco la durata del viaggio diminuirà la spesa per i rifornimenti fino a 1,1 milioni di euro l'anno. Al beneficio economico si affiancherà anche quello ambientale, visto che verranno ridotte le emissioni di gas serra. […]" (da il Sole24ore.com)&lt;/p&gt;  &lt;p&gt;La scorsa settimana sono stato da un cliente che sta per rilasciare un'applicazione web abbastanza corposa composta da diversi moduli e servizi e ho lavorato insieme a loro per risolvere alcuni problemi e chiudere lo sviluppo.&lt;/p&gt;  &lt;p&gt;La cosa che mi ha lasciato un po' perplesso è la modalità con la quale lavoravano: non avevano unit test (e questo è purtroppo abbastanza normale) e per "testare" l'applicazione bisognava eseguirla. &lt;/p&gt;  &lt;p&gt;Il problema è che dal momento in cui premevo F5 al momento in cui mi si presentava la pagina di Login passavano circa 2 minuti e 40 secondi, un'altra manciata di secondi per fare il login e un'altra ancora per arrivare sulla pagina che dovevo testare, in tutto diciamo circa 3 minuti.&lt;/p&gt;  &lt;p&gt;Facciamo due conti:&lt;/p&gt;  &lt;p&gt;Siamo alle fasi finali, quindi si fanno più che altro piccole modifiche e correzione di qualche bug, quindi il tasto F5 viene premuto molte volte al giorno: diciamo che arriviamo ad eseguire l'applicazione 50-60 volte al giorno.&lt;/p&gt;  &lt;p&gt;Quindi 3 minuti * 50 volte = 150 minuti = 2,5h&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2 ore e mezza al giorno a produttività zero (e nervosismo alle stelle).&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Senza tirare in ballo lo unit testing che su un'applicazione che sta per andare in produzione non è neanche pensabile di mettersi a scrivere i test, ma uno script per velocizzare il build&amp;amp;run potrebbe essere comodo? E che ne dite se "#ifdef debug" allora facciamo un login automatico? E se spezzassimo la solution in più parti portando fuori ciò che non è "prettamente sottoposto a modifica"? E se si facesse pair programming anche (solo) in queste fasi per evitare di premere F5 per nulla visto che c'è un evidente errore che io non ho visto?&lt;/p&gt;  &lt;p&gt;Quelli elencati sono solo alcuni dei piccoli interventi che permettono di risparmiare alcuni secondi ad ogni lancio ma che sulla giornata si traducono in ore!&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a6b29303-899a-40a6-bfcd-ec16ea898f77" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Project%20Management" rel="tag"&gt;Project Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Agile" rel="tag"&gt;Agile&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/93187.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/320669902" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/06/26/piccoli-interventi-grandi-risparmi.aspx</guid>
            <pubDate>Thu, 26 Jun 2008 17:11:39 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/93187.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/06/26/piccoli-interventi-grandi-risparmi.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/93187.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/06/26/piccoli-interventi-grandi-risparmi.aspx</feedburner:origLink></item>
        <item>
            <title>Lettera aperta al team di ADO.NET Entity Framework</title>
            <link>http://feeds.feedburner.com/~r/blogema/~3/318951634/lettera-aperta-al-team-di-ado.net-entity-framework.aspx</link>
            <description>&lt;p&gt;Come molti sanno tra poco uscirà l'ADO.NET Entity Framework l'ORM targato Microsoft.&lt;/p&gt;  &lt;p&gt;Molti di voi sanno anche che la sua implementazione è stata criticata e nei giorni scorsi ha spinto qualcuno a scrivere una lettera aperta per invitare MS a rivedere alcune scelte (e per spiegare perchè non dovrebbe essere usato in alcuni contesti).&lt;/p&gt;  &lt;p&gt;La lettera è disponibile qui: &lt;a href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/"&gt;http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/&lt;/a&gt; e potete sottoscriverla inserendo il vostro nome e il vostro indirizzo email.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;   &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f9d82309-98dc-474f-968e-59599fa8fbfc" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ADO.NET%20Entity%20Framework" rel="tag"&gt;ADO.NET Entity Framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ALT.NET" rel="tag"&gt;ALT.NET&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/BlogEma/aggbug/93151.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogema/~4/318951634" height="1" width="1"/&gt;</description>
            <dc:creator>Emanuele DelBono</dc:creator>
            <guid isPermaLink="false">http://blogs.ugidotnet.org/BlogEma/archive/2008/06/24/lettera-aperta-al-team-di-ado.net-entity-framework.aspx</guid>
            <pubDate>Tue, 24 Jun 2008 15:12:08 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/BlogEma/comments/93151.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/BlogEma/archive/2008/06/24/lettera-aperta-al-team-di-ado.net-entity-framework.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/BlogEma/comments/commentRss/93151.aspx</wfw:commentRss>
        <feedburner:origLink>http://blogs.ugidotnet.org/BlogEma/archive/2008/06/24/lettera-aperta-al-team-di-ado.net-entity-framework.aspx</feedburner:origLink></item>
    </channel>
</rss>
