TopCoderで2年間プログラムしてみた

ニコニコ生放送「TopCoderでプログラムしてみた」
(http://com.nicovideo.jp/community/co78570)は、おかげさまで2周年を迎えることができました。この放送は、視聴者コメントに支えられている放送です(皆さんも私の放送よりコメントのほうに期待しているかもしれません(汗))。視聴者のみなさんには本当に感謝しています。ありがとうございます!
さて、今日は、2周年記念として、過去の放送であった質問について、ブログ上でちゃんと答えてみようと思います。

  1. TopCoderって何ですか?
  2. TopCoderはプログラミング初心者でも始められますか?
  3. TopCoderはプログラミング能力向上に役立ちますか?
  4. TopCoderを初めてみたいけど…。

1.TopCoderって何ですか?

世界中の人とプログラミング勝負できます。世界大会や賞金もあります(http://news.livedoor.com/article/detail/5075495/)。詳しくはこちら(http://dic.nicovideo.jp/a/topcoder)

2.TopCoderはプログラミング初心者でも始められますか?

初心者向けのプログラミングの本(薄い本で良い)を1冊読めれば、間違いなく始められると思います。さすがに知識ゼロからだと、きついかもしれません。プログラミング初心者は、いきなり大きいコードを書くのは難しいと思いますが、TopCoderのアルゴリズム部門では、短くて数行、長くても100行ぐらいなので、練習にはいいと思います。
以下のように、他の人の書いたコードや、解説記事も見れます

特に他の人のコードがたくさん見れるのは勉強になります。1つの問題でも、解き方・コードの書き方はたくさんあるので、それで良い点を取り入れていきましょう。(chokudaiさんの意見とかぶってますが、気にしないw)

3.TopCoderはプログラミング能力向上に役立ちますか?

TopCoderのアルゴリズム部門・マラソン部門(=2週間で、できるだけ良い結果を出すプログラムを作成)について、向上しそうな能力について挙げていきます。

正確なコーディング(テストも含めて)

TopCoderでは全ての入力に対して、正しい出力をしないと、0点になります。1個でも間違えばアウト。TopCoderをやり始めた人は、アルゴリズムよりも「俺はこんな簡単なプログラムも正しく書けないのか…」となることが多いと思います。どう書けば間違いにくいか、どこをテストすれば良いかが身につくと思います。
(個人的には、正当性の重要さというのは、他のソフトウェアの品質の要素(可読性・拡張性・移植性etc)よりも重要だと思うので、もっと注目されていいと思います。)

メモリや処理速度を意識したコーディング

アルゴリズム部門では、メモリ64MB(スタックメモリ8MB)で、2秒以内にプログラムが終了しないと、0点になります。必然的に意識せねばなりません。これは、組み込みやゲームプログラミングなどでは非常に重要です。ここで注意したいのが、「メモリ消費量ができるだけ少なくて、めっちゃ高速なプログラムを書くべき」という意味ではなく、「与えられたメモリや処理時間を上手に使って、無難なコーディングをする」という意味です。(実際、仕事でもこの点を勘違いしている人は多くいます。)例えば、巡回セールスマン問題でも、巡回する都市が8程度なら、総当りのプログラムで計算時間は間に合いますし、そのほうが簡単で間違いません。そういった「ちょうどよい」感覚を身につけることができます。

デバッグ

TopCoderのチャレンジフェーズでは、他の人のコードのバグを見つけると、ボーナス点がもらえます。他の人のバグを見つける能力はアップします。世の中の人はどういう間違いをするのかも分かります。また、「ここらへんが怪しい」ではなく、「実際にこの値で動かなくなる」というのを示さないといけないので、そういうスキルも身につきます。
ただ、デバッグについては、例えば「マルチスレッドのデバッグ」「ネットワークのデバッグ」といった応用デバッグスキルは、アルゴリズム部門では、身につきません。そういうデバッグもしたい人は、TopCoderのBug Race部門にチャレンジしてみてください。

アルゴリズム

もちろんアルゴリズムスキルも身につきます。ただアルゴリズム知識というよりは、「基本的なアルゴリズムを理解していて、それを応用できるか?」という点が学べます。ここが重要なポイントです。極端な話、応用がないのなら、てきとーにインターネットでライブラリを落としてきて使えば終了なのですが、TopCoderではそれはほぼ通用しません。逆に、基本的なアルゴリズムを上手に使えれば、こんなすごいことができるというのも、実感できると思います。

結果重視の姿勢

マラソンマッチ部門は2週間あるので、時間の余裕があり、自由度も高いです。そこで、自分の好きなアルゴリズム・好きなワークフローでやりたくなるのですが、どんなに最先端のアルゴリズムを使おうが、どんなに正しいワークフローを使おうが、結果がでないと負けは負けです。自分の技術的な興味や、「なんかすごいことをやりました!」という印象よりも、結果が重要な点が、仕事にも通じるところがあるので、とてもやりがいがあります。また、結果を出した人の問題への考え方や取り組み方がとても参考になります。

Twitterでの情報網が広がる

これはスキルではないですが、大きなメリットです。TopCoderには、いろんな人が集まっています。年齢層も職業も専門もとても幅広いです。自分はゲームプログラミングと土木工学だけなのですが、他の専門の方の話が聴けるのが、とても新鮮でタメになっています。興味のある方は、kinabaさんのTopCoderのリストをフォローするのが手っ取り早いと思います(http://twitter.com/#!/kinaba/topcoder-jp

まとめ(身につかないスキル・その他)

もちろんTopCoderだけやっていれば、プログラミングに必要な能力全てが身につくかといったら、そんなことはありません(ま、実際にTopCoderをやっていてそんな誤解をしてる人は、ツイッターを見てる限りいませんが)。例えば、以下のスキルは身につかないと思います。
・チーム開発のスキル(TopCoderは個人戦なので)
・設計スキル(アルゴリズム部門は少ないコーディングで済むので。ただ他の部門では、伸ばせる可能性はあります)

まぁ、プログラミングのジャンルというのは幅広く、また必要なジャンルというのは人によって全然違います。本業(一番好きなこと)で必要なスキルは各自しっかりやった上で、TopCoderで基本的なスキルを上げていくのがベストではないでしょうか?

あと、「別に役立たなくてOK、楽しめればOK」という考えも全然アリだと思います。実際、自分もそうだったりします(笑)。TopCoderは、お金の掛からない趣味としても、本当に優れています(hogeover30さん談)。


4.TopCoderを初めてみたいけど…。

英語が苦手です

これは、よくある質問です。確かに問題文が英語なのがやっかいですね。でも、Yahoo翻訳など自動翻訳サイトもたくさんありますし、問題文やサンプルケースを読めばなんとなく分かる問題も多いです。「英語を勉強したいけど、身近な理由がないので、やる気が起きない」人は、これをきっかけに、英語に興味をもち、英語力アップを目指すのもいいかもしれません。「TopCoderの問題文を読んでるだけで英語の総合力アップ」とはいかないですが、解説記事も含めて読めば、十分に読解の勉強になります。

アルゴリズムが苦手です(あまりアルゴリズムを知りません)

知っているアルゴリズムはゼロで全く問題ないです。アルゴリズムの本を1冊読んでから始めるぐらいなら、すぐに始めてしまいましょう。

時間がありません。

これは特に社会人プログラマーにとっては重要かもしれません。以下の2パターンがあると思います。

  • 時間の融通がききません
    • Practice Roomはいつでも使えるので、好きな時間にできます。
    • TopCoderのアルゴリズム部門の開始時間は、かなりバラついています。回によって異なるのですが、火曜午前10:00・水曜午後8:00・水曜午前0:00・日曜午前1:00のときが多いです。カレンダーはこちら(http://community.topcoder.com/tc?module=Static&d1=calendar&d2=thisMonth)。火曜午前10:00は学生以外は難しいと思いますが、仕事が遅い社会人でも深夜開催の回であれば参加できるのではないでしょうか?
    • TopCoderのマラソンマッチ部門は、期間が2週間程度なので、期間内の空いた時間にできます。
  • 時間が足りません。
    • TopCoderのアルゴリズム部門でかかる時間は、コーディングフェーズ75分+休憩5分+チャレンジフェーズ15分=95分と、長時間かかる訳ではありません。毎回参加したとしても、月3回*95分で、月4時間30分程度です。

時間もなく、時間の融通もきかない人は、多分本業が相当忙しい状態だと思うので、まずはTopCoderよりも、本業に集中したほうが良いと思います。

まとめ

自分がTopCoderを始めたのは、「日本にいたときより仕事時間が短いので、空いた時間もプログラミングして、能力が鈍らないようしたい。リフレッシュも兼ねて、家では違うことをやってみよう。」という理由からでしたが、今は「楽しいから」やっているのがメインになってますね。楽しむことで継続できるし、継続で力もつきつつある(はず)ので、まぁ、良しとしましょうw。
そんなわけで、TopCoderにまだ参加していない方、お待ちしてます!初心者の方も、気軽に生放送にいらしてください(http://com.nicovideo.jp/community/co78570)。ぜひ楽しくコーディングで対戦しましょう!Have fun and good luck!