• Like
DDD Dirty Harry style
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

DDD Dirty Harry style

  • 1,213 views
Published

Sometimes you want to do Domain-Driven Design, but the bad guys are against you. Sometimes you need tobe the bad guy. This is Domain-Driven Design in a bloody brownfield scenario.

Sometimes you want to do Domain-Driven Design, but the bad guys are against you. Sometimes you need tobe the bad guy. This is Domain-Driven Design in a bloody brownfield scenario.

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,213
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
32
Comments
0
Likes
11

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. DirtyHarry’sStyle@ziobrandoDDDgiovedì 23 maggio 13
  • 2. Goal #1Domain-DrivenDesign NOTstarting fromscratchgiovedì 23 maggio 13
  • 3. Goal #2Arrive to DDD in anon prescriptivefashiongiovedì 23 maggio 13
  • 4. Do you really need me?giovedì 23 maggio 13
  • 5. CheckpointWhen to apply DDD?- Complex problem- High expectationsgiovedì 23 maggio 13
  • 6. Anti-patternI want to do DDDI don’t know DDD well......so I apply DDD to asimple problemI don’t see any advantage...DDD is useless.giovedì 23 maggio 13
  • 7. Wronggiovedì 23 maggio 13
  • 8. We don’t learn in flatlandsgiovedì 23 maggio 13
  • 9. giovedì 23 maggio 13
  • 10. giovedì 23 maggio 13
  • 11. That’s not our jobgiovedì 23 maggio 13
  • 12. Call a Bomb Squadgiovedì 23 maggio 13
  • 13. Our Safety Net✓Environments✓Build Scripts✓Test suite✓Private Database✓Fixtures✓ContinuousIntegration✓...giovedì 23 maggio 13
  • 14. Toolsgiovedì 23 maggio 13
  • 15. Professionalsgiovedì 23 maggio 13
  • 16. Proper Toolsgiovedì 23 maggio 13
  • 17. Even in the worst situationsgiovedì 23 maggio 13
  • 18. giovedì 23 maggio 13
  • 19. Could  you  please  pass  me  the  ...thing?The  s5ngy  one?Yes,  the  one  that  looks  like  ...  thatgiovedì 23 maggio 13
  • 20. Toolsgiovedì 23 maggio 13
  • 21. Precisiongiovedì 23 maggio 13
  • 22. ContraceptiveAspiringiovedì 23 maggio 13
  • 23. Languagegiovedì 23 maggio 13
  • 24. Sietegiovedì 23 maggio 13
  • 25. avanscopertaChecklistTools? --> Tool. (always the same)Precision? --> “When you are in state 12,the field MRKT_NFLD can be only B orK”Language? --> :-(giovedì 23 maggio 13
  • 26. giovedì 23 maggio 13
  • 27. Applicationgiovedì 23 maggio 13
  • 28. ApplicationApplicationgiovedì 23 maggio 13
  • 29. ApplicationApplicationApplicationgiovedì 23 maggio 13
  • 30. ApplicationApplicationApplicationApplicationgiovedì 23 maggio 13
  • 31. ApplicationApplicationApplicationApplicationApplicationgiovedì 23 maggio 13
  • 32. ApplicationApplicationApplicationApplicationApplicationDatabasegiovedì 23 maggio 13
  • 33. ApplicationApplicationApplicationApplicationApplicationDatabaseApplicationgiovedì 23 maggio 13
  • 34. ApplicationApplicationApplicationApplicationApplicationDatabaseApplicationApplicationgiovedì 23 maggio 13
  • 35. ApplicationApplicationApplicationApplicationApplicationDatabaseApplicationApplicationDatabasegiovedì 23 maggio 13
  • 36. ApplicationApplicationApplicationApplicationApplicationDatabaseApplicationApplicationDatabasegiovedì 23 maggio 13
  • 37. ApplicationApplicationApplicationApplicationApplicationDatabaseApplicationApplicationDatabaseData-based integrationgiovedì 23 maggio 13
  • 38. avanscopertaData-­‐based  integra5on  checklistCan we tell...Which application is responsible for the datastructure?Which requirement influenced data definition?Is it still valid?It it valid in my context?Which applications use that data?Which consequences if we alter the structure?giovedì 23 maggio 13
  • 39. Goal #1Arrive to DDD in abrownfieldscenariogiovedì 23 maggio 13
  • 40. Solution #1Put the messaside and startform a greenfieldscenariogiovedì 23 maggio 13
  • 41. Which problemdo we want tosolve?giovedì 23 maggio 13
  • 42. Onegiovedì 23 maggio 13
  • 43. Ourproblemgiovedì 23 maggio 13
  • 44. 85%15%Our PROBLEM domainpast SOLUTIONSComplexitygiovedì 23 maggio 13
  • 45. Our problemIl nostro contestoI nostri datiI dati dacondividereAltro contestoAltro contestoIl nostro databaseLanguage!!giovedì 23 maggio 13
  • 46. TRESPASSERSWILL BE SHOTSURVIVORS WILLBE SHOT AGAINTHIS DATABASE ISMY DATABASEgiovedì 23 maggio 13
  • 47. “Put  in  this  way,  it’s  simple...”Dev:giovedì 23 maggio 13
  • 48. giovedì 23 maggio 13
  • 49. DDD helps tosolve complexproblems,giovedì 23 maggio 13
  • 50. DDD helps tosolve complexproblems,NOT to makesimple problemscomplicatedgiovedì 23 maggio 13
  • 51. Zombiemanagementstrategiesgiovedì 23 maggio 13
  • 52. A fence...giovedì 23 maggio 13
  • 53. Learnt from the Romansgiovedì 23 maggio 13
  • 54. giovedì 23 maggio 13
  • 55. Romulus,  let  me  run  this  query,  please...giovedì 23 maggio 13
  • 56. Romulus,  let  me  run  this  query,  please...Nope.giovedì 23 maggio 13
  • 57. Romulus,  let  me  run  this  query,  please...Nope.Please,  Romulus  ...  it’s  a  read-­‐only  onegiovedì 23 maggio 13
  • 58. giovedì 23 maggio 13
  • 59. giovedì 23 maggio 13
  • 60. BoundedContextgiovedì 23 maggio 13
  • 61. Anti-Corruption LayergetContattiUnici(…):List<Contatto><<Service>>ContactServiceContactServicecontext boundaryAttributoAttributo<<Value Object>>ContattoAttributoAttributo<<Entity>>MyEntityOur Context ACLcontext boundaryComponenteOther Contextgiovedì 23 maggio 13
  • 62. Anti-Corruption LayergetContattiUnici(…):List<Contatto><<Service>>ContactServiceContactServicecontext boundaryAttributoAttributo<<Value Object>>ContattoAttributoAttributo<<Entity>>MyEntityOur Context ACLcontext boundaryComponenteOther ContextModel as itshould begiovedì 23 maggio 13
  • 63. Anti-Corruption LayergetContattiUnici(…):List<Contatto><<Service>>ContactServiceContactServicecontext boundaryAttributoAttributo<<Value Object>>ContattoAttributoAttributo<<Entity>>MyEntityOur Context ACLcontext boundaryComponenteOther ContextModel as itshould beThe legacycomponentwith all itstroublesgiovedì 23 maggio 13
  • 64. Anti-Corruption LayergetContattiUnici(…):List<Contatto><<Service>>ContactServiceContactServicecontext boundaryAttributoAttributo<<Value Object>>ContattoAttributoAttributo<<Entity>>MyEntityOur Context ACLcontext boundaryComponenteOther ContextModel as itshould beThe legacycomponentwith all itstroublesHere we solve themess, by anypossible means.giovedì 23 maggio 13
  • 65. ...and within ourBounded Context...giovedì 23 maggio 13
  • 66. The ideal modelgiovedì 23 maggio 13
  • 67. It’s not thatimportant...giovedì 23 maggio 13
  • 68. Compliancegiovedì 23 maggio 13
  • 69. There’s nomedalgiovedì 23 maggio 13
  • 70. But maybe...http://www.youtube.com/watch?v=zDZFcDGpL4Ugiovedì 23 maggio 13
  • 71. DDD as alearningprocessgiovedì 23 maggio 13
  • 72. DDD patternssupportfrequentrewritingsgiovedì 23 maggio 13
  • 73. DDD as anarchitecture thatsupportsevolutiongiovedì 23 maggio 13
  • 74. ...better provide usthe right supporttool for designgiovedì 23 maggio 13
  • 75. Whiteboardsgiovedì 23 maggio 13
  • 76. CRC Cardsgiovedì 23 maggio 13
  • 77. “Can  we  really  do  this?”P.O.:giovedì 23 maggio 13
  • 78. giovedì 23 maggio 13
  • 79. “We  need  to  put  a  valida9on  layer  to  avoid  incorrect  data  to  enter  into  the  system”Dev:giovedì 23 maggio 13
  • 80. Really?giovedì 23 maggio 13
  • 81. giovedì 23 maggio 13
  • 82. Complexvalidation is asmellgiovedì 23 maggio 13
  • 83. (almost) same dataDifferent BehavioursubmitregisterPaymentamountcustomerstate<<Entity>>Fatturaeditvalidateamountcustomer<<Entity>>InvoicePreviewgiovedì 23 maggio 13
  • 84. Multiple modelsgiovedì 23 maggio 13
  • 85. FrequentArchetypesgiovedì 23 maggio 13
  • 86. 3 archetypes?Collaborative constructionTopic+ConversationFacebook, Basecamp, GithubExecutionState machines, CommandsTrackingLogging, Auditing, Datawarehouse, Eventsgiovedì 23 maggio 13
  • 87. Haven’t put “why do all my DDDapplication looks the same” online, yetgiovedì 23 maggio 13
  • 88. What does theDBA say?giovedì 23 maggio 13
  • 89. “I  was  expec9nd  the  DB  structure  to  be  defined  once  for  all...”DBA:giovedì 23 maggio 13
  • 90. ...giovedì 23 maggio 13
  • 91. My first idea...giovedì 23 maggio 13
  • 92. giovedì 23 maggio 13
  • 93. She doesn’t exist inrealitygiovedì 23 maggio 13
  • 94. Can a softwarecomponent designedbefore one applicationbe adequate to Nfollowing applications?giovedì 23 maggio 13
  • 95. Obstaclesgiovedì 23 maggio 13
  • 96. giovedì 23 maggio 13
  • 97. You have towatch your backbefore interactingwith system Xgiovedì 23 maggio 13
  • 98. There are somef***ing storedprocedures that runevery 10 minutesgiovedì 23 maggio 13
  • 99. Nobody knowsexactly how dothey workgiovedì 23 maggio 13
  • 100. Nobody knowsexactly how dothey workNobody everchanged them andcame back alivegiovedì 23 maggio 13
  • 101. giovedì 23 maggio 13
  • 102. Hrmpfgiovedì 23 maggio 13
  • 103. Risk...giovedì 23 maggio 13
  • 104. Dress  up  properly  before  going  out!Are  you  wearing  your  T-­‐shirt?Lock  the  door  when  you  get  out!Drive  slowly!giovedì 23 maggio 13
  • 105. Anxietygiovedì 23 maggio 13
  • 106. Cognitive loadHow manythings shouldI know, beforetouching thecode?giovedì 23 maggio 13
  • 107. can we beignorant andproductive at thesame time?giovedì 23 maggio 13
  • 108. Transaction management?Presentation Layer Application Layer Domain Layer InfrastructureLayerDDD99%ofexamplesgiovedì 23 maggio 13
  • 109. Repository & SRPdelivery()pricecustomer<<Entity>>OrdercreateOrder(…)delivery(order_ID, …)<<Facade>>Application Facade+saveChanges()<<ORM>>Contextsave(Order, Context)findById(id, Context)<<Repository>>OrderRepositorycreateEmpty()<<factory>>OrderFactoryopens / closesusescreatesInfrastructure layerApplication LayerDomain LayerRiceve il contestotransazionaledallesternoIl Repository effettua leoperazioni di aggiunta e/orimozione dal contesto, ma èlapplication layer ad invocaresaveChanges()Crea ilcontesto e lopassa alrepositorygiovedì 23 maggio 13
  • 110. Do notacceptcandiesfromstrangersgiovedì 23 maggio 13
  • 111. ...why don’t weset up a shareddatabase table?...giovedì 23 maggio 13
  • 112. giovedì 23 maggio 13
  • 113. Ooops...giovedì 23 maggio 13
  • 114. Do notacceptcandiesfromstrangersgiovedì 23 maggio 13
  • 115. Do not acceptcandiesgiovedì 23 maggio 13
  • 116. Motivationsgiovedì 23 maggio 13
  • 117. Difficult childhoodnamesurnamephoneNumberPersonstudentCardNumberStudentsubjectstatusProfessorgiovedì 23 maggio 13
  • 118. Show meyou’re aperson...giovedì 23 maggio 13
  • 119. ...printyourself!giovedì 23 maggio 13
  • 120. Difficult ChildhoodnamesurnamephoneNumberPersonstudentCardNumberStudentsubjectstatusProfessorgiovedì 23 maggio 13
  • 121. The two things do not match...and it’s not an ORM problemgiovedì 23 maggio 13
  • 122. Everyarchitectural rulethat starts with“every” is wronggiovedì 23 maggio 13
  • 123. Consequencesgiovedì 23 maggio 13
  • 124. You see,the worls isdivided into twocategories: the one in aBounded Context,andthe one who digs...giovedì 23 maggio 13
  • 125. You ...dig!giovedì 23 maggio 13
  • 126. Estimationsgiovedì 23 maggio 13
  • 127. The tile layergiovedì 23 maggio 13
  • 128. giovedì 23 maggio 13
  • 129. giovedì 23 maggio 13
  • 130. giovedì 23 maggio 13
  • 131. Accounting it rightgiovedì 23 maggio 13
  • 132. Accounting it rightImplementing amazingfunctionalities € 10.000giovedì 23 maggio 13
  • 133. Accounting it rightImplementing amazingfunctionalities € 10.000Learning new techniquesand tools € 4.000giovedì 23 maggio 13
  • 134. Accounting it rightImplementing amazingfunctionalities € 10.000Learning new techniquesand tools € 4.000Establish Safety Conditions € 12.000giovedì 23 maggio 13
  • 135. Accounting it rightImplementing amazingfunctionalities € 10.000Learning new techniquesand tools € 4.000Establish Safety Conditions € 12.000Cleaning up somebody else’smess € 8.000giovedì 23 maggio 13
  • 136. giovedì 23 maggio 13
  • 137. That  will  cost  you  an  €xtra,  sir...giovedì 23 maggio 13
  • 138. Valuegiovedì 23 maggio 13
  • 139. ValueDon’t forget tocount the extravalue also.giovedì 23 maggio 13
  • 140. Estimationsgiovedì 23 maggio 13
  • 141. Estimations“Explorative” evolutionsgiovedì 23 maggio 13
  • 142. Estimations“Explorative” evolutionsLegacy “Pandora’s box”giovedì 23 maggio 13
  • 143. Ignorance based planning100%010%20%30%40%50%60%70%80%90%IgnoranceIgnoranceBreakthroughIgnorancegiovedì 23 maggio 13
  • 144. Gold plating?giovedì 23 maggio 13
  • 145. Product  OwnerTeamgiovedì 23 maggio 13
  • 146. Product  OwnerTeamA  simple  requirementgiovedì 23 maggio 13
  • 147. Product  OwnerTeamA  simple  requirement A  simple  requirementgiovedì 23 maggio 13
  • 148. Product  OwnerTeamA  simple  requirement A  simple  requirementDone  as  DDD  prescribesgiovedì 23 maggio 13
  • 149. Product  OwnerTeamA  simple  requirement A  simple  requirementDone  as  DDD  prescribesIn  a  clean  and  elegant  fashiongiovedì 23 maggio 13
  • 150. Product  OwnerTeamA  simple  requirement A  simple  requirementDone  as  DDD  prescribesIn  a  clean  and  elegant  fashionSoongiovedì 23 maggio 13
  • 151. Product  OwnerTeamA  simple  requirement A  simple  requirementDone  as  DDD  prescribesIn  a  clean  and  elegant  fashionSoon ....ooopsgiovedì 23 maggio 13
  • 152. Yes, but how can Iunderstand if I amdoing DDD?giovedì 23 maggio 13
  • 153. avanscopertaAre  we  really  doing  DDD?Result is better than expectationsNo fear in rewriting piecesWe’re having fungiovedì 23 maggio 13
  • 154. Questions?giovedì 23 maggio 13
  • 155. Questions?Really, you can...giovedì 23 maggio 13
  • 156. Questions?giovedì 23 maggio 13
  • 157. Questions?Really, you can...giovedì 23 maggio 13
  • 158. Thank you@ziobrandoalberto.brandolini@avanscoperta.itgiovedì 23 maggio 13