SlideShare una empresa de Scribd logo
1 de 130
DDD
Brutto,
Sporco e
Cattivo

@ziobrando
Obiettivo #1
Arrivare a DDD
non partendo dal
foglio bianco...
Obiettivo #2
Arrivare a DDD in
maniera non
prescrittiva
Do you really need me?
Checkpoint
Quando fare DDD?
- Problema complesso
- Aspettative elevate
Anti-pattern

        Voglio fare DDD
Non lo conosco molto bene...
  ...quindi lo applico ad un
      problema semplice
   Non ne vedo i vantaggi
       ...DDD non serve.
Sbagliato
Non si impara in pianura
Non è questo il
 nostro lavoro
C’è chi lo sa fare meglio
La rete di protezione

         ✓Ambienti
         ✓Build script
         ✓Test suite
         ✓Database privato
         ✓Fixtures
Strumenti
Professionisti
Strumenti adeguati
Anche nelle peggiori condizioni
Infermiera, mi
    passa

                 Quello a
                 punta?
     Sì,
quello con la
punta un po’
Strumenti
Precisione
Aspirina
    Anticoncezionale
Linguaggio
Siete
Checklist

  Strumenti? --> Strumento. (Sempre e solo
  quello)
  Precisione? --> “Quando sei in stato 12 il
  campo MRKT_NFLD può valere solo B o K”
  Linguaggio? --> :-(

                                  avanscoper
                                      ta
Data-based integration
Qual è la
differenza tra i
  maiali e le
 applicazioni?
Checklist data-based
 Siamo in grado di sapere...
       Quale applicazione è responsabile della struttura del
       dato?

       Quale requisito ne ha influenzato la definizione?
          E’ ancora valido?

          È valido nel mio contesto?

       Quali applicazioni utilizzano quel dato?

       Quali conseguenze avremo cambiandone la struttura?
                                                  avanscoper
                                                      ta
Obiettivo #1
Arrivare a DDD
non partendo dal
foglio bianco...
Soluzione #1
Mettere da parte
il casino e
cominciare dal
foglio bianco...
Quale problema
   vogliamo
  risolvere?
Uno
Il nostro
Complessità
            Dominio del Nostro PROBLEMA
            SOLUZIONI precedenti

      15%




85%
Il nostro problema
                                                    Altro contesto



                                                                     Altro contesto




                                            I d at i d a
                                         c o n di v id
           Il nostro contesto                          ere

 I nos t r i
               d at i

                    Il nostro database
THIS DATABASE IS
 MY DATABASE
   TRESPASSERS
   WILL BE SHOT
 SURVIVORS WILL
  BE SHOT AGAIN
Dev: “Detto così è
     semplice...”
DDD serve a
risolvere problemi
complessi,
DDD serve a
risolvere problemi
complessi,
NON a complicare
problemi
semplici.
Strategie per
gestire gli zombi
Un bel recinto...
A
  Romolo!! E
famme fà ‘sta
A
         Romolo!! E
       famme fà ‘sta

None
A
         Romolo!! E
       famme fà ‘sta

None
        Eddai ...è di
       sola lettura...
Bounded
Context
Anti-Corruption Layer
            Our Context                                                     ACL                                       da   ry   Other Context
                                                     u   ndar
                                                              y
                                                                                                          ex   t boun
                                                bo                                                con t
                                  co   n te x t

              <<Entity>>
              MyEntity
            Attributo
            Attributo




                                                                      <<Service>>                                               Componente
                                                                     ContactService
                                                             getContattiUnici(…):List<Contatto>
                        ContactService
 <<Value Object>>
    Contatto
Attributo
Attributo
Anti-Corruption Layer
            Our Context                                                     ACL                                       da   ry   Other Context
                                                     u   ndar
                                                              y
                                                                                                          ex   t boun
                                                bo                                                con t
                                  co   n te x t

              <<Entity>>
              MyEntity
            Attributo
            Attributo




                                                                      <<Service>>                                               Componente
                                                                     ContactService
                                                             getContattiUnici(…):List<Contatto>
                        ContactService
 <<Value Object>>
    Contatto
Attributo
Attributo



   Il modello come
   dovrebbe essere
Anti-Corruption Layer
            Our Context                                                     ACL                                       da   ry   Other Context
                                                     u   ndar
                                                              y
                                                                                                          ex   t boun
                                                bo                                                con t
                                  co   n te x t

              <<Entity>>
              MyEntity
            Attributo
            Attributo




                                                                      <<Service>>                                               Componente
                                                                     ContactService
                                                             getContattiUnici(…):List<Contatto>
                        ContactService
 <<Value Object>>
    Contatto
Attributo
Attributo                                                                                                              La
                                                                                                                       componente
   Il modello come                                                                                                     legacy, con i
   dovrebbe essere                                                                                                     suoi guai
Anti-Corruption Layer
            Our Context                                                     ACL                                       da   ry   Other Context
                                                     u   ndar
                                                              y
                                                                                                          ex   t boun
                                                bo                                                con t
                                  co   n te x t

              <<Entity>>
              MyEntity
            Attributo
            Attributo




                                                                      <<Service>>                                               Componente
                                                                     ContactService
                                                             getContattiUnici(…):List<Contatto>
                        ContactService
 <<Value Object>>
    Contatto
Attributo
Attributo                                                                                                              La
                                                              Qui risolviamo il
                                                                                                                       componente
   Il modello come                                            casino, anche con
                                                                                                                       legacy, con i
   dovrebbe essere                                            le maniere forti
                                                                                                                       suoi guai
...e dentro il nostro
Bounded Context...
Il modello ideale
Non è poi così
importante...
Compliance
Non c’è
nessuna
medaglia...
ma forse...




http://www.youtube.com/watch?v=zDZFcDGpL4U
DDD patterns
a supporto di
  riscritture
   frequenti
DDD come
architettura di
   supporto
all’evoluzione
meglio dotarci di
adeguati strumenti
 di supporto alla
  progettazione
Lavagne
CRC Cards
P.O.: “Davvero
      possiamo fare
      questo?”
Dev: “Dobbiamo
     mettere uno strato
     di validazione per
     evitare che i dati
     sporchi entrino
     nel sistema”
Davvero?
La validazione
 complessa è
  uno smell
Dati (quasi) uguali

   <<Entity>>              <<Entity>>
 FatturaPreview             Fattura
                        importo
importo
                        cliente
cliente
                        stato
modifica
                        emetti
convalida
                        registraPagamento




                  Comportamento
                       differente
Multiple models
Archetipi
frequenti
3 archetipi?
     Costruzione collaborativa
          Topic+Conversation
       Facebook, Basecamp, Github


             Esecuzione
      Macchina a stati, Commands


              Tracking
Logging, Auditing, Datawarehouse, Eventi
E il DBA che
    dice?
DBA: “Mi aspettavo
     che fosse stata
     definita per bene
     la struttura del
     database, una
     volta per tutte”
...
Prima idea...
Può una componente
  progettata prima di
   una applicazione
essere adeguata alle N
     applicazioni
     successive?
Ostacoli
Per poter interagire con
il sistema X devi guardarti le
             spalle
Ci sono delle f***ute
stored procedure che girano
       ogni 10 minuti
Nessuno sa
esattamente come
    funzionino
Nessuno le ha mai
   Nessuno sa
                   cambiate ed è tornato vivo
esattamente come
                       per raccontarlo
    funzionino
Hrmpf
Rischio...
Mi
  raccomando,
 copriti quando     Ti sei
                   messo la
  Chiudi la       canottiera?
porta a chiave,
 quando esci!
Ansia
Carico cognitivo

        Quante cose
        devo sapere
        prima di
        toccare il
        codice?
Possiamo essere
   ignoranti e
 produttivi allo
 stesso tempo?
Transaction management?



 Presentation Layer       Application Layer   Domain Layer         Infrastructure
                                                                       Layer




                                                              pi
                                                             em
                      D
                  DD




                                                             es
                                                       gli
                                                   de
                                                %
                                              99
Repository & SRP
                                                                               <<factory>>
                                                                               OrderFactory
                                                                             createEmpty()
                              Application Layer
                                                                                   creates         Domain Layer

                                                                                  <<Entity>>
                                 <<Facade>>                                         Order
                              Application Facade                                price
                             createOrder(…)                                     customer
                             delivery(order_ID, …)                              delivery()
 Crea il
 contesto e lo
 passa al
 repository
                                                                            <<Repository>>
                                       opens / closes                       OrderRepository
                                                                           save(Order, Context)
                                                                           findById(id, Context)

                                                                                                    Riceve il contesto
                                                                  uses                              transazionale
Il Repository effettua le                                                                           dall'e sterno
operazioni di aggiunta e/o                       <<ORM>>
rimozione dal contesto, ma è                      Context
l'application layer ad invocare               +saveChanges()
saveChanges()
                                                               Infrastructure layer
Non si
accettano
caramelle
dagli
sconosciuti
...mettiamo una
     tabella
   condivisa...
Ooops...
Non si
accettano
caramelle
dagli
sconosciuti
Non si accettano
caramelle
Motivazioni
Infanzia difficile
Infanzia difficile
               Persona
            nome
            cognome
            numeroTel




   Studente               Professore
numeroMatricola          anzianità
Dimostrami di
essere una Persona...
...Stampati!
Infanzia difficile
Infanzia difficile
               Persona
            nome
            cognome
            numeroTel




   Studente               Professore
numeroMatricola          anzianità
Non stanno insieme!




 ...e non è colpa dell’ORM
Ogni regola
  architetturale
che comincia con
     “ogni” è
    sbagliata!
Conseguenze
Vedi, il mondo si
divide in due categorie: chi è
in un bounded context, e chi
           scava...
Tu ...scavi
Stime
Stime
Stime
Evoluzioni “esplorative”
Stime
Evoluzioni “esplorative”



Legacy “vaso di Pandora”
Ignorance based planning
             100%


             90%


             80%




                                B re a kt
             70%




                                   h ro u g h
 Ignorance




             60%


             50%


             40%
                    Ignorance
             30%


             20%


             10%
Gold plating?
Si, ma come faccio a
    sapere se sto
    facendo DDD?
Sto veramente facendo


 Prodotto migliore delle aspettative
 Non abbiamo paura di riscriverne dei
 pezzi
 Ci stiamo divertendo

                                 avanscoper
                                     ta
domande?
domande?


Sul serio, potete farle...
DDD, CQRS and Event Sourcing
          Bologna 16-17 aprile 2012
      http://avanscopertacqrstraining15042012.eventbrite.com/




          Advanced CQRS Workshop
          Bologna 18-20 aprile 2012
      http://avanscopertacqrsworkshop18042012.eventbrite.com/




avanscopert
                                                          © Alberto Brandolini 2009
Grazie




@ziobrando
alberto.brandolini@avanscoperta.it

Más contenido relacionado

Más de Alberto Brandolini

L'illusione dell'ortogonalità
L'illusione dell'ortogonalitàL'illusione dell'ortogonalità
L'illusione dell'ortogonalitàAlberto Brandolini
 
Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021Alberto Brandolini
 
Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)Alberto Brandolini
 
