エンジニアの田中(の)です。
2018年7月21日〜24日に行われた ICFP Programming Contest 2018 に、RCOアドテク部有志で合宿して参加しました。 昨年 に続いての参加です。
参加者を募ったところ、競技プログラミングのレッドコーダー・Kaggle master・リクルートグループ社内ISUCONの優勝チーム など、 15名 という多くの強力なメンバーが集まりました。これだけの人数でどのように合宿を進めていったのか、お伝えします。
コンテストに限らず、
という状況(急遽デモ用アプリを作らないといけなくなった、とかでしょうか)で役に立つ知見かもしれません。
柴又ふーてんベッドアンドローカル を利用しました。
合宿場を選ぶときに重視したのは以下の項目です。
コンパクトにまとまった施設で、ひたすら開発できれば良いという目的には大変使いやすかったです。作業部屋と宿泊部屋が近いのはかなり快適でした。
食事は自前で用意する必要はありましたが、かえって食べたいものや時間の融通が効いてよかったように感じます。食事の準備や後片付けを自分たちでやるのも、”合宿”感が増して楽しかったです。
共有すべき情報は Google Spreadsheet に集約しました。
というあたりが決め手です。タブが増えすぎてしまうのがもう少しなんとかなれば、という感じですね。
課題として、やりたいことを整理しておくことの重要性を感じました。 この人数になると、 相当な意思を持ってタスクの交通整理 をしないと、いくら同じ部屋で集まっているといっても何をやるとよいかわからない状態の人が出てきてしまったり、複数人が似たようなことをやってしまったりということになりがちです。
やりたいことを列挙しておき、手が空いた人が優先度が高いものから手を付けていくようなフローが流せると理想的です。
今回のコンテストの問題は、3Dプリンタをモチーフにしたものでした。「3D空間の中で複数台のbotを動かしながら、指定されたオブジェクトを構築する、または破壊する、またはある形から他の形に再構築する」という課題です。
構築・破壊・再構築と3種類の問題があるので、手分けして解答を作りました。また、小さいサイズの問題は手作業で解くことも可能で、人数を活かして人力で最適化しまくりました。
構築ソルバーについて、複数台で協調してオブジェクトを構築する動きがなかなか面白いので動画をご覧ください。botが互いに干渉したり内側に閉じ込められたりしないように賢く制御する必要があり、苦労していたようです。
ソルバーの多くはC++で書かれました。特に示し合わせて決めたものではなく、どの言語を使うかは各自の自由に任せていたのですが、アルゴリズムの実装に慣れている言語でそれなりにパフォーマンスが出るもの、となると自然とこうなりました。
今回の問題は、問題の種類ごとにソルバーをそれぞれ独立したプログラムとして作れるものでした。こういう場合、 共通で使う処理をライブラリとして整備したい 気持ちにもなります。
これまでの個人的な経験では、3日間という短いコンテスト期間では共通化しようとしても結局各自が使いやすいように自分用にコードをコピーして使うことになり、あまり共通化の意義を得られないと感じていました。
というわけで、今回は共通化はせずに完全に独立してプログラムを作ることにしました。ですが、コンテスト後に他のチームの方々に話を聞いたところ、 適切に部品を共通化することで生産性が上がった という声も多く、うまく処理を切り分けられれば有効な戦略なのかなあと思いました。
この点は今後もっといろいろ試したいところです。
効率よく開発を進めるには、問題に解答するアルゴリズムを実装するだけではなく、自分たちでそのコードを実行してスコアを計算したり、実行結果を保持しておいて最後に提出するときに集めてきたり、といった インフラを構築 する必要があります。
昨年から引き続きインフラ周りを担ってくれたメンバーの手によって、安定した環境が構築されました。その一端をお見せします。
問題の一覧をわかりやすく表示したり
チーム内で競えるよう、自分たちの解答をランキングしたり
公式のビジュアライザを魔改造して機能を追加したり
これらのおかげで、ソルバー班は実行・提出周りのことをあまり気にすることなく、アルゴリズムだけを考えておける状態になり、非常に助かりました。
カレーを作りました。おいしかったです。
結果は、187チーム中Lightning部門15位・Full部門21位でした。
ただし、問題3種類のうちの「破壊」ケースだけを抽出すると 全チーム中1位 になっており、上位に入れる力が十分あることはわかりました。また次回では入賞目指して頑張りたいと思います。
RCO アドテク部では、協力して難しい問題に取り組むのが好きなエンジニア、あるいはカレーを作るのが好きなエンジニアを募集しています。