UberがSwiftでiOSアプリを曞き盎した方法

それで、友達、茪になっお座っお、私が参加した最倧の工孊灜害の話を聞いおください。これは、政治、建築、および沈没コストの論理的誀りに぀いおの話です申し蚳ありたせんが、私は今、Aberlour Cask Strength Single Malt Scotchを飲んでいたす。





2016幎でした。トランプはただ倧統領に遞出されおいないため、DeleteUber運動 はただ始たっおいたせん。トラビス・カラニックはゞェンダヌのたたでした。私たちは他の囜に支店を開蚭するこずで過激な成長の段階を経隓しおいたした。䞖論は抂しお前向きで、誰もが幞せで、ナヌバヌは最高です。



しかし、過成長には問題がないわけではなく、アプリケヌション自䜓が誀動䜜し始めたした。それ以前は、開発者の数はほが毎幎2倍になり、その速さで成長するず、信じられないほど幅広いスキルを身に付けるこずができたす。 「ビルダヌズビルド」ず呌ばれるハッカヌの考え方ず盞たっお、これは耇雑で壊れやすいアプリケヌションアヌキテクチャを意味したした。圓時、Uberアプリのロゞックは非垞に重いため、クラッシュするこずがよくありたした。私たちは垞にホットフィックス、パッチ、蚈画倖のリリヌスなどをリリヌスしおいたした。たた、アヌキテクチャはうたく拡匵できたせんでした。



これらすべおの問題の結果ずしお、「アプリケヌションを最初から曞き盎す」ずいう考えを䞭心に結集した組織のすべおのレベルで成長する動きが始たりたした。新しいアプリケヌション甚の新しいモバむルアヌキテクチャを䜜成するためにチヌムが結成されたした。アむデアは、「今埌5幎間でUberのモバむル開発をサポヌトする」アヌキテクチャを䜜成するこずでした。䞡方のプラットフォヌム甚に同時に開発したした。開発サむクル党䜓が最初からやり盎したした。



iOS郚門は、この機䌚を利甚しおSwift圓時はバヌゞョン2.xを実装したした。 Uberは過去にSwiftを詊したこずがありたすが、テクノロゞヌ開発の初期段階で他の倚くの人ず同様に、倚くの問題が発生し、実装が遅れたした。



ただし、圓時のSwiftの問題のほずんどは、Objective-Cずの盞互運甚性が䜎いこずが原因であるず䞀般的に感じられおいたした。そしお、玔粋なSwiftアプリケヌションを䜜成すれば、䞻な問題を回避できたす。



AndroidずiOSの䞡方で同じ基本的なアヌキテクチャパタヌンを䜿甚するずいうアむデアもありたした。圓時、Android開発者はRxJavaの倧ファンでした。察応するRxSwiftラむブラリは、Swiftの機胜プログラミングパラダむムを利甚したした。すべおが単玔に芋えた。



そのため、小芏暡な開発チヌム蚭蚈、補品、およびアヌキテクチャは、数か月間、新しい機胜/リアクティブパタヌン、新しい蚀語、および新しいアプリケヌションに真っ向から取り組みたした。すべおが順調でした。このアヌキテクチャは、Swiftの高床な蚀語機胜に倧きく䟝存しおいたした。



UIは倚数のUberアプリに拡匵でき、機胜プログラミングパラダむムは匷力に芋え習埗は少し難しいですが、アヌキテクチャは新しいリアルタむムストリヌミングネットワヌクプロトコルに基づいおいたしたこの郚分を䜜成したした。



数ヶ月ずいく぀かの印象的なデモの埌、運動は勢いを増したした。プロゞェクトは成功したように芋えたした。少数の゚ンゞニアで、短時間で優れた機胜を開発するこずができたした。補品のほずんどは準備ができおいたす。マニュアルはきれいです。



その埌、党瀟ぞの展開が始たりたした。さたざたなチヌムが、新しいアプリケヌションに独自の機胜を远加し始めおいたす。最初は、新しいものの興奮がモチベヌションず生産性の急増を生み出したした。機胜の分離を提䟛するアヌキテクチャにより、迅速な進歩が可胜になりたした。



しかし、10人以䞊の゚ンゞニアがSwiftを習埗するずすぐに、適切に調敎されたメカニズムが厩壊し始めたした。 Swiftコンパむラは、珟圚でもObjective-Cよりも倧幅に䜎速ですが、実際には䜿甚できたせんでした。組み立お時間はスケヌルから倖れたした。デバッグが完党に停止したした。



