AtCoderの初心者向けコンテスト、ABCの解説を毎週書いている。
ABC201~258の灰色~緑色Dif問題の解説を書いていて、数えたら合計233問になっていた。
ちなみに解説本をkindleとかboothで出していて、そちらではABC200以前の問題とかARCの問題も解説しているのでそっちも合わせると+70くらいはあると思う。
あれ?解説書く方が楽しくね?
私も緑コーダーになるまでは毎週せっせとAtCoderのコンテストに出ては「WA」とか「TLE」に絶望していた。
ARC(中級者向けコンテスト)は難しくてレートが下がりそうだから出ないでおこうかな・・・としたこともある。
しかし、最近はコンテストにめっきり出なくなってしまった。
私生活が忙しくなったというのは理由の一つだが、それ以上に 「もしかして私レートを上げるのが好きなのではなく問題を解くのが好きなのでは?」 と思ったことが大きい。
コンテストに出るとどうしても速く解けそうな問題を取捨選択しないといけないし、一つの問題を時間をかけてじっくり考えるということがし辛い。もちろんコンテスト終了後も答えを見ずにひたすら考え続ければいいだけの話なのだがなかなかそれもできない。だって答え気になるもん。
今はコンテスト後に問題だけ見ておくようにしている。そして通勤時間中とか仕事中になんとなーく考えておいて、解法を思いついたら家に帰った時に試してみる。こっちのやり方の方が「あと何分だ・・・今順位どれくらいかな・・・今回は水色パフォいけるかな・・・」と目をギラギラさせながら問題を解くよりも楽だし、楽しかった。
そしてこういう人、多いと思う。
これは良い悪いではなく(コンテストに出ないのは逃げではなく)純粋に 「問題を考えて解く」 という部分だけ取り出した関わり方が合っているという人、いっぱいいると思う。
そういう人におすすめなのがそう、「解説を書く」 である。
皆様も御存知の通り、公式の解説は少々 「簡素」 であるため、インターネット上には多くの有志が解説を書いてアップしている。けんちょんさんのブログ、かつっぱーさんの動画・・・等々、助けられた経験のある人も多いだろう。
「解説を書く」というのは「コンテストに出る」「問題を解く」に続く第3の競技プログラミングとの関わり方だと思う。
・この解説を読む人はどれくらいのレベルか
(ordとかchrってわかるのかな)
・どう書けば伝わるか
(再帰関数って使えるけど人に説明するのむずいな・・・)
・どんなコードが読みやすいか
(よく見たらここの処理いらねえ・・・)
これらを「考える」作業は非常に面白い。
そして自分のプログラミング能力もただ単に問題を解きっぱなしにするよりは確実に向上する。
なぜって問題を何回も解くことになるからだ。
自分で自分だけがわかるように書いたコード、およそ人に見せられるような代物ではない。
そこで伝わるように書き直す。わかりやすい、バグりづらいコードを書く能力が向上する。
色んなところを行ったり来たりしてよくわからなくなっていた解法。(なんかよくはわかってないけどなぜか解けたという経験ある人多いと思う)
解説を書く時はどう考えれば解けるのか、順序立てて考え直す。その時ぐちゃぐちゃになっていた頭の中が整理される。
格ゲーマーの梅原さんが言っていた。
「ゲームに飽きたんじゃない、成長しないことに飽きたんです」
レーティングは数字で見える成長だけれど、コンテストに出ないならその数字が上下することはない。
でもUnionFindの解説を書いた人は、次にUnionFindの問題を見た時以前より圧倒的にスラスラと解けるはずだ。
だから自分が成長したことがわかる。競プロがもっと面白くなる。
そして最も大きいのが 「反応がもらえる」 ということだ。
解説を書いて(あるいは動画にして)公開すれば、誰かが読んで、いいねやらLGTMやらを投げてくれる。これはものすごく嬉しい。
まとめてKindleやboothで出版すればだれかがお金を出して買ってくれる。
もちろんすごく儲かるということはないけれど、自分の作ったものに誰かがお金を出すという行為で価値を認めてくれるということ自体がめちゃくちゃに嬉しい。
レートに一喜一憂するのちょっと疲れたな・・・という人、1問でいい、簡単な問題でいいから一度解説を書いてみてほしい。
トブぞ。