Upgrade to Pro — share decks privately, control downloads, hide ads and more …

週一でリリースし続けるためのフロントエンドにおける不確実性との戦い方 / Developers...

週一でリリースし続けるためのフロントエンドにおける不確実性との戦い方 / Developers Summit 2020 Summer C-4

Developers Summit 2020 Summer C-4 で発表した資料です。

Satoshi Takeda

July 21, 2020
Tweet

More Decks by Satoshi Takeda

Other Decks in Technology

Transcript

  1. ձࣾ঺հ גࣜձࣾ NFEJCB IUUQTXXXNFEJCBKQ ઃཱ ೥݄೔ ैۀһ਺  ໊ ։ൃऀ਺

     ໊ ೥݄ݱࡏ ,%%*גࣜձࣾͷ BVεϚʔτύεΛத৺ͱͨ͠ BVؔ࿈αʔϏεӡӦͷଞɺ෯޿͍෼໺ͰαʔϏ εΛల։͠ɺϢʔβʔ͕ΠϯλʔωοτΛ௨͡ ͯඞཁͳ࣌ʹඞཁͳ৘ใʹΞΫηεͰ͖Δ؀ڥ ͮ͘ΓͷͨΊͷαʔϏεΛఏڙ͍ͯ͠·͢ɻ
  2. ෢ా ་ !ULEO גࣜձࣾ NFEJCB։ൃ( ϑϩϯτΤϯυΤϯδχΞ ΫϥΠΞϯταΠυ #''ͷ։ൃΛ୲౰ جຊతʹ͸ϒϥ΢β͕ओઓ৔ ɿ໾ऀ

    ɿάϩʔεΤΫεύʔτφʔζגࣜձࣾ ɿάϩʔεɾΠϯΫגࣜձࣾ ɿגࣜձࣾ NFEJCB ࣗݾ঺հ
  3. • ൃද಺༰ • νʔϜʹᴥᴪΛͳ͘͠ಉ͡ޠኮͰΞʔΩςΫνϟΛ૊ΜͰ͍͘࿩ • #'' Ͱѻ͍ͬͯΔ (SBQI2- "1* ͕ϝΠϯͷ࿩

    • ϒϥ΢βͰ͓͖Δྫ֎΍ "1* ͷΤϥʔΛ 6* ͰϑΥϩʔ͢Δ࿩ • ఆظతʹϦϦʔε͢Δ࢓૊Έɺͦͯ͠·ͱΊ • ࿩͞ͳ͍͜ͱ • "QPMMP 4FSWFS ʹ͍ͭͯ৮Ε·͕͢ϥΠϒϥϦͷ࢖͍ํ͸࿩͠·ͤΜ • ΫϥΠΞϯταΠυͰ 3FBDU Λ࢖͍ͬͯ·͕͢ൃදʹ΄΅ग़͖ͯ·ͤΜ • ର৅ऀ • νʔϜͰͷίϛϡχέʔγϣϯʹ೰ΜͰ͍Δํ • ։ൃ్தͰᴥᴪ͕ੜ·Εͨ··ϦϦʔε͕ͨ͠ೲಘͰ͖ͳ͔ͬͨํ • #'' Ͱ "1* Λ։ൃ͍ͨ͠ϑϩϯτΤϯυدΓͷ։ൃऀ • "QPMMP 4FSWFS Λ࢖ͬͨ͜ͱͷ͋Δ։ൃऀ ൃද಺༰ͱ૝ఆର৅ऀ
  4. ϓϩμΫτɿʮຖ೔ϙΠϯτʯ औΓר͘ঢ়گ • ݄ BV8"--&5ϙΠϯτ͔Β 1POUBϙΠϯτ΁ • ΩϟογϡϨεܾࡁ BV1": •

    BV*%͸ΩϟϦΞϢʔβʔͷΈͳΒͣΦʔϓϯͳ *% ෆ࣮֬ͳཁૉ͕ଟ͍ɺ.71 .JOJNVN7JBCMF1SPEVDU • ϢʔβʔχʔζɾϙΠϯτͷೝ஌౓ • Ͳ͏͍ͬͨػೳΛ௥Ճ͠श׳Խͯ͠΋Β͏͔ • Ϣʔβʔ਺ΛͲͷ͘Β͍ݟࠐΉ͔ ❌ ݕূͷͨΊͷ࡞Γࣺͯɾ࡞Γ௚͠ ⭕ ͋Δఔ౓ͷਫ਼౓Λ্࣋ͬͨͰݕূ͠ͳ͕ΒҭͯΔ ϓϩμΫτͱഎܠ
  5. ϓϩδΣΫτͷഎܠɿϑϩϯτΤϯυͷڧԽ ະֶशྖҬʹ͓͚ΔνʔϜ\ֶश ϓϨΠ^ͱ͸ !#*57"--&:*/4*%& 7PM • ೥݄ BV8FCϙʔλϧϦχϡʔΞϧ • /FYUKT

    Y(SBQI2-"1* • ϑϩϯτΤϯυڧԽͷͨΊνʔϜମ੍มߋ • ϑϩϯτΤϯυ։ൃऀͷ੹຿Λ૿΍͢ • αʔόʔαΠυ։ൃऀͷεΩϧస׵ • /PEFKT ʹΑΔϑϩϯταʔόʔӡ༻ • 443 (SBQI2- "1* ϓϩμΫτͱഎܠ
  6. ໨࣍  #''ʹকདྷతͳมߋ༰қੑΛ  ઓུϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳  ઓज़ϢʔεέʔεۦಈͰ։ൃ͢Δ  ΤϥʔΠϕϯτͱվળ 

    ΫϥΠΞϯτ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ  #''ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ ໨࣍
  7. ໨࣍  #''ʹকདྷతͳมߋ༰қੑΛ  ઓུϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳  ઓज़ϢʔεέʔεۦಈͰ։ൃ͢Δ  ΤϥʔΠϕϯτͱվળ 

    ΫϥΠΞϯτ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ  #''ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ ϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳
  8. ༏ઌ౓ɿ҆શੑɺকདྷੑͱεϐʔυ • ҆શੑ զʑ͸Ϣʔβʔࢿ࢈Λ༬͔͍ͬͯΔ • কདྷੑͱεϐʔυ ։ൃظؒͱϦϦʔεޙͷมߋ༰қੑΛߟ͑Δ ྫ͑͹ʜ • 3%4ͷςʔϒϧ͸࠷খߏ੒

    কདྷతʹ͸ςʔϒϧ͕૿͑Δ͔΋͠Εͳ͍ • ؅ཧը໘͸࡞Βͳ͍ ӡ༻͸ඞཁ͕ͩ·ͣ͸खӡ༻ • ӡ༻Ͱ଱͑ΒΕΔม਺͸σʔλετϨʔδͰ؅ཧ • ΞϓϦέʔγϣϯ͸֎෦ετϨʔδͷ +40/ ϑΝΠϧΛࢀর͢Δ • ։࠵ظؒɺϙΠϯτɺίϯςϯπɺαʔϏε͕৳௕͔ͯ͠Β؅ཧը໘ ϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳
  9. ։ൃνʔϜ͸͢΂ͯϞϒϓϩ • ݸਓʹ஌͕ࣝுΓ෇͘͜ͱΛආ͚Δ • ϙδςΟϒͳҙຯͰૠ͛ସ͕͑Մೳͳঢ়ଶʹ͓ͯ͘͠ • ͜Ε͸͋ͷਓ͔͠Ͱ͖ͳ͍Λపఈతʹආ͚Δ • ઃܭɾઃܭϨϏϡʔɾ࣮૷ɾ୯ମςετͷ΄ͱΜͲϞϒͰߦ͏ •

    ։ൃޙ൒ͷ௥্͍͛ • όοΫΤϯυαʔϏε։ൃʢ(Pʣͷϝϯόʔʹ 5ZQF4DSJQU Πϯετʔϧ • εϓϦϯτͰҰॹʹ૸ͬͯ࣍εϓϦϯτͰλεΫΛרऔΓ ϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳
  10. ໨࣍  #''ʹকདྷతͳมߋ༰қੑΛ  ઓུϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳  ઓज़ϢʔεέʔεۦಈͰ։ൃ͢Δ  ΤϥʔΠϕϯτͱվળ 

    ΫϥΠΞϯτ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ  #''ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ  ϢʔεέʔεۦಈͰ։ൃ͢Δ
  11. #'' #BDLFOE'PS'SPOUFOE (SBQI2- • ΫϥΠΞϯταΠυϝϦοτ • ⭕ ΫϥΠΞϯτ͔Βͷը໘ʹରͯ͠ඞཁͳϦΫΤετޮ཰͕޲্ • ΫϥΠΞϯτ͕ϢʔεέʔεʹԠͯ͡ΫΤϦΛ૊ΈཱͯΔ͜ͱ͕Մೳ

    • ࠓճ͸ෳࡶͳϩδοΫΛΫϥΠΞϯτʹدͤͨ͘͸ͳ͍ • #'' ϝϦοτ • ރΕͯάϩʔεର৅Ͱ͸ͳ͍طଘ "1*ΛΞάϦήʔτ͠৽ن "1*ͱͯ͠࠶ར༻ • ΫϥΠΞϯταΠυɾ#'' ڞ௨ͷϝϦοτ • ⭕ εΩʔϚʹΑͬͯ΋ͨΒ͞ΕΔ૒ํϑϨϯυϦʔͳ։ൃମ੍ߏங  ϢʔεέʔεۦಈͰ։ൃ͢Δ
  12. εϐʔυײΛอͪͳ͕Βมߋ༰қੑΛ࣋ͯΔ࠷దղ • ٻΊΒΕ͍ͯΔ΋ͷ • νʔϜͰ߹ҙͨ͠ڞ௨ͷݴޠͱϢʔεέʔε • ϓϩμΫτͷ৳௕Λߟྀͨ͠มߋ༰қੑ • σʔλϕʔεɺετϨʔδɺΩϟογϡͳͲ઀ଓઌ͕มΘΔՄೳੑ •

    มߋΛ͙͢ʹٻΊΒΕΔ͜ͱ • Ձ஋ݕূ΍ϢʔβϏϦςΟςετͰมߋ͕ଟ͘૸Δͷ͸ϒϥ΢βͷ (6* • #'' ͕໨ࢦ͍ͨ͠ͱ͜Ζ • ΫϥΠΞϯταΠυͰͷϢʔεέʔεΛϕʔεʹͨ͠ "1*  ϢʔεέʔεۦಈͰ։ൃ͢Δ
  13. มߋ༰қੑ lιʔείʔυͷґଘੑ͸ɺ಺ଆʢ্ҐϨϕϧͷํ਑ʣͩ ͚ʹ޲͔͍ͬͯͳ͚Ε͹͍͚ͳ͍ɻz $MFBO"SDIJUFDUVSF ୈ ষ ΫϦʔϯΞʔΩςΫνϟ ґଘੑͷϧʔϧ  ϢʔεέʔεۦಈͰ։ൃ͢Δ

    • ࠶ܝ ϓϩμΫτͷ৳௕Λߟྀͨ͠มߋ༰қੑ • σʔλϕʔεɺετϨʔδɺΩϟογϡͳͲ઀ ଓઌ͕༰қʹมߋɾૠ͛ସ͑Ͱ͖ͳ͍ • Ϣʔεέʔε͸֎෦઀ଓʹؔ৺͕͋Δঢ়ଶ
  14. "EBQUPS ΋ίϯετϥΫλͰ %*  ϢʔεέʔεۦಈͰ։ൃ͢Δ ϥΠϒϥϦ΁ͷؔ৺Λ֎΁ • )551ϦΫΤετ͍ͨ͠ • ྫ

    OPEFGFUDI • 03.࢖͍͍ͨ • ྫ 5ZQF03. • ۩ମతʹओுͨ͘͠ͳ͍ ୯ମςετΛॻ͖΍͍͢ • ґଘΛ໛฿͢Δܕߏ଄Λ஫ೖ ͢Δ͚ͩ
  15. &OUJUJFT ʁʁʁ &OUFSQSJTF#VTJOFTT3VMFT&OUJUJFTʁ  ϢʔεέʔεۦಈͰ։ൃ͢Δ • $MFBO "SDIJUFDUVSF த৺ʹΤϯςΟςΟΛਾ͑ͨ Ϟσϧۦಈ։ൃͰ͸ͳ͍

    • νʔϜڞ௨ݴޠͱϢʔεέʔεΛϕʔεʹͨ͠ Ϣʔεέʔεۦಈͷ։ൃ • ϏδωεϧʔϧͳͲ͸ࣗͣͱΤϯςΟςΟʢϞσϧʣʹ
  16. զʑͷ #'' ઓུɾઓज़·ͱΊ • εϐʔυΛٻΊΒΕΔέʔεͰ΋߹ྲྀ஍఺Λ • ઓ͏΂͖͸૬ޓͷೝࣝᴥᴪͰ͸ͳ͍ • ઓ͏΂͖͸ϏδωεΛࠓޙ৳௕͍ͯ͘͠ʹ͋ͨͬͯͷෆ࣮֬ੑ •

    ͦͷͨΊʹઌਓͷ࢒ͨ͠ΞʔΩςΫνϟͷΤοηϯε͕͋Δ͸ͣ • νʔϜڞ௨ͷݴޠͰ໨ઢͷߴ͞Λ߹Θ͓ͤͯ͘ • ಉ͡໨ઢͰର࿩Ͱ͖Δ಺༰͕ίʔυʹసࣸ͞Ε͍ͯΔ #''ʹকདྷతͳมߋ༰қੑΛ
  17. ໨࣍  #''ʹকདྷతͳมߋ༰қੑΛ  ઓུϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳  ઓज़ϢʔεέʔεۦಈͰ։ൃ͢Δ  ΤϥʔΠϕϯτͱվળ 

    ΫϥΠΞϯτ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ  #''ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ
  18. ϒϥ΢βͷྫ֎ɿ%0.&YDFQUJPO • IUUQTIFZDBNHJUIVCJPXFCJEMJEM %0.&YDFQUJPO • %0.͔Βࢀর͍ͯ͠Δ 8FC*%- Ͱఆٛ • ྫ

    • ୺຤ͷ௨৴ෆ௨ʹΑΔΤϥʔ • ϒϥ΢βઃఆʹΑͬͯग़Δ͜ͱ΋͋ͬͨΓ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ
  19. XJOEPXPQFO͸ BCVTF͞ΕΔϢʔεέʔε͕ଟ͍ ϢʔβʔମݧΛ޲্ͤ͞ΔͨΊͷ৽͍͠΢Οϯυ΢Λ։͘ͱ͍͏໨త͕͋Δʹ΋ؔΘ Βͣɺ޿ࠂΛ։ͨ͘Ίʹѱ༻͞Ε͍ͯΔɻϢʔβʔΠϕϯτͰ͋ΔΩʔԡԼɾϚ΢ε ΫϦοΫҎ֎Ͱཁٻ͞Εͨ৔߹͸ϒϩοΫ͞ΕΔ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ l 5IFXJOEPXPQFO

    "1*IBTCFFOBCVTFEUPPQFOJOUSVTJWFBEWFSUJTJOH XIJDI JTSFHSFUGVMTJODFUIFSFBSFMFHJUJNBUFSFBTPOTUPPQFOBOFXXJOEPXUIBU FOIBODFVTFSFYQFSJFODF5SBEJUJPOBMMZ QPQVQXJOEPXTBSFCMPDLFEXIFOUIFZ BSFOUFYQMJDJUMZSFRVFTUFECZBVTFSLFZQSFTTPSNPVTFDMJDLz IUUQTXXXDISPNJVNPSHEFWFMPQFSTEFTJHOEPDVNFOUTDPOTUSBJOFEQPQVQXJOEPXT
  20. ໨࣍  #''ʹকདྷతͳมߋ༰қੑΛ  ઓུϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳  ઓज़ϢʔεέʔεۦಈͰ։ൃ͢Δ  ΤϥʔΠϕϯτͱվળ 

    ΫϥΠΞϯτ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ  #''ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ  ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS
  21. (SBQI2- &SSPS4QFD • FYUFOTJPOT • l5IJTFOUSZJTSFTFSWFEGPSJNQMFNFOUPSTUPBEE BEEJUJPOBMJOGPSNBUJPOUPFSSPSTIPXFWFSUIFZTFF GJU BOEUIFSFBSFOPBEEJUJPOBMSFTUSJDUJPOTPOJUT DPOUFOUTz

    • ϑΟʔϧυ௥Ճʹ੍ݶ͸ͳͦ͞͏ • ࠓճར༻͢Δͷ͸ FYUFOTJPOTDPEF  ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS IUUQTTQFDHSBQIRMPSHESBGUTFD&SSPST
  22. "QPMMP4FSWFS͕࣋ͭྫ֎ 例外クラス extensions.code クラス ApollError INTERNAL_SERVER_ERROR 継承元になるクラス SyntaxError GRAPHQL_PARSE_FAILED サブクラス

    ValidationError GRAPHQL_VALIDATION_FAILED サブクラス AuthenticationError UNAUTHENTICATED サブクラス ForbiddenError FORBIDDEN サブクラス UserInputError BAD_USER_INPUT サブクラス  ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS
  23.  ΤϥʔΠϕϯτͱվળɺ·ͱΊ • ϒϥ΢βͰԿ͕ى͜Δ͔೺Ѳ͢Δ • ϥϯλΠϜΤϥʔɿ։ൃͷ੹຿Ͱ͖ͬͪΓ௵͍ͯͩ͘͠͞ • %0.&YDFQUJPOɿ·͋·͋ى͜ΓಘΔɺ౎౓൑அΛ • 8FCΞϓϦέʔγϣϯ͸ϒϥ΢β͕ΠϯλϑΣʔε

    • ॳظϦϦʔε࣌఺Ͱͷ 6*ͷ࡞ΓࠐΈ४උ • ΤϥʔʹΑͬͯ൑அ͢Δ޻෉Λࣄલʹ͓ͯ͘͠ͱྑͦ͞͏ • ػೳΛॆͨͤ͹ྑ͍Θ͚Ͱ͸ͳ͍ • ࢖͍৺஍΍རศੑΛߴΊΔ఺ʹ΋Ձ஋Λ ΤϥʔΠϕϯτͱվળ
  24. ໨࣍  #''ʹকདྷతͳมߋ༰қੑΛ  ઓུϞϒͰ߹ҙɾҙࢥܾఆ͢Δश׳  ઓज़ϢʔεέʔεۦಈͰ։ൃ͢Δ  ΤϥʔΠϕϯτͱվળ 

    ΫϥΠΞϯτ ϒϥ΢βͷྫ֎ʹద੾ͳ 6* Λ  #''ΫϥΠΞϯτʹ࠷దͳ (SBQI2- &SSPS  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ
  25. ఆظతͳϦϦʔεͷ࣮ݱɿϞϒϫʔΫ  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ • ༏ઌ౓ͱνʔϜͷҙࢥܾఆΛΠϕϯτԽ  ࢪࡦ΍վળ͕ᷓΕ͔͑Δ  ༏ઌ౓Λ͚ͭΔ 

    ϞϒϫʔΫͱͯ͠νʔϜͰ߹ҙ  ༏ઌ౓͕ߴ͚Ε͹ཌ 4QSJOUʹ͸։ൃ  ͙͢ϦϦʔε • ଺ཹͤ͞ͳ͍࢓૊ΈΛνʔϜͰ࣋ͭ
  26.  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ ୭͔ͷܾఆ ʻ νʔϜͷ߹ҙɾҙࢥܾఆ ΞʔΩςΫνϟҰൠ࿦ ʻ νʔϜڞ௨ݴޠͷΞʔΩςΫνϟ ػೳͷఏڙ ʻ

    ػೳͱՁ஋ͷఏڙ  ·ͱΊɿ҆ఆͨ͠ఆظతͳϦϦʔεͷ࣮ݱ νʔϜͰεϐʔυΛ࣋ͬͨҙࢥܾఆΛ܁Γฦ͢ͱ ຖिϦϦʔε͢ΔதͰվળ΍લਐ͕౰વʹͳͬͯ͘Δ