アルゴリズムのコンテストにおけるエンジニアのランク

高橋直大氏:ここまでアルゴリズムの話をしましたが、こういうことを楽しくやって課題解決する人たちがいます。「そんなすごい課題、うちにはなくない?」と思う人、いると思うんです。いろいろな会社の人がいると思いますが、本当に難しいこと、燃料運用の最適化などをやる人は、コンテストやアルゴリズムをやっている人の中でもレベルの高い人です。

スライドはAtCoderのグラフですが、多くのコンテストのサイトには順位がついていて、実力判定の手段があります。AtCoderは最大手なので宣伝になってしまいますが、このように色でだいたいの実力がわかります。日本だと、この色でだいたいアルゴリズムのコンテストにおけるエンジニアのランクがわかるようになっています。

しっかりやっている人は茶色からで、茶色から青、ギリギリ黄色まではどの会社にも応募してくる可能性のある人材で、このへんの人たちは全員研究者で、こういう特殊なことをやる人材ではありません。

コンテストの種類の話もしておきます。先ほどのようなコンテスト、AからBの最短距離を求めなさいといったら10です。

(スライドを指して)それに対して最近はもう1種類、ヒューリスティックコンテストというものをやっています。Googleもやっていますが、何点取れるかというゲームのようなコンテストです。

大きなパネルが与えられて、左下のように1×2の同じタイルは踏んじゃダメ、同じパネルを2回踏んじゃダメとした時に、何点まで集められるか。スライドの3つどれでも正解だけど、当然一番右が点数が高いというものです。

アルゴリズムは最終的に「ものをつくる」につながる

アルゴリズムの説明にすごく時間を使いましたが、だいたい何やっているのかがわかれば、扱い方もわかるのがエンジニアだと思っています。

ざっと説明しますが、アルゴリズムとは基本的にプログラミングの基礎でロジックを組み立てるものです。ロジックの組み立てを繰り返してプログラムができるので、どのジャンルにもほどほどに役立ちます。

一方で、Web開発をする、フロントエンドを作るなどの詳しい知識があるかというとぜんぜんありません。「ものをつくる」からはすごく遠いんです。でも最終的に、ロジックを組み立てる要素はすべてにあるので「ものをつくる」につながります。

今2つ紹介しました。アルゴリズムコンテストもヒューリスティックコンテストも、中の人から見るとぜんぜん違いますが、コンテストをやっていない人から見ると似たようなもんだと思っています。アルゴリズムは、数学的な考え方や計算速度の改善が比較的得意。それに対してヒューリスティックは、研究開発、大規模開発、継続的なロジックの改善、複雑な開発が比較的得意ということかな?

競技プログラマーの特徴

あまり詳しく説明すると長くなるので、ざっとスライドを映します。右に「AtCoderJobs自己申告分野」と書いてあるのは営業資料から取ってきたからです。競技プログラミングでは問われないけれど、開発に必要なものがたくさんあります。メチャクチャ重要なものがたくさんあるんです。

大規模なチーム開発、課題の明確化、手段の選定、コードの保守・運用、セキュリティ対策など。これができないエンジニアはどの分野でもだいたいダメでしょう。エラー処理もメチャクチャ大切です。これらの分野が抜けていて、でも確実な得意分野として大きなものを持っているのが競技プログラマーです。大きなデータやパフォーマンスの改善はすごいし、論理的な本質を見抜くところがメチャクチャ強い。また、土日にコンテストに出ているので成長が早いという特徴もあります。

ここまで状況を話した上で、結論自体は簡単なのですが、競プロ(競技プログラミング)人材はどう育てればいいのか。未経験者や普通の情報系の学部上がりの人たちと同じように研修を受けて教えてあげればいいと思います。

コーディングができる、アルゴリズムがわかるという理由だけでそんなに信用しちゃダメだし、最初の段階ではチーム開発を意識したコーディングをやっていないので、そのまま仕事にアサインすると絶望的なことになります。

