19 Sep 2010

プログラミングコンテストについて話してきました

Closed な Tech Talk イベントがあったので, プログラミングコンテストについて話してきました. 目標はプログラミングコンテストの良さを知ってもらうことと, プログラミングコンテストチャレンジブックの名著ぶりの宣伝でした. 以下が資料です.

コンテストへの参加には以下の3つの良いところがあって, 個人的にはそれがコンテストに取り組むモチベーションになっています.

まず一つ目は自分の技術力向上の役に立つということです. アルゴリズムの知識はもちろん, その問題への応用力. コンテストでは短時間で書き上げないといけないので, 素早くバグを埋め込みにくいコードを書く実装力や, デバッグ力. それだけでなくコードリーディングや, 様々なインプット(正常系・異常系・コーナーケースなど)を考慮すること. そしてなにより計算量やメモリ使用量の見積り. コンテストでは計算量だけを考慮すればよい場合が多いですが, コードを書く前に見積りを行うという習慣が付くのは良いことです.

二つ目はこうして身につく能力は, 決してコンテストに特化したものではないということ. プログラミングコンテストは数学とかパズルっぽい問題が多くて, 実際の開発には役に立たないんじゃないかと思っているひとも多いんですが, 僕は決してそんなことはないと考えています. デバッグしたり, 他人のコードを読んだり, 様々なインプットケースを考慮したり, 計算量やメモリについて見積りしたり. こういうテクニックはどんなコードを書くにあたっても必要なものなので, ソフトウエア開発の地力をのばすにはもってこいだと思います.

三つ目はやっぱり純粋に楽しいということです. プログラミングコンテストの場合, 自分の現在の実力ががスコアやレイティングという指標で定量的に表され, さらに全参加者がランキングされているので, 自分がいま全体のうちどのくらいの位置にいるのか, 同じくらいの能力の人は何人くらいいるのか, といったことがすべてわかります. そして TopCoder なんかだとコンテストごとにこの順位が変動して, 練習の成果がすぐに可視化されます. こんなにエキサイティングな競技はなかなかないんじゃないでしょうか.

楽しいというのは継続につながるというのが非常に重要で, 昔10000時間やり続けると天才的な能力を発揮できるなんて記事が話題になってましたが, 学習効率の差はあれど, どんなひとでもやり続けることで確実にその能力を伸ばすことができると思います. つらいけども必要だと思って無理やりやるよりも, 楽しいとおもって自然とやっていることの方が絶対に長続きします.

いろいろとプログラミングコンテストのお薦めポイントを述べてきましたが, 以下に当てはまるひと達はわざわざ取り組む必要がないのかあとも思います.

  • すでにやりたいことがある人. コンテストで身につくのは, あくまで開発の基礎的な部分の技術だと思うので, すでにやりたいことがあるひとは, それに取り組みつつ必要なときに基礎に戻るほうが効率がいいと思います. 逆にまだ自分のすべきことがはっきりさだまっていない人, 漠然とプログラミングしたいけど何をしていいのかよくわからない人にはコンテストはお勧めです.
  • 設計の力を磨きたい人. ICFPCなんかだと別かもしれませんが, たいていのコンテストは数時間の制限時間でコードを実装するので, 当然ながら大規模なコードを書く事はありません. 設計とかパターンなんかはドメインが違っています.

謝辞

資料を作るにあたって以下のリソースから多くの部分を引用させていただきました. 深く感謝申し上げます. 特に図に関して, 自分で作図する余裕がなくそのままお借りしている部分があるため, 問題があればご指摘頂きたく思います. (出典は明記しています)

プログラミングコンテストチャレンジブック

プログラミングコンテストチャレンジブック

この業界?の決定版ともいえる名著です. コンテストだけではなく, アルゴリズムについてよりプラクティカルに学びたい人にもお勧めです. はじめの例題やdfsの例, サンプルコードを引用させていただきました.

「最強最速アルゴリズマー養成講座」最新記事一覧 - ITmedia Keywords

知識を増やすのではなく, 頭を柔軟に, 発想力や応用力を鍛えるということにフォーカスしている, とても素晴らしい連載です. 探索の図や貪欲法の例題を引用させていただきました.

ALGORITHM NOTE

数々のアルゴリズムが図解とコードで分かりやすく解説されています. ナップザック問題の図とコードを引用させていただきました.

はてなダイアリーに slideshare のスライドを貼る

はてダに slideshare をはりつけようと思ったのですがうまくいきませんでした. 結論からいうと param 要素の value 属性の中の url の userName というパラメータ削除する必要があります.

<div style="width:425px" id="__ss_5227283"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/cou929/programming-contest-hacks" title="Programming Contest Hacks">Programming Contest Hacksa>strong><object id="__sse5227283" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=programmingcontesthacks-100917220427-phpapp02&stripped_title=programming-contest-hacks&userName=cou929" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5227283" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=programmingcontesthacks-100917220427-phpapp02&stripped_title=programming-contest-hacks&userName=cou929" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355">embed>object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentationsa> from <a href="http://www.slideshare.net/cou929">Kosei Moriyamaa>.div>div>

これが slideshare の embed ボタンを押してコピーしてきた html です. ここの

value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=programmingcontesthacks-100917220427-phpapp02&stripped_title=programming-contest-hacks&userName=cou929"

の末尾の &userName=hogehoge 以降を削除します. 全部で2箇所あるので両方削除します.

検索してみるといろいろな記事がでてきたのですが, 割と最近の slideshare 側の仕様変更みたいなので, まだはてな側が対応していないようです.