マナティ

AtCoderではじめる競技プログラミング

競技プログラミングをなぜやるの? [第2回]

競技プログラミングは役に立つ? 毎月のように議論がされるこのテーマについて(あくまで著者の立場から)「競技プログラミングはいかに役に立つか!」をアピールしたいと思います

56240_ext_02_0.jpg

はじめに

前回の記事では、競技プログラミングがどういうものかを説明しました。 しかし競技プログラミングがどういうものであるかわかったとしても、結局 なんで競技プログラミングをやるのか ということが、前回の記事では解らなかったかと思います。

競技プログラミングをする理由は、主に以下の2つではないかと思います。

どちらの理由ではじめてもよいと思いますが、個人的なおすすめで言えば、 競技プログラミングの楽しさを知って、競技プログラミング自体を楽しめるように なると どんどん成長していけるかと思います。

もちろん競技プログラミングは役に立つのですが、おまけくらいに思っていた方がよいと思います。正直に言えば、例えば「仕事に役立つプログラミングを覚えたい!」 などの明確な理由があるなら、その技術について直接学んだ方が効率がよい場合が多く、競技プログラミングを始める理由としてはあまり向いていません。

さてそれでは、双方についてコメントしていきたいと思います。まず「競技プログラミングが役に立つから!」についてコメントします(「競技プログラミングが楽しいから!」は次回掲載します。)

競技プログラミングは役に立つ?

競技プログラミングが役に立つか否か、というのはTwitterなどで頻繁に議論されており、 おおよそ月に1回「競技プログラミングは役に立たない!」と言う人が現れ毎月のように議論がされております(これは『月刊競技プログラミングは役立たない』などと呼ばれてネタにされております)。

様々な意見がありますが、これは僕の連載なので、あくまで僕の立場として、「競技プログラミングはいかに役に立つか!」というのをアピールしていきたいと思います。

ざっくりと箇条書きでまとめてしまうと、競技プログラミングをすることによって、 以下のようなメリットがあります。

以上の点において、1つずつ説明していきます。

1. プログラムが書けない状態から、書けるよう状態になる

実は、競技プログラミングというのはプログラミング初心者に一番お勧めな競技だったりします。 プログラミング初心者のうちはできることが非常に少ないです。 そこで淡々とプログラミングの勉強を繰り返したり、今ある知識だけで作りたいものを作れる人は問題ないかもしれませんが、 多くの人は残念ながらそうではありません。

そこで出てくるのが競技プログラミングです。 競技プログラミングでは、非常に簡単な問題から用意されています。
例えば「AとBが入力されるので、A-Bを出力しなさい。」のような問題です。 これは、プログラミング入門書における「演習問題」と同じ立ち位置です。

競技プログラミングサイトでこれを行うと、コンテストで楽しみながら演習問題が解けることになり、なおかつ正誤判定が正確に行えるため、 初心者にとって非常に有用な練習となります。

競技プログラミングからプログラミングを覚えた、というAtCoderの参加者も 決して少なくはありません。

2. 思ったことがすぐにプログラムに起こせるようになる

競技プログラミングというのは、問題を見てからプログラムに起こすまでの速度を競います。 そのため、問題の解き方が分かったら早く正確にプログラムを書かなければいけません。 普通にプログラムをしているだけでは、このようなコーディングの速さを求められることは まずありません。そのため、コーディングの速さが成長する速度というのは なかなか上がりません。

AtCoderで競技プログラミングに参加すると、早く正確に書くにはどうしたらよいか を追及するようになります。そのため、単純なコーディング速度は他のプログラムと比べて圧倒的に早くなることができます。

速さを追及するあまり、通常の開発では使わないようなバッドノウハウを使ってしまうことがあるのは欠点ではあるのですが……。 ただ、開発の現場でもそのようなスタイルでコーディングをしてしまう、ということは、 完全に開発未経験でもない限りないと思いますし、そんなに心配することもないでしょう。

3. アルゴリズムの知識を得ることができるだけでなく、そのアルゴリズムの活用方法もわかる!

競技プログラミングは、最初は問題に書かれた通りにプログラムを書くだけが目的なのですが、 徐々にいかに計算を効率よくするかの方が大切になってきます。 ここを工夫しないと、プログラムが制限時間内に終わらなかったり、そもそも永遠に終わらないプログラムになってしまったりします。

ここで少し必要となってくるのが、アルゴリズムの知識です。 例えば「ダイクストラ法」と呼ばれるアルゴリズムがあります。 これは電車の路線図のようなものが与えられたら、出発地点から到着地点までの最短経路を効率良く求めるアルゴリズムの1つです。

このような知識を持っていると、似たような問題が出てきた時に非常に解きやすくなりますし、有利に働きます。これらは業務も応用できることもありますが、普通の人が業務に応用できる場面というのは、ほとんどありません。

これは、アルゴリズムが役立たない、というわけではなく、競技プログラミングに親しんでいない人々が、競技プログラミングで取り上げられるようなアルゴリズムについて、実際に問題に適用するような訓練を行っていない場合もあります(業務内容によっては、本当に使わない場合もありますが……)。

では、「A駅からB駅に行きたいが、途中でATMのあるいくつかの駅のうち どれかを経由しなければならない」という問題の時、このダイクストラ法は使えるのでしょうか? 競技プログラミングに慣れていない人は「使えない」と思ってしまう方も多いのではないかと思いますが、競技プログラミングに慣れていたならば、ダイクストラ法でカンタンに解くことができるようになるわけです。

このように、アルゴリズムを知ることができるだけではなく、 実際にどのようにアルゴリズムを活用することができるか、という応用方法まで学べるのが、競技プログラミングの情報科学的観点から見た強みでしょう。

4. (学生の場合は)就職に役に立つ!

競技プログラミングなんて就職の時に評価されるの?と思っている人は多くいるかもしれませんが、これに関しては確かなソースがいくつか存在します。

例えば、第1回dwangoプログラミングコンテスト「ドワンゴからの挑戦状」では、社会人も含めた予選参加者590人のうち12人が2016年度ドワンゴ新卒採用にて内定承諾に繋がった、という結果が公開されております(以下のリンク先は第3回開催のものです)。

第3回 ドワンゴからの挑戦状 | 株式会社ドワンゴ

他にも様々な企業が競技プログラミングのコンテストをAtCoderで開催していますが、その企業の開催理由の多くが優秀な競技プログラマの学生に興味があるから という理由です。

ですので、競技プログラミングが採用の際に有利になる、というのは、新卒採用については現状間違いがありません。中途採用についてはAtCoderでは今のところそうしたコンテストは 開かれておりませんが、他サービスで言えば、paizaCodeIQなどでチャンスはあるのではないかと 思います(他社さんのサービスなので、どの程度採用に繋がっているかは分かりませんが……)。

5. その他、いろんな思考力が付く

この項目に関しては完全な主観ですが、競技プログラミングをやるようになってから、物事を深く考えられるようになったような気がします。人それぞれであるし、全員が全員そうとは限らないのですが、そう感じている人は割と多いような気がします。

競技プログラミングが強い人でも、競技プログラミングが役立つ場面はないと感じている 人もたくさんいるので、かなり怪しい話ではあるのですが、多くの競技プログラマーが 目指す先はエンジニアですし、エンジニアだったら使える武器は何でも使うべきです。 「競技プログラミング」という凄く役立ちそうな武器が使えずに、いったい何ができるのでしょうか?

役立つと思って色々考えてみれば、きっと役立つ場面はあるはずです。

次回は「競技プログラミングが楽しいから!」について“爽快感を感じられる問題”について解説します。お楽しみに

著者プロフィール

高橋直大(著者)
AtCoder代表。主な戦歴は、ICFPC2013,15優勝/イマジンカップ世界3位/TopCoderOpen4年連続決勝進出・世界2位1回。
AtCoder(著者)
プログラミングコンテストサイト「AtCoder(アットコーダー)」の開発・運営のほか、プログラミングコンテストの企画・運営、ソフトウエアエンジニアの採用支援・能力判定業務を行っている
https://atcoder.jp/