chokudaiのブログ

chokudai(高橋直大)のブログです

競技プログラミングの在り方 ~「競技プログラミングを我々が終わらせる」を受けて~

nuc.hatenadiary.org

 

競技プログラミングについての言及があったのですが、バズってる+競技プログラミングについて、納得がいかない記述がかなり多く見受けられたので、反論記事を書きました。

 

 

自己紹介

競技プログラミングの日本最大企業「AtCoder」の社長を9年間続けています。競技プログラマとして、2010年から毎年1つは世界大会で入賞しています。

完全に競技プログラミング支持側の意見なので、ポジショントークを出来るだけ排除しようと心がけているものの、完全に排除することは多分出来ていないため、多数の意見と比較してもらえると幸いです。

 

競技プログラミングGoogle

まずは肯定的な所から。

Googleに入るためには、競技プログラミングではなく、Googleに入るための勉強をするべき、という点に関しては、間違いなく正しいです。特にAtCoder競技プログラミングは、常日頃から娯楽であり競技であると主張していますし、ITエンジニアとして必要な資質を全くカバーできていません。記事の後半の「最後に」に書かれている、Googleに入るための「どの本を読むべきか」という点については参考になると思います。

一方で、この「Googleに入るための勉強」に、競技プログラミングがそれなりの割合(2~3割程度?)で入ってもおかしくないと思います。理由は簡単で、Google競技プログラミングを推進している企業の一つだからです。

 

Googleは、2003年から、競技プログラミングのコンテストである「Google Code Jam」を、毎年開催し続けています。

codingcompetitions.withgoogle.com

このコンテストでは、上位者をアメリカのオフィスに招待するのですが、希望者はその場でそのまま採用面接を受ける事が出来ます。

また、年1回だったGoogleプログラミングコンテストはさらに拡大し、「Google Kick Start」という、少し初級者向けに寄せたプログラミングコンテストも始まりました。こちらは年8回開催されています。

codingcompetitions.withgoogle.com

 

これを受けて、Twitterで、現役Googleエンジニアかつ現役競技プログラマの方から、以下のような宣伝が行われていることも確認できます。

このような事実を見ると、 競技プログラミングGoogle就職の役に立つ、というのも、そんなに間違っていない事実なのではないかと思います。

 

競プロ擁護についての記事ばかり出しているのも偏っているので、逆のものを。

Googleの研究本部長を務めているPeter Norvigさんが、「競技プログラミングの成績と仕事の成果には逆相関があった」ということを、2015年に話しています。相関というものは色々な要因で出てしまうので、「競技プログラミングが仕事に役立たない」に繋がるものではないですが、競技プログラミングの成績でITエンジニアとしての全てが分かるわけではない。」という結論に繋げるのは容易でしょう。

catonmat.net

(追記:コメントにて、「データを増やしたら逆相関が消えた」という発表が3か月前にあったという情報を貰いました。なので削除しましたが、「競プロだけ全てわかるわけではない」という結論には特に変化はないですし、そうした事例は探せば見つかると思います。)

 

 

ここまで踏まえた上で、僕がまとめる結論としては、競技プログラミングGoogleの就職に役に立つものの、それだけで就職出来るものではなく、あくまで一部の要素でしかない、というのは大切です。勉強時間の2~3割は競技プログラミングに充てても良いのではないかと思いますが、この割合は人によって考え方が違うと思います。

 

現代の競技プログラミング、およびAtCoderについて

競技プログラミングをしている」と言ったら、非常にありがたいことに、殆どの人がAtCoderに取り組んでいると思います。日本における「競技プログラミング」は、「AtCoder」と言い換えても、さほど問題がないかと思います。

AtCoderの社長として、AtCoderがどういう風に作っているかというと、以下のような感じになります。

  • AtCoderの提供する問題は、娯楽性、競技性を重視している
  • AtCoderは、ITエンジニア養成塾ではない。「ITエンジニアになるために必要なこと」よりも、「楽しさ」「競技としての健全性」を重視する
  • AtCoderの楽しさは、数理的・情報的な問題を解決することにあり、そうではない余計なものは出来るだけ排除している

昔の競技プログラミングがどんなものだったか知りませんが(とはいえ、記事で書かれていた2007年に僕は競技プログラミングにすでに行っていましたが)、今の日本の競技プログラミングの主流であるAtCoderは、このようなものになっています。

こうした「楽しさを重視した点」で、競技プログラミングに熱中する人が増えていると感じてますし、そもそも「昔の競技プログラミング」と比べて、参加者が比較にならないほど増えたのは、この点が大きいと感じています。

