Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Yahoo! 知恵袋フロントエンドをリアーキテクトしている話

Yahoo! 知恵袋フロントエンドをリアーキテクトしている話

Yahoo! 知恵袋のフロントエンドには26000行を超えるユニットテスト(1つのcontrollerのユニットテスト)や、多くのロジックを含むcontrollerがあります。これらによって追加実装・保守が難しい状況です。この問題を解決するために、リアーキテクトを行いました。以下について主に話そうと思っています。
・リアーキテクトで取り組んだこと
・リアーキテクトの結果・学び・反省点

More Decks by LINEヤフーTech (LY Corporation Tech)

Other Decks in Technology

Transcript

  1. ˜-:$PSQPSBUJPO ໨࣍  ࣗݾ঺հ  :BIPP஌ܙାͱ͸  :BIPP஌ܙା ϑϩϯτΤϯυͷ֓ཁ 

    :BIPP஌ܙା ϑϩϯτΤϯυ๊͕͑Δ໰୊  DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  ݁Ռ  ࠓޙͷ༧ఆ 
  2. ˜-:$PSQPSBUJPO • ೥͔Β͋Δ2"αΠτ ࠓ೥प೥🎉 • ొ࿥ར༻ऀ਺ ສਓɺ࣭໰૯਺ԯ ສ݅ɺճ౴૯਺ԯ ສ݅Ҏ্ •

    ༷ʑͳػೳ͕͋Δ • "*ճ౴ػೳ • اۀެࣜ2"ػೳ • ঎඼ʹؔ͢Δ2"ػೳ • ඇެ։౤ߘػೳ • Ξϯέʔτػೳ  :BIPP஌ܙାͱ͸
  3. ˜-:$PSQPSBUJPO  :BIPP஌ܙା ϑϩϯτΤϯυ๊͕͑Δ໰୊ DPOUSPMMFSTͰى͖͍ͯΔ໰୊ • ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ΂͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • ϩδοΫͷॏෳ

    ಉ͡Α͏ͳ൑ఆ΍ॲཧ͕ෳ਺ϑΝΠϧʹଘࡏ͢Δ • ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ ଞͷ૚Ͱ΋ͨ͘͞Μ໰୊͸͋Δ͕ɺಛʹ։ൃޮ཰ɾ඼࣭ɾอकੑ΁ͷӨڹ͕େ͖͍ɺ DPOUSPMMFSͰى͖͍ͯΔ໰୊Λࠓճ͸ର৅ͱͨ͠ 
  4. ˜-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  ର৅ൣғ ର৅࣭໰ৄࡉϖʔδͷDPOUSPMMFS ཧ༝ • ίʔυͷߋ৽ස౓͕ߴ͍ • Ұ൪Ӿཡ਺ػೳ͕ଟ͍ϖʔδͷDPOUSPMMFS

    ໿ߦ • ಛʹίʔυ͕Ԛ͘ͳͬͯ͠·͍ͬͯΔ • Ϣχοτςετ͕Ұ൪େ͖͍ ໿ߦ • ࣄނ͕Α͘ى͖͍ͯΔ • ׂ͚Δ޻਺ ˠ ޮՌ͕෼͔Γ΍͘͢ɺӨڹ͕େ͖͍
  5. ˜-:$PSQPSBUJPO  DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ΂͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ਺࡞੒ ʹҠಈ͢Δ

    ϩδοΫͷॏෳ ಉ͡Α͏ͳ൑ఆ΍ॲཧ͕ෳ਺ϑΝΠϧʹଘࡏ͢Δ • ڞ௨͍ͯ͠ΔॲཧΛNPEFM΍VUJMJUZʹ·ͱΊΔ ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ਺࡞੒ ʹҠಈ͠ɺͦ͜ʹϢχοτςετΛॻ͖ɺ DPOUSPMMFSͷϢχοτςετΛ࡟Δ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ • ෆਖ਼ͳ஋Λ࡞ΓͮΒ͍Α͏ʹ͢Δ • 5ZQF4DSJQUԽ͢Δ
  6. ˜-:$PSQPSBUJPO  DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ΂͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ਺࡞੒ ʹҠಈ͢Δ

    ϩδοΫͷॏෳ ಉ͡Α͏ͳ൑ఆ΍ॲཧ͕ෳ਺ϑΝΠϧʹଘࡏ͢Δ • ڞ௨͍ͯ͠ΔॲཧΛNPEFM΍VUJMJUZʹ·ͱΊΔ ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ਺࡞੒ ʹҠಈ͠ɺͦ͜ʹϢχοτςετΛॻ͖ɺ DPOUSPMMFSͷϢχοτςετΛ࡟Δ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ • ෆਖ਼ͳ஋Λ࡞ΓͮΒ͍Α͏ʹ͢Δ • 5ZQF4DSJQUԽ͢Δ
  7. ˜-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  NPEFMͱVUJMJUZͷ௥Ճ কདྷతʹDPOUSPMMFS͸ҎԼ͚ͩΛߦ͏Α͏ʹ͍ͨ͠ • ϧʔςΟϯά • ड͚औͬͨϦΫΤετΛݩʹϨεϙϯεΛฦ͢ •

    ϦΫΤετύϥϝʔλʔͷόϦσʔγϣϯ ݱࡏ • ϧʔςΟϯά • ड͚औͬͨϦΫΤετΛݩʹϨεϙϯεΛฦ͢ • ϦΫΤετύϥϝʔλʔͷόϦσʔγϣϯ • ֤૚ͱͷ࿈ܞ ॲཧͷਐߦ໾ • σʔλͷՃ޻ɾ༷ʑͳϩδοΫ
  8. ˜-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  NPEFMͱVUJMJUZͷ௥Ճ কདྷతʹDPOUSPMMFS͸ҎԼ͚ͩΛߦ͏Α͏ʹ͍ͨ͠ • ϧʔςΟϯά • ड͚औͬͨϦΫΤετΛݩʹϨεϙϯεΛฦ͢ •

    ϦΫΤετύϥϝʔλʔͷόϦσʔγϣϯ ݱࡏ • ϧʔςΟϯά • ड͚औͬͨϦΫΤετΛݩʹϨεϙϯεΛฦ͢ • ϦΫΤετύϥϝʔλʔͷόϦσʔγϣϯ • ֤૚ͱͷ࿈ܞ ॲཧͷਐߦ໾ • σʔλͷՃ޻ɾ༷ʑͳϩδοΫ • DPOUSPMMFSΛ͋Δఔ౓੔ཧ্ͨ͠Ͱɺ͜ͷ෦෼Λ৽ͨʹ࡞Δ༧ఆͷ BQQMJDBUJPOTFSWJDF૚ʹকདྷతʹҠಈ͍ͤͨ͞ • σʔλͱॲཧΛ·ͱΊͯNPEFMΛ࡞Γɺ܁Γฦ͠৭ʑͳՕॴͰొ৔͢Δ ϩδοΫΛVUJMJUZͱͯ͠·ͱΊΔͱ੔ཧ͠΍͍͢
  9. ˜-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  NPEFMͷ௥Ճ NPEFM • ܭࢉ݁ՌΛอ࣋͠ଓ͚͍ͨ৔߹΍ɺσʔλΛ෼͔Γ΍͍͢୯ҐͰ·ͱΊ͍ͨ৔߹ʹ࢖͏ • σʔλͱৼΔ෣͍Λ·ͱΊ͍ͨ৔߹ʹ࢖͏ •

    ͭͷϑΟʔϧυ͔Βࢉग़Ͱ͖Δ΋ͷ͸ϑΟʔϧυʹ͠ͳ͍ • ෆมఆٛ JNNVUBCMF ʹ͍ͯͯ͠ɺϑΟʔϧυ΋SFBEPOMZʹ͍ͯ͠Δ • NPEFMͱNPEFMͷؔ܎ੑΛද͢৔߹΋͋Δ ྫVTFSʹΑͬͯ࡞੒͞Ε࣭ͨ໰ɾճ౴͔
  10. ˜-:$PSQPSBUJPO  DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ΂͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ਺࡞੒ ʹҠಈ͢Δ

    ϩδοΫͷॏෳ ಉ͡Α͏ͳ൑ఆ΍ॲཧ͕ෳ਺ϑΝΠϧʹଘࡏ͢Δ • ڞ௨͍ͯ͠ΔॲཧΛNPEFM΍VUJMJUZʹ·ͱΊΔ ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ਺࡞੒ ʹҠಈ͠ɺͦ͜ʹϢχοτςετΛॻ͖ɺ DPOUSPMMFSͷϢχοτςετΛ࡟Δ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ • ෆਖ਼ͳ஋Λ࡞ΓͮΒ͍Α͏ʹ͢Δ • 5ZQF4DSJQUԽ͢Δ
  11. ˜-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  ϢχοτςετͷංେԽ ౰ॳͷܭը  DPOUSPMMFSʹ͋ΔNPEFMͱVUJMJUZʹϩδοΫΛ੔ཧͭͭ͠ɺҠߦ͢Δ  NPEFMͱVUJMJUZ͸NPDLΛͤͣʹɺDPOUSPMMFSͷϢχοτςετΛಈ͔͠ɺৗʹ௨Δ͜ͱΛ֬ ೝ͢Δ

     ͋Δఔ౓࣮૷͕མͪண͍ͨλΠϛϯάͰNPEFMͱVUJMJUZͷϢχοτςετΛ௥Ճ͢Δ  DPOUSPMMFSͷϢχοτςετ͔ΒNPEFMͱVUJMJUZͷϢχοτςετͰ֬ೝ͍ͯ͠ΔࣄΛ࡟আ͢ Δ ݁Ռ • ࣭໰ৄࡉϖʔδͷDPOUSPMMFSͷϢχοτςετ͔ΒͷҠߦ͸Ͱ͖ͳ͔ͬͨ • ୅ΘΓʹɺখ͞ΊͷଞͷDPOUSPMMFSͷϢχοτςετΛ੔ཧͯ͠Έͯɺ۩ମతʹͲ͏ղܾ͢Δ͔ ͷํ਑ΛܾΊͨ
  12. ˜-:$PSQPSBUJPO  DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ΂͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ਺࡞੒ ʹҠಈ͢Δ

    ϩδοΫͷॏෳ ಉ͡Α͏ͳ൑ఆ΍ॲཧ͕ෳ਺ϑΝΠϧʹଘࡏ͢Δ • ڞ௨͍ͯ͠ΔॲཧΛNPEFM΍VUJMJUZʹ·ͱΊΔ ϢχοτςετͷංେԽ ͭͷDPOUSPMMFS༻ͷϢχοτςετ͕ߦ͋Δɺɺɺ • DPOUSPMMFS͔ΒϩδοΫΛNPEFMͱVUJMJUZ ෳ਺࡞੒ ʹҠಈ͠ɺͦ͜ʹϢχοτςετΛॻ͖ɺ DPOUSPMMFSͷϢχοτςετΛ࡟Δ ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ • ෆਖ਼ͳ஋Λ࡞ΓͮΒ͍Α͏ʹ͢Δ • 5ZQF4DSJQUԽ͢Δ
  13. ˜-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  ෆਖ਼ͳ஋Λ࡞ΓͮΒ͍Α͏ʹͨ͠ 5ZQF4DSJQUͷܕͰͷറΓ ى͜Γಘͳ͍ঢ়ଶΛ࡞Εͳ͍Α͏ʹ͢ΔͨΊʹɺPQUJPOBMQSPQFSUZͷଟ༻ΛͳΔ΂͘ආ͚࣮ͯ૷ͨ͠ ΦϒδΣΫτͷϓϩύςΟΛ্ॻ͖Ͱ͖ͳ͍Α͏ʹ͢Δ ҎԼΛར༻ͨ͠ɻେ͖ͳ഑ྻ΍ΦϒδΣΫτͷ৔߹͸ɺFTMJOUEJTBCMF͢Δ৔߹΋͋Δ • !UZQFTDSJQUFTMJOUQSFGFSSFBEPOMZ

    • !UZQFTDSJQUFTMJOUQSFGFSSFBEPOMZQBSBNFUFSUZQFT • UZQFGFTUTͷ3FBEPOMZ%FFQ ؔ਺ͷ໭Γ஋ͷܕΛ໌ࣔతʹ͢Δ !UZQFTDSJQUFTMJOUFYQMJDJUGVODUJPOSFUVSOUZQFΛ࢖ͬͯɺҙਤͤ͵ؔ਺ͷ໭Γ஋ͷܕͷมߋΛ๷͙ͨ Ίʹɺ໭Γ஋ͷܕΛॻ͘͜ͱΛඞਢʹͨ͠
  14. ˜-:$PSQPSBUJPO DPOUSPMMFSͰى͖͍ͯΔ໰୊΁ͷղܾࡦ  5ZQF4DSJQUԽ  EFUBJMKTΛίϐʔͯ͠ɺEFUBJMUTΛ࡞੒͢Δ  UTOPDIFDL Λ࠷ॳͷߦʹ௥Ճ͢Δ 

    ܕΛ௥Ճ͢Δ JNQPSU͍ͯ͠ΔKTϑΝΠϧʹ͸EUTΛ༻ҙ͢Δ  UTOPDIFDLΛ֎͢  ܕ͕͚ͭΒΕ͍ͯͳ͍΋ͷ͸ɺͻͱ·ͣBOZʹ͢Δ 50%0ίϝϯτ͖ͭ  ॲཧΛNPEFMͱVUJMJUZϑΝΠϧͱͯ͠੾Γग़ͯ͠ܕΛ͚͍ͭͯ͘  EFUBJMKTͷ։ൃ͸೔ʑਐΜͰ͍͘ͷͰɺఆظతʹ௥͍͖ͭ࡞ۀΛߦ͏
  15. ˜-:$PSQPSBUJPO  ݁Ռ  DPOUSPMMFSTͰى͖͍ͯΔ໰୊  ϩδοΫ͕ूத͍ͯ͠Δ DPOUSPMMFSʹ͋Δ΂͖Ͱͳ͍ॲཧ͕ଘࡏ͢Δ  ϩδοΫͷॏෳ

    ಉ͡Α͏ͳ൑ఆ΍ॲཧ͕ෳ਺ϑΝΠϧʹଘࡏ͢Δ  ϢχοτςετͷංେԽ  ܕ͕ͳ͍ͷͰɺ࣮ߦ࣌ʹͳͬͯॳΊͯൃ֮͢ΔΤϥʔ͕ଟ͍ ݁Ռ  NPEFMͱVUJMJUZʹॲཧΛ·ͱΊΔ͜ͱͰɺϩδοΫͷେ෦෼͕DPOUSPMMFS͔Βফ͑ͨ  NPEFMͱVUJMJUZʹॲཧΛ·ͱΊΔ͜ͱͰɺಉ͡ϩδοΫͷ܁Γฦ͕͠ݮͬͨ  ࣌ؒͷ౎߹্վળ͸Ͱ͖ͳ͔͕ͬͨɺNPEFMͱVUJMJUZʹϢχοτςετΛ͜Ε͔Β௥Ճ͍͚ͯ͠͹ɺ DPOUSPMMFSͷϢχοτςετΛେ෼࡟ݮ͢Δ͜ͱ͕Ͱ͖ͦ͏  ܕ͕͍ͭͨͨΊɺ࣮ߦ࣌ʹॳΊͯൃ֮͢ΔΤϥʔͷ਺͸͜Ε·ͰΑΓݮΔ༧ఆ