競プロは何の役にたったのか?そしてこれから

競プロ始めて8ヶ月、何の役に立ったのか

プログラミングのスキル向上のために始めた競技プログラミング(AtCoder)。かれこれ8ヶ月が過ぎました。始めてみると意外と面白いこともあり、かなり熱中して進めてきましたが、これが何の役に立ったのかを振り返ります。そしてこれからの付き合い方について。

pythonで競技プログラミングはじめました。atcoderでレーティング灰色です。まずは目指せ茶色です。PASTは初級でした。単純にコー...

コンテスト、問題を解くことから得られるもの

競プロの問題を解くことから直接的に得られるもの。それはやはり筋の良い解法を使って解くことの大切さを知ることだと思う。この「筋の良い」と言うのは「賢い」とか「よく考察して」とか言う意味だけではない。愚直に解く方法でも制約条件を満たし、十分早くコーディングできるのであれば、それは筋の良い解法なのである。

これはプログラミングだけでなく、日々の業務の中でも活かせる感覚であると思う。スマートでなく泥臭い方法であっても、それで自分の求める仕様を満たせるのであれば十分に良い、という新たな視点を得ることができた。以前から気づいていたかもしれないが、それをはっきりと意識できたのは競プロのおかげである。もちろん、問題について考察し、解くべき問題が何か、その本質を考えて効率的に問題解決を試みるのも同様に大事であることは言うまでもない。

あとは、手続きを正確に実装すること。解法を脳内に思いついたあとは、それを適切にコーディングしプログラム上で動作を再現させなければならない。始めたばかりの頃は、言語の仕様もよく理解しておらず難しかったが慣れてくるとできるようになってきた。アルゴリズムを考えることも当初は難しかったが、徐々に慣れていった。問題の考察にアナログなノートとペンが欠かせないのは意外だった。ノートにペンで単純なケースを解いてみたり、脳内に浮かんだアルゴリズムを文章で書き起こして明確化したりと何かと役立つ。仕事上でプログラムと関係ない問題を扱う際もこのスタイルは役に立つので採用した。(これも前からやっていた気もするが、競プロでよりはっきりと意識して使えるようになった。)

また、コンテスト中に襲ってくる強烈な時間的、精神的プレッシャーとの戦いも重要な要素である。これらのプレッシャーの中、常に冷静に戦い続けなければならない。諦めずに制限時間内、精一杯頑張るのである。諦めずに戦い続けるためには、自分を信じ鼓舞し続ける態度が必要だ。自分の能力への疑いがあると、思考が乱れて競プロのような頭脳を使う作業は集中して行うことができなくなってしまう。

近年の生活の中ではここまでプレッシャーを感じながら物事を行うことが少なくなっていたので、このプレッシャーが心理面を鍛えるのに有効だと感じた。

でも、どんなに頑張っても解けない問題はたくさんあることもまた事実。そういう問題と遭遇した時、どのように対処するのかを考えられたのも有意義だった。頑張れば解けるのか、それとも頑張っても解けないのか、解けないのであればどうするのか。人生も同様に到底解けそうもない難問と遭遇したりするものだ。大袈裟だが、そういう種々の問題にチャレンジするための方法論を競プロからは学べた。

何故問題が解けないのか 競技プログラミングを2020年4月に始めて、2か月半くらい経ちました。 ほぼ毎週末行われ...

直接的に業務に役立ったこと

もっとわかりやすく直接的に役に立ったこともある。自分の業務上の課題をpythonで処理できたことだ。おそらく競プロをやっていなければできなかったことだと思う。

実際作ったのはデータをCSVから読み込んで、scipyで処理し、処理結果を一定の手続きにそって抽出し計算する。計算データは配列に格納しグラフを書いてファイルに出力する、というスクリプトだがそこかしこで競プロで獲得したスキルが使われている、と思う。開発速度も自分で期待する以上のスピードで終えることができた。

スクリプトの内容自体は絶対に競プロでなければできなかった、と言うものではないが、あの仕事の完成においては半年以上プログラミングに熱中する環境を与えてくれた競プロが貢献したのは間違いない。

そもそもが、競技プログラミングを始めた動機がpythonに習熟することだったので、業務に使用できるレベルまで到達できたのは良いことだ。今のレーティングは茶色だが、茶色でも十分、自分の用途においては通用することもわかった。

大事なのは役に立つより楽しいかどうか

でももっと大事なことは役に立つかどうかよりも楽しいかどうかと言う問題だ。

単純に、プログラムを作り自動的に処理させて問題を解くこと自体が非常に楽しい。知らないアルゴリズムを勉強し、その仕組みを自分で実際に手を動かしながら理解することはとても楽しい。動的計画法や、DFS、BFSといった探索手法はその仕組みを知るまでは魔法のように見えるが、その仕組みを理解し自分の手で実装し動かした時の感動。使いこなすところまでは達していないけど。競プロのおかげで忘れていた数学的概念を思い出したり、あるいは新たに勉強したりもした。(剰余演算の話とか) これらもなんだかんだ役に立つし、勉強していて楽しかった。

また競プロが自分の視野を広げてくれたことは間違いない。職場ではソフトウェアの技術者と話す機会や共通の話題を与えてくれた。twitter上でも新たな人たちと交流することができた。

そしてこれから

そして、これからを考える上で、楽しいかどうかと言うことが問題なのである。どんなことでも始めたばかりの頃は上達が目に見えてわかるし楽しいものだ。しかし続けていくうちに自分の能力や高レート者との圧倒的な差に気づくことになる。

この「レート」が問題である。どうしても気になってしまう。しかも絶対的な指標でなく相対的な指標なため、常に進み続けなければその場に止まることすら叶わない(と感じてしまう)と言うプレッシャー。レートを下げたくない、と言うプレッシャー。

それも競技ならばそれも当然のことだが、私はどれだけの時間を競技プログラミングに注ぎ込めるだろうか。睡眠時間を削り平日や土日の夜を競プロに費やしてきたわけだが、それをこの先も続けていけるだろうか。いや極端に寝不足になるまでやり込んでないけど、コンテストに出るために寝ないで起きてた時もあるしさ。

こんな考えが浮かぶのは、早い話が熱が冷めた、と言うことだ。Atcoderのおかげで、自分の業務で使えるぐらいには、pythonのスキルが向上した。今後は業務上でどんどん実践して鍛えることもできる。これは当初の期待に十分に応えた成果と言える。ありがとう、競プロ。また、熱が戻ってきたら再び、コンテストにも出ていこう。その日まで、さようなら。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする