ぱすたけ日記

日記っぽいのを書きます。

ISUCON13でNode.jsへの参考実装移植のお手伝いをしました

先日開催されたISUCON13で、Node.jsへの参考実装移植の担当の1人として参加してきました。

個人としては今年も選手としてISUCONに出る気が満々だったのですが、やんごとなき事情により当日参加は厳しい感じになったところに、ISUCON13 Node.jsの参考実装移植をお手伝いいただける方を募集します : ISUCON公式Blog を見つけて、当日居られなくても良いなら…という感じで応募したところ、お誘いをもらったので、Node.jsへの参考実装移植のお手伝いをする運びになりました。

Node.jsへの移植についてはメインの実装作業をYutaUraさんに行って頂きつつ、僕は方針の相談やコードレビュー、ちょっとしたコードの改善を担当しました。ほぼ8割以上の作業はYutaUraさんにしていただいた形になり、感謝感謝です(個人的にもちょっと色々詰まってたので助かりました……)。

個人的には、移植に関わることが決まってから、honoを使うようにして、bunやその他のランタイムに切り替えることも選択肢として取れるようにするということを出来るとISUCONの競技の上で参加者の人々にチャレンジを提供できるのではないかというアイデアを持っていました。また、若干個人的な感情も籠もっていますが、hono自体にも何か還元できることがあれば良いなと考えていました。

実際の作業を始める前に、YutaUraさんの方から方針としてhonoを使いたいということとBunでも動く参考実装を提供したいという点を共有してもらいました。個人的には前述通り、expressよりもhonoで提供したいと考えていたので、honoを使うことには特に反対はありませんでした。

2点目のBunでも動く参考実装は結果的に動作保証などをする時間もなかったので削って良かったなという感じですが、まぁRubyを使う時に-devに切り替えるとか、Node.jsもバージョン上げてV8の高速化でちょっとでも速くなるのに期待するみたいな感じとある程度同じ範疇かなというのと、提供するとBunを使うことで必要以上にハマる参加者がいるんじゃないかということでbun向けのコードも一部あったのですが、その辺は含めないことにしました。

どうやら、参加者の皆さんの言語選択を見ていると、1チームはBunを使ったチームが居たようでこの辺は移植時の大きな狙いの1つだったので嬉しかったです。

これまた個人的な話ではありますが、自分が過去に出場した際によくやっていた手として、チームとしてはGoで挑むのだけど、問題理解・整理フェーズではTypeScriptでコードを追うということをよくやっていたので、そういうときに障害が出来る限り少なくなるようにということを意識していました。YutaUraさんには頑張ってもらうことになりましたが、各ファイルの関数の並び順や、最初の main.ts を見ると main.go 同様にルーティングの一覧が目に入るようになどを考慮してもらうようにお願いしていました。問題の構造の把握などにおいて、Node.js実装を選んだことが妨げになることを防ぎたかったからです。同僚からもNode.jsからGoに切り替えたときにほぼGoの経験が無いけど、スラスラ読めたと言われたので、そこを揃えたことが少しでも効いていたなら嬉しいです。

そういう点では、Goの strconv.Atoi を使ってパラメータチェックをしている箇所をちゃんとIntegerとして同様にチェックしたり返す関数をJSで書いて置いておいたりしていました。

一方で競技当日にNode.js実装を選んだ皆さんにはパッチを当ててもらうところから始めてもらうことになってしまったのは、申し訳なかったです。もう少し早く気付ければ良かったのですが、見落としてしまっていました。すいませんでした。

普段はJSを書いて暮らしている身として、もっと身近な人々にもISUCONに挑戦してもらいたいと思っていて、そのためには門戸を開け続ける必要があると思っていて、そのまず1つがその言語で参考実装を提供することだと思っています。そういう意味でも今年はNode.jsでの参考実装提供に関われて良かったです。

他の言語は昨年などから引き続き関わってらっしゃる方も居て、その皆さんと同じ程度の参考実装が提供出来たかは分かりませんが*1、もしお気づきの点などがありましたら、(来年は誰が担当するか分かりませんが、)アンケートなどを通じて、フィードバックをいただければと思います。

例年は出場者として参加しているISUCONの裏側を覗き見れて、改めて運営・出題チームの多大な努力と貢献を実感する日々でした。ありがとうございました。来年は出場者として参加したいと思っていますが、Jリーグの日程次第ではまたお世話になるかもしれません。その際はよろしくお願いします。

そういえば先ほど、コードも公開されていましたので、お楽しみいただければと思います。

あと、@hono/node-serverが2.7倍ほど速くなったそうです。めでたいですね。

ちなみに、当日のやんごとなき用事こと、予想通り残留を決めるかどうかの試合となった、京都サンガF.C. vs セレッソ大阪の一戦は無事に京都サンガF.C.が勝利し、自力でのJ1残留を決めました。やったぜ!!!!!

*1:初期スコアが他の言語よりもわずかに低かったのはいくつか聞きましたし、事前にも走らせた段階で分かってはいました……