Software design as a cooperative game with EventStorming
Software design as a cooperative game with EventStormingSoftware design as a cooperative game with EventStorming
Software design as a cooperative game with EventStormingAlberto Brandolini
 
Reshaping enterrprise software
Reshaping enterrprise softwareReshaping enterrprise software
Reshaping enterrprise softwareAlberto Brandolini
 
Guerrilla portfolio management
Guerrilla portfolio managementGuerrilla portfolio management
Guerrilla portfolio managementAlberto Brandolini
 
Idea stickies green bar - Wroclaw edition
Idea stickies green bar - Wroclaw editionIdea stickies green bar - Wroclaw edition
Idea stickies green bar - Wroclaw editionAlberto Brandolini
 
Why do all my ddd apps look the same - Vienna 2014
Why do all my ddd apps look the same - Vienna 2014Why do all my ddd apps look the same - Vienna 2014
Why do all my ddd apps look the same - Vienna 2014Alberto Brandolini
 

Más de Alberto Brandolini (20)

L'illusione dell'ortogonalità
L'illusione dell'ortogonalitàL'illusione dell'ortogonalità
L'illusione dell'ortogonalità
 
Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021
 
What lies beneath
What lies beneathWhat lies beneath
What lies beneath
 
Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)
 
Extreme DDD modelling
Extreme DDD modellingExtreme DDD modelling
Extreme DDD modelling
 
