社内ISUCONノウハウ 大公開

普段は[SkyWay](https://skyway.io/)の開発・運用をしている[@iwashi86](https://twitter.com/iwashi86)です。2015/7/15(金)に、[@renjikari](https://twitter.com/renjikari)と協力して、NTTコミュニケーションズの1つの部署にて社内ISUCONを開催いたしました。

本記事では、社内ISUCONを開催するにあたり考えた内容・取り組んだ内容・その結果などを紹介します。
自社でISUCONを開催したい場合などに、本記事の内容が参考になるかと思います。

## 開催に向けた目的

大きく以下の2点を目的としました。

1. エンジニアの技術力向上
2. エンジニアのモチベーション向上

本目的達成に向けて、弊社は通信事業者であることから、開催方針や準備事項に多少の工夫を加えています。

## 開催方針

ISUCONは、主にWeb系のインフラエンジニア・アプリケーションエンジニアの間で知名度が高いと思いますが、弊社には様々な領域での業務があり、Web系以外のエンジニア(例:ネットワークエンジニア、クラウドエンジニア)も多く在籍しています。また、Webおよびエンタープライズという業務領域をとってみても、エンタープライズを主軸にするエンジニアも多いです。

そのため、社内ISUCONを開催したとしても、世の中で複数開催されている社内ISUCONほどの効果があるのか、未知数でした。そこで、以下の方針で進めることにしました：

「**最小限の労力**で、まずは開催してみる。
　その後に、目的達成していたかどうかを振り返り、次回以降を検討する。」

上記のように、一種のリーンスタートアップサイクル(Build/Measure/Learn)のような形で進めることにしました。

## 結果どうだったか？

先に結論から述べますと、当初に挙げた目的は達成できたと考えています。
その理由として、参加者から以下のような声が挙がった点があります：

>    - 「楽しめただけはなく、高速化や最新のWeb技術について新しい知識を得ることが出来た」
>    - 「自分の技術力の無さを思い知り、もっと勉強せねばという気にさせてくれた。」
>    - 「事前勉強会含め、ISUCON入門する機会が作れて良かった」

技術力・モチベーションの両方の観点からコメントが出ており、狙い通りの結果となりました。

また、エンジニア種別の観点から振り返ってみても、参加者の多くはWeb系のエンジニアが多かったものの、ネットワークエンジニア・クラウドエンジニアなど、多様なエンジニアが参加しており、上記のようなポジティブなコメントが挙がっていました。開催方針のセクションにて `効果があるのか、未知数` と記載しましたが、結果的には「一定の効果があった」と考えています。

## 開催に向けて準備したこと

社内ISUCON開催に向けて、準備すべきことは多岐に渡りますが、今回の開催で特に重要だったところをピックアップして紹介いたします。

### 出題問題について

今回は、最小限の労力で開催する、といった方針から過去問を利用することにしました。過去問には

1. [ISUCON公式](https://github.com/isucon)
2. [pixiv社内ISUCON](https://github.com/catatsuy/private-isu)

がありますが、今回は[2]のピクシブ社の問題を利用させていただくことにしました。出題レベルも丁度良く、また構築用のAnsibleも提供されていたことが選択理由です。（ピクシブ様、どうもありがとうございました！）

### 独自に手を加えたこと

過去問を利用すると決めたものの、一部の内容を修正して利用しています。以下に主な修正点を2点まとめます。

#### [1] Cloud<sup>n</sup> への変更

オリジナルのリポジトリでは、AMIベースで提供されておりましたが、弊社では自社で複数の[クラウドサービス](http://www.ntt.com/business/services/cloud.html)を提供しており、その中でも[Cloud<sup>n</sup>](http://www.ntt.com/business/services/cloud/iaas/cloudn.html)を利用することにしました。(注釈：Cloud<sup>n</sup>は、ネットワーク転送量による課金がないので、どれだけトラフィックを流しても定額です！)

#### [2] ポータルサイトの独自開発

オリジナルのリポジトリでは、ポータル用のソースコードも提供されておりましたが、そのまま動作させるにはいくつか課題があり、解決に時間がかかりそうだったので、スコア掲載用のポータルに特化してスクラッチで開発することにしました。
今回の問題はピクシブ社のものを利用するので、ポータルについてもデザインは似せる方針で開発しました。(参考：[ISUCON6出題チームが社内ISUCONを開催！AMIも公開！！](http://inside.pixiv.net/entry/2016/05/18/115206))

結果的に出来たものは以下のようなサイトです。

![image](https://qiita-image-store.s3.amazonaws.com/0/29987/91287b3e-acbe-ec38-3a18-04d6ea92bfff.png)

こちらも最小限の労力で開催したいという方針から、ポータル用のインスタンスは独自で構築せず、[Firebase](https://firebase.google.com/)をデータストアとして利用し、インスタンスは構築しない方向で進めました。

ベンチマーク実行から描画までの処理フローはこんな感じです：

![image](https://qiita-image-store.s3.amazonaws.com/0/29987/e0f1aae6-1e59-95a4-e2d3-9be9647d4ebf.png)

Firebaseの機能により、ほぼリアルタイムにスコアが更新できています。

なお、ポータルサイトからのベンチマーク実行（および管理キュー）については、今回は実装しておらず、競技者インスタンスから専用のコマンドを利用すると、ベンチマークが実行されるような形式にしています。

##### おまけ

ここまで読んでいただいた方向けのおまけですが、上記のポータルを[GitHub](https://github.com/iwashi/private-isu-portal/)で公開しております。
Firebaseのプロジェクトを作成いただいて、`XXXX.firebaseio.com` のXXXXの部分を差し替えていただければ、そのまま動作するようになっています。

ベンチマーク実行後に、以下のJSONを `https://XXXX.firebaseio.com/teams/:チーム名.json` にPOSTするように、ベンチマークコマンドに処理を追加してください。(curlやhttpieなどのお好きなクライアントで、投げれば問題ないです)

```JSON:HTTPでPostするときのJSONフォーマット
{  
  "pass":true,
  "score":18000,
  "success":1434,
  "fail":0,
  "messages":[],
  "timestamp":{  
    ".sv":"timestamp"
  }
}
```

その他の詳細は、GitHub側のREADME.mdを参照ください。

## 次回に向けた改善点

小規模ではありますが、実際に開催したことにより、いくつかの改善点も出てきています。その中から4つ紹介いたします。

### チームではなく個人で参加も許容する

今回は、個人エントリした場合は、同じく個人エントリした他のメンバとランダムでチームを組む、というルールにしていました。ただし、「知らないメンバと組むのはちょっと不安」という声も挙がっています。もちろん、社内ISUCONはチームを組んで競うといった競技面の楽しさもありますが、今回のISUCONの大目的の1つはスキルアップなので、次回以降は個人参加(非チーム)の許容も検討したいと考えています。

### エンジニアの偏りを減らす

今回は様々なエンジニアが参加していましたが、やはりWeb系に近いエンジニアの参加率が最も高かったです。次回はWeb系以外のエンジニアの参加率も高めたいと考えています。ISUCONでは、データベースようなミドルウェアのチューニングも必要であり、Web系以外のエンジニアも戦える部分が多くあります。(そして、このスキルは多くのエンジニアにとって必要な共通のスキルです)

社内において、ISCUON自体の認知度も非常に高いわけではないので、ISUCONの事前勉強会[^1]などを通じて、ISUCONを広めエンジニアの偏りを減らして多くのメンバのスキルアップ・モチベーションアップに貢献できれば、と考えています。

[^1]: 本記事には含めていませんが、今回もパフォーマンスチューニングの概要を説明する事前勉強会を実施しています

### 競技で利用する部屋を分散する・広くする / リモート参加も許容する

距離が近いと、他チームの声が聞こえてしまうため、気になる参加者もいるようです。次回以降は、広い部屋を利用する・部屋を分散する・リモートでの参加を可能にする、などの案を検討したいと考えています。

### 出題問題・ベンチマーカを自作する

出題問題やベンチマーカの作成は、運営側のスキルアップに非常に役立ちます。もちろん、作成するためには多くのリソースが必要になるため、運営側のリソース面の課題もありますが、次回以降は自作についても考慮したいと考えています。

## 最後に

今回は「社内ISUCONを開催しよう！」と決意してから、企画検討・各種調整などの全ての工程を含めて、約1ヶ月の短い期間で開催することができました。本記事で述べたように、非常に良い結果が得られており、改善点で挙がった項目を改善しつつ、次回も開催したいと考えています。