インタビュー

CROSS×TALK vol.1

エンジニアチーム座談会

FIVEのエンジニアリングチームが圧倒的なスピードで成長を実現するスタートアップとしての開発思想を語りました。
2015年に入社したソフトウェアエンジニアの佐藤を主な聞き手として、小西、松本、類地の4人での座談会です。

FIVE の開発環境について

佐藤
ということで、FIVEのエンジニアリングについて知ってもらおうというエンジニア座談会です。FIVE の開発の特徴や考え方を聞いていきたいと思います。
まず、FIVE の開発環境を教えてください。

小西
まず言語についてですが、サーバーはすべて Scalaで書いてます。Scalaを採用している理由は至ってシンプルで、 Twitter がオープンソースにしている Finagle というフレームワークが使いたかったからです。実は、それ以外にScalaを使いたい理由は特になくて、運用や他のライブラリとの親和性を考え、JavaっぽいScalaを書くようにみんな心がけてます。
データ構造は Thrift で、 ScroogeというScala 用のbindingを使っています。RPCライブラリとしてFinagle を使っていて、バックエンドのデータベースは高速なレスポンスが必要なところではRedis 、そうでないところはMySQLという構成です。
あとはLinux サーバ で nginx がフロントに立っていて、SDK は Android がJavaで、iOSがObjective-C ですね。

松本
ストレージは AWS S3 と Google Cloud Storage にログをためてて、今のところ BigQuery にデータを入れてキャンペーンのレポーティングとかデータ分析をやっています。

小西
もうすぐ Spark のバッチができる予定。

松本
もうすぐとは。

小西
本当だろうか、、、そんな感じです。

佐藤
BigQuery の採用理由ってなんだったんですか?使い始めたときから安定してた感じですか?

松本
Google の社内で実績があると伺っていますのでそこはまあ。

小西
ノーコメントでお願いします(笑)

佐藤
Finagle を使ってみたいと思った経緯は?日本で採用実績は多くないと思うのですが。

小西
Twitter で使われていて安定してトラフィックを捌いているという評判を聞いて、ですね。
あとは、Google とか Twitter とかシリコンバレーは人の流動性が高くて、あのへんの会社で使われている RPC ライブラリは割とよく似ているので、 Google出身の僕にはすごく使いやすかったというのが裏事情としてはあります。

佐藤
SDK側(フロントエンド)でどっちかっていうとモバイルの開発もできるエンジニアも大募集という状況だと思うのですが、SDK作っててどこが辛いとか気を付けてることとかっていうのを。

小西
SDKの難しい点は、サーバーと違って一度外に出しちゃうと気軽に置き換えができないので、慎重に作らないといけない点ですね。
アプリケーションを作ってるならいいんですけど、僕らはSDKを作っているので外部ライブラリをバインディングしたりできない。まぁやってもよいのですが、サイズが大きくなっちゃうのでしない方針でやっていて、とはいえ開発速度は落とさずにやるのがしんどいところですかね。
あとはアプリケーション側からSDKのAPIが任意のタイミングでぐっちゃぐちゃに呼ばれたとしてもクラッシュはしない、想定されてない使い道だったらその順番じゃないよみたいなエラーを返すとかが難しい。そうするとSDKが使いにくいみたいに聞こえるかな。

松本
でもそういうものじゃないですか?

小西
そうですね。

松本
ちゃんと想定された使い方をしないとSDKとかライブラリはちゃんとした動きができないっていう、それはそういうもんですよね。

小西
まあ想定されてない順番で叩かれても、一応どんな順番で叩かれてもアプリが落ちたりだとか想定外のステートに落ち込まないように注意して作ってるって感じですかね。
あとはパフォーマンス出すためにバックグラウンドスレッドを多用しているのでそのスレッドまわりのシンクロナイゼーションとかにすごく慎重に。

松本
気を使いますね。

小西
こんな話を聞いたら誰もやりたがらないか。

類地
まだギリギリ大丈夫だと思います(笑)

初期の設計思想とスケーラビリティ


佐藤
FIVEの動画広告配信システムでローディング時間を極小化する仕様や、サーバーサイドの通信と仕組み上工夫したところ、難しいところは。

小西
身も蓋もないですけど、それは営業秘密ですかね。色々なことをやっています。可能な限り、無駄な配信をしないように。広告キャンペーンの要件にしたがって、ユーザーへの負荷、デベロッパーやメディアの負荷が少なくなるようなコントロールはしています。

佐藤
規模感とかトラフィックはどうですか?創業初期から構成がほとんど変わってないと思うんですけど。