The gordian knot
The gordian knotThe gordian knot
The gordian knot
 
Software design as a cooperative game with EventStorming
Software design as a cooperative game with EventStormingSoftware design as a cooperative game with EventStorming
Software design as a cooperative game with EventStorming
 
La fatina dei denti
La fatina dei dentiLa fatina dei denti
La fatina dei denti
 
50.000 orange stickies later
50.000 orange stickies later50.000 orange stickies later
50.000 orange stickies later
 
The alignment
The alignmentThe alignment
The alignment
 
Chasing elephants
Chasing elephantsChasing elephants
Chasing elephants
 
Transactions redefined
Transactions redefinedTransactions redefined
Transactions redefined
 
Optimized for what
Optimized for whatOptimized for what
Optimized for what
 
Reshaping enterrprise software
Reshaping enterrprise softwareReshaping enterrprise software
Reshaping enterrprise software
 
Guerrilla portfolio management
Guerrilla portfolio managementGuerrilla portfolio management
Guerrilla portfolio management
 
The precision blade
The precision bladeThe precision blade
The precision blade
 
Idea stickies green bar - Wroclaw edition
Idea stickies green bar - Wroclaw editionIdea stickies green bar - Wroclaw edition
Idea stickies green bar - Wroclaw edition
 
Why do all my ddd apps look the same - Vienna 2014
Why do all my ddd apps look the same - Vienna 2014Why do all my ddd apps look the same - Vienna 2014
Why do all my ddd apps look the same - Vienna 2014
 
Managing debt remastered
Managing debt remasteredManaging debt remastered
Managing debt remastered
 
The sweet spot
The sweet spotThe sweet spot
The sweet spot
 

Ddd brutto sporco e cattivo

