【Kotlin】レコチョクのAndroidエンジニアになるまで

Advent Calendar 2024, Kotlin

この記事はレコチョク Advent Calendar 2024 の10日目の記事になります。

はじめに

株式会社レコチョクのAndroidアプリ開発グループに所属している瀬川です。

先日 「進撃の巨人」完結編 The Last Attackを映画館で視聴し、大画面・大音量の進撃の世界に圧倒されたことで、最近は「進撃の巨人」のサウンドトラックにどハマりしております。

そんな私は社会人になってから4年経ちましたが、実はレコチョクに入社してから1ヶ月ちょっとしか経っていない 新米アプリエンジニアなんです。

前職ではShopifyで構築されたECサイトのコーディングやWordpressサイトの改修などを行っており、使用していた言語は HTML/CSS/Javascipt/Liquidなのですが、Androidアプリ開発は Kotlin/Javaがメインなので全く違う言語&未経験での転職となりました。

この記事では、そんな私がレコチョクに Androidアプリエンジニアとして転職するまでに 学習した内容と流れ / 学習方法などを紹介します。

この記事で伝えたいこと

若干自伝のようなタイトルにもなってしまいましたが、この記事の目的は1人でも多くのAndroidアプリ開発の 勉強を頑張っている方・勉強を始めようとしている方、言語は異なるけど アプリ開発を学習中の方など、

現在エンジニア就職/転職を目指している方

に少しでも参考になれれば良いなと考えています。

そのためあえて自伝のように今までやってきたことを振り返り、学習方法の参考にもなれれば良いですが、何より やる気と行動力さえあれば「誰でも挑戦できる」という再現性を感じていただき、読んでいるあなたのやる気に少しでも繋がってくれると良いです!

実際の学習内容と流れ

では早速私が Androidアプリエンジニアとしてレコチョクに転職するまでに学習した内容とその流れを説明します。

そもそもなぜアプリエンジニアを目指したかについてですが、以前東南アジアで半年ほど「ノマドエンジニア」をしていた際に、タクシーアプリや宅配アプリ、翻訳アプリなどに毎日のように生活を救われていたからです。
「スマホアプリが人の生活の支えになる」ということを体感するには十分すぎる環境だったため、人の支えになるアプリ開発をしたいという想いがその期間に芽生えアプリエンジニアを目指すことになりました。

なぜ「Android」かという点については、全世界ではAndroidのシェア率が70%前後(私はiPhoneユーザー)と非常に多くの方がAndroidスマホを毎日使用しています。
そんな情報を目にした私は安直ではありますが、自分のアプリ開発という行動が世界に影響を与える割合はAndroidの方が大きいというシンプルな発想をし、Androidアプリエンジニアを目指すことにしました。

ということで、Androidアプリ開発の主流言語である Kotlinを学習していきました。
Androidアプリ開発においてはJavaが主流だったものの、2017年にGoogleがKotlinを公式採用したことで一気に人気になり、今やKotlinが主流言語となっています。

加えて、Googleが提供するUIフレームワークである Jetpack ComposeをUI開発のため学習していきました。こちらもAndroidアプリ開発におけるモダンな技術として使用されています。

学習の流れ(全体像)

私がAndroidアプリ開発の学習を始めてから転職に至るまでの流れです。

・開発環境を構築
・【基礎知識】Google公式のトレーニングコース
・いざ自作アプリ開発
・開発したアプリをGitHubで公開&ポートフォリを作成

レコチョクに転職するまでこの流れを経て学習しました。
では1つずつ説明します。

開発環境を構築

まずは開発環境の構築をしました。
環境構築は簡単で、PCに統合開発環境(Android Studio または IntelliJ IDEA)をインストールさえすればAndroidアプリ開発をすぐに始めることができます。

私はパッケージがおしゃれに感じたのでInteliji IDEAを使用していましたが、Android StudioはGoogleが公式に提供しているIDEで、Androidアプリ開発に必要なものは初めから揃っているため、とくにこだわりがなければAndroid Studioをオススメします!

