Eliminare gli sprechi


    Lean Software Development descrive principi e pratiche utili a introdurre i metodi agili nella propria organizzazione. E lo fa dal punto di vista del Manager e del Responsabile tecnico di progetto.




Un principio del Lean Software Development è


  1. Eliminare gli sprechi


    Un cliente/utente quando dice che una certa cosa secondo lui   non da più valore   al suo software, programmare quella cosa è uno spreco. 

    Anche una cosa che   rallenta   lo sviluppo e il rilascio di una funzionalità che serve all'utente è spreco



Tags :   |  |  |

Print | posted @ venerdì 5 settembre 2008 1.46

Comments on this entry:

Gravatar # Re: Eliminare gli sprechi
Ergo Luca, se wrappare Entity Framework rallenta il rilascio di funzionalità utili al cliente, è uno spreco...
saluti
Roberto
  
Gravatar # re: Eliminare gli sprechi
by Luca Minudel at 05/09/2008 14.36

è una considerazione interessante


mi vengono in mente 2 dubbi:


- anche gestire correttamente il rilascio di risorse unmanaged o programmare correttamente lock, transazioni e rollback rallenta il rilascio di una funzionalità - e notoriamente non farlo subito porta a costi molto elevati per rimediarci dopo. Mi vengono in mente 2 criteri con cui cercare il trade-off YAGNI e The Last Responsible Moment


- supponendo sia possibile disporre di un developer che ha esperienza nel wrappare correttamente in modo incrementale senza rallentare il lavoro, wrappare EF non è più uno spreco? oppure non lo sarebbe neanche prima perchè (Root cause analysis)lo spreco in quel caso sarebbe il non disporre di quel developer ?
  
Gravatar # re: Eliminare gli sprechi
by Andrea at 05/09/2008 17.56

Gestire correttamente le transazioni è un requisito, in quanto necessario al buon funzionamento dell'applicazione. Insomma è qualcosa che gli stakeholders si aspettano dal prodotto software. Astrarre EF, a meno che non venga richiesto esplicitamente, non è un requisito.

E' sicuramente possibile astrarre EF, ma è necessario? E' probabile che la prossima versione di EF sia retrocompatibile. Anche se non lo fosse, potrebbero esistere dei tool di conversione già pronti che renderebbo la migrazione più economica che progettare ora un "wrapper" e addattarlo in futuro alla nuova versione. Inoltre, chi ci dice che in futuro non emerga una tecnologia di accesso ai dati così diversa da quella attuale da rendere la nostra astrazione insufficiente? E se tra 5 anni IBM producesse un computer quantico su cui gira solo Linux e il cliente si trovasse obbligato a riscrivere tutta l'applicazione, rendendo inutile il nostro sforzo (e i soldi spesi dal committente) per astrarre EF?

In definitiva, mi chiedo perchè si dovrebbe far pagare al cliente per qualcosa che non ha richiesto e che nemmeno noi sappiamo se serva davvero. Non abbiamo una sfera di cristallo e non sappiamo stimare nè se sarà necessario cambiare tecnologia di accesso ai dati nè quanto costruire un'astrazione oggi potrebbe far risparmiare al cliente nel lungo termine.

Infine, evitando questo genere di astrazioni che inevitabilmente incrementano i costi della versione 1.0, un vostro concorrente potrebbe proporre una soluzione equivalente alla vostra, a un prezzo inferiore.

My two cents.
  
Gravatar # re: Eliminare gli sprechi
by Luca Minudel at 05/09/2008 19.25

Ciao Andrea,


come dicevo nel commento sopra _supponendo_ (sottolineo supponendo) sia possibile disporre di un developer che ha esperienza nel wrappare correttamente in modo incrementale senza rallentare il lavoro, wrappare EF sarebbe ancora uno spreco?

è questa la provocazione con cui era nata la discussione con Roberto.

imho la scelta del trade-off tra YAGNI e The Last Responsible Moment è compito del tecnico a patto che ogni conseguenza della scelta sul lavoro del cliente/utente e sul software gli sia stata chiarita in modo che possa dire la sua
  
Gravatar # re: Eliminare gli sprechi
by Andrea at 05/09/2008 20.48

Secondo me è uno spreco, perchè si decide di allocare risorse per qualcosa che non è stato richiesto. Anche se non rallenta il lavoro è comunque un costo che viene sostenuto e che il cliente deve pagare. Inoltre, come dicevo, non si ha nessuna certezza che il costo di astrarre EF sia inferiore ad affrontare, in futuro, la migrazione ad un'altra tecnologia (sempre messo che questa migrazione avvenga). Non si sà infatti come sarà questa nuova tecnlogia, nè quali tool per la conversione saranno disponibili, ecc.

Inoltre, immaginate se anni fà si fosse sviluppato un'astrazione di Windows Forms e ora si dovesse sostituire il backend con WPF. Per quanto bravo fosse lo sviluppatore incaricato di questo lavoro, secondo me il risultato sarebbe tutt'altro che ottimale, in quanto le tecnologie sono molto differenti e sei costretto a lavorare sul lowest common denominator.

