サイバーエージェントを支える技術者たち

第63回アドテクスタジオのエンジニアに聞くScalaの魅力

サイバーエージェントのインターネット広告事業を技術面から支える「アドテクスタジオ」では、関数型言語の一つであるScalaが積極的に活用されています。今回、スマートフォン特化型のリアルタイムターゲティング広告を実現するサービス「Dynalyst」図1を開発した韓翔元氏写真1⁠、そしてスマートフォン向けアドプラットフォームである「AMoAdアドネットワーク」図2の開発と運用を担当する井上ゆり氏(写真2)に、Scalaの魅力を伺いました。

最新のアドテクを詰め込んだDynalystにScalaを採用

――最初にScalaに興味を持ったきっかけを教えてください。

井上:サイバーエージェントに入社する前から関数型言語に興味があり、評価が必要になるまで実際の計算を行わない遅延評価のしくみなどに魅力を感じていました。その中でも特にScalaにはJVM上で実行できるといったメリットがあり、既存のJava環境との親和性も高かったので実際の開発現場でも使うようになりました。

写真1 韓 翔元 氏
写真1 韓 翔元 氏

韓:私はサイバーエージェントアメリカで働いていたころ、アメリカで活躍している多くのエンジニアと交流したのですが、そのときに最近Scalaが流行っているという話をよく聞いたのです。それでScalaについて調べてみたところ、Twitterなどの企業がScalaを採用し始めていると知り、そこから興味を持ち始めました。

