Stai guardando i dati sbagliati

Book Author at Leanpub
Oct. 3, 2012
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
Stai guardando i dati sbagliati
1 of 161

More Related Content

Viewers also liked

C# e la Framework Class LibraryC# e la Framework Class Library
C# e la Framework Class LibraryManuel Scapolan
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object OrientedManuel Scapolan
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreManuel Scapolan
JavaScriptJavaScript
JavaScriptManuel Scapolan
TFS and Scrum - Lessons LearnedTFS and Scrum - Lessons Learned
TFS and Scrum - Lessons LearnedManuel Scapolan
Knockout.jsKnockout.js
Knockout.jsManuel Scapolan

Similar to Stai guardando i dati sbagliati

Webinar: "Conosci la Performance Intelligence?" a cura d A. SzambelanWebinar: "Conosci la Performance Intelligence?" a cura d A. Szambelan
Webinar: "Conosci la Performance Intelligence?" a cura d A. SzambelanMiriade Spa
Blomming Lean Startup @ Better Software 2011Blomming Lean Startup @ Better Software 2011
Blomming Lean Startup @ Better Software 2011Nicola Junior Vitto
Un plug-in Eclipse per il supporto all'Extract Class RefactoringUn plug-in Eclipse per il supporto all'Extract Class Refactoring
Un plug-in Eclipse per il supporto all'Extract Class RefactoringFabio Palomba
Software ...e tutto ciò che comportaSoftware ...e tutto ciò che comporta
Software ...e tutto ciò che comportaAlberto Brandolini
Software Testing Forum 2012 - Polarion e TRS SpASoftware Testing Forum 2012 - Polarion e TRS SpA
Software Testing Forum 2012 - Polarion e TRS SpAEmerasoft, solutions to collaborate
Generazione Automatica Di Codice Orientato Agli Oggetti TramiteGenerazione Automatica Di Codice Orientato Agli Oggetti Tramite
Generazione Automatica Di Codice Orientato Agli Oggetti TramiteMarco Montanari

More from Alberto Brandolini

L'illusione dell'ortogonalitàL'illusione dell'ortogonalità
L'illusione dell'ortogonalitàAlberto Brandolini
Redesigning everything ITARC Stockholm 2021Redesigning everything ITARC Stockholm 2021
Redesigning everything ITARC Stockholm 2021Alberto Brandolini
What lies beneathWhat lies beneath
What lies beneathAlberto Brandolini
Redesigning everything (avanscoperta meeutp edition)Redesigning everything (avanscoperta meeutp edition)
Redesigning everything (avanscoperta meeutp edition)Alberto Brandolini
Extreme DDD modellingExtreme DDD modelling
Extreme DDD modellingAlberto Brandolini
The gordian knotThe gordian knot
The gordian knotAlberto Brandolini