Concordo che la possibilità di investire in qualcosa come l'astrazione di EF (che ha effetto positivo soltanto sulla qualità interna del codice) è possibile proporle al committente e discuterne.
  
Gravatar # re: Eliminare gli sprechi
by Luca Minudel at 13/09/2008 12.57

>> Inoltre, immaginate se anni fà si fosse sviluppato un'astrazione di Windows Forms e ora si dovesse sostituire
>> il backend con WPF. Per quanto bravo fosse lo sviluppatore incaricato di questo lavoro, secondo me il risultato sarebbe tutt'altro che ottimale,
>> in quanto le tecnologie sono molto differenti e sei costretto a lavorare sul lowest common denominator.


ci ho pensato un po e ho ricordato un passaggio simile che ho vissuto: quello dalle applicazioni Desktop (WinForm) alle applicazioni Web (ASP.NET)

le applicazioni Win che separavano la GUI dalla logica+persistenza hanno permesso un riutilizzo del 70-80% della codice nel fare la versione Web della applicazione mentre quelle che mischiavano GUI, logica e persistenza hanno avuto un riutilizzo minimo (0-30%).

Per un passaggio da Windows Form a WPF le applicazioni che sono organizzate secondo il pattern MVC permettono una sostituzione del Form Windows con uno WPF con un gran riutilizzo del codice esistente (dalla esperienza del Win/Web direi ancora dal 70-80% lavorando sul lowest common denominator e cambiando solo la View cioè la V del MVC) con la possibilità poi di lavorare per evolvere i form di quelle app portate a WPF che più possono beneficiare delle novità specifiche del WPF. Questo richiede di cambiare anche il Controller (la C del MVC).

  
Gravatar # re: Eliminare gli sprechi
by Andrea at 13/09/2008 17.01

Ciao Luca, utilizzare il pattern MVC per separare logica e interfaccia utente è una cosa molto diversa da creare un wrapper di Windows Forms (almeno, per come io intendo il termine wrapper).

Scrivere un wrapper di Windows Forms significa scrivere qualcosa come il wxWidget toolkit o il framework utilizzato da Eclipse per l'interfaccia utente (non ricordo il nome). In questo caso tu definisci un frontend (IWindow, IButton) e uno o più backend (WinFormWindow, WPFWindows, etc.).

Io ho inteso che quanto volesse fare Roberto con EF fosse un'operazione di questo tipo.
  
Gravatar # re: Eliminare gli sprechi
by Andrea at 13/09/2008 17.05

Mi spiego meglio. Con MVC, hai disaccoppiato la logica dall'interfaccia utente, ma non hai disaccoppiato l'interfaccia utente da Windows Forms. Disaccoppiare l'interfaccia utente da Windows Forms significa appunto scrivere un toolkit come wxWidget.

Tornando all'argomento iniziale, EF, secondo me è bene disaccoppiare il codice di accesso ai dati dalla logica applicativa, ma disaccoppiare il codice di accesso ai dati dal framework di persistenza, wrappandolo, è un'operazione costosa e difficilmente giustificabile.
  
Gravatar # re: Eliminare gli sprechi
by Luca Minudel at 13/09/2008 18.58

concordo che fare un wrapper di _tutte_ le interfacce e metodi di EF 1:1 sull'esempio di wxWidget probabilmente sarebbe eccessivo

mi vengono in mente almeno 3 alternative più leggere, 1- mappare solo le interfacce/metodi usati dalla singola applicazione (spesso è un sottoinsieme molto ridotto rispetto al totalità) 2-incapsulare con granularità più grossa con pattern di tipo facada cioè far in modo che la dipendenza da EF non si diffonda fuori del codice di accesso ai dati (mi sembra che coincide col tuo suggerimento) oppure 3- sempre all'interno del codice di accesso ai dati fare un ulteriore facade per localizzare in poche classi/interfacce la dipendenza ad EF in un posto centralizzato a beneficio di tutto il codice di accesso ai dati

il punto è localizzare le dipendenze a EF in modo che lo sforzo per sostituirlo sia sostenibile.

mi sembra tutte e 3 alternative sostenibili in termini di costi/benefici (cioè costo di scrittura del codice secondo questo disegno e beneficio di rendere reversibile la scelta di EF per non legarsi indefinitamente ai limiti che Roberto ha sottolineato). cosa ne dici ?

Probabilmente per fare una buona scelta servirebbe tenere in conto anche la specificità della applicazione che conosce solo Roberto
  
Gravatar # re: Eliminare gli sprechi
by Andrea at 13/09/2008 22.14

Ciao Luca, per esemplificare il mio punto di vista mi limito a parlare del recupero dei dati e non della loro persistenza, perchè mi è più facile fare l'esempio.

Come faresti un wrapper Entity Query Language? Scriveresti un tuo linguaggio e poi un traduttore in EQL? Oppure faresti soltanto qualcosa simile alla Criteria API di NHibernate?

