未経験Androidエンジニアの1年を振り返る

## はじめに
未経験からAndroidエンジニアになって1年がたったので、ざっくりやったことを振り返っていく。

## 入社前

医療系の仕事をしていて、プログラミングとは無縁な環境。
趣味でAndroidアプリ開発をやってみたらドハマりして、休日は個人開発をしながらずっとコードを書いていた。
Androidアプリの仕事したいな～と思ってたら、幸運にもtwitter経由でAndroidエンジニアとして受け入れてくれる転職先が決まりました。

### 活動
- Android開発(6カ月)
  - 個人アプリを3つ作成
  - Android Jetpack等の基本的なライブラリを使える程度
- 競技プログラミング(2カ月)
  - 転職前に暇だったのでやってみたがかなり面白かった
  - 最初はpythonでやっていたけど、Kotlin大好きなのでKotlinで挑戦していた
  - たくさんコードを書く機会を得て、論理的な考え方やコードの実装イメージが身についた
    - A,B問題はスムーズに解けて、運がいいとC問題が解ける程度の実力
    - Androidの実装スピードもかなり速くなったので、かなりやって良かった


### この頃に読んだ本

- [基本からしっかり身につくAndroidアプリ開発入門](https://www.amazon.co.jp/%E5%9F%BA%E6%9C%AC%E3%81%8B%E3%82%89%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FAndroid%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-Android-Studio-3-x%E5%AF%BE%E5%BF%9C-%E9%BB%92%E5%B8%AF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07D71LZGS/ref=sr_1_9?keywords=android+%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA&qid=1662277710&s=digital-text&sprefix=android%2Cdigital-text%2C199&sr=1-9)
  - なにも分からない状態でAndroid開発の基礎を身につけた
  - 最初の1カ月はこの本を読んで、後はひたすら独学でコードを書きまくった
  
- [イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3/dp/4797388811/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3CBE2ZCGFGC2&keywords=web%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC&qid=1662278283&sprefix=web%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC%2Caps%2C170&sr=8-1)
  - API通信を実装するうえで、そもそもサーバーとか通信方式等の知識が皆無だったので選書
  - イラスト多めで、見開き完結の内容で読みやすく概観が理解できる良書

- [リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?adgrpid=56076398369&gclid=Cj0KCQjwmdGYBhDRARIsABmSEeNV6kqmBkgOvXrQFeXohIOl19nwE9GRKAYY3KnpgCluwKJaorcO0T0aAnkMEALw_wcB&hvadid=591886305975&hvdev=c&hvlocphy=1009252&hvnetw=g&hvqmt=e&hvrand=9988822663438463184&hvtargid=kwd-334758528225&hydadcr=27298_14541127&jp-ad-ap=0&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB+%E3%82%B3%E3%83%BC%E3%83%89&qid=1662278195&sr=8-1)
  - コードを書き始めたころに変数の命名の正解が分からず迷っていたので選書
  - 良い命名の基本原則を理解するうえで有用
 
- [Androidテスト全書](https://peaks.cc/books/android_testing)
  - 初めて中規模のアプリを作ったら、しこたまバグが発生してバグを減らす特効薬になるかと思い選書
  - ネット上で得られるAndroidのテストコード関連の情報は断片的で理解できなかったので、体系的に学ぶためでもある
  - 未熟な状態で読んだので内容を半分くらいしか理解できず、テストコードの必要性もあまり感じられなかった
    - ソフトウェア開発のバグとの向き合い方は「気合と根性」で銀の弾丸はないのか、、、と落胆した
  - 後々、実務でめちゃくちゃこの本の知識が活きたので読んでよかった

- [アルゴリズムとデータ構造](https://www.amazon.co.jp/%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B-%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87/dp/4065128447/ref=sr_1_2?keywords=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&qid=1662280033&sprefix=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%2Caps%2C217&sr=8-2)
  - 競技プログラミングをやっていて、アルゴリズムとデータ構造分からなくて問題解けなかったので選書
  - 内容が個人的にかなり面白く、コンピューターサイエンスを学びたい欲が高まった


## 入社1~3ヶ月(研修)

AndroidエンジニアとしてSESに入社。
フルリモートで最初の3カ月は研修を行いました。研修はFirebaseを利用したAndroidアプリを一人で機能要件、デザイン含めて決めて製造するという内容。
社内のAndroid歴10年以上の激つよAndroidエンジニアにコードレビューして頂ける恵まれた環境で、とにかくコードを書きまくっていた時期。

### 活動
- Firebaseの経験
  - サーバーに近い部分は触ったことが無かったため、firebaseを触ってみてバックエンドの雰囲気が理解できた
  - 公式ドキュメントを読みこむことの重要性を理解する
- 問題解決精度の向上
  - それまでは、根拠なくコードの一部分を変えてみて、運よく期待した挙動になるまで闇雲に模索していた
  - エラーログに重要な情報が書いてあるので、しっかりエラーログを読めばだいたい解決するという知見を得た
- Androidプラットフォームへの理解
  - ライフサイクルを適切に扱うための知識を得た
  - プッシュ通知への理解
- きれいなコードへの意識が強まる
  - 個人開発のコードは自分だけが理解できればよかったが、コードレビューをされて他人が読みやすいコードの重要性に気づく

### この頃に読んだ本
- [テスト駆動開発](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884/ref=sr_1_1?keywords=%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA&qid=1662279149&sprefix=%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%2Caps%2C186&sr=8-1)
  - やはりバグを未然に防ぐにはテストコードが処方箋になるのでは、の思いから選書
  - 実際にTDDするかはさておき、コーディングの考え方はかなり参考になった
  - 「手で実行したテストは費用、コードで記述され自動化されたテストは資産」の思想が強まる
- [プリンシプル オブ プログラミング](https://www.amazon.co.jp/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB-%E3%82%AA%E3%83%96-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B03%E5%B9%B4%E7%9B%AE%E3%81%BE%E3%81%A7%E3%81%AB%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84%E4%B8%80%E7%94%9F%E5%BD%B9%E7%AB%8B%E3%81%A4101%E3%81%AE%E5%8E%9F%E7%90%86%E5%8E%9F%E5%89%87-%E4%B8%8A%E7%94%B0-%E5%8B%B2/dp/4798046140/ref=sr_1_2_sspa?keywords=%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB%E3%82%AA%E3%83%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1662281978&sprefix=%E3%81%B7%E3%82%8A%E3%82%93%E3%81%97%2Caps%2C230&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzM1pYTU5WOEJCSTZMJmVuY3J5cHRlZElkPUEwOTg5MTE0MUMxU0ZOVUpLRDlaNSZlbmNyeXB0ZWRBZElkPUFKWlNHRDFYQ0xLWjcmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)
  - 激推し本。重要な原理・原則がまとまっていてすこぶる良い内容。
  - 高品質なコードへの解像度が高まって、コードの質が爆上がりした

## 入社3~6カ月(現場配属、設計)
赤ちゃん状態でAndroidアプリの新規開発案件に入る。
赤ちゃんなのでビビり散らかしてた。
Android担当は2人で、自分は主に技術調査とか設計を担当していた。

### 活動
- 環境構築
  - yamlで書いたAPI設計書(openApi)から、ローカルマシンで動くモックサーバーを建てたり、Koltinのコードを自動生成する環境を作った
  - 本当になんも分からん状態で、Node.js使ったり、Groovyのコード書いたりしてアホみたいに大変だった
- 技術調査
  - 採用するライブラリの選定するために、できること・できないこととかを調べて資料作ったりした
    - この辺りから検索で日本語を使わなくなり、英語を頑張って読み始める
- 設計
  - Excelカキカキする作業
  - アーキテクチャとかバックエンドの概要とかも学べて、Androidに限定せずバックエンドの視点も増えた
  
## 入社6~9カ月(製造)
現場にも慣れて一人で二足歩行できるようになってきた。
本格的にアプリ開発が始まり、この頃Androidチームは最盛期に7人になる。
なぜかサブリーダー的なポジションになり、戦々恐々しながらクソつよエンジニアの皆さんにお願いしたり、PMや外部の会社と交渉したり、とにかく多忙だった。

### 活動
- AWS SDKをAndroidに導入した
  - アプリとして特殊なことをやる必要があったため、情報が少なくて動かず、クソほど大変だった
  - 公式ドキュメントを見ても情報がなく、SDKのコードを読んで仕様を理解していた
    - SDKのコードを読みこんだことで、結果的に良質なコードに触れてソフトウェア設計への理解が深まる
- ゴリゴリコードを書く
  - 久しぶりにコードを書いたら楽しすぎて脳汁でた
  - つよエンジニアの方々と実装方法について議論する機会が増えて、急激に成長した
- コードレビューを行う側になる
  - 初めて多くの人のコードに直接触れる機会で、レビュー観点もこの頃よく分かっていなかった
  - スケジュールがひっ迫していたのもあり、動くからヨシ！のガバガバ観点でマージボタンを押してた
    - 1か月後に後悔する

## 入社9~12カ月(リファクタ、バグ修正)

激動の3ヶ月を終えて、ひとまずアプリが形になり落ち着く。
テストが始まりバグを修正する日々がはじまりコードを見返すと、そこには無残なクソコードが広がっていた。当初は有機的な調和を持っていたMVVMのコードが、数多のオレオレクソコードによって崩壊していたのだ。期日に追われて動けばヨシ！でマージボタンを押したのは自分なので、「クソコードが生まれてしまったのは自分に力がなかったからだ。」の自責の念に負われてクソコードを駆逐すべく強い殺意の波動に目覚めた。

### 活動
- 設計の目覚め
  - useCase, Domainについてざっくりを理解する
  - 設計思想について、つよエンジニアと議論したり、記事を読み漁ったりする
  - useCase導入した流れで、メンバーを巻き込んでテストコードを導入した
- Jetpack Composeに入門する
  - 宣言的UIはいいぞ
  - CodeLabを英語でやっていたら、突然英語を読めるようになった
- 海外の技術記事を読み漁る
  - 今まで行けなかった範囲に踏み出したら、強い武器がしこたま落ちててテンション上がる

### この頃読んでいた本
- [良いコード/悪いコードで学ぶ設計入門](https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89-%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2/dp/4297127830/ref=sr_1_1?keywords=%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%2F%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80&qid=1662303096&sprefix=%E3%81%84%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%2Caps%2C188&sr=8-1)
  - 書いている内容としてはプリンシプル・オブプログラミングともやや重なるが、コードの具体性があって理解しやすい
- [Not Silver Bullet](http://worrydream.com/refs/Brooks-NoSilverBullet.pdf)
  - とても有名な論文
  - 銀の弾丸はない
  - 固い英語で読みにくいが、示唆に富みまくったことを書いていて良い
- [A Philosophy of Software Design](https://www.amazon.co.jp/Philosophy-Software-Design-2nd-English-ebook/dp/B09B8LFKQL/ref=sr_1_1?keywords=philosophy+of+software+design&qid=1662282814&sprefix=philo%2Caps%2C205&sr=8-1)
  - ソフトウェアデザインの本質を突きまくっていてめちゃくちゃ面白い
  - 英語が読めるなら、ぜひ読んだ方が良い
 

## まとめ

総じて環境が良すぎた。割と裁量を任せられて自分主導で色々とやりたいことができたし、複数人の強いエンジニアと親しくなれて得るものが多すぎた。
一個人のコーディング能力があっても、チーム開発で発生するコードの崩壊は防げないというのが強烈な出来事として残った。設計等の仕組みで対応しなければいけないという思い。
バグを減らすためにコードの品質を上げることに魅力と価値を感じているので、そこを高めていきたい。

## 今後の展望

- 個人開発もっとやりたい
  - 今年は業務で手一杯だったけど、余裕が出てきたので
  - Jetpack Composeをもっと触りたい
  - Wear OSも興味ある
- Android以外も触りたい
  - iOS
    - 本腰を入れるつもりはないが、モバイルエンジニア名乗るならやっておきたい
    - KMMとかも試してみたい
  - web系の技術
    - LINE Bot辺りが気になっている