あいさつ
こんにちは!2022年4月、株式会社Gunosyに新卒エンジニアとして入社したhigetaと申します。本記事は私にとって初めてのブログ執筆となります。
例年より暑く、諸々の事情で外出が億劫になった8月を乗り越え、ようやく涼しくなってきた頃ですが、もう9月ということは私が4月に入社してから既に6ヶ月目ということになります(早い!)。
本記事では、この5ヶ月間で私がGunosyで体験したことをざっくりとお伝えしたいと思っています。新卒採用でGunosyを志望してくださる方はもちろん、中途での入社を検討されている方にも参考になる話があると思うので、ぜひ最後まで読んでいってください。
自己紹介
大学では早稲田大学基幹理工学部の機械科学・航空学科に所属しており、材料力学や流体力学などの機械設計に関わる学問を学んでいました。
研究室は機械科学・航空宇宙専攻でしたが、実際は機械や航空とは殆ど畑違いのことを研究していました。
研究の中で、画像生成アルゴリズムを用いて人間の黒目を検出することなどに取り組んでおり、そこで機械学習、深層学習に興味を持ちました。就活生時代は、機械学習のスキルを活かしつつ、その他の技術についても広く学ぶ機会があり、実践できる企業に就職したいと考えていました。
なんでGunosyに入ったの?
結論から言うと、大企業とベンチャー企業の良いとこ取りをしている企業だと感じたからです。
Gunosyは、元は2012年11月に理系東大生3人によって始まったベンチャー企業でした。当時の事業内容は情報を最適に届けるためのメールサービス事業でした。現在は「グノシー」を始めとしたアプリ事業5つと子会社4つを抱える上場企業ですが、今でも創業当時のマインドが継承されており、大企業の性質とベンチャー企業の性質の両面を併せ持った会社だなあと感じています。
特に気に入っているのが、弊社のバリューであるGunosy Prideの「サイエンスで機会をつくる」です。
Gunosy Prideについては以下のリンクをご参照ください
(https://www.wantedly.com/companies/gunosy/post_articles/347946)
「機会を作る」という言葉には、私のような新入社員であっても「チャンスを掴める」というニュアンスを感じます。適切なデータ分析を行い、社内の問題及び社会の問題を解決できる施策を示せたならば、どんな所属、立場であれ必ずチャンスが回ってくる会社であることがGunosyの魅力だと感じています。
新卒研修
Gunosyに入社して約2ヶ月の間、新卒研修の期間が設けられています。
新卒研修とは言っても、毎日1時間のオンライン講習と自由な時間に受講できるUdemyの動画講座なので、業務時間を圧迫することはなく、OJTと並行して新卒研修を進めていくような感じでした。
私個人の感想としては、一般的な大企業のように入社後1年は研修で埋めつくされるというようなこともなく、必要な研修を良いバランスで受けられる制度であるのが良かったなと思っています。
研修の内容を簡単にご紹介します。
新卒研修
毎日1時間ずつ、その年の新卒メンバー全員で集まって受講する形式の研修です。今年は全てオンラインでの受講でした。
内容は、社会人としての基礎知識、社内規則や業務に関連する法規等のコンプライアンス、Gunosyが運営する各事業の説明などです。
Gunosyで働くに当たって必要な知識が過不足なく学べました。仮に業務中に内容を忘れてしまっても研修のアーカイブを残していただいているので安心です。
個人的に印象深いのは、取締役の方々による研修です。どの方々も特異なバックボーンをお持ちで面白いお話が聞けましたし、「なんでも質問して良いですよ!」といった感じでフランクな印象を受け、働きやすい会社だなと感じました。
Udemy(動画による研修)
自由な時間に受講できる動画形式の研修です。今年は新卒エンジニアに対して3本の必須受講科目が課され、その他は必要に応じて自由に受講して良いとのことでした。
今年の必須科目は
でした。いずれも全くの未経験からのスタートでやりごたえがありました。
特にDocker/Kubernetes講座は全編英語の講座なので少しハードルが高く、内容も未経験者にとっては難しいものだったのですが、同期や先輩方に助けてもらいながらなんとか終えることが出来たので印象深いものになっています。今でも開発ではDockerやk8sを日常的に使うので、非常に有意義な研修だったと感じます。
OJT
私は、ニュース記事の配信ロジック開発を担当するチームMediaMLに配属となり、その月のうちに「グノシーアプリでのカテゴリタブ動画挿入ロジック」の作成を任されました。これが私のOJTとなります。
ここでは、私がOJTとして初めて取り組んだタスクである「カテゴリタブ動画挿入ロジック」をご紹介します。
概要
グノシーアプリには「エンタメ」「社会」「スポーツ」といった、各カテゴリの記事を専門的に扱う「カテゴリタブ」が存在します。今回、私が担当した施策の内容は、カテゴリタブのリスト面で自動再生される形で「動画記事」を挿入するというものです。以下に概略図を掲載します。
このプロジェクトの背景としては、Gunosyが各メディアから提供を受けている「動画記事」は、より視覚的にわかりやすい情報ソースとして、ユーザー体験が向上するのではないかという仮説がありました。今回はカテゴリタブへ動画記事挿入を行うことで、動画記事の有効性を検証しつつ、カテゴリタブの利便性を向上させることを目的としています。
動画記事には、ニュース動画が添付された記事、調理動画が付属するレシピ記事、日常を切り取ったおもしろ系の動画記事など様々あります。動画記事は各カテゴリタブのリスト面上で自動再生できるので、ユーザーは記事をクリックする必要がなく、リスト面上でそのまま動画を視聴して情報を得ることが出来ます。
ここでは動画挿入ロジック導入にあたって私がやってきたことをざっくりとご紹介します。実装までの大まかな流れとしては、
- 動画記事を挿入するカテゴリタブや動画記事の掲載順位を決めるスコアリングを決定するため、動画記事の利用状況を分析する
- 決定した仕様を元に、グノシーアプリで使用できる動画記事をスコア順にソートした「動画記事リスト」を作成する
- サーバーサイドの設定を行い、カテゴリタブへの動画記事の挿入を行う
- ABテストを行い、本施策が目的を達成するものであるかを検証する
となっています。本項ではこの流れに沿ってそれぞれのパートでやってきたことについて簡単にご紹介します。
動画記事の利用状況を分析する(SQL)
まず行ったのが現状の動画記事の分析です。
目的は大きく2つあります。
- 動画記事を挿入するカテゴリタブの決定
- 動画記事の掲載順位を決めるスコアリング手法の決定
これらの目的を達成するために主に調べた点は以下です
- 提供されている動画記事の内容
- 再生数、再生UU、再生時間等のアクション計測
1日に提供される動画記事数を記事の内容毎に集計した結果、ニュース動画記事が圧倒的に多く、次点でレシピ動画記事、癒し動物系動画記事やおもしろ動画記事となっており、これらの記事を挿入対象とすることに決定しました。それ以外のカテゴリの動画については1日あたりの更新数が非常に少ないため不適と判断し、採用を見送りました。
具体的には、ニュース動画を「社会タブ」に、レシピ動画を「グルメタブ」に、癒し動物系動画記事やおもしろ動画記事を「おもしろタブ」に挿入することに決めました。
また、動画のスコアリングには「平均再生率」を採用しました。動画全体の時間に対するユーザーが実際に動画を視聴した時間の割合を示しており、YouTube等の動画配信サイトでも重視されている指標ということで採用しています。
分析のために、ダッシュボードツールのRe:dashを用いました。SQLは内定者インターンで経験していましたが、苦手意識があったので苦労しました。幸い、Re:dash上に過去に先輩が作成したクエリが全て残っているので、それらを参考にしつつ、先輩方にも質問しながら分析を進めることが出来ました。
「動画記事リスト」を作成する(Python)
動画記事を挿入するための記事リストの作成を行いました。
グノシーアプリでは記事のスコアリングを行い、ソートしたものを「候補記事リスト」とし、Amazon DynamoDBに保存して使用しています。今回は、動画記事の平均再生率と、記事作成日からの日数を考慮した時間減衰を用いたスコアリングにより動画記事をソートし、「動画記事リスト」としています。
今回は動画記事数が少ない関係上、ユーザー個人毎のパーソナライズは行わず全ユーザー共通の記事リストとしました。
AWSをサービスを使用するのはここが初めてで、当時は正直よくわかっていませんでしたが、先輩方の指導もありなんとか実装できました。
動画記事の挿入を行う(Golang)
社会、グルメ、おもしろタブに動画記事を挿入する実装を行いました。
当初は概要項で掲載した概略図のように、通常記事セルの代わりに動画セルを挿入する予定でしたが、動画記事セルはほぼ画像領域で構成されているため、通常記事の代わりに挿入してしまうとリスト面に占める画像と文字のバランスが悪くなり、結果として広告のクリック率などに悪影響が出る可能性があるため不適切であるとの指摘がありました。
なので、カテゴリタブに元々挿入されていた大画像記事を自動再生可能な動画記事に置き換える実装を行いました。これによりレイアウトへの影響を最小限に抑えています。
Golangはどこかで名前を聞いたことあるレベルの初心者だったので、サーバーサイドのコードを書くのは最も苦労したタスクの一つでした。
流石にいきなりGolangはキツかったのでUdemyで練習用のGolangアプリの開発を学び、静的型付けや並行処理のような特徴に慣れることから始めました。何か勉強したい技術があるならば、1on1などで希望すれば講座を受ける時間を用意してもらえるので非常にありがたかったです。
2週間ほどかけてなんとか実装を完了し、ABテストへ移行できることになりました。
ABテスト
ABテストでは従来ロジックであるcontrolと新システムであるtreatmentのオンライン実験による比較を行います。今回は動画を挿入しないロジックがcontrolで、動画挿入を行うロジックがtreatmentとなります。段階的にtreatmentの範囲を拡大し、最終的にはct:50%,tr:50%で比較を行っています。
ABテストについては下記の記事で解説されていますのでもし良ければご覧ください。
今回の比較に用いるKPIの候補を設定し、チームMediaMLの先輩方とも相談を行って最終的なKPIを決定しました。
今回のタスクでは、動画を挿入したタブのユーザー体験が向上していることを確認したいため、タブ滞在時間やタブ再訪率を対象KPIとし、広告売上やDAUなどは大きく低下しないかどうか監視する程度にしました。
最終的に、本施策によってタブ滞在時間が3〜8%向上、タブ再訪率は約1%向上し、カテゴリタブの利用価値を向上させていることを確認できたので、100%拡大され、現在のグノシーアプリにも実装されています。
OJTを振り返って
入社して早速、数千万DLを誇るグノシーの改善タスクに携われるということで、ワクワクしながら仕事に臨んでいました。
機械学習エンジニアとして採用いただいたのですが、記事ロジックをつくる以外の経験もしてみたいということを採用段階から考えていて、実際に担当者の方に伝えていました。今回のプロジェクトではその期待通り、分析から記事リストの整形、サーバーサイドの実装までを経験でき、非常にやりごたえのあるタスクの数々でした。
最終的に100%拡大され、強い達成感を得ました。今回のタスクをやり遂げたことで仕事に対する自信に繋がりました。
ジェネラリストとして成長していきたい私にとって申し分のない環境だと感じています。この会社で良かったなと感じることが多く、私自身のこれからの成長にワクワクしています。
終わりに
拙い文章でしたが、最後まで読んでくださってありがとうございました。
エンジニアとしての経験が浅く、グノシーという多くの方々が利用するアプリに携わることには大きな不安もありましたが、先輩方の手厚いサポートもあり、なんとかひとつ成し遂げることができました。
本記事でも紹介した通り、OJTであっても数多くのスキルを必要とするプロジェクトを経験出来ますし、ソフトウェアエンジニアリングに関する広範な経験を積むことができるので、エンジニアとしての成長を重視する方にとっては最高の環境ではないかと思っています。
私の新卒ブログは以上となります。以下に2021年以前の新卒ブログ記事のリンクを掲載していますので、ご興味がありましたら是非ご覧ください。