デモの1぀からのビデオがあり、Uber゚ンゞニアがXcodeで1行の挔算子を入力し、45秒埅っおから文字が1぀ず぀ゆっくりず゚ディタヌに衚瀺されたす。



次に、動的リンカヌで壁にぶ぀かりたす。圓時、Swiftラむブラリは動的にしかリンクできたせんでした。残念ながら、リンカヌは倚項匏時間で実行されたため、1぀のバむナリでAppleが掚奚するラむブラリの最倧数は6でした。92があり、その数は増え続けたした...



その結果、アプリケヌションアむコンをクリックしおから、mainを呌び出すたでに8〜12秒かかりたした。私たちの光沢のある新しいアプリは、叀い厄介なアプリよりも遅いこずが刀明したした。次に、バむナリのサむズの問題がありたした。



残念ながら、問題が深刻に珟れ始めたずき、私たちはすでに戻っおこない点を過ぎおいたした。これは、沈没したコストの誀りの論理的な誀りです。その時点で、䌚瀟党䜓がすべおの゚ネルギヌを新しいアプリケヌションに投入しおいたした。



さたざたな方向からの䜕千人もの人々、数癟䞇ドル、数癟䞇ドル実際の数はわかりたせんが、1぀以䞊です。すべおの経営陣は、プロゞェクトを支揎する䞊で党䌚䞀臎です。私は䞊叞ず立ち止たる必芁性に぀いお個人的な䌚話をしたした。



圌は、このプロゞェクトが倱敗した堎合、圌は荷造りしなければならないず蚀った。䞊叞から副瀟長たで同じこずが蚀えたした。出口はありたせんでした。



そこで、私たちは袖をたくり䞊げお、それぞれの問題に取り組むための最高の開発者を獲埗し、重芁な問題動的リンク、バむナリサむズに優先順䜍を付けたした。動的リンクずバむナリのサむズの䞡方がこの順序で割り圓おられたした。



アプリケヌションの起動時のリンクの問題は、すべおのコヌドをメむンの実行可胜ファむルに配眮するこずで解決できるこずがすぐにわかりたした。しかし、ご存知のずおり、Swiftは名前空間ずフレヌムワヌクを組み合わせおいたす。したがっお、無数の名前名チェックを含む、倧幅なコヌド倉曎が必芁になりたす。



その埌、優秀なリチャヌド・ハり゚ルがXcodeのビルド出力を調べ、ビルドが完了した埌、カスタムスクリプトを䜿甚しお、すべおの䞭間オブゞェクトファむルを取埗し、それらをメむンバむナリに再リンクできるこずを発芋したした。



Swiftはコンパむル䞭にオブゞェクトの名前を歪めるため、Swiftを操䜜できるこずを意味したす。これにより、ラむブラリを効率的に静的にリンクし、mainの起動時間を10秒からほがれロに短瞮するこずができたした。



次の問題はサむズです。圓時、セヌフティネットずしお、新しいアプリケヌションを叀いアプリケヌションず䞀緒にパッケヌゞ化し、実行時に慎重に展開するこずを蚈画しおいたした。サむズを小さくするために、最初に行ったのは叀いアプリをアンむンストヌルするこずでした。この戊略を「Yolo」ず呌びたした。トラビスは個人的にゎヌサむンを出したした。



たた、すべおのSwift構造をクラスに眮き換えたした 。倀タむプは通垞、オブゞェクトの配眮ず、コピヌ動䜜、自動初期化などに必芁な远加のマシンコヌドのために、倚くのオヌバヌヘッドをもたらしたす。これにより、スペヌスが節玄されたした。



しかし、アプリは成長を続けたした。間もなく、iOS 8以前のバむナリのダりンロヌド制限100 MBに達したした。これは、かなりの数のむンストヌルの損倱に盞圓したす倚くのiOSナヌザヌがただ曎新されおいないため、1,000䞇ドル以䞊の収益が倱われおいたす。



この時点で、䞀般公開たでに数週間かかりたした。 Objective-Cに戻るか、iOS 8のサポヌトを終了する必芁がありたした。iOS9ではアヌキテクチャを分割する機胜が導入されたため、このバヌゞョンは実際には半分のサむズギブたたはテむクでした。残り1週間で、数千䞇ドルを捚お、iOS 8



のサポヌトをやめる こずにしたした。サむズが半分になるず、操䜜の䜙地が倧きくなり、サむズの問題は将来解決できるず䞀般的に考えられおいたした。残りをかき集めるずき。残念ながら、私たちは非垞に間違っおいたした。



アプリのリリヌス埌、私たちは倧芏暡なパヌティヌを開きたした。このアプリは、ナヌザヌやマスコミから奜評を博したした。明るく新しいデザむンで、高速でした。



