AtCoderで青色になるまでにやったこととプログラマー35歳定年説

f:id:kusano_k:20190925052150p:plain
https://atcoder.jp/users/kusano

はい。 みんな「AtCoderで○色になるまでにやったこと」みたいなタイトルで、右肩上がりのレートのグラフとともに楽しそうな記事を書きやがって。 こちとら2年かけてジワジワとレートが下がり、とうとう下の色に変わってしまった。

これがやりたかっただけなので、競技プログラミング力の向上に繋がる有益な話は、この記事にはほとんど無い。 解答を清書してブログに解説記事を書くというのはオススメだけど。

私と競技プログラミング

「○色になるまで」という記事には、いつ頃から競技プログラミングを始めて、○○年頃には何をしていたか、みたいなことを書くものらしい。

Cマガ電脳クラブ

今の競技プログラミングとはちょっと違うけれど、「Cマガ電脳クラブ」が最初だろうか。 今は無きC MAGAZINEという雑誌があり、その中の「Cマガ電脳クラブ」というコーナーで、問題が出題されていた。 解答と解説を送って正解していれば、雑誌に名前が載る。 2人が選ばれて解説も掲載される。

問題はこんな感じ。 だいたいは、探索して何らかの枝刈りを入れれば現実的な時間で解けるというもの。 AtCoderなどで慣れた人なら1時間も掛からずに解けそう。

f:id:kusano_k:20190925051245j:plain
C MAGAZINE 2004年7月号

中身の分からない複数のテストケースに通るプログラムを書くのではなく、問題に書かれている答えが導ければ良い。 2人が選ばれると言っても、提出時間などが競われるわけではなく、担当者の主観で選ばれる。 実行速度が速いとか、解法がユニークだとか。 関数を一切使わずにプリプロセッサマクロだけで解いたという解答もあった。

2002年から廃刊までだいたい毎回送っていて、何度か解説が載ったこともあった。

ACM-ICPC

2008年。 知ったのが修士1年のときだから、一度しか出られなくて残念(年齢制限があって、修士1年くらいまで)。 もっと早くに知っていれば……。 今の大学生は学部1年から出ている人が多くて羨ましい。

TopCoder

で、ACM-ICPCが終わった後も「これは面白いな」と過去問を解いているときに、研究室の助教に「こんなサイトもあるよ」とTopCoderを勧められたのだったかな。

f:id:kusano_k:20190925055941p:plain
https://www.topcoder.com/members/kusano/details/?track=DATA_SCIENCE&subTrack=SRM

当時は定期的にコンテストを開いているサービスはTopCoderしか無かった。 TopCoderは(今はウェブからも参加できるけれど)Javaアプリをダウンロードして動かす。 当時は、リアルタイムにランキングを更新したりするのはそりゃウェブでは無理だよなと思っていた。 ウェブの技術の進歩はすごい。 Ajaxなんて言葉もこの後に流行った。

TopCoderは最初は黄色だったものの青に落ち、しばらく足掻いて、赤にタッチするところまではいった。 そしてその後だんだんレートが下がっていった。

天下一プログラマーコンテスト2009

今はあちこちの会社がコンテストを開いているけれど、10年前はそんなことはなかった。 Googleくらい。 そんな中、KLabが1回だけコンテストを開いたことがあった。

懐かしんで探したけれど、今も残っている様子が分かる記事がこのブログ1個しか見つからなかった。

天下一プログラマーコンテスト決勝 - suztomoのはてなダイアリー

1日目2.5ポイントのsuperflipが私の1人チーム。 この頃にルービックキューブで最短手数が最長となるのはどの状態か?というのが話題になっていた。 その候補がSuperflipという状態で、そこからチーム名を取った。 今でもCTFに出るときに使っている。

[B! イベント] shi3z on Twitter: "天下一カウボーイ大会は登録商標なので、類似商号をつかうつもりなら、裁判するしかないなあ http://www.klab.jp/tenka1programer/bosyu.html"

「『天下一』という名前はうちの商標だ。訴えるぞ」

「お前も天下一武道会のパクりだろうが」

というやりとりを見かけて、「IT業界はサツバツとしているなぁ」と思った覚えがある。

Codeforces

2010年Codefoces開設。

英語が読めない(私の英語力が無いのは認めるけれど、どうもロシア語の問題を英訳していたようで、Codeforcesの英語もひどかった)し、コンテストは不安定だしで、数回参加して終わり。 いつの間にかTopCoderを抜いて、世界トップシェアになっていた。

f:id:kusano_k:20190928170504p:plain
https://codeforces.com/profile/kusano

http://codeforces.com/profile/kusano

AtCoder

2012年AtCoder開設。 このときは今ほど参加者が増えるようになるとは思っていなかった。

プログラマー35歳定年説

