こんにちは!2023年の3月に「CA Tech JOB」というインターンシップに参加しました、佐藤浩一郎です。
約1か月間、ABEMAで様々なことを学びつつ、「batch処理のCronJob化」というタスクを行いました。

この記事では、ABEMAでインターンシップ生としてどのようなことをやるのか、どのような一か月間を過ごしたのかを紹介します。

 

「CA Tech JOB」について

私は、2023年3月に「CA Tech JOB」に参加し、ABEMAで約1か月間のインターンシップを経験しました。この「CA Tech JOB」は、CyberAgentグループ内の事業の中から自分が参加したいものを選び、実際の社員と同じようにチームに所属して開発や業務に取り組むことができます。

開発業務のほかにも、他事業部との交流ランチや人事や社員との面談なども行えます。日々の1on1ではキャリア設計などをしつつ、社員と同じような生活を送りながら、業務以外の面でもABEMAをとても楽しく体験することができました。

当初、私は週4日の参加を予定していましたが、楽しい日々に魅了され、途中から週5日の参加に切り替えたほどです。

「CA Tech JOB」は、年間を通じて募集されており、参加希望月の3ヶ月前までに申し込みを行うことができます。私は、「FIFA ワールドカップ カタール 2022」でのABEMAの技術に興味を持ち、すぐに申し込みを行ったため、翌年の3月に参加することができました。選考では、人事の方に「FIFA ワールドカップ カタール 2022」でのABEMAの感動や、自分がABEMAのバックエンドチームでの就業を希望していることを伝え調整していただきました。

タイトルにある通り私は、「Go」という開発言語を全く経験したことがなく、面接でも学びながらの参加になるということを伝えました。実際、ABEMAの開発に参加できるかどうか心配していましたが、希望通り「ABEMA」のバックエンドチームに所属することができました。

この記事では、自分が「Go」未経験でありながらも、「CA Tech JOB」の中でどのようなことを学び、吸収し、成果を残すことができたかについても紹介します。

 

今回のタスクについて

今回1か月という短い期間で行ったタスクは、「batch処理のCronJob化」というものです。

ABEMAは、「マイクロサービスアーキテクチャ」というアーキテクチャで構成されています。
例えば、認証、決済、データ管理、検索など小さなサービスとして分け、そのサービス間でgRPCを介してやり取りし巨大な1つのシステムを動かします。

今回は、このマイクロサービスを使って定期実行をしている、バッチ処理の改修を担当しました。

 

Kubernetesについて

ABEMAでは、マイクロサービスアーキテクチャの実現のため「Kubernetes(以下k8s)」というOSSを使っています。k8sは複数のコンテナを管理し、スケーリング、ロードバランシング、ネットワーク設定、セキュリティなどの機能を提供します。

コンテナは、アプリケーションをパッケージ化して実行するための仕組みで、独立した実行環境を提供します。しかし、複数のコンテナを管理するとなると、手動で行うと煩雑であり、手間がかかります。そこで、k8sは、複数のコンテナを管理するためのオーケストレーションツールとして開発されました。

インターン当初、Dockerしか触ったことがなく、k8sという単語を聞いたことも無かったので、最初はDockerと何が違うのが混乱しましたが、Dockerはコンテナを作成し、k8sは複数のDockerコンテナをまとめてPodという単位で管理することで、システム全体で効率的なコンテナのデプロイやスケールアップ、ローリングアップデートなどを実現できるということを、minikubeを触りながら少しずつ理解していきました。

私は、手元で3個ほどのpodを動かして学んでいましたが、隣でトレーナーがABEMAを構成している大量のpodのステータスを見つめている姿は、素直にかっこいいなと思ったりもしました。

 

現状の課題について

今回のタスク「batch処理のCronJob化」は「k8sのリソースを削減したい」という目的で行われます。

改修前、定期実行されるサービスはDeploymentというリソース上で動作していました。

このDeploymentというリソースは、バッチ処理が走らない時間も動作を続けてしまうもので、メモリやcpuを消費しておりコストがかかっていました。そこで、設定した時間に自動で立ち上がり、処理が終了すると、自動でコンテナまで削除してくれる「CronJob」というものに変更をおこなうというのが今回のタスクです。

つまり、コードをメインで開発するよりも、k8sのマニフェストを書くことに重心が置かれる想定でインターンをはじめました。これにより、「Go」が未経験だった私も問題なくインターンを進められるかと思いきや、しっかりと壁にぶつかりました。

 

第一の壁 コードリーディング

マニフェストを書き換えて終わりというわけにはいきません。まずは、設計を行います。
私の所属したチームでは、タスクの実行時には設計を文書化して必ず残るようにしていました。毎日の夕会では設計のレビューがあり、様々な指摘が飛び交っていました。

この設計を行うときに、コードリーディングをする必要があったのですが、そこがまずとても時間がかかりました。

