マジ価値DeepDiver第一号の1カ月間のチャレンジ(連載 第3回)

こんにちは、freee関西支社でエンジニアをやっていますliaoです。19新卒として入社して、freee人事労務、freeeプロジェクト管理の開発を経て、現在はSREチームに所属してインフラ周りのことをしています。先日の連載記事で巨匠制度の歴史初代・二代目巨匠が考えるエンジニアキャリアについて紹介されました。今回、巨匠制度から進化した若手・中堅エンジニア向け制度のマジ価値DeepDiverに第一号として応募して1ヶ月間チャレンジしてみました。8月に取り組みが終わったので、実際に取り組んだ内容と感想を共有したいと思います。

マジ価値DeepDiverとは

巨匠制度の歴史でも言及されていますが、マジ価値DeepDiverは、若手〜中堅向けの制度です。この制度を通して取り組む人が1ヶ月、圧倒的主体性をもって組織の課題を発見〜解決まで経験してもらい、自分の成長のブレークスルーポイントを創出してもらうことを狙いとしています。

取り組んだ内容

「Performance Deep Dive DB」というお題で1ヶ月間取り組みました。名前からは分かりづらいと思いますが、ローカルやテスト環境から気軽に繋げられるパフォーマンス検証DBの仕組みを作りました。

パフォーマンスの課題感

freeeは個人事業主から上場企業まで幅広く使えるサービスを提供していて、規模にかかわらずストレスなくサービスを使える状態を保たないといけません。しかし、大規模事業所になってくるとデータ量が多いため、特定のページや操作で重い場合があります。 こういった本番環境で起きたパフォーマンス問題を解消するのですが、ローカルで本番と同じ規模のデータを入れるのが難しく、再現が難航することがあります。もしローカルからすぐ繋げられる大規模DBがあればいいのになと思ったのがきっかけでした。

ゴール設定

freeeには「マジ価値」という価値基準がありますが、課題感を踏まえて、価値を最大化できるように、今回のプロジェクトのゴールを以下に設定しました。

  • パフォーマンス問題を起きにくくするための仕組みづくり
    • 既に起きている問題を解消
    • 本番に行く前の問題検知
  • 継続して価値を提供できる運用にしたい
    • 管理者側のメンテしやすさ
    • 利用者側の使いやすさ
    • 手作業をできるだけ減らして自動化できるものを自動化したい

パフォーマンス問題をできるだけなくすためには、既に起きている問題の解消に取り組む一方で、新たに問題が起きないようにしないといけません。そして、運用が煩雑だったり、使いにくくなると結局使われないので、運用面もきちんと考える必要があると思い、仕組みづくりと運用整備をゴールとして設定しました。

課題を解消するためのアプローチ

概要

大規模データが入ったDBをすぐ利用できるように、DBをAWSに乗せて、開発者のローカルマシンから繋げられるようにしました。開発者が個々でローカルでデータを入れることなく、ネット環境があれば使えるようになります。ローカルから気軽に利用できるようになると、検証がしやすくなり、パフォーマンス問題の解消や、開発中の機能のパフォーマンステストが簡単にできるようになります。

実現方法

大規模データの準備

仕組みを実現するために、まず大規模データを作る必要がありますが、設計する時点では本番データをマスキングして使う案と自前でダミーデータを作成する案がありました。本番データの一番のメリットはリアル性です。パフォーマンス問題を再現しやすく、取得するのに手間がかからないメリットがあります。しかし、ローカルから気軽にDBに接続できるようにする想定なので、万一マスキングロジックに漏れがあった場合の漏洩リスクが高いという懸念点が存在しています。自前でダミーデータを用意する案は、最初seedファイルやダミーデータを挿入することに手間と時間がかかりますが、マスキングすることによって変なデータができる問題を回避できるのと、データの量と種類が自由に設定ができるメリットがあります。そして、新規サービスなど、ユーザー数がまだまだ少ない場合だと、本番データがそこまで蓄積していないため、パフォマンス問題に気づきにくいです。将来を見据えて、大量なデータをあらかじめ作っておくと、パフォーマンス問題を未然に防ぐことができます。セキュリティリスクの回避と自由度を追求したいことで、今回はダミーデータを用意する方向で進めていました。 大規模ダミーデータの作成はseed-fu を使って動的に生成しました。seed-fuは、ファイル単位で実行できたり、簡単に書けるようなシンタックスシュガーがあったりと便利です。そして、データが偏って単純化にならないように、値の決定とリレーション関係はなるべくランダムで決めるようにしています。

DBクローンの仕組み

全体システム構成は下図になります。AWS上に今回の大規模DBが置いてあります。右側には大規模データを格納するMaster DB、そして左側には実際開発者が利用するTest DBがあります。AWS Auroraのclone機能を使って、開発者が利用するたびに、Master DBからクローン(Test DB)を作成します。利用するごとに、Test DBが作成され、開発者が同じタイミングで大規模DBを利用しても、お互い影響を受けることなく利用できるようになっています。

