Transcript
Page 1: Conference withdevelopers 第二版

mixiにおけるiPhoneアプリ開発

株式会社ミクシィ  武田祐一

Page 2: Conference withdevelopers 第二版

略歴

•  武田祐一  •  株式会社ミクシィ エンジニア    

•  2012年4月 株式会社ミクシィに入社  •  同年6月 より iOSアプリ開発に  

Page 3: Conference withdevelopers 第二版

アウトライン

•  ミクシィでのiPhoneアプリの開発体制  – 大規模になる中でどうやってコードを維持するか    

•  コードのテクニックなどよりも、開発環境や周辺のツールなどについて

Page 4: Conference withdevelopers 第二版

mixi  iPhoneアプリ

•  アップデート回数  – 23回  (2012年)  

•  スマートフォンからのアクセス  – 月間800万ユーザー  

•  巨大なコードベース  –  .mファイルは574個  

Page 5: Conference withdevelopers 第二版

開発体制

•  開発チーム 計11人  – ディレクター 1人  – デザイナー 1人  – エンジニア  7人  – QAエンジニア  2人  

•  アジャイルな開発体制の一つ、スクラムを採用しています

Page 6: Conference withdevelopers 第二版

日々のデイリースクラムの様子

カンバン

スクラムによる開発

Page 7: Conference withdevelopers 第二版

開発していく上で大切にしていること

•  設計・コードベース  – オブジェクト指向  – MVCフレームワーク  

•  保守性  – テスト、CI  – コードレビュー  

Page 8: Conference withdevelopers 第二版

アプリの全体構成

mixi.jpのサーバー  

•  RESTful  API  •  JSONRPC

Mixi  Graph  Kit  モデル

コントローラ

ビュー

mixiの各機能

MVCフレームワークに則って設計

通信を管理する内製ライブラリ  

Page 9: Conference withdevelopers 第二版

MVCフレームワーク

モデル

• MixiGraphKitを通じたデータのやり取り

• ロジックを詰め込み、テストを書く

コントローラ

• モデルとビューの仲介

• ロジックは書かない

ビュー

• 画面構成・ユーザーアクションの検知

• できるだけxibを用いて作成

Page 10: Conference withdevelopers 第二版

オブジェクト指向

•  同じような画面やパーツを作ることはよくある  •  共通する部分は基底クラスを作ってサブクラ

ス化していく  – 一方で過度の多重継承は上位のクラスの改変が

難しくなるのでほどほどに  

Page 11: Conference withdevelopers 第二版

オブジェクト指向

•  クラス間の依存度はできるだけ下げる  – delegate,  NSNoRficaRonなどでクラス間の通知  – プロトコル準拠などで依存度を下げる

ViewControllerA    @propery  ModelA  *model

