難問をプレゼント、世界のエンジニアが楽しむクリスマス・イベント
コネクティビティ

This puzzle challenge brings joy to the world of code 難問をプレゼント、世界のエンジニアが楽しむクリスマス・イベント

世界各地から数千人が参加するアドベント・オブ・コード(Advent of Code:AoC)は、エンジニアたちに人気のプログラミング・コンテストだ。最も速く問題を解くこと、プログラミングを学ぶ材料とすることなど、参加者の動機はさまざまだが、共通しているのは、参加者全員が毎日新しい問題を心待ちにしていることだ。 by Siobhan Roberts2021.12.24

エリック・ヴァストルは2015年、サンタをテーマとした1日1問のプログラミング・コンテスト「アドベント・オブ・コード(Advent of Code:AoC)」を初めて開催した。すると、12月1日の午前0時までに81人から参加申し込みがあった。70人ぐらいは参加するだろうと考えていたので、ほぼ予想通りだ。ヴァストルは、数人の友人とその友人、さらにその友人の一部がこの「気晴らし」に興味を持つだろうと考えていた。

ヴァストルは、TCGプレーヤー(TCGPlayer:トレーディングカードのオンライン・マーケットプレイス)の上級アーキテクトとして働くソフトウェア・エンジニアだが、やや想像力に欠けていたようだ。ソーシャルメディアの「再帰的な伝染力」がそれを圧倒するという可能性には気づいていなかったのだ。その後に起こった事態を専門用語で表現すると「OH NO!」になる、とヴァストルは冗談まじりに言う。イベント開始からの12時間で、参加者は4000人に膨れ上がり、サーバーはクラッシュ寸前となった。さらに48時間後には1万5000人となり、12月25日のイベント最終日には合計5万2000人に達した。翌年、ヴァストルはアマゾンWebサービス(AWS)に舞台を移したが、参加者は増え続けている。

2020年はおそらく新型コロナウイルス感染症(COVID-19)のパンデミックの影響もあって、世界中から18万人の参加者が集まり、通信量は倍増した。

そして今年も、サンフランシスコからスロベニアに至るまで、学生やソフトウェア・エンジニア、競争心に燃えるプログラマーなど、大勢の人がAoCでクリスマスのカウントダウンに臨んでいる。伝統的な降臨節暦(アドベント・カレンダー)では、チョコレートやおもちゃ(最近では犬のおやつや、(ウイスキーの)ジャックダニエル、レゴのフィギュア、それにアプリのデジタル版などの場合もある)が毎日届けられる。AoCの参加者の場合は、嬉しそうに数学の問題を紐解き、それを解くためのミニプログラムを書いていくのだ。

その楽しさの一部は、長年続いてきた「休暇の儀式のおまじない」にあるのだろう。また、難題に頭を悩ませるという楽しみもある。グーグルの研究責任者であるピーター・ノーヴィクは、ヴァストルが「時間をかける価値のある問題を作成している」と信頼しており、楽しいと感じている。それは、ニューヨーク・タイムズ紙のクロスワード・パズルを楽しんでいる読者が、作者であるウィル・ショルツを信頼しているのと同じような感情なのだとノーヴィクは言う。「問題を面白くする仕掛けがあるのです。しかし、仕掛けにも限界はあります」。

プログラミングの楽しみ

12月1日から25日まで、米国東部時間(ヴァストルはニューヨーク州のバッファローに住んでいる)午前0時に「adventofcode.com」で新しい問題が出題される。問題は、巧みに創作されたクリスマスの物語の中に埋め込めている。ある参加者は、その物語を「そんなものが存在すればの話だが、『エクスキューズ・プロット(Excuse Plot)』(ゲームの単なる飾りとしてのあらすじ)だ」と表現している。

今年のイベントは「サンタの従者がそりの鍵を無くした」という設定で、順調なスタートを切った。第1問は以下のような状況だ。「海上の船で自分の仕事に取り掛かっていると、船の警報が鳴った! 何かできることはないかと現場へ急ぐ。どうやら、従者の1人が転んでそりの鍵を海に落としてしまったようだ!」

幸運なことに、そんな緊急事態に備えて従者が潜水艦を待機させていた。イベントの参加者は、そこから25日間の海中探索へ出かけることになった。毎日、2つの問題(2問目はひねりが加えられていたり、難易度が上がっていたりする)が出題される。問題を解くと、星とともに「正解です! そりの鍵の発見まで、金の星1つ分近づきました」という称賛のコメントがもらえる。