僕たちは、競技プログラミングを娯楽として楽しんでいます。これを、初期にちょっとプログラミングコンテストに取り組んでいた程度で、我が物顔で「我々が競技プログラミングを終わらせる」などというのは、到底容認できるものではありません。競技プログラミングは貴方のものではない。もちろん僕のものでもないので、多様な競技プログラミングのあり方があるべきでしょう。

ただITエンジニアになるものとして矮小化しないで欲しいです。

 

AtCoderと就職

じゃあこれがどうしてIT就職において評価されているかというと、(AtCoder社として主張してそのまま通っているものも含めて)、以下のようなものが上げられます。

  • AtCoderで問われる「問題が与えられ、そのロジックを考える」というアルゴリズム構築能力は、プログラミングの多くの処理における基礎であり、ここが出来ていないと、いくら知識があっても意味がない (初心者帯~中級者帯)
  • AtCoderで培われる高度なアルゴリズム構築能力は、研究開発用途で役に立つ (中級者帯~上級者帯)
  • そもそもITエンジニアの能力の測定が難しく、レーティングのような「一定以上プログラミングが出来る」という指標が役に立つ (初心者帯~初級者帯)
  • 競技プログラミングそのものが役に立つわけではないが、競技プログラミングが出来る人は他の仕事も出来る (初級者帯~上級者帯)
  • 競技プログラミングで問われる数理的処理能力が役立つ (中級帯~上級者帯)
  • 土日からプログラミング関連のものに取り組んでいる姿勢が評価できる (初心者~中級者帯)

以上の要素は、そもそも魅力に感じない会社もたくさんあるでしょうし、当てはまらない会社もたくさんあると思います。AtCoderが育てているわけではなく、界隈の特徴なだけの要素もあります。AtCoderが役に立つかは、僕らAtCoder運営が決めることではなく、人材を求める各企業が決めることです。

正直な話、高度なアルゴリズム構築能力を求めている会社はさほど多くなく、半分以上の会社は、AtCoderの緑色(下から3番目)で十分過ぎるという評価になりますし、むしろ他の能力を問いたい、という会社が多いと思います。

ですが、AtCoderJobsに掲載するエムシーデジタル株式会社の求人などでは、

また、新卒であっても、AtCoderの水色以上だと700万以上、AtCoderの青色以上だと800万以上を基準にしています。

と書かれており、AtCoderでの実力を強烈に評価してくれてる会社があるのも事実です。(補足:水色は全参加者の上位10%、青色は全参加者の4%程度です)

jobs.atcoder.jp

 

