チームのアプリ開発力を高めるZOZOTOWN Androidチームが実践するCodelab会

f:id:vasilyjp:20200522170609p:plain

こんにちは、ZOZOTOWN部でAndroidエンジニア/TechLeadをしている堀江(@Horie1024)です。本投稿では、ZOZOTOWNのAndroidチームで行っている「Codelab会」についてご紹介します。

Codelab会とは?

Googleが公開しているCodelabsは、AndroidだけでなくGCP、TensorFlow、Firebase、Flutter、Augmented Reality等の様々なトピックをカバーする、チュートリアル形式でまとめられた教育コンテンツです。Androidに関するCodelabも多く公開されています。「Codelab会」は、ZOZOTOWN Androidチーム全員でCodelabに取り組む勉強会として2019年の7月からはじめました。

ZOZOTOWN Androidチームの課題

私がZOZOTOWN Androidチームに加わったのは2019年の4月で、ZOZOTOWN AndroidチームではAndroid開発を始めてからまだ日が浅いメンバーが多く「チームのAndroid開発に関する知識の底上げ」が課題でした。これはTechLeadとしてチームに加わった自分の課題でもあります。チームメンバーのAndroid開発に関するスキルアップサポートをどう行っていくか?を考える中で思いついたものの一つがCodelabの活用です。

f:id:vasilyjp:20200522123101p:plain:w550

Codelabでは、実際にAndroidアプリを作成するプロセスを通して手を動かしながら学習を進めることができ、Android開発に関する知識を身につけるのに非常に効果的です。個人としても新しい技術のキャッチアップにCodelabを活用していて、その効果を実感しています。一方でただCodelabをチームメンバーに勧めるだけではスキルアップサポートとして十分では無いと感じていました。

チームでCodelabを進めるCodelab会

「Codelab会」はチーム全員でCodelabに取り組む勉強会です。これまでに次のようなCodelabに取り組んできました。

チームでCodelabに取り組むことで次のようなメリットがあります。

  • 定期的にCodelabに取り組む習慣ができる
  • チーム全員の知識レベルを揃えられる
  • Codelabの内容についてより理解を深められる

定期的にCodelabに取り組む習慣ができる

個人でCodelabに取り組むと習慣化するまで続かない場合があるでしょう。私個人の経験でもそうで、業務外で時間を取ってCodelabを進めるのはハードルが高く感じられる人が多いと思います。Codelab会では、業務時間内でスケジュールを確保して取り組むため、個人で取り組む場合より習慣化しやすいメリットがあります。現在、Codelab会は基本的に週一回の頻度で行っていてZOZOTOWN Androidチームの勉強会として定着しています*2

チーム内の知識レベルを揃えられる

チーム全員が同じCodelabに取り組むことで、チーム内の知識レベルを揃えることができます。このメリットが役立った例として、「Use Kotlin Coroutines in your Android App」に取り組んだ例があげられます。この例では、Kotlin Coroutinesの基礎知識、Android開発においてどう使うのかという点でチーム全員の認識を揃えることでCoroutinesのZOZOTOWN Androidアプリへの導入が比較的スムーズに進められました。

codelabs.developers.google.com

Codelabの内容についてより理解を深められる

Codelabは全編英語であり、内容が高度な場合もあるため、理解するのに時間がかかることがよくあります。このことは、Codelabの途中で挫折する大きな要因となります。

Codelab会では、Codelabを進める中で理解できない点がある場合でも参加メンバーが相互にフォローしながら進めることでその場で相談できる状況を作り、内容についての理解を深めることができます。特にZOZOTOWN AndroidチームではAndroid開発を始めてからまだ日が浅いメンバーが多い状況だったので効果的でした。

Codelab会の実施方法

ここでは、Codelab会をどのように実施しているかについて解説します。Codelab会を実施するまでの流れは次の通りです。

  1. 取り組むCodelabの決定
  2. 進行役の決定と事前準備
  3. 参加メンバーの事前準備
  4. Codelab会の実施と振り返り

取り組むCodelabの決定

最初に行うことは、Codelab会で取り組むCodelabを決定することです。Codelabを選ぶ基準は次のようにしています。

  • チームメンバーが興味のある内容であること
  • チームの技術的な方向性にマッチする内容であること

チームメンバーが興味のある内容であること

選択するCodelabは、チームメンバーが興味のある内容が望ましいです。ZOZOTOWN Androidチームでは候補は私が出す場合もありますが、やってみたいCodelabがあれば提案してもらうようチームメンバーにお願いしています。複数の候補がある場合、次のように投票で決めてしまうこともあります。

