AtCoderについて

はじめに

この記事はCompetitive Programming Advent Calendar Div2013の19日目に相当します。
他の方がデータ構造とプログラミング技法について触れておられるので、競技プログラミングに関連した社会問題について書きます。
よって、本記事ではテクニカルなことに対して一切言及しません。
また、この記事の根拠となるデータは一切ありません。

概要

近年、若者の就職活動が社会問題となっています。
学生は職を得るため100社に応募し、企業側は人材を得るため大量の応募者から選定します。この工程で、学生も企業も疲弊するのが問題です。本記事では、この問題に対して部分的に言及します。ここで指す"部分的に"とは、プログラマについてを示します。
さて、プログラマの採用について、企業側が抱える問題は以下の点です。

  1. コーディング能力の高い人材がほしいが、人事部では実際の能力を判断できない(問題をホワイトボードで解かせてみても、その解法がどれだけ適切か、人事部では判断できない)
  2. そもそも、問題を準備するのが大変

また、1000人の応募があった場合、全ての応募者を上記のような方法で篩にかけるのは、時間的な制約上むずかしい。そこで、一般的にはESを書かせて大部分を落とすわけですが、

  • ESでコーディング能力は測れない(いくらでも嘘がつける)
  • コーディング能力の学歴に対する比例定数は高くない(生産性が100倍異なる世界なので)

という問題が存在する限り、プログラマの採用に関して、ESは有効でないと考えられます。上記のことから、プログラマの採用は改善できる箇所が複数残されているでしょう。
 その一方で、

  1. マシンのコストが低下した
  2. Web上のコンテンツが充実した

ことで、プログラミング能力を有する若者が増えています。たとえば、競技プログラミング界隈では、ICPCの参加者、レベルが急激に上昇しました。また、TopCoderの国別ランキングでは日本が4位につけています。競技プログラミングに限らず、みなさまが普段使っているモバイルアプリケーションの開発者が10代であることも珍しくないです。
また、残念ながらこの世界には「学歴の壁」というものが存在します。それは僕の妄想ではなく、純然たる事実です。我々はそれを認めなければなりません。本記事ではそこに触れます。一部の人は、目をそらしている事項だと思います。
さらに、「機械化」「エネルギ問題」「アメリカのプログラミング教育」という項目に触れます。これらも、事実です(一部、僕の妄想ですけど)。
本記事では、導入として上記の背景を紹介します。そのうえで、プログラミングコンテスト運営サービスであるAtCoderと、AtCoder株式会社を設立した動機を示し、プログラミングコンテストがいかに有用か記述したうえで、今後の社会システムの動向に対して私見を述べます。

背景

採用について

概要で述べたように

  1. プログラマの採用はむずかしい
  2. プログラミング能力を有した若者が増えている

といった点があります。

機械化の流れについて

18世紀半ばからの産業革命、1980年代に情報革命が起こり、人間の仕事が機械化されつつあります。

  1. 産業革命はハードウェア
  2. 情報革命はソフトウェア

の進化をもたらしました。今後、さらに進むでしょう。
配送業を例すると、Amazonがヘリコプターで配送を試みています。
http://japanese.engadget.com/2013/12/01/30-8-prime-air-2015/
Fordも自動運転なんてしてますね(国内メーカもやってた気がするけど)
http://www.itmedia.co.jp/news/articles/1312/16/news044.html

エネルギ問題について

さて、我々がいま使っているエネルギはいったいどこから得たものでしょうか。
原子力でしょうか?石炭でしょうか?いいえ、大部分が石油ですね。

  1. 石油 4割
  2. 石炭 2割
  3. 天然ガス 2割

ってところでしょうか。
では、人類がいまのペースでエネルギを使用したとして、石油が枯渇するまでどれだけ時間がかかるでしょうか?
これは、少なくとも私にはわかりません。ただ、石油に限らず全てのものは有限です。いつかはなくなるでしょう。
それが100年後か、1,000年後かの違いです(さすがに1,000年は言いすぎだろうけど)
さきほど、機械化の項で配送に触れました。これは、「移動」というものに、ものすごくエネルギが必要だからです。
そろそろ年末が近づいているので、私は東京から大阪に帰省しますが、航空機、新幹線、夜行バスのどれを使うにしてもエネルギは消費します。
(似たようなことは森博嗣の既刊で述べられています)
年末に帰省して、家族とのコミュニケーションが目的であるならば、GoogleハングアウトやSkypeでも十分事足りるはずで、むしろ、そっちのほうがエネルギの消費も少ないはずです。
どうして我々は移動して会うことに重きをおいているのでしょうか。
本人は移動せずに、プロジェクションマッピングではないけれど、本人の姿形を遠隔地に投影するだけで、「会っている」つもりになれるのであれば、人と人がコミュニケーションをとるために移動する必要はありません。

