はじめに
こんにちは。東京大学情報理工学系研究科修士1年の塩田悠真です。LINEの2022年度夏インターンシップ技術職就業型コースに8月下旬から参加させていただきました。普段はサークルでPC向けのゲーム開発をしているのですが、普段やっていないことに挑戦してみたいと思い、今回のインターンにエントリーしました。
今回のインターンではLINEコミュニケーションサービス開発チームに配属され、Android開発の担当としていくつかの業務を体験しました。行った業務としては主に、Unit Testで利用しているライブラリの書き換えやアプリ内で表示する画面のレイアウトの編集、デバッグメニューへの機能追加です。この記事では、このうち表題でもある「Shared Preferencesを一覧表示するデバッグメニューに検索機能を追加する」という課題について取り組んだことを中心に書きたいと思います。
インターン課題
概要
LINEの開発者用デバッグメニューでは、アプリ内で利用しているShared Preferencesの一覧を表示することができます。Shared PreferencesはAndroidのAPIの1種で、アプリケーションのユーザー設定などに使う値をKey-Valueペアとして保存、取得することができます。
もともとの実装には検索機能がありませんでした。特定の項目をピン留めして常に上部に表示する、という機能はすでにあるためよく使う項目をピン留めしておくこともできますが、ピン留めの数が多い場合やピン留めされていない新しい項目を探したい場合には目的の項目を見つけるのに時間がかかってしまいます。
そこで、検索欄に入力した文字によって表示する項目を絞り込む機能のUIを新たに追加することにしました。また、もともとShared Preferencesの画面はあまり機能をもっておらず、ほぼすべての処理がActivity内に書かれている状態でした。そのため、ロジック部分を分離したViewModelを新たに作るなどのリファクタリングも同時に行いました。
設計
実際の実装に取り掛かる前に、実装手順などについての詳細をまとめたDesign Docを書きました。Design Docを書く利点としては実装の背景や目的をチーム内で共有できるほか、編集するクラスの範囲や必要なプロパティ、メソッドの内容が必然的に把握され、そのおかげでよりスムーズに実装を進めることができます。さらにDesign Docはチームの朝会の場で発表して共有することになっており、今回書いたものもメンバーの方から多角的な視点でのフィードバックを得てよりブラッシュアップすることができました。
Design Docでは実装の方針を明示するために主にクラス図の形式としてまとめました。今回は単純な機能の追加だけでなくリファクタリングを含んでいるため、実装前とリファクタリング、実装後の3段階に分けてクラス図を書きました。実はクラス図を見たことはあったものの自分で書くのは初めてだったので、メンターの方に見ていただきながら作成しました。



実装
LINEアプリのプロジェクトはサイズが非常に大きく、1回のビルドに時間がかかります。そのため、先に該当箇所周辺のみを切り取ったプロジェクトを作成してプロトタイピングを行いました。そのおかげでクラス構成の調査や機能のテストを効率的に行うことができ、実際のプロジェクト上での実装も無駄なく進めることができました。
リファクタリングとしては主に次の3点を変更しました。
- 文字の入力に合わせて表示項目を動的に変化させるためにLiveDataでのデータとUIのバインディングを行いました。
- ハイライトなどUIの表示に必要な情報量が増えたので、それらをUI Stateとして管理するためのクラスを作りました。
- もともとの仕様ではピン留めの操作を行うたびにファイルをすべてロードし直していたのですが、これは効率が悪いので最初にロードしたファイルのデータをキャッシュとして保持し、以降はそのデータをもとにフィルターや並べ替えをするようにしました。
検索機能に関してはデバッグメニューの他の部分に類似した機能があったため、一部流用するような形で目的の画面の仕様に合わせて実装しました。非常に大きなサイズのプロジェクトなだけあってクラスの相互関係を把握するのは大変ですが、コードを読んで流れを追っていくだけでも大変勉強になります。
変更箇所が多くなりそうだったため、プルリクエストはリファクタリングと検索機能の実装の2回に分けることにしました。今回配属されたチームではプルリクエストをマージするために2人のレビュアーによる承認が必要なシステムになっていました。コードの可読性や一貫性などについて様々なコメントをいただき、より品質の高いコードの書き方を学ぶことができました。
結果
検索欄の入力に応じて表示する項目が絞り込まれ、また検索ワードに一致する部分がハイライトされて表示されます。コードのリファクタリングについては特に機能上の差異はありませんが、コードの責任が分割され見やすくなったと感じます。

おわりに
Android開発、特にKotlinでのコーディングは初めてでしたが、ZoomやSlack上でメンターやチームの方に丁寧に教えていただき、なんとか業務をこなすことができました。また、朝会や午後の時間帯に雑談の場を設けていただき、業務以外でもチームの皆さんと積極的にコミュニケーションをとることができたのは非常に嬉しかったです。
今回記事にした業務のほかにも、Unit Testなど今まであまり触れることのなかった分野を経験することができました。また実務以外にも社内の技術セミナーやコードレビューのセッションなどに参加させていただき、様々な学びを得られました。実用的な具体例を交えた適切なコードの書き方の講座から開発の領域ではまず目にかからないZコンビネータの解説まで幅広い分野のセッションがあり、どれも興味深い内容でした。
最後になりますが、Android開発でのコードの書き方やIDEの使い方を分かりやすく教えてくださったメンターの方、プルリクエストにコメントをつけてくださったレビュアーの方々、そして一緒に働いたチームのメンバー全員に改めて感謝を述べたいと思います。6週間の間、ありがとうございました。とてもいい経験になると思いますので、LINEインターンに興味のある方、特にAndroid開発に興味のある方はぜひエントリーしてみてください。