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

A Philosophy of Software Design 後半

A Philosophy of Software Design 後半

2022/6/22 @ MoneyForward 勉強会 で実施した A Philosophy of Software Design の話です。

Yosuke Furukawa
PRO

June 22, 2022
Tweet

More Decks by Yosuke Furukawa

Other Decks in Programming

Transcript

  1. A philosophy of software design (ޙ൒) 2022/6/22 @ MoneyForward ษڧձ

  2. Twitter: @yosuke_furukawa Github: yosuke-furukawa

  3. A philosophy of software design • 2018೥ʹॳ൛͕ϦϦʔε͞Ε • 2020೥ʹୈೋ൛͕ϦϦʔε͞Εͨ •

    ๜୊Ͱ͍͏ͱʮιϑτ΢ΣΞઃܭͷ఩ֶʯ https://www.amazon.co.jp/dp/B07N1XLQ7D/
  4. A philosophy of software design • ஶऀ͸δϣϯɾΦʔελʔϋ΢τ͞Μ • Stanford େֶͷίϯϐϡʔλαΠΤϯεڭत

    • Sprite OS (OS), Tcl.Tk(ϓϩάϥϛϯάݴޠ), RAMCloud (Ϋϥ΢υγεςϜ) ͳͲͳͲɺ੍ ࡞෺ଟ਺ https://web.stanford.edu/~ouster/cgi-bin/ home.php
  5. A philosophy of software design લ൒·ͱΊ • Tactical Programming ͸΍ΊΑ͏

    • Strategic Programming Λਪ঑ • ෳࡶ͞͸ґଘͱᐆດ͔͞Βى͖Δ • ෳࡶ͞͸มߋ૿େɺೝ஌ෛՙɺΑ͘஌Βͳ͍͜ͱΛ૿Ճͤ͞Δ • Strategic Programming ͸͜ΕΒΛߟ͑௚ͨ͢ΊͷҰॿͱͳΔ΋ͷ • ౤ࢿϚΠϯυͰߟ͑ͯϓϩάϥϛϯά͢Δ • ԿͳΒೋճઃܭͯ͠ΈΖɺͦ͏͢Ε͹ྑ͍ઃܭ͕Ͱ͖ΔΑ͏ʹͳΔ
  6. ޙ൒͸࣮ફΑΓ

  7. ίϝϯτʹ͍ͭͯ

  8. ʮྑ͍ίʔυͳΒίϝϯτ͍Βͳ ͍ΑͶʯ ʮίϝϯτͬͯॻ͘ͷ͔͔࣌ؒΔ ΑͶʯ ʮͦΕʹίϝϯτݹ͘ͳΔΑͶʯ

  9. ίϝϯτ͍Βͳ͍ΑͶ

  10. ίϝϯτʹ͍ͭͯ • ʮΑ͘ઃܭ͞Ε͍ͯΔ࣮૷ʹ͸ίϝϯτ͸ཁ Βͳ͍ʯ • ͜Ε͸ʮʮʮ؁͍᠘ʯʯʯͰ͋Δ • ʮΞΠεΫϦʔϜ͸࣮͸݈߁ʹྑ͍ʯͱݴΘ ΕͯΔͷͱҰॹͩͱ͍͏ओு

  11. ίϝϯτʹ͍ͭͯ • ίϝϯτͰ͔͠දݱͰ͖ͳ͍΋ͷ΋͋Δ • ίʔυͷཧղΛॿ͚ΔΑ͏ͳίϝϯτ͸ઈରॏ ཁ • Ͳ͏ͤॻ͘ͱͯ͠΋શମͷ͏ͪ10%ఔ౓͔ͩΒ ॻ͍ͨ΄͏͕ྑ͍ •

    ίϝϯτ͕ݹ͘ͳΔʁؾ͍ͮͨΒ௚ͤ͹͍͍
  12. ίϝϯτʹ͍ͭͯ • ίϝϯτͰ͔͠දݱͰ͖ͳ͍΋ͷ΋͋Δ • ίʔυͷཧղΛॿ͚ΔΑ͏ͳίϝϯτ͸ઈରॏ ཁ • Ͳ͏ͤॻ͘ͱͯ͠΋શମͷ͏ͪ10%ఔ౓͔ͩΒ ॻ͍ͨ΄͏͕ྑ͍ •

    ίϝϯτ͕ݹ͘ͳΔʁؾ͍ͮͨΒ௚ͤ͹͍͍ ετϩϯάελΠϧ
  13. ͡Ό͋Ͳ͏͍͏ίϝϯτΛॻ ͚͹͍͍ͷ͔

  14. ͡Ό͋Ͳ͏͍͏ίϝϯτΛॻ͘ ͷ͕ྑ͍ͷ͔ • ίʔυن໿ͱಉ͘͡ίϝϯτʹ΋ن໿Λ࡞Ζ ͏ • Don't Repeat the Code

    ͷݪଇΛकΖ͏ • ΠϯλϑΣʔεͷίϝϯτͱ࣮૷ͷίϝϯτ ͸෼͚Α͏
  15. ίϝϯτن໿ • ίϝϯτʹ΋Ұ؏ੑ͕ͳ͍ͱ͍͚ͳ͍ • ͬͪ͜ͷϞδϡʔϧʹ͸ίϝϯτ͕͋Δ͚Ͳɺ ͬͪ͜ʹ͸ͳ͍Έ͍ͨͳҰ؏ੑ͕อͨΕ͍ͯͳ͍ ͱζϧζϧָͳํʹྲྀΕͯॻ͔Εͳ͘ͳΔ • ಛʹݴޠʹυΩϡϝϯςʔγϣϯͷπʔϧ͕෇͍ ͍ͯΔ΋ͷ΋͋Δɻͦͷ৔߹͸πʔϧͷن໿ʹඞ

    ͣै͏ʢྫ: Javadoc, godoc, Doxygenʣɻ
  16. Don't Repeat the Code ͷݪଇ • ίʔυʹॻ͍ͯ͋Δ͜ͱΛͨͩͦͷ··ίϝ ϯτʹॻ͘͜ͱΛ͠ͳ͍ // Add

    a horizontal scroll bar hScrollBar = new JScrollBar(JScrollBar.HORIZONTAL); add(hScrollBar, BorderLayout.SOUTH); // Add a vertical scroll bar vScrollBar = new JScrollBar(JScrollBar.VERTICAL); add(vScrollBar, BorderLayout.EAST); // Initialize the caret-position related values caretX = 0; caretY = 0; caretMemX = null;
  17. Don't Repeat the Code ͷݪଇ • ίʔυʹॻ͍ͯ͋Δ͜ͱΛͨͩͦͷ··ίϝ ϯτʹॻ͘͜ͱΛ͠ͳ͍ // Add

    a horizontal scroll bar hScrollBar = new JScrollBar(JScrollBar.HORIZONTAL); add(hScrollBar, BorderLayout.SOUTH); // Add a vertical scroll bar vScrollBar = new JScrollBar(JScrollBar.VERTICAL); add(vScrollBar, BorderLayout.EAST); // Initialize the caret-position related values caretX = 0; caretY = 0; caretMemX = null; ͜͏͍͏ίʔυΛݟͨΒٯʹո͠Ή
  18. ΠϯλϑΣʔεͷίϝϯτ • ࢖ΘΕํͷ࣮ྫ • ࢖͏্Ͱͷ஫ҙࣄ߲ • ந৅Խ͞ΕͯΔσβΠϯͷৄࡉΛॻ͘ ʢLinkedListͰ࣮૷͞Ε͍ͯΔ౳ʣ

  19. ΠϯλϑΣʔεͷίϝϯτ • ࢖͍ํ΍࢖͏্Ͱͷ஫ҙࣄ߲͕ॻ͍ͯ͋Δ /* HTTP ͷαʔόͱΫϥΠΞϯτͷ࣮૷Λఏڙ͢ΔΠϯλϑΣʔε Get, Head, Post ͳͲͷ

    HTTP ϦΫΤετΛૹΔ৔߹ɺԼهͷํ๏ͰૹΔ resp, err := http.Get("http://example.com/") ... listenAndServeؔ਺Λ࣮ߦͨ͠ࡍʹطʹಉ͡ϙʔτΛlisten͍ͯͨ͠৔߹ FatalΤϥʔͱͳΓɺىಈʹࣦഊ͢Δɻ */
  20. ࣮૷ͷίϝϯτ • Կނ͜͏͔ͨ͠ʢWhyʣ • ԿΛ͍ͯ͠Δ͔ͷ୺తઆ໌ʢWhatʣ • (Don't Repeat the Code

    ʹͳΒͳ͍Α͏ʹ)
  21. ࣮૷ͷίϝϯτ • ΤϥʔճආͷͨΊͷϫʔΫΞϥ΢ϯυ (Why) try { } catch(e) { //

    ຊདྷ͜͜ͰΩϟον͢Δ΂͖Ͱ͸ͳ͍͕ϥΠϒϥϦ͕ xxx Error Λ // throw ͢ΔͨΊɺҰ࣌తʹΩϟον͠ɺਖ਼ৗॲཧʹ໭͢ɻ // ຊମ΁ͷ Issue 12345 ͕औΓࠐ·ΕͨΒຊॲཧ͸ෆཁ }
  22. ࣮૷ͷίϝϯτ • ҰൃͰԿ΍ͬͯΔ͔Θ͔Βͳ͍࣌ͷղઆ // ೋ࣍ݩ഑ྻͷ֤഑ྻ͝ͱͷฏۉ஋ΛऔΔ let mut averages = vec![];

    for col in 0..len { let mut sum = 0; for row in 0..nums[col].len() { sum += nums[col][row]; } averages.push(sum / nums[col].len()); }
  23. ΈΜͳ͕࢖͏Α͏ͳϞδϡʔϧͳ ΒURLΛίϝϯτʹॻ͘ͷ΋͋Γ /* xxx ϩάͷਖ਼نԽΛߦ͏ؔ਺ log.format("%s", foobarbaz); σβΠϯͷৄࡉ͸ԼهͷURLΛࢀর͢Δ͜ͱ https://example.com/foobarbaz */

  24. ίϝϯτ͍ͭॻ͔͘࿦૪ • Ͱ͖Ε͹ΠϯλϑΣʔεͷίϝϯτ͸࣮૷લʹ ͪΌΜͱॻ͘ͷ͕๬·͍͠ͱͷ͜ͱ • ந৅Խ͢ΔͨΊͷσβΠϯϓϩηεͷҰ෦ͩͱ ଊ͑ͯ࠷ॳʹ΍Δ΂͖ • ࣮૷ͨ͠ΒมΘΔ͔Β΍Γͨ͘ͳ͍ͱ͍͏ਓ͸ σβΠϯϓϩηε͕ෆे෼ͳͷͩͱ੾ΓࣺͯΔ

  25. ίϝϯτ͍ͭॻ͔͘࿦૪ • ޙʹ׳Ε͹ͳΔ΄Ͳਏ͘ͳΔΜ͔ͩΒࠓॻ͜͏ • චऀ͸ίϝϯτΛॻ͍ͯΔͱ͖͕Ұ൪ָ͍࣌ͩ͠ͱࢥ͍ͬͯ Δͱͷ͜ͱ • ୺తͰ໌շͳίϝϯτ͕ॻ͚ͨ ≒ ઃܭ͕͏·͘ݴͬͯΔূڌ

    • ٯʹ্ख͘ίϝϯτ͕ॻ͚ͳ͍ͱ͍͏͜ͱ͸ઃܭ͕͏·͘ ߦͬͯͳ͍ͷ͔΋͠Εͳ͍ • ͜͏͍͏ࢥ͍Λ࣋ͪͳ͕ΒίϝϯτΛָ͠ΜͰॻ͖·͠ΐ͏
  26. ίϝϯτ͍ͭॻ͔͘࿦૪ • ޙʹ׳Ε͹ͳΔ΄Ͳਏ͘ͳΔΜ͔ͩΒࠓॻ͜͏ • චऀ͸ίϝϯτΛॻ͍ͯΔͱ͖͕Ұ൪ָ͍࣌ͩ͠ͱࢥ͍ͬͯ Δͱͷ͜ͱ • ୺తͰ໌շͳίϝϯτ͕ॻ͚ͨ ≒ ઃܭ͕͏·͘ݴͬͯΔূڌ

    • ٯʹ্ख͘ίϝϯτ͕ॻ͚ͳ͍ͱ͍͏͜ͱ͸ઃܭ͕͏·͘ ߦͬͯͳ͍ͷ͔΋͠Εͳ͍ • ͜͏͍͏ࢥ͍Λ࣋ͪͳ͕ΒίϝϯτΛָ͠ΜͰॻ͖·͠ΐ͏
  27. ໊લ෇͚ʹ͍ͭͯ

  28. ໊લ෇͚େࣄ • චऀ͕ੲͱ͋Δ஋ʹ block ͱ͍͏ม਺Λ෇͚ͨ • ͦͷϒϩοΫ͸ϋʔυσΟεΫͷ෺ཧϒϩοΫͷҙ ຯͰ෇͚͍ͯͨɻ • ͔͠͠ɺଞͷॴͰ͸࿦ཧϒϩοΫʹ΋ಉ͡ม਺

    block ͕͍͍ͭͯͨɻ • ͜ΕʹΑΓɺΑ͘Θ͔Βͳ͍όά͕ੜ·Ε͍ͯͨ
  29. ؓ࿩ٳ୊ • ෺ཧϒϩοΫͱ࿦ཧϒϩοΫ • ෺ཧϒϩοΫ͸σΟεΫίϯτϩʔϥ͕ಡΈ ॻ͖͢Δ࣌ͷϒϩοΫͷ͜ͱ • ࿦ཧϒϩοΫ͸ͦΕΒΛ·ͱΊͨܗͰΧʔ ωϧ͕ѻ͏ϑΝΠϧಡΈॻ͖ͷࡍͷϒϩοΫ

  30. ໊લ෇͚େࣄ • ྑ໊͍લ͸ਖ਼֬͞ͱҰ؏ੑΛ࣋ͭ • Ұ؏ੑ • ಉ͡ҙຯͷ΋ͷʹಉ໊͡લ͕͍͍ͭͯΔ͜ͱ • ҧ͏ҙຯͷ΋ͷʹಉ໊͡લ͕͍͍ͭͯͳ͍͜ ͱʢblockͷྫ͸͜ͷ৚݅ҧ൓ʣ

  31. ໊લ෇͚େࣄ • ਖ਼֬͞ • ҙຯ͕े෼ʹڱ͍ํ͕ྑ͍ • ᐆດͰ޿͍ҙຯ͕औΕͯ͠·͏ͱਖ਼͕֬͞ ࣦΘΕΔ • blockͷྫ͸ҙຯ͕ᐆດͩͬͨ

  32. ໊લ෇͚େࣄ • ͡Ό͋΋ͷ͘͢͝௕͍ͱΑ͍ͷ͔ͱ͍͏ͱͦ ͏Ͱ͸ͳ͍ • ಡΉଆ͕ཧղͰ͖Δ͔ʁΛ࠷ॳʹߟ͑Δ • ॻ͘ଆͷ౎߹Ͱ͍͖ͳΓΘʔͬͱॻ͘ͷ͸μ ϝɺಡΉଆͷ໨ઢͰߟ͑Δඞཁ͕͋Δ

  33. ͪͳΈʹҰจࣈม਺ʹ͍ͭͯ • iͱ͔jͱ͔͸ϧʔϓͷม਺ͳΒ΋͸΍ڞ௨ೝࣝͳͷͰ ࢖͍͍ͬͯ • ͨͩ Go ͸จԽతʹ୹͍ม਺Λ޷Ή͕ɺಡΉଆ͕ͦΕ Ͱे෼ʹཧղͰ͖Δ͔ʁΛߟ͑Δ΂͖Ͱ͋Δͱචऀ͸ ओு͢Δ

    • ॻ͘ଆͷ౎߹Ͱ1จࣈͷม਺ʹ͢ΔͷͰ͸ͳ͘ɺಡΉ ଆ΋͜ΕͰཧղͰ͖Δͱࢥ͏ͳΒՄೳͩͱ͍͏ཧ࿦
  34. طଘίʔυΛमਖ਼͢Δ࣌

  35. طଘίʔυͷमਖ਼ • ࠷ॳ͔Βਖ਼͍͠σβΠϯͷ΋ͷ͸ଘࡏ͠ͳ͍ • ண࣮ʹमਖ਼͍ͯ͘͠ඞཁ͕͋Δ • adhoc ʹ tactical ͳίʔυΛॻ͘ͷͰ͸ͳ͘ɺ

    strategic ʹ ઃܭΛͪΌΜͱ͠ͳ͕ΒίʔυΛॻ͖ɺͦΕΛܧଓ͢Δ • ίʔυίϝϯτ΋ͳΔ΂ͪ͘ΌΜͱॻ͘ • ίϝϯτ͸ந৅Խͨ͠΋ͷ΋༻ҙ͠ɺσβΠϯυΩϡϝϯτ ͳͲʹ΋൓ө͓͖ͯ͠ɺͲ͔͜ΒͰ΋ݟΕΔΑ͏ʹ͓ͯ͘͠
  36. ίʔυΛ໌շʹͤΑ

  37. ίʔυΛ໌շʹͤΑ • ໌շ͞ΛอͭͨΊͷςΫχοΫ • ඞཁͳ৘ใ͚ͩʹߜͬͨίʔυΛॻ͘ • ίʔυن໿ΛकΔ • ॏཁͳ৘ใΛϋΠϥΠτ͢Δ

  38. ίʔυΛ໌շʹͤΑ • ඞཁͳ৘ใ͚ͩʹߜͬͨίʔυΛॻ͘ • ୯Ұ੹຿ͷݪଇ • ৑௕ͰෳࡶͳॲཧΛ͠ͳ͍͜ͱʢKeep It Simpleʣ •

    ந৅Խ΍ϨΞέʔεͷߟྀΛߜΔ
  39. ίʔυΛ໌շʹͤΑ • ίʔυن໿ΛकΔ • ۭന΍վߦΛͪΌΜͱकΔ • ίϝϯτ͕ඞཁͳՕॴʹ͸ͪΌΜͱೖΕΔ • ݱ୅ͳΒ linter

    / formatter ͕උΘͬͯΔݴ ޠ΋͋ΔͷͰɺͦΕͰ΋͋Γ
  40. ίʔυΛ໌շʹͤΑ • ॏཁͳ৘ใʹϋΠϥΠτ͢Δ • ίϝϯτΛॻ͘ • Ϡό͍ͱ͖͸Ϡό͍͜ͱ͕ҰൃͰΘ͔ΔΑ͏ͳ໋໊ʹ͢Δ • dangelouslySetInnerHTML •

    SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
  41. ιϑτ΢ΣΞτϨϯυͱͷൺֱ

  42. ͜Ε·ͰͷτϨϯυͱ͜ͷຊͱ ͷཱͪҐஔൺֱ • ޙ൒ͷҰ൪໘ന͍ճ • ͜Ε·Ͱग़͖ͯͨιϑτ΢ΣΞͷτϨϯυʹରͯࣗ͠ ෼ͷཱ৔Λ໌֬ʹ͢ΔՕॴ • ͳΜͱͳ͘ޙॻ͖ίϝϯτײ͕͋ͬͯҰ൪޷͖ͳՕॴ •

    ٯʹஶऀͷओ؍తͳ෦෼ͳͷͰɺ࿩൒෼ʹฉ͍͓ͯ͘ ͷ͕ྑͦ͞͏
  43. ΦϒδΣΫτࢦ޲ϓϩάϥϛϯά

  44. ΦϒδΣΫτࢦ޲ϓϩάϥϛϯ ά • ෳࡶ͞ղফͷͨΊʹੜ·Εͨͱ͞Ε͍ͯΔ͕ຊ࣭త ʹෳࡶ͞ͷղফ͸อূͯ͘͠Εͳ͍ͱࠅධ͍ͯ͠Δ • ෳࡶͳ࣮૷͕Ӆṭ͞ΕΔͱ͍͏ΑΓ΋ෳࡶͳ··ʹ ͳΔ • ಛʹܧঝ͸ෳࡶ͞ΛӅṭͰ͖ͣɺ಺෦ͷঢ়ଶ͕ݟ͑

    ΔΑ͏ʹͳΔݴޠ͕ଟ͍ɺ݁Ռ࣮૷͕ΑΓෳࡶʹͳ Δ
  45. ΞδϟΠϧ։ൃ

  46. ΞδϟΠϧ։ൃ • εέδϡʔϧΛࡉ͔͘੾ͬͯΠςϨʔγϣϯΛճͯ͠։ ൃ͢Δ෦෼͸ධՁ͍ͯ͠Δ • ҰํͰػೳʹ஫໨͞Ε͍͗ͯ͢Δ • ந৅Խͨ͠ઃܭΛ͢Δ࣌ؒΛอূͯ͘͠ΕΔΘ͚Ͱ͸ͳ ͍ •

    Ή͠Ζ࣮૷͢Δํʹ༠ಋ͞Ε͕ͪͳͷͰ݁Ռ tactical programming ʹͳΓ͕ͪ
  47. Ϣχοτςετ

  48. Ϣχοτςετ • ࣗ෼ͷΠϯλϑΣʔεΛςετͨ͠ΓɺϦ ϑΝΫλϦϯάΛॿ͚ͯ͘ΕΔͱ͍͏ҙຯͰ ߴ͘ධՁ͍ͯ͠Δ • ͔͠͠ɺςετۦಈ։ൃɺಛʹςετϑΝʔε τͳߟ͑ํʹؔͯ͠͸࠷ॳ͔Βࡉ෦Λදݱ͠ Α͏ͱ͍͗ͯͯ͢͠ɺߴϨϕϧͳઃܭͷݟ௚ ͠ʹͳΓʹ͍͘ͱ͍͏఺Λ൷൑͍ͯ͠Δ

  49. σβΠϯύλʔϯ

  50. σβΠϯύλʔϯ • σβΠϯΛύλʔϯԽͯ͠ݴޠԽͨ͜͠ͱ͸ߴ͘ධՁ ͍ͯ͠Δ • ҰํͰɺશͯΛύλʔϯʹ͸ΊΑ͏ͱͯ͠͠·͏ਓͨ ͕ͪଟ͘ͳΔࣄΛݒ೦͍ͯ͠Δ • ύλʔϯ͸ແཧʹ࢖͏΋ͷͰ͸ͳ͍ɻ •

    ϋϚΔ΋ͷ͕͋ͬͨΒ࢖͑͹Α͍͠ɺϋϚΒͳ͍ͳΒ ແཧʹ࢖Θͳͯ͘Α͍ɻ
  51. ιϑτ΢ΣΞτϨϯυ • ৽͍͠τϨϯυ͕͋ͬͨΒɺ·ͣҎԼͷࣄΛߟ͑ͯ΄ ͍͠ • ιϑτ΢ΣΞ։ൃͷෳࡶ͞ΛͲ͏΍ͬͯղফ͠Α͏ ͱ͍ͯ͠Δͷ͔ • Ͳ͕͜લͷτϨϯυͱൺֱͯ͠ྑ͘ͳΔͷ͔ •

    ࣗ෼ͷߟ͑ํΛ͜Ε·ͰͷτϨϯυͱൺ্ֱͨ͠ Ͱਂ͘ߟ͑Δ͜ͱ
  52. ࠷ޙʹ

  53. චऀ͕఻͍͑ͨ͜ͱ • σβΠϯͷೳྗͱ͸ʮԿ͕ॏཁͰԿ͕ॏཁ͡Όͳ͍ ͔Λऔࣺબ୒Ͱ͖ΔೳྗʯͰ͋Δ • ؒҧ͑Δ͜ͱ͸୭Ͱ΋͋ΔɺͰ΋ͦΕΛͪΌΜͱݟ ௚͢͜ͱɺ޿͘ਂ͘ߟ͑ͯࣗ෼Ͱऔࣺબ୒͢Δ͜ͱ • ͦΕ͕ͦ͜ྑ͍ιϑτ΢ΣΞΤϯδχΞʹͳΔϓϩ ηεͰ͋Γɺྑ͍σβΠϯೳྗΛ਎ʹ͚ͭΔํ๏Ͱ

    ͋Δ
  54. ·ͱΊ • ίϝϯτΛͪΌΜͱॻ͜͏ • ໋໊͸Ұ؏ੑ͕͋ͬͯਖ਼֬ʹ • ίʔυن໿ʹैͬͯ໌շͳίʔυΛॻ͘ • ιϑτ΢ΣΞτϨϯυΛࣗ෼ͷߟ͑ͱൺֱ͠Α͏ •

    ࣗ෼Ͱߟ͑ͯࣗ෼ͰৼΓฦΔɺͦͷ্Ͱऔࣺબ୒͕ Ͱ͖ΔΑ͏ʹͳΖ͏