教育の壁について

この世には教育の壁が存在することを認めなければなりません。

  1. http://luvlife.hatenablog.com/entry/2013/08/07/221155
  2. http://anond.hatelabo.jp/20130809115823

現状として、人生は「その人がどんな親のもとで生まれたか?」で半分くらいは決まってしまいます。
あえて悪い言葉を選択すると、「DQNの子供はDQN」という運命です。
高学歴の人間と、低学歴の人間は住んでいる世界が違います。
この国には義務教育期間が9年間存在し、教育の機会は平等に与えられているのですが、親が教育に対して理解がないと意味がないです。

アメリカのプログラミング教育について

先週の12/9 ~ 12/15はコンピュータ教育期間だったらしいです。アメリカで。
http://jp.techcrunch.com/2013/12/10/20131208obama-celebrities-politicians-and-tech-cos-come-together-to-launch-computer-science-education-push/
「欧米では〜」が枕詞につくと、胡散臭くなるので大嫌いですが、アメリカでは情報教育に力を入れるみたいです。
「普段から使っているコンピュータの仕組みを知ることは重要だ」みたいな風潮ですが(ほんまか?)、
これは建前で、本音はコンピュータサイエンスで国力をさらに増強させるためだと思います。
この分野は軍事転用が容易ですし(というか、もともとが軍事目的であったものが多い。インターネットとか)、ソフトウェア産業は利益率が高いです。2~3万のマシンと、数人の人間で莫大な利益をあげることができます。
ぶっちゃけた話、プログラミングできない人間は駆逐されるんだろうなーと思ってます。
ただでさえ貧富の差が激しい国なのに、さらに進むのではないかと思います。
あと30年もすると、コンビニの店員さんや、配送のおっちゃん絶滅するのではないかと妄想しております。
「地球に優しい」という言葉がありますが、これは、生産性の低い人間を駆逐することが地球にとって良いことだ。という意味です(エネルギ的な観点で)。気持ち悪い言葉ですね。

目的

AtCoder株式会社はプログラミングコンテストを運営している会社です。2012年の6月に設立しました。ちょうど僕がB4のときです。
設立動機はいろいろありますが、いちばん大きかったのが、

  • 学歴の壁をなくしたい

と常々思っているからです。
少し、自分語りをします。
僕は和歌山大学の学生です。高学歴ではありません。よくある地方の国立大学です。
神戸で生まれて、大阪の南(大和川こえてます)のほうで育ちました。
小中高と公立です。
大和川以南なので、義務教育期間はエキセントリックでした。

  • 一夜で学校のガラスは全て割れる
  • 体育館の裏にコンドームが落ちている(噂では注射器も)
  • 車パクって少年院とか普通
  • 卒業後、同級生が年下の中学生に気分が高まるお薬を売りつけて新聞に載る

