Share
Embed
Yahoo! 知恵袋フロントエンドをリアーキテクトしている話
Yahoo! 知恵袋のフロントエンドには26000行を超えるユニットテスト(1つのcontrollerのユニットテスト)や、多くのロジックを含むcontrollerがあります。これらによって追加実装・保守が難しい状況です。この問題を解決するために、リアーキテクトを行いました。以下について主に話そうと思っています。
・リアーキテクトで取り組んだこと
・リアーキテクトの結果・学び・反省点
LINEヤフーTech (LY Corporation Tech) PRO
April 17, 2024
Transcript
27 slides
-
-:$PSQPSBUJPO ࣍ ࣗݾհ :BIPPܙାͱ :BIPPܙା ϑϩϯτΤϯυͷ֓ཁ
:BIPPܙା ϑϩϯτΤϯυ๊͕͑Δ DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ ݁Ռ ࠓޙͷ༧ఆ -
-:$PSQPSBUJPO • ͔Β͋Δ2"αΠτ ࠓप🎉 • ొར༻ऀ ສਓɺ࣭૯ԯ ສ݅ɺճ૯ԯ ສ݅Ҏ্ •
༷ʑͳػೳ͕͋Δ • "*ճػೳ • اۀެࣜ2"ػೳ • ʹؔ͢Δ2"ػೳ • ඇެ։ߘػೳ • Ξϯέʔτػೳ :BIPPܙାͱ -
-:$PSQPSBUJPO :BIPPܙା ϑϩϯτΤϯυͷ֓ཁ • ͭͷϖʔδͷදࣔʹࣾʹ͋ΔαʔϏε֎ͷෳͷ"1* ݸҎ্ͷ߹͋Δ ݺͼग़͠Λ͍ͯ͠Δ • લʹ1)1͔Β+BWB4DSJQUʹϦϓϨΠεͯ͠ɺ/PEFKT
3FBDUKT &YQSFTTKT Λར༻͍ͯ͠Δ • /FYUKTͳͲͷϑϨʔϜϫʔΫΛར༻ͤͣʹ443ͱ$43Λߦ͍ͬͯͯɺ#''ଘࡏ͠ͳ͍ -
-:$PSQPSBUJPO :BIPPܙା ϑϩϯτΤϯυ๊͕͑Δ DPOUSPMMFSTͰى͖͍ͯΔ • εύήοςΟίʔυԽͯ͠͠·͍ͬͯΔ • ҙਤͤͣগ͚ͩ͠ҟͳΔίʔυ͕ͨ͘͞Μ͋Δ •
গ͠Կ͔Λม͑Α͏ͱ͢Δͱςετ͕མͪ·͘Δ • ςετ͕େ͗ͯ͢ɺԿ͕ݪҼͰςετ͕མ͔ͪͨ ͕͔ΓͮΒ͍ -
-:$PSQPSBUJPO :BIPPܙା ϑϩϯτΤϯυ๊͕͑Δ DPOUSPMMFSTͰى͖͍ͯΔ • ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • ϩδοΫͷॏෳ
ಉ͡Α͏ͳఆॲཧ͕ෳϑΝΠϧʹଘࡏ͢Δ • ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ ଞͷͰͨ͘͞Μ͋Δ͕ɺಛʹ։ൃޮɾ࣭ɾอकੑͷӨڹ͕େ͖͍ɺ DPOUSPMMFSͰى͖͍ͯΔΛࠓճରͱͨ͠ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ ରൣғ ର࣭ৄࡉϖʔδͷDPOUSPMMFS ཧ༝ • ίʔυͷߋ৽ස͕ߴ͍ • Ұ൪Ӿཡػೳ͕ଟ͍ϖʔδͷDPOUSPMMFS
ߦ • ಛʹίʔυ͕Ԛ͘ͳͬͯ͠·͍ͬͯΔ • Ϣχοτςετ͕Ұ൪େ͖͍ ߦ • ࣄނ͕Α͘ى͖͍ͯΔ • ׂ͚Δ ˠ ޮՌ͕͔Γ͘͢ɺӨڹ͕େ͖͍ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ࡞ ʹҠಈ͢Δ
ϩδοΫͷॏෳ ಉ͡Α͏ͳఆॲཧ͕ෳϑΝΠϧʹଘࡏ͢Δ • ڞ௨͍ͯ͠ΔॲཧΛNPEFMVUJMJUZʹ·ͱΊΔ ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ࡞ ʹҠಈ͠ɺͦ͜ʹϢχοτςετΛॻ͖ɺ DPOUSPMMFSͷϢχοτςετΛΔ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ • ෆਖ਼ͳΛ࡞ΓͮΒ͍Α͏ʹ͢Δ • 5ZQF4DSJQUԽ͢Δ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ࡞ ʹҠಈ͢Δ
ϩδοΫͷॏෳ ಉ͡Α͏ͳఆॲཧ͕ෳϑΝΠϧʹଘࡏ͢Δ • ڞ௨͍ͯ͠ΔॲཧΛNPEFMVUJMJUZʹ·ͱΊΔ ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ࡞ ʹҠಈ͠ɺͦ͜ʹϢχοτςετΛॻ͖ɺ DPOUSPMMFSͷϢχοτςετΛΔ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ • ෆਖ਼ͳΛ࡞ΓͮΒ͍Α͏ʹ͢Δ • 5ZQF4DSJQUԽ͢Δ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ NPEFMͱVUJMJUZͷՃ কདྷతʹDPOUSPMMFSҎԼ͚ͩΛߦ͏Α͏ʹ͍ͨ͠ • ϧʔςΟϯά • ड͚औͬͨϦΫΤετΛݩʹϨεϙϯεΛฦ͢ •
ϦΫΤετύϥϝʔλʔͷόϦσʔγϣϯ ݱࡏ • ϧʔςΟϯά • ड͚औͬͨϦΫΤετΛݩʹϨεϙϯεΛฦ͢ • ϦΫΤετύϥϝʔλʔͷόϦσʔγϣϯ • ֤ͱͷ࿈ܞ ॲཧͷਐߦ • σʔλͷՃɾ༷ʑͳϩδοΫ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ NPEFMͱVUJMJUZͷՃ কདྷతʹDPOUSPMMFSҎԼ͚ͩΛߦ͏Α͏ʹ͍ͨ͠ • ϧʔςΟϯά • ड͚औͬͨϦΫΤετΛݩʹϨεϙϯεΛฦ͢ •
ϦΫΤετύϥϝʔλʔͷόϦσʔγϣϯ ݱࡏ • ϧʔςΟϯά • ड͚औͬͨϦΫΤετΛݩʹϨεϙϯεΛฦ͢ • ϦΫΤετύϥϝʔλʔͷόϦσʔγϣϯ • ֤ͱͷ࿈ܞ ॲཧͷਐߦ • σʔλͷՃɾ༷ʑͳϩδοΫ • DPOUSPMMFSΛ͋Δఔཧ্ͨ͠Ͱɺ͜ͷ෦Λ৽ͨʹ࡞Δ༧ఆͷ BQQMJDBUJPOTFSWJDFʹকདྷతʹҠಈ͍ͤͨ͞ • σʔλͱॲཧΛ·ͱΊͯNPEFMΛ࡞Γɺ܁Γฦ͠৭ʑͳՕॴͰొ͢Δ ϩδοΫΛVUJMJUZͱͯ͠·ͱΊΔͱཧ͍͢͠ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ NPEFMͷՃ NPEFM • ܭࢉ݁ՌΛอ࣋͠ଓ͚͍ͨ߹ɺσʔλΛ͔Γ͍͢୯ҐͰ·ͱΊ͍ͨ߹ʹ͏ • σʔλͱৼΔ͍Λ·ͱΊ͍ͨ߹ʹ͏ •
ͭͷϑΟʔϧυ͔Βࢉग़Ͱ͖ΔͷϑΟʔϧυʹ͠ͳ͍ • ෆมఆٛ JNNVUBCMF ʹ͍ͯͯ͠ɺϑΟʔϧυSFBEPOMZʹ͍ͯ͠Δ • NPEFMͱNPEFMͷؔੑΛද͢߹͋Δ ྫVTFSʹΑͬͯ࡞͞Ε࣭ͨɾճ͔ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ NPEFMͷՃ ྫ NPEFMTVTFSUT • ͍͔ͭ͘ͷQSJWBUFNFUIPEͱJOTUBODF NFUIPEΛ࣋ͭ •
ଞͷϑΟʔϧυ͔Βࢉग़Ͱ͖ΔͷϑΟʔϧυ ͱͯ࣋ͨ͠ͳ͍ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ VUJMJUZͷՃ VUJMJUZ • NPEFMͱҟͳΓJOTUBOUJBUJPO͠ͳ͍ • ܁Γฦ͠৭ʑͳՕॴͰར༻͢ΔΑ͏ͳ͚ؔͩͷϞδϡʔϧ •
NPEFMͱNPEFMͷؔੑΛද͢߹͋Δ ྫVTFS͕ӾཡͰ͖ΔDBUFHPSZ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ࡞ ʹҠಈ͢Δ
ϩδοΫͷॏෳ ಉ͡Α͏ͳఆॲཧ͕ෳϑΝΠϧʹଘࡏ͢Δ • ڞ௨͍ͯ͠ΔॲཧΛNPEFMVUJMJUZʹ·ͱΊΔ ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ࡞ ʹҠಈ͠ɺͦ͜ʹϢχοτςετΛॻ͖ɺ DPOUSPMMFSͷϢχοτςετΛΔ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ • ෆਖ਼ͳΛ࡞ΓͮΒ͍Α͏ʹ͢Δ • 5ZQF4DSJQUԽ͢Δ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ ϢχοτςετͷංେԽ ॳͷܭը DPOUSPMMFSʹ͋ΔNPEFMͱVUJMJUZʹϩδοΫΛཧͭͭ͠ɺҠߦ͢Δ NPEFMͱVUJMJUZNPDLΛͤͣʹɺDPOUSPMMFSͷϢχοτςετΛಈ͔͠ɺৗʹ௨Δ͜ͱΛ֬ ೝ͢Δ
͋Δఔ࣮͕མͪண͍ͨλΠϛϯάͰNPEFMͱVUJMJUZͷϢχοτςετΛՃ͢Δ DPOUSPMMFSͷϢχοτςετ͔ΒNPEFMͱVUJMJUZͷϢχοτςετͰ֬ೝ͍ͯ͠ΔࣄΛআ͢ Δ ݁Ռ • ࣭ৄࡉϖʔδͷDPOUSPMMFSͷϢχοτςετ͔ΒͷҠߦͰ͖ͳ͔ͬͨ • ΘΓʹɺখ͞ΊͷଞͷDPOUSPMMFSͷϢχοτςετΛཧͯ͠Έͯɺ۩ମతʹͲ͏ղܾ͢Δ͔ ͷํΛܾΊͨ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ࡞ ʹҠಈ͢Δ
ϩδοΫͷॏෳ ಉ͡Α͏ͳఆॲཧ͕ෳϑΝΠϧʹଘࡏ͢Δ • ڞ௨͍ͯ͠ΔॲཧΛNPEFMVUJMJUZʹ·ͱΊΔ ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ࡞ ʹҠಈ͠ɺͦ͜ʹϢχοτςετΛॻ͖ɺ DPOUSPMMFSͷϢχοτςετΛΔ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ • ෆਖ਼ͳΛ࡞ΓͮΒ͍Α͏ʹ͢Δ • 5ZQF4DSJQUԽ͢Δ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ ෆਖ਼ͳΛ࡞ΓͮΒ͍Α͏ʹͨ͠ 5ZQF4DSJQUͷܕͰͷറΓ ى͜Γಘͳ͍ঢ়ଶΛ࡞Εͳ͍Α͏ʹ͢ΔͨΊʹɺPQUJPOBMQSPQFSUZͷଟ༻ΛͳΔ͘ආ͚࣮ͯͨ͠ ΦϒδΣΫτͷϓϩύςΟΛ্ॻ͖Ͱ͖ͳ͍Α͏ʹ͢Δ ҎԼΛར༻ͨ͠ɻେ͖ͳྻΦϒδΣΫτͷ߹ɺFTMJOUEJTBCMF͢Δ߹͋Δ • !UZQFTDSJQUFTMJOUQSFGFSSFBEPOMZ
• !UZQFTDSJQUFTMJOUQSFGFSSFBEPOMZQBSBNFUFSUZQFT • UZQFGFTUTͷ3FBEPOMZ%FFQ ؔͷΓͷܕΛ໌ࣔతʹ͢Δ !UZQFTDSJQUFTMJOUFYQMJDJUGVODUJPOSFUVSOUZQFΛͬͯɺҙਤͤ͵ؔͷΓͷܕͷมߋΛ͙ͨ ΊʹɺΓͷܕΛॻ͘͜ͱΛඞਢʹͨ͠ -
-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔͷղܾࡦ 5ZQF4DSJQUԽ EFUBJMKTΛίϐʔͯ͠ɺEFUBJMUTΛ࡞͢Δ UTOPDIFDL Λ࠷ॳͷߦʹՃ͢Δ
ܕΛՃ͢Δ JNQPSU͍ͯ͠ΔKTϑΝΠϧʹEUTΛ༻ҙ͢Δ UTOPDIFDLΛ֎͢ ܕ͕͚ͭΒΕ͍ͯͳ͍ͷɺͻͱ·ͣBOZʹ͢Δ 50%0ίϝϯτ͖ͭ ॲཧΛNPEFMͱVUJMJUZϑΝΠϧͱͯ͠Γग़ͯ͠ܕΛ͚͍ͭͯ͘ EFUBJMKTͷ։ൃʑਐΜͰ͍͘ͷͰɺఆظతʹ͍͖ͭ࡞ۀΛߦ͏ -
-:$PSQPSBUJPO ݁Ռ DPOUSPMMFSTͰى͖͍ͯΔ ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ ϩδοΫͷॏෳ
ಉ͡Α͏ͳఆॲཧ͕ෳϑΝΠϧʹଘࡏ͢Δ ϢχοτςετͷංେԽ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ ݁Ռ NPEFMͱVUJMJUZʹॲཧΛ·ͱΊΔ͜ͱͰɺϩδοΫͷେ෦͕DPOUSPMMFS͔Βফ͑ͨ NPEFMͱVUJMJUZʹॲཧΛ·ͱΊΔ͜ͱͰɺಉ͡ϩδοΫͷ܁Γฦ͕͠ݮͬͨ ࣌ؒͷ߹্վળͰ͖ͳ͔͕ͬͨɺNPEFMͱVUJMJUZʹϢχοτςετΛ͜Ε͔ΒՃ͍͚ͯ͠ɺ DPOUSPMMFSͷϢχοτςετΛେݮ͢Δ͜ͱ͕Ͱ͖ͦ͏ ܕ͕͍ͭͨͨΊɺ࣮ߦ࣌ʹॳΊͯൃ֮͢ΔΤϥʔͷ͜Ε·ͰΑΓݮΔ༧ఆ