アゞャむルAPI-可胜ですか

倚くの蚘事や本は、APIを適切に蚭蚈する方法に専念しおいたすが、絶えず倉化する柔軟なAPIのトピックに觊れた人はほずんどいたせん。 動的に開発しおいる䌚瀟は、倚くの堎合、週に数回、堎合によっおは1日にリリヌスしたす。 ただし、新しい機胜を远加するには、既存のAPIを垞に倉曎する必芁がありたす。 この蚘事では、Badooでこの問題をどのように解決するか、䜜業でどのようなアプロヌチずアむデアを䜿甚するかに぀いお説明したす。



たず、Badooに぀いおもう少し話をしお、APIを䜿甚するナヌザヌず、なぜ頻繁に倉曎されるのかを理解する必芁がありたす。





内郚APIずその䜿甚



Badoo APIメッセヌゞングプロトコルは、クラむアントずサヌバヌ間で亀換されるデヌタ構造メッセヌゞず倀列挙のセットです。 プロトコル構造は、 Google protobuf定矩に基づいお蚭定され、別のgitリポゞトリに保存されたす。 これらの定矩に基づいお、さたざたなプラットフォヌムのモデルクラスが生成されたす。



サヌバヌず5぀のクラむアントAndroid、iOS、Windows Phone、モバむルWeb、デスクトップWebの6぀のプラットフォヌムで䜿甚されたす。 さらに、各プラットフォヌムのいく぀かのスタンドアロンアプリケヌションで同じAPIが䜿甚されたす。 これらすべおのアプリケヌションずサヌバヌが必芁な情報を亀換できるように、私たちのAPIは十分に倧きくなっおいたす。 いく぀かの数字







い぀これを行う必芁がありたすか 昚日



Badooでは、可胜な限り迅速に新機胜を実装するよう努めおいたす。 ロゞックは単玔です。新しい機胜を備えたバヌゞョンがすぐに衚瀺されるほど、ナヌザヌはそれらをより速く䜿甚できたす。 さらに、A / Bテストを䞊行しお実斜したすが、この蚘事では詳しく説明したせん。



機胜の実装時間アむデアからリリヌスたでは、芁件の蚘述、APIず技術文曞の倉曎、新しいバヌゞョンの実装ずリリヌスを含む、わずか1週間の堎合がありたす。 平均しお、すべおに玄1か月かかりたす。 ただし、これは、アプリケヌションごずに月に1぀の機胜を远加するこずを意味するものではありたせん。 私たちは倚くの新機胜に䞊行しお取り組んでいたす。



そのような偉業を成し遂げるためには、適切な速床で移動できるプロセスを開発する必芁がありたした。



どちらの偎にアプロヌチしたすか



たずえば、補品の所有者は新しいアむデアを提䟛し、API開発者にプロトコルを拡匵しおクラむアント偎に新しい機胜を実装するように䟝頌したす。

たず、倚くの人々が新しい機胜の実装に取り​​組んでいるこずを理解する必芁がありたす。







党員がお互いを理解し、同じ蚀語を話すこずをどのように保蚌できたすか 機胜芁件 PRD を説明する文曞が必芁です。通垞、このような文曞は補品所有者が䜜成したす。 圌は、芁件、ナヌスケヌス、フロヌの説明、デザむンスケッチなどのリストを含むWikiペヌゞを䜜成したす。



PRDに基づいお、APIに必芁な倉曎の蚈画ず実装を開始できたす。



ここでも、すべおがそれほど単玔ではありたせん。



プロトコル蚭蚈アプロヌチ



サヌバヌずクラむアント間の「責任の分散」には倚くのアプロヌチがありたす。 アプロヌチの範囲は、「すべおのロゞックがサヌバヌに実装されおいる」から「すべおのロゞックがクラむアントに実装されおいる」たでです。 各アプロヌチの長所ず短所に぀いお説明したす。



オプション1。すべおのロゞックがサヌバヌに実装されたすクラむアントはMVCテンプレヌトからのビュヌずしお機胜したす。



長所





短所





オプション2。すべおのロゞックはクラむアントに実装されたす-クラむアントアプリケヌションはすべおのロゞックを含み、サヌバヌをデヌタ゜ヌスずしお䜿甚したすほずんどのパブリックAPIで䞀般的。



長所





短所





䞀方では、最初のアプロヌチでは、サヌバヌにビゞネスロゞックを1回だけ実装し、それをすべおのクラむアントで䜿甚できたす。 䞀方、異なるプラットフォヌムは、独自の特性、トヌクンの独自の構造、異なる機胜セットによっお特城付けられ、機胜自䜓は異なる時間に実装されるこずがよくありたす。 ほずんどの堎合、プロトコルをよりデヌタ指向にするず、クラむアントアプリケヌションがある皋床自由になり、独自の方法で動䜜できるようになりたす。 しかし、い぀ものように、単䞀の正しい゜リュヌションはないため、これら2぀のアプロヌチの間で絶えずバランスを取っおいたす。



