Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Xamarin+MvvmCrossでチーム開発やってみた
Search
Nobuhiro Ito
April 19, 2014
Programming
2
790
Xamarin+MvvmCrossでチーム開発やってみた
2014/04/19(Sat) すまべん特別編「Xamarin 2.0であそぼう@関東」
Nobuhiro Ito
April 19, 2014
Tweet
Share
More Decks by Nobuhiro Ito
See All by Nobuhiro Ito
Introduction of Aizome - 多言語対応とスタイル適用を両立する書式付き文字列ライブラリ
iseebi
0
97
Bitriseで本をビルドする / Build a book with Bitrise
iseebi
0
140
BitriseでmacOSアプリをビルドする / Build macOS apps with Bitrise
iseebi
1
780
iOS/Androidアプリ転送ツール TransporterPadの紹介
iseebi
0
6.1k
Apple Developer Enterprise Program でどこまでいけるのか
iseebi
0
770
ReactiveProperty を使ったアプリの設計に Realm Xamarin を組み合わせる
iseebi
0
650
ReactiveProperty で Xamarin アプリの作り方が変わった
iseebi
3
1.7k
600件のPull RequestからみたXamarinのはまりどころ
iseebi
3
4.2k
Yet Another Cross Platform Development
iseebi
0
4.2k
Other Decks in Programming
See All in Programming
無関心の谷
kanayannet
0
160
AWS CDKの推しポイント 〜CloudFormationと比較してみた〜
akihisaikeda
3
240
try-catchを使わないエラーハンドリング!? PHPでResult型の考え方を取り入れてみよう
kajitack
3
510
ドメインモデリングにおける抽象の役割、tagless-finalによるDSL構築、そして型安全な最適化
knih
10
1.8k
Parallel::Pipesの紹介
skaji
2
910
List Unfolding - 'unfold' as the Computational Dual of 'fold', and how 'unfold' relates to 'iterate'"
philipschwarz
PRO
0
190
Enterprise Web App. Development (2): Version Control Tool Training Ver. 5.1
knakagawa
1
110
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
120
RubyKaigiで得られる10の価値 〜Ruby話を聞くことだけが RubyKaigiじゃない〜
tomohiko9090
0
140
C++20 射影変換
faithandbrave
0
450
[初登壇@jAZUG]アプリ開発者が気になるGoogleCloud/Azure+wasm/wasi
asaringo
0
130
Cloudflare Realtime と Workers でつくるサーバーレス WebRTC
nekoya3
0
400
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
6
690
Testing 201, or: Great Expectations
jmmastey
42
7.5k
Practical Orchestrator
shlominoach
188
11k
BBQ
matthewcrist
89
9.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
137
34k
The Invisible Side of Design
smashingmag
299
51k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Into the Great Unknown - MozCon
thekraken
39
1.8k
Done Done
chrislema
184
16k
Transcript
Xamarin + MvvmCrossで チーム開発やってみた 伊藤 伸裕 / 伊勢 シン 2014/04/19(Sat)
すまべん特別編「Xamarin2.0であそぼう@関東」
⾃自⼰己紹介 • 伊藤 伸裕 / 伊勢 シン – @iseebi / id:iseebi
• フェンリル株式会社 共同開発部所属 – iOS / Android のアプリ開発してます • コミュニティ – スマートフォン勉強会@関⻄西 – すごいHaskell読書会 in ⼤大阪 • H本読んでます。
None
None
主な実績@Xamarin http://biz.fenrir-inc.com/application_development/casestudy_app/nhk_kouhaku.html ※3年年連続でやってて、第64回(Ver.3.x)からXamarin
Xamarin 2.0 • ネイティブの iOS / Android / Mac アプリを
C# で書ける! – Windows プラットフォームを⾜足せば、だいたいのプラッ トフォームのソースをC#で書いてしまえる。 – うまく使えば、かなりの量量のコードを使い回せる!
実際にどれくらいの共通化効果あるの? • アプリの性質にもよるけど、 3割から4割くらい共通化できます。 PCL
Xamarin で開発したい • Xamarinで開発したいエンジニアは多いはず • しかし、そこには値段や社内政治の壁が… – 年年間1⼈人20万?⾼高すぎる… – C#?書ける⼈人いるの? or iOS/Android?わかる⼈人いるの?
• Xamarinを導⼊入し、それを実際にチーム開発に 導⼊入した実際の流流れをご紹介します。
Xamairn導⼊入への道のり
個⼈人的には MonoTouch のころからずっと注⽬目 この頃からライセンスも持ってたけど、仕事で…とはならず。 (そもそもこの頃はPHPerだった)
2013/ 2/20
完全にObjective-C使いなエンジニアと… お、native API使えるとある var astr = new NSAttributedString ("Hello World",
attrs); すごい これ普通に動くなら完全に上位互換や MonoTouchの時代からそれ普通だった。 というか、TCP接続なしでデバッグいけてる。 IDEもめっちゃよくなってる。こればやばい。もうこれでええやん。 Xamarin△□無し これでやったら、同時開発の時に⼯工数も下がるし、 品質も上がるし、いいことずくめやでー。 いいね。 でもトラックナンバー1になりそう…
スマホアプリ開発会社が抱える問題 • iOS/Android 同時開発の時コストが2倍問題 • クロスプラットフォーム技術の決定打がなかった – PhoneGap などはいまいちパフォーマンスで難が… – Flash AppStore
締め出しショック
Xamarin 2.0の衝撃 • MonoTouch から使ってた⼈人からみても結構な インパクトだった – Xamarin Studio の⾒見見た⽬目かなり良良くなってた!
– iOS のデバッグが同じWi-Fiにいなくてもできるように! – Starter でとりあえず試してもらえる! • 1つになって、わかりやすくなった! • Visual Studio で開発できるというところは、 それほど重要じゃなかった。 – そもそも、チーム内でWindows使ってる⼈人は僕だけ (しかもサブ機)
早速提案してみる Xamarin めっちゃ⾼高いけど、その分効果ありそうです。 デメリットをメリットで上回る場⾯面も出そうなので検討しましょう! それで本当に効果があるか、ちゃんと証明してよ。
それで偉い⼈人を説得できますか? • エンジニアの幸せは、そのままでは 他の⼈人(=偉い⼈人、お⾦金金出す⼈人)の幸せにならない。 – 「Objective-C勉強したくないだけよね?」 – 「なんでわざわざ⾼高いIDE/SDK使うの?」 – 「本当に1度度でいけるの?」 • ちょっとやそっとじゃその価値はわかってもらえない。 – 特に中⼩小企業だと、とても⼤大きな投資になってしまう。
– ネイティブにしないことによるリスクだってある • ⼈人材的なところとか
その他、偉い⼈人に聞かれたこと • 「C#できる⼈人あんたしかおらへんで?」 • 「Xamarinってどれくらい信⽤用できんの?」 • 「最新のSDK追従悪いんじゃないの?」 • 「本当に効果あるの?」
あきらめずにぶつける • Xamarinの偉い⼈人に対するメリットを考える – コード共有によって現れる ⼯工期や⼯工数削減、品質向上が鍵になると考えた • 「これでやりたい」ということを、周りに⽰示した – 社内ツールをMonoMacで開発 – とにかく提案しまくった •
「これくらいの共通化率率率出そうで、これくらいコスト下がる」と 数字をぶつけまくる
その結果 • 半年年くらいで、 ついに「Xamarinでやってもよい」という流流れになる。
Xamarin+MvvmCrossで チーム開発やってみた – チーム構成編
メンバー紹介 • 精鋭開発者をそろえました – 伊勢 : Windows系もできるiOSメインマルチプレイヤー – A :
⾔言語学習得意なAndroidメインマルチプレイヤー – B : 安定性抜群のAndroid専⾨門開発者 – C : 数学得意なiOSメインマルチプレイヤー ※ここのマルチプレイヤーはiOS/Androidどちらも開発できる⼈人という意味 • 元々iOS/Androidに強いメンバー中⼼心。 • C# やったことあるのは伊勢だけだけど、 他のメンバーは「たぶんできるでしょう」と前向き
共通⾔言語としてのMVVM • Xamarin でやるにしても、ルールやフレームワーク がないと共通化の効果が出ない。 • じっくり検討している暇はない! • ロジック共通化の⼿手段として、 MVVMを使うことにし、MvvmCross
を選択した – Xamarinで利利⽤用できるMVVMフレームワークの中で は、⼀一番情報があった。
ライセンスを割り当てる • 全員にiOS/Android両⽅方割り当てる必要はない • Xamarin.iOS / Xamarin.Android 3本ずつ購⼊入して、下記のように割り当て 伊勢 A
B C iOS ◦ ◦ ◦ Android ◦ ◦ ◦
まずは意識識の共有を • 「他の⾔言語バリバリ書けるので、C#もなんとなく書け そう」な⼈人が”脱線”しないように注意する • 他の⾔言語と違うところを中⼼心に調べてもらって、 適応してもらう。 – 最初にメンバーに⾔言ったこと •
Modern C# Programming は⼀一読してください http://www.slideshare.net/neuecc/modern-c- programming-img • async/await、ラムダ、var、プロパティ、LINQ というキーワードは 調べて、使える/使うようにしてください。 • MVVMという概念念、特にバインディングの仕組みは追っておいてく ださい。
実際に触れてもらう • プロジェクトの初期構成はわかる⼈人がやっとく – レールを敷いて他の⼈人が⾛走れるように • わからないところを⼿手分けして調べる – 得意そうな⼈人に得意そうなところを調べてもらい、 共有する。 • 精鋭揃いだったのもあって、すんなり適応。
– 「Viewにコード書いたら負け」みたいな 煽りっぽいワードも、意識識の形成には効果があった。
作業分担 • 基本はViewの実装と ViewModel/Modelの実装でチーム分け – 実際は両⽅方割り当てがある⼈人は⼿手伝う Core Touch Droid 伊勢 B
D A
Xamarin+MvvmCrossで チーム開発やってみた – MvvmCross熱闘編
MvvmCross • クロスプラットフォームでのMVVM開発をサポート するライブラリ – Windows Desktop(WPF)、Windowsストアアプリ、 Windows Phone、Xamarin.iOS、 Xamarin.Android、MonoMac/Xamarin.Mac •
MVVMやそれを便便利利に使うための仕組みが全部 ⼊入りになっている – Messenger、I18N、Presenter、IoC 他 • 処理理の分離離をサポートする機構も備わる – プラグイン
Core: PCL で作成する ViewModel, Service のほか、 プラットフォーム⾮非依存な Converter などを配置する アプリ:
通常のアプリプロジェクトで作成する。 View のほか、 プラットフォームに依存する Converter などを配置する。
MvvmCross の使い⽅方について • 今⽇日はなるべく、ここでしか聞けない話を… – 使い⽅方よりも、実際に使って何が起こったかを中⼼心に 話します。
MvvmCross の導⼊入 • 去年年10⽉月くらいはいろいろバッドノウハウの集まり – .csproj を開いて無理理⽮矢理理PCLにしたり – .NET 4.0 にしかならなかったので、 async
使うために Microsoft.Bcl.Async を⼊入れたり • いまはNuGetで⼀一発 – http://iseebi.hatenablog.com/entry/ 2014/03/01/031216
すぐに問題が起こった • スライドメニューってどう出せば? – github に参考になるヤツがあった • https://github.com/fcaico/MvxSlidingPanels.Touch/ • iOS の
RootViewController は 基本的に UINavigationController • 画⾯面全体に対する処理理は MvxViewPresenter で⾏行行う。 • MvxViewPresenter に対しての Message 機構として MvxPresentationHint で表⽰示する • 実際は要件がもっと違った(下からのすりあがり)ので、 これを参考に⾃自⼒力力記述。
リリースビルドすると動かない! • バインディングしてても、コードの中で使ってないと、 リンカがイベントを消してしまう – そういうときは画⾯面表⽰示時 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);" }
プラグインが動かない! • MvvmCross のプラグインは、各プラットフォーム 固有の機能を、Coreの共有コードから使えるよう にしてくれる。 – ⾳音声・カメラ・ネットワークなど • iOS では動くけど、Android
で動かなかったり、 不不⼗十分なプラグインがあった。 – iOS の実装に寄っていて、Android では不不⼗十分 – 当該プラグインを fork して対処する。
Objective-C/Android Java 資産の利利⽤用 • ある機能はこれまでのコードを そのまま流流⽤用して欲しいというリクエストがあった • iOS 版はその機能を全部ネイティブライブラリにし、 そのライブラリをネイティブバインディングした
• Android は Activty の継承関係的に断念念 – 分離離するための時間があればいけたかも
ネイティブバインディング • 起点となるViewControllerを作るメソッドを⽤用意 して、そこだけ定義⽣生成した。 – Objective Sharpie というヘッダから定義を⽣生成する ツールがある • http://docs.xamarin.com/guides/ios/
advanced_topics/binding_objective-c/ objective_sharpie/ – ガチのライブラリを定義⽣生成するのはかなりしんどいが、 メソッド1つのクラスだったらそんなに難しくない。
.NETのライブラリがすべて使えるわけじゃない • 使おうとしたライブラリが、Xamarinで使えない 機能に強く依存しててどうしようもないことがあった – 具体的には dynamic (今はしなくてもいけるかも)
Androidメモリアウト問題 • アプリをバックグラウンドに回す→ YouTubeみまくると、アプリプロセスが落落ちる→ 復復帰しようとすると、内部のクラスが初期化→ 途中の画⾯面から復復活しようとしてクラッシュ – 本来存在するはずのリジューム⽤用のデータも⾶飛ぶ • 内部で使⽤用しているデータを1つのServiceに まとめて、適宜ファイルへ保存するようにした。
• アプリ起点じゃないActivityで初期化が⾛走ったら、 保存したデータから復復元する
Xamarin+MvvmCrossで チーム開発やってみた – 総括
導⼊入効果総括 (1/2) • コード共有の効果は確実にあった – 通信などのビジネスロジックの品質は格段に良良くなった • Android で不不安定性なところがいくつかあった • MvvmCross
の落落とし⽳穴にちょいちょいはまる
導⼊入効果総括 (2/2) • 「C#わかる⼈人がやらんとどないしようもない」所がある – async,Task,Rx を使った⾼高度度なライブラリとか – 具体的には AsyncOAuth
• 最初の頃は調査とか試⾏行行錯誤で効果が出づらい – ある程度度ノウハウたまってくるまでは我慢が必要 • 書くコードが減ったので意識識ずれはその分減ったが、 View と ViewModel の結合のところがアキレス腱 – ViewModel のどのプロパティが、 画⾯面上のどの項⽬目に当たるかを共有して、 意識識形成することが重要
実際にやってみて社内に起きた変化 • Xamarinに対して社内が協⼒力力的になった – 提案できる場⾯面が増えた。 • MVVM⼤大流流⾏行行 – Objective-C や Java でも取り⼊入れようとする⼈人が
現れた。 – ViewとModelの分離離について設計⽅方針を考えなおす きっかけになった⼈人が多かったようす。
Xamarinで(組織的に)開発するには • ⾃自分がやりたいんだったら、周りを動かしましょう • ⼊入れたからには責任をもってやろう • ⽣生き字引の存在が成功の鍵 – .NETの知識識だけでも、iOS/Androidの知識識だけでも、 即応できない場⾯面がある。