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

[JA] High-Performance Android: Rebirth of our US App

mercari
September 30, 2017
2.1k

[JA] High-Performance Android: Rebirth of our US App

mercari

September 30, 2017
Tweet

Transcript

  1. Summary • US の Mercari アプリを 6 月に刷新しました • 大刷新した

    UI & アーキテクチャ • 全ての選択にはプロダクトをより良くするための理由がある • Mercari Android チームならではの “High 意識” なチームワーク
  2. 1. 誰でも同じコードが書けるようにする View View Model Service Repository • Activity /

    Fragment / View • 唯一 Context を触れることができるレイヤ • ViewModel に従うだけ (No logic) • 表示と直接関係ないロジックを持つ • Network access...etc • 全てのロジックは stateless で、Service は状 態を持ってはいけない • 表示に関するロジックを持つ • Pure java であり、JUnit testable • データを持っているレイヤ • 格納場所を意識せずにアクセスできるインター フェースを持つ
  3. 共通の武器 (RxJava2) を持ってハイコンテキストな議論 配送方法と重さと配送負担が変 更になったら送料計算し直す Flowable.combineLatest ( shippingClass, shippingPayer, (c,

    p) -> { .... } 適当なフィールドが入力されてて たら処理する .filter (signal -> !itemName.get().isEmpty() && itemCategory.has() && itemCondition.has()) .flatMapMaybe(signal -> ... 連打防止 (backpressure) RxTextView .textChangeEvents(hashTag) .throttleLast ( 100, TimeUnit.MILLISECONDS )....
  4. DI 知ってますよね? 直接関係ない問題は 外の人に解いてもらう class SellService { private SellApi sellApi;

    private ItemApi itemApi; private AddressApi addressApi; private SuggestApi suggestApi; SellService(ItemApi itemApi, SellApi sellApi, AddressApi addressApi, SuggestApi suggestApi) { this.sellApi = sellApi; this.itemApi = itemApi; this.addressApi = addressApi; this.suggestApi = suggestApi; }
  5. DI 知ってますよね? 自分が解くべき事に注力 /** * Get user's default deliver address.

    */ @CheckReturnValue Maybe<DeliverAddress> getDefaultAddress() { return addressApi.getDeliverList() .filter(resp -> !resp.addresses.isEmpty()) .map(resp -> { Optional<DeliverXX> address = Stream.of(resp.addresses) .filter(addr -> Defaults.get(addr.isDefault)) .findFirst(); if (address.isPresent()) { return address.get(); } else { // if couldn't found default, use first one return resp.addresses.get(0); } }); }
  6. 2. 全ての問題を適切なサイズに落として解く • View / ViewModel / Service / Repository

    未満の大きさに • 基本的にコンストラクタへの injection を利用する あれ、でも Activity や Fragment ってコンストラクタ無い … Dagger2 !!
  7. Activity へ inject コンストラクタに触れないクラ スへの injection を実装する public class ItemDetailActivity

    extends BaseActivity { @Inject ItemDetailViewModel viewModel; @Inject UrlConstruct urlConstruct; @Inject MasterData masterData; ... @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_item_detail); AppComponent.Holder.get(this) .plus(new ItemDetailComponent.Module(this, itemId)) .inject(this);
  8. 2. 全ての問題を適切なサイズに落として解く • 問題がシンプルだと、ゴールへの距離が詰めやすい • 他のメンバーとの • Unit test を書くのが容易になり、Unit

    test が動作確認の最速の手段になる • (副産物) Dagger2 の scope を駆使して、 Activity lifecycle の対処も打てた コミュニケーション 続きは
  9. Kotlify progress 隔週で - Tokyo / San Francisco の Kotlin

    事 情の交換 - テクニカルな面での情報交換 - but still we’re looking for a strong reason, why Kotlin? Google I/O の Kotlin サポート発表以来、新規ファイルは全て Kotlin
  10. 太平洋横断開発の難しさと挑戦 コードを書く前に作戦レビュー 高品質 Pull Request 大きい要件にはブランチ戦略 早起き Screen hero (雑な)

    日報 たまに出張 共通の設計図 共通の武器 「ハイパフォーマンスな開発チームというのは ...あqwせdrftgyふじこ !!!」(← やらない) 意識高い系 High 意識 「とりあえずこれ上手くいきそうだからやろう。意識たかいたかーい」 (← やる)
  11. High Scalable Android チーム in the near future… 100 Android

    Engineers More than 100 times performance
  12. Summary • US の Mercari アプリを 6 月に刷新しました • 爆速かつハイパフォーマンスなチームを目指したアーキテクチャで、改めて

    US 市場を 取りに行く • そしてその先はメンバーが増えれば増えるほどパフォーマンスが上がっていく、スケー ラブルなチームを作り、”新たな価値を生みだす世界的なマーケットプレイス” を実現し たい • We’re High 意識、いしきたかいたかーい