倚くの人が昇進したした。私たちは皆、安堵のため息を぀いた。 90週間の連続䜜業の埌、圌らは぀いに䌑憩を取りたした。



しかし、その埌、䞖論は倉化し始めたした。新しいアプリは、特定のルヌトの旅行の正確な䟡栌を蚈算するこずに焊点を圓おおいたした昔は、運賃ず珟圚の乗数を芋ただけでした。䟡栌を蚈算するには、珟圚地を入力する必芁がありたした。



ナヌザヌの䟿宜のために、自動䜍眮決定もむンストヌルされおおり、バックグラりンドで䜍眮デヌタを収集できるため、ドラむバヌは珟時点で乗客を迎えに行く堎所を正確に確認できたす。人々は倢䞭になり始めたした。 Twitterの以前の同僚の䜕人かは、このような人々を远跡しおいる邪悪な䌚瀟を蟞めるように私に促したした。



この䞍安の結果ずしお、人々はiOSで䜍眮情報の蚱可を無効にし始めたした。しかし、新しいアプリケヌションはこのナヌスケヌスを提䟛したせんでした。



そこで、暙準バヌゞョンを返すように最善を尜くしたした。バックグラりンドの䜍眮远跡をオフにするこずは可胜ですが、タクシヌに乗る前に再び䜿いやすさが損なわれるこずを説明したした。



その埌、トランプが暩力を握りこれは新しいアプリのリリヌスから玄3か月埌に発生したした、それが連鎖反応を匕き起こし、DeleteUberの動きに぀ながりたした 。



この間ずっず、Swiftコヌドベヌスは急速に成長したした。進行䞭の問題ず遅いIDEにより、iOS開発者の間で2぀の察立する掟閥が生たれたした。私はそれらをSwift狂信者ずObjective-Cオタクず呌びたす。



倖圧ず内圧の合蚈が匵力を最倧にしたした。狂信者はスりィフトの問題を吊定した。退屈な人たちは、特別な解決策を提䟛するこずなく、考えられるすべおのこずに぀いお䞍平を蚀っおいたす。



この頃、バむナリのサむズに問題が発生したした。チヌムがリリヌスで問題を抱えおいたずき、私は電話に出おいたした。動的リンクの問題に察する優れた゜リュヌションにより、䞀郚のアヌキテクチャには倧きすぎる実行可胜ファむルが䜜成されたこずが刀明したした。



これらのアヌキテクチャの問題を解決したので、同僚の @aqua_geekず私は少し掘り䞋げおみるず、コンパむルされたコヌドのサむズが1週間あたり1.3MBの割合で増加しおいるこずがわかりたした。私は譊報を発した。䜕もしなければ、そのような速床で、3週間以内にセルラヌネットワヌクを介したダりンロヌド制限に遭遇したす。



しかし、内郚の緊匵は狂信者がすべおを吊定するような段階に達したした。 Swiftキャンプの技術リヌダヌの1人が、携垯電話のダりンロヌド制限がどのように問題にならないかに぀いお2ペヌゞの蚘事を曞きたした結局のずころ、Facebookはずっず前にそれを超えおいたした。私たち自身は火を消すのにうんざりしおいたす。



そこで、デヌタサむ゚ンティストの1人が、建築レむダヌの1぀を人為的に制限倖に移動するテストを開発し、ビゞネスパフォヌマンスぞの圱響を枬定したした。翌週、このレむダヌを元に戻し、別のレむダヌを制限から倖したしたアヌキテクチャを制埡するため。



その圱響は悲惚だった。ビゞネスぞの悪圱響は、毎幎のSwift実装のすべおのコストよりも数桁倧きいこずが刀明したした。 Uberアプリを初めおダりンロヌドしたずき、倚くの人がWiFiの範囲倖にいるこずがわかりたした誰が考えたでしょうか



そこで、別のストラむキグルヌプを結成したした。オブゞェクトファむルの逆コンパむルを開始し、1行ず぀調べお、Swiftコヌドが非垞に倧きくなった理由を特定したした。未䜿甚の機胜を削陀したした。タむラヌはwatchOSアプリをobjcに曞き盎す必芁がありたした。



りォッチアプリの長さはわずか4400行でしたが、プロセッサアヌキテクチャが異なり、ABIずの互換性がないため、Swiftランタむム党䜓をアプリに含める必芁がありたした。



私たちは限界に達した。すごく疲れた。しかし、圌らは集たった。その時、本圓に優秀な゚ンゞニアが珟れたした。アムステルダムの開発者の1人は、コンパむラ最適化パスを再配眮する方法を考え出したした。コンパむラの専門家でない方のために説明したす。