【基礎知識】Google公式のトレーニングコース

開発環境が整ったら早速学習を始めました。
まずは インプットを最優先とし、Google公式が用意してくれているAndroidアプリ開発のトレーニングコースを利用して学習していきました。

このコースは Jetpack Compose/Kotlinの両方の基礎学習を網羅していて、2つの技術を使用してAndroidアプリを開発していく体験ができるコースになっています。

まずはコースで学習した内容について1つずつ簡単に説明します。

Kotlinの基礎文法

image-20241204011314295.png

まずはこのコースで学習した Kotlinの基礎文法についてソースコードと共に紹介します。

変数 / 関数

変数は「情報」を一時的に保存するための箱のようなものです。定義の仕方によって変更できるもの・できないものなど仕様が異なります。

関数は「特定の処理をまとめたもの」です。
fun 関数名(){} の形で定義し 関数名()で関数を呼び出す/使用することができます。

また、関数は特定のデータ(パラメータ)を受け取るようにすることができ、関数を実行するときにデータを渡すことでデータによって処理を変化させることもできます。

また関数は処理を実行後処理に応じた結果を返すこともできます。

条件分岐(if / when式)

条件分岐は、特定の状況に応じて異なる処理を行いたい場合に使用します。
if文は特に利用頻度が多いため覚える必要のある基礎知識となります!

クラス

クラスは「データ」とそのデータを使用して動作する「関数」をまとめたものです。

Null許容変数

Nullとは?
nullは「何もない状態」を意味します。変数の箱に何も入っていない、または「空っぽ」な状態を表します。

変数にnullを格納する可能性がある場合、そのままの変数ではnullエラーになってしまうため、型指定時に?(例:String?)を付けることで許容する変数として定義することができます。

List/Map/高階関数

ListやMapは「コレクション」と呼ばれるデータ構造のことです。コレクションとは、「複数のデータをまとめて扱う仕組み」のことです。

また「高階関数」とは、コレクションを便利に操作できる関数で各コレクションにデフォルトで用意されています。たとえば、「特定の条件に合うデータだけを取り出す」といった操作が簡単に行えます。

JetpackComposeの基礎知識

image-20241204011509948.png

続いてこのコースで学習した【Jetpack Composeの基礎知識】について紹介していきます。

Text / Image / Icon

[サンプル]
image-20241204031235629.png

Column / Row

[サンプル]
column_row.png

Box

[イメージ]
box.png

Button

[サンプル]
image-20241204031417476.png

Modifierについて

[サンプル]
image-20241204031427971.png

その他にもこんなModifierがあります
・ fillMaxSize()|幅と高さを親要素いっぱいに広げる
・ fillMaxHeight()|高さを親要素いっぱいに広げる
・clickable()|タップ時のイベントを設定
・ align() |子要素の配置を指定

スクロール可能なリスト(LazyColumnなど)

[サンプル]

カスタムのコンポーネントの作成もできる

作成サンプル

実際に使う場合

image-20241204032451948.png

【プチ応用】両技術を組み合わせて変化するUIを作成

ここからは少し応用になりますが、ユーザーの動き(タップなど)に合わせて変化するUIを開発する一例としてSteteFlowを使用した状態管理を紹介します。
StateFlowは、アプリで使用する要素の「状態」を管理し、その状態が変わったときにUIへリアルタイムで反映させるために使う仕組みです。

StateFlowを使用しない場合、例えば変数に新しい値を代入してもComposeの再描画(リコンポーズ)がトリガーされていないため、UIには変更が反映されません。

StateFlowを使用しない場合

このコードではButtonを押すことでanimalに「ネコ」という文字列が代入されanimalの内容は変わりますが、UIは「イヌ」のままになってしまいます。

StateFlowを使用した場合

このコードの場合Buttonを押したらStateFlowで監視していた変数の値が変わることで、Composeが再描画され、UIに変更が即座に反映されます。

基礎学習まとめ

