約3カ月でScala率9割の動画広告配信プロダクト「LODEO」を開発
2014年の動画広告市場は前年比約2倍の300億円規模といわれ、その成長は破竹の勢いともいえる。サイバーエージェントでは「アドテクノロジーの開発」をキーワードに約200名のエンジニアを集め、2013年10月に「アドテクスタジオ」を設立。2014年10月よりアドテクスタジオにて動画広告配信プロダクト「LODEO」の開発を手がけ、2015年1月にリリースした。
その背景には、動画広告自体のニーズはもちろんのこと、スマートフォンの動画広告という新しい表現と、PCを使わない新たなユーザへリーチすることが可能なプロダクトが求められているという現状がある。「LODEO」の特徴は、1日に数十億リクエスト以上さばくという高いパフォーマンスに加え、個々のユーザに配信可能な配信ロジックを搭載し、データ分析や予測も行えるというもの。さらに、動画配信のネックとなりがちな異なる環境にも柔軟に対応する。
実質3か月という短期間に、配信サーバや計測サーバ、集計バッチ、スマートフォン用動画プレーヤーモジュール、インフラまで、あらゆるものを準備する必要があり、スタート時3名、完了時12名の少人数での開発はかなりハイスピードといえるだろう。その迅速な開発を実現した際の立役者が「Scala」というわけだ。
しかし、新田氏によれば「開発メンバーのうち未経験者が半数以上、経験者も実務はせいぜい半年、または本を読んだだけ」という状況。そうしたメンバーがScala率91.3%という「LODEO」を開発したのだという。ちなみに他には、JavaScriptやCoffeeScriptなどが使われている。
新田氏は開発プロセスについて、開発期前半は、「KPT(Keep、Problem、Try)を週1で行い、毎日のように作っては反映しを繰り返した。はじめは人数が少なかったが、後に増えることが決まっていたので、GitHubを使った情報共有を徹底した」と語る。また、開発中盤から後半期には、Huboardによるチケット管理をGitHubと連携させるなど、コミュニケーション環境の充実を図り、品質を高めるためにコードベースレビューのマージを頻繁に行ったという。
プロジェクト開始から終了まで、一貫して意識したことについて新田氏は次のような項目をポイントとして上げる。
1)再利用回数を考え、「見える化・集約・蓄積」を行なう。
二度と使わないドキュメントは意味が無い。コミュニケーションコストと開発における必要性を鑑みながら、情報共有を行なった。また、その際にはGitHubへの集約を図り、コラボレーションツールを適宜活用した。
2)開発サイクルの最大化
デプロイなどの自動化や朝会での流動的な優先度変更、KPIで上がったTODOの実行を柔軟に行い、フィードバッグのキャッチアップと動き出しを早くすることを心がけた。この際、「何を作るかでなく何をしたいか」を伝えることが肝心。一人で抱え込むのではなく、チーム全体で改善案を考えて共有し、実行することが大切。
3)個人に焦点を当てる
今までの経験値を最大限に活かす方法を「個人」にフォーカスして考えた。プロジェクトを通じてどんなナレッジがたまるのか、期待と結果を検証することといった視点も踏まえ、個々が「ビジネス」の価値を理解するエンジニアであろうと意識した。
こうした開発手法について、新田氏は「アジャイルという言い方はしたくない。あくまで型にとらわれることなく、有効と思われる手法を目的に合わせて活用することが大切」と語る。
Javaの資産を活かし、移行が容易な「Scala」は、試す価値あり!
続いて新田氏は、JavaからScalaに移行するにあたってのポイントについて紹介した。静的型付け言語であるScalaは、Javaのライブラリなどをそのまま活用でき、修飾子や演算子なども似ている。簡潔なコード記述や型変換なども明示的、暗黙的にできる。新田氏はコードの例を示し、その簡潔さ、Javaとの類似性などを紹介した。
ただし、意識するべき基本ポイントとして、イミュータブルな値(val)を徹底すること、関数型を意識すること、Javaのライブラリの使用時にはラッパーを使うことなどが必要だという。さらにnullは使わず、Optionを使い、import時のJavaとの違いには注意が必要となる。また、最も留意すべきなのは「implicit」の機能であり、これがJavaエンジニアの第一の障壁になる。その理由として、Javaに比べてIDEが助けてくれないこと、「モナド」を考え出すと急に難易度が上がる、完全に関数型寄りでは簡便性が利点のScalaの価値が下がるなどをあげた。「implicitは、十分なScalaの知識のレベルに達していなければ“黒魔術化”のように何が起こっているかを把握できなくなり、フルでScala機能を使うとメンバーが参加しにくくなるのが難点」と新田氏は指摘する。
それでもこうしたことに留意すれば、経験のないメンバーであってもScalaをすぐに使いこなし、十分プロジェクトを進めることが可能だという。そうしたことを踏まえ、新田氏は過去のコードについて「今見れば直したい」と笑うが、「それ以上にプロジェクトの進め方や仕様確認のほうが重要だった」と振り返る。そして、「ファーストトライとしては上々。しかし、ファーストクラス関数の使いこなし、implicitやモナドが使えるようになることで、Scalaの利用価値も上がる」とし、スキル向上のためにコミュニティ活用や勉強会の有効性について語った。
最後に、新田氏は「エンジニアにとってScalaは『やってみたい』技術のはず。ぜひ挑戦してほしい」と語り、「Scalaを導入する上でJavaに対するメリットを組織に対してしっかりと訴求できることが大切であり、エンジニアとして信頼されていることが重要」と導入についての心構えを語った。
代表的なモナドを使ったコードで紹介、Javaとの違いを提示
続いて登壇した韓氏は、スマートフォン広告配信システム「Dynalyst」立ち上げにあたり、「Scala」を活用してきた。もともと米国サイバーエージェントで業務にあたっていた際に、「Twitterが業務改善にScalaを活用し、その88%を占める」というニュースに触れ、機会があれば使ってみたいと考えていたという。そして実際に「Dynalyst」の開発においても、現在は約9割がScalaを用いており、最近はさらに増える傾向にあるという。
前に登壇した新田氏も指摘するように、Scalaの活用ポイントの1つとして「モナド」が上げられる。「モナド」は値に効果を与え、与えられたものを関数でシーケンシャルに評価していくというのが基本的な考え方だ。
韓氏はモナドについて、「どのクラスでもオブジェクトであるため、コンストラクタがあり、値や関数を渡してインスタンスをつくることができる。もしくは、このクラスのコンテナオブジェクトにアプライというコードを用意しておいて、そこで値があるものに効果を与えることができる」と説明する。つまり、関数をフラクタルに引き継いで行くことができるというわけだ。
韓氏はさらにSimple User DAOについてJavaのサンプルコードを提示。しかし、Javaのドキュメントがない場合、Nullの対応については不明となる。通常こうしたわかりにくいインタフェイスの場合、ドキュメントでこれまでは解決を行なってきたが、モナドを使えば、リターンタイプをわかりやすくすることができる。
韓氏はJavaのコードと、モナドを使ったScalaのコードを見せながら、その違いや価値について語った。例として示されたのは、Nullの可能性がある値に効果を与える「Option」、例外的な処理に効果を与える「Try」、ブロックの処理に効果を与える「Future」、繰り返しに効果を与える「List」の4つ。それによって簡素化され、不明部分をドキュメントで補う必要がなくなった様子を示してみせた。
なお、自分でモナドを作成することもできるが、その際には「モナド則」と呼ばれるルールに従う必要がある。すなわち、左単位元(Left Identity)、右単位元(Right Identity)、結合律(Associativity)の三則であり、これらを証明する必要がある。さらに値を取り出すときにも注意が必要だ。たとえば、NoneやBehaviourから値をとれば例外が飛んでしまう。そこで「Helper Functions」や「Pattern Match」などを使って取り出すことが望ましい。またAkka、Sprayなど3rd Party Libraryのモナドを使うのもよいだろう。
韓氏は最後にモナドの利点として、「コードがきれいになること」「読みやすくなること」「メンテナンスしやすくなること」そして、何より「バグがかなりなくなること」の4点を上げ、最後に「ぜひScalaに興味を持ってもらいたい。そして、そんな仲間と共に仕事をしたい」と語った。