ISUCON11予選に失格してきた

先日開催されたISUCON11の予選に参加してきたよ

結果

気になる結果は・・・

大会結果

チームメンバー

takahiroは去年のisuconに初出場で本戦出場(学生枠)したすごい人。今年新卒入社した同期エンジニア3人でtakahiroに誘われる形でISUCON出場することに。

事前準備

1ヶ月前

大会1ヶ月くらい前に一回、会社の同期5人でゆるーく勉強会をする。経験者になんとなく教えてもらったりしながらISUCONとはなにかみたいな話をしてた。

  • alpとは何なのか教わった
  • サーバー3台与えられるよーとか、SSHしやすいように準備しようねーとかISUCONの基本的なことを教わった

1週間前

同じように勉強会を開催。

  • alpの入れ方
  • nginxやmysqなどのミドルウェアの設定の話
  • pt-query-digestの見方・入れ方

などを経験者組からおそわる(教わってばっか)

メンバーが交通事故(無傷)に巻き込まれて警察署に行ったりわちゃわちゃした。

自習

モニタリングまわりのことと、ミドルウェアの設定とかは他のメンバーがやってくれそうな雰囲気があったので僕はとりあえずGoの勉強した。Goはほぼ初めてだったけど雰囲気理解した。 あとSQLもちょっとだけ勉強した。

本番

takahiroの家に集まってやることに。感染対策の観点からは良くないけど、全員テレワークで外出してないから大丈夫と判断。対面での連携の鳥やすさを優先した。

様子

詳しい時系列とかは他のメンバーのエントリに書いてもらうとして、僕がやったこととその振り返りを書いていく。

やったこと

僕は主にアプリケーションの改善を担当した。時系列順には多分以下の通り。

dropProbabilityで遊ぶ

0にしたり0.5くらいにしたり。みんなやるよね。

postIsuConditionのBulkInsert

明らかに大量に呼ばれてるクエリで、わかりやすくN+1が発生していたので。簡単に修正できた。 点数はほとんど変わんなかった。もしかしたら後々効いてたのかもしれないけど。

postIsuConditionのキャッシュ(失敗)

dropProbabilityを下げれるかが大事そうな雰囲気してたので、postIsuConditionへのリクエストをいい感じにキャッシュして複数回分のリクエストをまとめてInsertできないかと思って試した。僕のGo力とメモリに関する理解と人徳が足りなくて無理だった。

getTrendの修正(失敗)

ルールを読む限り、getTrend自体は得点につながらなさそうだったけど、他にできそうなことが思いつかなくて着手。

getTrendが明らかに非効率なクエリになっていてので、修正を試みるが動かない。。。。

萎える

getTrendが動かないのを修正しようとすると沼が深そうだったのと、修正しても得点に結びつかなさそうだったので、諦めて他のメンバが解析した結果を眺めて他のアクションを考えてた。

この間に他のメンバがサーバー分散したりインデックス貼ったりしたらgetTrendが一番重いクエリになってきた。やっぱり修正することに。

getTrendのN+1解消

よく見てみたらGolangのsliceのappendの挙動で失敗してたのでそこを直したら動いた。 GET /trend 自体はかなり早くなった。 得点もちょっと伸びた。

getTrendのSQL改善

エンドポイント自体は早くなったけど、SQLで不要なデータをとってきてたので、それを改善するためにtomonoriと一緒にSQLを改善した。(二人ともSQL力が足りなくて調べながらやってた)。結果うまいことデータを取れるSQLを作れて、クエリもかなり早くなったが、スコアはむしろ下がってしまった。

ログを見ると、クエリが早くなった分ベンチから呼び出される回数も増えてた。なんでこういう挙動になるのか今でも謎。

振り返り

今回の(僕個人の)反省点は

  • ルールや仕様をちゃんと読む
    • 課題のトリアージがちゃんとできず、筋の悪そうなgetTrendを触ってた
    • そもそもルールをよく読んでなかったせいで失格になった
  • 事前準備
    • デプロイスクリプトとかはあってもよかった
    • ブランチ戦略でちょっとまごついたのでプロンプトにブランチ名とHEADのコミットハッシュを表示するbashrcを用意してても良かったかも
  • 技術力不足
    • Goに不慣れ
    • SQLにも不慣れ

感想

楽しかった。中高生の頃からロボコンやってきてた身としては、こういうコンテスト特有の緊張感が好き。

スペシャルサンクス

他のチームとして出場するにも関わらず、初出場の僕やtomonoriに色々教えてくれたり勉強会の準備をしてくれたり反省会を手伝ったりしてくれたもう一人の同期に感謝。

KDG HACKSに参加してきた

KDDI DIGITAL GATE 先日開催されたKDG HACKS 2019 WINTERに参加してきました。
全体的に最高だったという話です。

優勝しました✌️

KDG HACKってどんなの?

KDDIさん主催の、IoTをテーマにした全二日間のハッカソンです。

めちゃめちゃ待遇がいいです。
具体的には

  • 交通費・宿泊費全額支給
  • 前泊可能
  • お菓子食べ放題・飲み物飲み放題
  • 昼食付き
  • 初日夜は寿司
  • 最優秀賞は一人あたりアマギフ2万円分
  • 優秀賞(2チーム)は一人あたりアマギフ1万円分
  • マイコン・センサー・モーター使い放題
  • AWS使い放題

などなど。

お菓子食べ放題の図 チュッパチャップスタワー

エナドリ系もありました。 途中で追加されたエナドリたち

Slackにwishlistチャンネルがあり、食べたいものや欲しい物を投稿すると社員の方が買ってきてくれました。
画像はラムネを買ってくるようにお願いする僕です。 Slackでラムネを頼む僕

何をしたの?

