実力を出し切るチーム作り a.k.a. ISUCON7参加記録
はじめに
ISUCON7 チームhetenkoの@anoworlです。@kodam(ISUCON7に参加しました - おっぱい)および@hentekoと参加しました。
このチームでISUCONに参加するのはこれで3回目なのですが、3回目にして個人的には実力を出し切れたと言えるようになり、また実力不足で敗退したと胸を張って言えるようになりました。意外とこれが難しく、1回目や2回目では達成できなかったので、知見を共有するためにこのブログを記しました。
またタイトルはこんなんですが別に自分はチームを作っておらず、3人が力を合わせたことで実力を出し切ることができたと思っています。
実力を出し切るとは
仮に実力が発揮できなかったとしたら、それはどんな状況を指すでしょうか。例えば以下が挙げられると思います。
- 競技開始後に方針を決める所から始まり、実作業に移るまでロスがある
- 思いつきで改善し、点数の上下に一喜一憂する
- 単独の作業に徹し、複数人で参加する意味が無い
- 不具合を発生させてしまった際に原因を特定できず、過大なロールバックが発生する
- レギュレーションの読み間違いで、意味の無い部分にコミットする
- 取り戻せない失態を犯し、不戦敗となる
- 提出間際まで改修を加え、動いているか分からない状態で提出する
- 再起動試験に失敗する
では、そのために何が出来るでしょうか。
- 方針を事前に決め認識を合わせ、当日はその通りに行動する
- 計測を行い確信を持って改善し、着実に点数を伸ばす
- 複数人でレビューを行ったり知恵を出し合うことで、単独で起こすミスを防いだり一人では思いつかない方法を取り入れる
- バージョン管理システムで管理すると共に、各時点のログや点数を記録しておき、任意の時点にロールバック出来るようにする
- レギュレーションを最初に確認し、余計な手戻りや勘違いを防ぐ
- 不戦敗となってしまう部分には殊更気をつけ、そもそも起こらないフローを確立する
- 提出前にやることリストを作り予めスケジュールに時間を確保する
- 余裕を持って再起動試験を行う
今回特によくやったと思えた、1と2について説明します。
実力を出し切るためのいくつかの方法
1. 方針を事前に決め認識を合わせ、当日はその通りに行動する
私はISUCONに参加するのはこれで4回目ですが、未だに時間が限られたコンテストとなるとイキってしまい、視野が狭まったりしてしまい普段できていることができなくなります。
その対応策として有効なのは、興奮していないコンテスト前に冷静な頭で何をどのようにやるか決めておくことです。今回はへんてこさんがホワイトボードにいい感じにまとめてくれたので、コンテスト中にイキってもそれを見てその通りに行動することで、空回りしたり見落としをしてしまうことが防げました。
2. 計測を行い確信を持って改善し、着実に点数を伸ばす
これまでのコンテストで悔しかったのは、思いつきで改善したけど効果が上がらず、無駄に時間を浪費していたことです。例えば思いつきでインデックスを張ったが、特に速くならないし場合によっては遅くなったみたいなことが、過去にはありました。
その対応策として有効なのは、計測を行ってどこがボトルネックになっているのか特定し、その部分に対して改善を行うことです。今回は以下のツールを使って計測を行いました。
- netdata
- kataribe
- rack-lineprof
- pt-query-digest
またこの方針で行動して良かったのは、議論が発散した時に誰かが「計測しよう」と言うことで、その時点で空中戦が終わり計測という具体的なプロセスに入れることです。
「思いつきで改善すると点数が上がる(かもしれない)」という射幸心を煽る状況に加え、長時間の疲労で人間はまともな思考が出来なくなるので、投げかけて貰えることで一旦場が整う一言があったのは強かったと思います。
おわりに
今回は残念ながら予選敗退となってしまいました。しかし突破された方のブログなどを見て、自分たちの方向性は間違っていなかったと強く確信することが出来ました。課題も明確になったので来年は実力をつけ、笑顔で優勝したいと思います。