はじめに
これは AtCoder を初めて 4 年になる今年大台に乗るしがない競プロ er の話である。
人生の 1/10 の期間を捧げてきたというのに、この体たらくである。
2 年前に初めて緑コーダーの仲間入りしたが1、それ以降何回か再入緑した以外は、基本的に茶色の上の方を不気味に彷徨っている亡霊のような存在である。
そんな自分であるが、ふとした時なぜそれでも競プロを続けているのかと思うことがある。ほぼ毎週土曜日、大好きなテレビ番組の「世界ふしぎ発見!」を諦めてコンテストに参加し続けてきたのはなぜか?
感情論と客観論が気持ち悪く混じり合った自分なりの分析を少ししてみた。
この記事は?
これを読んでくださるであろう過半数の方にとって、皆さんの功績は(私の)無数の屍の上に成り立っているということをイメージしていただけるといいかもしれない。
もしくは、私と同様参加回数だけは一丁前の方がいらっしゃれば、シンパシーを感じてくれるかもしれない。
「こちとら茶色にすらなれないんだが!?」と言うツッコミもあるかもしれない。
つまり、十人十色のバックグラウンドやモチベーション、置かれた環境があって、でも同時代にそれぞれ競プロを楽しんでいるということなのである。
すなわち、どんな形であれ競プロが好きな方に読んでもらえると幸いである。
刮目せよ!これが茶コーダーのかがやかしきセルフイントロダクションだ!
👶この間に子どもが二人産まれました👶
お仕事
テクニカル営業みたいな形で、クライアントの課題抽出と、自社サービスを使ったソリューショニング、要件定義、技術検証、デモ、プロトタイプ開発などをメインに行なっている。
経歴
新卒ではゲームプログラマー。その後他の業界も見てみたくなり、SE や web 系のディベロッパーとしてのサービス開発などを経験してきた。
競プロで使用する言語
3 年前から C++ を使用している。競プロ開始からしばらくは、業務でもよく使用する JavaScript で挑んでいたが、コミュニティとしては C++ の方が有利だと思ったので切り替えた。C++ はコンシューマーゲームを作っていたころに書いていたので、一から勉強ではなく少し思い出しながら慣れていった。
業務で使用する言語
JavaScript/TypeScript/React, Python などが多いが、割と好きなものを選択できる環境ではある。プロダクトコードを書いているわけではなく、プロトタイプをなるべく早く完成させるために必要な言語やフレームワーク等を選択する。
得意な領域
web 開発/フロントエンドを得意として(言わせていただいて)いる。
やっぱりアプリを作っている時が一番楽しく、自分を出せている。
以下はこちらの記事: [[競プロに取り組む目的と取り組み方を考え直す]] を参考に
競プロに取り組む目的と手段
話が逸れたが、「なぜうだつの上がらない競プロを続けるのか」だ。
そして、この状態でも続けることによって何か得られるものがあるのかを思考してみる。
競プロに取り組む理由
ここでは、物理的なものと、精神的なものとに分けてみた。
物理的な効用
アルゴリズム・データ構造の理解力・発想力・実装力の向上による、業務でのコーディング作業へのプラス効果が考えられる。
「プログラムを書く=何らかのアルゴリズムを書く」 ではあるため、これらの能力がマイナスになることは決してなく、0 以上にしかなりようがない。
当然業務内容にも大きく依存するだろうし、全ての処理が高度なアルゴリズムを必要とすると言うことはない。が、ちょっとした書きっぷり - ループの回し方、配列の扱い方、サイト内検索機能の実装 etc - において、パフォーマンスの高い記述を実践できることになる。実際の現場では、「システムとしてのパフォーマンスと可読性やメンテナンス性を考慮した」最終判断を下すことになるが、その選択肢を持っているのと持っていないのとでは大きな差である。
また、GAFA をはじめとする、トップ企業含め多くのテック系では転職時にコーディング面接を課しており、ある程度のレベルのアルゴリズム思考力・実装力が必須である。いつかそう言うところに飛び込みたいと思っている私にとっても避けて通れない道である。
精神的な効用
自分にとってちょうどいい塩梅の問題と対峙し、少し考え、解法を思いつき、実装方針を立て、キーボードを叩き、サンプルコードで確認し、提出ボタンを押す。数秒後に AC
の文字が表示された瞬間、歓喜の雄叫びを上げる自分の中の小さい自分がいて、そんな時は無敵な状態になっているとさえ思ってしまう(もちろん次の問題で挫けるところまでがセットだ)
こう言う時は頭が活性化され、脳みそのバウンダリーを一つ押し上げられている気がする。この限りなく狭い空間を、それでも少しでも良いからと、できるだけ多くのシナプス細胞を伸ばせ伸ばせと押し上げるのだ。
そもそも理由など不要なのでは?
なんだかんだ書いた結果、「理由は不要説」も有力である。
「なんか楽しい」だけで十分な理由になる。ゲーム感覚。それが人生だから。
私は趣味でマラソンをやっているが、それ自体が目的であるにも関わらず、何十年も続いている。むしろそれ自体が目的であるからこそだ。
競プロにおける、なりたい自分像
理由は何にせよ、続けていると言う事実がある。
では続けてみた結果どうなっていたいのか、そこを自問する。
最低緑はキープしたい
元々 AtCoder を知るきっかけになったのが、Google への入社エントリーのブログ記事でその方がその存在を挙げていた、と言うものだった。で、記事によると、「(少なくとも当時は)緑コーダーの実力があればコーディング面接 ' は ' 通った」とのことだったので、緑コーダーが自分の中の最初の目標になっていた。(今でもある意味そうである)
水色くらいあったら優越感、コスパ最も良さそう
私の中では、緑でもだいぶ優れた競プロ er であるが、その 1 レベル上に行けたら、また視界が少し違っているのかなと想像する。AtCoder ユーザー全体の上位 2 割以内に入っているというのも、上出来ではないか。
青色ならカッコよすぎ
もうこの辺に来ると想像すらできない世界である。
どういう思考回路で、あのスピードで問題を解いているのか。
そして何より恐ろしいのは、これよりさらに上が数色存在しているというから悶絶だ。
2 歩先を見ても仕方がない、まずは一歩先へ
このように書き下してみると、分かったことが 2 つある。
一つは、「仮に自分がもしそこに到達したら、欲が出て上を目指したくなるだろう」ということである。最初は緑コーダーを目標にしていても、いざその座に着くと、それよりも上の水門を叩きたくなる。その先も同様だ。
つまり、先を焦らずとも、まずは足元をしっかり固めることに注力すること。それが先へと繋がっていくということである。
もう一つは、「もしかしたら、レベルが上がっても自分の思うような世界観ではないかもしれない」ということ。下々の民衆が天界のことを羨んでいても、彼らには彼らの苦悩があり、案外地続きなのかもしれない。(だとしても、私にとってはそれが果てしなく遠いのはいうまでもない)
自分像を達成するために立ちはだかる壁
競プロを続ける理由を探索し、その結果のなりたいイメージも掴んだ。
では、そこに到達するのがうまくいかない原因を考察してみる。
精進の問題
言い訳タイムを取らせていただくと、時間的制約が厳しめである。
限りある資源 = 24h - (食事・睡眠等の基本的活動 + 仕事 + 家事・育児等)
で、残された時間で何をするか、というところから始まる。
そのいくらかが、晴れて競プロへの供給となるのだ。
この限りある資源は貴重で、読書もジョギングも個人のアプリ開発も全てこの 3 畳一間の空間にブッ込まれる。自分の中の複数の人格が俺だオレだと言わんばかりに何をしようかと頭の中はカオスである。
一方で、時間以外の側面では、競プロの取り組み方が自分の中で確立していないという点が挙げられる。力をつけるために、何をやって、何をやらないのか。
私は趣味でマラソンを嗜んでいるが、長年やっていると、現在の走力と目標タイムがあれば、どういう強度の練習をどれくらいの頻度で行なっていけば良いかのイメージがある。今のところ競プロの場合はそれが全然ない。物事に対する感度が下がってしまったか、単純に継続が足りていないのか。
才能の問題
才能と言っても 0 or 1 の話ではないが、残念ながら誕生の際にこのステータスはあまり割り振られていなかったようだ。
そもそもどれだけ努力したとしても、赤コーダーになれないのは百も承知だ。それは今から 100 メートル 9 秒台で走れるようになるのと同じことだ。
モチベーションの問題
「費やす労力とリターンのバランスを考えた時、それでも続けますか?」という疑念はずっと持ち続けている。精進時間も禄に取らず、本番ぶっつけで一喜一憂しているに近い現在の状況では、続けると言ってもあまり時間的な支障はないように思える。しかし、物事を中途半端にすることほど無駄なことはなく、努力のプロセスと結果がセットで価値をなす世界であって欲しい。その意味において、続けるということにはそれなりの理由が必要だったわけだ。
壁を乗り越える。。?
壁には 2 種類の壁があると聞いたことがある。
乗り越えられる壁と、乗り越えられない壁だ。
上記の壁たちがどちらに該当するのかはさておき、仮に乗り越えられない壁があったとしたら、半分だけ登ってみたり、穴を開ける方向にシフトしたり、壁をぶっ壊しても良いかもしれない。要は、壁があるからと立ち止まるのではなく、壁の性質を見極め、何かやりようがないか探ってみることが重要なのではと。また、対処する壁の優先順位をつけたり、費用対効果の高いものを選別するのも有効な手段であろう。
これらは競プロに限った話ではなく、世の中の多くのことに当てはまるだろう。
競プロライフをより楽しくするために〜ライフワークとしての競プロ〜
競プロはエンジニアとしての能力を高めてくれるものであり、喜怒哀楽様々な感情を抱きつつもエンジニア人生さえ豊かにしてくれるものであると信じている。
現に私は、万年茶コーダーだが、ものすごくハッピーである。
これからも自分にできることをしていく。
そして、ここに刻んだことを思い出し、ちょっと考え方の解像度を上げて取り組んでいきたい。