競技プログラミングにハマっていました
競技プログラミング(競プロ)では、プログラミングの技術を競います。
与えられた課題を解くアルゴリズムを考え、正しく実装する。そのスピードを競うことに、一時期ハマり込んでいました。特に競技プログラミングコンテストAtCoderには、毎週末に必ず参加していました。
この記事で分かること
- どんな仕事(実務)に、何が役に立つか
- がっつりハマって良かったこと
- やめどき
ただし、すべて僕の感想です。良いこと、悪いこと、人それぞれであることは間違いありません。
僕のこと
- 2019年秋にハマり、1年間、毎日精進していました。
- AtCoder1517(水色)
- Codeforces1601(青)
- 仕事でかなりプログラミングしています。
結論
- アルゴリズム習得が仕事に役立つこともある
- 実装への心理的負担が下がって捗る
- 本気で取り組めば、きっと何かの利益をもたらす
- 目的と手段が入れ替わってしまったら、立ち止まって考えるとき
仕事に役立つか?
役立つと思っています。
ただし、仕事によって役立つ度合いが全く異なるとも思います。
プログラミングを伴う研究開発、バックエンドエンジニアには役立つ度合いが高そうです。
集まるデータ、処理するデータの量は増え続けています。ハードウェアの処理能力が高まっているとはいえ、ソフトウェアでの効率的な処理が必要になる場面は多いです。
実際に役立ったこと3選
実際、僕もいくつか仕事上でメリットを感じています。特に役立ったことを3つ挙げます。
- 計算量を見積もる精度が向上した
- 競技プログラミングに参加した人のほとんど全員が感じることかもしれません。
- 計算量について分かっている気がしていて、実は分かっておらず「とりあえず実装したら重すぎて使い物にならなかった」ということが減りました。
- 処理時間を縮めたい、という場面に結構出くわします。そのとき、「どこに縮める余地があるか」という目星を付けるのと「どういう方法で縮められそうか」のアイディア出しが上手になった気がします。
- 競技プログラミングでよく使うアルゴリズムや扱われる問題が業務に直結
- 「このアルゴリズム使えば、あの処理速くなるじゃん!」が、何度かありました。
- 次のアルゴリズムや問題は実務でお世話になりました。
- 二分探索
- プログラミングだけでなく、実験条件を効率よく変えるときにも。
- 幅優先探索
- 呼吸するようにキューを使えるようになりました。
- 深さ優先探索
- 苦手な再帰も少しは上手になりました。
- いもす法
- 汎用性の高さが素晴らしいです。
- 最小費用流問題
- マッチング問題を、ナイーブに実装していた時期が、僕にもありました。
- 二分探索
- 重いアルゴリズムを実装する時の気持ちが軽くなった
- 詳しくは続きへ↓
ハマり込んで良かったこと
重いアルゴリズムを実装する時の気持ちが軽くなった
仕事でもアルゴリズム考案と実装を繰り返しています。そのとき、実装が重いと、「何かもっと簡単なアルゴリズムに変えるかー」とか、「時間があるときにしよっと」と考えがちでした。
それが、競技プログラミングで高速実装を繰り返していると、「とりあえず実装してから考えるか」くらいに気軽に実装できるようになりました。
変数名を手癖でiとかiiとかにしてしまいがちなので、そこだけ注意しています。
自分の立ち位置を確認できた
ちょっとやそっとの努力では、トップ層には決して敵わないことが身にしみました。
中学生や高校生の参加も多く、しかも強い。僕がゲーム制作のためにプログラミングを勉強し始めたのが中学生。その頃に競技プログラミングに出会っていたとしても、とても勝てる気がしません。若さだけではない、素養の違いを感じます。
それだけに、自分が今、何で戦えているのか、そして今後も何なら戦えそうか、考えるよい機会となりました。
目標を思い出せた
仕事で新しいものづくりをしているせいか、プライベートでの創作意欲が湧きづらくなっていました。
そんなときに、与えられた課題を解き、その良し悪しがすぐにフィードバックされる競技プログラミングは、非常に甘美だったわけです。暇さえあれば過去問の考察をするくらいハマりました。
そして、上述のように自分の立ち位置を知るとともに、僕が「勝てること」ではなく「勝ちたかったこと」を思い出すことができました。競技プログラミングで活躍する若い人たちの熱に、焦らされたのかもしれません。
引退理由
そういうわけで、僕の目標へ向かう時間を作るために競技プログラミングはスッパリ辞めました。競技という特性上、研鑽を続けない限り、待っているのは停滞ではなく凋落だからです。
初参加から半年間くらいは、新しい知見を得ることが楽しいから精進を続けていて、レーティングが後から上がるという理想形でした。しかし、ある程度以上のレーティングを目指すには、あまり興味のない分野の勉強も積む必要がありました。だんだんと、レーティングのために精進するという、理想の真逆になってしまったのです。
そのことからも、辞めどきだったのだと思います。目的と手段が入れ替わっていることに気づいたら立ち止まって考える。僕が大切にしている考え方です。
おわりに
こんなに熱くなったのは久しぶりだぜ、というくらいに熱くなれました。その点だけでも、競技プログラミングにはとても感謝しています。
その感謝と熱さを残すために、この記事を書きました。
みなさまもよい競プロライフを!