f:id:liaoziyang:20211025225107p:plain
概要

運用手法

Master DBはスキーマ更新などでこまめなメンテが必要です。DBスキーマのズレがあるとエラーが出てしまうので、常に最新のスキーマに追従できた方が良いです。毎回手動でmigrationなどを実施するのは手間がかかるので、できるだけ手作業をなくし、自動化を行いました。DBメンテ用のEC2インスタンスを作成し、毎日自動でコードをGitHubから持ってきて、migration等を実施するようにしました。 そして、開発者が利用しやすくするためにTest DBを作成するコマンドを1つにまとめたり、ローカルから繋ぐための作業をすぐできるようにしました。利用し終わった後の片付けも自動で行われるので、ストレスなく利用できるように手順を簡易化しました。

今後の展開

このプロジェクトは検証DB作成とローカル開発での利用にフォーカスして取り組みましたが、検証DBの仕組み自体は他に活用できそうなところがたくさんあると思いました。例えば、CIから検証DBを利用して、パフォーマンスの自動チェックを行ったり、QAでパフォーマンス確認を行ったりするのにも利用できそうかなと感じました。

期間中のタイムライン

以前の巨匠制度は事前にプロジェクトのテーマを公募し、誰がやるかは社内で投票して決める形でしたが、今回のマジ価値DeepDiverではやりたい人が自ら手を挙げて、その後にプロジェクトのテーマを決めました。私の場合のタイムラインはこんな感じです。

  • プロジェクトテーマ選定&DesignDocを書く
    • 4月~6月
    • 月1回壁打ち
  • 技術検証
    • 7月1週目
  • ガッツリ実装
    • 7月2~3週目
  • Doc用意、成果物検証
    • 7月4週目

実際に課題に取り組む期間は1ヶ月間ですが、準備期間が3ヶ月ありました。ただし、その3ヶ月は何をやるかをイメージして、ざっくりやりたいことを書き出すぐらいなので、特にガッツリ時間とっていたわけではありませんでした。月に1回、初代巨匠であるterashiさんとの壁打ちの機会があって、アドバイスいただいたり、どうやって価値を出すかを議論したりすることができ、とても有意義な時間を過ごせました。

7月に入ってからは、普段の業務から離れて、プロジェクトに専念する期間となりました。今回のプロジェクトと関係のないMTGを全部なくすなど、いろいろ施策を打っていただいたので、とても集中できました。プロジェクトのサポートとして、プロジェクト管理開発チームと、DB専門のチームにも入っていただいていて、プロジェクトとは関係のないMTGがない一方、コミュニケーションやFBを得るために、サポートチームとのWeeklyや朝会を開催していました。

得られたもの

  • 理想ドリブン*1でやりたいことにチャレンジできた
  • 主体性を持って、課題発見〜実装〜発表までほぼなんでも自分で決めて実行する経験
  • サポートチームを含め、社内から幅広くFBをもらう機会
  • 普段の業務から離れて完全に没頭できる時間

大変だったこと

  • 1ヶ月ほんとにあっという間だった
  • ほぼ1人でやるので、うまくいかなかったらどうしようというプレッシャーがあった
  • 普段あまりやらない課題なので、チャレンジ要素が多く、最初のキャッチアップが大変

挑戦の機会や、大きな裁量をもらう機会を最大限活かすための進め方やスタンス

  • 1人でもくもくやる時間がほとんどなので、定期的に他の人と話す機会を設けた方良い
  • とりあえずやってみるのが大事
    • 挑戦して失敗しても得られるものがあって、今後にも活かせる経験になるので、良い機会があれば掴みましょう
  • 準備期間で、課題のブラッシュアップをしておく
    • アイデアについて、いろんなチームからFBもらう
    • プロジェクトのゴールイメージを具体的に作っておく
  • 始まる前にスケジュールやマイルストーンを決めておくと進行がスムーズになる
    • 事前に段取りを決めると、進行する際に自己検査ができて、進捗が順調かどうかわかるようになるので、スケジュール通りに終わらせることに役に立つ

最後に

マジ価値DeepDiver第一号として、何も考えずやってみたんですが、やりたいことにチャレンジできて楽しかったです。個人的には、最初から最後まで自分で主体性を持って取り組むことがすこく貴重な経験だと思っているし、今後プロジェクトを任されたときにもこの経験を生かして、取り組んでいきたいなと思っています。今後マジ価値DeepDiver制度からどんな面白い取り組みが出てくるのか、楽しみにしています!

*1:freeeの行動指針のひとつ。理想から考え、現在のリソースやスキルにとらわれず挑戦しつづけるという意味