ModelA        -­‐(void)someMethod  {        //  モーダルを表示したい        //  viewControllerが必要  }

Page 12: Conference withdevelopers 第二版

オブジェクト指向

•  クラス間の依存度はできるだけ下げる  – delegate,  NSNoRficaRonなどでクラス間の通知  – プロトコル準拠などで依存度を下げる

ViewControllerA    @propery  ModelA  *model

ModelA    @property  ViewControllerA    *vcA    -­‐(void)someMethod  {          [vcA  presentModal…];  }

Page 13: Conference withdevelopers 第二版

オブジェクト指向

•  クラス間の依存度はできるだけ下げる  – delegate,  NSNoRficaRonなどでクラス間の通知  – プロトコル準拠などで依存度を下げる

ViewControllerA    @propery  ModelA  *model

ModelA    @property  ViewController    *vcA    -­‐(void)someMethod  {          [vcA  presentModal…];  }

Page 14: Conference withdevelopers 第二版

オブジェクト指向

•  クラス間の依存度はできるだけ下げる  – delegate,  NSNoRficaRonなどでクラス間の通知  – プロトコル準拠などで依存度を下げる

ViewControllerA    @propery  ModelA  *model

ModelA    @property  ViewController    *vcA    -­‐(void)someMethod  {          [vcA  presentModal…];  }

依存

依存

Page 15: Conference withdevelopers 第二版

オブジェクト指向

•  クラス間の依存度はできるだけ下げる  – delegate,  NSNoRficaRonなどでクラス間の通知  – プロトコル準拠などで依存度を下げる

ViewControllerA  <ModelADelegate>  @propery  ModelA  *model      -­‐(void)showModal  {        [self  presentModal…];  }

ModelA  @property  id  delegate;    @protocol  ModelADelagete  -­‐  (void)  showModal    -­‐(void)someMethod  {        [delegate  showModal];        }

Page 16: Conference withdevelopers 第二版

テスト

•  コードの品質を保つために、できるだけテストを書くようにしている  

•  テストの種類  – モデル層の単体テスト  

•  GHUnit  – ユーザアクションをシミュレートしたテスト  

•  KIF  •  UIAutomaRon  

•  テストはgitにpushするたびにJenkinsで自動実行  

Page 17: Conference withdevelopers 第二版

単体テスト

•  GHUnitを用いて、モデル層のロジックをテスト  •  各メソッドごとにテストを書く  •  他のクラスの挙動に左右される部分について

はそのクラスのメソッドをモックする  – 通信するメソッドなど  – モックにはmethod_exchangeImplementaRonsを  

Page 18: Conference withdevelopers 第二版

KIF

•  受け入れテストの一つ、ユーザーの操作をシミュレーションする  

•  操作のシナリオをObjecitve-­‐Cで記述  •  コマンドラインからの実行が可能  – 毎日 午前/午後  3時に定時実行

Page 19: Conference withdevelopers 第二版
Page 20: Conference withdevelopers 第二版

UI  AutomaRon

•  ユーザーの操作を自動実行するInstrumentsの機能、AutomaRonをテストで使用  

•  JavaScriptで操作を記述。あるいは実際に操作した記録を用いることも可能  

•  Xcode  4.2よりコマンドラインで実行可能に  – こちらも毎日 午前/午後  3時に定時実行

Page 21: Conference withdevelopers 第二版

KIF  vs  UI-­‐AutomaRon

KIF UI-­‐Automa6on

テストの記述 ObjecRve-­‐Cで記述 JavaScript,  ユーザーによる操作

自由度

内部の状態とあわせたテストが可能  (例:意図的にKeyChainのデータを破壊)

ユーザーのできる操作に限定

導入のしやすさ

Page 22: Conference withdevelopers 第二版

コードレビュー

•  エンジニアが7人もいると、コードの保守が徐々に困難に  – 記述の仕方が一致しない(命名規則とか)  – ここはこういうライブラリを使ってほしい  

•  ソースコードをチーム内でレビューするコードレビューを行っています  

•  コードレビューの対象  – ソースコードファイル(.m,  .hファイル)  – xibなどは範囲外  

Page 23: Conference withdevelopers 第二版

コードレビューで見るところ

•  コーディングガイドラインに沿っているか  

•  ライブラリの使い方などが正しいか  

•  明らかなバグがないか  

Page 24: Conference withdevelopers 第二版

コードレビューで見るところ

•  コーディングガイドラインに沿っているか  1.  Appleのコーディングガイドライン  2.  Google  ObjecRve-­‐C  スタイルガイド  3.  独自で決めた規約など  

NSInteger  numCols    //  NG  (むやみに省略しない)  NSInteger  numberOfColumn;  //  OK      -­‐  (CGFloat)tableView:(UITableView  *)tableView  heightForRowAtIndexPath:(NSIndexPath  *)indexPath  {          return  20.0;  //  NG  (定数を直接書かない)          retrun  kDefaultCellHeight;  //  OK  }

Page 25: Conference withdevelopers 第二版

コードレビューで見るところ

•  ライブラリの使い方が正しいか  •  ライブラリ例  – UIWebViewやNSURLConnecRonは独自の拡張を

施している  •  認証用のトークンの取得/更新  •  完了時にBlocksを実行  

–   画像は一度キャッシュしているので、そこを介しているか  

Page 26: Conference withdevelopers 第二版

コードレビューで見るところ

•  明らかなバグがないか  //  NON  ARC    -­‐(void)dealloc  {        self.model  =  nil;        self.model.delegate  =  nil;  //  先にmodelが解放されるのでdelegateは開放されない }

self.block  =  ^(){        NSLog(@“%@”,  self.value);    //  Blocksで循環参照  };

Page 27: Conference withdevelopers 第二版

コードレビューのサポートツール

•  Gerrit

gerritの画像を貼る

Page 28: Conference withdevelopers 第二版

コードレビューのサポートツール

•  Gerrit  – Google製のGit用ソースコードレビューシステム  – 行単位でのインラインコメントが可能  

•  パッチセット単位でのマージ  

–  Jenkinsプラグインあり  – 無料  

Page 29: Conference withdevelopers 第二版

ワークフロー

Jenkins  (自動テスト)

エンジニア

push verified  Gerrit

テスト失敗

コードレビューを受けて修正

Git  Remote  リポジトリ

コードレビューOK  merge

Page 30: Conference withdevelopers 第二版

開発をサポートするツール

•  社内用Over  the  Air配布ツール    peperoncino      

•  App  Storeのレビュー閲覧ツール  koala  (hups://github.com/punchdrunker/AppReviewViewer)  

Page 31: Conference withdevelopers 第二版

OTA  ツール peperoncino

•  「こういう環境のビルド欲しいから作って」と言われる度に一々ビルドし直すのは面倒  

•  Jenkinsから  – APIエンドポイント  – ブランチ  を指定してビルド  

•  サーバーからiOS端末へ直接インストール  

Page 32: Conference withdevelopers 第二版

Jenkinsでのビルド&配布

•  xcodebuildを用いてビルドする  –  configuraRonは Release  –  CODE_SIGN_IDENTITYはDistribuRonのものを  

•  できたappをアーカイブ  •  manifestファイルを生成  •  itms-­‐services://?acRon=download-­‐manifest&url=<

アーカイブへのパス>  でDLリンクを作る

Page 33: Conference withdevelopers 第二版

koala

•  AppStoreのレビューをスクレイピングして表示  •  現在は結果をポーリングしてIRCで通知  •  githubに上がっているので良かったらご利用

ください

Page 34: Conference withdevelopers 第二版

以上、ご清澄ありがとうございました。