技術文曞



数幎前、圓瀟が小芏暡だったずき、プロトコルを䜿甚したクラむアントは2぀AndroidずiOSだけでした。 開発者はほずんどいなかったので、すべおの䜜業時間に぀いお口頭で話し合ったため、プロトコルのドキュメントには、protobuf定矩のコメントに䞀般的なロゞックの説明しか含たれおいたせんでした。 通垞、次のようになりたした。



プロトコル仕様のドキュメント



その埌、さらに3぀のクラむアントプラットフォヌムが登堎したした。WindowsPhone、モバむルWeb、デスクトップWeb、およびAndroidおよびiOSチヌムの開発者の数は3倍に増加したした。 口頭での議論はより高䟡になり、すべおを泚意深く文曞化する時が来たず刀断したした。 珟圚、このドキュメントには、フィヌルドコメントだけではありたせん。 たずえば、機胜、シヌケンス図、スクリヌンショット、サンプルメッセヌゞの簡単な説明を远加したす。 最も単玔な堎合、ドキュメントは次のようになりたす。



詳现なドキュメント



6぀のプラットフォヌムすべおのアプリケヌションおよびQA開発者は、このドキュメントずPRDを䞻芁な知識源ずしお䜿甚したす。



このドキュメントは、新しい関数の実装だけでなく、既に実装されおいる機胜がどのように機胜するかを知る必芁がある堎合に、アプリケヌションの倧幅な再蚭蚈ずリファクタリングにも圹立ちたす。



RTFM開発者に簡単に䌝えるこずができるようになり、時間を倧幅に節玄できたす。 さらに、このアプロヌチは、初心者がすべおがどのように機胜するかを理解し、開発プロセスにすばやく関䞎するのに圹立ちたす。



提䟛ドキュメント



reStructuredText圢匏の技術文曞を準備し、プロトコル定矩ずずもにgitリポゞトリに保存し、 Sphinxを䜿甚しお、瀟内ネットワヌクの䌚瀟の埓業員が利甚できるHTMLバヌゞョンを生成したす。



ドキュメントは、プロトコルの実装のさたざたな偎面やその他の問題に焊点を圓おたいく぀かの䞻芁なセクションに分かれおいたす。







そのため、APIに倉曎を加えたした。 次は



PRDに基づいおプロトコルずドキュメントに倉曎を加えた埌、PRDずAPIの䞡方がレビュヌの2぀の段階を経たす。 たず、プロトコルを担圓するチヌム内で、次にこの機胜が実装されるプラットフォヌムのアプリケヌション開発者向けです。



この段階で、次の問題に関するフィヌドバックを受け取りたす。







すべおの倉曎に぀いお話し合っお承認した埌、サヌバヌチヌムずクラむアントチヌムは機胜の実装に進むこずができたす。



この段階で仕䞊げるのは良いこずです。 倚くの堎合、ProductOwnerはこの機胜を改善する蚈画を既に持っおいたすが、珟圚の圢匏でアプリケヌションをリリヌスしたいず考えおいたす。 たたはさらに興味深い。 あるプラットフォヌムに察しお倉曎を行うように求められるこずがありたすが、残りのプラットフォヌムに぀いおはすべおをそのたたにしおおきたす。



子䟛ずしおの特城、それは成長し、発達したす



機胜が開発䞭です。 A / Bテストを実斜し、新機胜のリリヌス埌にフィヌドバックを分析したす。 分析により、機胜を改善する必芁があるこずが瀺される堎合がありたす。 次に、補品所有者がPRDを倉曎したす。 そしお、「問題」が発生したす。 珟圚、PRDはプロトコルおよびドキュメント圢匏に準拠しおいたせん。 さらに、あるプラットフォヌムでは既に倉曎が行われおおり、他のチヌムはただ始たったばかりである可胜性がありたす。 起こりうる競合を防ぐために、PRDバヌゞョン管理を䜿甚したす。 たずえば、あるプラットフォヌムでは、バヌゞョンR3に埓っお機胜を実装できたす。 しばらくしお、プロダクトオヌナヌは新しい機胜を改良し、PRDをバヌゞョンR5に曎新するこずにしたした。 そしお、PRDの新しいバヌゞョンを反映するために、プロトコルず技術文曞を曎新する必芁がありたす。



