なぜ競技プログラミングを楽しいと感じるのか

最近競技プログラミングを始めた。

まだ始めたばかりだが、なんだか楽しいなぁ〜、と感じている。

なぜそう感じるのか。

この問いに対して「競プロは『正解』があるから楽しいのでは?」説がある。

お仕事の話

年末に同僚とこんな話をした。

  • 普段お仕事をする中では、明確な『正解』を定義できないことの方が多いと思う。
  • その中で僕らは「正解とは言い切れないけど『だいたいよさそう』と思える範囲」に物事を持っていくためにお仕事をしている。
    • 『正解』というPoint(点)ではなくてArea(範囲)だよね
  • そしてその「『だいたいよさそう』と思える範囲」を決めることもお仕事。
  • つまり普段のお仕事で僕らはすごく高度なことをしているのでは。

なんとなくこの話がしっくりきた。

普段のお仕事って、結構疲れる。

「もっとこうした方がいいかな?」「あれをするともっと良いかも?」「そもそもやりたいことってなんだっけ?」

考えることがたくさんある(量)し、ずっと考え続けてる(時間)。

で、考えた末にやったとしても、「『だいたいよさそう』と思える範囲」に入るかどうかは分からないし、その範囲に入ったとしても、本当に良いことだったのかは分からない。

「不確実性」というやつかな?

お仕事が疲れるのは、そういう中でお仕事をしている(= すごく高度なことをしている)からなのかも、と思った。

その意味では、お仕事が疲れるのは健全なことかも。「仕事疲れた〜!」「いいじゃん!!お疲れ!ビール!!!」で良いなぁと。

競技プログラミングの話

一方で、競技プログラミングは明確な『正解』がある。

その正解に向かって、問題を解くためのコードを書けば良い。

あと、問題の状況が明確に定義されていることも、お仕事の現場とは大きく違うなぁと思った。(お仕事は状況の把握だけでかなり大変)

そう考えると競技プログラミングはずいぶんと「簡単なこと」に思える。

問題や正解を定義することなく「解くこと」だけに集中できる場は意外と少なくて、

『俺はいま解くことに集中しているぞ〜〜!うぉおおー!!』

というだけですでに楽しいし

『よっしゃ提出だ!WJ... どきどき... !』『うわっ、WAだ!』『なにっ!?TLEだと!?』『ヨシっ!AC!』

と、機械的に正解不正解を判断してくれるのも楽しいんだと思う。

お仕事へのヒント

競技プログラミングのエッセンスをお仕事に活かすことを考えてみる。

まずは「解くこと」だけに集中できる場を作ってみることかなぁ。

普段は「解くこと」と並行して「問題の定義」や「正解(よさそうなArea)の定義」を考えている気がするので、そこをしっかり分けること、かなぁ。

他にはなんだろ。よさそうかどうかの判断を機械的に(≒定量的に)できるようにすること、とかかなぁ。

競プロ、楽しいので継続的にやってみる

もともとプログラミングテスト・コーディングテストの類がすごく苦手で、前職で社内スキル調査の一環としてテストを受けた時1つもできなくて情けない気持ちになったことがある。確か計2時間くらいのテストだったんだけど、他のみんなは1時間くらいで数問を解いて業務に戻るなか、自分は2時間きっかり頑張って1問も解けなかったので「なんかもう無理...」となった。これが3年くらい前の話。

それ以降、この類のことは避けてきたんだけど、さすがにエンジニアとして人並みにはこういうこともできるようになりたいなぁという思いはずっとあった。

そんな自分が競プロを始めたきっかけは、社で開催されたバーチャルコンテストだった。

AtCoderの使い方やコンテストの説明(未経験者向け)・雑談 のあと、バーチャルコンテストを開催するよ〜、という感じでハードルを下げてくれていたので参加しやすかった。

とはいえ苦手意識があったので、雑談までやってAtCoderのアカウントを作ったら、コンテストは参加せずに様子を少しだけ見て帰ろう、と思っていた。

けどコンテストの1問目をみると「与えられた3つの数字のうち小さい2つを足した結果を出す」くらいの問題があって、あ、こんな簡単なやつもあるんだ、と解き始めていた。

一度やり始めてしまうと面白くて、いまは社で毎週開催されている競プロもくもくランチにも参加している(主催の @purple_jwl さんに感謝)。

引き続きやっていこうと思う。