これまで紹介した基礎知識以外にも、コルーチン(非同期処理)やラムダ式なども学習しました。
このコースではセクション毎に用意された個別のアプリを開発していながら、KotlinとJetpacl Composeの基礎知識を学習していくため、楽しく飽きずに学習を進めることができます!

また、程よくボリュームもあり、毎セクション終わった後には充実感も感じることができ、得られる知見や継続しやすいことも含めて「無料」とは思えないものでした。

このコースはまだ学習始めたての方にはとくにオススメですが、
これ以外にもトレーニングコースは用意されているので、自分に合ったコースを探してみても良いかもしれません。

いざ自作アプリ開発

Google公式のトレーニングコースを終え基礎知識を幅広くインプットできたところで、次は自作アプリ開発(実践経験)でアウトプットの量を増やしていくことにしました。

自作アプリ開発は自分が作りたいアプリを作る過程で、
・「アウトプット」することで基礎知識の定着
・いざ作ってみないとわからない実践技術の「インプット」

の両方を叶えることができます。
エンジニアを目指している方は力をつけるのにもってこいですので、ぜひ挑戦してみてください。

転職するまでに開発したアプリ

・電卓アプリ
・タスク登録/管理アプリ(ツミアゲ)
・クイズアプリ など

今回はその中でも電卓アプリについて紹介します。

電卓アプリ

電卓アプリはアプリエンジニアの登竜門という話を聞き、1つ目は電卓アプリを開発しました。
内容は至ってシンプルな四則演算・小数点以下の計算ができる電卓アプリとなります。

開発を始める前に
・アプリのレイアウト
・想定される処理内容
をまずは紙に簡単に書き起こしました。(これ大事💡)

例えば
1. 必要な画面の数や内容(SNSアプリであれば、ホーム画面・投稿画面・プロフィール画面など)
2. このボタンを押したら何が起きるべきか
など、頭の中でなんとなくイメージをしながら書くことが大切だと思います。

今回の電卓アプリであれば、
それっぽいUIをiPhoneの標準の電卓アプリを見ながらUIのイメージを書いた後、
1+3であれば「3」を押したときは前に入力した「1」を使用して足したい「ということは「1」はどこかにとっておかないといけないな」というように機能をイメージをすることで、必要なこと(関数で処理したいこと)がなんとなくわかってきます。
このような小さいこともメモをしておくことで、なんとなくでもイメージができておりスムーズに開発中が進んでいた覚えがあります。

アプリ開発を学習中の方で「これから自作アプリを開発してみよう」と考えている方は、
このように開発を始める前にまずはアプリの全体像を簡単でも良いので紙に書き起こすことから始めてみてください!

使用技術

Googleのトレーニングコースで学習したように下記の技術を使用して開発しました。

  • Jetpack Compose
  • Kotlin

使用したライブラリ

今回機能面の実装はViewModel内で行ったため、ViewModelのライブラリを依存関係に追加しました。
また画面サイズに応じてレイアウトを少しだけ変更したかったため、window-size-classも追加しました。

ソースコード

UI

アクティビティ|MainActivity.kt

ホーム画面(メイン)|CalculatorHomeScreen.kt

スマホレイアウト(今回はタブレットレイアウトは省略)

機能実装

ViewModel(CalculatorViewModel.kt)

こだわった部分

電卓アプリ1つとっても色々な機能を実装する必要があるのだなと感じましたが、中でもタイプに応じた計算処理(calculateNumber)はこのアプリの根幹の機能で特にこだわった部分でもあったので、少しだけ紹介いたします。

たとえば「120 × 3 + 140」を求めるとき

image-20241204011120596.png
のようになると思います。

これをスマホの電卓で入力していくと、3と140の間の「+」を押したタイミングでUIに「360」と表示されます(機種や電卓アプリによる差がなければ!)。
そのまま「140」と入力して「=」を押せば「500」と表示されます。

[iPhone標準の電卓アプリ]
calculator_video_3.gif

直感的にこのような操作ができますが、実はこの「+」を押したときには下記のような処理が行われています。
・これまでの数値(120)と最後に入力された数字(3)を取得
・1個前に押された計算タイプでそれらを計算処理
・次の計算で足し算をするよう設定

このように「+」を押したときに「=」のような処理をしつつ、次の計算の準備もしています。
これは1つの式(「=」を押すまで)に、2個以上の四則演算ボタン(+/ – /÷ / ×)が登場する式では2個目のボタン以降起きる処理になり今回はその機能を実際に再現してみました。

「+」を押したときに実際に起きている処理

今回作成したアプリで120 × 3 + 140の「+」を押した際に起きていることを解説します。

1.UIで+を押した時(CalculationHomeScreen.kt)

ContentButtonのonClickに指定した「viewModel.plusNumber()」が呼び出されます。

2.ViewModelのplusNumber関数(CalculatorViewModel.kt)

のようにCalculateType.PLUSを渡してcalculateNumber関数が呼び出されます。

3.ViewModelのcalculateNumber関数(CalculatorViewModel.kt)
まず、計算処理に使用する数値が変数に代入されます。

続いて以前に_calculateType.valueに保持していた「×(3を入力する前に保持 )」があるので、whenの条件で指定されているCalculateType.MULTIPLYの処理が実行されます。

そのため_totalState.valueには「totalValue.times(inputValue)、つまり120 × 3」の実行結果の値(360)が代入されます。

次いで次の計算で使用される計算タイプ(関数実行時に渡されたCalculateType.PLUS)が保持され、

UIに表示する計算タイプも「+」に更新されます。

また、今回計算処理がされ更新された_totalState.value(360)がUIに表示しているStateFlow変数に代入され、

それに応じてUIでは360が表示されるという流れとなっています。

開発してみて

細かい実装内容などはソースコードのコメントを読んでいただきたいのですが、どれも基礎学習で習得した技術でUIや機能ができていることがわかります(特にStateFlowやif文は重要な役割を担っています)。

中でも

・数字入力中の2桁以上の整数の処理(2桁以上は数字を後ろにつける必要がある)
・小数点以下のモード時の処理
・タイプに応じた計算処理

などの機能面では「習得した基礎知識をどのように扱うか」というテクニックが必要でした。
これは知識をインプットするだけでは得られない、自作アプリ開発というアウトプット実践だからこそ得られた経験だと思います。

登竜門というだけあり、総じて電卓アプリは基礎をしっかり活用して開発することになったため、1つ目のアプリとしてはかなり良いアウトプットになりました。

その後

電卓アプリを作成した後も引き続き個人でアプリ開発を続けていき、Googleトレーニングコースでは学習しなかった内容も、自作アプリ開発を通して学習していきました。

Room(端末内のデータベースを操作できるライブラリ)
Retrofit(APIで情報を取得できるライブラリ)
・MVVMアーキテクチャ
・DI(依存関係インジェクション) など

上記の技術・知識は実際のアプリ開発においても重要な内容であるものの、基礎知識の学習だけではインプットする機会がありませんでしたが、自作アプリの開発を進めていきより良いアプリを開発する過程で学習を進めていくことができました!

自作アプリ開発の魅力

自作アプリ開発は色々と大変な場面も多く(1つのエラーに何時間も詰まった時なども何度かありました💦)、わからないことはAIに助けてもらいながらコツコツと進めていきましたが、

なんといっても「自分が思い描いているアプリに近づいていく時・思い描いたアプリに出来上がった時」のあの達成感は忘れられません。

自作アプリ開発は「学習」という点でアウトプット/インプットの量がかなり多く学習効率の良い勉強方法ですが、「継続性」という点でも自分のペースで進めることができ、達成感がより感じられるため非常に良い学習方法であること間違いなしです。

開発したアプリをGitHubで公開&ポートフォリオを作成

上記のような流れで自作アプリをいくつか開発していきましたが、転職活動を始めるためには今まで作ってきたアプリを誰でも見れるようにして実力を知ってもらう必要があります。

せっかく開発したものも目に見える形でアピールしなければ宝の持ち腐れです。

