JavaでWeb開発してた僕がAndroidアプリ開発案件に入る時に何を予習したのか

4月からAndroidアプリの開発案件に飛び込むことにしたので、それにあたって事前に勉強したこと、今まさに勉強していることをまとめておきます。

## 前提

### 私の状況

* Java歴3年 / Clojure歴1年弱
* Webアプリ開発の経験3年
* iOS / Android共に経験なし

### 案件の状況

* Kotlin x RxJava x Clean Architecture x ドメイン駆動開発
* すでにAndroidをバリバリ書いている人が9割
* 絶賛開発中

## 開発に参加するために獲得したいスキルセット

* [そもそもAndroidアプリ開発の雰囲気を把握したい](#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82android%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%AE%E9%9B%B0%E5%9B%B2%E6%B0%97%E3%82%92%E6%8A%8A%E6%8F%A1%E3%81%97%E3%81%9F%E3%81%84 "#そもそもandroidアプリ開発の雰囲気を把握したい")
* [Kotlin書けるようになりたい](#kotlin%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%9F%E3%81%84 "#kotlin書けるようになりたい")
* [プロダクトに入っている各種ライブラリを使えるようになりたい](#%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%90%84%E7%A8%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%9F%E3%81%84 "#プロダクトに入っている各種ライブラリを使えるようになりたい")
* [設計思想を学びたい](#%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3%E3%82%92%E5%AD%A6%E3%81%B3%E3%81%9F%E3%81%84 "#設計思想を学びたい")

## そもそもAndroidアプリ開発の雰囲気を把握したい
Webからアプリへの以降は少なからずパラダイムシフトを内包しているので、まずは雰囲気を知りたいですよね。
私は以下を通して、

* どんな部品が集まってアプリが構成されているのか
* どんな文化や常識があるのか

をメゲずに学ぶことができました。

### Google謹製の動画講座: 基礎編
|||
|:--|:--|
|難易度|:star:|
|かけた時間|10時間|

[Udacity](https://udacity.com)という動画学習サイトで、Googleが作った講座が無料公開されています。
コースはいくつもあるのですが、私は以下をサラッとやりました。JSONとは？みたいなパートもあるので、全部クリアする必要はありません。ガツガツ飛ばしてください。

* [Android Basics: User Input(ユーザーの入力情報を受け取る)](https://classroom.udacity.com/courses/ud836)
* [Android Basics: Data Storage(アプリ内部のDBの作成、SQLでの操作)](https://classroom.udacity.com/courses/ud845)
* [Android Basics: Networking(ネットとの通信 / APIとのコミュニケーション)](https://classroom.udacity.com/courses/ud843)

画面の作り方講座は取らなかったのですが、HTMLが分かればとりあえずはウンコード :shit: でも書き始めることはできました。

この講座の良いところは、

* めっちゃ親切設計のスモールステップ
* 学習の要点以外は全部完成してるプロジェクトにたくさん触れられる

ことです。
GoogleのAndroidチームの人が表情豊かに話してくれます。言語は英語ですが、図がたくさん出てくるので雰囲気でわかります。

<img width="581" alt="図つきで説明してくれる" src="https://qiita-image-store.s3.amazonaws.com/0/57085/f30414b4-14c2-c820-7d26-cc4a9bd86532.png">

要点の箇条書きもたくさん入ってて

<img width="547" alt="箇条書きでさえ丁寧" src="https://qiita-image-store.s3.amazonaws.com/0/57085/77dd3892-2ef1-ee98-0628-29336bbc734b.png">

これがそのまま課題の画面になったりします。なめらかなUIですね！

<img width="548" alt="そのまま課題が始まっちゃう" src="https://qiita-image-store.s3.amazonaws.com/0/57085/fca7edfe-9078-226a-2b19-6140904438aa.png">


コードの編集をしたあとはすぐに回答のパートがあります。もちろんGitHubにも回答は載っていますので、手元で動かして確認もすぐできます。

このように小さなステップを繰り返すことで、とにかくAndroidアプリの雛形にたくさん触れられて、なんとなく雰囲気を察することができました！

### Google謹製の動画講座: 実践編

|||
|:--|:--|
|難易度|:star::star::star:|
|かけた時間|10時間|

同じく[Udacity](https://udacity.com)のGoogle製レクチャーです。

* [Developing Android Apps](https://classroom.udacity.com/courses/ud851)

こちらは上記講座をわかったうえで一通りの機能を使ったアプリを書いてみることができます。私は基礎の基礎と、仕事で即使いそうなAPI通信とDB周りをやりました。
GitHubの使い方とかも載ってるので、Web開発経験のある方は不要だと思います。ガツガツ飛ばしてください。

この講座も、ちょっと難易度は上がりますが相変わらずの親切設計です！

## Kotlin書けるようになりたい

> KotlinはベターJavaだからそんなに学習コストは高くない

とは事前に聞いていましたし、実際JavaでStream APIを使ったことがあれば困りません。
ただし当然というか、思想がJavaとは違う部分があるので、パッと理解ができなくて苦しい瞬間もあるにはあります。そこまで甘くはなかった。

### Kotlin Koans

|||
|:--|:--|
|難易度|:star:|
|かけた時間|10時間|

プログラミング言語の特徴がわかるかんたんな問題集のことをKoansといいますが、その Kotlin版です。JetBrains社が作っていて、テストを通るようにしていくことでKotlinの特徴的な機能が大まかにわかります。

## プロダクトに入っている各種ライブラリを使えるようになりたい

今回のプロダクトでは、API通信に[Retrofit](https://square.github.io/retrofit/)、ORマッパーに[orma](https://github.com/gfx/Android-Orma)、DIコンテナに[Dagger](https://google.github.io/dagger/android.html)、そして非同期処理に[RxAndroid](https://github.com/gfx/Android-Orma)を使っています。

### それだけを使った小さなアプリを1から書いてみる

|||
|:--|:--|
|難易度|:star::star:|
|かけた時間|6時間|

[Udacity](https://udacity.com)の講座を通してアプリの作成手順がなんとなくつかめてきたので、次はプロダクトで使っているライブラリを1つずつ試します。

とはいえまだ自分で1からアプリを書いたことがないので、まずは復習がてらTodoアプリを書いてみました。

<img width="308" alt="TodoApp" src="https://qiita-image-store.s3.amazonaws.com/0/57085/2d706277-3f41-d6a7-daa3-86e4d9cb3c47.png">

ToDoアプリが言語とかライブラリのチュートリアルの定番な理由がわかりました。ToDoアプリくらいさくっと何も見ずに作れるようになっておかないとその後の複雑な仕事なんて絶対できないって意味だったんですね。

その後、[Retrofit](https://square.github.io/retrofit/)を使ってQiita APIを叩いて新規投稿をリスト表示するアプリを書きました。

<img width="307" alt="QiitaReader" src="https://qiita-image-store.s3.amazonaws.com/0/57085/0691505b-c63e-5f53-9ae6-51da5128ca93.png">

別スレッド処理は[RxAndroid](https://github.com/gfx/Android-Orma)で実現しているので、ここで一緒に練習できました。あとでKotlin化も試してみることができて、Kotlin x Androidにも少し触れられました。

> [RxAndroid](https://github.com/gfx/Android-Orma)は、RxJavaの思想が最初しっくり来なくて困ってたら同僚が良い記事を教えてくれて、それでだいぶ捗りました。

> * [直感的に理解する RxJava](https://android.benigumo.com/20160331/rxjava-part1/)

[orma](https://github.com/gfx/Android-Orma)ではかんたんなデータの記録アプリを作ってみました。

<img width="307" alt="MoodKoro" src="https://qiita-image-store.s3.amazonaws.com/0/57085/0b110a96-5245-190b-14ac-dee54d404a7e.png">

こちらもデータの登録時はRxAndroid](https://github.com/gfx/Android-Orma)で別スレッドでの処理を行っています。

[Dagger](https://google.github.io/dagger/android.html)は、上の記録アプリに組み込むつもりです。今頑張ってます。

### 全部組み合わせる

|||
|:--|:--|
|難易度|:star::star::star:|
|かけた時間|---|

上の記録アプリをそれにするために、日夜開発に励んでいます。

## 設計思想を学びたい

プロダクトが礎に選んでいるClean ArchitectureとDDDについては、正直に言って自分でできたことはあまりなくて、入ってからチーム内のwikiを読んだり、チームメンバーに教えてもらって理解を深めています。

### DDDに関する簡単な本を読む

|||
|:--|:--|
|難易度|:star:|
|かけた時間|(読書中だが今までのペースを見るに、終わるまで)4時間|

本当はエリック・エヴァンズ本を読むべきだと思いますが、まずDDDの先輩であるチームメンバーと話せる知識をつけるべく、[わかる！ドメイン駆動設計 ～もちこちゃんの大冒険～](https://techbooster.booth.pm/items/392260)を読んでいます。
むしろチームで朝会後に読んでいます。

## 参考になれば幸いです

上記のことは勿論自分を助けてくれてはいますが、当然全然足りなくて日々勉強しっぱなしです。
とはいえ何もわからない状態を脱するには悪くなかったと現時点では思っているので、同じような状況の方の参考になれば嬉しいです！