Androidアプリ設計パターン入門を読みました
昨年クラウドファンディングで応援していた「Androidアプリ設計パターン入門」をようやく読み終えたのでその感想です。
書籍版が届いたのでこれから読んでみる pic.twitter.com/R2SunsGWUj
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月4日
peaks.cc (ちなみに上の書籍のリンクから購入すると僕に30%紹介料が入る仕組みなのでよろしくお願いしますw)
各章の感想
1章はイントロダクションとしてAndroidアプリが抱える制約やアプリ設計にまつわる問題やよく使われる定番ライブラリ、開発言語(Kotlin)を取り上げています。
2章,3章はTodoアプリを例にMVPやMVVMパターンで実装するケースを取り上げています。MVPやMVVMのエッセンスを知るにはもってこいの教材だとおもいます。
4章(「差分開発にみる設計アプローチ」)はメルカリアプリが4年間で積み重ねた技術的な負債の話とそれを解消しようとした話ですが他の章と違ってなかなか泥臭い話でうなづかずにはいられない内容でした。 特に「理解を難しくする複雑さを生み出してまでコード量を減らすのであれば、コピペのほうがまだマシ」というのはめちゃくちゃ同意です。 エンジニアたちが良かれと思って考えた設計もビジネス環境の変化による仕様変更・拡張であっという間に開発を阻害する負債になってしまうのはなかなか辛いものがありますがその辺に立ち向かうのもエンジニアの醍醐味かもしれません。
開発をスケーラブルで戦闘力が高いものにするには技術的な負債を解消したり新しい技術的なチャレンジが必要だというのはなかなかマネジメント層には理解されないですが(説得の仕方が悪いだけかもしれないですが)、メルカリさんはそういうのに成功している企業なのかなーと感じました。
あと4.5章のstep by stepの実装がもうちょっと詳しく見たかったです。実は似たような画面(1 Fragment + 複数View)を作った時に結局1つのViewModelに全部入れちゃったのを後悔していまして(^_^;)
5章(「OSSにおける設計者の役割」)はDroidKaigi 2017のアプリ開発を取り上げ、その設計アプローチを解説しています。 OSSのアプリの設計についてここまで詳しく解説してくれるのはありがたいです。設計を決める指針で「開発者が考えることを減らす」というのは本当にその通りだなと思いました。
パッケージの構成も意外と悩みどころですが小規模なら役割ごとに分割し、中・大規模になるにつれて機能ごとにパッケージを切っていく形がよさそうですね。 あとわかりやすくするために階層を深く掘らないほうが良さそうだと感じました。
Navigatorクラスが神クラスになってしまうのはあるあるでした。もし分割するなら機能ごとにNavigatorを分けて、機能をまたぐ画面遷移は親Navigatorみたいなのを作って子のNavigatorにInjectするとかになるんでしょうか..
BaseActivityやBaseFragmentについては(別にActivity, Fragmentに限らずですが)極力作りたくない派ですが現実的に需要があるのでどんな処理ならBaseクラスに入れていいみたいなルールがあるといいですね。AndroidでもAOP流行らないかなぁ...
UseCaseについては個人的には
- 再利用性がある
- 複数のステップで構成されている
のいずれかの場合になったらUseCaseに置き換えればいいかなと思っています。
6章(「Fluxアーキテクチャ」)はWeb界隈で提唱されたFluxアーキテクチャをAndroidアプリに適用する話です。 これを読んで今更ながら気づいたのはFluxはPresentation層のアーキテクチャでDomain層の話ではないということ。 一方向にデータが流れるので関数呼び出し時の戻り値などはないということ。処理の結果はStoreの状態変更で知ることができるということでしょうか.. 一口にFluxと言っても実装方法にバリエーションがあって個人的にはAACのViewModelとLiveDataとRxJavaを使うパターンがいいかなという感想です。 この辺は最初にチーム内で議論する必要がありそう。
7章(「チームとアーキテクチャ」)はUS版のメルカリをたった3ヶ月でフルスクラッチで書き直した話です。
フルスクラッチで3ヶ月は凄い早いなーと思って読み進めるとReact Nativeを採用することでJavaScriptやReactをよく知るWebエンジニアの力を借りれたのが高速開発の秘訣だったようです。 チーム事情を考えた技術選択って大事だよなーと感じました。またReact NativeとNativeの住み分けの考え方や両者の連携ノウハウが詳しく書いてあって今後の参考になりそう。
ただReact Nativeのアップデートが頻繁で追随していかないといけないのとTarget SDK Versionが23なのが気になりました。 11月までに26になってるとは思いますが(^_^;)
8章(「Android Architecture Components」)はGoogle I/O 2017で紹介されたAndroid Architecture Components(AAC)の紹介とMVVMやFluxアーキテクチャにどのように適用できるかというお話。 AAC便利すぎなので既存のViewModelにも是非入れていきたいです。
ところでAACのLifecycleではアプリがバックグラウンドに回った際に起こるプロセスkillについてはフォローされていません。 その辺についてはSaving UI Statesというページに
- シンプルなデータはonSaveInstanceState()で保存
- 複雑でサイズが大きいデータは予め永続化しておいてonSaveInsanceState()ではIDなどのデータの形で保存
というアドバイスが書いてあります。 ただ、永続化やViewModelの復元の仕方などは開発者に丸投げ状態でこの辺もAACでフォローしてくれないかなと思ったりします(^_^;)
まとめ
というわけで普段Androidアプリをいい感じに設計したいとお悩みの方にとっては道しるべになりそうな本というのが僕の感想です。 特にAndroid Frameworkの基礎知識や定番ライブラリ(Databinding, Dagger2, RxJava等)の使い方をある程度理解した上でこれを読めば非常に効果的だと思いました。(そうでない方も設計のエッセンスを学ぶことができます。)
お値段的にも買いやすくなっててありがたいです。会社用にもう1冊買って同僚にも読んでもらおうと思っています。
DroidKaigi 2018に参加しました(DAY.02)
DAY.02
Day.01からの続き(まとめるのに随分時間かかったなぁ。。
Anko試食会
凄くシンプルに書けるんだけどlayout xmlを調整してくれるデザイナーとの分業はどうすればいいかなぁと感じました。View Componentを上手く切り取って分担していく形になるのかな🤔
Elastic Team Building
弊社は小さい会社で大体エンジニアは1人かたまに2人という体制なのですが、だんだん人がいないと辛いなーという状況になってきているのでチームビルディングについて知りたくて参加。
初期のチーム構成が似ていて親しみを感じたがそこからいきなり優秀な外国人エンジニアを大量採用していて勢いを感じましたw サバイバルフェーズ、成長フェーズ、自己組織化フェーズの3つのフェーズがあり、おそらく3つのフェーズを行き来しながら最終的には自己組織化フェーズに安定させるのがゴールなのかなと感じました。
あとコミュニケーションがクローズドな場所で行われる傾向なのもあるあるだなと感じました。 オープンな場所に持ち込んでいく努力は常に必要。
Slackのpublic率大事📝 #droidkaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
会議も何が目的なのか? 会議の場でなければダメなのか? を常に考える必要がある。(耳の痛い話だ... 弊社はよく進捗確認のために会議を開きがちなのだけれども進捗を適切に管理するツールで情報共有できていれば別に会議は必要ないしなぁ...
参考に挙げられていた早速Elastic Leadershipを買ったので読もうと思います。
- 作者: Roy Osherove,島田浩二
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/05/13
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
ランチ🍱
ランチの時間 #DroidKaigi pic.twitter.com/HOgHtaUCa8
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
会場でお昼ごはんを食べていると横の席でChetとRomainが他の参加者に混じってランチを食べていたのでびっくりw 写真
ChetとRomainが横の席でランチ食べとるw
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
How Android Rendering Works to Provide Pixels on the Screen Faster than You Can Read this Sentence
#DroidKaigi pic.twitter.com/jwZTgEmAD9
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
Google I/OなどでおなじみのChet HaaseとRomain GuyがDroidKaigiにやってくるということで参加。 AndroidのViewが画面上に描画されるまでのステップを説明するセッションでした。
内容的にはAndroidを支える技術Iの内容に近く、あーちゃんと読んで予習しておけばよかったと後悔(´・ω・`)
Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)
ViewRootImplが出てきて有野さんのAndroidを支える技術をちゃんと読んどけばよかったと後悔(^_^;)
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
Support LibraryのDownloadable FontsやEmojiCompatに対応したアプリを作ろう
takahiromさんによるDownloadable FontsやEmojiCompatのセッション。
特にEmojiCompatは下のTogetterのまとめのように古い機種だと新しい絵文字が表示できない問題が目立ち始めているので気になるところ。
「Android民「iPhone民から♂♀とか性別のアピールが送られてくるのはなぜ?」「流行りかと思った」」が伸びてるみたい。内容が気になるね! https://t.co/f0FQaA0cBS 作成者: @enusakucm
— トゥギャッター (@togetter_jp) 2017年12月22日
CalligraphyからFontリソースに移行するためのライブラリを独自に作っちゃうところがすごい。
あと僕がpotatotipで発表したときの記事が参考文献に挙がってたのが地味に嬉しくてセッション後に挨拶に行きましたw
前にpotatotipで発表したプレゼンが参考文献に出てて嬉しみが増した☺
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
Android案件の見積もりに現れる要素、あるいは丁寧に埋設された地雷たち
eaglesakuraさんのセッション内容どこかで見たことがあるなぁと思ってたんですがQiitaでバズってた記事を書いていた人だったのを後で知りました。
とくにiOS版が既にある(または開発が先行している)場合やチーム開発での想定外はあるあるすぎて頷くしかない。
あと、個人的にはライセンスをリーガル部門に確認してもらうのでOSSリストを出してってのが意外と面倒でした。 だってSupport LibraryとかConstraint LayoutってGithubにあるOSSライブラリのようにライセンス表記がページに載ってないので(どうせApache Licenseだろとは思ってても)第三者に説明しづらいんですよ(みんなどうやって説明してるんだろう。。。。
ライブラリのライセンス確認&申請書作成が面倒くさかったことがw #droidkaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
ConstraintLayout, now and future
英語セッションだし内容も難易度が高かったですがConstraintSetは試したくなってきたしもうすぐ出る1.1の新機能(Barriers, Groups, Placeholder, Circular Constraint!)やさらに先の2.0に向けての予定も聞けて良かったです。
ConstraintLayoutはConstraintSetを使うと強そうだが2.0でもっと強くなりそう… #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
セッション後に質問をしにいったのですが英語力なさすぎて理解できずに辛かったので来年までにはなんとかしたい(´・ω・`)
HTTPS通信の基本からNetwork Security Configurationまで
証明書Pinningとか知らなかったので勉強になりました。証明書の運用を考慮しないといけないが是非入れてみたい。
TrustKit-AndroidでN以前の端末でも証明書Pinningができる。こんなOSSがあったのか。https://t.co/RcmJUQk0ZQ#DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月9日
コードで見るFlutterアプリの実装
終盤だんだん疲れてきたのかTweetしなくなってきてたw Flutterは去年のGDG Tokyoでの発表を聞いていて、View部分をDartで実装したのがFlutterという認識でこれ実戦投入できるかなぁと様子見でした。
今回こにふぁーさんはFlutterでiOS版のDroidKaigiアプリを出していたので試しに会社のiPhoneにインストールしてみたら結構サクサク動いてる。 しかもボタンを押した時にマテリアルデザインのripple effectもちゃんと機能してる! Flutterの標準Widget群は結構整備されている印象でした。
開発環境はIntelliJでできてホットリロードも早いらしい。。あとデバッグができるかは聞きそびれた...(´・ω・`)
あとAndroidエンジニアから見たときにApple神の審査は大変そうだなと感じました。ただ、Google Playも突然BANしたりしますけどねw
Gradleプラグインを作って開発効率を改善しよう
Deploygateのtnjさんのセッション。ニッチだけどカスタムのGradle Pluginって使いこなせれば生産性上がるんじゃないかなと思って聞きに行きました。 Step by Stepで最終的にpluginとして公開するまで書かれていてとてもわかり易かったです。
二日間を振り返って
脳みそがいっぱいいっぱいになった二日間でした。これから色々見返して実践していきたいと思いました。 他に見に行きたいセッションは沢山あったんですが幸いYouTubeで公開してくれるということなので楽しみに待ちたいと思います。
運営については毎年規模が増えていく中でも各所に改善があるのはすごいーと感じました。 ひつじさんや他の運営スタッフの皆さんのDroidKaigiへの情熱には頭が下がります。blogの記事も色々拝見しました。 また来年も参加したいです。できれば培った知見をDroidKaigiで還元(発表)できたらいいなーと思いました。
DroidKaigi 2018に参加しました(DAY.01)
2017に続き今年もDroidKaigiに参加できました。ちょっと長くなりそうなので分けました..
DAY.01
昨日遅くまで仕事していたので安定の遅刻orz
今年も寝坊で辛い(´・ω・`) #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
Deep dive into LayoutManager for RecyclerView
thagikuraさんの英語セッション。Githubで10K starを取ったという話が出たときには周りから拍手が起きていました👏 感想としてはよほどじゃない限りは既存のLayoutManagerを使うのが良さそうですが仕組みを勉強できて良かったです。
カスタムLayoutManagerをプロダクションに持っていくにはやることが色々ある #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
ランチ🍱
ランチ頂きます! #DroidKaigi pic.twitter.com/92Gffv8lc7
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
Androidで動画コンテンツを扱うTips
仙波さんのセッション。動画(ストリーミング)再生は経験がないものの興味があったので参加。 ストリーミング配信の規格(HLSやMPEG-DASH)の概要の後、ExoPlayerを構成するコンポーネントの説明、最後に自作のライブラリを用いたライブ配信デモがありました。
HLSとRTMPではレイテンシーに結構差があるなーという印象。サーバー側の実装が気になるけどスマホ側はすぐにでも試せそうだなーと思いました。
fragmented mp4ファイルはrange requestで部分的に取得可能なのか #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
RTMPはヘッダがシンプルでリアルタイムな一方でCDNに載せにくいので配信側でよく使われる #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
Kioskアプリと端末の作り方
tomoya0x00さんのセッション。去年potatotipsでさわりを聞いていたので参加。
Device Ownerやばいわーというのが感想だけどペアレンタルコントロールや企業内の管理で役に立ちそうな印象。絶対落ちないアプリを作っていこうな💪💪💪
Kioskのセッションはおもったより人多いな #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
Device Ownerは6.0からsilent installができるのか #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
Device Ownerやりたい放題できそうw #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
MediaCodecで動画編集をしてみよう
再生と配信は完全に理解した(わかっていない)ので次は編集について聞いてみようということで参加。Instagramでデコレーションされた動画とかよく見かけるようになったし。フィルターがOpenGL ESで実装されていてちゃんとやるならこの辺を勉強していかないといけないなーという印象。
ライブラリがあるので簡単なとりあえず試すのは可能。
実例で理解するMaterial Design Animation
アニメーション処理が苦手なので参加。実際のアプリ(Wantedly People)で使われているShared Element Transition処理の解説。 使い所が少しわかったのでどこかでチャレンジしてみたい。
USB接続するアプリを開発した時に試行錯誤した事
USB接続するAndroidアプリはニッチだけど以前似たような案件をやっていたので参加。開発の最初期はハードがまだないのでどうやってAoA接続を確認すればいいのか思考錯誤しながら作成したのを思い出しました。 特殊な許可が必要だとか実装は特殊ですが一度接続がopenしたら後は普通のSocket通信と同じ。ただ、OSのバグに引っかかったりすることもあるw
USBAccessoryはダイアログが2種類でて混乱するときあるね #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
ハードがない段階ではAoA接続の確認は辛いよねー #DroidKaigi
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
結局ガッツリ使わなかったけどGoでAoAできるやつ https://t.co/nZ6OUW3wlJ #droidkaigi_room2
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
パーティー🍣
会場が広くなってしかも休める場所やアーケードゲームや大型プロジェクションでスーファミとか色々グレードアップしていた。 惜しむらくはもっとネットワーキングしていきたかった!
🍣🍣🍣 #DroidKaigi pic.twitter.com/qvDf0OEnNZ
— tsuyoshi uehara@転職活動中 (@uecchi) 2018年2月8日
寿司は美味しかった。🍣スポンサーのLINEさんありがとうー
#DroidKaigi にてLINEはシルバースポンサーとして協賛していますが、懇親会での寿司スポンサーとしても協賛しております!職人による本物の寿司をご堪能くださいね!🍣 pic.twitter.com/OeLEDbRF4f
— LINE_DEV (@LINE_DEV) 2018年2月8日
DAY.02に続く...