ただ最初の印象は良くなかったです(笑⁠⁠。そのときはJavaしか使っていなかったので、Scalaのコードを見てもよくわからなかったんですよね。それにJVM上で実行するならJavaで書いたほうがよいという思いもありました。それでもScalaを勉強することにしたのは、いずれアメリカと同じように日本でも普及するだろうと考えたからです。さらにエンジニアとしてステップアップするためにも、Scalaに取り組むことを決めました。

――最初に実際の開発にScalaを使うと決めたとき、周囲のエンジニアの反応はどうだったのでしょうか。

井上:現在のプロジェクトでは始めからScalaを使っていますが、2年ほど前に別のプロジェクトに携わっていた際もScalaを提案しました。そのときはもちろん反対されました。グラフDBにアクセスするためのラッパーをScalaで作ろうとしたのですが、当時は周りにScalaを使っているエンジニアがいなかったので、誰がメンテナンスするんだと言われたのです。それでも「私がメンテナンスする」と押し切り、Scalaでの開発を認めてもらいました。

韓:現在携わっているDynalystのプロジェクトが始まったとき、基本設計の検討などとともに開発言語をどうするかという話になって、Scalaをプッシュしました。チームメンバーが納得せず、無理と言われたらそこで終わりだったかもしれませんが、メンテナンスも含めて自分が責任を持って対応するつもりで提案したところ、チーム全員がScalaの採用に納得してくれました。

図1 Dynalyst
図1 Dynalyst
韓氏が開発に携わる、スマートフォン特化型のリアルタイムターゲティング広告サービス「Dynalyst⁠⁠。企業の商品情報とWebサイトでのユーザ行動履歴を組み合わせ、ユーザにパーソナライズドされたお勧め商品をリアルタイムに配信する

ペアプログラミングでメンバーにScalaの極意を伝授

――実際の開発への利用を考えたとき、当然学習コストも考える必要があると思います。その点について、Scalaをどのように評価されていたのでしょうか。

井上:エンジニアであれば、1つの言語を知っていればほかの言語の習得にはそれほど時間がかからないだろうという認識があると思います。しかし、オブジェクト指向言語と関数型言語の壁はそれほど低くなく、パラダイム転換が必要です。ただScalaではJavaの資産であるライブラリ類がそのまま使えるので、Javaエンジニアであればその面で過去の経験を活かせます。そのように考えると、Scalaの学習コストはほかの関数型言語に比べて低いと思います。

韓:Dynalystの開発を始めたとき、周りのメンバーは私も含めてScalaでの開発は初めてでした。ScalaはJava的な書き方ができるので、最初はJavaと似たようなソースコードで作り始めて、そこから徐々にScalaに慣れて関数型言語の概念を採り入れるといった流れで開発を進めました。

人によって違いますが、Dynalystのメンバーで言えば、実際にコーディングを始めたのが11月でそこから2ヵ月半ほどでリリースに至っています。初めての人でも、それくらいの期間があれば対応できるのではないでしょうか。

井上:たしかにScalaはJava風の書き方ができますが、関数型言語への頭の切り替えができていないとコードが汚なくなって嫌ですね(笑⁠⁠。コードの見た目だけでなく実行速度にも関わるので、がんばって学習して関数型言語の頭に切り替える必要があると考えています。

韓:たしかに一時期Scalaの書き方で悩みましたね。ただ、プロジェクトが始まるときにScalaにしましょうと私が話して、それがOKされてScalaを採用したわけです。そうしてみんなで決めたことなのだから、悩んでいる暇があるなら勉強しましょうと(笑⁠⁠。

また、アドテクスタジオでは「アドテクDOJO(道場⁠⁠」という取り組みを定期的に開催しています。アドテクDOJO(道場)とは、⁠師匠」「弟子」の関係設定を設け、育成文化の一貫としてペアプログラミングを行う社内の取り組みです。これを利用してチーム内のメンバーとペアを組み、集中的にScalaの考え方や書き方を伝えました。結果的にはプロジェクトのリリースまでたどり着いて、メンバーもScalaで書くことに慣れたようです。最近、Scalaで開発してよかったですかとメンバーに聞いたところ、みんなScalaでよかった、楽しくコーディングしていますと言ってもらえたのでうれしかったですね。

井上:楽しくコーディングできるなんて最高ですね。

JavaのライブラリはScalaでは使いたくない!?

――逆に、Scalaでの開発はやめればよかったと思うことや、Javaとの比較で弱さを感じる部分はありますか。
写真2 井上ゆり 氏
写真2 井上ゆり 氏

井上:AndroidのアプリをScalaで開発したのですが、そのときはやめるべきだった、Javaにすべきだったと後悔しました。基本的にJavaもScalaもコンパイルすればバイトコードになるので、Android上でも動作します。しかし、Scalaのライブラリが重過ぎて現状のAndroidのハードウェアリソースではちょっと厳しかったです。ただ時代も変わっていくので、将来的には大丈夫になるだろうと期待しています。

韓:現在の仕事の延長線上で少し気になっていることがあります。今後リアルタイムプロセッシングと言われるストリーム処理をScalaで実装したいと考えているのですが、Javaにはそのためのライブラリがいろいろとある一方、Scalaにはまだ少ないことがわかりました。たとえばAmazon Web Services上でストリーミングデータをリアルタイム処理できるAmazon Kinesisというサービスがありますが、SDKやライブラリはJava向けにしか提供されていません。

JavaからAmazon Kinesisを利用する手もありますが、現状ではDynalystのサーバサイドはすべてScalaで統一しているので、Javaを入れたくないのです。ただ、ちょっとAmazon Kinesisは使いたいなと思うところもあり、迷っています。

たしかにScalaではJavaのライブラリを使えますが、実際に使うとソースコードにJava的なコードが入り込んでしまうので、JavaのライブラリはScalaでは使いたくないという思いがあります。おそらく本当のScala好きはそう思っている方が多いのではないでしょうか。

社内勉強会でScalaエクササイズ

――JavaとScalaはパフォーマンス面でどちらが優れているのか議論になることが多いと思います。実際に開発に使われていて、Scalaのパフォーマンスをどのように感じていますか。

韓:そこはJavaとScalaの違いというよりはソースコードの書き方の問題という気がします。たとえばScalaの記法の1つに関数リテラルがありますが、これを利用すると無名クラスとしてバイトコードが生成されてしまいます。これがパフォーマンスに影響するという話があります。ただ、実際に検証すると性能面での影響はほとんど感じられず、また関数リテラルを使えばソースコードの記述が楽になって可読性やメンテナンス性も向上するので、割り切って使っています。

井上:1点だけ、ここは確実に遅いと言えるのはコンパイルですね。Scalaのライブラリを読み込んでコンパイルするので、どうしても時間がかかります。

図2 AMoAdネットワーク
図2 AMoAdネットワーク
開発および運用担当者の1人として井上氏が関わる「AMoAdネットワーク」でもScalaが活用されている。AMoAdネットワークはスマートフォン向けのアドプラットフォームであり、高機能なターゲティングメニューを備えているのが特長
――これからScalaを学ぶエンジニアへアドバイスするとしたら、どういったことでしょうか。

韓:とりあえず書いてみるのがよいでしょう。最初はJava風の書き方でもよいと思います。それで慣れてきたら、徐々に関数型言語風のソースコードに書き直していくという流れです。そうすると、おそらくモナドあたりで詰まると思いますが、そこを理解できれば大幅にソースコードの量が減り、Scalaのメリットを実感できると思います。

井上:私たちのチームでは毎週Scala勉強会を開催しています。チームのメンバーはScala好きでゴリゴリ使っているのに、さらにまた勉強会をやっているわけなんですが(笑⁠⁠、そこではスパルタエクササイズが行われます。⁠Functional Programming in Scala』注1という洋書に、最終的にScalaz[2]で使われているようなオブジェクトを作っちゃおうという高い目標のエクササイズが載っているんですね。順番にやっていくと自然に関数型言語脳が作られるすばらしい本なので、ぜひ実践してみていただきたいです。

韓:私はDynalystを開発している途中にこの勉強会に参加しましたが、⁠Functional Programming in Scala』を読んだら今のソースコードでは駄目だと感じて書き直したことがあります。そのくらい勉強になる本です。

――アドテクスタジオが開設されて半年が経ちましたが、グループ会社内のアドテクに携わるエンジニアが集まったことで、どのような変化が生まれているのでしょうか。

韓:非常に良い方向に向かいつつある手応えを感じています。今までバラバラだったさまざまなプロダクトが1つのフロアに集まり、コミュニケーションを図りながら開発を進めることができていますし、さらにシナジーを高めるための企画も進んでいます。先ほどお話したアドテクDOJO(道場)でのペアプロのような取り組みの中で、コミュニケーションをさらに深めて良いプロダクトを創出していきます。

――本日はありがとうございました。

おすすめ記事

記事・ニュース一覧