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

第37回自作の実用ツールをオープンソースで公開

開発や運用作業の効率化、あるいは課題解決のためにちょっとしたプログラムを開発したことがある人は多いでしょう。オープンソースとして公開されている「Tomahawk」も、もともとサーバ構築の手間を軽減するために開発されました。今回は、このTomahawkの開発者であるサイバーエージェントアメーバ事業本部ピグディビジョンエンジニア、生沼一公(おいぬま かずひろ)氏にお話を伺いました。

生沼一公氏
生沼一公氏

負荷テスト用サーバを効率的に構築するために開発

ソースコードを広く一般に公開し、興味のある複数のエンジニアが協力し合いながら開発を進めるオープンソースは、LinuxやApache、MySQLなど優れたソフトウェアを世に送り出したほか、最近ではAndroidやHadoopといった注目度の高いプロダクトを開発しています。サイバーエージェントアメーバ事業本部ピグディビジョンエンジニアの生沼一公氏は、このオープンソースに魅力を感じるエンジニアの一人であり、自ら開発した「Tomahawk」をオープンソースとして公開しました図1、図2⁠。

図1 GitHubで公開されている、生沼氏が開発した「Tomahawk」
図1 GitHubで公開されている、生沼氏が開発した「Tomahawk」
図2 実行中のTomahawkの画面
図2 実行中のTomahawkの画面

Tomahawkは複数のサーバを一括して制御するためのソフトウェアであり、具体的にはローカルで入力したコマンドを複数のリモートサーバで一括して実行したり、あるいはローカルとリモートサーバ間でファイルをコピーしたりするための機能を備えています。

このTomahawkを開発したきっかけは、データベースの負荷試験のための環境作りだったと生沼氏は話します。