タイトル通り、「Go未経験」で参加したため、ABEMAの膨大なコードに初めは圧倒されてしまいました。
Go routineや、Interfaceなど、Go特有のものについて基礎から全てトレーナーに質問しましたし、それにすぐにスラスラと深いところや関連するところまで解説してくれたトレーナーには驚きました。

トレーナーのサポートもあり、Goの言語の壁を乗り越えコードリーディングが少しずつできるようになった段階で、処理の一つにオンメモリキャッシュを行うものに気が付きました。これが、第二の壁へとつながっていきます。

 

第二の壁 使えないオンメモリキャッシュ

処理の中に、1分おきにオンメモリキャッシュを作成するものがありました。しかし、CronJobの説明でも行ったように、CronJobのリソースは処理が終了すると削除されてしまうため、オンメモリキャッシュも消えてしまいます。

このため、他のバッチ処理に影響を与えることが分かり、それらに対してキャッシュを使わない形に修正を加える必要が判明しました。

CronJob化を断念するというのも検討しましたが、バッチ処理の頻度が高頻度ではなかったのでキャッシュを使わなくても問題ないと判断しました。

トレーナーに相談しつつ、マイクロサービスをたたくためのClientを作成し、データを取得することまで書いたのですが、既存のテストがキャッシュ使用を前提にしていたのでテストが失敗してしまいました。

Mockを追加しテストを修正したのですが、ドメインの知識が全くなくモックのデータに何が必要なのか全くわからず開発が止まってしまいました。悩んでいるところに、トレーナーに手を差し伸べてもらい、デバッガの使い方や最低限のドメイン知識を教えてもらい何とか、テストをパスできたときはとても嬉しく一番記憶に残っています。

そこで、エスカレーションせずに1日ほど悩んでしまったので適切なエスカレーションというのは課題だなと感じ、その後は5分以上の悩みは全てエスカレーションするとルールをつけ意識的に取り組みました。

また今回は、「Cobra」というライブラリを用いてCLI化することまで行いました。これにより、複数のバッチ処理を行うために複数のイメージを作成する必要がなくなります。
CobraによるCLI化は、ここまでのコードリーディングやテストの記述である程度コツをつかみ、素早く実装できたと思います。

 

リリース

2つの壁を乗り越え、レビューをいただきApplovedをもらったので、いざリリースというところですが、ここが一番緊張しました。

ABEMAではトランクベース開発というものを取り入れており、高頻度でデプロイするためにmainにマージするだけでほぼ全自動で本番環境に反映されます。

今回のbatch処理は、ユーザーに通知を飛ばすものであったため、CronJob化する過程で冪等性が担保されなくなっていないか、非常に不安でした。

トレーナーと相談しリリースに段階をつけ、開発環境で1日動作確認を行ってから、本番反映しようということになり、期待通りの動作をするか確実にしていきました。

本番反映には、PipeCDというCDツールのボタンを押さなければいけないのですが、押したあと正常にリプレースされ、期待通りにタスクを終えられたことが一番うれしかったです。

こうして、今回のインターン中に渡されたタスクは無事終了することができました。Golangの学習からk8sなど、様々な最新の技術を教えてもらいつつ開発を進められた1か月でした。

 

技術以外の学び

もちろん「CA Tech JOB」で得られることは、技術に関することだけではありません。

インターン期間中には、毎日トレーナーとABEMAやCyberAgent全体の社員の方とランチに行くことができます。たくさんの事業部があるCyberAgentだからこそ、自分と似た境遇であったり自分のキャリアの相談に乗ってもらうことができ、とても参考になりました。

他にも、毎日メンターとの1on1や、トレーナーとの週1の1on1、人事との面談など自分がインターン中に最大限学べるよう、多くの方がサポートしてくれます。

これらの取り組みのおかげで、自分の将来の方向性がより明確になったと思いますし、他の社員方々から開発のインスピレーションを受けることができました。

 

まとめ

Go未経験でインターンシップに挑戦するというのはなかなかハードルが高く、タスクを終わらせることに集中してしまいがちなときもありました。

しかし、ABEMAでは技術以外でも、サービス品質や開発速度の向上に向けて様々な取り組みがされています。そのようなことを学びつつ、自分もバグの調査を行ったり細かなコード修正をやってみたりし、ABEMA全体に貢献できたのではないかと思います。

知らないことが多かったですが、ABEMAについてインターンシップ期間中でしか知れない話や大規模システムの開発手法や思想、チーム開発のベストプラクティスなどの知識や経験を吸収することができ、今後の開発に活用できるようになりました。

 

特に私はまだ18歳ということもあり、就活に対する知見や経験が少なかったため、これからの長い学生生活であったり、将来の方向性を明確にするため、様々な質問をすることができ、自分が今後どのように成長すべきかを把握することができたのは、とてもいいことではないかと思います。

技術的な基礎から、これからのキャリアのことまで一緒に考えてくれた、メンターとトレーナー、そしてチームメンバー、ABEMAの社員の方々、本当にありがとうございました。