Slide 1

Slide 1 text

あるあるLT Android採用編 @nabetaro_jp

Slide 2

Slide 2 text

自己紹介 ๏ なべ@nabetaro_jp ๏ and factory.inc ๏ Android エンジニア ๏ 漫画アプリ開発 #スクラム #採用 #チームビルディング #iOSビギナー

Slide 3

Slide 3 text

エンジニアの採用に かかわってますか ! \あるある/

Slide 4

Slide 4 text

Developers Boostで 「採用にコミットした話」で登壇してきました \いいね/

Slide 5

Slide 5 text

Android面接の質問あるある その質問したことある→あるある いい質問ですね→いいね

Slide 6

Slide 6 text

? Q. Kotlinで開発したことあります? あるある! いいね!

Slide 7

Slide 7 text

Kotlinでの開発経験は重要 ๏ 2017年にKotlinが正式にサポートされたのもあり、Javaでの開発はあま り見られなくなった。 ๏ Android KTXなどKotlinの言語機能(拡張、プロパティ、ラムダ、 名前付きパラメータ)をつかうことでよりコードがシンプルに! ๏ String.toColorInt()とか、Collections.joinToString()とか ๏ 業務経験もあるといいけど、さすがにつかっておいてほしいなぁ ๏ Swift -> Javaはむずいけど、Swift -> Kotlinは意外といける

Slide 8

Slide 8 text

例:bundleOf class TitleFragment : Fragment() { companion object { fun newInstance(titleId: TitleId) = TitleFragment().apply { arguments = bundleOf(KEY_TITLE_ID to titleId) } } }

Slide 9

Slide 9 text

例:bundleOf class TitleFragment : Fragment() { companion object { fun newInstance(titleId: TitleId) = TitleFragment().apply { arguments = bundleOf(KEY_TITLE_ID to titleId) } } }

Slide 10

Slide 10 text

? Q. アーキテクチャパターンは どれを採用したことがあります? あるある! いいね!

Slide 11

Slide 11 text

Android MVVMは知見の宝庫 ๏ Googleのアプリのアーキテクチャガイドでも推奨されている ๏ Model, View, ViewModelの頭文字 ๏ Jetpack, Kotlin Coroutinesなしではシナジーが最大化しない

Slide 12

Slide 12 text

viewModelScope fun fetchData(titleId: TitleId) { viewModelScope.launch { _uiState.postValue(UiState.Loading) when (val result = fetchTitleUseCase.execute(titleId)) { is Result.Success -> { _uiState.postValue(UiState.Loaded) _data.postValue(result.data) } is Result.Failure -> { when (val e = result.error) { is TopError.NetworkError -> _uiState.postValue(UiState.Retry) is TopError.TopClientError -> { _uiState.postValue(UiState.Error) showPopupAction.postValue(Event(e.popup)) } else -> showErrorCommand.postValue(e) } } } } }

Slide 13

Slide 13 text

viewModelScope fun fetchData(titleId: TitleId) { viewModelScope.launch { _uiState.postValue(UiState.Loading) when (val result = fetchTitleUseCase.execute(titleId)) { is Result.Success -> { _uiState.postValue(UiState.Loaded) _data.postValue(result.data) } is Result.Failure -> { when (val e = result.error) { is TopError.NetworkError -> _uiState.postValue(UiState.Retry) is TopError.TopClientError -> { _uiState.postValue(UiState.Error) showPopupAction.postValue(Event(e.popup)) } else -> showErrorCommand.postValue(e) } } } } }

Slide 14

Slide 14 text

viewModelScope fun fetchData(titleId: TitleId) { _titleId = titleId viewModelScope.launch { _uiState.postValue(UiState.Loading) when (val result = fetchTitleUseCase.execute(titleId)) { is Result.Success -> { _uiState.postValue(UiState.Loaded) _data.postValue(result.data) } is Result.Failure -> { when (val e = result.error) { is TopError.NetworkError -> _uiState.postValue(UiState.Retry) is TopError.TopClientError -> { _uiState.postValue(UiState.Error) showPopupAction.postValue(Event(e.popup)) } else -> showErrorCommand.postValue(e) } } } } } ๏ ViewModelScopeでJob のキャンセルをVMのライフサ イクルに紐づけることで非同 期処理の管理が楽に