Io di solito faccio semplicemente una o più classi QueryHelper, dove definisco metodi quali FindEmployeesBySalary, FindAllCategories, ecc. In questi metodi uso direttamente HQL di NHibernate. Se un domani dovessi davvero cambiare meccanismo di persistenza semplicemente riscriverei i QueryHelper*. Tramite le classi QueryHelper ho disaccoppiato la mia logica applicativa dalla tecnlogia di accesso ai dati, ma non ho certo scritto un wrapper di NHibernate. Personalmente, mi sembra un livello di disaccoppiamento sufficiente, ritengo disaccoppiare i QueryHelper da NH un po' sovraingegnerizzato. Inoltre, secondo me, wrappare EQL comporta una probabilità di introdurre bugs molto più elevata di una soluzione come questa (il testing dei query helper è elementare).

Se analizziamo i costi abbiamo due ipotesi.

Ipotesi 1: EF si evolve in maniera retrocompatibile, il vantaggio di wrappere EQL è nullo e il costo fatto sostenere al cliente non viene recuperato.

Ipotesi 2: EF viene sostituito da una tecnologia diversa:
- se abbiamo scritto un wrapper di EQL
- costo design del wrapper
- costo implementazione per EQL
- costo implementazione per nuova tecnologia
- eventualmente costo di modifica dei wrapper (se la nuova tecnologia è molto diversa)
- se abbiamo semplicemente scritto dei QueryHelper
- costo riscrittura dei QueryHelper

Nella seconda ipotesi può anche essere che, se le query sono davvero molte, wrappare EQL risulti nel lungo termine conveniente per il cliente. Tuttavia questo vantaggio va ponderato in relazione alle probabilità con cui le due ipotesi si verificano.

In economia si parla anche di "valore monetario del tempo", quindi per il cliente potrebbe essere meglio risparmiare 10 oggi che risparmiare 30 tra 5 anni.


* Se volessi fare le cose "per bene" potrei estrarre delle interfacce e fare dependency injection, ma questo ho visto che si può fare in fase di refactoring senza troppe controindicazioni.
  
Gravatar # re: Eliminare gli sprechi
by Luca Minudel at 14/09/2008 20.19

>> Oppure faresti soltanto qualcosa simile alla Criteria API di NHibernate?

questa è una possibilità che _valuterei_ stando attento a non voler wrappare la API completa di tutte le interfacce di EF e nemmeno fare un wrapper generico da utilizzare in altre applicazioni bensì valuterei di wrappare unicamente quello che mi serve in quel momento e in modo specifico all'uso che ne devo fare
e applicando la dependency injection come suggerisci

cioè un approccio "Skin and Wrap the API" come è descritto nel welc

>> faccio semplicemente una o più classi QueryHelper, dove definisco metodi quali FindEmployeesBySalary, FindAllCategories, ecc.

anche questa è una possibilità che valuterei , quella che nel welc è chiamata "Responsability-Based extraction" che in questo caso è fatta ad altissimo livello

>> criveresti un tuo linguaggio e poi un traduttore in EQL?

questo non lo prenderei in considerazione


>> - eventualmente costo di modifica dei wrapper (se la nuova tecnologia è molto diversa)


qui è il punto in cui il wrapper dovrebbe dare un vantaggio rispetto alle modifiche varie, numerose e sparse che sarebbero necessarie senza wrapper - sempre se è stato disegnato bene
quindi non parlerei di costi qui



  
Gravatar # re: Eliminare gli sprechi
by Andrea at 15/09/2008 14.58

Ciao Luca, purtroppo mi ero perso quel tuo post. Molto utile, soprattutto perchè fornisce una terminolgia comune.

La scrittura di un wrapper coincide quindi con l'approccio "Skin and Wrap the API", che penso fosse quello preso in considerazione da Roberto.

"Responsability-Based extraction", che è l'approccio da me usato scrivendo i QueryHelper, mi sembra una pratica abbastanza comune e strettamente legata a "separation of concerns", utile non solo per isolare la dipendenza da EF, ma anche per la scrittura di test e la manutenzione.

Anche avendo un wrapper di NH o di EF a disposizione, a mio parere, sarebbe comunque bene fare "Responsibility-based extraction". Rimanendo nel nostro esempio, effettuare le query dall'interfaccia utente, siano esse fatte con il nostro wrapper o direttamente con EF, è comunque una pratica da evitare, soprattutto perchè non consente di scrivere unit test per queries. Inoltre, isolare le query - manualmente o usando dei tool di refactoring - è un'operazione a costo praticamente nullo.
  
Gravatar # re: Eliminare gli sprechi
by Andrea at 15/09/2008 15.22

PS

Riprendendo l'altro esempio, usare MVC (o rifattorizzare a MVC) può essere visto come una "Responsibility-Based extraction", mentre scrivere un wrapper come wxWidget è un approccio "Skin and Wrap the API".

Probabilmente, come dici tu stesso nell'altro post, in presenza di API molto complesse è sufficiente fare "Responsibility based extraction".

Se invece si tratta di isolare un'API semplice, per esempio un singolo controllo GDI+ di terze parti, sono convinto anch'io che "Skin and wrap the API" è un approccio valido e da tenere sicuramente in considerazione.
  

Your comment:

Title:
Name:
Email:
Website:
 
Italic Underline Blockquote Hyperlink
 
 
Please add 4 and 8 and type the answer here: