N予備校Androidアプリの改善でインターン生が取り組んだこと

はじめに

富山大学大学院 修士1年(2022年度現在)の吉川晃太です。

github.com

2022年9月から2023年3月までの7か月間、N予備校 Android向けアプリ改善インターンシップに参加しました。

N予備校とは、2016年にドワンゴからリリースされた、パソコンやスマートフォンから映像授業を受けることができるサービスです。N予備校 Androidアプリは現在、Kotlinと呼ばれる、Androidアプリやサーバーサイドの実装に特に用いられているプログラミング言語で、開発が進められています。

本インターンでは、このアプリのフロントエンドの開発に着手しました。アプリ内の授業コース選択画面の改善や、UIデザインの刷新、新規画面・コンポーネントの作成、採用技術のリファクタリングなどをタスクとして用意していただきました。

私にとって、初めての就業型のインターンシップだったため、始めた当初は不安でしたが、多くの方からサポートをしていただきながら無事にやり遂げることができました。

今回は、そのインターン体験記をこのブログにまとめます。

インターンシップ参加まで

私の経歴として、学部生の頃は機械専攻だったこともあり、アプリ開発の経験があまりありませんでした。しかし大学院進学を機に、IT業界への就活を見越して、ハッカソンに参加したり、エンジニアコミュニティに参加したりし、少しずつアプリ開発の経験を積んでいました。

そんな中で、周りの学生たちがインターンシップに参加しているのを見て、自分もつよつよなエンジニアになりたい、実際の業務環境で開発経験を積みたいと思うようになり、エンジニア就活支援サイトで紹介されていた本インターンに応募しました。

Androidアプリの開発は、ハッカソンで一度だけサーバーサイドをPythonで実装したことがありましたが、それ以外は全く経験がありませんでした。そのため、Kotlinを使ったAndroidアプリ開発は、インターンに参加して初めて本格的に行うことになります。

Androidアプリ開発未経験者の観点からも、本記事を書いていこうと思います。本インターンシップの募集要項は以下のリンクが参考になります。

dwango.snar.jp

業務環境

インターン期間は全日リモートワークでした。Androidの開発チームは6人構成で、全員がリモートワークで働いています。

日例が決められた時間帯に毎日あり、メンバー間で進捗報告や開発を進める上での相談等を行っていました。それに加えて、私がインターン生ということもあり、日例後に別途、社員の方に1on1の相談時間を設けてもらっていました。私の学業やそのほかの都合に合わせて、相談時間を変更したり、状況に合わせて対応してくださりました。

この相談時間には、Android Studioの使い方や、タスクで詰まっていた時の解決方法などを教えていただき、Androidアプリの開発に慣れていくことができました。

インターンシップに参加するにあたって、会社からWindowsのラップトップとアプリデバッグ用のGoogle Pixel 7が支給されました。実機を使ってデバッグすることができたので、アプリの挙動なども確認しやすく、エミュレータを使うよりも開発効率が良かったように感じます。

外部のイベントに関して、DroidKaigiなどへの参加も業務時間内で行けるようだったのですが、都合が合わなかったため私は参加することができませんでした。この点に関しては、非常に名残惜しいものとなりました。

チーム内では、DroidKaigiのOSSへのプルリクエストも積極的に行っていました。

blog.nnn.dev

業務を進めていく上では、タスクの管理にJiraを使ったり、CIにBitriseを使ったりと、個人開発では使ったことのないツールに触れることができました。このようなツールに学生のうちから慣れることができたのも、就業型インターンの特権に感じます。

今後の開発に取り入れていけるものはどんどん取り入れたいと感じました。

業務内容

学習期間

Kotlinをまったく触っていない状態からのスタートだったため、業務を始めて、一週間ほどは、KotlinやAndroidアプリ開発の基礎を、Codelabを利用して行いました。

ここで初めて、ViewModelやNavigationという概念に触れました。

自分が今まで何気なく使っていたスマートフォンのアプリが、画面の回転によって画面が再レンダリングされることもつゆ知らずにこれまでは使っていました。そのデータを棄却しないようにViewModelを用いて、UIの持つデータを保持することや、Androidアプリのアクティビティのライフサイクルなどの面は、今までに触れたことのないものだったため、慣れるのに時間がかかりました。

developer.android.com

developer.android.com

開発タスクへ

学習を一通り終えてからは、Android開発に徐々に慣れていくように簡単なタスクから割り振っていってもらいました。

初めのうちは、UIの背景色の変更や不要となった部分の削除、ボタンの高さを微調整するようなタスクを行っていました。

UI の背景色の変更

少し慣れてきたところで、そのほかのタスクとして、N予備校内で使われる独自のAPIクライアントを、Retrofitに移行したり、ユースケースをRxからFlowに移行したりしましたが、特に多くこなしていたのが画面のCompose化です。

Composeによる開発

従来のAndroidアプリはUIを担うViewをxmlを用いて記述していましたが、Jetpack ComposeがUIを担うことで、すべてのファイルをKotlinで管理することができるようになりました。

developer.android.com

developer.android.com

基本的にJetpack Composeを使って、デザイン設計ツールであるFigmaの資料を確認しながら実装を進めていき、必要に応じて仕様についてデザイナーの方と連絡をとるといった感じでタスクを進めていきました。その中で、プロジェクトの案件を任せてもらったりもしました。

そのプロジェクトでは、一画面のローディング中に表示するプレースホルダーを実装したり、N予備校のコース画面の刷新を行いました。

作成した Composable

N予備校の、開発に関わるチーム全体での並行したプロジェクトであったため、バックエンド側から実データなどが得られない中、仕様書とデザイン資料のみで開発を進めていくのが個人的に大変に感じました。ですが、仕様に関しては、同じチームの先輩社員や他チームの方と連絡・相談しながら開発を進めていくことで、無事にタスクを遂行することができました。

Jetpack Composeの開発に関しては、直感的に記述することができ、個人的にはすごく書きやすいライブラリに感じました。しかし、ColumnやRow、Boxなどのコンポーネントのスコープ範囲での実装や無駄にコンポーネントを配置してしまうことがあったり、Modifierの適応順序によってUIの表示が意図しないものになったり、ネスト構造の中に冗長的にpaddingを適用したりと、慣れるまでいくつも障壁があったと思います。

まだまだ、Jetpack Compose内でも使ったことがないコンポーネントがたくさんあるので、今後も個人開発でComposeを使っていきたいです。

躓いた点と身についたこと

Jetpack Compose以外にも、開発の中で習得するのに難かったことを列挙すると、

  • ライフサイクルに関わるoverride fun on〇〇{ ~ }の意味
  • TripleやPairなどの使い方
  • 静的型付け言語ならでは(?)のintarfaceやdata classの意義や使い分け
  • 型を意識した開発、nullable, non-nullableなど
  • if文に代わるwhen式の登場
  • テストコードの実装
  • 謎のエラーの発生 -> Clean Project (or) Invalidate Caches による解消

などなど、様々な難題がありました。

何にもわからない状態から、ここまでAndroidアプリ開発ができるようになったことをブログ記事を執筆して言語化すると、改めて成長を実感できます。(感慨深いです)

インターンを通して、学生のうちからN予備校という大規模なアプリ開発に携わることができたのは、大変貴重な経験だったと思います。サービスとして運用しているため、安全に開発をするためのテストコードの実装などにも関わることができたため、”業務としての開発”を実感することができました。

また、チームとしてのGitHubの運用にもルールがあり、差分が大きくならないような運用方法であったり、PRのフォーマットが整っていることが、開発の効率を高めているのだと体感することもできました。今後も、レビュワーにやさしいPRの作成を心がけて、GitHubを運用していこうと心に誓いました。

終わりに

本インターンの参加に際して、Androidアプリ開発ほぼ未経験の状態から採用していただき、とても感謝しています。

Jetpack ComposeやFlowなどのモダンな技術に触れる機会もあり、大変学びがあり、楽しいインターンとなりました。業務だけでなく、Androidチームの忘年会など、業務以外の会話をする機会もあり、いろいろなお話を聞けて楽しかったです。

また大規模なアプリであるからこそ体感できる、アーキテクチャや設計、テストなどを意識した開発ができたことも貴重な経験になりました。

7か月間という長期インターンを最後までくじけることなくやりきることができたのも、周囲の方々のサポートがあったからこそだったと思います。

開発を進めていくうえで関わってくださった社員の方々、インターンの始まりからサポートしてくださった人事の方々、開発だけでなく私のキャリアなどの相談にも乗っていただいたチームの方々、本当にありがとうございました。