最新のコンパむラは倧量のパスを䜜成したす。たずえば、関数をむンラむン化できたす。もう1぀は、定数匏をそれらの倀に眮き換えるこずです。実行の順序に応じお、マシンコヌドは小さくなったり倧きくなったりする堎合がありたす。



むンラむン関数が倀を枡すず、コンパむラはこれを認識しおブロック党䜓を眮き換えるこずができたす。䟋えば



int x = 3
func(x) {
X + 4
}
      
      





コンパむラが最初にむンラむン関数を通過する堎合は、定数7になりたす぀たり、コヌドが倧幅に少なくなりたす。



このコンパむラパスが2番目の堎合、そのような関数を認識しない可胜性があり、より倚くのコヌドを取埗できたす。もちろん、これはすべお特定のコヌドの倖芳に完党に䟝存するため、䞀般にパスの順序を最適化するこずは困難です。



そのため、リリヌスビルドにアルゎリズムを組み蟌んで最適化パスを䞊べ替え、サむズを最小化したアムステルダムの優秀な゚ンゞニアは蚀いたした。これにより、マシンコヌドの合蚈サむズがなんず11MB削枛され、開発を続けるための時間が少し䞎えられたした。



しかし、このアプロヌチはSwiftコンパむラの専門家を怖がらせ、怜蚌されおいないコンパむラパスがテストされおいないバグを明らかにするこずを恐れおいたした各パスは本質的に安党であるはずですが、パスの可胜な組み合わせに぀いお掚論するこずは困難です。しかし、倧きな問題は発生しおいたせん。



たた、他の倚くの゜リュヌションを適甚したした特に高䟡なコヌドテンプレヌトに察応しおいたす。それぞれの開発週数を枬定したした。しかし、本圓の問題は成長曲線でした。結局、すべおの賞金は垞に食べ尜くされたした。



結局、Appleの動きを埅぀のに十分な時間があり、セルラヌ通信のダりンロヌド制限が150MBに匕き䞊げられたした。たた、サむズの最適化-Osizeに圹立぀倚数のコンパむラ関数も远加したした。圌ら自身の承認により、Swiftはコンパむル埌にObjective-Cほど小さくなるこずはありたせん。



しかし、今幎の時点で、SwiftをObjective-Cマシンコヌドの1.5倍のサむズに最適化し、最終的にAppleはオプションの制限を再び200MBに匕き䞊げたした。それは私たちをさらに数幎間続けるのに十分です。



しかし、私たちはほずんど倱敗したした。 Appleが制限を匕き䞊げおいなかったずしたら、UberアプリをObjCに曞き盎す必芁がありたした。結局、他の問題も解決するこずができたした。シャむニヌ @alanzeino圌のチヌムは、SwiftサポヌトをBuckビルドツヌルに含めるこずを可胜にしたした。これにより、ビルド時間が倧幅に短瞮されたした。



途䞭で燃え尜きた人をたくさん倱いたした。たくさんのお金を䜿い、難しい教蚓を孊びたした。驚いたこずに、今日たで、ほずんどの人は曞き盎しはそれだけの䟡倀があるず䞻匵しおいたす。アヌキテクチャの䞀貫性は、䌚瀟に来る新しい゚ンゞニアに人気がありたす。圌らはそれを達成するのにどれだけの苊痛がかかったかさえ知りたせん。



コミュニティは私たちの知識から恩恵を受けおいたす。 @ ellsk1は玠晎らしいプレれンテヌションをたずめ、圌の知識を共有するためにレクチャヌツアヌに参加したした。私もこの経隓を掻甚しお、新しい䌁業や開発チヌムがより良い決定を䞋せるように支揎するこずができたした。



だからここにヒントがありたす。プログラミングのすべおは劥協に぀いおです。普遍的に優れた蚀語はありたせん。䜕をするにしおも、劥協点ずは䜕か、なぜそれを䜜っおいるのかを理解しおください。瀟内の頑固な掟閥間の政治的戊争を避けおください。



倱敗のポむントで努力しおください。トレヌドオフを特定し、ポむントに到達しお間違いに気付いた堎合に撀退を残す方法を理解したす。倚くの努力にはコストがかかりたすが、埌で間違った劥協に気付くほど、コストは高くなりたす。



䞍平を蚀うだけで貢献しない退屈にならないでください。誰にずっおも倧きな問題を匕き起こす狂信者にならないでください。最高の゚ンゞニアは、これらの眠にはたりたせん。



All Articles