小西
フロントサーバーの台数って6台になったんだっけ?

松本
はい。最初の最初は2台から始めて、そのときもふつうにAWS EC2 に載せて ELBがフロントで受けて、それぞれのサーバーのnginx に振ってって感じですけれども。そこから基本は変わってないですね。

小西
開発優先のためにサーバーをコピーして並べたりはしたけれど、ちょっとするとじゃあキレイにしようかっていって間引いていく感じですね。

佐藤
スケールするにあたってどのへんがネックになりそうなんですかね?

小西
そういう意味でいうと、あまりネックになるようには作っていないです。

松本
まあデータベースがまず最初に詰まるっていうのが大体どのサービスでも同じだと思うんですけど、そのときにちゃんとスケールするようにできてるかって話ですかね。

小西
いまも一応シャーディングはできていて。

松本
一応キーごとにどのデータベースをひくかというのはロジックはある。ただし全部同じデータベースを引いている。

類地
データベースは Redis にはアトミックみたいのがあったと思うけどそういうのは使っていない?

松本
Thriftのバイナリをそのまま突っ込んでいるので Redis の機能ってあまり使えていないっていうのが正直なとこですね。Redis ってかなり高機能な Set とか使えてびっくりするんですけどね。例えば、O(log(N)) で Set の中の上から10個を取ってくるみたいのができちゃうんですけど、そういう高機能は使ってないんですよ。最悪ほかのデータベースに乗り換えられるようにも作ってあるし。

小西
創業したときになるべくスケールするように気をつけて作っていて、なおかつあまり難しい機能使いすぎるとスケールしなくなったりだとか、後々大変になったりするので、極力シンプルにシンプルに作ってる感じですかね。

松本
一応、Redis のベンチマークで一通りの機能試してこのオペレーションはこうでした!っていうのは出ますけど、それをどこまで信用できるかって話もありますし。

“クソハック” と 技術的負債

佐藤
僕が入社してからの印象なんですけど、けっこうFIVEの開発ってボトムアップというか、問題がきちんと顕在化してからそれに対応していくことが多いと思うのですが。いきなりトップダウンでこれやるみたいな感じにはならない場合が多いと思うんですけど、そういうのは意識的にやってます、よね?
小西
過度の抽象化はしないということですね。
佐藤
そのへんの開発スピードあげるために、必要なことだけやるっていう風になってると思うんですけど、それをやり続けると逆に負の遺産がたまりすぎてみたいな話もあるじゃないですか。
松本
そうですねぇ。まず、ちゃんと捨てられるようにしておくのはけっこう大事かなと思っています。コードって腐っちゃうんで、どこかのタイミングで、リファクタリングし続けるか、根本から捨てちゃって同じインターフェースを提供するものを作るかの二択になるじゃないですか。で、それは考え方次第な気もしますけども、まあどっちもできるようにしとくのが正しいんでしょうけども。
 
小西
とりあえず開発スピード優先のときはクソハックでいいんですよね。クソハックはクソハックでいいんだけど、何回も似た要望が出てきたらクソハックはちょっとしんどいので作り直す。2回作るときれいなものができるんで。2回作るのも必要な工数なのかなと。
 
松本
ウォーターフォール開発って言葉あるじゃないですか、あれももともと2回作ることを想定されていたみたいな話があるらしくて、2回作るといいものができるって、まぁそうだよなぁと思った記憶がありますね。 それを多分、「2回作る工数無駄じゃね?」って作ったことない人が思ってしまったらしくて、今のその、SIerとかの開発にもなっているって・・・。
類地
それって「人月の神話」に書いてある?
松本
どうだったかなあ。たぶんウォーターフォール開発が最初に提唱されたときにうんぬんとかそういう感じだと。
佐藤
ソフトウェア開発でウォーターフォール開発って出てきたんですか?多分もっと建築とかハードウェアだとプロトタイプ作って、そこから量産みたいな形になるから最低2回は作らないといけないみたいな状況があったんじゃないかな。
類地
FIVEは今まで2回作ってます?
松本
そんなこともないですね。まだ2回つくるフェーズまで来てないっていう感じですかね。クソハックを塗り固めてそれっぽくなってるからまだ本格的に2回目は作らなくていいよねというタイミング。
小西
まあ、わりとみんな綺麗なクソハック書いてますよ(笑)クソハッククソハックって言ってますけど、なんて言い換えればいいんでしょうね。
類地
その場しのぎ・・・?あまりクソハック感がぬぐえてない(笑)Quick and dirtyとかそういうやつですかね。