まあ、こんな環境です。これが普通です。
この記事は競技プログラミングアドベントカレンダーなので、読者はほとんど競技やっている人だと思います。
これが「普通」な世界があるんですよ。ご存知でした?
で、悲しいかな、こういう人たちの子供って同じような道を歩みます。ほぼ間違いなく。
深夜にドンキホーテというお店にいくといいです。改造した軽自動車(高確率で車内にピンクのふわふわがある)に一家で来店されています。
僕らの感覚からすると、0時だとかに子供を外出させるってやばすぎでは...って感じですが、意外とそういうかたがいらっしゃいます。
(近所にドンキホーテがないなら、夜遅くにチェーン店の居酒屋にいくと遭遇できます。子供を居酒屋に連れて来店されています。)
そういった方々にとって、それは「普通」の行為なのです。だって、自分が子供のときからそうされていたならそう感じるでしょ。
さきほど、「プログラミングができない人々は駆逐される」と冗談半分で書きましたが、本当に機械化が進んでいまよりも人の仕事がなくなった場合、冗談が現実になります。仕事がなくなって生活できない。プログラミングに触れる機会すらない。
自分ができないだけならまだしも、自分の子供にすら機会が与えられない。
そういった意味で、僕は義務教育にプログラミングを導入するのは賛成です。
結果が公平である必要はないが、機会は平等でなければならないと考えています。
一部の尊敬に値するスーパープログラマの方々は、そんなことをしても意味がないと仰っています。
プログラミングは義務によって習得できるものではないと、わかっているからです(読み書き算数とは違いますよね...)
しかし、みなさまは「学校の勉強とプログラミング能力は比例しない」ということもご存知かと思います。
プログラミングの才能は学歴に関係ないともご存知だと思います。
なので、プログラミング教育を行うことで、「大和川以南の普通の家庭」からスーパープログラマが出現してもおかしくないと僕は思います。
また、経済的な観点では、一人の天才プログラマはその国に莫大な利益をもたらすので、積極的に発掘するべきだと思います。
関連して、いまサイバーエージェントさんが子供用のプログラミング教室を開いていますが、あれは本当に素晴らしいと思います。
まだ、「習い事」レベルですけど。親が高学歴で、教育に価値を感じてるご家庭のお子様が参加されていると妄想していますが、実際のところどうなんですかね。気になります。

なぜプログラミングに注目したのか
  • 1人の圧倒的な才能が文明を飛躍させるから

天才プログラマ1人と、天才数学者1人のどちらが文明を発達させるかな?と考えたときに、プログラマだと思ったからです。
文明もそうですけど、経済活動を考えると、プログラマが新たなソフトウェアを作ることで、その国にお金が入ります。
だからアメリカはプログラマ育成に投資してるんじゃないかなと思います。日本も、いまの豊かさを維持したければ、ソフトウェア産業に投資するしかないのでは?と妄想してます。

  • 学習するための金銭的なコストが低い

野球とサッカーの普及度合いと同じです。お金かからないほうが人口増えます。プログラミングするためにはマシンが必要ですが、近年は3万円の中古マシンでも開発できます(ギークなみなさまが子供時代に使っておられたマシンよりも安くて高性能です)。
貧困の連鎖を抜け出すためには、金銭的なコストは低いほうが良いです。
また、数学者とプロ野球選手、どちらも憧れの存在であることに違いはないです。ここには突っ込まないでください。

競技プログラミングAtCoder株式会社

AtCoder株式会社について書いてなかったので書きます。
我々は「競技プログラミング」に価値を感じています。「競技プログラミング」とは与えられた問題に対して

  • 素早く
  • 正確に

コーディングする技術を競うものです。
よくわかんない人はNEVARまとめのこの記事をご覧ください。

  • お金をはらうとき、手元に残る硬化の枚数を最小化するには、いったいどうやって払えばいいか?

とか、そういった問題をプログラミングで解く競技です。
この競技のポイントは

の3点です。
はじめに、テクニカルな話はしないと書きましたが、嘘でした。多少は書きます。ただ、厳密には書きません。

データ構造

例を挙げます。以下が「配列」です。
f:id:Akensho:20131220020036p:plain
一列の箱に数字が格納されてます。
以下が「二分木」です。今度は、一列ではなく、高さがあります(四角と丸の違いは気にしないでください)。
f:id:Akensho:20131220020047p:plain
要は、「データ(数字とか)」の保存方法です。

アルゴリズム

いまから、数字を探す手順を2通り述べます。まずは、前から順に見ていく方法(線形探索)です。
f:id:Akensho:20131220021448p:plain
これは簡単です。先頭(左端)から、目的の数字がみつかるまで探します。
次は、大小関係を比較していく方法(二分探索)です。
f:id:Akensho:20131220021541p:plain
これは少し難しいです。目的となる数字を頂点(4から)比較していく方法です。
もし、あなたが、5を探している場合、

  • 最初の4よりは大きいので右に行きます。

次に、6と比較します。

  • 5は6より小さいので、左に行きます。

これで、5に到達しました。全ての数字に対して同じことが成立します(そうなるようにデータが構築されています)

計算量(O記法)

データ構造とアルゴリズムに対して2通りの方法を述べました。
ここで気になるのは、

  • どちらのほうが「良い」のか?

