オープンソースで商用クラウドサービスを作るためのチームビルディング。NTTコミュニケーションズ(後編)
2月14日、15日に都内で開催されたイベント「Developers Summit 2013」、通称デブサミ。2日目に行われたセッション「OSSで作る!クラウドサービス開発戦記」では、NTTコミュニケーションズの川口克則氏が、オープンソースを基盤としたサービス開発の苦労や解決のための試行錯誤について講演を行いました。
(本記事は「オープンソースで商用クラウドサービスを作るためのチームビルディング。NTTコミュニケーションズ(前編)」の続きです)
第2章:トラブルの教訓、属人化をどう解決するか
第2章は2012年春から秋くらい。開発チームも、会社として投資しましょうということで少しずつ増えていきます。

この時期にやったことは大きく4つで、upstreamがどんどんアップデートされていったので、それにあわせてアップデートするのと、顧客をPaaSへ乗せていくためのサポート。バグフィックスや機能追加と、必要に応じてそれをプルリクエストしていったり。
それから開発がどんどん陳腐化していくので、新しいやり方に適応していく、とかです。
それぞれを説明していきます。
upstreamへの追随ですが、風の噂によると本家cloudfoundry.comも1週間か2週間で数百VMあるPaaSをアップデートしているらしいので、我々もそうしたいねと思っていました。でもここでトラブルが。

最新のupstreamを取り込んでHello Worldは動いたのですが、数時間たつとMySQLのデータベースが消えてしまいます。
内部で不要なデータベースインスタンスを消すのをやっているのですが、ソースコードを見るとつねに全部選択していて、それは全部消えるだろうと。
OSSとかCIで回しているので大丈夫だと思っても、それでちゃんと動くとは限らない、ということが身にしみてきました。
対策としては3つ。ステージング環境で様子を見る。今回だと数時間たって回収処理が動いたときに死ぬという、なかなかテストでは拾えない問題だったので、ステージング環境でしばらく様子を見ましょうと。
それから当たり前ですが、ちゃんとコードを読みましょうと。upstreamが速いとつらいですが、ちゃんとコードを読んで何が変わったか理解してから使わないと問題が起きますよと。
そして問題が起きたらテストを書いて、2回目は起こさないようにしようと。

顧客へのPaaSの導入サポートでは、顧客のアプリがPaaSで動かないこともあります。
その場合は選択肢が2つに分かれていて、PaaS側で対策するか、アプリ側で対策するか。PaaSを直すと、それをOSSにするか、しないかも分かれます。
ある顧客ではmemcachedが必要だったのですが、当時のCloud Foundryはサポートしていなかったので、実装してみました。これはみんな必要だよね、ということでCloud Foundry本家に投げました。
一方、JavaのWebアプリケーションサーバでResinというのがあります。これをサポートする必要があって、Cloud Foundryに乗せました。でもこれは現状OSSとして公開されていません。それは、そもそもそんなに需要があるかというか、これをやるにはいくつかのライブラリに変更が必要なのですが、それを英語で説得するのが大変だったりするので。
開発が分かってくると、Core Compatibleを守りつつ国内のお客様の要望に応えられるというのが、このサービスの価値なんだなというのがチームで分かってきました。そしてOSSもやる気次第でできる、というのも分かってきました。
ただ、問題も出てきました。
例えばPaaSのテストは、特にシナリオテストでランタイムとアプリの組み合わせが爆発したり、属人化してきて誰々さんじゃないとできないとか、チームで決まったことでもやる人が決まっていて全然チームで動けていないとか。それから振り返りがマンネリ化するとか。

テストの時間がかかる問題は、JenkinsのSlaveを使って並列実行しています。ここで大活躍するのが、自社でIaaSを持っているのでそのリソースを最大限使うことです。

属人化の対策は、毎週必ずペアで作業するようにして、やった内容を1チーム5分でライトニングトークして、その内容をWikiに書いて共有するとか。

それからコードレビューの強化ではGithubのpull requestを使う体制に移行して、必ずオーサー以外がマージするようにしました。

IRCも、飽きないように強化しました。デプロイが始まるとJenkinsが顔文字で知らせるとか。MinchanというRedmineのチケット操作と連動するとか。なぜかこういうものの開発が一番速いです(笑)

振り返りにも飽きてきたので、やり方を変わてKPT以外のことを試したり、金曜日は定時退社日で何が何でも定時に帰らなくてはならないので、どうせなら振り返りをやって定時に帰るとか。そういうのをやりました。

第3章:成果の出たやり方を組織に広げていく
2012年12月におかげさまで商用サービスを開始できました。リリース目標もきっちり守れて成果が出たと。第3章では、それを組織に広げようとしています。

いまやっているのは、隣のプロジェクトと連携したり、隣の人に火をつけると。
これがいまはそんなにうまく行ってないです。
私たちの組織はどうなっているかというと、開発運用をする部隊があって、マーケやPMOなどがありますが、今日の話は全部ここ(PaaSの開発)なんです。

なかなかここからは広がらなくて、なんで広がらないかというと前提が違うし、目標も、リリース規模も内容も、そもそもビルが違うし、ツールはSVNを使ってたりと違う。
でもツイッターで愚痴ってるくらいなら、それより何かしなくちゃいけなくて。
でもやるんだよと。
生き残るためとか、仕事を楽しくするためとか、NTTコムって通信の会社だよねっていわれていてはまずいとか。

で、始めたのが社内勉強会です。昨年末で第五回になって、githubの使い方とか、テストの書き方とか、隣のチームとランチミーティングしたり、よその部署とつながる怪しいIRCのチャンネルを作るんですが誰もいないとか。
何も成果が出ていないわけではなくて、隣のプロジェクトの人と仲良くなったりと、少しずつ前進しています。

まとめると、ここで発表した中にオリジナルなことはないと思っていて、いろんな本やコミュニティでお薦めされた内容をまず試してみて、やってみないと始まらなくて、やってみたらなんとかなった。というのが感想です。
いいな、と思うことがあったらやってみるといいんじゃないかと思います。それからもっとよい方法があれば教えてください。スクラムが部分適用になっててよくないねと、そういうところがあれば教えてください。

公開されたスライド「OSSで作る!クラウドサービス開発戦記」
川口氏本人によるセッションの振り返り「DevSumi2013で発表した。」。
あわせて読みたい
クラウド上でデータウェアハウスを構築するAmazon Redshiftが公開。あらゆるデータ処理をクラウドへと誘う戦略
≪前の記事
オープンソースで商用クラウドサービスを作るためのチームビルディング。NTTコミュニケーションズ(前編)