Conference withdevelopers 第二版

1,384 views

Published on

conference with developers 2012 で後輩の @ginrou が発表した資料。

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,384
On SlideShare
0
From Embeds
0
Number of Embeds
729
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Conference withdevelopers 第二版

  1. 1. mixiにおけるiPhoneアプリ開発 株式会社ミクシィ   武田祐一
  2. 2. 略歴 •  武田祐一   •  株式会社ミクシィ エンジニア     •  2012年4月 株式会社ミクシィに入社   •  同年6月 より iOSアプリ開発に  
  3. 3. アウトライン •  ミクシィでのiPhoneアプリの開発体制   –  大規模になる中でどうやってコードを維持するか     •  コードのテクニックなどよりも、開発環境や周 辺のツールなどについて
  4. 4. mixi  iPhoneアプリ •  アップデート回数   –  23回  (2012年)   •  スマートフォンからのアクセス   –  月間800万ユーザー   •  巨大なコードベース   –  .mファイルは574個  
  5. 5. 開発体制 •  開発チーム 計11人   –  ディレクター 1人   –  デザイナー 1人   –  エンジニア  7人   –  QAエンジニア  2人   •  アジャイルな開発体制の一つ、スクラムを採 用しています
  6. 6. スクラムによる開発 日々のデイリースクラムの様子 カンバン
  7. 7. 開発していく上で大切にしていること •  設計・コードベース   –  オブジェクト指向   –  MVCフレームワーク   •  保守性   –  テスト、CI   –  コードレビュー  
  8. 8. アプリの全体構成 Mixi  Graph  Kit   ビュー モデル コントローラ mixiの各機能 通信を管理する 内製ライブラリ   •  RESTful  API   •  JSONRPC mixi.jpのサーバー   MVCフレームワークに則って設計
  9. 9. MVCフレームワーク モデル •  MixiGraphKitを通じたデータのやり取り •  ロジックを詰め込み、テストを書く コントローラ •  モデルとビューの仲介 •  ロジックは書かない ビュー •  画面構成・ユーザーアクションの検知 •  できるだけxibを用いて作成
  10. 10. オブジェクト指向 •  同じような画面やパーツを作ることはよくある   •  共通する部分は基底クラスを作ってサブクラ ス化していく   –  一方で過度の多重継承は上位のクラスの改変が 難しくなるのでほどほどに  
  11. 11. オブジェクト指向 •  クラス間の依存度はできるだけ下げる   –  delegate,  NSNoRficaRonなどでクラス間の通知   –  プロトコル準拠などで依存度を下げる ViewControllerA     @propery  ModelA  *model ModelA         -­‐(void)someMethod  {        //  モーダルを表示したい        //  viewControllerが必要   }
  12. 12. オブジェクト指向 •  クラス間の依存度はできるだけ下げる   –  delegate,  NSNoRficaRonなどでクラス間の通知   –  プロトコル準拠などで依存度を下げる ViewControllerA     @propery  ModelA  *model ModelA     @property  ViewControllerA    *vcA     -­‐(void)someMethod  {          [vcA  presentModal…];   }
  13. 13. オブジェクト指向 •  クラス間の依存度はできるだけ下げる   –  delegate,  NSNoRficaRonなどでクラス間の通知   –  プロトコル準拠などで依存度を下げる ViewControllerA     @propery  ModelA  *model ModelA     @property  ViewController    *vcA     -­‐(void)someMethod  {          [vcA  presentModal…];   }
  14. 14. オブジェクト指向 •  クラス間の依存度はできるだけ下げる   –  delegate,  NSNoRficaRonなどでクラス間の通知   –  プロトコル準拠などで依存度を下げる ViewControllerA     @propery  ModelA  *model 依存 ModelA     @property  ViewController    *vcA     依存 -­‐(void)someMethod  {          [vcA  presentModal…];   }
  15. 15. オブジェクト指向 •  クラス間の依存度はできるだけ下げる   –  delegate,  NSNoRficaRonなどでクラス間の通知   –  プロトコル準拠などで依存度を下げる ViewControllerA   <ModelADelegate>   @propery  ModelA  *model       -­‐(void)showModal  {        [self  presentModal…];   } ModelA   @property  id  delegate;     @protocol  ModelADelagete   -­‐  (void)  showModal     -­‐(void)someMethod  {        [delegate  showModal];         }
  16. 16. テスト •  コードの品質を保つために、できるだけテストを 書くようにしている   •  テストの種類   –  モデル層の単体テスト   •  GHUnit   –  ユーザアクションをシミュレートしたテスト   •  KIF   •  UIAutomaRon   •  テストはgitにpushするたびにJenkinsで自動実行  
  17. 17. 単体テスト •  GHUnitを用いて、モデル層のロジックをテスト   •  各メソッドごとにテストを書く   •  他のクラスの挙動に左右される部分について はそのクラスのメソッドをモックする   –  通信するメソッドなど   –  モックにはmethod_exchangeImplementaRonsを  
  18. 18. KIF •  受け入れテストの一つ、ユーザーの操作をシ ミュレーションする   •  操作のシナリオをObjecitve-­‐Cで記述   •  コマンドラインからの実行が可能   –  毎日 午前/午後  3時に定時実行
  19. 19. UI  AutomaRon •  ユーザーの操作を自動実行するInstruments の機能、AutomaRonをテストで使用   •  JavaScriptで操作を記述。あるいは実際に操 作した記録を用いることも可能   •  Xcode  4.2よりコマンドラインで実行可能に   –  こちらも毎日 午前/午後  3時に定時実行
  20. 20. KIF  vs  UI-­‐AutomaRon KIF テストの記述 自由度 導入のしやすさ ObjecRve-­‐Cで記述 UI-­‐Automa6on JavaScript,  ユーザーによる操作 内部の状態とあわせたテストが 可能   ユーザーのできる操作に限定 (例:意図的にKeyChainのデータ を破壊)
  21. 21. コードレビュー •  エンジニアが7人もいると、コードの保守が 徐々に困難に   –  記述の仕方が一致しない(命名規則とか)   –  ここはこういうライブラリを使ってほしい   •  ソースコードをチーム内でレビューするコード レビューを行っています   •  コードレビューの対象   –  ソースコードファイル(.m,  .hファイル)   –  xibなどは範囲外  
  22. 22. コードレビューで見るところ •  コーディングガイドラインに沿っているか   •  ライブラリの使い方などが正しいか   •  明らかなバグがないか  
  23. 23. コードレビューで見るところ •  コーディングガイドラインに沿っているか   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   }
  24. 24. コードレビューで見るところ •  ライブラリの使い方が正しいか   •  ライブラリ例   –  UIWebViewやNSURLConnecRonは独自の拡張を 施している   •  認証用のトークンの取得/更新   •  完了時にBlocksを実行   –    画像は一度キャッシュしているので、そこを介し ているか  
  25. 25. コードレビューで見るところ •  明らかなバグがないか   //  NON  ARC     -­‐(void)dealloc   {        self.model  =  nil;        self.model.delegate  =  nil;  //  先にmodelが解放されるのでdelegateは開放されない } self.block  =  ^(){        NSLog(@“%@”,  self.value);    //  Blocksで循環参照   };
  26. 26. コードレビューのサポートツール •  Gerrit gerritの画像を貼る
  27. 27. コードレビューのサポートツール •  Gerrit   –  Google製のGit用ソースコードレビューシステム   –  行単位でのインラインコメントが可能   •  パッチセット単位でのマージ   –  Jenkinsプラグインあり   –  無料  
  28. 28. ワークフロー push テスト失敗 Jenkins   (自動テスト) エンジニア コードレビューを受けて修正 verified   Gerrit コードレビューOK   merge Git  Remote   リポジトリ
  29. 29. 開発をサポートするツール •  社内用Over  the  Air配布ツール    peperoncino       •  App  Storeのレビュー閲覧ツール   koala  (hups://github.com/punchdrunker/AppReviewViewer)  
  30. 30. OTA  ツール peperoncino •  「こういう環境のビルド欲しいから作って」と言 われる度に一々ビルドし直すのは面倒   •  Jenkinsから   –  APIエンドポイント   –  ブランチ   を指定してビルド   •  サーバーからiOS端末へ直接インストール  
  31. 31. Jenkinsでのビルド&配布 •  xcodebuildを用いてビルドする   –  configuraRonは Release   –  CODE_SIGN_IDENTITYはDistribuRonのものを   •  できたappをアーカイブ   •  manifestファイルを生成   •  itms-­‐services://?acRon=download-­‐manifest&url=< アーカイブへのパス>   でDLリンクを作る
  32. 32. koala •  AppStoreのレビューをスクレイピングして表示   •  現在は結果をポーリングしてIRCで通知   •  githubに上がっているので良かったらご利用 ください
  33. 33. 以上、ご清澄ありがとうございました。

×