domenica 20 luglio 2008 #

How I Got Started in Software Development

Visto che pure io sono stato taggato non mi resta che fare la mia parte e taggare altri amici.

A quale età hai cominciato a programmare?
Intorno ai 12 anni.

Come hai cominciato a programmare?
Mio padre mi regalò un Texas Instruments TI-99/4a. 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.

Qual’è stato il tuo primo linguaggio di programmazione?
Il BASIC per il TI-99

Qual’è stato il primo programma vero che hai scritto?
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.

 

Quali linguaggi hai usato da quando hai cominciato a programmare?
In ordine cronologico BASIC, PASCAL, Assembly per x86, C, C++, Visual Basic, Java, VBScript/ASP, C#/VB.NET

 

Quando è stato il tuo primo vero lavoro da programmatore?
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 :-))

 

Con il senno di poi, rifaresti lo stesso il programmatore? Ricominceresti a programmare?
Credo di si.

 

Se ci fosse una cosa che hai imparato nella tua carriera e che vorresti dire ai giovani programmatori, cosa diresti?
Leggete blog, articoli e frequentate le community.

Qual’è la cosa più divertente che hai programmato?
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 A-Life 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.

 

Adesso è l’ora di taggare qualcun’altro...
Cristiano Rastelli
Alessandro Cirelli
Daniele Armanasco
Davide Mauri
Andrea Benedetti

 

posted @ domenica 20 luglio 2008 14.41 | Feedback (0)

lunedì 7 luglio 2008 #

Region di Visual Studio (reprise)

Tempo fa ne parlai qui  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 bloggatori la pensano come me.

 

posted @ lunedì 7 luglio 2008 21.14 | Feedback (2)

giovedì 26 giugno 2008 #

Piccoli interventi, grandi risparmi

"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)

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.

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.

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.

Facciamo due conti:

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.

Quindi 3 minuti * 50 volte = 150 minuti = 2,5h

2 ore e mezza al giorno a produttività zero (e nervosismo alle stelle).

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&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?

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!

 

Technorati Tags: ,

posted @ giovedì 26 giugno 2008 19.11 | Feedback (4)

martedì 24 giugno 2008 #

Lettera aperta al team di ADO.NET Entity Framework

Come molti sanno tra poco uscirà l'ADO.NET Entity Framework l'ORM targato Microsoft.

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).

La lettera è disponibile qui: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/ e potete sottoscriverla inserendo il vostro nome e il vostro indirizzo email.

 

posted @ martedì 24 giugno 2008 17.12 | Feedback (3)

martedì 17 giugno 2008 #

Windsor Castle Factory Support

Molti conoscono windsor castle il (più?) famoso IoC container. Pochi però sanno che oltre a poter essere usato come semplice contenitore Castle dispone di alcune utili "facility" che permettono di estenderne il funzionamento.
Di seguito vorrei parlare delle Factory.

Per default un oggetto registrato all'interno del file di configurazione di Castle viene costruito usando il costruttore e iniettando gli eventuali parametri necessari.
A volte però capita di dover costruire un oggetto avvalendosi di una classe factory che si occupa della costruzione e setup di un oggetto.

Castle supporta nativamente questo modo di costruzione degli oggetti basta configurarlo nel modo corretto.

Supponete di voler configurare Castle per farvi tornare l'instanza della sessione di NHibernate, come saprete la sessione non può essere costruita tramite il new ma deve essere costruita tramite una classe SessionFactory di solito incapsulata in un NHibernateHelper:

