chroju.dev/blog

the world as code

競技プログラミングで Write Code Every Day を2か月続けてみて

Image from Gyazo

競技プログラミングを始めてみた」というエントリーを10月頭に書いて、だいたい2か月ぐらい毎日草を生やしてきたので、ここらで少し振り返ってみる。草は一部 nature-remo-cli などで生やしたものもあるが、ほぼ「Aizu Online Judge」で生やしている状況。

Pros

スムーズにプログラムが書けるようにはなってきた

始めたときのエントリーで書いた通り、自分は現在の職務だとプログラミングやスクリプティングをしない日もよくあるので、下手すれば1週間とか2週間とかプログラミングというものに触れず、いつまで経っても覚えが悪い、なんてこともあったのだが、さすがに毎日書いていると覚えが早いし忘れることもない。よく使う文法や関数はすぐ覚えるし、プログラミングに要する時間自体が徐々に短くなってきたように思う。

アルゴリズムやデータ構造に関する学習にもなっている

アルゴリズムやデータ構造をまともに体系的に学ぶ機会を設けてこなかったのだが、「Aizu Online Judge』には各種ソートアルゴリズムや基本的なデータ構造、ユークリッドの互除法などの数学的アルゴリズムを使う問題が豊富にあるので、それらを学ぶ機会に恵まれることとなった。さすがに主要なソートアルゴリズムぐらいは IPA の試験などを通じて知ってはいたけれども、全部が全部実装経験があるわけでもないので、この機会に学び直せてとても楽しい。

Cons

模範解答がない

「Aizu Online Judge」特有の話ではあるが、模範解答が存在してはいない。他のユーザーの回答がパブリックになっていればそれを見ることはできるが、模範的なものになっているとは限らないのでヒントにしかならない。各種主要なアルゴリズムを実装するにあたって、「ぼくが考えた最強のあるごりずむ」で解いてもおそらく意味はなくて、代表的な実装を把握はしておきたいところなので、副読本として『アルゴリズム・クイックリファレンス』を購入した。

アルゴリズムクイックリファレンス 第2版
George T. Heineman Gary Pollice Stanley Selkow
オライリージャパン
売り上げランキング: 160,999

ちなみに「Aizu Online Judge」公式の解説本も売っているらしいのだけど、目的はこの競技プログラミングを解くことというよりは、それを通じてアルゴリズムを学ぶことであるので、汎用的っぽいオライリーのほうを買った。

ものを調べたり本を読んだりする時間が減った

Write Code Every Day が第一優先になった結果、 commit を伴わない作業の優先度が相対的に下がった。1日1commitするのに、少なくとも 30分/day は費やしている。すると平日はなかなか他のことに時間を割くのも難しかったりして、 commit に繋がらない何かを調べる作業とか、本を読んだりする時間がめっきり減ってしまった。

Write Code Every Day は、ことプログラミングの習慣化をするにはとても良いプラクティスだと思う。何より成果が可視化されるのでわかりやすいし、草が続いていくと、これを絶やさないようにしたいというモチベーションがどんどんと湧いてくる。ただ「草を生やす」ことで可視化をしてしまうと、成果の出し方が「コードを書いて commit して GitHub に push する」という手段に縛られてしまうのは良くも悪くもだなと感じている。ITに携わる人間として、日々力をつけるのに必要な研鑽はそれだけに限らない。なので、例えば自分の場合はこのブログの元になっている markdown も GitHub で管理しているが、そこに commit することも成果として OK ということにすることにした。あるいは何かを調べる作業にしても、その調べた結果を単に「ふむふむ」と頭の中に留めるのではなくて、実際に簡単なコードで実装する習慣を作れば commit に繋げられるかもしれない。

競技プログラミングだけで満足していていいのか

もともと Write Code Every Day のネタとして競技プログラミングを始めたのは、他にネタを持っていない日が多かったからなのだけど、現状競技プログラミングがメインになりすぎてしまっている。競技プログラミングはどうしても問題を書くためのコード、つまりは手続き型で書けばOKな場合がほとんどなので、 Go で何かツールを作るときにはどういうプラクティスに則ればいいのかとか、そういったより実践的な知識を学ぶ機会がない。なにか題材になるような OSS を育てるとか、他の OSS に対して Pull Request を飛ばすとか、そういうことも週に1〜2日でも構わないので組み入れられるように切り替えたい。そしてそのためには、書くネタを探すという別の習慣付けが必要だなと感じている。


ざっとこんな感じで、習慣的にプログラミングする時間を設けることができるようになったのはいいんだけど、そればかりしているわけにもいかないからどうしようかなというところ。日頃からネタを探す習慣をつけたくて、年内はインプットの方法を見直すことを進めていこうと思っている。