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

15年目のiOSアプリをフルリニューアルする苦しみと次の15年のために今できること / The...

15年目のiOSアプリをフルリニューアルする苦しみと次の15年のために今できること / The Struggles of Completely Renewing a 15-Year-Old iOS App and What We Can Do Now for the Next 15 Years

Yahoo!オークションアプリは15年間の運用開発を経て多くの技術負債を抱えていましたが、私達はその解消のためにフルスクラッチでリニューアルを行いました。

リニューアルは大変な苦労が伴いましたが、それ以上にやってよかったと感じることも多くありました。

長く続くサービスの運用で負債や品質に課題を持っている方に向けて、具体的な事例を紹介することで、刷新の検討や長期的なサービス開発について考える機会にします。

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

Other Decks in Technology

Transcript

  1.  :BIPP+"1"/"VDUJPO"QQ3FOFXBM :BIPPΦʔΫγϣϯΞϓϦͷϦχϡʔΞϧ  #BDLHSPVOEPGUIF3FOFXBM ϦχϡʔΞϧͷഎܠ  3FOFXBM1SPKFDU0WFSWJFX ϦχϡʔΞϧϓϩδΣΫτ 

    5FDIOPMPHZ#FIJOEUIF/FXJ04"QQ ৽ΞϓϦͷٕज़  3FTVMUTPGUIF3FOFXBM1SPKFDU ϓϩδΣΫτΛऴ͑ͯ  -PPLJOH"IFBEUPUIF/FYU:FBST ࣍ͷ೥ʹ޲͚ͯ "HFOEB ΞδΣϯμ
  2. 1SPKFDU5FBNT ։ൃମ੍ 5FBN .FNCFST 3FTQPOTJCJMJUJFT 1MBOOJOH  %FUFSNJOJOHTQFDJGJDBUJPOT DSFBUJOHTQFDJGJDBUJPOEPDVNFOUT %FTJHO

     $SFBUJOHBQQEFTJHO J04  J04BQQEFWFMPQNFOU "OESPJE  "OESPJEBQQEFWFMPQNFOU #''  $SFBUJOHBMM"1*TVTFECZJ04BOE"OESPJEBQQT 'JWFTQFDJBMJ[FEUFBNTXPSLFEUPHFUIFSUPEFWFMPQJ04BOE"OESPJEBQQT ͭͷઐ໳νʔϜ͕࿈ܞ͠ɺJ04ɾ"OESPJEͷ྆04ͷΞϓϦΛ։ൃͨ͠ɻ
  3. 5JNFMJOF λΠϜϥΠϯ    "QS4FQ 0DU.BS "QS4FQ 1IBTF 1IBTF

    J043FMFBTF "OESPJE3FMFBTF 1IBTF 8FFYQFSJFODFEUISFFQIBTFTEVSJOHPVSNPOUIQSPKFDU ೥൒ͷ։ൃظؒ͸ͭͷϑΣʔζʹ෼͔Εͨɻ
  4. 'FBUVSF%FWFMPQNFOU"QQSPBDI ػೳ։ൃͷਐΊํ )PNF *UFN%FUBJM 4FBSDI .Z1BHF &YIJCJU "QSJM +VMZ "VHVTU

    4FQUFNCFS 0DUPCFS /PWFNCFS $PODFOUSBUFEEFWFMPQNFOUQFSJPEGPSSFWJFX 3FWJFX%BUF    "QS4FQ 0DU.BS "QS4FQ 1IBTF 8FEFWFMPQFETFWFSBMGFBUVSFTTJNVMUBOFPVTMZBOEDPOEVDUFESFHVMBSSFWJFX DZDMFT ෳ਺ͷػೳΛฒߦ࣮ͯ͠૷͠ɺఆظతʹ֤ػೳͷϨϏϡʔΛͨ͠ɻ
  5. 'FBUVSF%FWFMPQNFOU$ZDMF0VUDPNFT ػೳ։ൃαΠΫϧͷ݁Ռ Advantages Disadvantages  %FWFMPQNFOUNPUJWBUJPOJODSFBTFEJOQSFQBSBUJPOGPS SFWJFXT ϨϏϡʔʹ޲͚ͯ։ൃͷϞνϕʔγϣϯ͕ߴ·ͬͨɻ  %FWFMPQJOHGFBUVSFTXJUINPDLTXIJMFTQFDT"1*TXFSF

    TUJMMJODPNQMFUFMFEUPTJHOJGJDBOUBNPVOUPG UFDIOJDBM EFCU ࢓༷΋"1*΋ະ׬੒ͷ··ϞοΫΛ࢖ͬͯػೳΛ࡞ͬͨͨΊɺଟ͘ͷෛ࠴ ͕࢒ͬͨɻ  6ODMFBSQSPKFDUQSPHSFTTNBEFJUJNQPTTJCMFUPTFUUIF SFMFBTFTDIFEVMF ϓϩδΣΫτશମͷਐ௙౓͕ෆ໌ྎʹͳΓɺϦϦʔεεέδϡʔϧͷݟ ௨ཱ͕ͨ͠ͳ͘ͳͬͨɻ 8IJMFJUJODSFBTFEEFWFMPQNFOUNPUJWBUJPO JUBMTPBDDVNVMBUFEUFDIOJDBM EFCUBOENBEFUIFSFNBJOJOHXPSLFGGPSUVODMFBS ։ൃͷϞνϕʔγϣϯΛߴΊͨҰํͰɺٕज़ෛ࠴͕૿͑࢒Γͷ޻਺΋ෆ໌ྎʹͳͬͨɻ
  6. %FWFMPQNFOU1BVTFGPS#VH#BTI όάग़͠ͷ࣮ࢪ 1MBOOFE "DUVBM 0DUPCFS /PWFNCFS %FDFNCFS +BOVBSZ 'FCSVBSZ .BSDI

    "QSJM 5FTU %FWFMPQNFOU 1BVTF %FWFMPQNFOU #VH'JYFT  #VHT %VFUPVODMFBSQSPKFDUQSPHSFTT XFQBVTFEEFWFMPQNFOUGPSBUFBNXJEF CVHCBTI UIFOQSPDFFEFEXJUIGJYJOHUIFJEFOUJGJFEJTTVFT ϓϩδΣΫτͷਐ௙౓͕ෆ໌ྎʹͳͬͨͨΊɺ౓։ൃΛࢭΊͯશϝϯόʔͰόά΍ະ࣮૷ͷՕॴΛચ͍ग़͠ɺमਖ਼Λߦͬͨɻ    "QS4FQ 0DU.BS "QS4FQ 1IBTF #VH #BTI
  7. -PHHJOH*NQMFNFOUBUJPO /POGVODUJPOBM*NQMFNFOUBUJPO $PEF3FGBDUPSJOH 5FTU .BZ +VOF +VMZ "VHVTU 4FQUFNCFS "GUFSCVHGJYFT

    XFDPOUJOVFEEFWFMPQNFOUBOEUFTUJOHUPSFGJOFUIFBQQGPS SFMFBTF όάमਖ਼ޙ΋ɺϦϦʔεʹ޲͚ͯ։ൃͱςετΛॏͶͯΞϓϦΛຏ͖ࠐΜͩɻ "QQ3FGJOFNFOU ΞϓϦͷຏ͖ࠐΈ 3FMFBTF    "QS4FQ 0DU.BS "QS4FQ 1IBTF
  8. 5FDIOPMPHZ4FMFDUJPO ٕज़બఆ ,FZ*TTVFTPGUIFQSFWJPVTBQQ 4FMFDUFE5FDIOPMPHJFT *ODPOTJTUFOU"SDIJUFDUVSF ΞʔΩςΫνϟͷࠞࡏ 6OJGJFE"SDIJUFDUVSF ౷Ұ͞ΕͨΞʔΩςΫνϟ (SPXJOH044.BJOUFOBODF$PTUT 044ӡ༻ίετͷ૿େ

    $BSFGVMMZ4FMFDUFE044 ݫબͨ͠044ͷ࠾༻ -FHBDZ-BOHVBHF%FQFOEFODJFT ϨΨγʔݴޠͷଘࡏ .PEFSO-BOHVBHF ࠷৽ͷݴޠ΁౷Ұ 8FBEPQUFEUFDIOPMPHJFTUIBUDPVMESFTPMWFUIFJTTVFTPGUIFQSFWJPVTBQQ چΞϓϦͷ՝୊ΛղফͰ͖Δٕज़Λ࠾༻ͨ͠ɻ
  9.       1SFWJPVT"QQ /FX"QQ 6*69 /FUXPSL

    "SDIJUFDUVSF 0UIFS $BSFGVMMZ4FMFDUFE044 ݫબͨ͠044ͷ࠾༻ 044$PVOUBOE$BUFHPSZ$IBOHFT 8FMJNJUFEPVS044BEPQUJPOUPMJCSBSJFTJOUIFOFXBQQ EFDSFBTJOHUIF OVNCFSPG6*69BOEOFUXPSLJOHMJCSBSJFTGSPNUIFQSFWJPVTBQQ ৽ΞϓϦͰ͸044ΛछྨͷΈΛ࠾༻ͨ͠ɻچΞϓϦʹൺ΂ɺ6*69ͱ௨৴ͷ044͕ݮগͨ͠ɻ 6*69 6TFE044POMZGPSIBSEUPJNQMFNFOUGFBUVSFT ࣗ࡞͕೉͍͠ػೳΛ࣋ͭ044ͷΈ࠾༻ /FUXPSL 6OJGJFENVMUJQMF044VTFEGPSUIFTBNFQVSQPTF ಉ͡༻్Ͱ࠾༻͞Ε͍ͯͨෳ਺ͷ044Λͭʹ౷Ұ
  10. "EEJUJPOBM#FOFGJUT ٕज़ෛ࠴ͷฦࡁҎ֎ͷԸܙ ⎯ 4UBOEBSEJ[FE%FTJHO(VJEFMJOFT ౷Ұ͞ΕͨσβΠϯఆٛͷಋೖ ⎯ &OIBODFE6OJU5FTUJOH$PWFSBHF Ϣχοτςετͷॆ࣮ ⎯ "EPQUJPOPG/FX5FDIOPMPHJFT

    ৽ٕज़ͷಋೖ 5IFSFOFXBMHBWFVTBHSFBUDIBODFUPNBLFPVSEFWFMPQNFOUFOWJSPONFOU CFUUFS ϦχϡʔΞϧΛػʹΑΓྑ͍։ൃ؀ڥΛ࣮ݱͨ͠ɻ
  11. Text(“Hello, world!”) .font(.displayLarge) .foregroundStyle(.primary) 4UBOEBSEJ[FE%FTJHO(VJEFMJOFT $PMPS ౷Ұ͞ΕͨσβΠϯఆٛͷಋೖ 1SJNBSZ 4FDPOEBSZ 5ZQPHSBQIZ

    %JTQMBZ-BSHF QY %JTQMBZ4NBMM QY %JTQMBZ.FEJVN QY BOENPSF *OUFHSBUJOHUIFEFTJHOTZTUFNJOUPUIFDPEFFOBCMFEIJHIMZNBJOUBJOBCMFBOE FGGJDJFOU6*DPNQPOFOUT σβΠϯγεςϜΛίʔυʹ૊ΈࠐΉ͜ͱͰɺมߋʹڧ͘։ൃޮ཰ͷߴ͍6*ίϯϙʔωϯτΛ࣮ݱͨ͠ɻ BOENPSF %FTJHO4ZTUFN &BTJMZBEBQUBCMFUPEFTJHOTZTUFNDIBOHFT σβΠϯγεςϜͷมߋʹ΋௥ैͰ͖Δ࣮૷Λ࣮ݱ
  12. &OIBODFE6OJU5FTUJOH$PWFSBHF Ϣχοτςετͷॆ࣮ @Suite("Verify bid button display logic") struct shouldShowBidButton {

    @Test("Should display bid button when user is not the seller") func shouldShowBidButton_for_notSeller() { vm.item.isSeller = false #expect(vm.shouldShowBidButton) } @Test("Should hide bid button when user is the seller") func shouldShowBidButton_for_seller() { vm.item.isSeller = true #expect(!vm.shouldShowBidButton) } } .BJOUBJOBCJMJUZJNQSPWFECZEPDVNFOUJOHTQFDJGJDBUJPOTJOUFTUDPEF ࢓༷Λςετίʔυʹ໌ه͢Δ͜ͱͰอकੑ͕޲্ͨ͠ɻ Ϣʔβʔ͕ग़඼ऀͰͳ͍ͱ͖͸ೖࡳϘλϯΛදࣔ͢Δ Ϣʔβʔ͕ग़඼ऀͷͱ͖͸ೖࡳϘλϯΛදࣔ͠ͳ͍
  13. $IBOHFTJO%FWFMPQNFOU.FUSJDT ։ൃʹ·ͭΘΔ਺ࣈͷมԽ 1SFWJPVT"QQ /FX"QQ -JOFTPG$PEF  MJOFT  MJOFT #VJME5JNF

    NJOVUFT NJOVUFT "QQ4J[F .# .# $SBTI3BUF   %FWFMPQNFOUFGGJDJFODZBOEBQQRVBMJUZTJHOJGJDBOUMZJNQSPWFE ։ൃޮ཰΍ΞϓϦͷ඼࣭͕େ͖͘޲্ͨ͠ɻ
  14. $IBOHFTJO%FWFMPQFS.PUJWBUJPO ։ൃऀͷϞνϕʔγϣϯͷมԽ ⎯ 5IFVTFPGNPEFSOUFDIOPMPHJFTNBEFEFWFMPQNFOUFGGJDJFOUBOEFOKPZBCMF ࠷৽ͷٕज़Λ࢖ͬͯޮ཰తʹ։ൃ͕Ͱ͖ΔͨΊɺ։ൃָ͕͘͠ͳͬͨɻ ⎯ 5IFNPOUIQSPKFDUFOIBODFEUFDIOJDBMTLJMMTBOECVJMUDPOGJEFODF ೥൒ͷϓϩδΣΫτΛ௨ٕͯ͠ज़ྗ্͕͕Γࣗ৴͕͍ͭͨɻ ⎯ 8FEFWFMPQFEBTFOTFPGPXOFSTIJQBOEBUUBDINFOUUPUIFBQQXFDSFBUFE

    ࣗ෼ୡͰ࡞ͬͨΞϓϦͱͯ͠ѪணΛ࣋ͯΔΑ͏ʹͳͬͨɻ ⎯ 8FHBJOFEJOJUJBUJWFUPQSPBDUJWFMZQSPQPTFOFXGFBUVSFT ΤϯδχΞ͔Β৽ػೳΛఏҊ͢ΔΑ͏ͳओମੑΛ࣋ͯΔΑ͏ʹͳͬͨɻ %FWFMPQFSNPUJWBUJPOJNQSPWFE MFBEJOHUPBNPSFQPTJUJWFBOEQSPBDUJWF BUUJUVEFUPXBSEEFWFMPQNFOU ։ൃऀͷϞνϕʔγϣϯ͕޲্͠ɺΑΓલ޲͖ͳ࢟੎Ͱ։ൃʹऔΓ૊ΉΑ͏ʹͳͬͨɻ
  15.       1SF3FOFXBM "U-BVODI .POUIT .POUIT

    "QQ4UPSF3BUJOH5SFOET 6TFS'FFECBDL Ϣʔβʔ͔ΒͷධՁ *NDPOGVTFECZUIFTVEEFODIBOHFJOUIFBQQ *NIBQQZXJUINZTIPQQJOH *UTWFSZVTFSGSJFOEMZ BOEDPOWFOJFOU *OJUJBMOFHBUJWFSFDFQUJPOHSBEVBMMZTIJGUFEUPQPTJUJWFGFFECBDL ϦχϡʔΞϧ௚ޙ͸ωΨςΟϒͳҙݟ͕ଟ͔͕ͬͨɺঃʑʹϙδςΟϒͳҙݟ͕૿͑ͨɻ
  16. -PPLJOH"IFBEUIF/FYU:FBST ⎯ $POUJOVPVTMZLFFQVQXJUIUIFMBUFTUUFDIOPMPHJFT ࠷৽ͷٕज़ΛΩϟονΞοϓ͠ଓ͚Δɻ ⎯ *NQMFNFOUGFBUVSFTJOIPVTFXIFOQPTTJCMF SBUIFSUIBOPWFSSFMZJOHPODPOWFOJFOU044 ศརͳ044ʹཔΓ͗ͣࣗ͢࡞Ͱ͖Δ΋ͷ͸ࣗ࡞͢Δɻ ⎯ $POUJOVFXSJUJOHTJNQMFBOEIJHIRVBMJUZDPEF

    ؆ܿͰ࣭ͷߴ͍ίʔυΛॻ͖ଓ͚Δɻ ⎯ $POUJOVPVTMZSFEVDFUFDIOJDBMEFCUUPFOTVSFBDPNGPSUBCMFEFWFMPQNFOUFYQFSJFODF ܧଓٕͯ͠ज़ෛ࠴ΛݮΒ͠ɺؾ࣋ͪΑ͘ίʔυΛॻ͚Δঢ়ଶΛอͭɻ ⎯ %PDVNFOUTQFDJGJDBUJPOTGPSGVUVSFSFGFSFODF ࢓༷ΛυΩϡϝϯτͱͯ͠࢒͢ɻ ࣍ͷ೥ʹ޲͚ͯ 4VDDFTTPWFSUIFOFYUZFBSTEFQFOETPOPVSDPOTJTUFOUEBJMZFGGPSUT ࠓޙ೥ؒͷ੒௕͸ɺ೔ʑܧଓͯ͠౒ྗͰ͖Δ͔Ͳ͏͔ʹ͔͔͍ͬͯΔɻ
  17. :VLJ5BLFEB +VNQFJ,PXBTIJ 5IBOL:PV ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 5IFGBUFPGPVSXBUDI04BOEUW04BQQ XBUDI04ΞϓϦͱUW04ΞϓϦͷ຤࿏ 3FMFBTF%BZ*ODJEFOU3FTQPOTF1MBO ϦϦʔε࣌ͷো֐ରԠܭը "QQSPBDIFTUPNJHSBUJOHGSPNUIFQSFWJPVTBQQ چΞϓϦ͔ΒͷϚΠάϨʔγϣϯͷ޻෉

    4USVHHMFTXJUIUFYUCBTFEDPNNVOJDBUJPO ςΩετϕʔεͷίϛϡχέʔγϣϯͷ೉͠͞ 8FIBWFNPSFTUPSJFTUPTIBSF TPQMFBTFKPJOVTBU"TLUIF4QFBLFS ଞʹ΋঺հ͍ͨ͠Τϐιʔυ͕ͨ͘͞Μ͋ΔͷͰɺͥͻ"TLUIF4QFBLFS΁͓ӽ͍ͩ͘͠͞ʂ