競技プログラミングと問題解決能力

競技プログラミングで鍛えられる「問題解決能力」とソフトウェア開発で求められている「問題解決能力」は微妙に違う。前者は端的に言えば試験を突破する能力、後者は試験を突破する能力+作問能力を指すことが多い。

なので、「競技プログラミングにおいて優秀な成績を残したから、彼/彼女は優秀なソフトウェア開発者だ」というのは言い過ぎ。でも、「競技プログラミングにおいて優秀な成績を残したから、彼/彼女は優秀なソフトウェア開発者になれるかもしれない」というのは十分に説得力を持つ話。

水泳部だった人がライフセイバーに適しているかいわれれば、泳げない人よりは適性があると考えるのは普通。でも、水泳部だったからといって、ライフセイバーの仕事をすぐにこなせるかといえばそんなことはない。泳げるというのはライフセイバーの技能のひとつでしかない(でも、とても基本的な技能)。

ウェイトリフティングの選手だった人が、格闘技や他のパワー系スポーツの選手に適しているかといわれれば、体を鍛えた経験のない人よりも適性があると考えるのは普通。だって、ウェイトトレーニングはいろいろな分野の基本だし。でも、すぐに格闘技や他のパワー系スポーツの選手として活躍できるかといえばそんなことはない。覚えることはたくさんある。

でも、ライフセイバーにすぐにはなれないからといって競技目的の水泳を学ぶことの価値がないわけではない。格闘技や他のパワー系スポーツの選手にすぐになれないからといってウェイトリフティングをやることが意味ないことではない。当たり前の話。

「私は、競技プログラミングにおいて優秀な成績を残しているから、そこいらへんのソフトウェア開発者よりも優秀だ。」という発言をする人には「井の中の蛙、かつ、空も見上げないんだね、君。」と言ってあげればよい。でも、競技プログラミングをやっているからといって、「井の中の蛙、かつ、空も見上げないんだね、君。」というならば、「ご忠言ありがとうございます。私より大きい井戸に住むカエルさん。」と言われちゃう。

私は情報系の学生が競技プログラミングに取り組むのは良いことだと思う。

  1. 多くのアルゴリズムを学ぶ動機になる(まあ、ある分野に偏ってしまうけどすべてのアルゴリズムを学ぶのは難しいし)
  2. コーディング能力が上がる(まずは量が重要なので)
  3. 他人のコードを読む癖がつけられる(良い書き方を探すとどうしても他人のものを見る必要がある)
  4. 定期的に評価(大会/コンペ)があるのでモチベーションを維持しやすい
  5. 自分の分野に直結したサークル活動ができる(遊びながら学べる)

ACM/ICPC のようなものだけでなく、Microsoft Imagine Cup未踏ソフトウェアのようなソフトウェアの作成コンペにも応募するとバランスが良くなると思う。

関連過去エントリーなど