「アメーバピグで利用していたデータベースをリプレースするというプロジェクトに携わった際、1秒間に十何万クエリという、その当時のトラフィックに耐えられるかどうかを検証する負荷テストを行うことになりました。ただ、それだけのトラフィックを発生させようとすると数十台のサーバが必要になるんですね。そのサーバを構築するのが私の役目だったのですが、とてもではないですけれど、1台ずつ構築するのは面倒だと(笑⁠⁠。そこで、あるサーバでコマンドを実行したら、それがリモートの複数台のサーバで同時に実行されるようなツールがあれば便利だなと思い、Tomahawkを開発しました」

同様の機能を持つツールがすでにオープンソースで公開されているのは知っていたと言いますが、気になる部分があったので「車輪の再発明」を承知で作りなおしたとのこと。

「既存のツールは、たとえばコマンドを実行したときに、1台のリモートサーバで失敗しても処理を止めず、ほかのリモートサーバでも実行してしまうという仕様で、ちょっと怖かったんですね。そこの部分を変えたかったというのが、自分で開発した理由の1つです。もちろんソースコードが公開されているので、すでに開発されているソフトウェアを改修するという手もあったのですが、技術者としてゼロから作ってみたかったんです。そこが開発にあたっての一番のモチベーションでしたね」

オープンソースのメリットはさまざまな人の協力を得られること

オープンソースとして公開したうえで開発を進めた理由について尋ねると、次のような答えが返ってきました。

「サイバーエージェントに入社する前からそうだったんですが、私はすごくオープンソースに助けられてきたという思いがあるんです。前職ではPerlを使った開発をしていたのですが、Perlではオープンソースのライブラリが集まっているCPANを使えば便利な機能が簡単に利用できるので本当に助かりました。そんな経験もあり、もちろんソースコードに機密情報が含まれているといったケースであれば別ですが、基本的にソースの公開にはメリットしかないという考え方がベースにあり、今回のTomahawkの開発でも特に迷うことなくオープンソースにしました」

オープンソースで開発するメリットとして最も大きいのは、第三者の協力を得られる点でしょう。オープンソースとして公開すれば、バグの報告を受けられるだけでなく、ソースコード上のどこに問題があるのかまで指摘してもらえたり、あるいはバグを修正するためのパッチを提供してもらったりすることも珍しくありません。Tomahawkでもこうした協力を得られたうえ、さらにDebianのパッケージとして配布する作業についてのアドバイスも受けられたと言います。

「いろんな人たちから協力が得られる点は、オープンソースとして公開することの大きなメリットですよね。自分自身でDebianのパッケージを作るのは敷居が高いと感じるのですが、スキルがすごく高い人に手伝ってもらえるのは本当にありがたいと思います」

“ドッグフードを食べる”ことがモチベーション維持の秘訣

当初は負荷テスト用のサーバを構築するために開発されたTomahawkですが、現在は業務も含め、さまざまな用途で活用していると生沼氏は話します。

「自分たちが運用しているアメーバピグのサーバの負荷状態を知りたいときにコマンドを複数台のサーバでいっせいに実行して検証したり、トラブルが疑われるときに状況を調べたりするためにも使っています。あと、複数台のサーバのログを特定のキーワードでgrepして何が起こっているのか調査するといった場面でも便利です」

開発は継続して行われており、2~3ヵ月に1度のペースでメジャーバージョンアップが行われているとのこと。今後の予定としては、対話型のシェル的な機能の追加が検討されているようです。

「現状はリモートサーバからの応答を標準出力に出しているのですが、それだとリモートサーバごとの応答の違いを比較したいといったときに不便なんですね。結局、目視で違いを探さなければならないので。そこでシェル的なしくみを付加して、たとえばリモートサーバからの応答をTomahawkで解析し、ほかのリモートサーバと異なる結果を返したリモートサーバの出力だけを表示するといった制御を実現したいと考えています。また、実行したコマンドを履歴として保存しておき、上下の矢印キーを使って履歴を表示させるようなしくみも考えられるかなと思います」

このように精力的にTomahawkの開発に取り組む生沼氏に、モチベーションを維持しつつプロジェクトを進めていくための秘訣を聞いたところ、⁠ドッグフードを食べる」ことだと話します。

「自分で開発したソフトウェアを自分で使うことを『ドッグフードを食べる』というのですが、それは重要なことだと感じています。自分で使わないようなツールを開発しても、なかなかモチベーションが上がらない。そうするとメンテナンスもおろそかになってしまうと思います。実際に自分で使っていて『ここが使いづらい』と感じれば自分で直しますし、それがプロジェクトの継続にもつながるのではないでしょうか。こうした改善の結果、ソフトウェアの魅力が高まればほかの人にも使ってもらえるようになりますし、そうしてフィードバックを得られるようになれば、それがまた新しいモチベーションにもつながっていくと考えています」

1つの言語を極めることがほかの言語の習得にも有用

サイバーエージェントのピグディビジョンでは、アメーバピグ自体がJavaで開発されていることもあり、開発言語としてはJavaが主流となっていますが、生沼氏自身はコンパイルの不要なスクリプト言語が好きだと話し、Tomahawk自身もPythonで開発していると言います。

「ただスクリプト言語にそれほどこだわっているわけではなく、開発する内容に応じて適材適所で選ぶべきだと考えています。たとえば、多くのエンジニアが参加して大規模に開発するという場合であれば、やはり静的な型付けでコンパイル時にチェックができるJavaが向いていると思いますし、逆にすばやく作りたいといった場合にはスクリプト言語のほうが手軽ですよね。そういった使い分けが重要ではないでしょうか」

JavaやPerl、Python、そしてRubyとさまざまな言語を使うという生沼氏に、新たな言語を習得するうえで重要なことは何かを聞いたところ、⁠まず1つの言語を極めること」だと話します。

「もちろん開発言語によってさまざまな違いはありますが、たいていの機能はどの言語にもあるので、1つの言語をしっかり習得していれば、その経験はほかの言語でも役立つんですね。また、PerlやRuby、Python、PHPといったスクリプト言語は、どの言語にも同じようなライブラリがそろっているので、Perlでこのライブラリを使っていたという経験があれば、Rubyにも同じようなライブラリがあるんじゃないかと考えられます。実際、だいたい似たライブラリがあるわけです。そういう勘を働かせるためには、やはり1つの言語をしっかり学ぶことが大切だと思います」

ちなみに、言語系で最近気になっているのはJavaで書かれたPython実装である「Jython」とのこと図3⁠。

「Pythonが気に入っていることもあり、Jythonの動向もよく見ています。Jythonがよいのは、PythonからJavaのライブラリを呼び出せるところで、たとえば自分が過去に作ったJavaのライブラリを呼び出したり、あるいはオープンソースのライブラリやJava自身のクラスライブラリを使えるのは便利ですね。ちょっとしたツールを作るときに、いちいちJavaで開発するのは面倒くさいけれど、Javaのライブラリは使いたい。そういったときに活用できますよね」

図3 生沼氏が注目しているという、PythonのJava実装である「Jython」のWebサイト
図3 生沼氏が注目しているという、PythonのJava実装である「Jython」のWebサイト

広く深い知識を持つエンジニアを目指して

最後に伺ったのは、目標とするエンジニア像です。これについて生沼氏から出てきたキーワードは「広く深く」でした。

「広くやっているんだけど、深く理解しているっていうエンジニアが目標です。たとえば新しい技術を使うにしても、単に使えるというだけでなく、どういうしくみでそれが動いているかまでをちゃんと理解したうえで使いたい。そうでないと、たとえば新しいミドルウェアを使う場合でも、何かトラブルが起こったときにどうすればよいのかわからなくなってしまいます。ですので、いろいろなミドルウェアを知っていて、なおかつ一つ一つ深掘りしていきたいと考えています」

こうした目標に向かって、生沼氏は日々努力を重ねています。

「たとえば言語を習得する場合だと、まずわかりやすい解説書を買ってきて、一通り基本や文法を理解したら、自分でプログラムを書いてみます。そのうえで、さらにいくつかの書籍を読んで勉強します。1言語で最低でも5冊ぐらいは読んでいるでしょうか。特に評価の高いバイブル的な本は必ず読むようにしています。また最新のトピックを押さえるために、たとえばはてなブックマークで、知りたい言語のタグが付いているエントリーをRSSで取得して追っかけるといったこともやっています。基本を学びつつ、新しいトピックもチェックするというイメージですね」

エンジニアとしてスキルを高めていくうえで、言語に限らず技術を学び続けることは極めて重要でしょう。その方法として、生沼氏の姿勢は大いに参考になるのではないでしょうか。

サイバーエージェント公式エンジニアブログ
URL:http://ameblo.jp/principia-ca
エンジニアの生の声をお届け中!

おすすめ記事

記事・ニュース一覧