年々調子が悪くなっているのは、AtCoderだけではない。 Google Code Jamでは10年くらい毎年Tシャツを獲得していたけれど、2017年はメインのGoogle Code Jamがダメで、Distributed Code Jamで獲得。 今年2019年はDistributed Code Jamは無く、Google Code JamもダメでTシャツが得られず。

年齢もいつの間にか30歳を超えていたし、プログラマー35歳定年説が頭をよぎる。

レート、どうすれば回復するんだろうなぁ。

半年前くらいに、「これはマズい」と思ってAtCoderの過去問を埋め始めたけど、ABCの最初のほうのDに難しいものがあって、そこで詰まって止めてしまった。 レートへの効果は特に無し。 まあ、簡単な問題の数をこなしても意味が無いのだろう。

f:id:kusano_k:20190928171846p:plain
https://kenkoooo.com/atcoder/?user=kusano#/user/kusano

2018年の6月頃にちょっとAtCoderのレートが回復している。 特に何もしていない気がする。 各回のパフォーマンス(各回の成績、AtCoderのレートはこれの重み付け平均)を見てみると、たまたま調子の良かった回があっただけっぽい。

f:id:kusano_k:20190927064947p:plain

そもそも、2016年頃のレートの上昇もレートの付き始めだからであって、パフォーマンスはAtCoderの開設以来ずっと下がっている。 TopCoderのレートを繋げて見ても、2012年がピークで、そこからはジワジワと下がっているんだな。

この頃は、解いた問題を解説とともにブログに書くということをしていた。 コードも提出したものをそのままではなく綺麗に書き直していた。

kusano_progの日記

これはたしかに効果があった。 後から解くと、コンテスト中の焦りが無いので思考が整理できる。 だんだんコンテスト中でも同じように理路整然と考えられるようになる。 しかし、当時のTopCoderは作問者の解説があったり無かったりであっても当然英語なので、ブログを見てくれる人がいてモチベーションが続いたけど、今のAtCoderだとコンテスト直後に公式の解説が上がるんだよな。

2013年は就職した年でもある。 「仕事で毎日プログラムを書いているだろ」と言われそうだけど、書いてない。 職業プログラマーはコードを書かないからね。 1週間に100行書いたら多いほう。 いや、主語がでかいな。 少なくとも私はそう。

別に、マネージメント的な業務があるとか、事務作業が多いとかではない。 大規模なシステムだと、ちょっとした修正でも内容を雑には決められないし、既存のコードの把握にも時間が掛かるし、バグがあったらエラいことなので慎重にならざるをえないし、ドキュメントを書いたり負荷検証をしたりもある。 変なコードを入れると、自分とチームメンバーがこの先10年とか苦しむことになるというプレッシャーもある。 そもそもコードを書いたところで、AtCoderの後半の問題のような高度なアルゴリズムなんて使わないし。 「競技プログラミングは業務の役に立つのか?」が定期的に話題になるけれど、競技プログラミングが役に立つ状況になったら、それは黄色信号だと思っている。 すごい人が難しいアルゴリズムで問題を解決したとして、その後の機能追加とかメンテナンスとかはどうするんだと。

昔のAtCoderの問題を見て、「この問題をこの時間で解けるか?」と考えてみると、解けそうなので、プログラミング力自体は落ちてはいないと思う。 でも、例えばアルゴリズムの良い解説なんかは蓄積されるし、人類全体は進歩するので、現状維持(もしくは+ε)では、相対的に下がるというなのかもしれない。 昔のTopCoderは、動的計画法ができればレッドコーダーになれたし、Binary Indexed Treeなんかは難問に使われる秘技感があったぞ。 結局、力が付いたのは、真面目に取り組んでいた2010年から2012年の間だけと。 この頃は日頃から競技プログラミングの問題を考えていた。 毎週末のAtCoderに参加するだけではダメっぽい。

ちゃんと練習すればレートも回復するのかもしれないが、やる気が出ないな。 この記事を書くのに昔のことを思い出していたけれど、そういえば昔はプログラムを書くだけで楽しかった。 本のコードを写経して動くだけでも楽しかった。 今は面倒なだけ。 プログラミングは手段ではあるが目的にはならない。

B - Sorting a Segment

例えば青に落ちたこの前のAtCoder Grand ContestのB問題だと、正解すればもちろん嬉しい、「ソート済みの連続するK要素と、連続するK+1要素で左端が最小で右端が最大のものを数えれば……」とかアルゴリズムを考えるのもパズル的でまだ楽しい。 ここから境界条件などを考えながらコードに落とす作業が面倒でしかない。

プログラマー35歳定年説というのは、能力の問題ではなくやる気の問題で、やる気が無くなって後進に追いつかれるのがこの辺の年齢ということなのかもしれない。 どうしたものか。