参加者は全員、問題を解けば星がもらえるが、最初の正解者には100ポイントが与えられる。2番目なら99ポイント。以下同様に続き、100位は1ポイントとなる。

出題者はこう説明する。「クリスマスを台無しにしないためには、12月25日までに50個の星をすべて集める必要があります」。

AoCの目的は、自分が選択したプログラミング言語(Python=パイソンが一番人気だ)を使って問題を解くことにある。ヴァストルの言う「一心不乱のエクセル使い」や、大量のグラフ用紙など、どんな手を使ってもいい。そして、驚くほど多くのユーザーがマインクラフトで問題を解いている。

広い意味での動機はそれぞれの参加者で異なる。自分のプログラミング能力を整備するための毎年の恒例行事と考える参加者もいれば、プログラミングや新しい言語を学ぶ絶好の機会と捉える参加者もいる。プログラミング言語「Elixir(エリクサー)」の開発者であるジョゼ・ヴァリムは、AoCを解くところをツイッチ(Twitch)で配信している。

合計得点の上位100人が掲載されているグローバルな「リーダーボード」でトップに立つブライアン・チェン(ハンドルネームは「betaveros」)やアンドリュー・ホー(同じく「ecnerwala」)などのプログラマーは、スピードを競っている。ズーム(Zoom)でエンドツー・エンド暗号化に取り組んでいるセキュリティ・ソフトウェア・エンジニアのチェンは、昨年(その前年も)優勝した。ホーは惜しくも第2位だった。

チェンはこう語る。「スピードを競うのは楽しいですね。可能な部分すべてを最適化すると、すぐにフィードバックが返ってきます。微調整できる小さな『つまみ』がたくさんあるのです。また、選択が正しかったり、準備していたものが後から役に立ったりなど、誇らしく感じられる小さな瞬間もたくさんあります」。

2人はともにマサチューセッツ工科大学(MIT)コンピューター・サイエンス学科の卒業生で、ベリエリアに住んでいる。長い間、プログラミング・コンテストで競い合っている仲のいいライバルだ。国際大学対抗プログラミング・コンテスト(International Collegiate Programming Contest:ICPC)の際はチームメイトで、コードフォーシーズ(Codeforces)グーグルのコード・ジャム(Code Jam)では競争相手だった。今年もまた、チェンがホーに先行している。「正直なところ、それは彼が私よりも優秀だからです。スピードを最大化する技や、それを実行する力が優れているのです。でもそれを認めたくはありません」とホーは語る。ホーは、企業のデータ部門が使用するインフラやツールの開発を手がけるスタートアップ企業「モーダル(Modal)」の創業エンジニアだ。

大部分の参加者は、リーダーボードに手が届くことはない。問題の難易度が毎日上がるとあってはなおさらだ。ショッピファイ(Shopify)でエンジニアリング運営チームを率いるキャスリン・タンは、1日目が36位で3日目が81位だった。だが、自分がリーダーボードに長くいられないことは分かっている。「グーグル・スプレッドシートを駆使しながら、楽しく参加しています」。

しかしながら、AoCの要素はショッピファイやグーグルのほか、規模の大小を問わず多数の企業が再現している。そしてそこには、非公開のリーダーボードや専用のチャット・チャンネルが備わっている。チャット・チャンネルでは参加者が問題の解き方を共有したり、問題点について事後検討したりしている。

「競争によって、専念する姿勢が高まっています」。エンジニアのアレック・ブリックナーは、自然言語処理を手がけるサンフランシスコのスタートアップ「プライマー(Primer.ai)」のスラック(Slack)チャンネルでそう語った(ブリックナーはこれまでのところ、何日かリーダーボードに登場している)。

それに対し、「まあ、そうかもね」と同僚のマイケル・レイカムが応じる。「プログラミングは楽しいから、それが僕にとっての見返りかな」。

プライマーのジョン・ボハノン科学部長も「SAME」という絵文字でそれに同意する。

ボハノン科学部長は、問題を取り巻くちょっとおかしな物語も気に入っているが、そのあらすじはほとんど役に立たない。「スピードを競っている参加者はあらすじを完全に無視し、問題を解くために変数にだけ集中して取り組んでいますね」。

プライマーのロンドン支社でデータ科学者兼エンジニアを務めるノラ・ペトロワが参加する理由は、競争するためではなく、イベントが美しいと感じているからだ。「それぞれの問題で展開するドラマが大好きなんです」。例えば、4日目には巨大なイカが潜水艦にくっついてしまった。もちろん、ビンゴをするためだ。問題では100枚のビンゴボードのランダム集合が与えられる。勝てるボードを予想し、それをイカに渡すことが目標となる。