Slide 15

Slide 15 text

だいじなところは何なのか ๏ Android アプリ設計パターン入門 ๏ Fat Activity問題 : 複雑性の増加による開発速度の低下 ๏ Dagger2 : DIライブラリ。Annotationによるコンパイル時のコード生成ベー ス。クラス間の結合度を低下させるため、アジャイル開発やテストに強い。 ๏ RxJava2 : リアクティブプログラミング用。コールバック地獄対策。非同期 処理の実装だけだと学習コストが高いのでCoroutineを使うことが増えた。 ๏ 実際の開発現場のハナシ

Slide 16

Slide 16 text

? Q. Android JetPackについて 知っていることをおしえてください あるある! いいね!

Slide 17

Slide 17 text

高品質かつ簡単に作成するためのライブラリ ๏ 5年前の開発を考えると泣きそうになる ๏ もはやこれなしでは生きていけない ๏ KTX ๏ AAC(Android Architecture Component) ๏ Lifecycle, ViewModel, LiveData, Room, Navigation.. https://developer.android.com/jetpack?hl=ja

Slide 18

Slide 18 text

? Q.Networkの処理とかどんな感じで かいたりします? あるある! いいね!

Slide 19

Slide 19 text

Retrofit + OkHttpは すでにデファクトスタンダード ๏ AsyncTaskを覚えているだろうか?2012年くらいでしょうか・・ ๏ AsyncTaskが抱えていた問題 https:// www.techyourchance.com/asynctask-deprecated/ ๏ Square製 ๏ 今年の6月Version 2.6.0(最新は2.7.0)でサスペンド修飾子がサ ポートされ、HTTPリクエストをcoroutineを使ってかけるようになった @GET("users/{id}") suspend fun user(@Path("id") id: Long): User https://www.techyourchance.com/asynctask-deprecated/

Slide 20

Slide 20 text

Retrofit + OkHttpは すでにデファクトスタンダード ๏ AsyncTaskを覚えているだろうか?2012年くらいでしょうか・・ ๏ Square製 ๏ 今年の6月Version 2.6.0(最新は2.7.0)でサスペンド修飾子がサ ポートされ、HTTPリクエストをcoroutineを使ってかけるようになった @GET("users/{id}") suspend fun user(@Path("id") id: Long): User Retrofitてかいてますやん

Slide 21

Slide 21 text

Androidアプリ開発が簡単になってきた

Slide 22

Slide 22 text

知識を聞いてきたけど ほんとにそれでいいのだろうか?

Slide 23

Slide 23 text

“経験を積んだ人は物事がこうであることを 知っているが、なぜそうであるかは知らない” マルティン・ハイデッガー

Slide 24

Slide 24 text

• 「なぜ」とは自分の動機、ビ ジョンや理念のこと。 • 自分が信じているwhyを語り共 感が生まれれば、人々を惹きつ けることができる。 ゴールデン・サークル

Slide 25

Slide 25 text

? 大事なのは「なぜ」 ๏ What < How < Whyの順番で答えるのは難しくなる ๏ なぜこの技術を使うことになったのか、経緯を知りたい ๏ 何を解決するものなのか、この技術が大事にしていることはなんなのか チームメンバーと開発する上で、納得感を持って作業するためにはなぜに 向き合う必要がある

Slide 26

Slide 26 text

良くも悪くもエンジニア文化にあった人を採用するには 「なぜ」からくる直感に耳を傾けなければならない

Slide 27

Slide 27 text

and factory Advent Calendarでも まとめてみましたのでよかったら見てください \いいね/ https://qiita.com/nabetaro_jp/items/eb9f6fd4f596b38f56cf

Slide 28

Slide 28 text

おしまい