こんにちは!メルカリでBackendのエンジニアリングマネージャをしている @bravewoodです。
今日はBackendチームのオフサイトをご紹介します。
サービス開発の課題
メルカリは2013年7月にサービスを開始して以来、5年以上の月日が経過しています。
メルカリのAPI単位で見ると、開発はサービス開始より約3ヶ月前の2013年4月に始まっていることがGitリポジトリへのコミットで確認できます。
$ git log --reverse <省略> Date: Sat Apr 6 16:46:32 2013 +0900
現在でもこのリポジトリはメルカリのAPIとして現役で開発が行われており、5年5ヶ月にも渡る開発結果が凝縮された巨大なリポジトリとなっています。
このリポジトリがメルカリというサービスを支え、ここまで成長させてきたことは疑いの無い事実です。しかしここまでに急速なサービス拡大を実現するために、速度を優先しなければならない状況が起こり、結果的に品質観点に目をつぶり、改修を後回しにしたコードというものも存在します。
いわゆる、技術的負債 というやつです。
※ 技術的負債という言葉はマイナス面が強調される場合があり筆者としてはあまり適切ではないと感じていますが、簡潔に書くためにあえて使っております
負債の解消
我々はこれまでに、BPDという仕組みや、個人、あるいはチームベースなどで後回しになったコードのリファクタリングや、テストの追加、不要なコードの削除など負債の解消を行ってきておりますが、どうしても仕事の都合上単発的な動きにならざるをえませんでした。
これらの負債の存在によって、ある機能を追加/改修した際に、全く別の機能がエンバグしたり、想定外の挙動になってしまうということが少なからず発生してきており、今後メンバーが増えてもスケーラブルに開発ができるようにするために、我々はAPIをマイクロサービス化しそれぞれのマイクロサービスの境界を明確にし、特定のマイクロサービスへの修正が他の思わぬサービスへ影響するということを極力減らすための仕組みに書き換えるという大きな挑戦を行うことに決めました。
マイクロサービス化はすでにプロジェクトとして動き出しており、幾つかのサービス単位で切り出しが始まっております。
切り出しの際には既存のコードを完全に捨てて、単に新しいサービス上で書き直すというのが簡単ではありますが、移行元のコードがメンテナンスしやすいコードであった方が切り出しもしやすいという利点があります。
そのため我々は、マイクロサービスチームの一角に既存のPHPコードをリファクタリングするためだけのメンバーをアサインし、彼らが負債の解消を業務として行っています。
負債解消days
上述のように、負債を解消するミッションを持ったメンバーが活躍しているのですが、彼らだけでは手が回らない部分や、より詳しい人がやった方がうまく早くできるということもあり、そこで我々Backendチームは1泊2日のオフサイト合宿をし、集中して負債を解消するための日、「負債解消days」を行ってきました。
- 場所
- 東京からなるべく早く行けて、開発の合間に温泉に入れてリラックスできる所として熱海を選びました
-
会場
- 熱海は温泉旅館はたくさんあるのですが、15名規模の会議室を併設している場所が少ない印象です
- 今回はレクトーレ熱海小嵐 さんで行いました
-
移動
- 新幹線回数券を使うとお得です
- 我々は品川駅に集合し、こだまで熱海まで移動しました
- ひかりの方が早いですが、自由席の多さ、便数の多さが違うのでそこはどちらでも良いかと思います
- のぞみに乗ったらアウトです(熱海に止まりません)
- 途中、参加者1名が回数券を自宅に忘れ、取りに帰るというミスもありましたがなんとか間に合って一安心です
- 熱海駅の改札は、新幹線と在来線の2段階になっており、新幹線改札で回数券をとり忘れないように注意です(私がやりました)
- 熱海駅からレクトーレさんまではタクシーで移動です
-
会場到着
- 集合写真を撮りました
- 会議室のサイズは15名が作業するにはちょうどくらいでした
- WiFiの速度がきつくなることがあるため、ポケットWiFiやテザリングなど複数のネット接続手段を用意すると吉です
- あるいは、チェックイン後は各部屋に分散するのも良いかと思います
-
作業開始
- 我々は事前に、負債リストを広く共有しており、参加できないメンバーも含めて書き込んでいました
- 当日はこちらを元に作業がかぶらないよう各自がやるタスクをシートの担当者欄に書いてもらって進めました
- 進行は専用のslackチャンネルでワイワイしながらやりました
- お風呂は15時からOpenだったので、適宜リラックスしながら開発していきました
-
懇親会
- 食事の後は懇親会をしました
- 普段できないような開発組織全体の話をマジでしました、マネージャのHamamotoさんが酔っ払いながらも一つ一つ丁寧に答えていたのが印象的でした
- なぜいまマイクロサービス化なのか?
- マイクロサービス化を成功させるためには何が大事か?どういう職能・人を採用すべきか?
- マイクロサービスって銀の弾丸じゃなくね?
- ○○さんって僕からはこう見えてるんだけど、ぶっちゃけどうなの?
- 最近のメルカリ社ってどうよ?
- 結果発表会
- 2日目の最後にみんなで結果発表会をしました
- フォーマットは自由です
- 発表会の後は全員で投票をして、「一番負債解消につながるアウトプットをした方」をMVPに選びました
様子です
成果
結果は公開できないことが多いのですが、言える範囲で下記のようなことをやりました。
- API、社内ツールのリポジトリにある現在では使っていないエンドポイントと、それに関連する他リポジトリのコード削除
- メルチャン関連のコードリファクタリング
- 不要なリージョン分岐の削除
- 元々US,UKともコードベースを共有していたため
- 時たまスパイクするエラーの調査
- 社内ツールの
超絶レガシーと化したJSコードの削除 - 今後も継続して負債解消の作業ができるような仕組みを作る (この取り組みがMVPでした)
- セキュリティ対策
- UnitTestの実行を速くする
- 使っていない決済系の処理を消す。(なんと「+19, -15,227」) (この取り組みが惜しくもMVPを逃しました)
今後も継続してこのような取り組みができるような仕組みを開発した、SREチームから参加したmasartzさんがMVPをかっさらっていったのが良い取り組みでしたし、印象的でした。
まとめ
サービスの成長にはいろんなバランス感覚が必要で、そこからこぼれ落ちた負債をまとめて解消するという一つの取り組みをご紹介しました。サービス開発や運用で我々と同じように日々戦っている読者の皆様の参考になれば幸いです。
最後に、事前にやっておいて良かったことを下記にまとめます。
- 目的を明確にする(「負債解消」)
- 事前に参加メンバーに対して通常の業務を振らないように各部署のPMたちにお願いしておく
- 負債リストを事前に共有し、解消したい負債を広く集めておく
- 懇親会をセットする(普段話せないようなことも話せて非常に良い)
We are hiring!
このようなこと「も」やっている、我々の仲間になってくれる人を絶賛募集中です!宜しくお願いします!
https://mercari.workable.com/j/F3D6A8991E