コーディングや論理的思考力は高いので伸びしろはあります。伸びしろがあることはすごくわかりますが、信用はしないで「この人はほぼ未経験。未経験だけどポテンシャルの塊で、ある部分だけできる」という意識を持って接することをお勧めします。もちろん人によりますが、このクラスなら、アルゴリズムができる人だからと意識して仕事をアサインする必要はそんなにないと思います。

あくまで属性の話なので、個人がどうかは当然確認しないといけませんが、「アルゴリズムの人だから」とそんなに意識して身構えなくていいと思います。

競技プログラミング人材と企業間で起こっているミスマッチ

とはいえ、そもそもアルゴリズム人材といえばアルゴリズムができる人が欲しいと思うんです。

もちろん研究開発に適したアルゴリズム人材もいます。(スライドを指して)グラフの右のほうですね。どちらかというと、これはアルゴリズムのグラフで、本当はヒューリスティックのグラフが正しいです。先ほど色で実力がわかると言いました。(スライドを示して)「こちらの話は後ほど」と書いてありますが、このあたりのすごい人たちの話をしていきます。

すごい人たちも、基本的には業務におけるコーディングがわかっていないことが多いですが、アルゴリズムにこだわりがある場合がそこそこあるし、できればアルゴリズム力を活かした課題にアサインしたほうがいいと思っています。でも、そうした課題を持っていない企業が非常に多いし、残念ながらそこでミスマッチがけっこう起こっています。

「強い人を採用してもうちでやってもらう仕事がない」という会社がたくさんあるのも事実だし、ほかで活躍したほうがいいという話もけっこうあると思うんです。アルゴリズム人材が集まった。彼らを最大限に活かす課題をアサインしてあげたい。でも課題がない、ということがあると思います。

「アルゴリズムを使ってコンビニを便利にしよう」

ここから後半の話題、「アルゴリズムの課題をどうやって見つけるか」にいきます。

ここに初出しのおもしろい資料があります。おもしろい資料というか、おもしろ思考実験かな。今回「アルゴリズムコンビニ」というテーマを用意しました。「アルゴリズムを使ってコンビニを便利にしよう」と思った時、どんなものを思い浮かべますか? できる限りすごいものを考えてみてください。アルゴリズムによってできるかできないかはそんなに考えずに自由に出してみてください。

アルゴリズムでできるコンビニ、どれくらい便利にできるかな。今できていないことができればいいですね。どんなものが浮かびますか? 今想像することが大切なので、どんなことがあるか、想像して語ってみてください。次に行きますね。

僕が、どんなことがコンビニでできたらうれしいかなと考えると、(スライドを指して)これですね。肉まんを思い浮かべます、「肉まん欲しいな」と思ったら、コンビニにあるコンピューターが「あいつは肉まんを欲しがっている」と察知して、それを察知したコンビニが虚空から肉まんを召喚してくれる。「やった、肉まんが食べられる、おいしい!」となるのが理想のコンビニだと僕は思うんです。

これたぶん、みなさんと被ってないと思うんです。たぶん被ってませんよね。なぜでしょう? たぶん、みなさんが想像したコンビニより、このコンビニのほうが便利だと思うんです。欲しいと思ったらその瞬間コンビニが察知して届けてくれる。しかも動かなくていい。メチャクチャうれしくないですか(笑)?

理想のコンビニがなぜ思い浮かばないのか

これは半分ジョーク半分真面目なんですが、これを思い浮かべない理由って何だろう。コンピューターにはこれらができないことをみんな知っているからなんです。家で欲しいものを考えてもコンビニには伝わらない。そもそもコンピューターが目の前にあったとしても自分が欲しいものは伝わらない。虚空から肉まんを取り寄せる技術も存在しない。こんなこと、みなさん知っていますよね。