Stai guardando i dati sbagliati

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. Qualche collega mi ha raccontato questa storia. Assumo non sia una barzelletta.\n\nA causa di un furto, il collega si reca in caserma per una denuncia. Il militare scrive la denuncia al computer, stampa, fa firmare e ...cancella il file! Il collega, basito, chiede: “ma perché lo ha cancellato?” ... “tanto non serviva più!”\n
  6. Ok, proviamo a raccontare il punto di partenza, anche se lo conosciamo benissimo.\n
  7. Parliamo di architettura. \nO meglio, di architettura software.\nO meglio, di quella che ci hanno fatto credere sia un’architettura software.\n\n
  8. Che è tutto sommato questa. Il Jenga.\nUn’architettura che con un sacco di pratica permette di ottenere dei risultati incredibili, tipo due applicazioni che si parlano, senza che il server cada troppo spesso.\n
  9. Solo che ogni tanto... va giù. Aggiungendo una feature, un requisito, una componente esterna. Ad un certo punto collassa.\n
  10. E tutti gridano insieme “JENGA!” ed in tutta l’azienda si celebra una grande festa, e tutti sono felici.\n\n\n... o no?\n
  11. Perché succede tutto questo?\n
  12. Qual è realmente l’architettura più comune. Quella più diffusa nei dipartimenti IT italiani?\n
  13. È quella che Martin Fowler in “Patterns of Enterprise Application Architecture” chiama Data-Based integration.\n\nMa il fatto che sia sul libro di Fowler, non dovrebbe significare granché. I libri di pattern servono a catalogare la realtà in maniera agnostica. Senza troppi giudizi o orientamenti ideologici.\n\nIo non sono Fowler e sono molto orientato ideologicamente, e quindi posso utilizzare una notazione un po’ più espressiva.\n
  14. Questa rende decisamente meglio l’idea. \nMa i maiali mangiano di tutto, quindi per un po’ questa situazione ci è sembrata un’ottima idea.\n
  15. Ma solo per un po’.\n
  16. Perché le applicazioni hanno cominciato ad essere “un po’ troppo accoppiate” e tirare secchiate d’acqua sul server non ha aiutato a risolvere il problema.\n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. Finché qualcuno, finalmente ha avuto un’idea.\n
  24. Sì, applichiamo SOA, la soluzione migliore contro il troppo accoppiamento. Cominciamo con il disaccoppiare la presentation dal database, così “possono cambiare”\n\n... solo che però non cambiano.\n
  25. E ... non si doveva disaccoppiare anche la persistenza? Ed andare verso i Business Autonomous Components?\n
  26. ... una cosa alla volta. Intanto abbiamo messo uno strato a servizi. E questo basti. non si può fermare il progresso.\n
  27. Quindi, questa è la SOA più diffusa.\n
  28. Che sul nostro schema architetturale è un po’ come insegnare ai maiali a mangiare con le posate. È sempre la stessa sbobba nella stessa vasca, ma almeno i maiali sembrano più educati\n
  29. Però c’è un’altro problema... perché nonostante si parli di SOA nella nostra testa continua ad esserci un’altra cosa. Proviamo a fare un’esempio di una gestione magazzino. Molto semplice.\n
  30. Il fornitore consegna l’articolo 1234. Aggiorno il record corrispondente.\n
  31. Spedisco 50 articoli al cliente, aggiorno la giacenza dell’articolo corrispondente.\n
  32. Nel caso il magazziniere abbia fatto danni con il muletto, la situazione non cambia molto.\nAggiorniamo la giacenza, rimuovendo dal conteggio i preziosissimi pezzi rotti.\n
  33. Qualche pezzo non si trova (se lo sono rubato?) come trattiamo la situazione? Alla stessa maniera!\n
  34. Poi qualcuno inspiegabilmente riappare, magari è stato semplicemente appoggiato nel posto sbagliato. Cose che capitano.\n
  35. Sul reso le cose si fanno più difficili. Dobbiamo prima verificare in quali condizioni, ma non è che questa funzionalità sia stata proprio implementata...\n
  36. Poi a fine anno si fa un bell’inventario e si aggiornano i conti con la disponibilità effettiva.\n
  37. Peccato che non vi sia traccia sul database di queste operazioni.\n
  38. Per cui ad un certo punto arriva una bella richiesta di poter tracciare con esattezza che cosa succede. Chi modifica i dati e perché.\n
  39. Per cui ad un certo punto arriva una bella richiesta di poter tracciare con esattezza che cosa succede. Chi modifica i dati e perché.\n
  40. Per cui ad un certo punto arriva una bella richiesta di poter tracciare con esattezza che cosa succede. Chi modifica i dati e perché.\n
  41. Ideona!\n\n(ci risiamo)\n
  42. Un bel meccanismo di logging, che intercetta tutto l’intercettabile.\n
  43. E quindi ci agganciamo dove possiamo e scriviamo, su DB, su file system o ...dove capita, un bel flusso continuo di informazioni che si va ad affiancare al supporto persistente.\n\nLo facciamo un po’ come capita. Non è che ci siano tutte queste linee guida stringenti sul logging.\n\nA parte quella - non scritta - di scrivere un wrapper per Log4J.\n
  44. Quindi se questo era il nostro schema di partenza,\n
  45. ...mettiamo una bella telecamera a circuito chiuso per controllare che i maiali non facciano nulla di male.\n
  46. E creiamo un bel centro di controllo che 24 ore su 24 stia ad osservare cosa fanno i maiali registrando ogni loro mossa.\n
  47. ma anche così, ogni tanto qualcosa passa.\n
  48. C’è qualcosa di sinistro nelle aziende che dicono “i dati sono il cuore del nostro sistema”. È come una ragazza che conosci all’aperitivo e ti dice: “sai, io non potrei vivere senza ossigeno...” non è il modo più intelligente per impostare una conversazione!\n
  49. Ma la cosa singolare è che la maggior parte delle aziende che considerano i dati il proprio asset principale sono anche quelle che li trattano peggio.\n
  50. Anzi sono proprio loro ad avere più problemi.\n
  51. Peccato, ragazzi. \n
  52. Il punto è che non è che i dati siano il cuore, è che avete messo il database al centro dello sviluppo.\n
  53. ... e quello non era il posto che gli competeva.\n\nPerché se i dati sono il cuore, non avete trovato il posto corretto per il cervello dell’applicazione. Il suo comportamento.\n
  54. E questa cosa è veramente una bestemmia. Ed è stupefacente, perché non ho trovato nessun libro di architettura che raccomanda questo approccio. Fowler lo cita, ma principalmente perché esiste. Non perché sia buono.\n\nLa mia domanda diventa... ma perché?\n
  55. E purtroppo la risposta è semplice. Si tratta del percorso più sensato assumendo di partire senza conoscere l’architettura.\n\nPer il nostro piccolo primo progetto, si tratta di un approccio che pare andare bene.\n
  56. È la prima cosa che possiamo fare. Non dimentichiamo che all’università ci hanno insegnato solo a fare cose piccole e semplici.\n\nCome si fanno le cose grosse? Come \n
  57. Solo che man mano che i requisiti arrivano, è difficile fare crescere le nostre applicazioni. Non sappiamo come fare grandi applicazioni...\n
  58. ...quindi le facciamo nell’unico modo che conosciamo. Come le applicazioni piccole, ma con più roba dentro.\n\nTemo che la barzelletta del “come faranno 4 elefanti a stare in una 500?” possa avere influito sulle nostre scelte.\n
  59. Imitiamo il comportamento di chi è arrivato prima di noi. È così che si impara, no?\n\n(se siete interessati al tema, ne parlo nell’altra mia presentazione: http://www.slideshare.net/ziobrando/fare-pip-controvento)\n
  60. Ci si documenta sui testi di riferimento, spesso gentilmente suggeriti dal vendor.\n
  61. Ed eccoci alla nostra cara vecchia situazione di partenza.\n
  62. Bentrovati!\n
  63. \n
  64. Ok, vi ho malmenato abbastanza. Ora provo ad essere propositivo. Cominciamo da un ingrediente che abbiamo tenuto nel congelatore per un po’ ma che è sempre buono.\n
  65. Le cose che cambiano assieme stanno assieme.\n
  66. Gli aggregati definiscono gli invarianti di comportamento (considerazione business) e sulla base di questi i confini transazionali. Perché questi siano consistenti è possibile-necessario un certo livello di duplicazione.\n
  67. È interessante notare che in tutte le possibili architetture di supporto a Domain-Driven Design (DDD classico, CQRS + ES, DDD con linguaggi funzionali, etc.) il concetto di Aggregato rimane sostanzialmente identico.\n
  68. Non è colpa dell’ORM. È che lo stiamo usando male. Per mettere assieme un modello ad oggetti incoerente con un modello dei dati sbagliato.\n
  69. È come fare la sfoglia. Se la fate piccola, non ci sono problemi.\nSe la fate grande... fa le pieghe.\n
  70. ... ma anche su questo tema sono emerse variazioni sul tema. Dal modello originale che ruotava ancora abbastanza attorno ai dati (o non diceva di non farlo) siamo arrivati a qualche implementazione che separa in maniera abbastanza drastica le informazioni necessarie alla nostra applicazione per prendere delle decisioni da quelle inutili all’applicazione ma necessarie per gli operatori, per capire cosa sta succedendo. Il software non si comporta diversamente sulla base del cognome - almeno spero - ma l’utente deve poter vedere il cognome quando sta operando.\n
  71. L’altra “piccola” novità nella gestione degli aggregati è stata l’affermarsi di un paradigma di comunicazione asincrona, basato sui domain events e su meccanismi di notifica.\n
  72. Ingrediente N°2. Questo dovrebbe essere nuovo...\n
  73. ...ma in realtà non lo è.\n\nPeggio, prende ispirazione dai sistemi basati su carta. Solo che la singola sorgente di verità è ora rappresentata dagli eventi. Il flusso degli eventi mima quello dell’equivalente sistema cartaceo, senza aggiunta di complessità accidentale.\n
  74. Non è una vera novità. Il vostro conto corrente è implementato esattamente nello stesso modo. Non è una sorpresa, perché il Conto Corrente è esattamente una di quelle cose che è un po’ pericoloso implementare come uno squallido CRUD.\n
  75. Possiamo ricavare lo stato dalla sequenza degli eventi.\n\nI più smaliziati noteranno anche uno stile di programmazione che inizia ad avvicinarsi al funzionale...\n
  76. Ma questa è forse la cosa più interessante: il sistema non ha alcuna perdita di contenuto informativo. Non ci sono cancellazioni o modifiche del dato.\n
  77. Ingrediente N°3 Command Query Responsibility Segregation.\n
  78. Architettura senza compromessi.\n\n\n
  79. Sul versante dei comandi, stiamo sostanzialmente dando ordini a singole entità del nostro sistema. Il sistema deve modellare il comportamento, e permettere un’evoluzione controllata sulla base delle mutevoli esigenze del business.\n
  80. Sul versante delle query, invece... siamo interessati a grosse moli di dati, a dati aggregati magari sotto forma di grafici o report. Ma non c’è alcuna idea di comportamento.\n\n...abbiamo bisogno di un domain model?\n
  81. la nostra architettura senza compromessi...\n
  82. è sostanzialmente questa.\n\nSul lato command, abbiamo il domain model con i nostri aggregati che ricevono comandi e producono eventi.\n\nAlcune componenti (projection) sono in ascolto sulla coda degli eventi e generano i modelli di lettura necessari all’applicazione. Praticamente posso fare a meno delle query, contando su tabelle popolate in modalità push man mano che i dati si aggiornano.\n
  83. Il modello è sostanzialmente push, mi aiuto con un esempio.\n
  84. Su un modello in cui recupero le informazioni quando è necessario, scateno le query (con il rischio di appesantire il sistema) al momento della richiesta utente. \n\nSe qualche componente non risponde, ovviamente sono guai.\n
  85. \n
  86. Se fossi stato bravo - ed ogni anno ci provo - invece avrei raccolto le fatture e tutta la documentazione necessaria, man mano che arrivava in una bella carpetta ordinata.\n\nE quando finalmente il commercialista si fa sentire, ecco che io gli passo all’istante tutta la documentazione.\n
  87. È esattamente di questa cosa che stiamo parlando. Solo, ad un livello di granularità maggiore.\n
  88. Ma c’è un modo più espressivo per dirlo.\n
  89. (io non ne voglio sapere nulla)\n
  90. Il computer è perfetto per queste cose.\n\nNotificare a voce non scala. Elettronicamente sì.\n
  91. L’ultimo ingrediente, dalla seconda parte del libro di Evans che non tutti hanno letto.\n
  92. Nella nostra applicazione enterprise ci saranno più modelli.\nCi saranno sempre.\nAnche se la implementiamo in Access (nitrito di cavallo).\nPerché i modelli hanno obiettivi diversi, sono espressi da stakeholders diversi, in linguaggi diversi.\n\nDobbiamo IMPLEMENTARLI non UNIFICARLI.\n
  93. Abbiamo tutti i gradi di libertà che ci servono, ma per qualche strano motivo non vediamo l’ora di rinunciarci.\n
  94. Gli eventi avvengono in determinati contesti e contribuiscono a definire il linguaggio caratteristico del modello.\n\nEventi prodotti in un contesto possono essere consumati in un altro contesto, eventualmente tradotti e ritrasmessi.\n
  95. Ma i contesti sono indipendenti\n
  96. (voglio essere padrone a casa mia)\n
  97. Ops, questa non ve l’aspettavate. Sto forse violando il DRY?\n
  98. No, perché la semantica è diversa. I dati sono gli stessi ma cambiano per motivi diversi.\nE quello che è editabile in un certo punto del suo ciclo di vita, è di sola lettura altrove.\n\nEd il fatto che abbiano lo stesso nome , in contesti diversi non significa che abbiano lo stesso significato o lo stesso contenuto informativo.\n
  99. No, perché la semantica è diversa. I dati sono gli stessi ma cambiano per motivi diversi.\nE quello che è editabile in un certo punto del suo ciclo di vita, è di sola lettura altrove.\n\nEd il fatto che abbiano lo stesso nome , in contesti diversi non significa che abbiano lo stesso significato o lo stesso contenuto informativo.\n
  100. No, perché la semantica è diversa. I dati sono gli stessi ma cambiano per motivi diversi.\nE quello che è editabile in un certo punto del suo ciclo di vita, è di sola lettura altrove.\n\nEd il fatto che abbiano lo stesso nome , in contesti diversi non significa che abbiano lo stesso significato o lo stesso contenuto informativo.\n
  101. No, perché la semantica è diversa. I dati sono gli stessi ma cambiano per motivi diversi.\nE quello che è editabile in un certo punto del suo ciclo di vita, è di sola lettura altrove.\n\nEd il fatto che abbiano lo stesso nome , in contesti diversi non significa che abbiano lo stesso significato o lo stesso contenuto informativo.\n
  102. No, perché la semantica è diversa. I dati sono gli stessi ma cambiano per motivi diversi.\nE quello che è editabile in un certo punto del suo ciclo di vita, è di sola lettura altrove.\n\nEd il fatto che abbiano lo stesso nome , in contesti diversi non significa che abbiano lo stesso significato o lo stesso contenuto informativo.\n
  103. Ancora una volta, no compromessi. Un problema alla volta.\nEd una soluzione ottimale per QUEL problema.\n\n\n
  104. Sono veramente requisiti in conflitto o siamo noi sviluppatori che stiamo cercando di fare mettere d’accordo persone che dicono cose diverse entrambe perfettamente lecite in contesti separati e distinti.\n\n... e se avessero ragione entrambi?\n
  105. Vogliamo parlare di prestazioni di questa roba?\n
  106. Dunque, tra una mossa e l’altra, abbiamo rimosso i conflitti di lock tra letture e scritture, introdotto un meccanismo di persistenza append-only (che quindi può essere ottimizzato senza compromessi), aperto la porta a persistenza basata su NoSQL (laddove lo si ritenga necessario), introdotto un meccanismo di push sul read model che di fatto ci elimina la necessità per le cache, introdotto la possibilità di tabelle personalizzate per le viste con caricamento ancora più rapido, aperto la strada a componenti specializzati (Event Stores) per la pubblicazione ed il salvataggio degli eventi, oltre alla possibilità di scalare orizzontalmente il read model aumentando l’hardware.\n\n... senza menzionare il set di pentole in omaggio e la splendida trapunta in lana merinos!\n
  107. Va come Forrest Gump quando si libera degli intralci.\n
  108. \n
  109. Non cadete nella trappola di credere che questa cosa serva esclusivamente per questioni di prestazioni.\n\nTutt’altro.\n
  110. Le prestazioni sono in omaggio. Il vero valore è altrove.\n
  111. E sta nel fatto che stiamo programmando verso un’ecosistema.\n
  112. Facciamo un esempio... parliamo di Sicurezza.\n
  113. A chi non è mai capitato di dover gestire questi problemi?\n
  114. A chi non è mai capitato di dover gestire questi problemi?\n
  115. A chi non è mai capitato di dover gestire questi problemi?\n
  116. A chi non è mai capitato di dover gestire questi problemi?\n
  117. Io li adoro. Passerei giorni in riunioni di questo genere.\n
  118. E l’ideona classica è...\n
  119. Stabiliamo un meccanismo di controllo degli accessi. Qualcosa di figo con Aspect Oriented Programming, o un bel layer trasversale, che tutto impatti.\n
  120. Stabiliamo le credenziali di ogni utente in maniera bella complessa.\n
  121. salvo poi renderci conto di una cosa...\n
  122. Che a livello di bounded context il problema forse era già stato risolto.\n
  123. E che le cose di cui le persone parlano sono le cose che devono vedere, e che noi siamo stati così fessi da metterle tutte assieme e poi da costruire un’infrastruttura per separarle.\n
  124. E se diamo un’occhiata a questi bei fatti di cronaca? A me preoccupa soprattutto il secondo, visto che ci sono un po’ di soldi in ballo.\n\nMa un sistema basato su Event Sourcing non può essere hackerato in questo modo. Non posso alterare i voti e non posso alterare le mucche.\n
  125. E se diamo un’occhiata a questi bei fatti di cronaca? A me preoccupa soprattutto il secondo, visto che ci sono un po’ di soldi in ballo.\n\nMa un sistema basato su Event Sourcing non può essere hackerato in questo modo. Non posso alterare i voti e non posso alterare le mucche.\n
  126. \n
  127. \n
  128. Non ho ancora finito.\n
  129. La vista ad eventi ha ancora qualche sorpresa in serbo\n
  130. \n
  131. Perché e esattamente il modo in cui i nostri stakeholder esprimono i requisiti. Senza query ed integrazioni imbarazzanti. Cose che succedono e cose che devono succedere. Avere un sistema che mappa a questo livello semplifica le cose immensamente.\n
  132. ed aiuta anche non poco a capire il reale flusso di valore all’interno dell’applicazione.\nQuello che teoricamente tutti dovrebbero conoscere, ma che nella pratica non conosce bene nessuno, anche se nessuno è nelle condizioni di ammetterlo.\n
  133. Fate una prova. Modellate il flusso totale. E a modellazione finita raccogliete le cose per buttare via tutto. Osservate le reazioni.\n
  134. Ma questo è esattamente il momento in cui iniziamo attivamente a collaborare con gli esperti di dominio. Quel modello serve a loro e serve a noi.\n
  135. Non ho finito.\n\nGli eventi mappano perfettamente anche i flussi di lavoro interni ai contesti. Notare le kanban board.\n
  136. E la cosa ci può permettere di avere un controllo fine sui flussi aziendali, ad un livello di precisione mai sperimentato prima. O mai sperimentabile... costava troppo!\n
  137. Ma sappiamo anche che le kanban board sono formidabili strumenti di individuazione dei colli di bottiglia. Ci dispiace così tanto poter individuare in tempo reale quale sia il collo di bottiglia a livello di azienda?\n
  138. L’impatto è sull’intero ecosistema, non solo sulle prestazioni dell’applicazione.\nFacciamo le cose giuste e non perdiamo tempo a fare le cose sbagliate.\nImplementiamo features che portano valore ed aumentiamo la competitività dell’azienda.\n
  139. E su ciascuno di questi aspetti ci sono ricadute:\n- una corretta separazione dei bounded context riduce il numero di riunioni (parlo solo con le persone realmente interessate ad un problema, sono più disponibili perché il problema è il loro problema e questo mi riduce i tempi di attesa).\n- Se tutto è negli eventi, posso ripercorrere l’esatta sequenza che mi genera un bug. Posso correggerlo retroattivamente.\n- I conflitti sui requisiti si riducono perché una buona percentuale non sono conflitti.\n- Posso sfruttare l’infrastruttura per sperimentare implementazioni alternative o strategie di gestione alternative (“vediamo cosa sarebbe successo con due magazzini invece di uno, sulla sequenza degli eventi del 2008-2009-2010”).\n
  140. \n
  141. Ogni singola mossa è valida anche da sola ed apporta chiarezza alla realizzazione, ed introduce vantaggi sia a livello di progettazione che di esecuzione. Non è necessario che tutte le mosse siano implementate.\n
  142. Non necessariamente, ma la sinergia è comunque positiva. Sicuramente non è necessario che tutto il sistema sia in Event Sourcing. Il punto è isolare correttamente le porzioni del sistema e capire quali sono chiave per apportare valore al business. Lì ha senso intervenire.\n
  143. Ma ovviamente c’è tutto il mondo delle “fasi di transizione”.\n
  144. Uno dei più interessanti riguarda il “cosa fare se sono una piccola impresa e non ho modo di avere un sistema di grandi dimensioni”, c’è comunque modo di avere interessanti integrazioni leggere anche a livello di coordinamento di task sostanzialmente manuali.\n\nIl fatto di avere sotto controllo un sistema che possa evidenziare i colli di bottiglia ci aiuta anche a capire qual è la prossima feature che necessita di un’automazione.\n
  145. C’è fermento! Ma è anche vero che Domain-Driven Design è rimasto interessante forse proprio perché non sono arrivati i vendor a vendere “cassoni” costosissimi trasformando un’impostazione architetturale sensata (SOA dei primi tempi) in un mercato delle vacche.\n
  146. ma sicuramente del lavoro da fare ce n’è. Non dimentichiamo che ci sono anni ed anni di calcare da togliere dai server.\n
  147. Facendo le cose con sale in zucca.\n
  148. ...perché (e qui alzo il tiro) la ripresa delle aziende dipende in larga parte da quanto siamo in grado di renderle efficienti. Si parte anche da qui. Il prima possibile.\n
  149. \n
  150. \n
  151. \n
  152. \n