こんにちは、バックエンドエンジニアの塩崎です。 先日、VASILYバックエンドチームにインターン生が来てくれました。 この記事では彼がインターンで作ってくれた機能や、インターン中のスケジュールなどを紹介します。
インターンに来たのはこんな学生
インターンに来たのはこの春に大学4年生になったばかりの、柴犬大好き系エンジニアのT君です。 好きな言語はClojureというなかなかギークな学生さんでした。
インターンに来てもらう前に提出してもらった事前課題では、コードの綺麗さが光っていました。 この課題はRuby on Railsで「とあるお題」に従ったWeb APIを作るものなのですが、Rubyでありながら変数の再代入を嫌う傾向はさすが関数型に慣れているだけのことはあるなと感じました。
やってもらったタスク
目標
今回のインターンでT君にやってもらったタスクはMySQLからBigQueryのデータ同期の高速化・安定化です。
VASILYでは分析用データベースにBigQueryを使用しており、MySQLに保存されているマスターデータを毎日BigQueryに同期しています。 この処理を行うシステムは約2年前に書かれたもので、プロダクトの成長に伴うデータ量の増加に耐えることができなくなり始めていました。
BigQueryに保存されたデータはVASILYの機械学習システムの入力データとして使われ、ユーザーさんへの価値を届けるために使用されます。 また、会社としての意思決定を行うための資料であるダッシュボードの情報はBigQueryに保存されたデータを可視化したものです。 そのため、この同期処理が正しく行われている状態を維持することは非常に大切なことです。
彼にはこの同期処理を行うシステムを一から作り直してもらいました。
日程
T君には10日間インターンとしてVASILYで働いてもらいました。 技術調査から始めて、必要な機能の実装、本番環境へのデプロイまでをこの期間で行ってもらいました。 そして最終日には役員の前での成果発表会を行いました。
彼がどのようなスケジュールでインターンのタスクをこなしたのかを紹介します。
1〜3日目
データの同期処理そのものはembulkを使用することになりましたので、インターンの前半部分は技術調査をしてもらいました。
embulkが今回の用途に対して十分な機能を持っているかどうか、性能は十分かどうかなどの調査をしてもらいました。 具体的には絵文字(特にUTF8で表現した時に4byteになるような絵文字)を問題なく同期できるかどうか、数十GBの巨大なテーブルを同期する時の処理時間などを調査をお願いしました。
また、embulkのプラグインを調べてもらう中で、プラグインのドキュメントの不備を見つけていたので、その修正のPullRequestを出すようにそそのかしました。 彼にとっての初OSSコントリビュートだったそうです。
4〜6日目
インターン中盤にembulk単体では目標を達成できないことが分かったため、embulkのラッパーを作ることになりました。 embulkは1つのテーブルの同期設定を1つのYAMLで管理するため、複数個のテーブルを同期する場合にはこのYAMLファイルの管理が課題になります。 また、同期に失敗した場合のエラー通知や、同期のログを保存する機能もembulkそのものにはありません。 これらの課題を解決するためのラッパーを彼に書いてもらうことにしました。
VASILYのサーバーサイドは主にRubyが使用されており、Rubyに詳しいエンジニアが多いので、とりあえずRubyで書いてみることを勧めてみました。 ですが、Goで書いてみたいという彼の意見を採用し、Goでラッパーを書いてもらいました。 メンターである僕自身もGoにそこまで詳しいわけではなかったので、この瞬間からタスクがメンターにとってもチャレンジングなものに昇華しました。
彼は自発的にGoに関する資料を調べ、必要なライブラリなどを導入してくれましたので、今から振り返ると、Goを採用して良かったと思います。
7〜9日目
インターンの後半部分ではCIやデプロイなどの運用に関する部分を作ってもらいました。 CircleCIでGoのテストを実行したり、CircleCIのコンテナ内でクロスコンパイルしたGoのバイナリをプライベートネットワークの中のEC2インスタンスに配置したりする部分を実装してもらいました。 これらは彼にとって未知の領域でしたので、いろいろと調べながら実装することが多かった様子でした。
10日目
最終日にはVASILYの役員の前で成果発表を行いました。 役員の一人であるCTOの今村はエンジニアである、VASILYの技術のプロフェッショナルですが、他の役員はそうではありません。 エンジニアではない人に対して自分が行った成果を説明することにやや戸惑う様子もありましたが、非常にわかりやすく説明できており、役員から好評をもらいました。
最終的にできたもの
最終的にインターンの成果物として出来上がったものを紹介します。
以下の図は彼の成果発表のスライドから抜粋したものです。
これらの機能の詳細は機会があればTECH BLOGで紹介したいと思います。
設定された時間になると、Goで書かれたembulkラッパーをcronが呼び出します。 このラッパーはMySQLから同期するべきテーブルのスキーマ情報を読み込み、embulkの同期設定ファイル(YAML)を生成します。 そして、そのYAMLファイルを引数にしてembulkを起動し、データの同期処理を行います。 また、BigQueryに同期する時にGCSにテーブルのダンプを置くことによって、同期の安定化・高速化を図っています。
図中のほうれん草の画像から下の部分はログ収集部分です。 詳細なログはテキストファイル形式でサーバー内に保存されます。 要約されたログはVASILYのログ収集基盤によって収集され、最終的にはS3とBigQueryに動作ログが保存されます。
このログ収集基盤については以下の記事で詳しく説明されていますので、興味のある方はご覧ください。
本人の感想
10日間のインターンは、とにかく楽しすぎる10日間でした。
初日にミドルウェアを色々使いたいと要望を出したところ、今回の課題をやることになり、やりたいことをインターン生にやらせてくれるという柔軟さに驚きました。
やりたいことと、課題がマッチしていたおかげで積極的に楽しく取り組むことができました。 開発では技術調査から、プログラミング、テスト、CI、デプロイまで一気通貫で取り組むことができました。 CIやデプロイまわりは普段あまり経験する機会がなかったのですごく勉強になりました。
技術調査中にメンターの塩崎さんに指導してもらいながら初OSSコントリビュートも果たすことができました。 これからどんどんコントリビュートしていきたいと思います! 会社はとにかく賑やかで、気軽に質問したり、話をしたりと楽しく過ごすことができました。
今回作成したものが実際に利用されているということで自信にもつながりました。 インターンの経験を活かしてどんどんレベルアップして、塩崎さんみたいなすごいエンジニアになりたいと思っています!!
まとめ
VASILYのバックエンドチームにインターンに来てくれたT君のおかげでMySQLからBigQueryへデータ同期を行うシステムがモダンなものになり、安定して動作するようになりました。 BigQueryに格納されたマスターデータはBIツールであるTableauによって可視化され、それに基づいて意思決定が行われます。 そのため、安定して同期が行えるようになったことは意思決定を正しく行う上でとても意味のあることでもあります。
VASILYのインターンは本番環境で動かすための機能を作ってもらうことが大きな特徴です。 そのため、インターン生を「お客様」としては扱いません。 本番環境のコードに触れる以上、インターン生も1人のプロフェッショナルであるという思いを持って指導を行います。
そんな環境でスキルを磨きたいという熱意に溢れる学生の皆様はぜひ以下のバナーからご応募ください。