概要

問題

  • 仮想椅子取引所「ISUCOIN」
  • 鯖4台、ベンチマークのアクセスが来るのは1台
  • 外部APIを叩く仕組みが付いてる

記録

  • 役割分担
    • 私: アプリケーション
    • hikalium: インフラ
    • megumish: その他
  • 10:00
    • 開始 700点
    • ふたりにDockerをはがしてもらう
    • その間に問題やコードを読む
      • IsuBank, IsuLoggerは用意が手間そうなのでどう考えても効いてくる
      • share button, bcryptあたりもどこかで効きそう
      • N+1問題がある
      • setting tableはがすとよさそう
  • 12:00
    • DBをDockerからはがしてもらってたのが終了
    • DBのschemaを修正するスクリプトを書く。ここで運良くpartitionが消える (運が良いので)
    • まだアプリケーションに触れないので軽い修正だけ書いて準備しておく
      • LIMIT 1
      • settings tableをはがす (ここで /initialize まわりのバグを埋める)
  • 13:00
    • アプリケーションをDockerからはがしてもらってたのが終了
    • ここで私がコードに触りだす
    • 貯めていたのを反映させる 2400点
    • bulk送信の修正をまかせる (SQL書かなくていいので簡単かつ送信エラーが出るようになるまでに完成すればよいと判断したため)
  • 15:00
    • 2時間かけてローソク足のcacheが終了 4400点 (cache情報をtableに乗せ INSERT 時に丁寧に修正するもの)
    • そろそろとりあえずshare button試すかと思って試す 5300点
      • 常に True だとエラー多発でfailしたので最後に調整することにしてとりあえず1割に (結局時間がなくて調整を忘れる)
    • /initialize まわりのバグが判明。「bulk送信を書くときにどうせほぼ同じことやるしそれが書けたら自然に修正されるのでついで頼む」と押し付ける
  • 15:40
    • /orders あたりのN+1問題を半分修正
  • 16:00
    • (このあたりで静的ファイル配信を頼んでいたのが終了した報告はあったはずなんだけどcommitが最後までmergeされてない)
    • ローソク足のcacheの初期データを /initialize で計算してたのがけっこう遅いので快適さのために改善 (やらなくてよい)
  • 16:30
    • load barancingを頼んでいたのが終了 6000点ぐらい
  • 17:30
    • N+1問題をバグらせ続けてるので諦め (ボトルネックだと判断していたため粘っていた)
    • setting tableに埋めてたバグをrevert
    • revertしたままだと遅いので緩和策を投げ込む
    • ログ出力を消すとかの最終処理をしてもらう (でも実はちゃんと消えてなかったことが復習してたら判明)
  • 17:50
    • システムをちゃんと確認してなかったのでガチャを回す (やらなくてよい)

反省

  • 単純に実装が遅い
  • Dockerをはがしてもらう間かなり遊んでしまっていた
  • /initialize まわりでバグを埋め、その状態のまま慣れてない人間にコードを引き継いだ
  • 私が担当していたN+1問題はバグる割に潰してもほぼ変わらないかむしろ遅くなるものだった
  • 他人に投げ付けたbulk送信はやるだけなのに点数は2倍くらいになる
  • 最終スコアの欄を読み落としており予選と同様のシステムだと誤解していた
  • 仕様書を読み落としておりbanが可能だと気付いていなかった

感想

  • オープニングのスライドが好き。ストーリーがあると復習する際もやりやすいので公式サイトに置いておいてほしい
  • 予選は最低限のボトルネック発見力だけ問われている印象だったが、本戦はひたすら実装力だけ求められていたように感じた
    • 教養のある競プロer * 3 (内1人インフラ兼務) ぐらいでもいい気がしたしTokyoWesternsのあのメンバーが優勝するのは自然に思える
  • 予選と違ってメンバーと物理で会ってやれるので楽
  • 会場に高校時代の友人が来ていて驚いた。「田舎のおばあちゃんがいつのまにか可換環論の本をまじめに読んでいた」みたいな種類の驚き
  • 楽しかったのでもし可能なら来年も行きたい

復習

本番中に気付いてた範囲をとりあえずやった:

  • share buttonをとりあえず常に True にしてみたら 14000点
    • load barancingした分で4倍速になってfailしなかったということぽい
  • unix domain socketやられてなかったのでやる 12600点
    • 下がった原因は不明
  • 静的ファイル配信 18000点
  • IsLoggerのbulk送信書く 32500点

今の数倍ぐらい手が速ければ入賞も狙えてたということぽい。 本番中に気付いてもなかった範囲は復習するのを放置しすぎて復習用portalが閉じてたので試せず。 来年に向けて、今はとりあえずRDBの内部の技術の本を買って読んでいる。