f:id:vasilyjp:20200522121218p:plain:w600

チームの技術的な方向性にマッチする内容であること

選択するCodelabがチームの技術的な方向性にマッチする内容であることも重要です。ZOZOTOWN Androidチームでは、チームの人数が増えてきたことからよりスケールする開発体制を目指す一環として、Jetpackの「Guide to app architecture」で紹介されているアーキテクチャをベースにした新しいアーキテクチャを採用し、リアーキテクチャを進めています。

リアーキテクチャを進めるにあたり、Codelab会では、チーム全体で新しいアーキテクチャについて理解を深める目的でLiveDataやViewModelといったLifecycleコンポーネント、Room、Kotlin Coroutines、Daggerを扱うCodelabを選択しています。

Kotlin Coroutines Flowについても導入を検討していますが、導入前にCodelab会で次のCodelabを進める予定です。

codelabs.developers.google.com

進行役の決定と事前準備

Codelab会当日に会の進行を担当する進行役を決めます。進行役は、最初のうちはAndroid開発に十分な経験がある人が務めるのが良いでしょう。ZOZOTOWN Androidチームでは、私が進行役を務めています。

進行役が事前に行う準備は次の通りです。

  • スケジュールの調整
  • 選択したCodelabの予習

スケジュールの調整

Codelab会のスケジュールを決め参加メンバーの予定を確保します。選択したCodelabを最後まで進めるのに複数回Codelab会を行う場合が多いため短いスパンで開催するのが望ましいです。

ZOZOTOWN Androidチームでは、初回から2回目の開催まで一ヶ月空いてしまい、参加メンバーからは前回の内容を忘れてしまうので期間を空けないで進めたいという要望を多く貰いました。そのため現在では週1回1時間で行っています。これより多くの時間を確保しようとすると疲れますし、チーム全員の予定を調整するのが難しくなるため1時間としています。Codelab会のメリットでもお伝えした習慣化にもつながるので定期的な予定としてスケジューリングするのが良いでしょう。

選択したCodelabの予習

Codelab会の進行は、進行役が実際にCodelabを進める形で行います。会の進行を滞りなく行うのは進行役の重要な役割です。進行中に発生する問題として次のようなものがあげられます。

  • 内容の理解に時間がかかりスムーズに進行できない
  • サンプルプロジェクトがビルドできない
  • 進行役がCodelab通りの結果にならず進行が止まる

これらの問題について、選択したCodelabを事前に進めておくことで問題を事前に察知し回避できます*3

内容の理解に時間がかかりスムーズに進行できない

初見でCodelabの内容を理解して解説するのは難しく、内容の理解に時間がかかりスムーズに進行できない可能性が高いです。そのため、Codelabの内容を解説できるレベルまで理解できるよう、事前の予習を進める中でわからないと感じた点は調べ説明できるように準備しておきます。これにはCodelabで登場するサンプルコードへの理解も含みます。

サンプルプロジェクトがビルドできない

殆どありませんが、いざCodelabを始めてみるとサンプルプロジェクトをビルドできない場合があります。サンプルプロジェクトが依存するAndroid Plugin for Gradleやライブラリのバージョンを上げるなどするとビルドが失敗する場合があるので事前に確認しておくことは有用です。

Jetpack Compose basics」のような開発中のツールやAPIを使用するCodelabは、特に事前に確認しておくことをオススメします。Codelab会で取り上げた際には、ビルドがうまくできない参加メンバーがいましたが、事前に確認しておいた結果サポートすることができました。

進行役がCodelab通りの結果にならず進行が止まる

進行役は、実際にCodelabを進めていきますが、Codelabで示されている結果と手元で実行した結果が異なると進行を止める結果となってしまいます。「Background Work with WorkManager - Kotlin」では、チェインしたWorkRequestが返す結果がCodelabで示されるものと手元で実行したものとで異なってしまい、その原因を探るために20分ほど時間を無駄にしてしまいました。事前にCodelabを進め、各チャプター終了後にコミットしtagを打つかブランチを切っておくとこの問題を防ぐことができます。

実際にコードを書きながら進めた方が進行しやすい場合もあるので、基本的にはコードを書きながら進め、進行が止まったら用意しておいたtagやブランチを活用すると良いでしょう。

参加メンバーの事前準備