public static class NHibernateHelper { private static readonly ISessionFactory sessionFactory; static NHibernateHelper() { Configuration cfg = new Configuration(); cfg.Configure(); sessionFactory = cfg.BuildSessionFactory(); } public static ISession GetNewSession() { return sessionFactory.OpenSession(); } // ... }

La classe NHibernateHelper ha un metodo statico GetNewSession che ritorna un'instanza di una classe ISession.
Voglio usare questa classe tramite IoC per costruire delle ISession da iniettare (ad esempio) in un Repository:

public class UserRepository : IUserRepository { public UserRepository(ISession session) { //... } }

L'unica cosa da fare è istruire Castle tramite il file di configurazione (o tramite codice se preferite):

<castle> <facilities> <facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.Microkernel" /> </facilities> <components> <component id="session" type="NHibernate.ISession, NHibernate" factoryId="sessionFactory" factoryCreate="GetNewSession" /> <component id="sessionFactory" type="NHibernateHelper, CodicePlastico.Samples" /> <component id="userRepository" service="CodicePlastico.Samples.Repositories.IUserRepository, CodicePlastico.Samples" type="CodicePlastico.Samples.UserRepository, CodicePlastico.Samples" /> </components> </castle>

Il primo blocco (facilities) aggiunge il supporto necessario alle factory specificando quale classe si occuperà di gestire le factory all'interno di castle.
Poi vengono registrati i componenti.
Il primo (session) è l'oggetto che verrà creato tramite una factory, specifico il tipo (Isession) e l'id del componente che farà da factory per ISession (sessionFactory) e il metodo che dovrà utilizzare per la costruzione degli oggetti ISession (GetNewSession).
Naturalmente anche la classe factory deve essere registrata (componente sessionFactory) e questo avviene tramite la consueta sintassi, come pure la classe UserRepository.

Cosa succede quando richiedo al container un oggetto di tipo IUserRepository?
Il container vede che il tipo concreto è UserRepository e che il suo costruttore riceve in ingresso un'istanza di ISession che a sua volta deve essere costruita tramite il metodo GetNewSession della classe NHibernateHelper.

Questa tecnica è utile in quei contesti in cui l'oggetto non può essere creato direttamente ma si deve utilizzare un'altra classe che si occupa della instanziazione.

 

Technorati Tags: ,,

posted @ martedì 17 giugno 2008 14.23 | Feedback (0)

domenica 15 giugno 2008 #

Seconda UgiALT.NET Conference

Un momento del planning game

Ieri, come alcuni di voi sapranno, si è svolta a Milano presso la seconda UgiALT.net (medium) confercence a cui hanno partecipato una quarantina di persone (per questo l'abbiamo marcata con l'attributo medium :-))

SimoneCh ha aperto la giornata con una breve introduzione sul movimento ALT.NET (per chi non avesse ancora capito cos'è invito a visitare il sito www.ugialt.net) e sulla scaletta della giornata.

Poi in sequenza Io, Roberto, Claudio, SimoneB, SimoneCh e Matteo abbiamo tenuto delle micro sessioni introduttive su alcuni tematiche che avremmo affrontato nel pomeriggio: metodologie agili, TDD, IoC, Mocking, MVC e ORM.

Sessioni da 5 minuti (pomodorizzate) per dare alcune definizioni e allineare i partecipanti. Anche se 5 minuti sembrano pochi sono state molto efficaci per dare lo sprint giusto alla giornata e far capire a tutti di cosa avremmo parlato.

La giornata vera e propria è iniziata con la definizione delle user story da implementare e con una mezz'oretta di planning game coordinato da Luka per prioritizzare le storie e stabilire cosa doveva essere fatto.

Nel pomeriggio ci siamo divisi in 2 gruppi (gruppo Winforms/WPF e gruppo Web/ASP.NET) per portare a termine le storie assegnate durante il planning game e insieme, collaborando, discutendo, testando e proponendo alternative abbiamo passato il resto della giornata scrivendo codice e completando le storie assegnate.

La cosa veramente bella, divertente e diversa dagli altri workshop a cui siamo abituati a partecipare è il formato OpenSpace che ha permesso a chiunque lo volevesse di prendere la tastiera e mostrare una propria implementazione di ciò che stavamo realizzando o di porre una domanda su un pezzo di codice. Sono nate discussioni sui vari "dialetti" del pattern MVP, sullo stile del codice, sull'importanza o meno di usare un framework di IoC, sui vantaggi di usare un ORM come Hibernate o LinqToSQL, sull'incapsulamento e altre ancora.
Non c'erano partecipanti e speaker c'era solo un gruppo di persone che discuteva alla pari di tecnologia ponendo domande e dando risposte nella massima libertà.

Il prossimo appuntamento è per dopo l'estate. Per ora invito tutti a iscriversi alla mailing list per continuare le discussioni nate ieri o per iniziarne di nuove!

 

Technorati Tags: ,

posted @ domenica 15 giugno 2008 9.30 | Feedback (8)

mercoledì 30 aprile 2008 #

L'importanza della formazione

Una delle cose che sento dire spesso è che in Italia si fa poca formazione perchè le aziende non hanno tempo o perchè costa cara.

Diciamo subito che la formazione, soprattutto in un settore dinamico come il nostro, non è  mai una perdita di tempo ma piuttosto un investimento per risparmiare tempo e per migliorare la qualità del software prodotto.

Oggi sono stato invitato dagli amici AB Sistemi in una di quelle che loro chiamano "AB Academy", una giornata in cui i ragazzi che lavorano in AB (Andrea compreso) tengono una serie di sessioni su vari temi legati al  mondo dello sviluppo software, una specie di workshop interno.

La giornata si è aperta con Andrea che ci ha parlato delle novità del linguaggio TSQL in SQL Server 2008, poi è stato il mio turno per un introduzione su WPF e nel pomeriggio Claudio ha parlato di Unit Testing.

Molto divertente, istruttivo, utile e low cost.

In AB ne organizzano una al mese, preparano l'agenda qualche settimana prima invitando anche speaker esterni che partecipano e offrono il loro know how, invitano clienti e amici che vogliono partecipare, e dedicano questa giornata alla formazione.

Per me è stato un piacere poter partecipare sia come attendee che come speaker a questa giornata, è  un'idea che tutti i team dovrebbero adottare, un giorno al mese di autoformazione non costa nulla, permette lo scambio  di idee, ed è un modo per far crescere le competenze del team e di conseguenza la qualità delle applicazioni prodotte.

Da non sottovalutare il pranzo: Pizza+Birra ;-)

Technorati Tags: ,

posted @ mercoledì 30 aprile 2008 17.54 | Feedback (3)

mercoledì 23 aprile 2008 #

My Geek Code

posted @ mercoledì 23 aprile 2008 9.36 | Feedback (0)

mercoledì 9 aprile 2008 #

CSS Naked Day

Ricordo a tutti che oggi è il CSS Naked Day (tutte le info per aderire qui: http://naked.dustindiaz.com/)

Il mio sito nudo qui: www.codiceplastico.com ...solo per oggi!

 

 

posted @ mercoledì 9 aprile 2008 9.25 | Feedback (0)

venerdì 28 marzo 2008 #

Il codice ambientalista: Reduce, Reuse, Recycle

Le famose 3R del motto Reduce Reuse Recycle sono molto utilizzate in ambito ambientalista ma possono essere applicate anche al mondo della programmazione. Un buon programmatore è attento all'ecologia della propria applicazione visto che il codice che la compone è l'ambiente in cui passa molto del suo tempo lavorativo. Se l'applicazione è sviluppata rispettando l'ambiente nel quale gira è sicuramente un vantaggio per l'intero ecosistema virtuale.

Reduce: ridurre il codice. Sembrerà strano ma spesso è più difficile cancellare codice che aggiungerne di nuovo. Aggiungere troppo codice è spesso frutto overengineering che porta ad implementare funzionalità non strettamente necessarie e che non danno valore al cliente finale e che quindi si limitano ad inquinare il codice dell'applicazione rendendola difficile da mantenere. Quindi ridurre la dimensione del codice (in termini di numero di classi, di metodi e di righe) è un'operazione difficile ma che porta a notevoli risultati: semplificazione della codebase, maggiore manutenibilità e in genere un miglioramento delle performance.

Reuse: non reinventate la ruota tutte le volte. Scrivere classi che possono essere riutilizzate o usare librerie di terze parti che fanno già  il lavoro che serve è una buona pratica. Il fatto di poter riusare una classe già scritta porta vantaggi sia in termini di tempo per la realizzazione che in termini di tempo di debugging (sperando che la classe che vi portate in casa sia bug free...o quasi)

Recycle: talvolta una classe potrebbe essere riutilizzata ma non è  proprio come la vorremmo. Quindi spesso si ricorre al CTRL-C, CTRL-V introducendo duplicazioni e quindi codice inquinante. Se invece si applica un po' di refactoring si riuscirebbe a riutilizzare una parte di codice già scritto e adattarlo alla nostra applicazione. Anche qui i vantaggi sono numerosi, la quantità di codice che andiamo ad aggiungere è  minore, evitiamo di creare classi troppo simili (o addirittura uguali) e ancora una volta risparmiamo tempo e non inquiniamo.

Questa idea del codice che rispetta l'ambiente mi piace, come del resto  tutte le pratiche ambientaliste.

Che ne pensate? Vi sentite ambientalisti del codice?

 

Technorati Tags: ,,

posted @ venerdì 28 marzo 2008 8.44 | Feedback (9)