10年を超えるレガシーwebサービスの重複ライブラリを削除してコード量を2:3にした話

 10年を超えるレガシーwebサービスの重複ライブラリを削除してコード量を2:3にした話

Webアプリケーションのコードも歴史的経緯から歪な形へとなっていくもの。
私の担当しているサービスでは同じPEARライブラリが重複を気にせずたくさん入れられ、
一筋縄では解けないほどの複雑なファイル依存関係が出来上がりました。

一度ハマってしまえば二度と抜け出せない底なし沼のような依存関係を解決すべく、
重複したPEARライブラリと調査・特定・composerへ追い出して
結果的に12万行(リポジトリの1/3)削除した話をしようと思います。

同じようにレガシーPHPを扱っていて、
DRYでないコードに苦しんでいる方々の参考になれたらと思います。

B989cc865d53d8e26fdadac99727113c?s=128

Satoshi Kawashima

July 02, 2016
Tweet

Transcript

  1. ઒ౡܛ(.01&1"#0JOD :"1$"4*")"$)*0+* ೥Λ௒͑ΔϨΨγʔ8FCαʔϏε ͷॏෳϥΠϒϥϦΛ࡟আͯ͠ίʔυ ྔΛʹͨ͠࿩

  2. ΤϯδχΞ ઒ౡܛ!CBSJF ຊࣾࣄۀ෦+6(&.νʔϜ IUUQOB[POPIJUPKVHFNKQ

  3. +6(&.

  4. ಥવͰ͕͢ɺ օ͞Μ͸%3:Ͱͳ͍ίʔυʹ ೰ΜͰ·ͤΜ͔ʁ

  5. +6(&.Ͱ͸ ͱͯ΋೰ΜͰ͍·ͨ͠

  6. طଘͷ࡞Γͱ໰୊఺

  7. ΞϓϦέʔγϣϯίʔυͷߏ଄ w ΞϓϦέʔγϣϯϧʔτ഑Լʹ΋ 1&"3ύοέʔδ͕ஔ͔Ε͍ͯΔ w ϥΠϒϥϦஔ͖৔͕̏ͭ͋Γɺ1&"3 ύοέʔδͱࣗ࡞ΫϥεΛஔ͔Εͯ ͍Δ w ʹܭ̐Օॴʹ1&"3ύοέʔδ͕

    ஔ͔Ε͍ͯΔঢ়ଶ w ಉ͡1&"3ύοέʔδ͕߹ܭݸஔ ͔ΕͯΓ͍ͯ͠Δ /path/to/app /path/to/php/lib PEARύοέʔδ … libraryA libraryB PEARύοέʔδ … PEARύοέʔδ … libraryC PEARύοέʔδ …
  8. ͜ͷ࡞Γʹࠔͬͯ·ͨ͠

  9. MJCSBSZ" MJCSBSZ# ϥΠϒϥϦͷ࢖ΘΕํ 1&"3ύοέʔδ 1&"3ύοέʔδ 1&"3ύοέʔδ ࣗ࡞Ϋϥε ΤϯτϦ ϙΠϯτ JODMVEF@QBUIʹ

    MJCSBSZ"Λ௥Ճ 1&"3ύοέʔδ 1&"3ύοέʔδ 1&"3ύοέʔδ ʢಠࣗमਖ਼͋Γʣ ૬ରύεͰͷSFRVJSF ઈରύεͰͷSFRVJSF
  10. ൃੜ͍ͯͨ͠໰୊ͷ۩ମྫ ΤϯτϦ ϙΠϯτ JODMVEF@QBUIʹ MJCSBSZ#Λ௥Ճ MJCSBSZ# MJCSBSZ" 1&"3ύοέʔδ 1&"3ύοέʔδ 1&"3ύοέʔδ

    ࣗ࡞Ϋϥε ΤϯτϦ ϙΠϯτ 1&"3ύοέʔδ 1&"3ύοέʔδ 1&"3ύοέʔδ ʢಠࣗमਖ਼͋Γʣ ಉ͡1&"3ύοέʔδʢʹΫϥεʣͰΫ ϥεೋॏఆٛʹΑΓ'BUBM&SSPS ࣮͸ಉ͡1&"3ύοέʔδʢʹΫϥεʣ ͰɺΫϥεೋॏఆٛʹΑΓ'BUBM&SSPS JODMVEF@QBUIʹΑͬͯ ͳΜ͔ಈ͖ํ͕ҧ͏ ૬ରύεͰͷSFRVJSF ઈରύεͰͷSFRVJSF
  11. ͜ͷ࡞Γͷ໰୊఺ w 1&"3͸JODMVEF@QBUIʹґଘͨ͠ϥΠϒϥϦ w 1&"3ʹґଘ͍ͯ͠ΔΫϥε΋JODMVEF@QBUIʹґଘͯ͠͠·͏ w JODMVEF@QBUIͰಈ͖͕มΘΔͷ͕ͦͷΫϥεͷਖ਼ͱͳͬͯ͠·ͬͯ΋͏ς ετͰ͖ͳ͍ w ϑΝΠϧύε͕ҧ͏͔ΒSFRVJSF@PODFͰΫϥεೋॏఆٛΛ๷͛ͳ͍

    w ্هͷಈ͖͕ݏͩͬͨΒɺࠓޙࣗ࡞ΫϥεΛ࡞ΔࡍɺMJCSBSZ" # $ʹಉ͡Ϋ ϥεΛ࡞Βͳ͍ͱ͍͚ͳ͍
  12. վળ͢Δͧʂʂ̍

  13. ઒ౡܛ(.01&1"#0JOD :"1$"4*")"$)*0+* ೥Λ௒͑ΔϨΨγʔ8FCαʔϏε ͷॏෳϥΠϒϥϦΛ࡟আͯ͠ίʔυ ྔΛʹͨ͠࿩

  14. վળํ๏Λߟ͑Δ

  15. ͦ΋ͦ΋Կ͕͍͚ͳ͍ͷ͔ʁ

  16. 1&"3͕͋ͪͪ͜ʹόϥ͚͍ͯΔͷ͕ ͓͔͍͠

  17. ֎෦ϥΠϒϥϦ͸ ύοέʔδ؅ཧπʔϧͰ؅ཧ͞Εɺ ҰՕॴʹूΊΒΕ͍ͯΔ΂͖

  18. ΍Γ͍ͨ͜ͱ wՄೳͳݶΓҰݩԽͯ͠ॏෳΛݮΒ͢ w1&"3ύοέʔδΛ؅ཧͰ͖͍ͯΔঢ়ଶʹ͢Δ wQFBSίϚϯυΛ࢖Θͳ͍ʢʹΞϓϦͱΠϯϑϥΛಠཱʣ DPNQPTFSԽͩʂ

  19. ղܾํ਑  ࢖ΘΕͯͳ͍ύοέʔδΛ࡟আ͢Δ  શͯͷ1&"3ύοέʔδͷਖ਼ମΛ໌Β͔ʹ͢Δ  Ҡߦ͢ΔύοέʔδͷϦετΛ࡞੒͢Δ  DPNQPTFSΛಋೖ͢Δ 

    DPNQPTFS΁ύοέʔδΛҠߦ
  20. ࢖ΘΕ͍ͯͳ͍ύοέʔδΛ࡟আ͢Δ

  21. ࢖ΘΕ͍ͯͳ͍ύοέʔδΛ࡟আ͢Δ w1&"3ύοέʔδ͸શମͰݸɺॏෳ࡟আ͢Δͱछஔ͔Ε͍ͯΔ w͕͢͞ʹݸશ෦࢖ͬͯΔͳΜͯͳ͍Ͱ͠ΐ͏ɾɾɾ w࢖ΘΕ͍ͯͳ͍ͷΛҰൃͰ஌Δํ๏͸ͳ͍͕ɺ࢖ΘΕ͍ͯΔ΋ͷͳΒ1)1ϓϩ ηεࣗ਎͕஌͍ͬͯΔ͸ͣ

  22. 1)1ϓϩηε͔Β࢖͍ͬͯΔϑΝΠϧΛฉ͖ग़͢ wHFU@JODMVEFE@pMFT Λ࢖͏ͱSFRVJSF͞ΕͨϑΝΠϧ͕BSSBZͰೖखͰ͖Δ wSFRVJSF͞ΕͨϑΝΠϧΛͻͨ͢Βϩά࠾ू͢Ε͹ɺ࢖ΘΕ͍ͯͳ͍ύοέʔ δ͕෼͔Δ͸ͣ array(3) { [0]=> string(35) “/path/to/app/get_included_files.php”

    [1]=> string(21) “/path/to/app/hoge.php” [2]=> string(21) “/path/to/app/fuga.php” }
  23. ϩά࠾ूํ๏Λߟ͑Δ wSFRVJSF͞ΕͨશͯͷϑΝΠϧΛग़ͯ͠ཉ͍͠ͷͰɺ1)1ϓϩηεऴྃ࣌ʹϩ άग़ྗ͍ͨ͠ wBVUP@QSFQFOE@pMFͱSFHJTUFS@TIVUEPXO@GVODUJPO ͷ߹ΘٕͤΛ࠾༻ wBVUP@QSFQFOE@pMF͸ඞͣ࠷ॳʹSFRVJSF͢ΔϑΝΠϧΛࢦఆ͢ΔQIQJOJͷ σΟϨΫςΟϒ wSFHJTUFS@TIVUEPXO@GVODUJPO ͸1)1ϓϩηεऴྃ࣌ͷॲཧΛొ࿥͢Δ GVODUJPO

  24. ࢖ΘΕ͍ͯͳ͍ύοέʔδ͕൑໌ͨ͠ w̍ϲ݄ϩά࠾ूΛଓ͚ͯɺ࢖ΘΕ͍ͯͳ͍ύοέʔδ͕෼͔ͬͨ wݸͷύοέʔδΛ࡟আ

  25. 1&"3ύοέʔδͷਖ਼ମΛ໌Β͔ʹ͢Δ

  26. શͯͷ1&"3ύοέʔδͷਖ਼ମΛ໌Β͔ʹ͢Δ wQFBSίϚϯυͷ؅ཧΛ཭Εͨύοέʔδ͸໊લ΋όʔδϣϯ΋෼͔Βͳ͍ w1&"3ͷαΠτ͔ΒҰ௨ΓύοέʔδΛམͱ͖ͯͯ͠ɺͻͨ͢ΒEJ⒎ΛऔΓଓ ͚ͯਖ਼ମΛ͖ͭͱΊΔ wίʔυ΍σΟϨΫτϦߏ੒·Ͱ͍͡ΒΕ͍ͯΔ΋ͷ΋͋Δ wਓؒͷ໨ͰݟΔ͔͠ͳ͍ wۜͷ஄ؙ͸ແ͍ɾɾɾ ʹؤுΔ

  27. ؤுͬͨ݁Ռ wΘΓͱग़དྷͨ w͍͍ͩͨಉ࣌͡ʹೖΕΒΕ͍ͯΔͷͰɺϦϦʔε೔͔ΒόʔδϣϯΛ༧૝Ͱ͖ ͨ w޾ӡʹ΋ಠࣗमਖ਼ͷ͍ͤͰόʔδϣϯͷ൑ผʹࠔΔ͜ͱ͸গͳ͔ͬͨ w1&"3͸όʔδϣϯ্͕͕Δͱ݁ߏίʔυ͕มΘΔͷͰɺͦΕ΄Ͳ൑அʹࠔ Βͳ͔ͬͨ w̍࣌ؒͷ࡞ۀ ̏िؒ͘Β͍Ͱ׬ྃͨ͠

  28. 3&"%.&Λஔ͍ͯύοέʔδ͕෼͔ΔΑ͏ʹͨ͠

  29. Ҡߦ͢ΔύοέʔδͷϦετΛ࡞੒͢Δ

  30. Ҡߦ͢ΔύοέʔδͷϦετΛ࡞੒͢Δ wશମͰόʔδϣϯ൪߸͕ಉ͡ύοέʔδΛ·ͱΊΔ wόʔδϣϯ൪߸͕όϥόϥͷ΋ͷ͸༏ઌॱҐΛ͚ͭΔ wQFBSίϚϯυͰΠϯετʔϧ͞Ε͍ͯͨ΋ͷ͸࠷༏ઌ w࣍ʹΫϥεΛू໿͠Α͏ͱ͍ͯͨ͠MJCSBSZ" wಠࣗमਖ਼΋ͨͩͷ֦ுʢϝιου௥ՃɺܧঝΫϥε௥ՃʣͰ͋Ε͹ࣗ෼ͨͪͰ ϗετ͢Δ w֦ுલͱಉ͡࢖͍ํ΋Ͱ͖Δ͸͔ͣͩΒ

  31. ҰݩԽύοέʔδͷϦετ͕ग़དྷͨ wݸɺछͷύοέʔδ͕DPNQPTFS΁ૹΕΔͧʂ

  32. DPNQPTFSΛಋೖ͢Δ

  33. DPNQPTFSΛಋೖ͢Δ wDPNQPTFS͕ೖͬͯͳ͍ͷͰɺ৽͘͠ೖΕΔ wҠߦ͢ΔύοέʔδΛԿ΋ߟ͑ͣʹϦϙδτϦ͔Β࡟আ͍ͨ͠ͷͰɺͲ͔͜Β Ͱ΋DPNQPTFS͔ΒಡΈࠐΊΔঢ়ଶʹ͍ͨ͠ wDPNQPTFS͸BVUPMPBEQIQΛSFRVJSFͯ͠ॳΊͯಡΈࠐΊΔ ʹશͯͷΤϯτϦϙΠϯτͰBVUPMPBEQIQΛSFRVJSF͢Δ

  34. SFRVJSF࣌ͷ໰୊ JODMVEF@QBUIʹϥΠϒ ϥϦஔ͖৔#Λ௥Ճ ૬ରύεͰͷSFRVJSF ઈରύεͰͷSFRVJSF MJCSBSZ# MJCSBSZ" 1&"3ύοέʔδ 1&"3ύοέʔδ 1&"3ύοέʔδ

    ࣗ࡞Ϋϥε 1&"3ύοέʔδ 1&"3ύοέʔδ 1&"3ύοέʔδ ʢಠࣗमਖ਼͋Γʣ ΤϯτϦϙΠϯτͬͯͲ͜ʁ ΤϯτϦ ϙΠϯτ ΤϯτϦ ϙΠϯτ
  35. ΤϯτϦϙΠϯτ͕Ͳ͔͜෼͔Βͳ͍ w௕͍ྺ࢙ͷதͰશͯͷΤϯτϦϙΠϯτ͕೺ѲͰ͖ͳ͘ͳ͍ͬͯΔ wΞΫηεϩάΛͻͨ͢ΒಡΜͰಛఆ͢Δͷ͸ͭΒ͍ w͔ͩΒͱ͍ͬͯBVUP@QSFQFOE@pMF͸࢖͍ͨ͘ͳ͍ wQIQJOJΛݟͳ͍ͱڍಈ͕෼͔Βͳ͍ίʔυ͸/( w1)1ϓϩηε͞ΜɺΤϯτϦϙΠϯτͬͯͲ͔͜஌Γ·ͤΜ͔ɾɾɾʁ

  36. ஌ͬͯͨ @4&37&3<b4$3*15@/".&`>

  37. ΤϯτϦϙΠϯτΛ୳ͦ͏ w@4&37&3<b4$3*15@/".&`>ʹ͸ݱࡏͷεΫϦϓτͷύε͕ೖ͍ͬͯΔʢʹ ࠷ॳʹ࣮ߦ͞Εͨ1)1ϑΝΠϧʣ wΫʔϩϯ͔Βͷ࣮ߦ΍ɺ$-*͔Βͷ࣮ߦͰ΋औಘՄೳ w͜ΕΛͻͨ͢ΒϩάऩूΛଓ͚Ε͹ɺ͍ͣΕશͯͷΤϯτϦϙΠϯτ͕෼͔Δ wϩάऩूํ๏͸ɺ࢖ΘΕ͍ͯͳ͍ύοέʔδΛ୳ͨ࣌͠ͱಉ͡ํ๏

  38. ΤϯτϦϙΠϯτ͕෼͔ͬͨ wݸ͋ͬͨ wΤϯτϦϙΠϯτશͯͰBVUPMPBEQIQΛSFRVJSFͨ͠ wίʔυશମͰDPNQPTFS͔ΒύοέʔδΛಡΈࠐΊΔΑ͏ʹͳͬͨ wԿ΋ߟ͑ͣʹDPNQPTFS΁ૹΔύοέʔδΛ࡟আͰ͖Δʂʂ

  39. DPNQPTFS΁ύοέʔδΛҠߦ

  40. DPNQPTFS΁ύοέʔδΛҠߦ wDPNQPTFSͰೖΕͨύοέʔδ΁JODMVEF@QBUIΛ௨͢ w௨͠ํӠʑ͸DPNQPTFSࣗମͷ࿩ʹͳΔͷͰɺৄࡉ͸ׂѪ wDPNQPTFS΁ҠߦͰ͖ͳ͔ͬͨύοέʔδ΋͋ΔͷͰɺJODMVEF@QBUIͷ༏ઌॱ ҐΛௐ੔͢Δඞཁ͕͋Δ wҠߦͰ͖ͳ͔ͬͨύοέʔδ͸DPNQPTFSΑΓ༏ઌͯ͠ಡΈࠐΈ͍ͨ

  41. MJCSBSZ# JODMVEF@QBUIΛௐ੔͢Δ )551  QBUIUPQIQMJC )551@)FBEFS  )551@3FRVFTU  JODMVEF@QBUI༏ઌॱҐ

    ߴ ௿ )551@3FRVFTU  ಠ֦ࣗு DPNQPTFS΁ Ҡߦ͢Δ ύοέʔδ ҠߦෆՄ ύοέʔδ %#  ಠࣗमਖ਼
  42. MJCSBSZ# JODMVEF@QBUIΛௐ੔͢Δ )551  QBUIUPQIQMJC )551@)FBEFS  )551@3FRVFTU  JODMVEF@QBUI༏ઌॱҐ

    ߴ ௿ )551@3FRVFTU  ಠ֦ࣗு DPNQPTFS΁ Ҡߦ͢Δ ύοέʔδ ҠߦෆՄ ύοέʔδ DPNQPTFS )551  )551@)FBEFS  )551@3FRVFTU  ಠ֦ࣗு %#  %#  ಠࣗमਖ਼
  43. MJCSBSZ# JODMVEF@QBUIΛௐ੔͢Δ JODMVEF@QBUI༏ઌॱҐ ߴ ௿ DPNQPTFS΁ Ҡߦ͢Δ ύοέʔδ ҠߦෆՄ ύοέʔδ

    DPNQPTFS )551  )551@)FBEFS  )551@3FRVFTU  ಠ֦ࣗு %#  %#  ಠࣗमਖ਼
  44. طଘͷύοέʔδΛ࡟আͯ͠ɺ Ҡߦ׬ྃʂ

  45. ݁Ռͱ·ͱΊ

  46. ݁Ռ wݸͷύοέʔδͷ಺ɺݸͷύοέʔδΛ࡟আͰ͖ͨ wίʔυߦ਺͸ ߦ͔Β ߦ΁ʢສߦ࡟আʣ w·ͩݸɺछͷύοέʔδ͕࢒͍ͬͯΔɾɾɾ

  47. ·ͱΊ wॏෳ͞Εͨ1&"3ύοέʔδΛ࡟আͯ͠ίʔυͷݟ௨͕͠ͱͯ΋ྑ͘ͳͬͨ wΫϥεͷೋॏఆٛ΍ɺJODMVEF@QBUIͰಈ͖͕มΘΔ͜ͱ΁ͷෆ͕҆গͳ͘ͳͬ ͨ wࣗ࡞ΫϥεΛMJCSBSZ" # $ʹྔ࢈͢Δඞཁ͕গͳ͘ͳͬͨʢ͸ͣʣ wΞϓϦͱΠϯϑϥ͕੾Γ཭͞ΕͯɺϦϙδτϦΛݟΔ͚ͩͰશମΛ೺ѲͰ͖Δ Α͏ʹͳͬͨ w·ͩݸɺछͷύοέʔδ͕࢒͍ͬͯΔͷͰɺߴ͍όʔδϣϯʹ·ͱΊΔ

    ܗͰͳΜͱ͔͍ͨ͠
  48. ॴײ wϨΨγʔ1)1͸ΞϓϦέʔγϣϯͷղੳ͕ͨͼͨͼٻΊΒΕΔ͚Ͳɺίʔυಡ ΜͰ΋ͳ͔ͳ͔೺ѲͰ͖ͳ͍ wίʔυϨϕϧͷղੳ͸͖͍͕ͭɺϑΝΠϧϨϕϧͳΒΘΓͱ1)1ϓϩηε͔Β ৘ใΛऔΕͯ໾ʹཱͭ wFYSFRVJSFͨ͠ϑΝΠϧɺΤϯτϦϙΠϯτ wϩάͷग़ྗํ๏͸BVUP@QSFQFOE@pMFͱSFHJTUFS@TIVUEPXO@GVODUJPO ͷ߹ Θٕ͕ͤΦεεϝ