妥当なものだと、例えばAIによる無人店舗の実現、購買結果の学習による自動的な仕入れ量調節、配置、入店時に人に合わせたオススメ商品の提示。これらがありますよね。これくらいは思い浮かべるとは思うんです。なぜこれらを思い浮かべるのか。よくできた科学は魔法と区別がつかないと言われますが、文章をまとめたり、在庫管理をしたりなど、コンピューターでできることは当然みなさんわかると思うんです。そういうことができるのは知っている。

魔法でないとできないこと。虚空から肉まんを取り寄せる。欲しいものをエスパーに察してもらう。そんなことはできないとわかっている。その間に、人間ががんばればできること、前はできなかったけれど高度な技術を使えばできるようになったことが存在するんです。例えば手に取った商品を自動的に認識したり、需要に合わせた商品を入荷したりすることは、人間やAIががんばればできそうですよね。だからスライドの右の項、左の項があって、AIができるのはこのへんだろうと想像して、みんなは「こんなのはできないけれど、これならできるんじゃないか」と、左の項を想像してコメントするんですよね。

(スライドを指して)コンピューターができると思っていることは左に寄っていて、コンピューターやAIができることはどんどん右に行っているんです。

右に行っているので、いつの日か虚空から肉まんを取り出せるかもしれない。発表を聞いている方は技術者が多そうなのでわかっていると思いますが、今の段階でなにができるかを、ほかのみなさんはあまりわかっていないと思うんです。「なにが魔法で、なにが(コンピューターに)できることなのか」という区別がついているのかということです。

現場で困っている人はアルゴリズムが魔法なのか技術なのかがわからない

(前のスライドを指して)先ほどの問題で、AからBに行く。これはコンピューターで簡単にできます。そんなに難しくありません。これ自体はそんなに難しくありませんが、Aからすべてをたどって帰ってくる、Aからウネウネウネと行って、全部の丸を訪れてからAに帰りたい。今頂点(丸の数)は20個くらいですが、この20個が10万個だったとして、できるかできないか。

魔法なのか、すでにできる技術なのか、みなさんどう思いますか? 「A:魔法、絶対無理」「B:まだ無理」「C:最近できるように」「D:前からできる」「E:人間でもできる」。さあ、どれでしょう。AからEのうちから答えてみてください。どう思いますか? みなさん、コメントをどうぞ。

考えてみると、けっこう難しいと思います。こういう問題が出てきても、AIでもできるのかどうかはわかりませんよね。Aだと思っているものは提案されないし、Eだと思っているものも提案されない。現実的には、CかD、Bもギリギリ提案されるかなというところです。まだコメントを見ていませんが、AからEまでのコメントが来ませんが、答えは…あっ、「D」って来ましたね。

これは「巡回セールスマン問題」と呼ばれるもので、最短経路をバッと求めるのは、Aの不可能として見るか、Bのまだ無理として見るかなんです。P≠NP予想と絡んでいて、巡回セールスマン問題と呼ばれるものは解けない。証明できたら100万ドルという話もありますが、解くことができないと言われている有名な問題です。巡回セールスマン問題だから無理だと判断した人が、たぶんどこかにいると思います。

とはいえ、最短であることを求めるのが難しいだけで、現実に使える短いものは実は簡単に求められます。はるか昔から、2SATなどのアルゴリズムで実用上十分に可能なものが出せて、けっこうできちゃうんですよ。

そういうものを活用した事例はたくさんあります。例えばオプティマインドという、車の配送のライトワンマイルを最適化する会社があるんですが、(スライドを指して)見た目、この問題じゃないですか。点があって線がつながっていてどうたどれば一番早いかって、このとおりの問題をやっているんです。

このようにアルゴリズムは実務として役立ちますが、魔法なのか技術なのかはわからない。エンジニアにはわかるかもしれませんが、実際に現場で困っている人には(理解)できないかもしれません。

(次回へつづく)