複雑なドメインに泥臭く立ち向かう

25f2433d54eaed08557621c1da4fb7db?s=47 su-kun1899
December 15, 2018

 複雑なドメインに泥臭く立ち向かう

2018/12/15 JJUG CCC 2018 Fall での登壇資料です。
#jjug_ccc #ccc_e4

25f2433d54eaed08557621c1da4fb7db?s=128

su-kun1899

December 15, 2018
Tweet

Transcript

  1. ෳࡶͳυϝΠϯʹ టषཱͪ͘޲͔͏ #ccc_e4 2018/12/15 JJUG CCC 2018 Fall גࣜձࣾΤεɾΤϜɾΤε 1

  2. ձࣾ঺հ #ccc_e4 2

  3. 10೥ޙͷ೔ຊΛΑ͘͢Δ࢓ࣄΛ͠Α͏ #ccc_e4 3

  4. #ccc_e4 4

  5. ࣗݾ঺հ @su_kun_1899 ϞϒϓϩάϥϚɻΤϞ࿮ɻ ৺͸͍ͭͰ΋εΫϥϜϚελʔɻ จܥΤϯδχΞɻ Spockͱ͔ςετͷ࿩޷͖ɻ web/java/kotlin/agile/scrum ࠷ۙ͸Go͕޷͖Ͱ͢ɻ #ccc_e4 5

  6. ࿩͢͜ͱ #ccc_e4 6

  7. ෳࡶͳυϝΠϯͱઓ͏ͨΊʹ • Ͳ͏΍ͬͯ࢝ΊΔ͔ • Ͳ͏΍ͬͯਐΊΔ͔ • (ࢲ͕ͨͪ) Ͳ͏΍͍ͬͯΔ͔ #ccc_e4 7

  8. ࿩͞ͳ͍͜ͱ • ಛఆͷઃܭख๏ • DDD, OOP... • ٕज़ͷৄࡉ • Kotlin,

    SpringBoot... #ccc_e4 8
  9. Ͳ͏΍ͬͯ͸͡ΊΔ͔ #ccc_e4 9

  10. ෳࡶͳυϝΠϯʁ #ccc_e4 10

  11. • Ξϯίϯτϩʔϥϒϧ • ๏཯ɾ੍౓ɾϧʔϧ • ొ৔ਓ෺ɾγεςϜ • ΦϖϨʔγϣϯ • ࣌ؒ࣠

    • εςʔλε • etc... #ccc_e4 11
  12. հޢอݥ #ccc_e4 12

  13. • հޢܦӦࢧԉαʔϏε • ࠾༻ɺӦۀɺڅ༩ɺۈଵɻɻ • հޢอݥ੥ٻ • WebΞϓϦέʔγϣϯ • Kotlin

    + SpringBoot #ccc_e4 13
  14. ਆಸ઒ݝࠃຽ݈߁อݥஂମ࿈߹ձHP http://www.kanagawa-kokuho.or.jp/kaigo/ 14

  15. հޢอݥͷෳࡶ͞ • څ෇཰, ஍Ҭ୯Ձ • հޢ౓, ݶ౓ֹ • αʔϏεछྨ, αʔϏείʔυ

    • Ճࢉɾݮࢉ, ࢉఆߏ଄ • ๏վਖ਼ • ެඅ, ฦ໭ • ࣏ࣗମ͝ͱͷಛྫ • etc... #ccc_e4 15
  16. ๏վਖ਼ • ̏೥ຖʹେ෯ݟ௚͠ • ෳࡶͳ΋ͷ͸ΑΓෳࡶʹͳ͍ͬͯ͘ • ෳࡶ͞͸มԽ͢Δ #ccc_e4 16

  17. ݱ࣮ੈք͸ γεςϜͷͨΊͷ΋ͷͰ͸ͳ͍ #ccc_e4 17

  18. ҰຊಓΛݟ͚ͭΔ #ccc_e4 18

  19. Ұຊಓ • Not ཁٻͷચ͍ग़͠ • Not Ձ஋ఏڙͷ୯Ґ • But υϝΠϯͷ࠷খ୯Ґ

    #ccc_e4 19
  20. Why? • ҭͯΔ • ؒҧ͑Δ • ΍Γ௚͢ • มԽΛ౰ͨΓલʹ͢Δ #ccc_e4

    20
  21. ҰຊಓΛݟ͚ͭग़͢ #ccc_e4 21

  22. υϝΠϯͷֶश #ccc_e4 22

  23. ࣮຿ͷϩʔϧϓϨΠ #ccc_e4 23

  24. ϢʔβʔετʔϦʔϚοϐϯά ϢʔβʔετʔϦʔϚοϐϯά https://www.oreilly.co.jp/books/9784873117324/ 24

  25. ਆಸ઒ݝࠃຽ݈߁อݥஂମ࿈߹ձHP http://www.kanagawa-kokuho.or.jp/kaigo/ 25

  26. 1. հޢࣄۀऀ͕ར༻ऀຖͷεέδϡʔϧͷ࣮੷Λ֬ఆ͢Δ • ར༻ऀຖͷ੥ٻॻʢอݥ෼ʣ 2. հޢࣄۀऀ͕ࠃ΁ͷ੥ٻֹۚΛ֬ఆ͢Δ • հޢࣄۀऀຖͷ੥ٻॻʢอݥ෼ʣ 3. αʔϏεࣄۀऀ͕ར༻ऀ΁ͷ੥ٻֹۚΛ֬ఆ͢Δ

    • ར༻ऀຖͷ੥ٻॻʢࣗඅ෼ʣ #ccc_e4 26
  27. #ccc_e4 27

  28. ՝୊؅ཧ • όοΫϩά • TODOϦετ • ͙͢ʹ࢒͢ #ccc_e4 28

  29. ελʔτϥΠϯʹ͸ཱͬͨ #ccc_e4 29

  30. Ͳ͏΍ͬͯਐΊΔ͔ #ccc_e4 30

  31. υϝΠϯʹϑΥʔΧε͢Δ #ccc_e4 31

  32. ϞσϧϕʔεͷΞϓϩʔν • (ཁٻ) -> ֓೦ • (֓೦) -> Ϟσϧ #ccc_e4

    32
  33. The complexity is complicated. #ccc_e4 33

  34. Good programmers write code that humans can understand. — -Martin

    Fowler #ccc_e4 34
  35. υϝΠϯͷཧղΛ໌Β͔ʹ͢Δ • ʮ୭͕ԿΛ΍Δ͔ʁʯ • ཧղΛදݱ͢Δ࡞ۀ • (ཁٻ) -> ֓೦ •

    (֓೦) -> Ϟσϧ #ccc_e4 35
  36. Ϟσϧͷநग़ #ccc_e4 36

  37. ! #ccc_e4 37

  38. (ࢲ͕ͨͪ) Ͳ͏΍͍ͬͯΔ͔ #ccc_e4 38

  39. Ϟσϧͷநग़ • ҰຊಓͷݴޠԽ • ໊ࢺͷநग़ • σʔλͱͦͷ࣋ͪओ #ccc_e4 39

  40. #ccc_e4 40

  41. ෇ᝦͱϗϫΠτϘʔυ 1. Write and Talk! 2. Write and Talk!! 3.

    Write and Talk!!! #ccc_e4 41
  42. #ccc_e4 42

  43. Talk is cheap. Show me the code. — Linus Torvalds

    #ccc_e4 43
  44. ίʔυΛॻ͘ #ccc_e4 44

  45. Service • ΞϓϦέʔγϣϯ͕࣮ݱ͍ͨ͜͠ͱ • ϢʔεέʔεΛදݱ͢Δॲཧͷ୯Ґ • ϞσϧΛ࢖͏ #ccc_e4 45

  46. ઃܭͷͨΊͷςετ • ݱ࣮ੈքΛදݱ͢Δͷ͕໨తͰ͸ͳ͍ • ServiceͷςετΛॻ͍ͯΈΔ • ࣮ݱ͍ͨ͜͠ͱΛݟࣦΘͳ͍ #ccc_e4 46

  47. TDD Live in 50 minutes https://speakerdeck.com/twada/tdd-live-in-50-minutes 47

  48. def "ࠃ΁ͷ੥ٻॻΛ࡞੒͢Δʹ͸"() { given: // Կ͕ඞཁͰ when: // ॲཧΛ࣮ߦ͢Δͱ then:

    // Կ͕Ͱ͖͕͋Δͷ͔ʁ } #ccc_e4 48
  49. ໋໊ • ୈೋݴޠ(ӳޠ)΁ͷஔ͖׵͑ • ೔ຊޠ͔ͩΒ௨͡Δɺ͸·΍͔͠ • ओޠͷ໌֬Խ #ccc_e4 49

  50. /** * ݶ౓ֹ؅ཧର৅಺୯Ґ਺ͷ಺ɺڅ෇ର৅ͷ୯Ґ਺ */ fun benefitPointAppliedToPointLimit(): Point { return min(

    pointAppliedToPointLimit() - adjustmentPoint.total(), insuranceLicense.gradingMaxPoint ) } #ccc_e4 50
  51. Ϟσϧͷߏ଄ #ccc_e4 51

  52. "ଟ͘ͷ৘ใΛूΊͨوॏͳσʔλ" • σʔλ͸୯ͳΔ஋ • σʔλ͸࡞Γग़ͤͳ͍ • σʔλΛ૊Έ߹Θͤͨҙຯͷ͋Δ৘ใ • ৘ใ͸σʔλ͔Β࡞Γग़ͤΔ SQLΞϯνύλʔϯ

    https://www.oreilly.co.jp/books/9784873115894/ 52
  53. • σʔλ͔ΒϞσϧΛੜ੒ • ίϯετϥΫλͰσʔλΛ౉͢ • ৘ใΛϞσϧ(ͷϝιου)͕ఏڙ • σʔλΛ૊Έ߹ΘͤɾՃ޻͢Δ #ccc_e4 53

  54. લా͞Μ͕ ࠓ݄ อݥڅ෇අΛ ͍͘Β໯͑Δͷ͔ #ccc_e4 54

  55. հޢࣄۀॴA͕લా͞Μʹ࣮ࢪͨ͠αʔϏε • 11/10 ਎ମհޢ 394୯Ґ • 11/20 ੜ׆ԉॿ 181୯Ґ •

    11/30 ਎ମհޢ 394୯Ґ #ccc_e4 55
  56. // σʔλͷऔಘ val serviceSection = serviceSectionRepository.findBy(sectionNumber) val insuranceLicense = insuranceLicenseRepository.findBy(licenseNumber,

    monthProvided) val actualResult = actualResultRepository.findBy(monthProvided, sectionNumber, licenseNumber) // Ϟσϧͷੜ੒ val estimate = Estimate(insuranceLicense, serviceSection, actualResult) // ৘ใͷఏڙ estimate.amount() // ߹ܭֹۚ estimate.benefitAmount() // อݥڅ෇ֹۚ estimate.careReceiverAmount() // ར༻ऀෛ୲ֹ estimate.amountBy(careType) // αʔϏεछྨ͝ͱͷֹۚ #ccc_e4 56
  57. ! #ccc_e4 57

  58. // σʔλͷऔಘ val serviceSection = serviceSectionRepository.findBy(sectionNumber) val insuranceLicense = insuranceLicenseRepository.findBy(licenseNumber,

    monthProvided) val actualResult = actualResultRepository.findBy(monthProvided, sectionNumber, licenseNumber) // Ϟσϧͷੜ੒ val estimate = Estimate(insuranceLicense, serviceSection, actualResult) // ৘ใͷఏڙ estimate.amount() // ߹ܭֹۚ estimate.benefitAmount() // อݥڅ෇ֹۚ estimate.careReceiverAmount() // ར༻ऀෛ୲ֹ estimate.amountBy(careType) // αʔϏεछྨ͝ͱͷֹۚ #ccc_e4 58
  59. σʔλͱ৘ใ͸੾ΓޱʹΑͬͯมΘΔ • ඞཁͳσʔλ͸Ϟσϧͱͯ͠ѻ͏ • Ϟσϧ͸σʔλΛѻ͏୯Ґ • σʔλΛந৅Խ͢ΔͱϞσϧʹͳΔ • Ϟσϧ͸৘ใΛఏڙ͢Δ #ccc_e4

    59
  60. ! ੥ٻॻ " ར༻ऀ # $! ඃอݥऀূ # $! ࢧڅݶ౓୯Ґ਺

    # $! ୯Ґ਺ " հޢࣄۀॴ # $! ୯Ґ਺୯Ձ # $! Ձ֨ $ ࣮੷εέδϡʔϧ #ccc_e4 60
  61. ੥ٻॻͷσʔλͱ৘ใ • ར༻ऀ -> ੥ٻઌ • հޢࣄۀॴ -> ੥ٻݩ •

    ࣮੷εέδϡʔϧ -> ੥ٻ໌ࡉ #ccc_e4 61
  62. ! ੥ٻॻ " ར༻ऀ # $! ඃอݥऀূ # $! ࢧڅݶ౓୯Ґ਺

    # $! ୯Ґ਺ " հޢࣄۀॴ # $! ୯Ґ਺୯Ձ # $! Ձ֨ $ ࣮੷εέδϡʔϧ #ccc_e4 62
  63. Ϟσϧͷநग़ • ୭͕ • ͲͷʮσʔλʯΛ஌͍ͬͯͯ • Կͷʮ৘ใʯΛఏڙ͢Δ • ͱߟ͑Δͷ͔ #ccc_e4

    63
  64. ਖ਼ղ͸ͳ͍ • ੾ΓޱΛܾΊΔͷ͸ࣗ෼ͨͪ • "खࠒͳେ͖͞" • ୯Ұ੹೚ • ςετ #ccc_e4

    64
  65. #ccc_e4 65

  66. ؀ڥ #ccc_e4 66

  67. #ccc_e4 67

  68. #ccc_e4 68

  69. #ccc_e4 69

  70. • ։ൃऀ͸5໊ • ϗϫΠτϘʔυ • ෇ᝦͱϖϯ • େ͖ͳϞχλ #ccc_e4 70

  71. αΠΫϧͷ੾Γସ͑ίετΛͳ͘͢ #ccc_e4 71

  72. υϝΠϯͷཧղΛ໌Β͔ʹ͢Δ • ʮ୭͕ԿΛ΍Δ͔ʁʯ • ཧղϨϕϧΛදݱ • શһ͕ཧղ͍ͯ͠Δඞཁ͕͋Δ #ccc_e4 72

  73. ͻͱͭͷ͜ͱΛ ΈΜͳͰ΍Δ #ccc_e4 73

  74. ϞϒϓϩɾϞϒϫʔΫ • ू߹஌ • ৘ใڞ༗ • ڭҭޮՌ WEB+DB PRESS Vol.102

    https://gihyo.jp/magazine/wdpress/archive/2018/vol102 74
  75. Agile Games 2017 - Mob Programming Conference https://2017.agilegamesnewengland.com/index.php/mob-programming-conference 75

  76. Ϟϒͷམͱ݀͠ • ฏۉ଎౓ʹͳ͍ͬͯͳ͍͔ʁ • ໾ׂ෼୲͸ͳ͍͔ʁ • ࠷ߴ଎౓͸্͕͍ͬͯΔ͔ʁ • ϞϒϫʔΫ͸෢ثͷҰͭ #ccc_e4

    76
  77. ৘ใڞ༗ͱυΩϡϝϯςʔγϣϯ #ccc_e4 77

  78. Flow and Stock • Twitter ͱ YouTube • Chat ͱ

    Wiki #ccc_e4 78
  79. όέʔγϣϯͷࣸਅ #ccc_e4 79

  80. #ccc_e4 80

  81. • FlowΛSlackʹ࢒͢ • FlowΛesaʹ࢒͢ • StockΛesaʹ࢒͢ #ccc_e4 81

  82. #ccc_e4 82

  83. ܭըͱ;Γ͔͑Γ #ccc_e4 83

  84. ୹͍αΠΫϧ • يಓमਖ਼ • ҙࢥܾఆ • ਐḿ #ccc_e4 84

  85. 5ஈ֊ͷҙࢥܾఆ ! ׬શʹಉҙ " Α͍ͱࢥ͏ # ΍ͬͯΈΔ͔ $ Ҿ͔͔ͬΔ͚Ͳɺ΍ͬͯΈΔ͔.. %

    ࢍಉͰ͖ͳ͍ͳ & ઈରʹμϝͩ #ccc_e4 85
  86. #ccc_e4 86

  87. ਐḿ #ccc_e4 87

  88. Working software is the primary measure of progress. Principles behind

    the Agile Manifesto https://agilemanifesto.org/iso/en/principles.html 88
  89. Appendix #ccc_e4 89

  90. ϚΠΫϩαʔϏε • ΍Ί͓ͯ͜͏ • ४උ͸Ͱ͖Δ ϚΠΫϩαʔϏεΞʔΩςΫνϟ https://www.oreilly.co.jp/books/9784873117607/ 90

  91. ෗ഊ๷ࢭ૚ • ੍౓ࣗମͷ࿪ • ݱߦιϑτ΢ΣΞͷ࢓༷ • ӡ༻্ͷ੍໿ • etc #ccc_e4

    91
  92. Beware the Share. Check Your context. — Udi Dahan ϓϩάϥϚ͕஌Δ΂͖97ͷ͜ͱ

    https://www.oreilly.co.jp/books/9784873114798/ 92
  93. ·ͱΊ #ccc_e4 93

  94. • ࠎ֨ʹͳΔҰຊಓΛݟ͚ͭग़͢ • ֆΛඳ͘ɺݴ༿ʹ͢Δ • ಈ࡞͢ΔίʔυΛॻ͘ • ࣦഊ͠ͳ͕ΒҭͯΔ #ccc_e4 94

  95. #ccc_e4 95

  96. ϞσϧΛҭͯΔ ࡞Γͳ͕ΒܾΊ͍ͯ͘ #ccc_e4 96

  97. MAKE MISTAKS FASTR #ccc_e4 97

  98. Usable Feasible Valuable #ccc_e4 98

  99. None