Notas del editor

  1. \n
  2. A fare DDD partendo dal foglio bianco, sono capaci tutti...\n(non &amp;#xE8; proprio cos&amp;#xEC;, in effetti).\nMa in questo caso la cosa che ci interessa di pi&amp;#xF9;\n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. Abbiamo bisogno di un problema complesso. Altrimenti facciamo solo fatica.\nEd il punto di partenza &amp;#xE8; il comportamento, non i dati. Altrimenti &amp;#xE8; molto pi&amp;#xF9; efficace costruire un CRUD con Rails, Grails e compagni.\n
  9. Altro punto chiave. La sicurezza.\n\n
  10. ... non possiamo essere creativi ed artificieri allo stesso tempo. Lavorare su applicazioni legacy a cuore aperto, con sistemi che ci si appoggiano sopra e conseguenze inimmaginabili nel caso qualcuno decida fare una modifica minuscola ...non ha molto a che fare con il nostro lavoro.\n
  11. \n
  12. Siamo sviluppatori, non artificieri.\nNon significa &amp;#x201C;noi vogliamo fare solo la parte divertente del lavoro&amp;#x201D; ma che i lavori sono due, e ben diversi l&amp;#x2019;uno dall&amp;#x2019;altro.\nE soprattutto che &amp;#x201C;controllare che cambiando questa cosa non si sia rotto niente&amp;#x201D; non &amp;#xE8; un lavoro da sviluppatore. &amp;#xC8; un lavoro da test automatizzato.\n
  13. Cerchiamo di essere pi&amp;#xF9; espliciti? Davvero pensate di poter fare uno sviluppo ad elevato tasso evolutivo senza avere i fondamentali a posto? Il processo deve essere robusto, altrimenti ci si pu&amp;#xF2; fare molto male. Vogliamo andare in produzione spesso: non &amp;#xE8; un vezzo, &amp;#xE8; necessario!\n
  14. Ok, parliamo dei nostri strumenti di lavoro.\n
  15. Abbiamo un compito difficile e delle responsabilit&amp;#xE0;. Spesso dal fare le cose fatte bene dipende il core business della nostra azienda. Vogliamo fare un lavoro fatto bene e la scelta degli strumenti adatti (e la cura con cui li trattiamo) &amp;#xE8; un elemento fondamentale per definire un professionista. Siamo professionisti?\n
  16. ...allora abbiamo diritto agli strumenti migliori disponibili :-)\n
  17. A parte gli scherzi, ci sono determinati fondamentali sui quali non si pu&amp;#xF2; transigere, anche nelle peggiori condizioni. Anche in un ospedale da campo ci sono determinate regole.\n
  18. E quei (magari pochi) strumenti disponibili, sono tenuti in ordine.\n
  19. E tra colleghi NON ci si pu&amp;#xF2; permettere un dialogo di questo genere. \n\n...ora ripensate all&amp;#x2019;ultima volta in cui vi siete chiesti il significato di una variabile o di una colonna sul database, o che ve lo siete fatto spiegare dal vostro collega anziano, e probabilmente il significato e lo scopo di quella bizzarra idea dello Ubiquitous Language diventa un po&amp;#x2019; pi&amp;#xF9; chiara.\n
  20. Il linguaggio &amp;#xE8; il nostro strumento principale, dobbiamo averne cura.\n
  21. E perch&amp;#xE9; il linguaggio sia affilato ed efficace dobbiamo avere una cura maniacale per la precisione.\n
  22. Perch&amp;#xE9; in assenza di precisione, &amp;#xE8; facile confondersi e fare errori &amp;#x201C;con conseguenze di lungo termine&amp;#x201D;. \n\n...siete sicuri che il vostro database non sia strutturato in questo modo? Che ogni informazione sia in grado di descriversi da sola senza l&amp;#x2019;apporto di un esperto in grado di dire perch&amp;#xE9; &amp;#xE8; cos&amp;#xEC;? \n
  23. \n
  24. Siete sicuri che un artifact come un modello ER sia in grado di spiegare senza ambiguit&amp;#xE0; alcuna il modello del vostro sistema?\n
  25. Io personalmente non credo.\nQuando abbiamo a che fare con un sistema legacy &amp;#x201C;tipico&amp;#x201D; spesso abbiamo a che fare con un modello che esclude il comportamento (il modello sono SOLO i dati ...e vedremo che c&amp;#x2019;&amp;#xE8; pi&amp;#xF9; di un problema). Il linguaggio utilizzato non &amp;#xE8; sufficientemente preciso, anzi &amp;#xE8; un perfetto terreno di cultura per l&amp;#x2019;ambiguit&amp;#xE0;.\n
  26. Ripensando alle strategie classiche di integrazione (domanda: quali altre strategie di integrazione avete valutato, e scartato? ...e perch&amp;#xE9;?) basate sui dati &amp;#xE8; abbastanza evidente che non sia una strategia particolarmente sofisticata (sarcasmo) che pu&amp;#xF2; essere conveniente solo in situazioni in cui non ci interessa pi&amp;#xF9; di tanto gestire un&amp;#x2019;evoluzione.\n\nStiamo condividendo un dato? Chi ne &amp;#xE8; il resposnsabilie? Quali vincoli progettuali hanno fatto s&amp;#xEC; che quel dato fosse\n
  27. A livello comportamentale spesso, poco. \nIn ogni caso il detto &amp;#x201C;del maiale non si butta via niente&amp;#x201D; ci fa capire che in un eventuale confronto il maiale vince a mani (zampe) basse, perch&amp;#xE9; delle applicazioni cos&amp;#xEC; fatte purtroppo dovremo buttare via un sacco di roba.\n
  28. \n
  29. Nel momento in cui ci troviamo per l&amp;#x2019;ennesima volta a dover affrontare un problema apparentemente complesso, realizzando che la gran parte della complessit&amp;#xE0; in realt&amp;#xE0; &amp;#xE8; estranea al nostro dominio appare chiaro che se ripercorriamo la stessa strada rischiamo di rifare gli errori gi&amp;#xE0; commessi. E di ritrovarci esattamente nella stessa situazione.\n
  30. La strada pi&amp;#xF9; interessante sembra essere quello della famosa barzelletta del matematico che si &amp;#x201C;ricollega al caso precedente&amp;#x201D;. Rimuoviamo dall&amp;#x2019;analisi del problema tutto quello che non &amp;#xE8; pertinente e cerchiamo la soluzione efficiente per il nostro problema. \n
  31. Realmente, dobbiamo partire sempre &amp;#x201C;incartati&amp;#x201D;?\n
  32. Dobbiamo risolvere UN problema, nel migliore dei modi possibili\n
  33. Il nostro problema &amp;#xE8; quello importante. E su quello NON dobbiamo scendere a compromessi.\n
  34. ...soprattutto perch&amp;#xE9; &amp;#xE8; GIA&amp;#x2019; un problema complesso per conto suo. Trovare una soluzione elegante ad un problema completamente sporcato dalle &amp;#x201C;soluzioni&amp;#x201D; precedenti non &amp;#xE8; nemmeno detto che sia un problema risolvibile (anche se potrebbe fare contenti tanti cosiddetti &amp;#x201C;architetti&amp;#x201D;).\n
  35. Per cui deve essere estremamente chiaro che il nostro problema viene affrontato e risolto in un contesto ben definito e che non vogliamo avere niente a che fare con i problemi degli altri contesti.\nNoi abbiamo i nostri metodi.\n
  36. E non siamo disposti a scendere a compromessi. Callaghan ha una 44 magnum. La sua. Punto.\n
  37. La cosa pi&amp;#xF9; interessante &amp;#xE8; che questo commento &amp;#xE8; stato presentato quasi con un senso di colpa... :-) quasi che isolare la radice del problema e mettere in evidenza che quel problema da solo non era poi cos&amp;#xEC; complesso e poteva essere risolto in un tempo ragionevole fosse un&amp;#x2019;atto di lesa maest&amp;#xE0;...\n\nMa il nostro lavoro non &amp;#xE8; creare complessit&amp;#xE0;.\n
  38. \n
  39. \n
  40. Ok, bello ...ma come facciamo questa cosa in pratica, in un contesto in cui NON &amp;#xE8; mai stata fatta?\n
  41. Beh la soluzione classica per proteggersi &amp;#xE8; il recinto\n
  42. Ed a guardarci bene ...visto che siamo a Roma ... ci sono forti tradizioni al riguardo.\n
  43. sappiamo come &amp;#xE8; andata a finire.\n
  44. sappiamo come &amp;#xE8; andata a finire.\n
  45. sappiamo come &amp;#xE8; andata a finire.\n
  46. E sappiamo anche che questa strategia ha funzionato. Questo &amp;#xE8; il Vallo Adriano. I Barbari stanno da una parte, mentre dall&amp;#x2019;altra siamo nell&amp;#x2019;Impero Romano, dove valgono le leggi dell&amp;#x2019;impero e la moneta dell&amp;#x2019;impero.\n
  47. Specialmente in un campo minato, come le nostre belle suite di applicazioni legacy in cui tocchi una cosa e salta tutto, &amp;#xE8; fondamentale sapere quando siamo in un terreno bonificato, in cui possiamo FINALMENTE sperimentare senza avere paura che esploda tutto, che l&amp;#x2019;azienda fallisca o che l&amp;#x2019;intero universo imploda su se stesso.\n
  48. Nella pratica, il pattern Domain-Driven Design che ci aiuta ad affrontare questo aspetto &amp;#xE8; l&amp;#x2019;Anti-Corruption Layer.\nAd esempio se la componente legacy aveva un problema di contatti duplicati - che a noi genera solo fastidio - l&amp;#x2019;idea &amp;#xE8; di sviluppare la componente nel nostro contesto come se questo problema non esista e quindi adoperarsi per risolverlo all&amp;#x2019;interno dell&amp;#x2019;ACL, il pi&amp;#xF9; delle volte in un service.\n
  49. Nella pratica, il pattern Domain-Driven Design che ci aiuta ad affrontare questo aspetto &amp;#xE8; l&amp;#x2019;Anti-Corruption Layer.\nAd esempio se la componente legacy aveva un problema di contatti duplicati - che a noi genera solo fastidio - l&amp;#x2019;idea &amp;#xE8; di sviluppare la componente nel nostro contesto come se questo problema non esista e quindi adoperarsi per risolverlo all&amp;#x2019;interno dell&amp;#x2019;ACL, il pi&amp;#xF9; delle volte in un service.\n
  50. Nella pratica, il pattern Domain-Driven Design che ci aiuta ad affrontare questo aspetto &amp;#xE8; l&amp;#x2019;Anti-Corruption Layer.\nAd esempio se la componente legacy aveva un problema di contatti duplicati - che a noi genera solo fastidio - l&amp;#x2019;idea &amp;#xE8; di sviluppare la componente nel nostro contesto come se questo problema non esista e quindi adoperarsi per risolverlo all&amp;#x2019;interno dell&amp;#x2019;ACL, il pi&amp;#xF9; delle volte in un service.\n
  51. Ottimo, abbiamo fatto pulizia. Abbiamo creato finalmente un ambiente sano in cui occuparci del nostro problema.\n
  52. Ed a questo punto il giovane adepto di Domain-Driven Design non vede l&amp;#x2019;ora finalmente di applicare tutti i pattern che ha visto nel libro di Eric Evans, con la segreta speranza di riuscire finalmente a capire che volesse dire...\n
  53. ma la cruda verit&amp;#xE0; &amp;#xE8; che applicare i pattern di Evans non &amp;#xE8; poi cos&amp;#xEC; importante.\n
  54. Nessuno vi dar&amp;#xE0; un patentino di conformit&amp;#xE0; ai principi DDD e sicuramente non &amp;#xE8; quello il mio lavoro.\n
  55. E s&amp;#xEC;, non c&amp;#x2019;&amp;#xE8; nessuna medaglia se siete stati bravi.\n
  56. E se avete tempo, date un&amp;#x2019;occchiata a questo video sui paradigmi dell&amp;#x2019;educazione e dell&amp;#x2019;apprendimento. E se non avete tempo, trovatelo, perch&amp;#xE9; ne vale la pena.\n\nDicevo, forse cercare la conformit&amp;#xE0; ad un set di regole non &amp;#xE8; proprio la strategia migliore per imparare la complessit&amp;#xE0; di un nuovo dominio. Forse la strategia migliore &amp;#xE8; provare a fare qualcosa di buono, ed a chiederci cosa ha funzionato e cosa no.\n
  57. Provo ad essere pi&amp;#xF9; esplicito: nel 2004 quando &amp;#xE8; uscito il libro, Eric ha fondamentalmente individuato un sottoinsieme di pattern che fossero a supporto di frequenti riscritture evolutive del codice. Non &amp;#xE8; che &amp;#x201C;ci deve essere un Factory&amp;#x201D;, &amp;#xE8; che siccome stiamo esplorando un dominio che non conosciamo, ci aspettiamo di riscrivere le classi fondamentali N volte. E per limitare i costi di evoluzione un Factory capita a fagiolo.\n\nAllo stesso modo, se NON evolviamo il codice, ma lo scriviamo e basta allora avremo la percezione che DDD &amp;#xE8; inefficiente, rispetto ad altri approcci. Ma ...non stiamo facendo DDD.\n
  58. L&amp;#x2019;obiettivo &amp;#xE8; l&amp;#x2019;evoluzione. I pattern sono (erano?) il miglior strumento conosciuto. Ma l&amp;#x2019;obiettivo resta scrivere software che &amp;#xE8; facile evolvere.\n
  59. A questo punto &amp;#xE8; pi&amp;#xF9; efficiente lavorare sugli strumenti di confronto e di condivisione delle idee. Guarda caso un aspetto su cui il nostro posto di lavoro potrebbe non essere proprio il migliore.\n
  60. Abbiamo strumenti per la discussione? Sono accessibili? La discussione &amp;#xE8; sana?\n
  61. Impersonare le classi, capire i loro legami, in pi&amp;#xF9; di un&amp;#x2019;occasione ha portato a sbloccare questioni di modellazione apparentemente intricate. Cosa aspettate a provarci?\n\n...unico problema: le index card fatte cos&amp;#xEC; sono quasi introvabili in Italia...\n
  62. E discutendo si arriva a quegli splendidi momenti in cui il backlog non &amp;#xE8; pi&amp;#xF9; la cesta della roba sporca. Ma le features scaturiscono dalle discussioni con i responsabili del progetto, che scoprono che ci sono possibilit&amp;#xE0; a cui non avevano pensato o che non avevano osato chiedere. \n
  63. Ed improvvisamente si riesce ad intravvedere la luce. C&amp;#x2019;&amp;#xE8; vita oltre il legacy!\n
  64. Questo aspetto &amp;#xE8; troppo ricorrente per non parlarne: nasce da una conversazione buttata l&amp;#xE0;. Uno sviluppatore (legittimamente) preoccupato dei danni che una certa struttura dati avrebbe potuto provocare ha cercato di erigere una barriera, ...probabilmente mal consigliato dal sottoscritto :-)\n
  65. Solo che la mia risposta &amp;#xE8; stata proprio l&amp;#x2019;opposto.\n
  66. Perch&amp;#xE9; se da un lato vogliamo evitare che i nostri dati vengano sporcati dalle applicazioni esterne, come abbiamo visto prima, dall&amp;#x2019;altro ci sono un bel po&amp;#x2019; di situazioni in cui bloccare l&amp;#x2019;accesso delle situazioni non completamente conformi pu&amp;#xF2; creare problemi ancora pi&amp;#xF9; grossi. Non voglio qui aprire la questiona clandestinit&amp;#xE0; ma ...ci siamo capiti ;-)\n
  67. Il punto &amp;#xE8; che praticamente tutti i casi in cui c&amp;#x2019;era da gestire una validazione complessa, il problema era un&amp;#x2019;altro.\n
  68. E che quasi sempre la soluzione era data dal fatto che nel sistema esistessero due oggetti con una struttura dati quasi identica, ma con un comportamento completamente differente. Uno poteva essere incompleto, l&amp;#x2019;altro doveva esserlo.\nState modellando queste due classi con lo stesso oggetto? In bocca al lupo!!!\n
  69. Perch&amp;#xE9; nella nostra applicazione non c&amp;#x2019;&amp;#xE8; un solo modello, ma ci sono pi&amp;#xF9; modelli ciascuno adatto a risolvere un particolare problema. Se avete chiaro quali sono i problemi che la vostra applicazione deve risolvere, diventa abbastanza chiaro anche che i modello sono diversi. ...e no, non &amp;#xE8; detto che si debba sempre per forza trovare una soluzione di compromesso.\n
  70. \n
  71. Anche questo aspetto sta diventando troppo frequente per essere una coincidenza. Molte delle applicazioni che ho contribuito a progettare/realizzare hanno evidenziato la necessit&amp;#xE0; di stili di programmazione differenti e di modelli tagliati a supportare differenti modalit&amp;#xE0; di lavoro.\nCostruzione collaborativa di un artifact condiviso, durante la costruzione l&amp;#x2019;artifact non &amp;#xE8; sempre in uno stato consistente. La conversazione che avviene intorno ad aspetti selezionati dell&amp;#x2019;artifact &amp;#xE8; forse l&amp;#x2019;aspetto pi&amp;#xF9; interessante.\nEsecuzione che avvenga dentro l&amp;#x2019;applicazione o attraverso l&amp;#x2019;interazione con il cliente, il paradigma &amp;#xE8; pi&amp;#xF9; simile a quello di una macchina a stati, con una maggiore attenzione all&amp;#x2019;integrit&amp;#xE0; delle componenti.\nTracking beh, qui si tratta essenzialmente di monitoraggio. Dal banale logging alla generazione di warning personalizzati.\n
  72. Qui si aprirebbe tutto un&amp;#x2019;altro capitolo... chi ha visto http://www.slideshare.net/ziobrando/drive-your-dba-crazy-in-3-easy-steps sa che ho un conto in sospeso con il DBA, che per una serie di motivi (ruolo, mentalit&amp;#xE0;, posizione nell&amp;#x2019;organizzazione, abitudini, status etc.) &amp;#xE8; uno dei maggiori ostacoli all&amp;#x2019;evoluzione del software in senso DDD.\n
  73. Nel nostro caso specifico la frase che pi&amp;#xF9; mi ha scioccato &amp;#xE8; stata questa.\n
  74. \n
  75. La prima idea &amp;#xE8; abbastanza reattiva. Ma probabilmente non molto saggia.\n
  76. Quello che abbiamo fatto invece &amp;#xE8; cercare di fare capire che la fata dai capelli turchini non esiste, e che &amp;#xE8; necessario un processo di rilascio iterativo (quindi non solo incrementale) per le applicazioni. Ovviamente questo sulla base di collaborazione, venendo incontro a tutte le eventuali esigenze (sensate) in termini di policy, naming convention, etc...\n
  77. Ma non dimenticando la domanda di fondo, che di fatto mette in luce il peccato originale della programmazione data-driven in ambiente enterprise. Le scelte fatte nel momento di massima ignoranza sono le pi&amp;#xF9; difficili da cambiare. \n
  78. Il DBA non &amp;#xE8; l&amp;#x2019;unico ostacolo sulla nostra strada.\n
  79. Se proviamo a chiedere ai nostri informatori come comportarci con i sistemi preesistenti, otteniamo risposte non necessariamente soddisfacenti.\n
  80. Si tratta di saggezza popolare tramandata oralmente a seguito di un rito di iniziazione, probabilmente.\n
  81. E ci sono dei tab&amp;#xF9;. Cose che non si possono fare anche se si &amp;#xE8; persa la nozione del perch&amp;#xE9;.\n
  82. Non esattamente soddisfacente.\n
  83. La cosa forse pi&amp;#xF9; angosciante &amp;#xE8; che spesso la descrizione di un sistema legacy si focalizza sulle cose a cui devi stare attento.\n
  84. Purtroppo la sensazione quando affrontiamo questo tipo di sviluppo mi porta molto a pensare a questo tipo di consigli.\n
  85. Ed alla sensazione di ansia e di oppressione che mi mettevano addosso.\n
  86. Il buon vecchio Uncle Bob mette in evidenza questo aspetto, parlando di Carico Cognitivo. Nel campo della User Experience se ne parla per rendere pi&amp;#xF9; semplice l&amp;#x2019;interfaccia utente della nostra applicazione.\nLa nostra interfaccia utente come sviluppatori &amp;#xE8; il codice, ed il nostro obiettivo la sua evoluzione. Cos&amp;#x2019;altro dovremmo sapere oltre quello che c&amp;#x2019;&amp;#xE8; nel codice?\n
  87. \n
  88. Tra i pochi aspetti tecnici di DDD che &amp;#xE8; imprescindibile tenere in considerazione c&amp;#x2019;&amp;#xE8; quello della gestione delle transazioni. In questo caso il problema &amp;#xE8; che a parte qualche caso virtuoso (es. le architetture basate su Spring) la stragrande maggioranza degli esempi sulla gestione delle transazioni ci manda nella direzione sbagliata.\n
  89. Non &amp;#xE8; compito del repository (ne ha gi&amp;#xE0; un altro) gestire il contesto transazionale. Spesso la soluzione pi&amp;#xF9; pulita &amp;#xE8; quella di implementare la UnitOfWork o esplicitare il contesto transazionale.\n
  90. Altro problema (o riproposizione di quello precedente) mentre stiamo sviluppando, arriver&amp;#xE0; sempre qualcuno che &amp;#x201C;deve integrarsi&amp;#x201D; con la nostra applicazione.\nNon fidatevi.\n
  91. \n
  92. \n
  93. &amp;#xE8; la volta che va tutto gi&amp;#xF9;. Non si era detto che i confini vanno presidiati?\n\n
  94. Quindi l&amp;#x2019;applicazione reale &amp;#xE8; un po&amp;#x2019; pi&amp;#xF9; restrittiva.\n
  95. Se si tratta di un&amp;#x2019;applicazione esterna ...in genere siamo pi&amp;#xF9; propensi ad essere sospettosi. Con le applicazioni interne il problema &amp;#xE8; simile, solo che tendiamo a fidarci.\n\nSbagliato.\n
  96. Ok ora Callaghan non &amp;#xE8; che si chiede il perch&amp;#xE9; pi&amp;#xF9; di tanto.\n
  97. Per&amp;#xF2; in effetti dobbiamo ammettere di avere avuto un infanzia difficile. Quanti di voi hanno portato un&amp;#x2019;applicazione in produzione ed hanno tratto vantaggio da una modellazione di questo genere? Perch&amp;#xE9; &amp;#xE8; per fare queste cose che serviva la programmazione ad oggetti ...o no?\n
  98. Alla fine OOP &amp;#xE8; la superclasse persona che serve a ...\n
  99. stampare!!! (perepeppep&amp;#xE8;!!!) \nNo veramente, non pu&amp;#xF2; essere cos&amp;#xEC;.\n
  100. Il punto &amp;#xE8; che gi&amp;#xE0; la OOP applicata male &amp;#xE8; un problema. Ci aggiungiamo il fatto che il data-model &amp;#xE8; al 99% dei casi sbagliati, mettete insieme le due cose e ...\n
  101. No, sul serio, non &amp;#xE8; un problema dell&amp;#x2019;ORM. Il poverino.\n
  102. &amp;#xE8; pi&amp;#xF9; probabilmente la conseguenza dell&amp;#x2019;applicazione a tappeto di un solo problema, senza che nessuno che ci abbia spiegato i limiti di applicazione, tanto di OOP che del resto.\n
  103. ...o lessons learned.\n
  104. L&amp;#x2019;aspetto pi&amp;#xF9; evidente &amp;#xE8; forse la diversit&amp;#xE0; di approccio che possiamo avere una volta che abbiamo definito correttamente i confini del nostro Bounded Context.\n
  105. Difficile accettare di tornare indietro: perch&amp;#xE9; la percezione del valore che possiamo apportare alla realizzazione &amp;#xE8; tale che diventa difficile accettare di tornare a lavorare in situazioni ad alto rischio e basso valore aggiunto. \n
  106. Questo &amp;#xE8; un aspetto chiave, che in pi&amp;#xF9; di un&amp;#x2019;occasione &amp;#xE8; stato segnalato. Il punto &amp;#xE8; che gi&amp;#xE0; di per se &amp;#xE8; difficile stimare un progetto greenfield (perch&amp;#xE9; ad un certo punto si inizia ad andare molto pi&amp;#xF9; forte ma &amp;#xE8; difficile capire quando) ma le cose si complicano ulteriormente quando dobbiamo stimare DDD messo in mezzo o sopra al legacy. Perch&amp;#xE9; dobbiamo fare 2 lavori. \n
  107. Facciamo l&amp;#x2019;esempio del piastrellista. Se gli date la metratura della casa e qualche altro parametro, un preventivo accurato &amp;#xE8; in grado di farvelo.\n
  108. Se per&amp;#xF2; gli fate trovare le stanze in questo stato... i casi sono due. O se ne va e (forse) torna quando la stanza &amp;#xE8; a posto. Oppure si rimbocca le maniche e vi fa pagare il lavoro extra ... che NON &amp;#xE8; il lavoro da piastrellista.\n
  109. Se poi il lavoro &amp;#xE8; questo? Ok ...questa bomba ha un timer. Ma provate a chiedere &amp;#x201C;quanto tempo ci vuole per disinnescarla&amp;#x201D;?\n\nOppure: &amp;#x201C;quanto vuoi essere pagato per disinnescarla?&amp;#x201D; \n
  110. E soprattutto non dimentichiamo che &amp;#x201C;metterci in condizioni di sicurezza&amp;#x201D; ha un costo.\nE non dimentichiamo nemmeno che questo costo si sarebbe gi&amp;#xE0; dovuto pagare prima.\nNon &amp;#xE8; un costo imputabile al vigile se non vi mettete le cinture.\n
  111. Per cui di fatto abbiamo 2 componenti nelle stime che &amp;#xE8; bene tenere separate: una parte mediamente variabile legata ad un percorso di evoluzione esplorativa, che va stimata lasciando margine per fare errori ed esplorazioni, che per&amp;#xF2; servono per abilitare le evoluzioni da &amp;#x201C;performance boost&amp;#x201D;. Un&amp;#x2019;altra parte &amp;#xE8; invece legato al legacy, al campo minato ed al tempo necessario per mettere in sicurezza i punti di confine e questo dipende sostanzialmente dalla qualit&amp;#xE0; del codice pre-esistente.\n
  112. Per cui di fatto abbiamo 2 componenti nelle stime che &amp;#xE8; bene tenere separate: una parte mediamente variabile legata ad un percorso di evoluzione esplorativa, che va stimata lasciando margine per fare errori ed esplorazioni, che per&amp;#xF2; servono per abilitare le evoluzioni da &amp;#x201C;performance boost&amp;#x201D;. Un&amp;#x2019;altra parte &amp;#xE8; invece legato al legacy, al campo minato ed al tempo necessario per mettere in sicurezza i punti di confine e questo dipende sostanzialmente dalla qualit&amp;#xE0; del codice pre-esistente.\n
  113. Il lato positivo &amp;#xE8; dato dal fatto che se possiamo fare esplorazioni ...&amp;#xE8; probabile che si trovi qualcosa di molto interessante. E andando aggressivamente a cercare le aree che ci sono meno chiare, possiamo anticipare questo momento della verit&amp;#xE0;.\n&amp;#xC8; garantito? No. &amp;#xC8; molto probabile. Quello che &amp;#xE8; garantito &amp;#xE8; che questo cambio di passo non succeder&amp;#xE0; in un progetto sotto strettissima pianificazione. \n
  114. Abbiamo questo rischio? Che la tanto agognata possibilit&amp;#xE0; di fare le cose per bene ci porti ad un eccessivo amore per le riscritture, anche quelle che non portano valore? S&amp;#xEC;, &amp;#xE8; possibile. Ma si contrasta con la strategia di planning vista prima. Cambiamo le cose alla luce delle cose nuove che abbiamo imparato, non di un gusto estetico pi&amp;#xF9; sofisticato. \n
  115. La domanda finale...\n
  116. \n
  117. \n
  118. \n
  119. \n