こんにちは、アプリケーションエンジニアの id:skozawa です。
先日、BrandSafe はてなの裏側をリニューアルしました。リニューアルにあたり、アーキテクチャや開発言語を改めて検討しなおし、その結果、新たにPythonを使って開発を行いました。そこで、検討したことや新言語での開発で気を付けたことなどを簡単に振り返りたいと思います。
BrandSafe はてなとは
アドベリフィケーションサービスであるBrandSafe はてなでは、はてなブックマークやはてなキーワードの情報を活用し、URL単位でWebページの解析をします。アダルトサイトや2ちゃんねるまとめといったサイトかどうか判定することで、特定の内容のページには広告を出稿しないようにするためのサービスです。
リニューアルの経緯
現在、長年の開発により蓄積した技術的負債を減らすために、はてなブックマークのリニューアルがScalaで進められています。BrandSafe はてなの仕組みは、はてなブックマークのシステムと密結合していることから、はてなブックマークのリニューアルに伴い、BrandSafe はてなのリニューアルも必要となりました。また、はてなブックマークと密結合していることにより、開発の複雑性が高く機能追加が難しかったり、利用ケースの増加に対するスケールも難しくなっていました。こうした背景もあり、今回BrandSafe はてなの裏側をリニューアルすることになりました。
アーキテクチャの選択
これまでのBrandSafe はてなは、はてなブックマークと密結合していました。これにより一時的な開発速度は上がったものの、複雑性が増してしまっていました。BrandSafe はてなの機能はURLに対して、その内容を判定するというシンプルなもので、仕組みとしては、バッチ処理でURLリストを入力として受け取り、それぞれのURLに対してコンテンツを解析し、アダルトサイトかどうか、2ちゃんねるまとめかどうかなどの分類結果を出力します。そこで、リニューアルでは、はてなブックマークとは疎結合にし、別システムとして作りなおすことにしました。これにより、中長期的には機能開発が容易になり、スケールもしやすくなることが期待できます。
開発言語の選択
リニューアル前のBrandSafe はてなは、はてなブックマークがPerlで書かれていたこともあり、Perlで書かれていましたが、マイクロサービスとして作り直すこともあり、開発言語についても検討をしなおしました。BrandSafe はてなのコア機能は機械学習による判定処理です。そのため、行列演算や機械学習のライブラリが豊富であったり、コミュニティが活発な言語であるPythonが適していると考えられます。はてなのサーバサイドではこれまで、Perl、Scala、Goが主に採用されており、Pythonの採用実績はありませんでしたが、BrandSafe はてなというプロダクトに対する適性と今後の発展性を考慮して、Pythonを利用することにしました。
マイルストーンを置いて切り戻せるように開発する
Pythonを使った開発は社内ではほとんど実績がなく、私自身もプロダクションレベルのコードをPythonで開発するのは初めてでした。そのため、実際に開発してみると、言語の習得が思うように進まなかったり、思わぬ罠にハマるなどで、想定していたより多くの時間がかかってしまう可能性があります。新しいチャンレンジには失敗がつきものですが、失敗に気付けずにずるずると進んでしまうと失敗をより大きくしてしまいます。こうしたことを防ぐため、いつごろまでにこのくらいは完成しているというマイルストーンをあらかじめ置いておき、たどり着けなかった場合にはPythonではなく別の開発に慣れた言語に切り戻すプランを立てておきました。幸い、今回のBrandSafe はてなのリニューアルでは開発が順調に進み、切り戻すことなく無事リリースすることができましたが、リカバリープランを用意することは大事なことだと思います。
Pythonを使ったアプリケーション開発
Pythonでアプリケーション開発をしてみましたが、Perlと同様のLLであることもあり、Perlで身に付いた知識、経験を活かして開発することができるため、大きなギャップもなく開発を進められました。今回、Pythonを採用した最大の理由は機械学習にあります。機械学習を使ったアプリケーション開発では、トライアンドエラーをすばやく繰り返せることが重要になります。その点においては、想定していた通りPythonは優れており、scikit-learnなどのライブラリのAPIの使い方を習得さえすれば、様々な実験をするのが容易になります。現在、BrandSafe はてなのリニューアルに続き、機能の追加開発をしてしますが、Pythonを導入したメリットが十分に発揮できていそうです。
機械学習を使ったアプリケーション開発
BrandSafe はてなのコア機能は機械学習によるコンテンツの判定です。以下の記事にもあるように、機械学習を使ったアプリケーションは、そうでないアプリケーションに比べ、技術的負債になる可能性が高まります。こうした課題に対して、BrandSafe はてなでもいくつか試行錯誤をしている途中です。このあたりの話については、PyConJP 2017にトーク応募しています(宣伝)、採択されて話せるとよいのですが。
Machine Learning: The High Interest Credit Card of Technical Debt
まとめ
BrandSafe はてなの裏側をリニューアルするにあたり、検討したことについて書きました。今回はうまくいきましたが、新しいチャレンジをするときは失敗することも念頭に入れてリカバリープランを持ちつつ開発を進められるとよさそうです。