chokudaiのブログ

chokudai(高橋直大)のブログです

何かを極めるということ。

この記事は、社長としてではなく、競技プログラミングの1選手としての記事になります。あんまり初心者への配慮とかしてません。

おそらく多くの人は、実践的に使えるアルゴリズムとかの記事を望んでるんだと思うんだけど、僕はどちらかというと、精神論のほうが得意なので。

 

 

近頃、本当に弱くなったなぁ、と感じることが多い。

いや、周りが強くなったのかもしれない。昔判らなかった問題でも、今なら解ける。そういう問題は多い。それを考えると、昔よりは強くなっているが、相対的に弱くなっているだけかもしれない。

そりゃまぁ、RedCoder(Rating2200以上。日本で30人程度の水準)を保つ程度なら出来る。確かにRedCoder手前に壁はある。だが、まともにコンテストに取り組んで、解けなかった問題をすべて復習する、それを数年間続けてれば、ある程度のセンスがあれば辿り着ける領域だ。さすがにそこから滑り落ちることはないし、一般的にはこれでも称賛される成績ではあるだろう。業務上も十分だ。

ただ、Target(Rating3000以上、世界で20人程度)に手が届くか、と言われると、返答に困る。昔なら「もうちょっとでいける」と言えた。事実、2912までは行った。だけど、今行けるかというと、到底たどり着けるとは思えない。

なぜ、手の届かないところに行ってしまったのか。それについて、思ったことを書こうと思う。

 

先日、二人の競技プログラマが入社した。二人とも、TopCoderのAlgorithmのレーティングも僕より高い、格上の競技プログラマである。社長としては嬉しくはあるが、選手として見れば中々難しいところである。社内レーティングランキングが4位にまで転落してしまった。

まぁ、そんなことはどうでもいい。問題はここからだ。

彼ら二人の会話を見ていて思ってしまった。

「僕にはたどり着けるわけがなかった」と。

理由は極めて簡単。彼らのしていること。彼らの日常会話。それの、ほぼ全てが、「競技プログラミング」に繋がっているように見えたからだ。とにかく、数学的な、パズル的な、そんな思考を繰り返している。仕事中でも、仕事が終わっても。

「勉強時間の差」とか、そんな甘っちょろいもんじゃない。いや、もちろんそれ専用の勉強も、並みの人の数倍はしているであろう。だけど本質はそこではない。そういう勉強時間ではない、1日に24時間存在する、日常的な時間のほうが、彼らの糧となっている。少なくとも僕にはそう見えた。

だって、呑み会の場で、「片方が整数を思い浮かべるから、もう片方がその整数に関する質問をして、その整数を当てるゲーム」とかするか?「質問が面白くない」とかで却下したりするし。約数の個数とコラッツ予想の1になるまでの試行回数でどんだけ整数搾れるんだよ。わかんねえよ。気づいたら実数になったり文字列になったりしてるし。なんだよ文字列中に含まれる回文の個数って。

 

一方、自分の趣味は、ゲーム攻略とかである。いろんなゲームに手を出して、いろんな攻略法を学んで、ほかのいろんなものに適用する。そんなのが好きである。

「問題を早く解くこと」を目的とした競技プログラミングに対しては、ある程度の関係性はある。だが、彼らほどの直接的に影響するものではない。その他いろいろと趣味はあるけれども、それらはもっと遠い。

 

何より大きな差は、問題を見つけた時の姿勢だ。

僕は、競技プログラミングを業務にしてしまった。その結果、解答を聞いて、僕自身の第一勘と、その解答との差異で、難易度を判定し、コンテストや採用試験に出題する、という思考プロセスを辿るようになってしまっていた。効率を重視し過ぎていて、大事なものを見失っていた。

彼らは真っ先に問題について考える。解答を聞きたがらず、まず自分の頭で考えようとする。彼らだって今は業務で問題に触れている。だが、自分できちんと考え、最終的にはちゃんと解き切り、彼ら自身がどれだけ苦戦したかで判断している。

ここのスタンスは日常的な部分でも現れる。業務と関係ないコンテストでも、僕は問題概要と解答をなぞる。彼らは考え、自分で解く。そりゃそうだ。実力に差が付くのは当たり前だ。僕が自力でこの1年間に解いた問題数なんて300あるかどうかだ。彼らが実装した問題は、そこから特別多いかと言われるとそうではないかもしれないが、「自分で考えた」問題数に関しては、これをはるかに上回るだろう。

 

