Xamarin+MvvmCrossでチーム開発やってみた

 Xamarin+MvvmCrossでチーム開発やってみた

2014/04/19(Sat) すまべん特別編「Xamarin 2.0であそぼう@関東」

619fccc61ef955ccf39bfa41df527042?s=128

Nobuhiro Ito

April 19, 2014
Tweet

Transcript

  1. Xamarin + MvvmCrossで チーム開発やってみた 伊藤  伸裕 / 伊勢  シン 2014/04/19(Sat)

    すまべん特別編「Xamarin2.0であそぼう@関東」
  2. ⾃自⼰己紹介 •  伊藤  伸裕 / 伊勢  シン – @iseebi / id:iseebi

    •  フェンリル株式会社  共同開発部所属 – iOS / Android のアプリ開発してます •  コミュニティ – スマートフォン勉強会@関⻄西 – すごいHaskell読書会 in ⼤大阪 •  H本読んでます。
  3. None
  4. None
  5. 主な実績@Xamarin http://biz.fenrir-inc.com/application_development/casestudy_app/nhk_kouhaku.html ※3年年連続でやってて、第64回(Ver.3.x)からXamarin

  6. Xamarin 2.0 •  ネイティブの  iOS / Android / Mac アプリを

    C# で書ける! – Windows プラットフォームを⾜足せば、だいたいのプラッ トフォームのソースをC#で書いてしまえる。 – うまく使えば、かなりの量量のコードを使い回せる!
  7. 実際にどれくらいの共通化効果あるの? •  アプリの性質にもよるけど、 3割から4割くらい共通化できます。 PCL

  8. Xamarin で開発したい •  Xamarinで開発したいエンジニアは多いはず •  しかし、そこには値段や社内政治の壁が… – 年年間1⼈人20万?⾼高すぎる… – C#?書ける⼈人いるの?      or iOS/Android?わかる⼈人いるの?

    •  Xamarinを導⼊入し、それを実際にチーム開発に 導⼊入した実際の流流れをご紹介します。
  9. Xamairn導⼊入への道のり

  10. 個⼈人的には  MonoTouch のころからずっと注⽬目 この頃からライセンスも持ってたけど、仕事で…とはならず。 (そもそもこの頃はPHPerだった)

  11. 2013/ 2/20

  12. 完全にObjective-C使いなエンジニアと… お、native API使えるとある var astr = new NSAttributedString ("Hello World",

    attrs); すごい  これ普通に動くなら完全に上位互換や MonoTouchの時代からそれ普通だった。 というか、TCP接続なしでデバッグいけてる。 IDEもめっちゃよくなってる。こればやばい。もうこれでええやん。 Xamarin△□無し これでやったら、同時開発の時に⼯工数も下がるし、 品質も上がるし、いいことずくめやでー。 いいね。 でもトラックナンバー1になりそう…
  13. スマホアプリ開発会社が抱える問題 •  iOS/Android 同時開発の時コストが2倍問題 •  クロスプラットフォーム技術の決定打がなかった – PhoneGap などはいまいちパフォーマンスで難が… – Flash AppStore

    締め出しショック
  14. Xamarin 2.0の衝撃 •  MonoTouch から使ってた⼈人からみても結構な インパクトだった –  Xamarin Studio の⾒見見た⽬目かなり良良くなってた!

    –  iOS のデバッグが同じWi-Fiにいなくてもできるように! –  Starter でとりあえず試してもらえる! •  1つになって、わかりやすくなった! •  Visual Studio で開発できるというところは、 それほど重要じゃなかった。 –  そもそも、チーム内でWindows使ってる⼈人は僕だけ (しかもサブ機)
  15. 早速提案してみる Xamarin めっちゃ⾼高いけど、その分効果ありそうです。 デメリットをメリットで上回る場⾯面も出そうなので検討しましょう! それで本当に効果があるか、ちゃんと証明してよ。

  16. それで偉い⼈人を説得できますか? •  エンジニアの幸せは、そのままでは 他の⼈人(=偉い⼈人、お⾦金金出す⼈人)の幸せにならない。 – 「Objective-C勉強したくないだけよね?」 – 「なんでわざわざ⾼高いIDE/SDK使うの?」 – 「本当に1度度でいけるの?」 •  ちょっとやそっとじゃその価値はわかってもらえない。 – 特に中⼩小企業だと、とても⼤大きな投資になってしまう。

    – ネイティブにしないことによるリスクだってある •  ⼈人材的なところとか
  17. その他、偉い⼈人に聞かれたこと •  「C#できる⼈人あんたしかおらへんで?」 •  「Xamarinってどれくらい信⽤用できんの?」 •  「最新のSDK追従悪いんじゃないの?」 •  「本当に効果あるの?」

  18. あきらめずにぶつける •  Xamarinの偉い⼈人に対するメリットを考える – コード共有によって現れる ⼯工期や⼯工数削減、品質向上が鍵になると考えた •  「これでやりたい」ということを、周りに⽰示した – 社内ツールをMonoMacで開発 – とにかく提案しまくった • 

    「これくらいの共通化率率率出そうで、これくらいコスト下がる」と 数字をぶつけまくる
  19. その結果 •  半年年くらいで、 ついに「Xamarinでやってもよい」という流流れになる。

  20. Xamarin+MvvmCrossで チーム開発やってみた – チーム構成編

  21. メンバー紹介 •  精鋭開発者をそろえました –  伊勢 : Windows系もできるiOSメインマルチプレイヤー –  A :

    ⾔言語学習得意なAndroidメインマルチプレイヤー –  B : 安定性抜群のAndroid専⾨門開発者 –  C : 数学得意なiOSメインマルチプレイヤー ※ここのマルチプレイヤーはiOS/Androidどちらも開発できる⼈人という意味 •  元々iOS/Androidに強いメンバー中⼼心。 •  C# やったことあるのは伊勢だけだけど、 他のメンバーは「たぶんできるでしょう」と前向き
  22. 共通⾔言語としてのMVVM •  Xamarin でやるにしても、ルールやフレームワーク がないと共通化の効果が出ない。 •  じっくり検討している暇はない! •  ロジック共通化の⼿手段として、 MVVMを使うことにし、MvvmCross

    を選択した – Xamarinで利利⽤用できるMVVMフレームワークの中で は、⼀一番情報があった。
  23. ライセンスを割り当てる •  全員にiOS/Android両⽅方割り当てる必要はない •  Xamarin.iOS / Xamarin.Android 3本ずつ購⼊入して、下記のように割り当て 伊勢 A

    B C iOS ◦ ◦ ◦ Android ◦ ◦ ◦
  24. まずは意識識の共有を •  「他の⾔言語バリバリ書けるので、C#もなんとなく書け そう」な⼈人が”脱線”しないように注意する •  他の⾔言語と違うところを中⼼心に調べてもらって、 適応してもらう。 –  最初にメンバーに⾔言ったこと • 

    Modern C# Programming は⼀一読してください http://www.slideshare.net/neuecc/modern-c- programming-img •  async/await、ラムダ、var、プロパティ、LINQ というキーワードは 調べて、使える/使うようにしてください。 •  MVVMという概念念、特にバインディングの仕組みは追っておいてく ださい。
  25. 実際に触れてもらう •  プロジェクトの初期構成はわかる⼈人がやっとく – レールを敷いて他の⼈人が⾛走れるように •  わからないところを⼿手分けして調べる – 得意そうな⼈人に得意そうなところを調べてもらい、 共有する。 •  精鋭揃いだったのもあって、すんなり適応。

    – 「Viewにコード書いたら負け」みたいな 煽りっぽいワードも、意識識の形成には効果があった。
  26. 作業分担 •  基本はViewの実装と ViewModel/Modelの実装でチーム分け – 実際は両⽅方割り当てがある⼈人は⼿手伝う Core Touch Droid 伊勢 B

    D A
  27. Xamarin+MvvmCrossで チーム開発やってみた – MvvmCross熱闘編

  28. MvvmCross •  クロスプラットフォームでのMVVM開発をサポート するライブラリ – Windows Desktop(WPF)、Windowsストアアプリ、 Windows Phone、Xamarin.iOS、 Xamarin.Android、MonoMac/Xamarin.Mac • 

    MVVMやそれを便便利利に使うための仕組みが全部 ⼊入りになっている – Messenger、I18N、Presenter、IoC 他 •  処理理の分離離をサポートする機構も備わる – プラグイン
  29. Core: PCL で作成する ViewModel, Service のほか、 プラットフォーム⾮非依存な Converter などを配置する アプリ:

    通常のアプリプロジェクトで作成する。 View のほか、 プラットフォームに依存する Converter などを配置する。
  30. MvvmCross の使い⽅方について •  今⽇日はなるべく、ここでしか聞けない話を… – 使い⽅方よりも、実際に使って何が起こったかを中⼼心に 話します。

  31. MvvmCross の導⼊入 •  去年年10⽉月くらいはいろいろバッドノウハウの集まり – .csproj を開いて無理理⽮矢理理PCLにしたり – .NET 4.0 にしかならなかったので、 async

    使うために  Microsoft.Bcl.Async を⼊入れたり •  いまはNuGetで⼀一発 – http://iseebi.hatenablog.com/entry/ 2014/03/01/031216
  32. すぐに問題が起こった •  スライドメニューってどう出せば? – github に参考になるヤツがあった •  https://github.com/fcaico/MvxSlidingPanels.Touch/ •  iOS の

     RootViewController は 基本的に  UINavigationController •  画⾯面全体に対する処理理は  MvxViewPresenter で⾏行行う。 •  MvxViewPresenter に対しての Message 機構として MvxPresentationHint で表⽰示する •  実際は要件がもっと違った(下からのすりあがり)ので、 これを参考に⾃自⼒力力記述。
  33. リリースビルドすると動かない! •  バインディングしてても、コードの中で使ってないと、 リンカがイベントを消してしまう –  そういうときは画⾯面表⽰示時  MvxBind: のエラー出⼒力力が出てる。 –  プロジェクト作成時に

     LinkerPleaseInclude で、 使ってるメソッドを空打ちしておく。 •  最近NuGetで⼊入れたやつは、だいたいのものがデフォルトで存在。 [MonoTouch.Foundation.Preserve(AllMembers = true)]" public class LinkerPleaseInclude" {" public void Include(UIButton uiButton)" {" uiButton.TouchUpInside += (s, e) =>" uiButton.SetTitle(" uiButton.Title(UIControlState.Normal), " UIControlState.Normal);" }
  34. プラグインが動かない! •  MvvmCross のプラグインは、各プラットフォーム 固有の機能を、Coreの共有コードから使えるよう にしてくれる。 – ⾳音声・カメラ・ネットワークなど •  iOS では動くけど、Android

    で動かなかったり、 不不⼗十分なプラグインがあった。 – iOS の実装に寄っていて、Android では不不⼗十分 – 当該プラグインを fork して対処する。
  35. Objective-C/Android Java 資産の利利⽤用 •  ある機能はこれまでのコードを そのまま流流⽤用して欲しいというリクエストがあった •  iOS 版はその機能を全部ネイティブライブラリにし、 そのライブラリをネイティブバインディングした

    •  Android は  Activty の継承関係的に断念念 – 分離離するための時間があればいけたかも
  36. ネイティブバインディング •  起点となるViewControllerを作るメソッドを⽤用意 して、そこだけ定義⽣生成した。 – Objective Sharpie というヘッダから定義を⽣生成する ツールがある •  http://docs.xamarin.com/guides/ios/

    advanced_topics/binding_objective-c/ objective_sharpie/ – ガチのライブラリを定義⽣生成するのはかなりしんどいが、 メソッド1つのクラスだったらそんなに難しくない。
  37. .NETのライブラリがすべて使えるわけじゃない •  使おうとしたライブラリが、Xamarinで使えない 機能に強く依存しててどうしようもないことがあった – 具体的には dynamic (今はしなくてもいけるかも)

  38. Androidメモリアウト問題 •  アプリをバックグラウンドに回す→ YouTubeみまくると、アプリプロセスが落落ちる→ 復復帰しようとすると、内部のクラスが初期化→ 途中の画⾯面から復復活しようとしてクラッシュ – 本来存在するはずのリジューム⽤用のデータも⾶飛ぶ •  内部で使⽤用しているデータを1つのServiceに まとめて、適宜ファイルへ保存するようにした。

    •  アプリ起点じゃないActivityで初期化が⾛走ったら、 保存したデータから復復元する
  39. Xamarin+MvvmCrossで チーム開発やってみた – 総括

  40. 導⼊入効果総括 (1/2) •  コード共有の効果は確実にあった – 通信などのビジネスロジックの品質は格段に良良くなった •  Android で不不安定性なところがいくつかあった •  MvvmCross

    の落落とし⽳穴にちょいちょいはまる
  41. 導⼊入効果総括 (2/2) •  「C#わかる⼈人がやらんとどないしようもない」所がある –  async,Task,Rx を使った⾼高度度なライブラリとか –  具体的には  AsyncOAuth

    •  最初の頃は調査とか試⾏行行錯誤で効果が出づらい –  ある程度度ノウハウたまってくるまでは我慢が必要 •  書くコードが減ったので意識識ずれはその分減ったが、 View と  ViewModel の結合のところがアキレス腱 –  ViewModel のどのプロパティが、 画⾯面上のどの項⽬目に当たるかを共有して、 意識識形成することが重要
  42. 実際にやってみて社内に起きた変化 •  Xamarinに対して社内が協⼒力力的になった – 提案できる場⾯面が増えた。 •  MVVM⼤大流流⾏行行 – Objective-C や Java でも取り⼊入れようとする⼈人が

    現れた。 – ViewとModelの分離離について設計⽅方針を考えなおす きっかけになった⼈人が多かったようす。
  43. Xamarinで(組織的に)開発するには •  ⾃自分がやりたいんだったら、周りを動かしましょう •  ⼊入れたからには責任をもってやろう •  ⽣生き字引の存在が成功の鍵 – .NETの知識識だけでも、iOS/Androidの知識識だけでも、 即応できない場⾯面がある。