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