AtCoderにスポンサードしない会社では、例えば以下のような意見があります。

  • Web系分野に興味のある学生が欲しいので、競技プログラミングに時間を割いている学生にはあまり魅力を感じない (Web系)
  • そもそもプログラミングの仕事が多くなく、事務処理能力やコミュニケーション能力が大切(大手SIer
  • ものつくりが好きな人を採用したいので、ただ与えられた課題を解く競技プログラマーとは企業文化が合わない (Web系・ゲーム系)
  • スポンサードしたところで、優秀な人材が応募してきてくれるとは思えない (メーカー)

以上のように、競技プログラミングは決して銀の弾丸ではない、というのは、意識するべきところであり、競技プログラミングが役立たない仕事はいくらでもある、というのは意識するべきことだと思います。

Googleはどっちかというと役立つ企業だと思ってますが……。

 

AtCoderの社会的意義

AtCoderの価値に関して、現状、社会的には以下のような価値があると考えています。

  • 情報科学やプログラミングの道へ入るきっかけを作り、情報系人材を創出する
  • アルゴリズム構築能力の高い人材を多く生み出すことで、様々な問題を解決する手助けとなる
  • 口先だけの人間ではなく、実力のあるIT技術者が評価される社会をつくる
  • 多くのユーザに楽しみを与える(娯楽・競技として)

これらの特徴を踏まえた上で、競技プログラミングが万能ではない、競技プログラミングだけがプログラミングや情報科学ではない、というのは、絶対に発信しないといけない点ですし、優良誤認を避けないといけないと考えています。

僕は常日頃からこうした発信をしていますが、僕から遠い人間になればなるほど、僕の発信内容以上に、なぜか競技プログラミングがどんどん優良誤認されている、というのは、確かに感じています。

これを止めるために、今回記事を書かせてもらいました。競技プログラミングは役に立つのは事実だし、競技プログラミングだけが出来る事が、ITエンジニアになる上で良い事ではない、というのも事実です。

極端に競技プログラミングが優良誤認されることで、競技プログラミングが「胡散臭いもの」になるのは、僕が最も避けたいものの一つです。正に今回の記事は、それが噴出したものの1つだと思います。

そういう意味においては、競技プログラミングにネガティブな記事が出てきたこのタイミングは良かったと思います。今回は、競技プログラミングがどういうもので、どういう価値があるかが、正確に届けばいいなと思っています。

 

 

競技プログラミングから仕事に寄るために

AtCoderのコンテストに出続けてたけど、ITエンジニアになれそうもないぞ!どうしたらいいんだ!という人が、もしかしたらいるかもしれません。

ITエンジニアを一直線で目指すのであれば、冒頭に引用した記事の末尾に書かれた本を読む、というのがかなり正しい選択肢だとは思います。ですが、もしかすると、競技プログラミングとITエンジニアの仕事が遠く、いきなりは興味が持てないかもしれません。

そういう人のために、少し業務に寄ったコンテストたちを紹介していこうと思います。

 

AtCoder Heuristic Contest

Contest Archive - AtCoder

自社からの紹介でごめんなさい><

AtCoderの通常の問題とは違い、答えの完成度を出来るだけ上げるタイプのコンテストです。最近AtCoderでもナンバリングが付くようになり、レーティングの実装も決まりました。

問題を解くだけではないため、定数倍改善や、計算量以外の評価など、様々な要素が加わり、既存のコンテストよりも考えるべきことが多いです。とはいえ、最終的に求められるのは「アルゴリズムの改善」なので、AtCoderのレーティングとも強く相関がみられます。

コードを扱う期間が長くなる、コード長が長くなるなどから、ソフトウェア工学的な考え方や、実際の開発に使われている手法を身に着けていくことが、実力向上に寄与する点で、効果的なのではないかと思います。

 

ISUCON

ISUCON公式Blog

Webページを与えるので、制限時間以内に可能な限り早く動くようにしようぜ!という、極めて実践的なコンテストです。競技プログラミングにおける高速化と、Web系のフロント・バックエンドで求められる高速化の差異が感じられる良いコンテストだと思います。

知識がないと難しいと思うので、いきなり参加するのではなく、過去問を読み、他の参加者の手法を学んでいきましょう。Web系に興味があるのであれば、間違いなく参加するべきコンテストです。

 

Codingame

Coding Games and Programming Challenges to Code Better

ゲームAIを対戦させるコンテストです。こちらも期間が長く、きちんと考えてコーディングしないと後々酷い事となるため、前述したHeuristic Contestと同じく、開発手法の必要性を身に付けるのに良いコンテストだと思っています。

また、ゲームAIを扱うコンテストなので、見た目のキャッチーさは抜群です。AtCoderより先にこちらを勧めた方が良い学生や子供もたくさんいると思います。

 

機械学習系コンテスト

KaggleやSIGNATEなどがありますし、挙げないと不自然かな?と思って挙げましたが、競プロとかはちょっと毛色が違うと思っています。

ただし、競技プログラマがデータサイエンティストになって活躍する事例や、Kaggleなどで元競技プログラマが活躍する事例は多く聞きますし、相関は大きいようです。AIやデータサイエンスに興味があるのであれば、参加してみるのも良いでしょう。

 

反省

最初に書いたように、僕はAtCoderの社長です。SNSでの情報発信をメインにしているため、多くの情報はSNSやblogに載っているのですが、情報が分散していて、会社のHPにこうした情報発信を書いていないのは良くないな、と確かに思っています。ここはかなり反省するべきかな、と思っています。

今回はブログを読む層の方々に届けるためにこうした文章を書きましたが、これらはAtCoder上にも掲載するべきだと考えていますし、そうした取り組みはしていきたいと考えています。この点に関しては、僕が100%悪いです。

 

さいごに

もしこの記事を通じて競技プログラミングに興味を持った場合は、以下の動画を見てもらえると嬉しいです。テレ東のNEWSに掲載された動画で、競技プログラミングがどんなものかを分かり易く説明してくれています。

www.youtube.com

 

僕は競技プログラミングを広めたくて会社を作った人間なので、競技プログラミングが極端に悪く評価されることも、逆に良く評価されることも、良くないと思っています。

この手の議論は競プロ界隈ではすでに食傷状態になってしまっているのですが、そうでない界隈の方々にも、きちんとメッセージが届くことを願っています。