その場で初めて会った5人でチームを組んでIoTプロダクトを企画・開発します。

1日目の午前中にアイデアソンを行い企画を出していきました。アイデアソン自体は個人戦ですが、ここで出したアイデアを元にチームで開発していきます。
イデアソン優勝者はうちのチームのメンバーの一人でした。僕が出したアイデアもそこそこ高評価をいただけたので良かったです。

イデアソンが終われば後は2日間開発と発表の準備です。が、多くのチームがすぐには開発に取り掛からずに企画の検討・練り直しをしていたと思います。
本来ならばアイデアソンで優勝した企画で開発するかと思いますが、僕らのチームも企画の実現可能性などを加味して再検討した結果、↑の僕が出したアイデアでいくことになりました。

今回開発したシステムの構成 システム構成図

僕の担当はインフラの構築とバックエンドでした。残りの分担としてはフロント2人、エッジ(マイコン)2人という感じです。

僕がアイデアを出した関係上、全体の構成を僕が一番把握していたので、僭越ながらPMもどきもやらせていただきました。

ざっくりやったこととしては

  • 全体の進捗をこまめに確認する
  • 詰まってるメンバーがいれば一緒に解決策を考える
  • 完成形に向けて全体の機能の整合性をとる

といった感じです。

感想

チームメンバー最高、という感じです。みんな優秀だったので頼んだものがちゃんと実装されていきました。それぞれの技術スタックがバラバラだったので適材適所で分担して開発を進めていけたのが非常に楽しかったです。
また、上述の通り今回は自分の意見を通させてもらったことが非常に多くて、そういったところも受け入れていただけたのでありがたかったです。

勝因はおそらくデモの設計に力を入れたところだと思います。発表1時間前に開発を終えて、そこからデモをどう見せていくのかをチーム全員で共有していきました。全部の機能がちゃんと動作して、オーディエンスも盛り上がったのが良かったかなと思います。

そして、自分の技術力向上が感じられたのが嬉しかったです。フロントもバックもインフラもエッジも、まあ2日間のハッカソンに耐えうる程度には技術が身についてるのかなあ、と思いました。

余興のじゃんけん大会で頂いたスタッフTシャツ スタッフTシャツ

git challenge#12に参加してきた

先日10/26、mixiさん主催のgit challenge#12に参加してきました。

f:id:chouxcreams:20191028235618j:plain

事前情報を全く持っていなかったのですが、案内のメールがきて何これ面白そう!って感じで応募しました。

 

git challengeとはなんぞや

チーム開発でgitを使ってると様々なトラブルが発生します。git challengeは、想定されるトラブルを問題にしてしまって、それを解いた数を競う競技会です。競技は二人一組で行います。

git challengeでは求めた形のコミットログをプッシュできているか、専用のジャッジサーバで判定します。競プロっぽい感じですね。

午前

11時スタートだったのでのんびり行ったら一番最後の到着でした。朝起きてgit challengeに出席することをgit challenge challengeというらしいです。

到着すると自分のペアの席に案内されます。

f:id:chouxcreams:20191029000839j:plain

僕はteam-indiaでした。チーム名はalpha、bravo、charlieとフォネティックコードに対応する形です。wilcoのアルバム名にもありますね。

 

午前中は社員の方のLTと、競技のチュートリアルでした。

LTはmixi社内でのCI/CDの運用方法についてと、Tigコマンドについてです。git challengeということもあってgitやチーム開発に関するトピックでした。

 

競技のチュートリアルはこんな感じです(公開されてるならやっておけばよかった…)

github.com

競技本番

お昼をはさんで競技本番です。4時間でできるだけ多くの問題をときます。各問題には難易度が星の数で表されていて、解いた問題の星の数だけ点が入る仕組みです。

僕たちは難易度の低いものから解いていって、解けた人から次の問題に移る、という形を取りました。

序盤はなかなかコツを掴めず、ペアの人はどんどん問題を解いていく一方、解けない問題をペアに交代してもらうなど、申し訳ない感じでした。gitのログを確認するためにVScodeのGit Historyを使っていたのですが、途中3回ほど壊れてしまったため、そのたびにfixしていました。

後半は調子がのってきたのか、3点問題を2問解いたりしてなんとか巻き返しました。

 

気になる結果は…

f:id:chouxcreams:20191029003055j:plain

なんと3位。

上のスクショはa-iの間のチームしか収まっていませんが、たしかteam-mikeまでいたので全13チームです。

 

team-foxtrotとteam-golfが難易度3までの問題を全て解いて1位タイ。そこから僕らteam-indiaが1問差で3位となりました。

個人的にはかなり健闘したと思ってます。4位のチームが14点なので3問分の得点差をつけての3位です。3位以上は表彰で名前を呼ばれますが、自慢とかしたいんで賞状か何かもらえると嬉しかったですね。

僕らがとった全22点のうち11点は僕が、もう11点はペアの子がとった得点です。お互いにいい感じに貢献できて非常にいいパートナーでした。

 

ごはん

お昼も夕食もついてます。

f:id:chouxcreams:20191029005345j:plain

いい感じのお昼。

 

f:id:chouxcreams:20191029005922j:plain

まさかのビュッフェ形式(mixi本社内)

 

感想

めっちゃ楽しかったです。競技プログラミングみたいに競技化してほしいです。問題作るのが大変そうなのと、問題のレパートリーが少なくて難しいんですかね。せっかくジャッジサーバーもあることですし、何か期待したいです。

 

競技のあとは難しい問題を社員さんが解説してくださいました。僕は普段もコマンドからgitを操作していますが、まだまだ沢山知らないコマンドがありますね。

gitの実装なんかの話もあり、ますます「gitすげー」となった一日でした。