そのため

  • Githubでソースコードを公開
  • ポートフォリオを作成して見た目や機能の紹介
    という2つのアプローチで目に見える形にしました。

GitHub

GitHubとはソースコードを保存・共有・管理などができるウェブサービス です。
自分の開発したアプリのソースコードをインターネット上に保存して誰でも見えるようにすることができます。

Githubへのソースコードの公開方法は調べればすぐに出てきますので、これから転職活動を始めていく方でまだソースコードを公開していない方は今すぐGithubアカウントを作成しソースコードを誰でも見れるようにしておきましょう!

ポートフォリオ

ポートフォリオは自分が今まで開発してきたアプリ・その詳細などを画像や動画とともに紹介することで採用担当の方に自分を効率よくアピールすることができます。
そういった点でGitHubへのソースコード公開と同じかそれ以上に重要なものです。

色々と自作アプリを開発して「さあ転職活動を始めよう!」となったタイミングで、「ポートフォリオも作成しなきゃなのか、、」となった方もいらっしゃるかもしれませんが、

ここまで進んできたからこそ「ポートフォリオなしで転職活動を始める」のは非常にもったいないです。

私は学習も兼ねてiOS / Androidの両方を開発(クロスプラットフォーム開発)することができるFlutterでポートフォリオを作成しました。
FlutterはWebアプリも開発することができるため、ポートフォリオをWebアプリとしてFirebase Hostingというサービスを使用して公開しました。

モチベーションを持続させた方法

学習内容や流れを説明していきましたが、このように自分のプライベートの時間を学習時間に変えるには、モチベーションが続かないという方も多いかと思います。

かくいう私も学習始めたての時はモチベーションが下がり、「今日は勉強はいいや」となりPCを開かない日もありました。
よくそういう時には「まずPCを開いて机に向かって5分やってみると良い」という小手先の解決方法などがありますが、そういった表面的な解決案はその日効果があっても持続的にモチベーションを上げてくれるわけではなく、次の日にまた同じ問題に直面すると思います。

ではどうやってモチベーションを持続させたのかというと自分の中で強固な土台を作りました。

棒で例えると、細い棒は少しの風で倒れてしまいます。
ですが底辺を太くすると少しの風では倒れなくなります。

モチベーションを持続させる力は「棒を◯回立て直せる力」になりますが、そもそも倒れる回数を少なくすればいい(モチベーションという棒の底を広くすればいい)と思いました。

そこで、自分の中で「そもそもなんでアプリ開発がしたいのか」という動機・目的を見つめ直す時間をとり、自分の中でアプリ開発をすることでなぜ・何をしたいかをじっくりゆっくり考え書き起こしました。

本当に色々な動機・目的が出てきて1つに絞ることはできませんでしたが、その全てが自分のアプリ開発をする上での動機・目的と納得することができ見直せたことで、モチベーションという棒が倒れることがかなり少なくなりました(大前提で「開発が楽しかった」ということもありますが、楽しいも動機の大きな1つで良いと思います)。

モチベーションを保つのに苦労している方はぜひ一度自分と向き合って見てください。
目的・動機の数は1つでも100個でも大丈夫だと思います。
大事になのはそれが本当の動機・目的と自分で納得して理解することです。
それだけで自然と土台は大きくなっているはずですので!

まとめ

私はこれまで紹介したような学習方法・流れでレコチョクにAndroidアプリエンジニアとして転職することができました!

とは言っても、アプリエンジニアとしてまだまだスタートを切ったばかりの新米ですので、
実務で得た知見の吸収や個人学習で技術を引き続き伸ばしていきつつ、技術だけでなく「ユーザー目線でより良いアプリ」を考え実行できるアプリエンジニアを日々目指していきます!

この記事の目的でもお伝えしましたが、今現在エンジニア就職/転職を目指して日々奮闘している方々の背中を少しでも押せて、学習方法なども少しでも参考になれれば幸いです!

明日のレコチョク Advent Calendar 2024は11日目『【Kotlin】Jetpack Composeで無限スクロール風とスワイプ検知』です。

この記事を書いた人

瀬川 亮