はじめに
ABC268で入茶したので、やってきたことや考えていることを記録しておきます。
アカウントはこちらです。
記事の投稿後に灰色に戻ったりするかもしれませんが、その時はニッコリ笑って見なかったことにしてください。
3年といってもほとんどブランクじゃねーかって話なのですが、嘘じゃないので!
書いている人のバックグラウンド
- 職業プログラマーとしてある程度年を食ったのでプログラミング自体に苦手意識はない
- ただし、アルゴリズムといえば全探索くらいしか思いつかない
- 数学ができない
- 義務教育レベルは問題なかったが、受験レベルにはついていけず
- 高校数学は在学中でも身につかず、高3で数学にさよならバイバイ
- 数学にサヨナラしてからどれだけの時間たっただろう…
- たぶんフルタイムワーカーにしては時間があるほうで、それなりに競プロのための時間をとれる
現状の戦績
C問題は基本解けず、2完で終わることが多いです。C問題は簡単だった場合や運が良かった場合は解けるかもしれないという感じです。
それでも茶色になったので、C問題があまり解けなくてもABが早く解ければ茶色にはなれるということになります。(少なくとも現状は)
スタンスとメンタル維持について
個人的にはこれが一番重要だと思っているので先に書きます。ご覧の通り、私は二度の挫折を経て今回が三度目の挑戦です。なので、それなりに色々考えておかないと三度目の挫折が普通にあり得ます。
それを避けるために意識すべきと考えたのは以下の通りです。
- 現状自分は初心者と自覚する
- まずは参加だけを目標に
- レーティングはあまり気にしない
- 他人と比較しない
- 強くなるには時間がかかる
- 逆に、時間をかけて継続していけば強くなる(はず)
- Twitterは上澄み
- ゲーム感覚で楽しむ
どちらかといえば緩く長く続けるための指針で、短期で効率よくレーティングを上げることを全く考えていません。
現状自分は初心者と自覚する
私は職業プログラマーですので、プログラミング自体には苦手意識はありませんでした。勘違いでなければ仕事はこなせているし、業務外でも勉強していてそれなりに力があると思っていました。
しかし、競プロでは成果が出ませんでした。まさかの灰色、参加さえすれば付く一番下のレーティングから抜けられない。ショックでした。ショックに耐えきれずに目を背けたというのが以前起こったことです。
しかし、よく考えてみたら当然のことでした。自分はいろいろやってはきたものの、どちらかといえば新しいプログラミング言語を学ぶとかそういう方向に時間と労力を割いていて、アルゴリズムについてはちゃんと勉強したことがありませんでした。アルゴリズムを実装することについては愚直な全探索と標準ライブラリの機能の組み合わせくらいのことしかできませんでした。(それで職業プログラマーができるのかといえば、まあできる場合もあるわけですね…)
それに最初に書いた通り、私は数学力が壊滅的です。数式を見たら目眩がするので、問題文を読み解くだけでも一苦労です。それにC問題以降は数学的考察がほぼ必須なので、私が全然太刀打ちできないのも当然のことでした。
C問題なんて全然「数学」なんてレベルじゃないんだが、という感想を抱かれた方も多いと思いますが、私からするとそれなりに高度な数学です。そんなレベルなので、競プロに関しては初心者と言わざるを得ません。。。
逆に言えば、自分は初心者だと自覚することで辛さが消えました。できるはずなのにできないというギャップがなくなりました。初心者なのでできるわけないじゃんっていう。
それなりに長く職業プログラマーをやってきたのに初心者とは、とそれなりに心理的抵抗はありましたが、現にC問題が解けないという圧倒的事実を前にしたら認めるしかありませんでした。
ここが出発点となりました。
まあC問題が解けないだけでなく、あまり実装が速くないのでABでもたついたりWAを出すこともあったり、最悪Bが解けないこともあったので、根本的にプログラミング能力が低いのでは…?という気もしたのですが、それも含めて現実を直視するようになりました。
まずは参加だけを目標に
競プロに限った話ではないのですが、一般に新しいことを始めるにはスモールステップという考え方が重要です。いきなりすごいことをしようとせず、簡単に達成できることから始めて段階的に難しくしていくのが有効です。
なので、まずはコンテスト結果に対する目標は一切設けず、ただ単に「コンテストに参加する」ことだけを目標としました。参加さえすれば、どんなに悲惨な結果となっても目標達成です。経験上、「そんなんでいいの?」ってことから始めたほうがうまくいきます。なので競プロにもそれを適用しました。
これにより、コンテスト参加を習慣化することができました。
レーティングはあまり気にしない
レーティングが上がればうれしいのですが、実際入茶したのはウッキウキで色変記事を書いちゃう程度にはうれしいのですが、実はこれまでレーティングを上げること自体は目標としていませんでした。その理由は、レーティングは相対評価だからです。これは、レーティングが決まるための変数に、自分の実力以外のものが含まれているということです。
自分の実力が上がったとしても、他の人の実力がもっと上がっていればレーティングは上がらないかもしれません。これは周りの人の身長が伸びたらそれに合わせて伸びてしまうものさしで自分の身長の推移を測ろうとするようなものです。レーティングは実力を測るものさしとしてはイマイチです。自分の実力は、自分の実力だけが変数となるものさしで測るべきです。たとえば、以前解けなかったタイプの問題が解けるようになったかどうか、などです。
もちろん、ある程度のところまでは実力がつけば普通にレーティングは伸びるのだろうと思います。そうなれば普通に喜びますが、それは結果としてついてくるもので、それ自体を目標にはしていません。
相対評価ということは勝てる人ならどんどんレーティングを上げられますので、勝てる人が目標にするならいいのですが、現状の私は明らかに勝てる人ではありません。
他人と比較しない
これは上と同じような話ではあるのですが。自分と他人は生まれ持った才能、これまで培ってきた能力、熱意、精進にかけられる時間、などなど全て違います。勝てない相手にはどうあがいても勝てません。なので、自分と他人は比較しないほうがいいです。比較するなら先週の自分と比較するのがいいと思います。
強くなるには時間がかかる
これを事実として認めることができれば、辛さはだいぶなくなります。短期で強くなる人もいるにはいますが、そういう人は只者ではないので気にしても意味がありません。私は凡人ですので、強くなるには時間がかかります。短期で成果を出そうと思わないことです。
逆に、時間をかけて継続していけば強くなる(はず)
これについては本当にそうであるのかまだわからないのですが、たぶんそうだろうと思ってのんびり構えています。
一般的に、実力とは無理やりつけるものではなく、長期的に取り組んでいたらいつの間にかついているものだと思います。個人的な経験でも、勉強だったりスポーツだったり、ゲームだったり、それを実感することが色々ありました。競プロもたぶんそうでしょう。
まあ実際に時間をかけてみた結果、強くならなかった場合はなかなか精神的にきついとは思うのですが、あまりそれは心配していません。仮にそうなったとしたら取り組み方が何か間違っていたか、もしくは強くなったかどうかの判定方法が間違っているか(レーティングで測ってしまうとか)のどちらかだと思うので、なぜそうなったのか冷静に考えてみるのがいいと思います。
Twitterは上澄み
そもそもTwitterをやらないなら関係ないのですが、私はTwitterで競プロ界隈に入りたいと思いました。その場合に意識すべきなのがこれです。
どこかで同じことを書いていた方がいらっしゃったような気もするのですが、実は私がそう思う理由は他にもあります。「Twitterは上澄み」とは、実は以前私がやっていたソシャゲ界隈でも散々言われていたことなんですね。Twitterにはガチ上位ギルドの有名プレイヤーがゴロゴロいて、気軽にリプを投げあっている相手が化け物レベルの人だったりしました。そして、そのような人たちを見て落ち込んだり焦ったりして結果引退してしまう初心者を多く観測しました。おそらく競プロ界隈も似たようなものなんじゃないかと思いました。根拠としては薄いのですが、他にも「業務外で勉強するITエンジニアなんて滅多にいない、Twitterに多いだけ」という主旨のツイートが話題になったりもしました。どんな界隈でも、Twitterは一般にそうなのではと想像します。
なので、Twitterで水色とかの人がゴロゴロいたとしても、全然気にする必要はありません。それはおそらく上澄みです。
ゲーム感覚で楽しむ
色々書きましたが、結局これなんでしょうね。いくらメンタル維持のための理論武装をしたところで、楽しくないのであればそもそも継続して取り組む動機がありません。もちろんスキルアップのために取り組むという動機はあり得ますが、個人的にはスキルアップだけのために競プロに取り組むのは割に合わないような気がします。競プロで伸ばせる力が役に立つということについては疑っていませんが、そのためにけっこうな時間と労力がかかりますので、純粋に時間と労力の投資先として考えたときには、その投資に見合うだけのリターンが得られるかどうかはなんとも言えません。
また、私のような人間が職業プログラマーの端くれであるように、アルゴリズム力があまりなくても十分貢献できるような開発プロジェクトは多くあります。その場合、競プロで培った力はオーバースペックとなり、そこに時間と労力をつぎ込むより他のことをやったほうが仕事の役に立つのでは、となる可能性があります。
しかし、楽しいのであれば話は別です。そうであれば、楽しいことができる上に力がつきお得、ということになります。なので楽しいならやる、楽しくないならやらないとシンプルに考えるのがよいかと思いました。
私自身は、以前取り組んでいたときは純粋にスキルアップ目的で楽しくなかったです。しかし、色々と開き直ってからは途端に楽しくなりました。たしかに時間と労力は吸われているのですが、楽しいので全然苦ではありません。
取り組んでいることなど
ここからは取り組み内容について書いていきます。
やったこと
APG4b
当初はC++でやろうと思いましたので、まずはC++について勉強しました。AtCoderでAPG4bというC++学習コンテンツがありますので、これを一通りやりました。競プロに特化していますので、C++のたくさんある機能のうち競プロで必要な分に絞って学ぶことができるので効率的です。
また、計算量など競プロで必要な一般的な知識も学べました。素晴らしい教材だと思います。
後述の通り今はC++は使っていないのですが、それでもC++で書かれた解説コードを読んだりはしますのでここで学んだ内容は引き続き役に立っています。
ABSの問題を一通り解く
まあ実は3年前に解説ACをしていたのですが、今回は解説を見ずに普通に解きました。一応解けたのでよかったです。
Twitterで競プロ界隈の人をフォロー
目に入った人全員ってわけではないですが、それなりの人数の方をフォローしました。前述の通り、上澄みを見て落ち込んでしまう可能性があるなどデメリットもありますが、間違いなくメリットもあります。ソシャゲでも思いましたが、Twitterにはイベント後(競プロの場合はコンテスト後)にわちゃわちゃすることで楽しさを増幅させる力があります。
提出コードや感想をシェアすれば「いいね」がついて嬉しかったり、自分より強い人が色々教えてくれたりして嬉しいこともあります。自分と実力が近いと思われる人をライバル視することで、高め合うこともできるかもしれません。
なので、Twitterを活用すればより楽しくなり、実力アップにも役立つ可能性があります。
ただ、「いいね」がモチベになってしまうと自分のモチベが外部要因に左右されることになってしまうので危険性はあります。炎上などのトラブルもあり得ます。なのでTwitterは万人に勧められるものではないですが…
やっていること
競プロのための取り組みとしては継続してやっていっていることが多く、完走したものはあんまりないですね。
継続してやっているのは以下のようなことです。
ABCに参加する(基本Ratedで)
実は、コンテストの存在が競プロに再チャレンジしようと思った理由です。問題を解くことは有益と思いましたが、コンテストという形で半強制的に問題を解かされることで問題を解く習慣がつくのが良いだろうと。なので、コンテストにはできるだけ毎週参加するようにしています。
ただ、現状はABCだけです。ARCとAGCはちょっとまだ厳しいかなと思って参加していません。また、コンテスト参加はそれなりに負担があり、せいぜい週一が限界と思っているので、AtCoder以外のコンテストには現状手を出していません。
コンテストの負担が重いというのは、コンテスト時間中の撤退をあまりしないで時間中考え続けることが多いのと、後述の解説ACや参加記の執筆もセットで考えているのが理由です。
あとはどうでもいいのですが、私の普段のライフサイクルですと本来は21時はお風呂に入る時間なので、コンテストの日だけずらしているのが若干のストレスになります。それが週二とかになるとけっこう嫌です。
コンテストでわからなかった問題を解説ACする
ある意味、これのためにコンテストに参加しているのかもしれません。コンテスト中に考えて考えてそれでもわからなかった問題は答えを知りたい欲求が最大限に高まっていますし、わからないなりに可能な範囲での考察はできていますので、解説を見て理解することで効率よく吸収することができます。(よく理解できないこともありますが…)
なので、わからなかった問題を解説ACしないのは大きな機会損失だと思います。
着手すらしていない問題についてはやらなくていいと思います。
あと、解けた問題の解説はチラ見したりしなかったりします。瞬殺した問題はあんまり見ませんが、苦労した問題は見ることが多いです。
コンテストの参加記を書く
こちらで書いています。(Qiitaじゃないのはなんとなくです)
解説ってほどのことはあまりできないので「参加記」です。記事にまとめようとすることで理解したことを脳内で再構築するので、学習効率が高まるような気がします。後で見返すことで復習にも使えますし、ズラッと記事の一覧が出るのを見ると、頑張ってきたんだなあと思えて元気が出ます。
なお、解説AC~参加記の執筆はけっこう時間がかかるので、コンテストの翌日が休みだと非常に助かる感じです。
過去問を解く
結局過去問を解いた数だけ強くなるのかなと思って、毎日解くようにしています。当初は簡単な問題ばかり解いていました。(ABCのAは全部埋まりました)
それはそれで意味はあったと思いますが、やはり解き方がわからない問題について考えて、解説を見て理解することのほうが重要度が高いと思ったので、最近はC問題にも手を出すようになりました。
C問題は解けませんので積極的に解説を見て学ぶスタイルです。ただし、自分には解けないと明確に理解するところまでは考察を進めます。ただ、効率を上げるために時間で区切ってしまう手もあるかなとも思っており、どうするのがいいのかは模索中です。
ここで解説ACした問題についてのメモをZennに上げることもあります。
毎日C問題、といきたいところですが、現状は解説を理解するのにすごく時間がかかるので、時間的な負担を軽減するために隔日で解いています。競プロ以外にもやりたいことはあるので。
ちなみに、安定して茶パフォを出すならC問題よりAB早解き力を鍛えたほうがいいかもしれませんが、個人的にはCが解けるようになりたい欲求のほうが強いです。
なお、AtCoder ProblemsのStreakはできるだけ切らさないようにしています。記事執筆時点で40日くらい続いています。
これもメリットデメリットがあります。現時点ではStreakを切らさないことを目的にするといわゆる虚無埋めになってしまいますが、実は虚無埋めってけっこう楽しい気がしています。それに、簡単な問題が尽きてしまえばStreakを切らさないためには難しい問題をやらなければならなくなるので、最終的には難しい問題を解く習慣に繋がります。
デメリットとして考えられるのは、長く続いたStreakが何かの拍子に切れてしまった場合、途端にモチベが下がる恐れがあることでしょうか。また、Streakを切らさないために解説をあまり理解しないうちに解説コードをほぼそのまま書き写してACみたいなことをしてしまうと、それに味をしめて何度もやってしまって完全に目的を見失ってしまう恐れがありそうです。
考えられるのはこんなところでしょうか。まあこれはちょっとどうなるか想像がつかないので、あくまでも問題を解く習慣付けが目的と意識して、切れてしまったり切れてしまいそうになったとしても、まあそれはそれでいいかと考えるようにしたいと思います。
数学(算数)の勉強
数学力が壊滅的だと書きましたが、正直これは致命的だと思いました。これをなんとかしないと早晩行き詰まります。なので、数学の勉強をちまちまとやっています。まあ、根本からやり直したほうがいいと思ったので、算数から始めていて、まだ数学の段階まで進んでいないのですが。
算数レベルはさすがに…と思ったのですが、けっこう忘れていたり、簡単な計算でもすごく頭が疲れてしまうなどの問題に気づくことができたので、算数から始めてよかったです。
計算は機械にやらせる生活を長年続けてきたので、自分で計算する能力がすごく退化している感じがしました。これで数学的考察などできるわけがありませんね。
これは効果を実感できるようになるまですごく時間がかかると思いますので、練習問題を解けてうれしい、みたいな小さな喜びを一つ一つ積み上げていく感じでやっていきたいと思います。
やっていないこと
ABC以外のコンテストへの参加
前述の通りです。
典型アルゴリズムを学ぶなどの学習
こういった学習をするよりはむしろ過去問に触れることで、それを解くのに必要なアルゴリズムを遅延評価勉強法で身につけるほうが学習効率は高いのかなという気がします。
(そういう意味だと過去問を解くペースはもっと上げたいのですが、なかなか時間リソースが厳しいです)
まあやらないよりは絶対やったほうがいいとは思います。アルゴ式とかやろうと思って少し進めましたが、ちょっと止まってしまっています。余裕を作って再開したいとは思っています。
競プロ関係の本を読む
私は本を使った学習が好きなのですが、今のところできていません。まあ実は何冊か挑戦はしたのですが、挫折しました。
競プロ典型90問を解く
何問かは解いたのですが、過去問でいいのではと思って途中で止まりました。過去問とは違うメリットを実感している方がいらっしゃったら教えていただけるとうれしいです。
習得したアルゴリズム
何も見ず実装できるとは限らず、どのような時に使えるかわかる、くらいの感覚です。
- ビット全探索
- DFS
- 累積和
- 二分探索
あんまりありませんね…
開発環境など
使用言語
Kotlinを使用しています。当初はC++を使っていましたが、現状のレベルだとどの言語を使っても大差ないと思って、あんまり慣れていないC++を頑張って習得するよりも慣れている言語でやればいいかと思い直しました。
Kotlinはここ最近仕事で使っていて慣れている、それなりに簡潔なコードが書ける、実行速度もそこそこ、ということで私にとってはなかなかの好条件を備えた言語です。
競プロのため(だけ)に何か言語を身に着けようとしている人にKotlinを勧めるかどうかはわかりませんが、既に習得済みの人が競プロでも使うとか、親和性の高いJavaを習得済みの人が移行するとか、Kotlinでやりたいことが他にもあるとかだったらすごく良いと思います。
まあKotlinに固執するつもりはないので、このあたりはもし問題があれば柔軟に対応しようと考えています。
開発環境
Kotlinは完全にIDE前提の言語だと思いますので、IntelliJ IDEAでやっています。テストケースの実行は入力を手動でコピペ、回答コードもコピペという原始的な方法でやっています。手動だとミスる恐れもありますし、大量入力をテストするのが難しいので良くないとは思っています。
そういう意味だと現状は競プロ開発環境の構築を真面目にやっていないですね。まあ必要性を痛感したらやろうくらいのスタンスです。
これまでの歩みや今考えていること
ここからはポエムとなります。ここまでもポエムだった可能性もありますが、ここからはさらにポエム度が増します。特に有益ではないと思います。
競プロを始めるまで
当初の競プロとの関わり
競プロという言葉自体はかなり昔から聞いたことはあったと思います。当時は「なんかすごい人達がC++でなんかすごいことやるらしい」みたいな、合っているようなそうでないようなよくわからない認識だけがありました。
実はC++を実務で触ったことが少しあったのですが、そのときに強い苦手意識を植え付けられましたので、その時は自分も競プロをやってみたいとは思いませんでした。(競プロとは絶対C++を使うものなのかと思っていました)
その後、コードを書いて転職できる転職サイトとしてpaizaを知りました。結果的には、これが自分の競プロの原体験となります。ただ、この時は純粋に転職サイトとして利用していて、自分が競プロをしているとは思ってませんでした。まあAtCoderみたいなコンテストがあるわけじゃないので、だいぶ毛色は違いますが。
なお、当時はRubyを使っていました。
今のpaizaはわかりませんが、少なくとも当時のpaizaの問題はあんまりレベルが高くなく、私でもAランク(上から二番目)になりました。ここでちょっと調子に乗りました。
AtCoderとの邂逅
それからまた時間が経ち、AtCoderを知りました。
手元のメモによると、どうやらこの勉強会に参加して知りました。4年前やんけ…
paizaに対する言及もあったような気がするので、今まで自分がやっていたのは競プロだったらしいとわかりました。(記憶が曖昧なのでこの辺若干怪しいですが)
アカウント自体はたぶんすぐ作ったと思うのですが、そこから1年放置しているわけですね。謎です。
ハロー!そして…グッドバイ!
1年放置した後、ついにコンテストに参加しました。ABC129でした。なんで参加するつもりになったのかは覚えていませんが、まあ放置しつつもいつか参加したいとは思っていたのでしょうね。
成績を見ると、AB2完のようでした。Cは提出履歴なし。全然わからなかったのでしょうね…
言語はRubyを使用していました。Rubyは好きな言語で、当時は何かやる時のファーストチョイス言語がRubyだったのですよね。最近は書いていないので忘れていそうですが。
ちょっと驚いたのですが当時のツイートが残っていました。なんというか、まるで成長していない
その後二ヶ月くらいは頑張っていましたが、結局そこでやめてしまいました。上で書いた通り、C問題が解けない、灰色から抜けられないとショックを受けたのですね。現実を直視できず、目を背けることを選びました。
たぶん、当時は競プロのための勉強とか精進とか何もせずにただ参加だけしていたと思うんですよね。自分はまあまあできると思っていたしpaizaではAランクになったので、特に何もしなくても勝手にそこそこのレーティングまで上がると思っていました。お恥ずかしい話ですが。
当時の気持ちとしては
まあそりゃあ勉強すればそれなりにできるだろうけどそこまでやる気はないし他にも勉強することあるしぶっちゃけ競プロとかあんまり役に立たないよねっていうか別に楽しくないからもういいよ(めっちゃ早口)
みたいな感じです。
ハロー!そして…グッドバイ!(二度目)
その後ABC164で一旦復帰しています。なんだかんだで悔しい気持ちはあったのと、ちょうど色々あって力を付けないとまずいと思っていた時期なので、それで再挑戦しようと思ったのだと思います。
ただ、結果は最初の挑戦の時と同じことになりました。当時どのような取り組みをしたのか全然覚えていないのですが、たぶん何もやってないと思います。なぜ挫折したのか反省なども特にせずただもう一回やっただけなので、当然の結果として同じことになりました。
ちょっと思い出したのが、当時いた会社にAtCoderをやっている人がいたので、その人と一緒に取り組んではいました。ただあまり芳しくはなく、B問題とC問題の落差が大きすぎるよねーとか愚痴り合って終わりました。現実逃避してAtCoder側に問題があるかのような発想になっていましたね…
(少なくとも私は)
ちなみに、この時もちょうど二ヶ月くらいで終わっています。どうやら「二ヶ月の壁」のようなものがあるようです。
ハロー!そして…グッドバイ…するかい?
それから三度目の挑戦をして今に至るわけですが、二度も挫折して堪えたのか、二年も間が空きました。
どうやら競プロは業務でのプログラミングとはだいぶ違うぞというのはさすがに気づいていましたが、それなら現状できないのも仕方ないのでは、勉強や精進をすればできるようになるのでは、という発想にはなかなかなりませんでした。いろいろあって精神状態が良くなかったこともあってか、自分には向いていない、無理だとマイナスな方向に思考が振れました。
普通ならそのまま完全に離れてしまうところですが、様々な偶然が重なって再度やってみる気になりました。
大きなきっかけの一つは転職です。転職先(現職)にAtCoderに取り組んでいる方か何人かいて、それに触発された形となります。自分よりずっと強い人がいたという影響も大きいです。とはいえ、二度も挫折していますのでAtCoderについてはトラウマというと言い過ぎですが、なかなか心中穏やかではいられない思いを抱いていたため、即座に「自分もやろう」とはなりませんでした。
実は転職による影響というのはもう一つの側面があります。前職についてはちょっと書けないような思いを抱いていましたので、転職によって精神状態が大きく改善しました。前向きになり、今度こそやってやるという気持ちになりました。
もちろん、完全に心が離れていればそのようにはなりません。つまり、二年も経ったのにまだ未練を残していたのですね…
自分の諦めの悪さ、プログラミングというものに対する思いの強さ、そして競プロは自分の嗜好に合っているはずだという思い、などが理由だと思います。
嗜好に合っているはずというのは、簡単に言えば「プログラミングしたいけど作りたいものがない」というアレです。
この考え方は理解できないという方も多くいらっしゃると思います。プログラミングはあくまでも手段だと。それは事実の一面を捉えていますが、あくまでも一面です。本来は手段だったとしても、手段でなければならないわけではありません。プログラミング自体が目的であってもいいと思います。だって楽しいですから。
この感覚はあまり理解されないかもしれないですが、私はものづくりがしたいわけではありません。ただ純粋にコンピュータを使役したいという意味でプログラミングがしたいです。自分が書いた通りにコンピュータが動く、それだけで楽しいです。特にJVMみたいな最強レベルの実行環境が自分の書いた通りに動くとか最高ですね。そんな感じなので、それによって実際にどのような価値が生み出されるのかについてはあまり関心がありません。ただコンソールに文字列が出るだけでも嬉しいし楽しいです。
それで、競プロはまさにうってつけではないかと思ったのです、競プロerがみんなそう思っているとは全然思いませんが、少なくとも私はそのように捉えました。
まあ、私は職業プログラマーであり実際に価値を生み出すことを求められるので、ただ楽しい楽しい言っているだけではダメなのが厄介なところです。(厄介とか言うと怒られるかもしれませんが)
なので、自己研鑽としてのプログラミングもする必要があります。そういう意味だとものづくりとしてのプログラミングをするのが一番いいのですが、ぶっちゃけ関心が薄いというのが私の大きな課題です。まあそれは課題として認識して解決策を模索していこうと思っていますが、一旦は開き直ることにしました。ものづくりはすべきだけど別にしたくない!そのうちやる!!
(もちろんものづくりとしてのプログラミングも軌道に乗れば最高に楽しいのですが、軌道に乗せるまでが大変と感じてしまいます)
実はこの辺りの話を認識するのに非常に時間がかかりました。理解に至ったのはつい最近で、二度目の挫折よりだいぶ後のことです。
ずっと「プログラミングは楽しい」というのを「ものづくりは楽しい」と錯覚していました。プログラミングは楽しいはずなのに、なぜか実際に動くものをあんまり作らないよな、変だよなと思っていました。好きなはずなのに、やりたくない。やるべきなのに、やりたくない。実は長年悩み混乱していました。「プログラミングはものづくり」と捉えていたのでこのような混乱と悩みが生じていたのですが、プログラミングは必ずしもものづくりではないと考えることでようやく理解できましたし悩みが晴れました。
私の勉強はプログラミング言語を学んだり細かい言語仕様をつっついたりする方向に偏っていたのですが、そのこともこれである程度説明がつくのかなと思いました。ものづくりをするなら言語だけでなくライブラリやフレームワーク、ライブラリの依存管理、ビルドやデプロイ、インフラなど様々なことを考えないといけないですが、純粋にプログラミングするだけならプログラミング言語の処理系とエディタさえあればできますからね…
話がだいぶ逸れましたが、そんな感じなので競プロは自分のやりたいことに合致するはずだと思いました。そしてそれだけでなく、実益も兼ねるはずだとも考えました。競プロでは自分が伸ばすべき能力の一部しか伸ばせませんが、その一部は非常に重要で、そして特に自分に欠けているものだと感じました。
好きでやりたいはずなのに能力が欠けているって意味がわからないと思います。正直私も意味がわかりません。なのでなんとかしたい!!というのも競プロに取り組むモチベとなりました。
というわけで再挑戦を決めました。ただ、二度も挫折していますので今回はさすがに対策を考えました。それが冒頭の内容となります。
二年ぶりに参加したAtCoderコンテストは、2022年6月4日に開催されたABC254となります。この記事を書いているのが同年9月ですので、「二ヶ月の壁」を突破して三ヶ月以上継続できています。色変もできました。なので、今のところはうまくいっているといえます。
まあゆうてまだ三ヶ月ですし、まだ茶色なので、成功した気になるのは早すぎではありますね。この先どうなっていくのか楽しみ半分、不安半分といったところです。
こんなポエムをぶち上げた後すぐにやめてしまったりしたらすごく恥ずかしいのですが、その時はニッコリ笑って見なかったことにしてください。
ただ、楽しくなくて義務感で取り組んでいる、むしろ楽しくないどころか辛い、みたいになるのが一番嫌ですので、そのようになってしまったら今度こそすっぱりやめてしまう可能性もあります。
できればそうならずに楽しみかつ能力を伸ばしたいので、メンタルケアは万全にしたいと思います。
おわりに
色変記事というかほぼポエムになってしまいました。茶色というのは高いレーティングというわけではないので、そのような段階でこんなに長々と語るのは恥ずかしいとも思ったのですが、3年越しでの達成なので思いが溢れ出てしまい、せっかくなら記録しておくべきと思いました。ほとんどブランクといっても、取り組んでいない期間中も頭の片隅にはずっとあったもので…
上で書いた通り、頑張ってレーティングを上げていこうとはあまり思っていません。結果としてレーティングがついてきたらとても嬉しいのですが、それ自体を目標にはしません。それより緩く長く続けることを目指したいですね。