Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Die Kunst der kleinen Schritte - XP Days Germany 2018

137 views

Published on

Die Slides zu meiner Session "Die Kunst der kleinen Schritte" auf den XP Days Germany 2018.

Die Session stellt Ansätze vor, wie sich beim TDD extrem kleine Mikroschritte ("Baby Step" erreichen lassen.

Screencasts, die die Ansätze nochmal illustrieren finden sich unter https://www.youtube.com/playlist?list=PL_ueet93U84VIy8O7U4dUV0GyGvuzFAt8.

Der Vorgängervortrag, der sich noch mehr mit dem Vergleich mit anderen TDD Schulen beschäftigt, findet sich unter https://de.slideshare.net/davidvoelkel.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Die Kunst der kleinen Schritte - XP Days Germany 2018

  1. 1. Die Kunst der kleinen Schritte David Völkel XP Days Germany 09.11.2018
  2. 2. David Völkel XP Days Germany 09.11.2018 @davidvoelkel codecentric Software Craft Meetup Munich #TDD
  3. 3. Disclaimer!
  4. 4. "It's the small steps part that distinguishes the TDD amateurs from the TDD experts ... Experts are able to take smaller Steps.“* *James Shore
  5. 5. Leap* * Leap Pattern aus Kent Becks "Responsive Design" https://www.infoq.com/presentations/responsive-design Image by Thor
  6. 6. Hohes Risiko Initial State Target StateStep 1 State 1 Step 2 State 2 State n-1 Step nSteps … Leap
  7. 7. Initial State Target StateStep 1 State 1 Step 2 State 2 State n-1 Step nSteps … Fehler?Werteachse 0,00 0,25 0,50 0,75 1,00 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 Erfolgswahrscheinlichkeit pro Schritt 0,95 Erfolgswahrscheinlichkeit Anzahl Mikroschritte
  8. 8. Initial State Target StateStep 1 State 1 Step 2 State 2 State n-1 Step nSteps … Kosten bei Fehler zeitaufwändige Suche nach Ursache {
  9. 9. Stepping Stone* * Stepping Stone Pattern aus Kent Becks "Responsive Design" https://www.infoq.com/presentations/responsive-design Image by Seattle Municipal Archives
  10. 10. Stepping Stone* Initial State Target StateStep 1 State 1 Step 2 State 2 State n-1 Step nSteps … Undo is your friend Fehler schnell finden Aber auch Tests häufig ausführen!
  11. 11. "Test 3 Problem" String methodToImplement(String argument) { if (conditionOn(argument)) { return "Test 3 fake result"; } if (otherConditionOn(argument)) { return "Test 2 fake result"; } return "Test 1 fake result"; }
  12. 12. Refactoring?
  13. 13. Refactoring Von außen beobachtbares Verhalten bleibt gleich
  14. 14. Refactoring Transformation* Von außen beobachtbares Verhalten bleibt gleich wird erweitert * aus Transformation Priority Premise , Uncle Bob
  15. 15. Arten von Changes RED GREEN REFACTOR Transformation Refactoring Triangulation
  16. 16. TDD RED GREEN REFACTOR Green Bar Patterns** aus "Test -Drivene Development by Example“, Kent Beck
  17. 17. TDD RED GREEN REFACTOR Green Bar Patterns
  18. 18. Triangulation Fake it Obvious Implementation Fake Response Fake Response Test 2 Test 2Generisch gemacht „Refactoring" macht generisch Alles implementierenTest 1 Test 1 Test 1 Test 1 Test 1 Test 1
  19. 19. Triangulation Fake it Obvious Implementation „Refactoring" macht generischFake Response Fake Response Test 2 Test 2Generisch gemacht Alles implementierenTest 1 Test 1 Test 1 Test 1 Test 1 Test 1 Aufwand
  20. 20. Triangulation Fake it Obvious Implementation „Refactoring" macht generischFake Response Fake Response Test 2 Test 2Generisch gemacht Alles implementierenTest 1 Test 1 Test 1 Test 1 Test 1 Test 1 Aufwand vs Risiko
  21. 21. Green Bar Patterns Sweetspot Triangulation Fake it Obvious Implementation Logik Struktur Trivial
  22. 22. RED GREEN „Klassisches Refactoring“ REFACTOR Cleanup Remove Duplication Express Intent Ziel Wartbarkeit
  23. 23. RED GREEN REFACTOR Preparatory Refactoring* "An example of preparatory refactoring", Martin Fowler
  24. 24. "Green Phase" Implementation Test grün „Grün Phase“ beim Triangulieren
  25. 25. "Green Phase" TransformationPreparatory Refactoring Ziel: Rot verkürzen Test grün Test grün Implementation
  26. 26. "Green Phase" Preparatory Refactoring Test auskommentieren Test Test grün Test grün Implementation TransformationTest
  27. 27. Transformation Priority Premise* Kontext Versprechen Auswahl nächster Testcase Kleinere Schritte Weniger „Steckenbleiben“ * "The Transformation Priority Premise", Uncle Bob
  28. 28. Prio 1 Trafo Prio 2 Trafo … Prio n Trafo Simpel Komplex Transformation Priority Premise Transformation in nächstem Test
  29. 29. Transformationen 1.({}–>nil) 2.(nil->constant) 3.(constant->constant+) WTF? 4.(constant->scalar) 5.(statement->statements) 6.(unconditional->if) 7.(scalar->array) 8.(array->container) 9.(statement->recursion) 10.(if->while) 11.(expression->function) 12.(variable->assignment) * "The Transformation Priority Premise", Uncle Bob *
  30. 30. Hypothese 1.({}–>nil) 2.(nil->constant) 3.(constant->constant+) 4.(constant->scalar) 5.(statement->statements) 6.(unconditional->if) 7.(scalar->array) 8.(array->container) 9.(statement->recursion) 10.(if->while) 11.(expression->function) 12.(variable->assignment) 0.Refactorings
  31. 31. Wahrscheinlichkeit Erfolgswahrscheinlichkeit Anzahl Mikroschritte 0 0,25 0,5 0,75 1 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 0,99 0,95 0,9 0,8 1.({}–>nil) 2.(nil->constant) 3.(constant->constant+) 4.(constant->scalar) 5.(statement->statements) 6.(unconditional->if) 7.(scalar->array) 8.(array->container) 9.(statement->recursion) 10.(if->while) 11.(expression->function) 12.(variable->assignment) 0.Refactorings Erfolgswahrscheinlichkeit pro Schritt
  32. 32. Vorbereitende Refactorings Trivialtestcases Fake it "Refactoring" Triangulation Obvious Implementation Mutual State Green Bar & TPP? 1.({}–>nil) 2.(nil->constant) 3.(constant->constant+) 4.(constant->scalar) 5.(statement->statements) 6.(unconditional->if) 7.(scalar->array) 8.(array->container) 9.(statement->recursion) 10.(if->while) 11.(expression->function) 12.(variable->assignment)
  33. 33. magnifier by Artem Yurov from the Noun Project
  34. 34. Kategorien-Spiel Green Bar Patterns Obvious Implementation Fake it Triangulation Transformationen
  35. 35. Fake it Outside-In „Test 3“ Fake 3 result Logik Struktur & Dekomposition Fake it Triangulation *Fake it Outside-In *
  36. 36. Fake it Outside-In Fake it "Refactoring“ „Test 3“ Trafo Fake 3 result Preparatory Refactoring Logik Struktur & Dekomposition Fake it Triangulation
  37. 37. Fake it Outside-In Fake it "Refactoring“ „Test 3“ Trafo Fake 3 result Preparatory Refactoring Logik Struktur & Dekomposition Fake it Triangulation Ggf. nachtriangulieren
  38. 38. Dekomposition durch Refactoring
  39. 39. Aufgabe Dekomposition 1.„Test 3“ („Normalfall“, nicht „Trivialfall“) 2.Fake Ergebnis 3.dekomponiere durch Refactoring 4.Fake it generisch machen 5.trianguliere „null-safe“ expect(renderName('David', ‚Voelkel')) .toBe('Firstname: DavidnLastname: Voelkel'); expect(renderName(null, null)) .toBe('Firstname: -nLastname: -');
  40. 40. Rückwärts rechnen „Virtuelle Fake Daten“
  41. 41. 1.„Test 3“ 2.Fake Ergebnis 3.dekomponiere durch Refactoring 4.rechne Stück für Stück zurück mit virtuellen Fake Daten in jedem Schritt 5.join() zum konkatenieren assertThat(renderMethods(asList("a", "b", "b"))) .isEqualTo(„a(), b(), c()"); Aufgabe rückwärts rechnen
  42. 42. Triangulation mit Fakedaten „Virtuelle Fake Daten“
  43. 43. Aufgabe Constraints Trianguliere mit TPP Verwende vorbereitendes Refactoring Implementierung mit Collection Pipeline* (oder For Loop) expect(concatenate(['a', 'b', 'c'])).toBe('abc'); In JS: array.join() In Java: stream.collect(Collectors.joining()) * "Collection Pipeline", Martin Fowler
  44. 44. Aufgabe Constraints Trianguliere sauber mit TPP Verwende vorbereitendes Refactoring Implementierung mit Rekursion expect(splitByComma(['a,b,c'])) .toBe(['a', 'b', 'c']); ohne "split()" aus Lib sonstige wie „indexOf()“ … erlaubt
  45. 45. Stärken? Triangulation Fake it
  46. 46. Stärken? Fake it Struktur Templating Mapping Dekomposition Berechnungen Collections/Iterationen Triangulation Logik Conditionals Rekursionen Algorithmen
  47. 47. Neuer Test nötig? Sicherheit Scope zu groß Aufwand Einsparen Trivialtestfälle Verwendung von Libs implizit in Testdaten Triangulation mit Daten Daumenregel: neuer Ausführungszweig?
  48. 48. Zu große Schritte Risiken Steckenbleiben beim TDD Lange Fehlersuche Gegenmittel Hochpriore Changes zuerst => „Zeit im Rot“ minimieren
  49. 49. Kleine Schritte Triangulation Vorbereitende Refactorings Fake it Rückwärts rechnen / Problem Dekomposition Iterationen
  50. 50. Retro Was hat Dich überascht? Was glaubst Du ist praxistauglich?
  51. 51. 1.„Test 3“ 2.Fake Ergebnis 3.Alles was wir heute gelernt haben! assertThat(renderMethods(asList("C"))) .isEqualTo(asList(“__A__“, “_B_B_“, “C___C“)); Fallback Aufgabe
  52. 52. LicenseCreative Commons Attribution-ShareAlike 3.0

×