Codelab会への参加メンバーは、選択したCodelabについてサンプルプロジェクトのCloneと初回のビルドを事前に行っておきます。これにより、会の時間を有効に活用できます。また、進行役は、Codelab会の前日や当日に参加メンバーへリマインドをすると親切です。

参加メンバーも事前にCodelabを進め内容把握しておくとより理解が深まるかもしれませんが、参加メンバーの負担が大きくなります。負担が大きくなると会を継続していくのが難しくなるため、現在特にルールを定めていません。

Codelab会の実施と振り返り

Codelab会は次のような流れで実施します。

  1. 進行役が自分のPCの画面を参加メンバーに共有する
  2. 進行役がCodelabを実際に進める
  3. 不明点があるメンバーがいないか適宜確認しフォローする
  4. 終了後フィードバックを貰う

進行役が自分のPCの画面を参加メンバーに共有する

現在ZOZOテクノロジーズでは、原則リモートワークが義務付けられているため、チームメンバー全員がリモートワークをしている状況でCodelab会を進めています。

ZOZOテクノロジーズでは、ビデオ会議システムとしてCisco Webex Teamsを利用できるためCodelab会でも利用していますが、それ以外でもSlackのCallやZoom、Meetといった画面共有が可能なツールであれば問題ありません。全員がリモートでCodelab会をやってみた感想ですが、物理的な会議室を確保する必要が無いのは楽ですし、特に問題なく開催できています。

進行役がCodelabを実際に進める

進行役はCodelabを実際に進めていきます。この時、Codelabの内容を解説しながら進めていくのがコツです。内容プラスアルファの部分をどの程度解説するかですが、進行役が予習で詰まった箇所や理解が曖昧で調べた箇所などを進めながら解説しています。Codelabの内容から逸れる場合もありますが、参加したメンバーからは好評でした。

例えば、「Use Kotlin Coroutines in your Android App」を取り上げた際には、Codelabの内容に加え、Kotlinの文法やテストコードを書く際の留意点など併せて解説しています。

不明点があるメンバーがいないか適宜確認しフォローする

Codelab会を進めていく中で、Codelabの内容に不明点があるメンバーがいないか適宜確認します。もし不明点があれば、進行役または他の参加メンバーがフォローするようにします。確認するタイミングはCodelabの難易度によって変えます。比較的簡単なチャプターであればそのチャプターの終了時、逆に難しければチャプターの各セクションごとに確認するようにしています。

例を上げると、「Using Dagger in your Android app」では、Dagger自体が理解する難易度が高いこともあり、セクションごとに確認を行いました。Codelabの内容について不明点を残したままにしてしまうとチーム全員にとって良くないので適切なフォローは大切です。

終了後フィードバックを貰う

フィードバックを貰うことは非常に重要です。Codelab会終了後、できる限り早く参加メンバーにフィードバックを依頼し、コメントを貰うようにします。フィードバックを改善に活かすことで、より良いCodelab会の運営に繋げられます。

次のスクリーンショットは、2回目のCodelab会のフィードバックコメントです。このフィードバックを受け、次回のCodelab会からコードを書きながら説明する際にはゆっくりと、進行が滞らないよう進行役が事前にCodelabを進めておく運用にしました。

f:id:vasilyjp:20200514111846p:plain:w350

Codelab会を行った結果

Codelab会について参加したチームメンバーにアンケートを取り、次の項目について答えて貰いました。

  • Codelab会は業務に役立っているか?
  • やって良かったCodelabは?
  • 今後もCodelab会をやっていきたいか?

Codelab会は業務に役立っているか?

全員から役立っていると回答を貰いました。業務時間内で定期的に時間を確保して行うことで、新しい技術・知識のキャッチアップに繋がっています。

チームメンバーからの回答をいくつか紹介します。

役に立っていると思います。
理由:
1)使いたいライブラリーと機能について調べる時間がないときに、Codelab会で触ってみるチャンス、
2)既に使用するライブラリーと機能の違う使い方を試すチャンス。
役立ってます!
理由:
時間的な問題で休日でしかCodelabをすることが出来なかったが、ZOZOTOWNの開発に携わるメンバーと行うことによって業務に組み込む前提で話が出来るのがかなり良いと思っております!
役立ってます!
理由:
Codelabは一人でやっているとだんだん飽きてきてやらなくなるので、みんなでやると集中してできるし知識の幅も広がっていいなと思いました
役立ってます。
理由:
Coroutine,Daggerは業務で使用するが、個人的には学習のハードルが高いのでなかなか取り掛かりにくいですがCodelab会として時間をとって学習すること、しっかりとした知識を持ったホーリーさんが解説するので噛み砕いて説明してもらえて挫折しないで最後までとりくめるから。

