AtCoderのコンテスト参加68回目で緑コーダーになれたお話
はじめましての方ははじめまして、かっつんと申します!
AtCoderを開始して約一年半、コンテスト68回にしてAtCoder開始時からずっと目標にしていた緑になれました!
色変記事では~色になるまで自分がやったことを書く人が多い印象が個人的にありますが、今回の記事は緑になるまで停滞してた時期に自分がどう考えたのかや、競技プログラミングに対する自分の思い等自己語り中心の記事になりますがご了承ください。
自分のバックグラウンド
大学では情報科学科という学科で学んでいて大学院でもコンピュータサイエンスを学んでいました。
ただ学部時代は本当にプログラミングが苦手でコンパイルエラーをなかなか直せなかったり、一通り基本的なプログラミング言語の文法(if、for、while等)をおさえた後もいざそれらを使って何か自分の頭の中をコードにしようとしても書けずにそれが何故かもわからないという状態でした。
そういう状態でしたので当時プログラミングにはかなり苦手意識を持っておりました。
大学院に進んでからプログラミングの課題を色々こなしていくうちに苦手意識は大分マシになりましたが、プログラミング自体を好きと言えるかはその時はまだ怪しい感じでした。
競技プログラミングとの出会い
きっかけは昨年のちょうど大学院も卒業する直前でそろそろ就活しないとなぁというタイミングで(諸事情で僕は大学院卒業後に就活しております)偶然Google検索でAtCoder Jobsの「採用担当者の方へ」というページがヒットして知りました。(何て検索ワードで調べたかは忘れました)
そこに「AtCoder ランクとは」という項目があったのですが当時AtCoderを知らなかった僕はランクごとのレベルの高さに衝撃を受けたのを覚えております。(当時各色のすごさを知らなかった自分から見て真ん中くらいに位置しているBランク(水)に他社評価システムであれば最高ランクと書いてある等)
このようなレベルの高い環境にいけば自分を少しでも変えられるかもしれない、そう思って始めたのがAtCoderを始めたきっかけになります。
実際に競技プログラミングを始めてみて
学部時代はプログラミングボロボロだった自分ですが大学院で苦手意識も大分マシになっていたのもあり(若干は残ってましたが)初回とはいえそこそこはいけるんじゃないかなと思ってたら見事に初回のコンテストは一完でボコボコにされました。
ただ、その後も継続してコンテストに参加したり精進していくうちにACという文字が出た時の達成感や大学時代に学んだアルゴリズムとデータ構造の知識(当時は何に使うんだこれとしか思えず学ぶモチベも上がらず講義で学びはしたが何も身についてなかった)が実際にコードで活かされ、それにより目に見えて実行速度が速くなることを見て「昔学んだことってこういう時に使うのか!」と身をもって実感できて感動した記憶があります。
計算量という昔は全く意識してこなかったことを意識するようになり、それを意識するようになってからアルゴリズムとデータ構造って面白いなと思えるようになれたので競技プログラミングには本当に感謝しております。
また、競技プログラミングを始めたと同時に競技プログラミング用のTwitterアカウントを作って様々な競技プログラマーの方と繋がった影響で、数々のすごい方が競技プログラミングに取り組んでるのを見て刺激になりましたし励みになりました。
何よりも競技プログラミングをきっかけに昔はなかなか好きになれなかったプログラミング自体を楽しいと思えるようになり、競技プログラミングの精進をきっかけに競技プログラミングだけでなく、それ以外の技術的な勉強も自発的にするようになったので、(競プロを始める前の自分は課題を解いてる時以外プログラミングもその他技術的な勉強もほとんどしていなかった)本当に競技プログラミングをきっかけに自分の考え方も変われたような気がしているという点でも本当に感謝しております。
競技プログラミングについて自分が思うこと
あらかた競技プログラミングについて自分が思っていることは一個上の項目で書いてしまって項目の分離をミスった説がゲフンゲフン
一つ上の項目でアルゴリズムとデータ構造を用いて計算量を高速化する楽しさについて語りましたので、ここでは自分が個人的に思っている他の競技プログラミングの良さについて語ります。(どちらかというとプログラミング入門者~初心者の方々向けの話になると思います)
バックグラウンドのとこにも書きましたが自分は学部時代は情報科にはいましたが長い期間「プログラミングの文法は基本的なものはわかった(つもり)がいざコードにしようと思うと何故か自分の脳内でやりたいと思っている動作をコードにうまく変換できない(たとえifとforしか使わないコードでも、それら一つ一つの構文はわかるはずなのにうまくコードにできずに理由もわからない)」という状態に悩まされていました。
しかし、コンテストをきっかけに与えられた問題を見て、やりたい動作を素早くコードに落とし込む力を鍛えられたと思っております。(個人的にはこの脳内で思っているやりたいこと→コードへの変換はプログラミング入門者~初心者の方達の最初の壁だと思っておりますのでこれを競技プログラミングで鍛えられるというのはとてもよいところだと思いました)
実際に実務でも、直接的にコードの計算量高速化に関わる機会があまりない職場だとしても、この脳内でやりたいと思った動作をコードとして実現するおおまかな実装方針をサッと思いつく力(コードが合っているかどうかはおいといて)はとても大事な力なのではないかなと個人的に思っていたりします。(まだ実務経験が自分はほとんどないので自分の勝手なイメージですが)
なのでプログラミング入門者~初心者の方がABCのA問題やB問題をたくさん解くというのはプログラミングの最初の壁(と自分が勝手に思っている)を乗り越えるとてもよいトレーニングになると思いますしそういう点でも競技プログラミングはオススメだと自分は思っております。
停滞期に自分が考えたこと
自分がTLで観測した範囲の話になりますがAtCoderのレートは上がるスピードが人それぞれかなり違っていて、緑まではさらりと行く人もいれば灰色~茶色でかなり苦戦されている方もいますし、他の優秀な方々と比べたり、精進の成果がなかなかレートに反映されずに停滞してしまい、そのうちコンテストに出なくなってしまった方達もチラホラ観測していました。
自分自身も一時期は精進してもレートに反映されなかったり一度レートが上がったと思ったら次のコンテストでまた一気に下げるを繰り返したり解けるようになったつもりの分野がコンテストで出ると何故か解けなかったりで辛く感じた時期はありましたが
- 他の人の成長スピードや精進量と比較しない(過去の自分と比較する)
- 比較はしないけど他の人の楽しんでる姿や頑張っている姿は見てリスペクトする
- コンテストでレート下がっても気にしすぎない(学びがあった点、解けなかったけど面白かった問題について考える、結果的に下がっても〇問題解けた自分えらいと考える、温まった時に全力で喜ぶようにする等)
- レートではなくコンテスト参加回数を自分の達成感の指標にする
- 初心を思い出す(最初に競技プログラミングやった時の楽しい気持ち、頑張ろうという気持ち等)
- レートという結果に出なくても自分は成長していると信じる(普段精進はあまりできていなくても、コンテストに参加して復習したり反省するだけでも何かしらの成長に繋がると信じることで結果が出なくてもコンテストに参加し続けるモチベを自分は維持し続けられました)
- 精進した時はその精進で得たものに関して達成感を感じるようにする(解説ACなら学びになったことを考える、昔解けなかった問題を自力ACできたらめちゃくちゃ喜ぶ等)
- 精進自体がレートにすぐに反映されることはあまり期待しすぎない(まあ、すぐには反映されないだろうけどいつか反映されたら嬉しいなぁ…くらいのお気持ち。結果的に反映されたコンテストあったら超喜ぶことにする)←割と重要な気が個人的にしているポイント
- 自分を褒めまくる(コンテスト参加しまくって偉い、レートは下がったけど前まで苦手意識ある分野がC問題に出たにもかかわらず解けて偉い、冷えたけど四完した僕ちん偉い等)
- 何より楽しむ、競プロに限らずにその時の気分に応じて自分がやりたいことをやる(やりたい気分の時だけ精進して、気分じゃない時は他のことやったり、マイペースにやりたいことをまったりとやっていく気持ちで精進もコンテストもその他のこともやっていく)
- 他の方がAtCoderであまり使っていない言語で問題を解いてLanguage Owners1stを取って一人で自己満足のドヤ顔をしてニヤける
あたりを意識して取り組むようになってからは(ちゃんと上記のが全部できているかは怪しいですが)一回一回のコンテストの結果はそこまで気にならなくなりましたし(と言ってもやはりレートが下がると少しは悲しくなりますが、立ち直りは早くなった気がします)コンテストが辛かった時期と比べたら競プロもその他のやりたい勉強も楽しめるようになれたのかなーと思います。
それ現実逃避じゃねと言われたら号泣します
〇〇さんは△回で~色になったのに自分は(以下略)みたいなことを話している人をたまに見かけますが、僕は上を目指して頑張ること自体すごいことだと思いますし、そんな方々がたくさんいる環境だからこそ自分も続けてこれたのだと思っています。
自分が個人的に好きなツイートでLillianさんの下記のようなツイートがあります。
どの世界でも、強くなるには無限の向上心を持った努力モンスターになることが最低条件。
— Lillian (@Lily0727K) April 30, 2019
頑張ってる人たちのなかでさらに勝てるかどうかは、努力の方向性と効率、適性で決まる。
ただ世の中の大半の人はそもそも努力してないから、真面目に頑張るだけでそれなりのレベルには必ずたどり着けると思う。 https://t.co/Ra68rErDXI
競技プログラマーは上を目指している方達だらけですので、そういう方達に勝てるかどうかはわかりませんが、結果はどうであれそういう方達に少しでも追いつきたい、近づきたい、追い抜きたいと思う気持ちでその人たちの背中を追い続けたり、努力を続けてる方達を僕はすごいと思います。
競技プログラミングに限らず上を目指したい事に関してはどれもそれなり(僕にとっては、はるか先の高いレベルに感じるくらいですが)のレベルにたどり着ける日を信じて日々コツコツがんばりたいなーとこのツイートを見るたびに思えるのでたまに見返したくなるツイートだったりします。
実際に自分が日々コツコツ頑張れてるかは怪しいけど。(遊ぶのたのちぃ)
もう全員えらい、すごい、天才!僕天才!!(他の人を褒めまくると見せかけて最後のセリフが言いたかっただけ)
これからのこと
AtCoderを始めた時の一番最初の目標であった緑は達成できましたが、自分としてはまだまだ上を目指したい気持ちはありますし、何よりもコンテストに参加するのは楽しいので今後も参加できる時は参加し続けたいなという思いでいます。(精進に関してはこれまで通り気分がのった時はやったり、他にやりたい勉強あったらそっちを優先したりマイペースにやっていこうと思います。その方が自分の場合は長く続けられる気がしますし。)
上を目指すとは言いましたがこれからも一回一回のコンテストの結果は気にしすぎず自分のペースで少しずつゆっくりでも成長していけたらいいなと思っております。
長くなりましたがここまで読んでくださった皆様本当にありがとうございました。