$30 off During Our Annual Pro Sale. View Details »

Fjorb Boot Camp as a Gate

Fjorb Boot Camp as a Gate

(Show Noteは後日更新します)

Shintaro Kakutani

September 10, 2020
Tweet

More Decks by Shintaro Kakutani

Other Decks in Technology

Transcript

  1. FJORD BOOT CAMP
    !LBLVUBOJ

    AS A

    View Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. ࠓ೔ɺ఻͍͑ͨ͜ͱ

    View Slide

  8. ϕςϥϯͷݴ͏͜ͱ͸࿩൒෼Ͱड͚ͱΊΑ͏

    View Slide

  9. ԋश໰୊
    ຊ೔ͷ͓࿩͸ۀքྺ೥Ҏ্ͷϕςϥϯ͕͓ಧ͚͍ͨ͠·͢

    View Slide

  10. ֯୩৴ଠ࿠
    @kakutani
    حൈͳཧ࿦ʹڵฃ͕ͪ͠
    झຯϝΧχΧϧΩʔϘʔυεΠονͷ५׈

    View Slide

  11. View Slide

  12. View Slide

  13. View Slide

  14. ൃച༧ఆɻࣗ৴࡞ɻ

    View Slide

  15. τʔΫޙͷ࣭ٙԠ౴ʹ͍ͭͯ
    ࣭໰Λ͖͔͚ͬʹͯ͠ϕςϥϯ͕ࣗ෼ͷݴ͍͍ͨ
    ͜ͱΛݴ͏͚ͩͳͷͰɺͳΜͰ΋ԕྀͤͣͲ͏ͧ

    View Slide

  16. ࠓ೔ɺ఻͍͑ͨ͜ͱ

    View Slide

  17. ϥζϕϦʔδϟϜ
    ͷ๏ଇ
    l޿͛Ε͹޿͛Δ΄Ͳബ͘ͳΔ
    https://pxhere.com/en/photo/1150628

    View Slide

  18. l޿͛Ε͹޿͛Δ΄Ͳബ͘ͳΔ
    w3VCZ3BJMTΛಈ͔͢ͷʹඞཁͳ΍ͭɻࠃ࢈ɻब৬ʹ༗ར
    ɻ
    wΞδϟΠϧٻਓථʹࡌͬͯΔ΍ͭ εΫϥϜͰ։ൃ͍ͯ͠·͢
    ɻब৬ʹ༗རɻ

    wΦʔϓϯιʔε(JU)VCʹ͋Δ΍ͭɻ׆ಈͰ૲͕ੜ͑Δɻब৬ʹ༗རɻ

    wίϛϡχςΟΠϕϯτɻษڧձɻlΤϯδχΞzͷू·Γɻब৬ʹ༗རɻ

    View Slide

  19. ΠνΰδϟϜ
    ͷ๏ଇ
    lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍

    View Slide

  20. lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍
    w3VCZίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻਓ͕ؒlͨͷ͍͠zϓϩάϥϛϯάɻ
    wΞδϟΠϧίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞΛιϑτ΢ΣΞͷΑ͏ʹͭ͘Δɻ
    wΦʔϓϯιʔείʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞͷࣗ༝ɻ

    wίϛϡχςΟίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻ͋ͳ͕ͨίϛϡχςΟͩɻ

    View Slide

  21. http://www.flickr.com/photos/alanstanton/5863143738/
    l୯ʹੴΛ੾Γग़͢৔߹Ͱ΋ɺ
    ৗʹ৺ʹ੟ಊΛࢥ͍ඳ͔Ͷ͹
    ͳΒͳ͍ɻ
    ʕʕ࠾ੴ৔࡞ۀऀͷ৺ಘ

    View Slide

  22. View Slide

  23. ࣌Λ௒͑ͨݐઃͷಓ
    lݐ෺΍ொ͸ɺ࣌Λ௒͑ͨಓʹै͑͹ɺͦΕ͚ͩੜ͖ੜ͖
    ͱͯ͘͠Δ͠ɺ·ͨͦΕ͕ͦ͜།ҰͷಓͰ͋Δɻ

    View Slide

  24. ࣌Λ௒͑ͨݐઃͷಓ
    ͦΕ͸ɺ΄͔ͳΒ͵ࢲࣗ਎ͷ಺໘͔Βடং͕ੜ·Εͯ
    ͘ΔΑ͏ͳϓϩηεͰ͋ΔɻͦΕ͸ۃΊΔಓͰ͸ͳ͘ɺ
    ͳ͕͢··ʹ͓͚ͯ͠͹ɺ͓ͷ͔ͣΒੜ·Εͯ͘ΔಓͰ͋
    Δɻ

    View Slide

  25. ࣌Λ௒͑ͨϓϩάϥϛϯάͷಓ

    View Slide

  26. ϥϒϨεഢऋ෉ਓ
    ΦʔΨελɾΤΠμɾΩϯά
    ੈքͰ࠷ॳͷlϓϩάϥϚʔzɻ
    ࢻతՊֶऀ ࣗশ
    ɻ
    ࢻਓόΠϩϯ།Ұͷ஢ग़ࢠɻ
    όϕοδͷղੳػؔʹ͍ͭͯͷ
    ஶ࡞Ͱ஌ΒΕΔɻ
    Augusta Ada King, Countess of Lovelace(1815-1852)

    View Slide

  27. — Augusta Ada King, Countess of Lovelace
    lͨͱ͑͹ɺ͜Ε·ͰԻֶָͷ࿨Իཧ࿦΍࡞ۂ࿦Ͱ࿦͡ΒΕ
    ͖ͯͨԻ֊ͷجຊతͳߏ੒Λɺ਺஋΍ͦͷ૊Έ߹Θͤʹஔ͖
    ׵͑Δ͜ͱ͕Ͱ͖Ε͹ɺղੳػؔ͸ۂͷෳࡶ͞΍௕͞Λ໰Θ
    ͣɺࡉີͰܥ౷తͳԻָ࡞඼Λ࡞ۂͰ͖ΔͰ͠ΐ͏ɻ

    View Slide

  28. View Slide

  29. lίϯϐϡʔλͱΠϯλʔωοτ͸ݱ୅ͷͻͱ͖Θॏཁͳൃ
    ໌ʹ਺͑ΒΕΔ͕ɺͩΕ͕࡞ͬͨͷ͔͸͋·Γ஌ΒΕ͍ͯͳ
    ͍ɻʜͦ͏ͨ͠ਓ෺ͷνʔϜϫʔΫʹ͍ͭͯඳ͘͜ͱ͕ॏཁ
    ͳͷ͸ɺνʔϜϫʔΫͷεΩϧͦ͜ΠϊϕʔγϣϯͷࠜװͰ
    ͋Δʜ͔Βͩɻʜσδλϧ࣌୅Λ࡞ͬͨίϥϘϨʔγϣϯ͸
    ஥ؒ ϐΞ
    ͷ͍͚͋ͩͩͰ͸ͳ͘ɺੈ୅ؒͰ΋ൃੜͨ͠ɻʜ
    ͦͯ͠ɺͳʹΑΓҹ৅ʹ࢒ͬͨͷ͕ɺσδλϧ࣌୅ͷਅͷ૑
    ଄ੑ͸ɺܳज़ͱՊֶΛ݁ͼ෇͚ΒΕΔਓ͔Βੜ·Ε
    ͖ͯͨʜඒΛେ੾ͱߟ͑Δਓͨͪͩɻ

    View Slide

  30. lਓؒ͸ύλʔϯΛೝࣝ͠ɺͦͷඒΛѪͰΔɻ৘ใ͔Β෺ޠ
    ΛͭΉ͙ɻਓؒͱ͸ʜ෺ޠͦͷ΋ͷͳͷͩɻ
    ਓؒͷ૑଄ੑʹ͸ɺՁ஋؍ɺҙࢤɺ৹ඒ؟ɺײ৘ɺݸͷҙࣝɺ
    ಓಙ؍೦ͱ͍ͬͨ΋ͷ͕͔ܽͤͳ͍ɻ͍ͣΕ΋ɺܳज़ͱਓจ
    Պֶ͕զʑʹڭ͑ͯ͘ΕΔ΋ͷͩɻܳज़ͱਓจՊֶ͕ɺࣗવ
    Պֶ΍ςΫϊϩδʔɺΤϯδχΞϦϯάɺ਺ֶͳͲʹྼΒͣ
    ڭҭͷҰ؏ͱͯ͠ॏཁͳͷ΋ɺͦͷͨΊͩɻ

    View Slide

  31. View Slide

  32. lʜΠϊϕʔγϣϯΛੜΈग़͢ͷ͸ɺඒͱΤϯδχΞϦϯά
    ΛɺਓؒੑͱςΫϊϩδʔΛɺͦͯ͠ࢻͱϓϩηοαʔΛ݁
    ͼ෇͚Δ͜ͱͷͰ͖Δਓ෺ͩɻ
    ਓจՊֶͱࣗવՊֶͷަࠩ఺Ͱͳʹ͔Λͳ͠਱͛ΒΕΔΫϦ
    Τʔλʔɺ྆ํͷඒʹؾ͔ͮͤͯ͘ΕΔ৽઱ͳڻ͖ͷײ֮
    ηϯεɾΦϒɾϫϯμʔ
    Λ๨Εͳ͍ࣗ༝ਓͱݴͬͯ΋͍͍ɻ
    ͭ·Γ͸ɺΤΠμɾϥϒϨεͷਫ਼ਆతͳޙܧऀͱ
    ݺͿʹ;͞Θ͍͠ਓ෺ͩɻ

    View Slide

  33. View Slide

  34. օ͞Μ͕࢖͍ͬͯΔιϑτ΢ΣΞ͸ ϋʔυ΢ΣΞ
    ͸ Πϯλʔωοτ͸ʮ୭͔ʯ͕աڈʹ࡞ͬͨ΋ͷ
    Ͱ͋Γɺద੾ʹಈ࡞͠ଓ͚ΔΑ͏ʹʮ୭͔ʯ͕ҡ
    ͍࣋ͯ͠Δɻ͍·࢖͍ͬͯΔύιίϯ΍εϚϗͷ
    ը໘ͷ޲͜͏ʹ͍Δͷ͸ਓؒͩɻ͋ͳͨͷੜΈग़
    ͨ͠ίʔυ ςΩετ ը૾ Ի੠ ө૾σʔλ͸͜Ε
    ͔Βͷʮ୭͔ʯ͕৮ΕΔ͔΋͠Εͳ͍ɻ৮Εͳ͍
    ͔΋͠Εͳ͍ɻͦͷʮ୭͔ʯ͸ࣗ෼͔΋͠Εͳ͍
    ࠓޙ͸CPU΍ΞϧΰϦζϜ͔΋͠Εͳ͍͚Ͳʜ
    ɻ

    View Slide

  35. http://www.flickr.com/photos/alanstanton/5863143738/
    l୯ʹੴΛ੾Γग़͢৔߹Ͱ΋ɺ
    ৗʹ৺ʹ੟ಊΛࢥ͍ඳ͔Ͷ͹
    ͳΒͳ͍ɻ
    ʕʕ࠾ੴ৔࡞ۀऀͷ৺ಘ

    View Slide

  36. ࣌Λ௒͑ͨϓϩάϥϛϯάͷಓ

    View Slide

  37. w࣭
    w໳
    wಓ
    wಓͷ֩৺

    View Slide


  38. l࣌Λ௒͑ͨಓΛٻΊΔ΋ͷ͸ɺ·ͣແ໊ͷ࣭Λ஌ΒͶ͹ͳΒͳ͍ɻ

    View Slide

  39. ࣗ༝ͳ͍ͷͪͷً͖

    View Slide

  40. View Slide

  41. View Slide


  42. Quality

    View Slide

  43. View Slide

  44. View Slide

  45. View Slide

  46. ৬ۀϓϩάϥϚʔͱͯ͠ͷl࣭z

    View Slide

  47. lϓϩάϥϚʔͱ͸ɺλεΫ
    Λίʔυߦʹ෼ׂ͢ΔεΩ
    ϧͷ͋Δਓͷ͜ͱΛࢦ͢ɻ
    Robert C. Martin

    View Slide

  48. lϓϩάϥϚ͸ৄࡉͷ؅ཧऀͰ͋Δɻ
    ͦΕ͕զʑͷ࢓ࣄͩɻγεςϜͷৼΔ
    ෣͍ΛৄࡉʹܾΊΔɻ
    ͦͷͨΊʹςΩετݴޠΛ࢖͏ ͦΕ͕
    ίʔυͩ
    ɻ
    Robert C. Martin

    View Slide

  49. http://www.flickr.com/photos/alanstanton/5863143738/
    l୯ʹੴΛ੾Γग़͢৔߹Ͱ΋ɺ
    ৗʹ৺ʹ੟ಊΛࢥ͍ඳ͔Ͷ͹
    ͳΒͳ͍ɻ
    ʕʕ࠾ੴ৔࡞ۀऀͷ৺ಘ

    View Slide

  50. w࣭
    w໳
    wಓ
    wಓͷ֩৺

    View Slide

  51. lແ໊ͷ࣭ʹ౸ୡ͢Δʹ͸ɺͦ͜ʹ௨͡Δ໳ͱͯ͠ɺੜ͖͍ͯΔύλ
    ϯɾϥϯήʔδΛ૊ΈཱͯͶ͹ͳΒͳ͍ɻ

    View Slide

  52. http://www.flickr.com/photos/yukop/3659638918/
    Gate

    View Slide

  53. View Slide

  54. l͋Δঢ়گԼͰͷ໰୊Λ܁Γฦ͠ղܾ͍ͯ͠Δํ๏ʹ
    ໊લΛ෇͚ͨઆ໌͕ύλʔϯͰ͢ɻ

    View Slide

  55. w࣭
    w໳
    wಓ
    wಓͷ֩৺

    View Slide

  56. l໳ΛݐͯΕ͹ɺͦΕΛ͙ͬͯ࣌͘Λ௒͑ͨಓΛ࣮ફ͍ͯ͘͜͠ͱ͕
    Ͱ͖Δɻ

    View Slide

  57. lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍
    w3VCZίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻਓ͕ؒlͨͷ͍͠zϓϩάϥϛϯάɻ
    wΞδϟΠϧίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞΛιϑτ΢ΣΞͷΑ͏ʹͭ͘Δɻ
    wΦʔϓϯιʔείʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞͷࣗ༝ɻ

    wίϛϡχςΟίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻ͋ͳ͕ͨίϛϡχςΟͩɻ

    View Slide

  58. lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍
    w3VCZίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻਓ͕ؒlͨͷ͍͠zϓϩάϥϛϯάɻ
    wΞδϟΠϧίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞΛιϑτ΢ΣΞͷΑ͏ʹͭ͘Δɻ
    wΦʔϓϯιʔείʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞͷࣗ༝ɻ

    wίϛϡχςΟίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻ͋ͳ͕ͨίϛϡχςΟͩɻ

    View Slide

  59. Ruby
    “The State of the Octoverse”, Top languages section, GitHub
    https://octoverse.github.com/#top-languages

    View Slide

  60. Ruby
    3.0
    IS COMING!

    View Slide

  61. l3VCZͷ͍͢͝ͱ͜Ζ͸ɺݴޠͷಛ௃Λ
    ʮͨͷ͍͠ʯͱݴ͍੾ͬͯ͠·ͬͨ͜ͱɻ
    ݪ৴Ұ࿠ ͱͪ͗3VCZձٞ

    View Slide

  62. ΦϒδΣΫτࢦ޲ͱ͸
    wΞΠσϯςΟςΟΛ࣋ͭ
    ଘࡏΛಛఆͰ͖Δ ͻͱͭͻͱ͕ͭΦϒδΣΫτ

    wϝοηʔδΛ౉ͤΔ
    ΦϒδΣΫτͷlϝιουzʹҾ਺Λ౉ͯ͠ϝοηʔδΛૹ৴Ͱ͖Δ
    ੲɺ.BU[ͷஶ࡞ͰಡΜͩ͜ͱΛهԱΛཔΓʹॻ͍͍ͯΔΑɻਖ਼֬ͳઆ໌͡Όͳ͍͔΋͠Εͳ͍͠ɺ
    ·ͭ΋ͱ͞Μͷઆ໌ͷ࢓ํ΋มΘ͍ͬͯΔ͔΋͠Εͳ͍Αɻ͋͘·ͰLBLVUBOJͷղऍͱཧղͩΑɻ

    View Slide

  63. Πϯλʔωοτ΍ੜ໋Λ໛ͨ͠
    lະདྷΛ࡞Δzϓϩάϥϛϯά
    @sumim
    lΦϒδΣΫτࢦ޲ͱ͸ԿͰ͔͢ʁzͰάάͬͯΈΑ͏2
    ΦϒδΣΫτࢦ޲ͱ͸ԿͰ͔͢ʁ

    View Slide

  64. ͪΐͬͱ3VCZΛॻ͍ͯΈΑ͏͔ɻ࢓༷
    wϘʔφεͷֹۚΛࢉग़͢ΔΑ
    ͜Ε͸ՍۭͷྫͰ͋Γ࣮ࡏͷਓ෺ஂମͱ͸ SZ
    wڅ༩άϨʔυ͝ͱʹج४ֹ͕ۚ͋ΔΑ
    4ϥϯΫ ສԁ
    "ϥϯΫ ສԁ
    #ϥϯΫ ສԁ

    wύϑΥʔϚϯεϨϏϡʔͷ݁ՌͰϘʔφε͸૿ݮ͢Δ
    ༏ल ສԁϓϥε
    ;ͭ͏ Մࢉͳ͠
    ࢒೦ ϚΠφεʜ

    આ໌༻ͷίʔυ͔ͩΒɺ͜Ε͕ʮਖ਼͍͠ʯॻ͖ํ͡Ό͋ͳ͍Α

    View Slide

  65. require_relative 'fjord_works'
    RSpec.describe 'ϘʔφεΛܭࢉ͢ΔΑ!!' do
    context 'komagata͞ΜͷάϨʔυ͸B(ϕʔε100ສԁ)Ͱ' do
    komagata = Person.new(name:'komagata', grade: :B)
    context 'ධՁ͕༏ल(+50ສԁ)ͷͱ͖' do
    bonus = Bonus.new(komagata, review: :excellent)
    check = bonus.call
    example 'Ϙʔφε͸150ສԁ' do
    expect(check).to eq(150)
    context 'machida͞ΜͷάϨʔυ͸A(ϕʔε͕120ສԁ)Ͱ' do
    machida = Person.new(name:'machida', grade: :A)
    context 'ධՁ͕;ͭ͏(Մࢉͳ͠)ͷͱ͖' do
    bonus = Bonus.new(machida, review: :standard)
    check = bonus.call
    example 'Ϙʔφε͸120ສԁ' do
    expect(check).to eq(120)
    context 'kakutaniͷάϨʔυ͸S(ϕʔε͕160ສԁ)Ͱ' do
    kakutani = Person.new(name:'kakutani', grade: :S)
    context 'ධՁ͕࢒೦(2ׂݮ)ͷͱ͖' do
    bonus = Bonus.new(kakutani, review: :poor)
    check = bonus.call
    example 'Ϙʔφε͸128ສԁ' do
    expect(check).to eq(128)
    ennnnnd

    View Slide

  66. ❯ rspec -fd fjord_works_spec.rb
    ϘʔφεΛܭࢉ͢ΔΑ!!
    komagata͞ΜͷάϨʔυ͸B(ϕʔε100ສԁ)Ͱ
    ධՁ͕༏ल(+50ສԁ)ͷͱ͖
    Ϙʔφε͸150ສԁ
    machida͞ΜͷάϨʔυ͸A(ϕʔε͕120ສԁ)Ͱ
    ධՁ͕;ͭ͏(Մࢉͳ͠)ͷͱ͖
    Ϙʔφε͸120ສԁ
    kakutaniͷάϨʔυ͸S(ϕʔε͕160ສԁ)Ͱ
    ධՁ͕࢒೦(2ׂݮ)ͷͱ͖
    Ϙʔφε͸128ສԁ
    Finished in 0.00239 seconds (files took 0.2104 seconds to load)
    3 examples, 0 failures

    View Slide

  67. class Person
    attr_reader :name, :grade
    def initialize(name:, grade:)
    @name, @grade = name, grade
    end
    end
    class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, review
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    case (g = @person.grade)
    when :S
    base = 160
    apply_review(base)
    when :A
    base = 120
    apply_review(base)
    when :B
    base = 100
    apply_review(base)
    else
    raise "No such grade: '#{g}'"
    end
    end
    private
    def apply_review(base)
    case @review
    when :excellent
    base + 50
    when :standard
    base
    when :poor
    base * 0.8
    else
    raise "Nu such review: '#{@review}'"
    end
    end
    end

    View Slide

  68. class Person
    attr_reader :name, :grade
    def initialize(name:, grade:)
    @name, @grade = name, grade
    end
    end

    View Slide

  69. class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, review
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    case (g = @person.grade)
    when :S
    base = 160
    apply_review(base)
    when :A
    base = 120
    apply_review(base)
    when :B
    base = 100
    apply_review(base)
    else
    raise "No such grade: '#{g}'"
    end
    end
    private
    def apply_review(base)
    case @review
    when :excellent
    base + 50
    when :standard
    base
    when :poor
    base * 0.8
    else
    raise "Nu such review: '#{@review}'"
    end
    end
    end

    View Slide

  70. l5FMM %PO`U"TL
    https://martinfowler.com/bliki/TellDontAsk.html
    μϒϧσΟεύον ,FOU#FDL͕޿Ίͨ

    ͷઆ໌΋͔͚ͨͬͨ͠Ͳࠓ೔͸ׂѪͩ

    View Slide

  71. class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, review
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    case (g = @person.grade)
    when :S
    base = 160
    apply_review(base)
    when :A
    base = 120
    apply_review(base)
    when :B
    base = 100
    apply_review(base)
    else
    raise "No such grade: '#{g}'"
    end
    end
    private
    def apply_review(base)
    case @review
    when :excellent
    base + 50
    when :standard
    base
    when :poor
    base * 0.8
    else
    raise "Nu such review: '#{@review}'"
    end
    end
    end
    άϨʔυΛQFSTPOʹਘͶͯ BTL
    ɺ
    ج४ֹۚΛ൑ఆ͍ͯ͠Δ
    ϨϏϡʔͷ൑ఆ಺༰ΛਘͶͯ BTL
    ɺ
    ϘʔφεΛ૿ݮ͍ͤͯ͞Δ
    #POVT͕άϨʔυ΍ϨϏϡʔʹ
    ฉ͖·Θͬͯ࢓ࣄ͍ͯ͠Δ BTL

    View Slide

  72. Grade = Struct.new(:sym, :base)
    GRADES = [
    Grade.new(:S, 160),
    Grade.new(:A, 120),
    Grade.new(:B, 100)
    ].each_with_object({}){|g,h| h[g.sym] = g }.freeze
    class Person
    attr_reader :name, :grade
    def initialize(name:, grade:)
    @name, @grade = name, GRADES[grade]
    end
    end
    class Review
    class Excellent < Review
    def call(base) base + 50 end
    end
    class Standard < Review
    def call(base) base end
    end
    class Poor < Review
    def call(base) base * 0.8 end
    end
    def self.of(sym)
    @_types ||= {
    excellent: Excellent.new,
    standard: Standard.new,
    poor: Poor.new
    }
    @_types[sym]
    end
    def call(base); end
    end
    class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, Review.of(review)
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    @person.grade.base.then {|b| @review.call(b)}
    end
    end
    QFSTPOͷάϨʔυ͝ͱͷج४ֹۚΛɺ
    ϨϏϡʔ݁Ռʹ౉ͯ͠ɺϘʔφεΛࢉग़͠
    ͍ͯΔ UFMM

    #POVT͸άϨʔυͱϨϏϡʔʹ
    ࢓ࣄΛ͓ئ͍͍ͯ͠Δ UFMM

    View Slide

  73. class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, Review.of(review)
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    @person.grade.base.then {|b| @review.call(b)}
    end
    end
    QFSTPOͷάϨʔυ͝ͱͷج४ֹۚΛɺ
    ϨϏϡʔ݁Ռʹ౉ͯ͠ɺϘʔφεΛࢉग़͍ͯ͠Δ UFMM

    #POVT͸άϨʔυͱϨϏϡʔʹ
    ࢓ࣄΛ͓ئ͍͍ͯ͠Δ UFMM

    View Slide

  74. class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, Review.of(review)
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    @review.call(@person.grade.base)
    end
    end
    ΋ͪΖΜɺ͜ΕͰ΋ߏΘͳ͍

    #POVT͸άϨʔυͱϨϏϡʔʹ
    ࢓ࣄΛ͓ئ͍͍ͯ͠Δ UFMM

    View Slide

  75. class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, Review.of(review)
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    @person.grade.base.then {|b| @review.call(b)}
    end
    end
    lͦͷਓͷάϨʔυʹɺϨϏϡʔΛద༻ͨ݁͠Ռ͕
    ϘʔφεͩΑz
    #POVT͸άϨʔυͱϨϏϡʔʹ
    ࢓ࣄΛ͓ئ͍͍ͯ͠Δ UFMM

    View Slide

  76. lҙਤΛ͋ΒΘ໊͢લ
    https://wiki.c2.com/?IntentionRevealingNames
    DDPNͷϠό͞ʹ͍ͭͯ͸ʰύλʔϯ 8JLJ 91ʱΛಡΜͰ͘ΕͨͷΉ

    View Slide

  77. Grade = Struct.new(:sym, :base)
    GRADES = [
    Grade.new(:S, 160),
    Grade.new(:A, 120),
    Grade.new(:B, 100)
    ].each_with_object({}){|g,h| h[g.sym] = g }.freeze
    class Person
    attr_reader :name, :grade
    def initialize(name:, grade:)
    @name, @grade = name, GRADES[grade]
    end
    end
    class Review
    class Excellent < Review
    def call(base) base + 50 end
    end
    class Standard < Review
    def call(base) base end
    end
    class Poor < Review
    def call(base) base * 0.8 end
    end
    def self.of(sym)
    @_types ||= {
    excellent: Excellent.new,
    standard: Standard.new,
    poor: Poor.new
    }
    @_types[sym]
    end
    def call(base); end
    end
    #POVT͸άϨʔυͱϨϏϡʔʹ
    ࢓ࣄΛ͓ئ͍͍ͯ͠Δ UFMM

    View Slide

  78. Grade = Struct.new(:sym, :base)
    GRADES = [
    Grade.new(:S, 160),
    Grade.new(:A, 120),
    Grade.new(:B, 100)
    ].each_with_object({}){|g,h| h[g.sym] = g }.freeze
    class Person
    attr_reader :name, :grade
    def initialize(name:, grade:)
    @name, @grade = name, GRADES[grade]
    end
    end
    άϨʔυ͕4ZNCPM͔Βج४ۚ
    ֹΛ࣋ͬͨ4USVDUʹͳͬͨ

    View Slide

  79. class Review
    class Excellent < Review
    def call(base) base + 50 end
    end
    class Standard < Review
    def call(base) base end
    end
    class Poor < Review
    def call(base) base * 0.8 end
    end
    def self.of(sym)
    @_types ||= {
    excellent: Excellent.new,
    standard: Standard.new,
    poor: Poor.new
    }
    @_types[sym]
    end
    def call(base); end
    end
    class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, Review.of(review)
    end
    ϨϏϡʔ͸4ZNCPM͔ΒৼΔ෣
    ͍Λ΋ͬͨ3FWJFXΫϥεͷΦ
    ϒδΣΫτʹͳͬͨ
    ϘʔφεΛݺͼग़͢ଆ͸ͲͷϨϏϡʔ݁Ռͳͷ͔͸
    4ZNCPMͰࢦఆ͢Δ ΠϯλʔϑΣΠε͸มΘΒͳ͍

    View Slide


  80. context 'komagata͞ΜͷάϨʔυ͸B(ϕʔε100ສԁ)Ͱ' do
    komagata = Person.new(name:'komagata', grade: :B)
    context 'ධՁ͕༏ल(+50ສԁ)ͷͱ͖' do
    bonus = Bonus.new(komagata, review: :excellent)
    check = bonus.call
    example 'Ϙʔφε͸150ສԁ' do
    expect(check).to eq(150)

    ৼΔ෣͍͸มΘΒͳ͍ͷͰɺςετίʔυ΋มΘΒͳ͍
    ʘϦϑΝΫλϦϯάʗ

    View Slide

  81. ͔͜͜Β͓·͚

    View Slide

  82. ॏෳΛݮΒͤͳ͍͔

    View Slide

  83. class Review
    class Excellent < Review
    def call(base) base + 50 end
    end
    class Standard < Review
    def call(base) base end
    end
    class Poor < Review
    def call(base) base * 0.8 end
    end
    def self.of(sym)
    @_types ||= {
    excellent: Excellent.new,
    standard: Standard.new,
    poor: Poor.new
    }
    @_types[sym]
    end
    def call(base); end
    end
    &YDFMMFOU 4UBOEBSE 1PPS
    ͱճ΋ॻ͍ͯͯɺ෼ྔͷΘΓ
    ʹ৘ใྔ͕গͳ͍ͷͰ͸
    ݸਓͷײ૝Ͱ͢

    View Slide

  84. Review = Struct.new(:sym, :apply)
    REVIEWS = [
    Review.new(:excellent, ->(base){ base + 50}),
    Review.new(:standard, ->(base){ base }),
    Review.new(:poor, ->(base){ base * 0.8 })
    ].each_with_object({}){|r,h| h[r.sym] = r }.freeze
    class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, REVIEWS[review]
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    @person.grade.base.then {|b| @review.apply.(b) }
    end

    खଓ͖ΛΦϒδΣΫτʹͨ݁͠Ռɺσʔλ͚ͩʹͳͬͨͷͰ4USVDUͷΠϯελϯεʹͯ͠Έͨɻ
    ϨϏϡʔ݁Ռͷ໊લ͸ճ͔͠ग़ͯ͜ͳ͍ɻ3VCZ΂ΜΓ
    3FWJFXͷ"SSBZΛ3FWJFXͷγϯϘϧΛΩʔʹͨ͠3FWJFXͷ)BTIʹͯ͋͠Δ
    ͔Β4ZNCPMͰ3FWJFXΛબ΂Δɻ3VCZ΂ΜΓ

    View Slide

  85. -BXPG%FNFUFSσϝςϧͷᎄ
    w ͋ΔΦϒδΣΫτͷಛఆϝιου্ͰݺΜͰ͍͍ͷ͸
    wࣗ෼͡͠Μ
    wͦͷϝιουͷҾ਺Ͱ౉͖ͬͯͨΦϒδΣΫτ
    wͦͷϝιου͕ࣗ෼ͰΠϯελϯεԽͨ͠ΦϒδΣΫτ
    wͦͷΦϒδΣΫτΛߏ੒͢ΔΦϒδΣΫτ
    https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%A1%E3%83%86%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87
    ࣗ෼͕஌Βͳ͍ΦϒδΣΫτʹ࿩͔͚͠Δͳ %PO`UUBMLUPTUSBOHFST
    ͱ͍͏ᎄͩΑɻ
    ʮσϝςϧͷ๏ଇʯͱ͍͏ͷ͕ఆ༁͚ͩͲɺ๏ଇͱ͍͏ΑΓ͸ɺΦϒδΣΫτࢦ޲ϓϩ
    άϥϛϯάͷమଇͱ͍͏ײͩ͡ͱࢥ͏͔Βɺࢲ͸ʮᎄʯͱݺͿΑ

    View Slide

  86. ❯ git diff
    diff --git a/fjord_works.rb b/fjord_works.rb
    index acb07f1..62f38e1 100644
    --- a/fjord_works.rb
    +++ b/fjord_works.rb
    @@ -6,11 +6,13 @@ GRADES = [
    ].each_with_object({}){|g,h| h[g.sym] = g }.freeze
    class Person
    - attr_reader :name, :grade
    + attr_reader :name
    def initialize(name:, grade:)
    @name, @grade = name, GRADES[grade]
    end
    +
    + def base_salary; @grade.base end
    end
    Review = Struct.new(:sym, :apply)
    @@ -28,6 +30,6 @@ class Bonus
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    - @person.grade.base.then {|b| @review.apply(b)}
    + @person.base_salary.then {|b| @review.apply.(b)}
    end
    end

    View Slide

  87. Review = Struct.new(:sym, :apply)
    REVIEWS = [
    Review.new(:excellent, ->(base){ base + 50}),
    Review.new(:standard, ->(base){ base }),
    Review.new(:poor, ->(base){ base * 0.8 })
    ].each_with_object({}){|r,h| h[r.sym] = r }.freeze
    class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, REVIEWS[review]
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    @person.base_salary.then {|b| @review.apply.(b) }
    end

    ਓؒͷج४ֹۚʹϨϏϡʔ݁ՌΛద༻ͨ͠ͷ͕Ϙʔφε

    View Slide

  88. class Bonus
    attr_reader :person, :review
    def initialize(person, review:)
    @person, @review = person, review
    end
    # Ϙʔφε: άϨʔυ͝ͱͷϕʔεֹۚΛධՁʹΑͬͯ૿ݮֹͤͨۚ͞
    def call
    case (g = @person.grade)
    when :S
    base = 160
    apply_review(base)
    when :A
    base = 120
    apply_review(base)
    when :B
    base = 100
    apply_review(base)
    else
    raise "No such grade: '#{g}'"
    end
    end
    private
    def apply_review(base)
    case @review
    when :excellent
    base + 50
    when :standard
    base
    when :poor
    base * 0.8
    else
    raise "Nu such review: '#{@review}'"
    end
    end
    end
    #POVT͕άϨʔυ΍ϨϏϡʔʹ
    ฉ͖·Θͬͯ࢓ࣄ͍ͯ͠Δ BTL

    View Slide

  89. 3VCZͨͷ͍͠2

    View Slide

  90. l5FMM %PO`U"TL
    https://martinfowler.com/bliki/TellDontAsk.html
    μϒϧσΟεύον ,FOU#FDL͕޿Ίͨ

    ͷઆ໌΋͔͚ͨͬͨ͠Ͳࠓ೔͸ׂѪͩ

    View Slide

  91. Πϯλʔωοτ΍ੜ໋Λ໛ͨ͠
    lະདྷΛ࡞Δzϓϩάϥϛϯά
    @sumim
    lΦϒδΣΫτࢦ޲ͱ͸ԿͰ͔͢ʁzͰάάͬͯΈΑ͏2
    ΦϒδΣΫτࢦ޲ͱ͸ԿͰ͔͢ʁ

    View Slide

  92. https://eng.uber.com/microservice-architecture/

    View Slide

  93. http://jeffsutherland.com/oopsla/schwapub.pdf

    View Slide

  94. http://jeffsutherland.com/oopsla/schwapub.pdf

    View Slide

  95. https://www.slideshare.net/kdmsnr/20140214-teamgeekfearlesschange
    l5FBN(FFLʹΑΔ'FBSMFTT$IBOHFz ֯੐య

    View Slide

  96. lιϑτ΢ΣΞ։ൃ͸νʔϜεϙʔπͰ͋Δ
    wݠڏ )VMJMJUZ

    ੈքͷத৺͸܅Ͱ͸ͳ͍ɻ܅͸શ஌શೳͰ͸ͳ͍͠ɺઈରʹਖ਼͍͠Θ͚Ͱ΋ͳ͍ɻৗʹࣗ෼Λ
    վળ͍ͯ͜͠͏ɻ
    wଚܟ 3FTQFDU

    Ұॹʹಇ͘ਓͷ͜ͱΛ৺͔Βࢥ͍΍Ζ͏ɻ૬खΛਓͷਓؒͱͯ͠ѻ͍ɺͦͷೳྗ΍ޭ੷Λߴ
    ͘ධՁ͠Α͏ɻ
    w৴པ 5SVTU

    ࣗ෼Ҏ֎ͷਓ͸༗ೳͰ͋Γɺਖ਼͍͜͠ͱΛ͢Δͱ৴͡Α͏ɻͦ͏͢Ε͹ɺ࢓ࣄΛ
    ೚ͤΔ͜ͱ͕Ͱ͖Δɻ

    View Slide

  97. l͋ΒΏΔਓؒؔ܎ͷিಥ͸ɺ
    ݠڏɾଚܟɾ৴པͷܽ೗ʹΑΔ΋ͷͩ

    View Slide

  98. ࠓ೔ɺ఻͍͑ͨ͜ͱ

    View Slide

  99. lࣗ෼ͷؾ࣋ͪΛਖ਼͘͠දݱ͢Δ
    ͚ΜͪΌΜ͘Μ͞ΜͷWeb೔ه, https://diary.shu-cream.net/2020/07/06/01.html
    wʮࣾձਓ೥໨͸ࣗ෼ͷؾ͕࣋ͪਖ਼͘͠දݱͰ͖ͨΒे෼ʯͱʜݴΘΕͨʜʢଟ
    ෼!LBLVUBOJ͔!LPJD͋ͨΓͩͱࢥ͏
    wࣗ෼ͷײ৘͸ࣗ෼͔͠Θ͔Βͳ͍ͷͰɺͦΕʹ޲͖߹͍ɺݴ༿ʹ͢Δ܇࿅͕ඞཁ
    wײ৘͕දݱͰ͖ΔΑ͏ʹͳͬͨΒɺ࣍ͷεςοϓ͸ݴ༿ จষ
    ͷղ૾౓Λ্͛Δ
    wޠኮΛ૿΍͠ɺݴ༿ͷղ૾౓Λ্͛Δ͜ͱͰɺࣗ෼ͷײ৘ΛΑΓਖ਼͘͠දݱͰ͖
    ΔΑ͏ʹͳΓ·͢ɻʜΑΓਖ਼ࣗ͘͠෼ͷײ৘Λड͚औͬͯ΋Β͏͜ͱ͕Ͱ͖ΔΑ
    ͏ʹͳΔ

    View Slide

  100. w͍·ͷؾ࣋ͪ ײ৘

    ͋ͳ͕ͨॻ͔ͳ͚Ε͹୭ʹ΋఻ΘΒͳ͍ɻl૬खʹ఻ΘΔΑ͏ʹzςΩετͰॻ͘ʹ͸܇࿅͕ඞཁͩɻ
    w΍ͬͨ͜ͱ ࣄ࣮

    ࠓ೔΋Ұ೔͕Μ͹ͬͨৄ͘͠ॻ͖͍ͨͩΖ͏͚ͲɺΈΜͳ͸ৄࡉΛಡΈ͍͔ͨͳ
    wΘ͔ͬͨ͜ͱ ҙݟ ղऍ

    ΋ͪΖΜɺײ৘Ҏ֎΋ద੾ʹ఻ΘΔΑ͏ʹςΩετग़ྗ͢Δʹ͸܇࿅ɺ܇࿅ɺ܇࿅ɻ
    w࣍ʹ΍Δ͜ͱ ܭը ද໌

    ߟ͑Δ͜ͱ͸େࣄ͚ͩΕͲɺ໌೔ͷࣗ෼΁ͷஔ͖खࢴ ໌೔ͷࣗ෼ʹద੾ʹ఻ΘΔΑ͏ʹॻ͚Δ͔ͳ

    wγϟ΢τΞ΢τ ײँ

    νʔϜʹײँɻ஥ؒʹײँɻΑ͍ৼΔ෣͍ɺॿ͔ͬͨ͜ͱΛϑΟʔυόοΫͯ͠૿͑ͨΒ͏Ε͘͠ͳ͍
    l೔ใz͸Ͳ͜ʹྗΛೖΕͯॻ͘ͷ͕Α͍͔

    View Slide

  101. lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍
    w3VCZίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻਓ͕ؒlͨͷ͍͠zϓϩάϥϛϯάɻ
    wΞδϟΠϧίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞΛιϑτ΢ΣΞͷΑ͏ʹͭ͘Δɻ
    wΦʔϓϯιʔείʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞͷࣗ༝ɻ

    wίϛϡχςΟίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻ͋ͳ͕ͨίϛϡχςΟͩɻ

    View Slide

  102. lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍
    w3VCZίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻਓ͕ؒlͨͷ͍͠zϓϩάϥϛϯάɻ
    wΞδϟΠϧίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞΛιϑτ΢ΣΞͷΑ͏ʹͭ͘Δɻ
    wΦʔϓϯιʔείʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞͷࣗ༝ɻ

    wίϛϡχςΟίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻ͋ͳ͕ͨίϛϡχςΟͩɻ

    View Slide

  103. ίϛϡχςΟͷ
    ҰһʹͳΔ
    https://skymapglobal.com/smart-transportation/funny-indian-train-transportation-picture/

    View Slide

  104. At RubyKaigi 2011, taken by recmpile_net

    View Slide

  105. http://www.flickr.com/photos/recompile_net/4932459606/
    lίϛϡχςΟͱ͸୭͔ɻ΋ͪΖΜɺ
    ͋ͳͨͷ͜ͱͩɻ͋ͳ͕ͨίϛϡχ
    ςΟͰ͋Γɺ ͦΕҎ֎ʹίϛϡχ
    ςΟ͸͍ͳ͍ɻ͋ͳͨͷΑ͏ͳਓʑͷ
    ू·ΓΛɺίϛϡχςΟͱݺͿͷͩ
    ߴڮ੐ٛ 3VCZJTU.BHB[JOF߸ר಄ݴ

    View Slide

  106. l8FGPDVTPOUIFQFPQMFCFIJOE$0%&
    — Akira Matsuda, RubyKaigi 2019 (Paraphrased)

    View Slide

  107. ͜Ε͔Βl*5ۀքzͰಇ͘͜ͱʹͳΔͷͳΒɺձ
    ࣾ๏ਓΑΓ΋ࣗ෼ͷΩϟϦΞͷ΄͏͕ण໋͕௕
    ͍͔΋͠Εͳ͍͜ͱΛ಄ͷย۱ʹஔ͍͓͍ͯ
    ͯ΄͍͠ɻਓ͸ձࣾΛࣙΊΔ͕ɺ༷͟·ͳί
    ϛϡχςΟΛ௨ͯ͡ަྲྀ͕ଓ͘ ܧଓతɾஅଓ

    ͜ͱ΋͋Δɻ૊৫ͱݸਓ͸෼͚ͯߟ͑ΒΕ
    ΔΑ͏ʹͳΔͱΑ͍Ͱ͢Ͷɻ૊৫ͷঢ়گ͕ݸਓ
    ͷৼΔ෣͍ΛܾΊΔ͜ͱ΋͋Δ͔Βɺͳ͔ͳ͔
    Ή͔͍ͣ͜͠ͱ΋ଟ͍Ͱ͚͢ΕͲɻ

    View Slide

  108. View Slide

  109. View Slide

  110. lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍
    w3VCZίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻਓ͕ؒlͨͷ͍͠zϓϩάϥϛϯάɻ
    wΞδϟΠϧίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞΛιϑτ΢ΣΞͷΑ͏ʹͭ͘Δɻ
    wΦʔϓϯιʔείʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞͷࣗ༝ɻ

    wίϛϡχςΟίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻ͋ͳ͕ͨίϛϡχςΟͩɻ

    View Slide

  111. w࣭
    w໳
    wಓ
    wಓͷ֩৺

    View Slide

  112. l͜͜ʹࢸͬͯ΋ɺ࣌Λ௒͑ͨಓ͸·ͩ׬શͰ͸ͳ͍ɻ໳Λޙʹͯ͠
    าΈग़͞ͳ͚Ε͹ɺແ໊ͷ࣭Λे෼ʹੜ੒͢Δ͜ͱ͸Ͱ͖ͳ͍ɻ
    ಓͷ֩৺

    View Slide

  113. View Slide

  114. View Slide

  115. ίϛϡχςΟͷ
    ҰһʹͳΔ
    https://skymapglobal.com/smart-transportation/funny-indian-train-transportation-picture/

    View Slide

  116. View Slide

  117. ϥζϕϦʔδϟϜ
    ͷ๏ଇ
    l޿͛Ε͹޿͛Δ΄Ͳബ͘ͳΔ
    https://pxhere.com/en/photo/1150628

    View Slide

  118. l޿͛Ε͹޿͛Δ΄Ͳബ͘ͳΔ
    w3VCZ3BJMTΛಈ͔͢ͷʹඞཁͳ΍ͭɻࠃ࢈ɻlब৬ʹ༗ར
    ɻ
    wΞδϟΠϧٻਓථʹࡌͬͯΔ΍ͭ εΫϥϜͰ։ൃ͍ͯ͠·͢
    ɻब৬ʹ༗རɻ

    wΦʔϓϯιʔε(JU)VCʹ͋Δ΍ͭɻ׆ಈͰ૲͕ੜ͑Δɻब৬ʹ༗རɻ

    wίϛϡχςΟΠϕϯτɻษڧձɻlΤϯδχΞzͷू·Γɻब৬ʹ༗རɻ

    View Slide

  119. ΠνΰδϟϜ
    ͷ๏ଇ
    lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍

    View Slide

  120. lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍
    w3VCZίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻਓ͕ؒlͨͷ͍͠zϓϩάϥϛϯάɻ
    wΞδϟΠϧίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞΛιϑτ΢ΣΞͷΑ͏ʹͭ͘Δɻ
    wΦʔϓϯιʔείʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞͷࣗ༝ɻ

    wίϛϡχςΟίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻ͋ͳ͕ͨίϛϡχςΟͩɻ

    View Slide

  121. http://www.flickr.com/photos/alanstanton/5863143738/
    l୯ʹੴΛ੾Γग़͢৔߹Ͱ΋ɺ
    ৗʹ৺ʹ੟ಊΛࢥ͍ඳ͔Ͷ͹
    ͳΒͳ͍ɻ
    ʕʕ࠾ੴ৔࡞ۀऀͷ৺ಘ

    View Slide

  122. ࣌Λ௒͑ͨϓϩάϥϛϯάͷಓ

    View Slide

  123. ࣌Λ௒͑ͨݐઃͷಓ
    ͦΕ͸ɺ΄͔ͳΒ͵ࢲࣗ਎ͷ಺໘͔Βடং͕ੜ·Εͯ
    ͘ΔΑ͏ͳϓϩηεͰ͋ΔɻͦΕ͸ۃΊΔಓͰ͸ͳ͘ɺ
    ͳ͕͢··ʹ͓͚ͯ͠͹ɺ͓ͷ͔ͣΒੜ·Εͯ͘ΔಓͰ͋
    Δɻ

    View Slide

  124. օ͞Μ͕࢖͍ͬͯΔιϑτ΢ΣΞ͸ ϋʔυ΢ΣΞ
    ͸ Πϯλʔωοτ͸ʮ୭͔ʯ͕աڈʹ࡞ͬͨ΋ͷ
    Ͱ͋Γɺద੾ʹಈ࡞͠ଓ͚ΔΑ͏ʹʮ୭͔ʯ͕ҡ
    ͍࣋ͯ͠Δɻ͍·࢖͍ͬͯΔύιίϯ΍εϚϗͷ
    ը໘ͷ޲͜͏ʹ͍Δͷ͸ਓؒͩɻ͋ͳͨͷੜΈग़
    ͨ͠ίʔυ ςΩετ ը૾ Ի੠ ө૾σʔλ͸͜Ε
    ͔Βͷʮ୭͔ʯ͕৮ΕΔ͔΋͠Εͳ͍ɻ৮Εͳ͍
    ͔΋͠Εͳ͍ɻͦͷʮ୭͔ʯ͸ࣗ෼͔΋͠Εͳ͍
    ࠓޙ͸CPU΍ΞϧΰϦζϜ͔΋͠Εͳ͍͚Ͳʜ
    ɻ

    View Slide

  125. View Slide

  126. View Slide

  127. l͋Δঢ়گԼͰͷ໰୊Λ܁Γฦ͠ղܾ͍ͯ͠Δํ๏ʹ
    ໊લΛ෇͚ͨઆ໌͕ύλʔϯͰ͢ɻ

    View Slide

  128. lϓϩάϥϚʔͱ͸ɺλεΫ
    Λίʔυߦʹ෼ׂ͢ΔεΩ
    ϧͷ͋Δਓͷ͜ͱΛࢦ͢ɻ
    Robert C. Martin

    View Slide

  129. lϓϩάϥϚ͸ৄࡉͷ؅ཧऀͰ͋Δɻ
    ͦΕ͕զʑͷ࢓ࣄͩɻγεςϜͷৼΔ
    ෣͍ΛৄࡉʹܾΊΔɻ
    ͦͷͨΊʹςΩετݴޠΛ࢖͏ ͦΕ͕
    ίʔυͩ
    ɻ
    Robert C. Martin

    View Slide

  130. http://www.flickr.com/photos/alanstanton/5863143738/
    l୯ʹੴΛ੾Γग़͢৔߹Ͱ΋ɺ
    ৗʹ৺ʹ੟ಊΛࢥ͍ඳ͔Ͷ͹
    ͳΒͳ͍ɻ
    ʕʕ࠾ੴ৔࡞ۀऀͷ৺ಘ

    View Slide

  131. ࠓ೔ɺ఻͍͑ͨ͜ͱ

    View Slide

  132. ϕςϥϯͷݴ͏͜ͱ͸࿩൒෼Ͱड͚ͱΊΑ͏

    View Slide

  133. ࠓ೔ɺ఻͍͑ͨ͜ͱ

    View Slide

  134. lཻ͕͋Ε͹ɺͲ͜·Ͱ΋ബ͘͸ͳΒͳ͍
    w3VCZίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻਓ͕ؒlͨͷ͍͠zϓϩάϥϛϯάɻ
    wΞδϟΠϧίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞΛιϑτ΢ΣΞͷΑ͏ʹͭ͘Δɻ
    wΦʔϓϯιʔείʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻιϑτ΢ΣΞͷࣗ༝ɻ

    wίϛϡχςΟίʔυͷ޲͜͏ʹ͸ਓ͕͍Δɻ͋ͳ͕ͨίϛϡχςΟͩɻ

    View Slide

  135. ࠓ೔ɺ఻͍͑ͨ͜ͱ

    View Slide

  136. w͍·ͷؾ࣋ͪ ײ৘

    ͋ͳ͕ͨॻ͔ͳ͚Ε͹୭ʹ΋఻ΘΒͳ͍ɻl૬खʹ఻ΘΔΑ͏ʹzςΩετͰॻ͘ʹ͸܇࿅͕ඞཁͩɻ
    w΍ͬͨ͜ͱ ࣄ࣮

    ࠓ೔΋Ұ೔͕Μ͹ͬͨৄ͘͠ॻ͖͍ͨͩΖ͏͚ͲɺΈΜͳ͸ৄࡉΛಡΈ͍͔ͨͳ
    wΘ͔ͬͨ͜ͱ ҙݟ ղऍ

    ΋ͪΖΜɺײ৘Ҏ֎΋ద੾ʹ఻ΘΔΑ͏ʹςΩετग़ྗ͢Δʹ͸܇࿅ɺ܇࿅ɺ܇࿅ɻ
    w࣍ʹ΍Δ͜ͱ ܭը ද໌

    ߟ͑Δ͜ͱ͸େࣄ͚ͩΕͲɺ໌೔ͷࣗ෼΁ͷஔ͖खࢴ ໌೔ͷࣗ෼ʹద੾ʹ఻ΘΔΑ͏ʹॻ͚Δ͔ͳ

    wγϟ΢τΞ΢τ ײँ

    νʔϜʹײँɻ஥ؒʹײँɻΑ͍ৼΔ෣͍ɺॿ͔ͬͨ͜ͱΛϑΟʔυόοΫͯ͠૿͑ͨΒ͏Ε͘͠ͳ͍
    l೔ใz͸Ͳ͜ʹྗΛೖΕͯॻ͘ͷ͕Α͍͔

    View Slide

  137. http://www.flickr.com/photos/alanstanton/5863143738/
    l୯ʹੴΛ੾Γग़͢৔߹Ͱ΋ɺ
    ৗʹ৺ʹ੟ಊΛࢥ͍ඳ͔Ͷ͹
    ͳΒͳ͍ɻ
    ʕʕ࠾ੴ৔࡞ۀऀͷ৺ಘ

    View Slide

  138. (It’s brave new world)

    View Slide

  139. View Slide

  140. ԋश໰୊
    ຊ೔ͷ͓࿩͸ۀքྺ೥Ҏ্ͷϕςϥϯ͕͓ಧ͚͍ͨ͠·͢

    View Slide

  141. FJORD BOOT CAMP
    !LBLVUBOJ

    AS A

    View Slide