PRDの曎新を監芖するには、 Confluence Atlassian wikiの倉曎履歎を䜿甚したす。 プロトコルの技術文曞では、WikiペヌゞのアドレスにPageVersion = 3を指定するか、倉曎履歎からリンクを取埗するだけで、PRDの特定のバヌゞョンぞのリンクを远加したす。 これにより、各開発者は特定の機胜が実装されおいるPRDのバヌゞョンたたは郚分に基づいお垞に認識しおいたす。



PRDのすべおの倉曎は、新しい機胜ず芋なされたす。 補品所有者は、倉曎を開発に送信するずきが来るたで、倉曎R1、R2 ...を蓄積したす。 圌らは、プロトコルの必芁な倉曎を蚘述するAPI開発者向けのタスクを準備し、その埌、異なるプラットフォヌムを担圓するすべおの開発チヌムが同じタスクを受け取りたす。 次の䞀連の倉曎が機胜の準備ができるず、別のチケットが䜜成されおAPIが完成し、すべおのプラットフォヌムの倉曎が同じ方法で実装されたす。



API倉曎手順



PRDの倉曎リストを受け取ったら、このプロセスの最初に戻りたす。぀たり、プロトコルなどに倉曎を加えたす。 もちろん、これは私たちの生掻を耇雑にしたす。R3バヌゞョンに基づく以前に実装された機胜ずクラむアントアプリケヌションをサポヌトする必芁性を誰もキャンセルしおいないためです。 この問題を解決するには、いく぀かのプロトコル倉曎管理ツヌルを䜿甚したす。



プロトコル倉曎管理



前のセクションでは、PRDバヌゞョン管理に぀いお説明したした。 APIでこれらの倉曎を実装するには、プロトコルバヌゞョン管理のオプションを怜蚎する必芁がありたす。 簡単にするために、長所ず短所がある3぀のオプションレベルがあるず蚀えたす。



プロトコルレベル



このアプロヌチは、ゆっくりず倉化するパブリックAPIに広く䜿甚されおいたす。 プロトコルの新しいバヌゞョンが出おきたら、すべおのクラむアントは叀いバヌゞョンの代わりに䜿甚を開始する必芁がありたす。 䞀連の機胜があり、プラットフォヌムによっお実装時間が非垞に異なるため、このオプションは䜿甚できたせん。 たずえば、プロトコルにはいく぀かのバヌゞョンがありたす。







したがっお、アプリケヌションに機胜Dを実装する必芁がある堎合は、機胜BをバヌゞョンBにアップグレヌドする必芁がありたすが、珟圚は必芁ありたせん。



Badooでは、このアプロヌチでバヌゞョン管理を行ったこずはありたせん。 この堎合、次の2぀のオプションの方が適しおいたす。



メッセヌゞベヌスのバヌゞョン管理



このアプロヌチでは、関数に倉曎を加えた埌、新しいフィヌルドセットで新しいメッセヌゞが䜜成されたすprotobufのデヌタ構造。 芁件が倧幅に倉曎された堎合、このアプロヌチはうたく機胜したす。



たずえば、Badooでは、各ナヌザヌがアルバムを持っおいたす。 以前は、ナヌザヌは独自のアルバムを䜜成しお写真を入れるこずができたした。



AddPhotoToAlbumV1 {

required string album_id = 1;

required string photo_id = 2;

}









次に、プロダクトオヌナヌは、3皮類の事前定矩枈みのアルバムで十分だず刀断したした。私の写真私の写真、他の写真他の写真、プラむベヌト写真個人写真です。 クラむアントがこれらの3぀のタむプを区別するには、enumを远加する必芁がありたした。 したがっお、メッセヌゞの次のバヌゞョンは次のようになりたす。



AddPhotoToAlbumV2 {

required AlbumType album_type = 1;

required string photo_id = 2;

}









このアプロヌチは正圓化される堎合もありたすが、泚意する必芁がありたす。 倉曎がすべおのプラットフォヌムですぐに実装されない堎合、叀いバヌゞョンず新しいバヌゞョンの䞡方をサポヌトする新しい倉曎を远加する必芁がありたす。぀たり、混乱が増倧したす。



フィヌルド/倀レベル



可胜な限り、同じメッセヌゞたたは列挙を䜿甚しお、いく぀かのフィヌルド/倀を削陀するか、新しいフィヌルド/倀を远加したす。 これはおそらく、私たちの実践で最も䞀般的なアプロヌチです。



䟋



AddPhotoToAlbum {

optional string album_id = 1 [deprecated=true];

optional string photo_id = 2;

optional AlbumType album_type = 3;

}









この堎合、クラむアントアプリケヌションは匕き続き叀いメッセヌゞを䜿甚し、新しいバヌゞョンのアプリケヌションはalbum_idの代わりにalbum_typeを䜿甚できたす。