好きか嫌いかの二者択一

ヴァストルがAoCを創作する一番の原動力は、プログラミング・スキルの向上に役立ちたいという思いだ。「プログラミング初心者に最大限利用して欲しいと思っています。大部分の参加者の成功の尺度は『どれだけ新しいことを学んだか』です。『この問題を世界最速で解けたか』ではありません」。

カリフォルニア州ベンチュラ市にあるデ・アンザ・アカデミー(De Anza Academy of Technology and the Arts)中等部の教員であるラッセル・ヘルムシュテットは、AoCを使って6〜8年生にパイソンを教えている。最初の2問にはクラス全体で取り組んだ。教師の立場にしてみれば、失敗しても単にやり直せばいいだけなので、効果的な演習となる。それは、試行しながらのソフトウェア開発の精神とまったく同じものだ。

一部の生徒は二面性のある持つ課題(問題自体の解明とそれを解くためのプログラミング)に少々及び腰になるが、大半は挑戦を楽しんでいるとヘルムシュテット見ている。生徒の1人は「難しいところが好きです」とアンケートに回答している。また、別の生徒は「正直なところ、欠点はまったくありません。目標に向かって着実に進んでいくところがとても気に入りました」と答えている。アンケートではAoCの「印象」について複数の選択肢から選ばせており、1人が「嫌い」と答えている。だが、41人が(さまざまな度合いで)「好き」と回答し、8人が「大好き」と答えている。

スロベニアのリュブリャナ大学では、コンピューター科学者のヤネス・デムサーが教育と自身のスキル向上のためにAoCの問題を利用している(彼は機械学習とデータ可視化のためのオープンソースのツールボックス「オレンジ(Orange)」の中心メンバーでもある)。「私には定期的な『練習』が必要なのです。オーケストラでの演奏と平行してレッスンしながらも、ちょっとした練習を必要とするバイオリニストのようにね。つまり、これが私の『エチュード』というわけです」。デムサーは、さまざまな経歴の人々が200人以上集まったグループに、「プログラミング101(Programming 101)」を教えている。「私の最大の関心は、プログラムをすでに少しかじった(あるいは多くを学んだ)生徒の興味を維持し、課題を与えることにあります。AoCの問題は(純粋なプログラミングからアルゴリズムまで)さまざまなスキルが要求されるので、素晴らしいと思います」。

リュブリャナ大学数学科の3年生であるグレゴール・キケルは、2019年に初めてAoCに挑んだ。そして優秀な成績を収め、コンマ(Comma.ai)にインターンとして受け入れられた(現在、同社の半自動運転システム用ソフトウェア「オープンパイロット(Openpilot)」の開発に取り組んでいる)。同社の創業者もコンテストに参加していたのだ。また、大学のプログラミング課程(別の教授が担当)の成績も上がった。AoCで解いた問題数に応じて最終試験の点数が加算されたためだ。さらに、リーダーボードに載ったことでも加点された。

キケル(ハンドルネームは「grekiki」)は毎朝、AoCで問題が発表される時間(スロベニアでは午前6時)に起床し、最終的にリーダーボードで52位となった。その結果、試験に23ポイント加点された。「その年以降は、加点の上限が5点になりました」と彼は思い出を語る。現在も夜明けとともに起床し、問題に取り組んでいる。今年は5日目に25位という最高順位を記録しており、上位100人に残ることを目指している。「問題の難易度が上がるにつれ、今後どうなっていくかですね」。

リーダーボードへの道

リーダーボードを目指す参加者には激しい競争が待っており、毎日のカウントダウンが重要になってくる。参加者は問題が「降って」くるのを鷹のように待ち構え、全速力でクリックし、ダウンロードする。昨年は、この「1秒間に同期したトラフィックの巨大な爆発」(ヴァストルの表現)にアマゾンのロードバランサーでも耐えきれなかった。

掲示板サイト・レディットのAoCのスレッド(インターネット上に数多く存在するコミュニティの1つ)には、勝利する方法に関する内輪ネタが満載だ(問題の解法や「お助けスレッド」のほか、風刺やミームもある)。しかし、おそらく最高の情報源はブライアン・チェンが投稿しているブログ「リーダーボードへの道(how to leaderboard)」だろう。

