はじめに
初めまして!
CA Tech JOBのインターン生の佐藤佑哉こと、さとゆーです。
私は12月中の11日間、CL事業部でAndroidネイティブエンジニアとしてインターンシップに参加しました。今回のインターンシップで取り組んだ、新しい技術移行戦略やインターンシップを通して学んだことについて書いていきたいと思います。
インターンシップの概要
今回私が参加したのは、「CA Tech JOB」という通年で行われている1ヶ月間の就業型インターンシップです。「CA Tech JOB」では面接や面談を通して自分のやりたいことや目標と照らし合わせた業務をしていくようなインターンとなっており、インターン中でも社員さんや担当の人事の方とこれからのことについて面談をしたりと、業務で学ぶだけでなくこれからのキャリアについても多く学びがあるインターンとなっております。
業務の概要
配属先
今回、私はデジタルコミュニケーションサービス「CL」というプロダクトのAndroidエンジニアとして配属させていただきました。
「CL」は、LDHファンに向けたエンタテインメントコンテンツと、サイバーエージェントが「ABEMA」などで培ってきた映像配信技術を融合して生まれたFanTech(ファンテック)サービスであり、サイバーエージェントの中では比較的新しいサービスとなっています。
担当したタスク
今回、私はAndroidエンジニアとして「アカウント新規登録周りの既存のFragmentからJetpack Composeへの移行」を任せていただきました。
やったこと
上記のタスクのように、本インターンシップではFragmentからJetpack Composeへの移行に取り組みました。
約4年前にリリースされた映像配信サービスである「CL」は、他のCyberAgentのプロダクトと比べて、比較的新しいサービスでありつつも、大規模なサービスの保守‧運用‧機能開発を任せていただいたのは、自分が成⻑する上で大きな糧となりました。
そもそも Jetpack Compose とは
Jetpack ComposeとはKotlinの言語でUI 開発ができるように設計された最新のツールキットです。前までのUI の開発はxmlで実装することが一般的だったのですが、2021年7月に安定版になってから、本番のプロジェクトでも導入されることが増え、CLでもJetpack Composeへ移行する動きは強まってきていました。今回は、Jetpack Composeへ移行する時に学んだことを書いていきたいと思います。
CL独自のデザインシステムに準拠したデザインの実装
はじめに、Fragmentに移行する前に使用されている画面のデザインとUiStateの実装を実装しました。
UiStateというのは、画面に表示する必要があるものや画面のレンダリング結果に影響するUI要素固有のプロパティのことを指します。このUiStateを事前に作成しておくことで、画面のロジックや表示で使用されるデータが明確になり、画面の作成に時間を割くことができました。
デザインの作成に関しては、CLでは独自のデザインシステムがあるため、このデザインシステムに準拠するために、FigmaやComposableで定義されているデザインのコンポーネントを使用しました。レビューでは、このデザインシステムで定められているデザインやアクセシビリティから議論されることが多く、デザインシステムに準拠した品質を意識する機会が多くありました。
他にも、隣接する要素とその間の空白の責務はコンポーネントごとに独立させておくというスペースホイスティングという考えで実装し、ユーザーのアクセシビリティだけでなく、パフォーマンスも意識する機会が多くありました。
FeatureFlag導入
FeatureFlagというのは、コードを書き換えることなく動的に振る舞いを変更することができるような開発手法のことを指します。今回のComposeへの移行の活用方法は既存のFragmentとComposeで実装したFragmentの画面遷移を管理する時に使用する機会がありました。
この導入により、バグがあった際に開発者側から既存の振る舞いに直せるだけでなく、デバッグ環境でも既存のデザインやロジックを即時に比較できるような環境が整い、FeatureFlagを導入する上でのメリットを最大限に感じることができました。
ViewModelとFragmentの実装
CLのUIのロジック管理は、Androidのベストプラクティスでもお馴染みのViewModelを使用しており、こちらを使用してUiStateや画面のロジックを実装していきました。CLではViewModelStateとUiStateを使用して、状態の管理を行っておりました。
ViewModelStateは、ViewModelの中のみで変化する状態の変化を行い、UiStateにデータを送るような役割を果たします。これによって、状態の変化と表示の管理を分けるような仕組みを作っておりました。
実際に実装してみると、ViewModelStateとUiStateの名前を使い分けているので、修正や追加がしやすく、レビューしていただく際にも、修正範囲が明確になっているため、開発体験の向上につながりました。
テストの実装
インターンシップを始める前までテストを書く経験値がほとんどなかったのですが、このインターンシップでは自分が追加した昨日のテストをレビューを受けながら実装する経験ができました。具体的にはViewModelのユニットテストです。
ユニットテストはJUnitというAndroidの単体テストで最も広く利用されているフレームワークで実装されており、高速な自動テストを体験できました。また、MockKを用いてViewModel以下のレイヤの振る舞いをモック化し、あらかじめ用意したレスポンスを受けることで、ViewModel単体で、正常系、異常系テストをするフローを学びました。
また、テストを実装することによってメソッドごとの振る舞いやユースケースを詳細することになり、実装している機能についてより理解が深まっていき、テストを書くことの大切さを学ぶことができました。
意識していたこと
インターン中は下記2つを意識して開発をしていました。
今回の就業型インターンは大半がリモートワークでの作業だったため、特に下の項目は開発効率やコミュニケーションのコストの削減ができたと感じています。
コードレビューへの積極的な参加
今回は、Jetpack Compose への移行作業でブランチを複数切って並列的に作業を行うことが多くありました。そこで、いただいたレビューをすぐに修正するだけでなく、他ブランチにもそのレビューを適用するなど、並行作業において各タスクに的確なアドバイスを反映する心がけは、レビューコストの削減につながることができたかなと感じております。
timesを活用した活発的な共有
業務中、このtimesはフル活用しておりました。特に以下のことをよく共有していました。
・単語集: 分からない単語が出たときにログをつける
これによって、索引のような役割を果たしてくれたり、復習の時に使用したりしていました。
・質問や次のタスクの可視化
質問に関しては、あらかじめ自分の質問フォーマットを作っておいて、質問する時のコミュニケーションコストを削減することを心がけていました。
また、タスクをコメントごとに追加し、スレッドごとに言語化していきながらタスクを進めておりました。
その結果、他の開発者側からもどのようにタスクを進行しているのかが可視化され、他の業務を頼みやすかった、アドバイスしやすかったというフィードバックをいただき、自分だけでなく他の開発者の心理的安全性の向上にもつながることを学びました。
技術以外で学んだこと
働く時の雰囲気
CLのAndroidチームでは、1日1回MTGを開き、今日の進捗や技術共有をする会がありました。そこでは、進捗共有時に分からないところは、チーム全体で協力して解決策をブラッシュアップしたりしており、個人で困っているところがあったらチーム一丸となって協力する文化を持っていました。
この環境では、個々のスキルだけでなく、チームワークとコミュニケーション能力の重要性を学びました。また、問題解決においては、多様な視点からのアプローチが重要であることも実感しました。
働く人
CA Tech Jobでは、「Welcome ランチ」というサイバーエージェントの社員の方々とランチに行き、自分が就業していない部署の方々とお話しすることができる企画があります。私はリモートワークでの作業が中心だったので、最終週に出社して合計10名の社員さんとランチに行かせていただきました。ランチでは、今やっている業務のことやキャリアのこと、プライベートのこと…など、たくさんのお話を聞かせていただきました。
特に、自分が目指したいキャリアやエンジニア像へ向かっている社員さんからたくさんの刺激を受けて、自分の将来のキャリアプランや目標について深く考える機会となりました。
最後に
本インターンでは、1ヶ月という⻑期間のインターンで圧倒的に成⻑しました。
この期間は実際にユーザーが使用しているプロダクトを、試行錯誤して実装していく楽しさの中に深い学びを感じることができ、技術者として一歩ずつ成⻑していくことを実感できるインターンでした。
最後になりますが、トレーナーの方、担当の人事の方、同じチームの方、交流していただいた数えきれない社員さん皆様に心より感謝申し上げます。