僕は、競技プログラミングをやっていた、といっても、業務で触れていただけだ。日常ではない。だが、彼らにとってはそれが日常だった。

僕は「競技プログラミングの選手」ではあったかもしれない。だが、彼らのような「競技プログラミング星人」ではなかった。それがこの差なんだなぁ、と、ここ数か月で非常に感じた。

少し前の僕は「才能が違うのかな」と思っていた。そんなんじゃない。才能だったら自分だってある程度はある。致命的に違うのは、生き様だ。

なるほど。これは勝てるわけがない。

 

さて。

勝てないのは判った。かつて憧れていたその場所に、届かないことは判った。おそらく自分は、競技プログラミング星人にはなれない。彼らほど、数学が、アルゴリズムが、競技プログラミングが、おそらく好きではない。好きであれば、もっと日常的に取り組んでいるはずである。魚相手に水泳で勝負を挑んでいるようなものだ。

では、どうするか。

割と答えは簡単に見つかった。

どれだけ好きかで負けているのであれば、もっと好きなことで勝負をすれば良い。

 

彼らがやっているのは、「問題が与えられ、それらを早く正確に解く」ということを主題とした、短期型の競技プログラミングだ。AtCoderも9割以上のコンテストがこの形式だし、TopCoderのAlgorithm部門は全てこれだ。

だが、僕が本当に好きなのはそこではない。「問題が与えられ、長期間の中で、どれだけ良い解答に辿り着けるか」を主題とした、長期型の競技プログラミングだ。TopCoderで言うと、Marathon Match部門がそこにあたる。

初めて僕が成果を残した、Imagine Cup 2008。その1年前のImagine Cup 2007。これらの予選は2ヵ月のコンテストであったが、問題について考えていなかった瞬間は、ほぼ皆無であったと自信をもって言える。

正直に言って、その時の僕のプログラミングスキルはどうしようもなく低かった。それでも、2年目の2008年で世界3位を取れたのは、ひたすら真摯にコンテストに向き合っていたからに他ならないと思っている。

あの時の僕は、新入社員の彼ら二人と同じ領域にいたのではないだろうか。いや、もしかしたらそれ以上に、競技プログラミング星人だったのではないだろうか。

 

長期型の競技プログラミングってのは、ただ問題を解くだけじゃない。頭の中で完結する話じゃない。ひたすら試行錯誤し、良い方法を探していかないといけない。

趣味のゲームだって、短期間で問題を解くというミクロな視点よりも、長期間問題に取り組むマクロな視点の方がずっと役に立つ。下手すると、経営の勉強だって役に立つくらい、総合力が問われる。時間の作り方や、メンタルの高め方なんかまで効いてくる。だからこんな記事を書いて鼓舞しているわけだ。

 

思えば、Algorithm部門では、別に大した成績を残せたことはなかった。

定期的なコンテストで1位を取ったことはあるものの、TopCoderでのレーティングランキングも最高24位。何か成果をあげるとしたら、Google Code Jamで、1回決勝進出した程度である。

Imagine Cupの3位や、TopCoder Openの準優勝、加えてICFPCの2回の優勝。その他、成果を出したコンテストは、全て長期型のコンテストであった。

会社の業務に合わせて、得意でない分野で戦ってたから勝てなかったのだ。当たり前だった。まさに、中途半端であった。

 

であれば、やることは簡単だ。長期型のコンテストに照準を定めよう。

ちょうど、TopCoder Open 2016の、最後の予選が開催されようとしている。世界ベスト6を決める予選で、最後の予選では上位2人が通過となる。

6/23からの2週間。社長としての業務もあるので、2週間のコンテストにフルコミットするのは難しいが、ある程度はどうにかなるだろう。

社長が選手としての活動に集中し過ぎてどうすんの、って意見もあるだろうが、競技プログラミングの会社をやってんだ。競技プログラミングへの情熱を失ってどうする。そこがなかったら会社を続ける意味がない。

 

近頃の成績は正直パッとしなかった。「chokudaiって実は別に大して強くないんじゃないの?」と思った人も多くいただろう。妥当な評価だと思う。

ただまぁ、今回は違います。本気です。これで負けたら言い訳のしようがない。

久々に見せてあげます。高橋直大ここに在り、ってのを。