チェンは、「バグを書いてはいけない。バグを見つけたら早期に対処すること」といった一般的なアドバイスまでしている。さらに、「スピードを追求しよう。プログラムを早く書くために省略できる部分はすべて省略する。効率化を目指す。プログラムをコピペする。定数をハードコードする。データを遠慮なく変化させる。プログラムの流れを制御するために例外を使う。ブーリアン値を整数にし、それらをインデックスとして使用する。まったく必要のない場合でもデータを文字列として表す。誇りを持とう」と述べている。

チェンが強調しておきたいのは、「通常はそうしたことは本番のプログラムではやらない」ということだ。要するに、プログラムは製品に力を与えるためのもので、最終的に顧客に提示される。だがAoCに関しては、十分に優れたプログラムを書くだけでいいというところに本質がある。堅牢さや美しさは必要ない。優れた効率化にこそ意味がある。

ピーター・ノーヴィクは自分のプログラムを書く際、「YAGNI(You aren’t gonna need it.(それは必要ないだろう)」という原則を忘れないようにしている。

これまでと同様に、ノーヴィクは問題のパート1とパート2のすべての解き方をギットハブ(GitHub)に投稿し続けている(彼はポイントのためではなく、楽しむために参加している)。一連の投稿は、必然的にハッカー・ニュース(Hacker News)などのメディアで称賛されており、「ノーヴィクのプログラムは素晴らしい」との声も挙がっている。「数学の証明を味わったり、優れた小説家の文章を楽しんだりするのと同じような感覚で、彼のプログラムを読むのは本当に楽しい」とのコメントもある。

「AoCの考え方の一部は、パート2の説明を読む前に、パート1を解くための設計を選択しなければならないという点にあります。パート2で再利用できるかもしれない一般的な『部品』を(プログラムに)入れるために、パート1の解法を知りたいという強い欲求が生まれます。しかも、YAGNIの罠に陥らないようにしなくてはなりません」。

チェンは、「無駄のないプログラムをすばやく書くためにあらゆることをする」とは別に、一番重要な助言をしている。それは「問題が公開されたら自由に過ごすこと」という、基本だがおろそかにはできないアドバイスだ。2018年、チェンは友人とカラオケをしながらある問題を解いた。「歌うのをやめ、ノートパソコンを開いて隅の方で問題に取り組みました。そしてまたカラオケに戻りました。もちろん、そのおかげで早く解くことができたんです」。その年、彼は総合2位だった。また2019年には、サンフランシスコから台北までのフライト中に、Wi-Fi回線が弱い環境でAoCの17日目に取り組んだ。さらに22日目には、親族の結婚式に出席している最中にスマートフォンで(目立たないように)プログラムを書いた。

「とんでもない怪物だね!」。チェンのライバルであるドロップボックス(Dropbox)のソフトウェア・エンジニア、ジェフリー・ソン(ハンドルネームは「goffrie」)は言う。

自分の長所を磨くため、ソンはときどき、タイピング速度を競うコンテスト「タイプレーサー(TypeRacer)」に事前に参加し、指の筋肉をウォ―ミング・アップさせている。AoCに本気で取り組んでいる参加者は全員、問題が発表される数分前に毎日のアラームをセットする。集中力を高め、パソコンの前に移動する時間を考慮してのことだ。それでもアクシデントは起きる。今年の2日目、ベイエリア在住のアンドリュー・ホーは、太平洋標準時の午後8時55分に鳴ったアラームに驚いた。すでにパソコンの前にいたホーは画面にテンプレートを準備していたが、出題まではまだ5分あった。しかし、ぼうっとしている間に10分が過ぎてしまった。「まさにアクシデントでした。気が散ってしまって、問題に取り掛かれたのは9時5分でした」。

そのときにはもう手遅れだった。その日の問題はそれぞれ66秒と39秒で解けた。だが同時に、多くの点を見逃していた。「やり直すことはもちろん可能ですが… ええっと、実際にやるかどうかは分かりません」(昨年、チェンは問題を1日飛ばしたが余裕で優勝した、とホーは語っている)。

ホーは12月中旬にコンテストに復帰した。この時期には参加者が次々と脱落していく。問題の難易度が上がることも一因だが、ハッカー・ニュースのスレッドでも言及されているように、そこには別の理由もある。実生活での休暇中の行事によって、自由な時間が削られてしまうのだ。スレッドには「AoCの残りの数問を解くために、友達や家族とエッグノッグを飲む時間を犠牲にするなんて考えられない」とのコメントもある。それに対し、「優先順位を間違えたために早期に脱落するなら、自分自身を責めるしかない」との返信が付いている。