やって良かったCodelabは?

DaggerとKotlin CoroutinesについてのCodelab、「Using Dagger in your Android app - Kotlin」とUse Kotlin Coroutines in your Android Appをあげる意見が殆どでした。これは、実際の業務で使用している影響が大きいと考えられます。

また、Material Componentsシリーズ(MDC-101、MDC-102、MDC-103、MDC-104)をあげてくれたメンバーもいました。ZOZOTOWN Androidアプリ全体へのMaterial Designの適応はまだですが、社内でエンジニア、デザイナーを交えたMaterial Design勉強会を進めていて、今後順次適応していきたいと考えています。

チームメンバーからの回答をいくつか紹介します。

Dagger、MaterialDesign
理由:
個人的にDaggerについてとてもよかった。Daggerってpowerfullだけど複雑なツールですね、知識を広げるのは重要です。
最近やっているMaterialDesignについても毎回楽しみにしています。Materialライブラリーをバージョンアップとてもやりたい〜
Coroutine, Dagger
理由:
ZOZOTOWN内に組み込む前段として、全員で進められたという点が良かったなと感じました。Codelabを行なったことによって理解力も高まってZOZOMATの開発でも実際に使うことが出来たのでとても良かったです!
Coroutine、Dagger
理由:
ZOZOTOWNの実装に必要かつドキュメントを見てもよく分からなかったためとても助かりました
Coroutine、Dagger、MaterialDesign
理由:
Coroutine、Daggerに関してはZOZOでの使用頻度が高まっているので業務を進める上で必要になってきているので。
MaterialDesignに関しては単純に楽しみながら進められているので。

今後もCodelab会をやっていきたいか?

全員から続けたいという回答を貰いました。また、次に取り組んでみたいCodelab(Learn advanced coroutines with Kotlin Flow and LiveData)をあげてくれたり、新しい技術について学び業務に取り入れていきたいとも回答を貰えたり、チームとして新しい技術を積極的に業務に取り入れていく姿勢に近づけられたとも感じています。

チームメンバーからの回答をいくつか紹介します。

是非続けたい。特にこれ:
https://codelabs.developers.google.com/codelabs/advanced-kotlin-coroutines/#0
ぜひ!
理由:
古い歴史があるZOZOTOWNのアプリだからこそ、古き良きを重んじるだけでなく機能のブラッシュアップを進めるのではなく最新技術を盛り込んでいけるよう技術の底上げを行なっていきたいですね!
やりたい
理由:
ZOZOTOWNをどんどんリファクタリングしていくためにも知識を幅を広げるためにもこういう取り組みはやっていきたいです。
やりたい
理由:
常に新しい技術に触れる機会を持って取り入れることで、取り入れた方がいい技術であればみんなで触れて精査できるので。

Codelab会は「チームのAndroid開発に関する知識の底上げ」に繋がっているのか?

アンケート結果からも分かるよう、Codelab会はチームへポジティブな影響を与えていますし、今後も続けることで「チームのAndroid開発に関する知識の底上げ」に繋がっていくと感じています。

チームとして学習した知識を活用し、ビジネス的な要求に答えつつ、ユーザーさんがより便利にZOZOTOWNアプリを利用できるよう普段の業務に取り組んでいきたいと思います。

まとめ

本投稿では、ZOZOTOWN Androidチームで取り組んでいる「Codelab会」について紹介しました。ZOZOTOWN AndroidチームではCodelab会を行うことで、チームのAndroid開発に関する知識の底上げに繋がっていると感じています。

一方で改善したい点もあり、特に進行役の担当が私に固定されてしまっている点は早急に改善したいです。参加メンバーで持ち回りで進行役を務めるなど改善をはかっていきたいと思います。

最後に、ZOZOテクノロジーズではAndroidエンジニアを募集しています。ご興味のある方はこちらからご応募ください。

hrmos.co

*1:現在Deprecatedになっています。代替で推奨されるCodelabはこちらです。https://codelabs.developers.google.com/codelabs/advanced-android-kotlin-training-notifications/index.html#0

*2:時期によっては案件の都合上実施できていないことがありました。。ただ、チーム内で忙しくても少しずつやった方が良かったという意見がでています。

*3:こちらも業務時間で行っています。

カテゴリー