チーム戦の環境構築

この記事は Competitive Programming Advent Calendar 2014 の 12 月 23 日の記事として書かれました.

チーム戦の環境構築

最近,ICFPC や ISUCON などのチームでの開発が重要となるコンテストに参加しており,チーム戦に必要な知見がたまりつつあるあるので紹介します.この記事が対象とするのは 1 日から数日程度の期間でのチーム開発が必要となるコンテストです.

このような期間のコンテストは,数時間のコンテストと比較しコードの可読性や安定性が重要となりますが,業務プログラミングとは異なり長期のメンテナンス性が不要です.多くの場合,ユニットテストを書く必要はなく,簡単なインテグレーションテスト(全体を通してのテスト)があると開発がスムーズにすすみます.

この記事では Unagi がどのような方法でコンテスト中に開発を行っているのかを実際に用いているツールを紹介しつつ説明します.

コミュニケーションツール

チーム開発は基本的に実際に会って話し合いながら行うものですが,それでもテキストベースでコミュニケーションを取る必要(例えばコマンドの使い方を教えたり,エラーログを送ったりなど)があることがよくあります.そこでいくつかのオンラインツールを用いています.

  • ドキュメント共有 (Google Docs) … 問題の内容やメモをまとめる場所として非常に便利です.皆で同時にドキュメントを編集することができるので,コンテスト開始直後など多岐にわたる情報をまとめる必要があるときにでも同時に編集することができます.ランディングページを用意しそこにリンク集や問題の概要を用意しておくと,悩んだ時に他のチームメイトに聞く必要がなくなりコミュニケーションの効率が良くなります(例:ICFPC 2014).また,例からは除去していますが,コンテストページのパスワード等の情報も同時に載せておくと,自分自身も含め探す手間が省け非常に便利です.
  • チャットツール (Skype) … コンテスト中ではまとめる必要もない情報(エラーログや URL 等)を貼り付けるのに便利です.また,コンテストの前後のコミュニケーションにも非常に便利です.
  • メーリングリスト (Google Groups) … コンテストの運営に伝えるアドレスをメーリングリストのアドレスにしておくと,チーム内でメールを転送して共有する必要がなく便利です.

ファイル共有ツール

チーム開発を行う上で入出力データやソースコードをやりとりする必要が生まれます.その時に便利なのが Dropbox と Github です.

  • ファイル共有 (Dropbox) … コンテスト開始前に予め共有するフォルダを指定しておきます.ファイルを共有するのに用いるのはもちろんのこと,基本的にコーディングは Dropbox の中で行います.他のチームメイトのコードをいつでも参照でき,ファイルのやりとりにかかる手間を省くことができます.これにより,コンテスト終了間際などでも落ち着いて作業が可能となります.
  • ソースコード共有 (Github) … 主に最終的なコードの提出に用います.定期的に提出に用いそうなソースコードやツールを置いておくことにより,Dropbox と比べ削除や上書き等によるデータ消失のリスクを抑えることができます.

開発環境

チームで集まるとそれぞれが持ち寄るコンピュータの OS(Mac OSX, Ubuntu, Windows, ...)やコンパイラのバージョンがばらばらになり,手持ちのコンピュータで開発をすると移植性がなくなることがよくあります.そこで,すべての開発は Amazon EC2 の上で行うことにより環境の統一しています.仮に移植性のないコードを書いたとしても,対象とするようなコンテストでは結果さえ出れば良いので無視できます.予め開発に用いる可能性のある言語のコンパイラ等をインストールしておいた開発用サーバのイメージを作成しておき,コンテスト中はそれを使いまわします.

開発に用いるサーバは,ICFPC の場合,出来る限り良いスペックのものを共有して使っています(32 CPU 244GB メモリ等).コンパイル時間が短くなり,実行時間も短くなるため,開発のサイクルを高速化することができます.一方,ISUCON ではスペックが指定されているため,各メンバーに異なるインスタンスを与え,互いに干渉しないようにしました.

また,開発用サーバに加え Dropbox 用サーバを用意しています.Dropbox の共有は各インスタンスで行うと管理が大変になる(Dropbox の共有が詰まったりすることが稀にある)ので,Dropbox との同期は特定の 1 台のみが行い,他のインスタンスは SSHFS を用いて /dropbox ディレクトリに共有フォルダをマウントします.Dropbox を用いると,ローカルでソースコードを保存してから多くの場合数秒程度で同期が完了するので,各自手元の開発環境でソースコードを編集し,サーバ上でコンパイル・実行を行います(参考:Docker を用いた Dropbox の環境インストール).

Amazon AWS の Tips

  • Elastic IP Address … あらかじめ固定 IP を用意しておき,それぞれに短いドメインを設定しておきます(例:jp01.sx9.jp).これにより生 IP アドレスを直接扱うのに比べ管理がしやすくなります.
  • スポットインスタンス … スポットインスタンスは通常インスタンスと比べ,突然インスタンスが停止させられるリスクはあるものの,数分の 1 の価格でコンピュータリソースを利用することができます.これによりほぼ同じコストで数倍の計算リソースが得られます.過去の価格をリージョン単位だけではなくゾーンレベルで確認し,開発インスタンスは通常インスタンスの 3 倍程度の金額で,実行インスタンスは 1 倍から数倍程度のランダムな金額で申請します.このようにして突然の停止を防ぎつつ多くのリソースを利用することが可能となります.(突然の停止に備えて,保存しなければならない情報は基本的に Dropbox 上に置いておくのが理想です.インスタンスの作り直し等も考え,チームメイトにはインスタンス直下にデータを置かないように注意を喚起しています.)
図 1: スポットインスタンスの価格変動
この変動の場合は黄色のゾーンに重点的にインスタンスを配置します
(複数のゾーンにまたがって配置することにより全部が同時に停止するリスクを下げることもできます)

プログラム間通信

チーム Unagi では,各人の最高のパフォーマンスを得るため,それぞれ好きなプログラミング言語で開発を行っています.そこで重要となるのが(異なる言語間での)プログラム間通信です.

業務での開発では何かしらの RPC を用いることが標準的ですが,Unagi のチームメンバーは全員競技プログラミング出身であることもあり,競技プログラミングでよく使われているような入出力フォーマットを用います(例:ICFPC 2013 入出力仕様).

この標準入出力を用いる手法は,コマンドを SSH コマンド経由で実行することにより,仕様を変更せずに多くのコンピュータリソースを用いて並列計算させることもできます.ICFPC 2013 ではサーバー同士を SSH でつなぎ,クラスターを形成しました.
図: ICFPC 2013 で用いたサーバのトポロジー
(ICFPC 2014 や ISUCON では SVN Server が Dropbox サーバに置き換えられています)

まとめ

色々なツールを紹介しましたが,最も効率に寄与しているツールが Dropbox です.Dropbox のおかげで,遠くにあるはずのサーバがまるで手元にあるかのように扱え,開発効率が上げられています.この記事を参考にしてチーム戦のコンテストに参加していただけるとうれしいです.