「問題解決能力」を磨き続け学生プログラマー日本一に

ハイパー学生のアタマの中 Vol.12

“学生プログラマー日本一”東京大学大学院の吉里幸太さんが目指すものとは?


■コンテストへの参加を通して、プログラミングの面白さに魅了

プログラミングを始めたのは、中学に入ってからです。友達がパソコンを使って面白そうなことをやっているのを見て、パーソナルコンピュータ研究部に入部しました。もともと、数学が好きで、特にパズルを解いたり数式をいじって遊ぶことが好きだった僕にとっては、とても面白い世界だと感じました。何より、パソコンが1台あれば発想力次第で何でも作ることができます。そんな自由さ、お手軽さも魅力的で。部室にあった参考書を読んだり、友達や先輩に教わったりしながら、プログラミング言語やその仕組みについてのめり込むように勉強していきました。

僕の通っていた中・高は、変わり者が多い学校だと言われていまして(笑)。当時から、自分には及びもしないような発想をする人が周りにたくさんいて、彼らの物事を理解するスピード、広くて深い知識量、あっという間に答えを見つけてしまう頭の回転の速さは驚異的でした。そんな仲間と一緒に遊んでいるうちに、僕自身の知識や思考力も自然と引き上げられたんだと思っています。

ちょうど僕が高校3年の時に、世界中の高校生がプログラミング能力を競い合う「情報オリンピック」に参加してみたのが、競技プログラミングとの出合いです。競技プログラミングとは、プログラミングを通して与えられた課題を解決する力を競うコンテスト。求められる能力はどちらかといえば数学寄りなので、パソコンの仕組みに詳しかったりさまざまなプログラミング言語に精通していたりする必要はありません。もともと、難しい数学の問題を考えることが好きだった僕にとっては、たくさんの興味深い問題に出合える楽しい時間でした。その後は、解けない問題があると悔しくて、どうやったら解けるのかを必死で考えたり、足りない知識を身につけるために勉強したり。そうやって競技プログラミングという世界にどんどんはまっていきました。

いろいろなコンテストに積極的に参加するようになったのは、大学に入ってからです。一年に一度優秀なプログラマーたちが一堂に集う世界大会から、ほぼ週一で行われていてネット越しに気軽に参加できる小規模な大会まで、ひと口にコンテストと言ってもいろいろな種類があります。僕自身は、「1点でも多くとって、少しでも順位を上げよう」と上位を目指すことはもちろん、シンプルで奥深い問題や、ほかの参加者が書いた美しいコードに出合えることに期待して、コンテストに参加しています。たまに自分でもいい問題が思いついたときは、それをほかのみんなに出題してみたり。そんなふうに、いろいろな面から競技プログラミングを楽しんでいますね。

学生プログラマー日本一決定戦―そんなコンテストが開かれると聞いて参加したのが、「CODE VS(コードバーサス)」という大会でした。ルールは、「マップ上に出現する敵を効率よく撃退するためのプログラムを組む」というもの。要求される能力自体はほかのコンテストと本質的には同じなのであまり問題はありませんでした。ただ、たまたま決勝戦の日程と研究室で投稿予定だった論文の締め切りが重なってしまい、問題の性質について細かく調査する時間があまりとれず、経験則と直感を信じて挑むようなかたちになってしまいました。結果的にはそれがうまくいったということはありますが、僕が優勝できたのは「運がよかった」という気持ちが強いんです。

とはいえ、個人戦で優勝できたのは初めてですから、素直にうれしかったです。その日はずっと興奮しっぱなしでしたし、もっと自分を磨いていこう、頑張ろうという気持ちにもなれました。特にこの「CODE VS」という大会は、ビデオゲームのトーナメント大会のように、競技者のプログラムが動く様子が大画面に映し出されてリアルタイムで攻防を繰り広げるという、一般の方が見ても楽しめる「わかりやすい」コンテストでした。より多くの人に競技プログラミングというものを知ってもらうきっかけにもなったはずです。

プログラミングというと、パソコンに詳しい人だけのものというイメージを持つ人が多いと思います。しかし、それだけではなく、あらゆることを考えるうえでとても重要となる数学力や問題分析力を、アルゴリズムを考えることを通して鍛えるという側面が認知され始めています。競技プログラミングをやっていた人たちが社会に出て活躍している例はたくさんありますし、そうした観点で学生の能力を測ろうという企業側からの動きが出始めているのは、とてもいいことではないかと思っています。


■スゴい人がたくさんいる環境で、刺激を受け自分を高めていきたい

今、僕が大学院で取り組んでいるのは、音声アプリケーションに声の抑揚を組み入れるという研究です。例えば、テキストを読み上げてくれる音声合成ソフトに、怒る・喜ぶといった感情がこもった言葉をしゃべらせるにはどうしたらいいのかを考え、そのために声の抑揚のパターンをうまく表現できる確率モデルを立てるといった研究を行っています。

競技プログラミングをやっている人の中には、その経験を生かして計算機科学の研究をしている人も多いんです。でも僕は、修士の2年間は今までにやったことがない勉強をしてみようと考えました。あえてコンピュータサイエンスの道には進まず、今まで自分が培ってきたものとは“別の能力”を要求されるような分野に挑戦したんです。難しいことだらけですが、需要のある分野で、現実に応用できれば人のためになれる研究です。

就職を考えるようになって、自分のやることを通じて「社会に役に立ちたい」という気持ちが芽生え始めています。将来はプログラミングの経験を生かして、ソフトウェアエンジニアになりたいと思っていますが、何か自分が作り出したものを通じて、世の中にいい影響やインパクトを与えられたらいいなと考えています。その上で、多くの人に使ってもらえるようなものを開発できたらうれしいし、世の中に価値を提供するためのノウハウについても学ぶことができたらいいなと思っているんです。

これまで僕がいた環境がそうだったように、スゴいと思える人の中でもまれることは、今後も続けていきたいです。だから、能力のあるエンジニアが集まっているような会社で、思う存分、チャレンジングな仕事ができる職場で働けたらいいなと思っています。ソフトウェアエンジニアとしてただものを作るだけではなく、誰も解いたことがない、解けるかどうかもわからないような問題に挑戦したり、尊敬できる人たちと一緒に議論したり。そういう環境の中で働いていくことができたら、最高だと思うんです。