という点です。「良さ」を定量的に評価するため、ここで計算量という概念を簡単に紹介します。
いま、配列の長さは8です。線形探索を行って、あなたが探したいデータが一番後ろにあった場合(つまり、最悪のケースなので8)、8回も探索する必要があります。
一般化すると、配列の長さがNのとき、最悪のケースではN回も探索する必要があります。
情報科学の分野ではO(N)と表記します。最悪の場合の探索回数です。
つぎに、2分探索を行います。これは、頂点(図では4)から下に向かって行います。あなたが探したいデータが一番下にあった場合(これは最悪のケースで7)、3回の比較ですみます。
一般化するとO(logN)です(綺麗に木を構築できれば)
ここで、Nの値を大きくして、1兆(10^12)の場合を考えましょう。
線形探索の場合はO(N)なので、最悪の場合は1兆(10^12)回の探索が行われます。
二分探索の場合はO(logN)なので、最悪の場合でも40回程度です。
このように、データの持ち方(データ構造)と、手順(アルゴリズム)を工夫することで、高速な処理を書くことができます。

競技プログラミングに対する批判

定期的にあがります。面白いので、これをみましょう。
面白かったですね。Togetterでまとめられた論争に対して本当に素晴らしい記事が以下になります。
競技プログラミングと問題解決能力 - 発声練習
仰るとおりだと思います。
業務における問題解決能力が本当に培われるかどうか が問題になりますが、僕自身は「培われる」と信じています(残念ながら客観的なデータはないので、個人の信条です)。
ユーザ数が100万規模のWebサービスなのに、SQL文で "select * from users where..." したときにlimitをかけてないとか。
さらに、配列の要素数が10万オーダなのに、forの2重ループ書いて遅いとか、あるあるネタだと思います。
こういうのって案外気がつかないものです。競技やってた人は計算量の概念を理解しているので、この手のミスしてもすぐにデバッグします。
そうです、デバッグ能力も向上します。基本的に、競技は使える時間が短いので、デバッグ能力が低いと勝てません。
本当に、スポーツにおける基礎体力みたいなものだと思います。
対して、業務は十種競技 - Wikipediaみたいなものだと想像してます(学生起業したので社会を知らないのです...)。
競技プログラマ、100m走(コーディング力)はとても早いですが、棒高跳びフレームワークの使いこなし)は苦手かもしれません。
しかし、業務は十種競技だと妄想しているので、棒高跳びだけが得意な人よりも高得点が叩きだせそうです。基礎体力が高いので、ポテンシャルはあるためです。
棒高跳びですけど、委員会が棒の規格を変更した(案件が終わって、得意なフレームワークに携われなくなった)場合、その選手はどうなるんですかね。

ということで

AtCoder株式会社はプログラミングの基礎体力を向上させるためにコンテストを開いています。
コンテストで結果を残して、就職に直結できるとさらに良いですね。
いま、ある企業のプログラマ採用に2人の志望者がいて

  • テニスサークルで部長やってました
  • コンテストで入賞しました

とそれぞれが言っています。どちらが企業にアピールできるのでしょうか。就活したことないんで僕にはよくわかりませんけども。

おわりに

  1. この世界は機械化 or 自動化の方向へ進むだろう(妄想)
  2. というのも、エネルギは有限だから(事実)
  3. 機械化したほうが効率がよさそうな、単純作業という職はなくなるだろう(妄想)
  4. その場合、真っ先に職がなくなって駆逐されるのは「低学歴」な人(事実)
  5. 駆逐されるのは自己責任だが、その子供まで酷い目にあうのは残酷(個人の感想)
  6. 貧困の連鎖から抜け出すためにはプログラミングがよさそう(妄想)
  7. プログラミングの基礎体力をつけるためには競技プログラミングがよさそう(信条)

ということを言うために、長々と書きました。卒論の半分くらいの文字数になりました(かかった時間は1/50なのに)。
また、設立の目的に、

  • 学歴の壁をなくしたい

と書きました。これは本当です。ただ、「恵まれない人を救いたいから!」というモチベーションではありません。
単純に、「気持ちが悪い」からです。いまの社会構造が。
生まれた場所で人生が決まってしまうのは、僕にとって「吐き気を催す邪悪」です。
なので、全て「自分のため」です。そのような残酷さを受け入れることができません(ほとんどの人は大人になる前に受け入れているんじゃないかと思います)。
厨二病といえば、厨二病です。僕は残酷さに対して納得できていないです。だからこんなことをしています。
「納得は全てにおいて優先される」と敬愛するジャイロ・ツェペリは言いました。同感です。この気持ち悪さを抱えたまま生きていくことは難しいです。