ずころで、垞にオプションのフィヌルドを䜿甚したす。 これにより、必芁に応じおフィヌルドを削陀できたすGoogle開発者は同じ結論に達したした 。



プロトコル倉曎サポヌト



前述のように、APIはサヌバヌず5぀のクラむアントプラットフォヌムで䜿甚されたす。 クラむアントアプリケヌションの新しいバヌゞョンは毎週リリヌスされたす1か月あたり玄20のバヌゞョンのアプリケヌションがあり、動䜜が異なり、プロトコルのさたざたな郚分を䜿甚できたす。したがっお、アプリケヌションの新しいバヌゞョンごずにプロトコルの新しいバヌゞョンを䜜成するこずはできたせん。 プロトコルのバヌゞョン管理に察するこのアプロヌチでは、サヌバヌが䜕千もの異なるアプリケヌションの組み合わせをサポヌトする必芁がありたす。 この゜リュヌションは理想ずはほど遠いものです。



そのため、各アプリケヌションがサポヌトするプロトコルバヌゞョンに関する情報をサヌバヌに即座に送信するオプションを決定したした。 この堎合、サヌバヌは、アプリケヌション自䜓が提䟛するサポヌトされおいる機胜のリストに䟝存するだけで、任意のクラむアントアプリケヌションず察話できたす。



たずえば、最近「新機胜」機胜を実装したした。 したがっお、アプリケヌションの新機胜に぀いおナヌザヌに通知したす。 この機胜をサポヌトするアプリケヌションは、SUPPORTS_WHATS_NEWフラグをサヌバヌに送信したす。 その結果、サヌバヌは、クラむアントに新しい機胜に関するメッセヌゞを送信でき、それらが正垞に衚瀺されるこずを認識しおいたす。



画像



APIで順序を維持する方法は



これがパブリックAPIである堎合、通垞は特定の日付が決定され、その埌、叀い郚分が機胜しなくなりたす。 Badooの堎合、これはほずんど䞍可胜です。叀い機胜のサポヌトを削陀するよりも、新しい機胜を実装する方が重芁だからです。 このような状況では、3段階の手順に埓いたす。



最初の段階では、プロトコルの䞀郚を削陀するこずを最終的に決定するずすぐに「廃止」ずマヌクされ、すべおのクラむアントプラットフォヌムのアプリケヌション開発者が察応するコヌドを削陀するタスクを受け取りたす。



第2段階では、プロトコルの叀い郚分をすべおのクラむアントのコヌドから削陀する必芁がありたすが、サヌバヌ䞊のこのコヌドを長時間削陀するこずはできたせん。すべおのナヌザヌがアプリケヌションをすばやく曎新するわけではありたせん。



最埌の段階で、廃止されたコヌドがすべおのクラむアントアプリケヌションから削陀され、プロトコルのこの郚分を䜿甚するバヌゞョンが䜿甚されなくなった堎合、サヌバヌコヌドおよびAPIから削陀できたす。



コミュニケヌション



この蚘事では、借甚たたは䜜成したいく぀かの技術的および組織的アプロヌチに぀いお説明したした。 ただし、コミュニケヌションの問題に぀いおは䞀切觊れたせんでした。 しかし、コミュニケヌションは私たちの仕事の80です。 倚くの堎合、この機胜がプロトコルレベルでどのように実装されるかを理解する前に、倚くの人々ず機胜自䜓および可胜な実装パスに぀いお議論する必芁がありたす。



成功するプロゞェクトの基瀎は、適切に調敎されたチヌムの努力です。 幞いなこずに、ほずんどの開発者は、暙準化なしでさたざたなプラットフォヌムの゜リュヌションを䜿甚するこずがいかに難しいかをよく知っおいるため、私たちをサポヌトしおいたす。



十分に文曞化されたAPIは、開発者ではない人々がAPI自䜓ずその開発プロセスを理解するのにも圹立぀こずを認識したした。 テスタヌはテスト䞭にドキュメントを参照し、プロダクトオヌナヌはそれを䜿甚しお、プロトコルの倉曎を最小限に抑えおタスクの゜リュヌションを考え出したすそう、すばらしいプロダクトオヌナヌがいたす。



おわりに



柔軟なAPIず関連プロセスを開発するずきは、忍耐匷く実甚的である必芁がありたす。 プロトコルずプロセスは、コマンド、゜フトりェアずプラットフォヌムのバヌゞョン、アプリケヌションの叀いバヌゞョンのさたざたな組み合わせで動䜜し、他の倚くの芁因も考慮する必芁がありたす。 それでも、これは非垞に興味深いタスクであり、珟時点ではほずんど情報が公開されおいたせん。 したがっお、この分野でのベストプラクティスを共有できたこずを非垞に嬉しく思いたす。 ご枅聎ありがずうございたした



All Articles