Dear Great Hackers

  1. Qiita
  1. トピックス

Podcast番組 | 道具としてのアルゴリズム〜けんちょんさんと競プロ〜

『エンジニアストーリー by Qiita』は、「エンジニアを最高に幸せにする」というQiitaのミッションに基づき、エンジニアの皆さまに役立つヒントを発信していくPodcast番組(無料・登録不要)です。
毎回、日本で活躍するエンジニアの方々をゲストに迎え、キャリアやモチベーションに関するお話をしていただきます。

今回の記事では、株式会社NTTデータ数理システム顧問で、モノグサ株式会社 コンテンツアーキテクトのけんちょんさんをゲストにお迎えした第25回について、配信の模様をご紹介します。

▼けんちょんさんの前回配信を見てみる

記事で読む

Podcastで聞く

今回のエピソードでは、競技プログラミングの楽しみ方や、けんちょんさんが出版されている本のお話しにも関わってくる「道具としてのアルゴリズムを道具にするということ」について深くお話をお伺いしました。
是非ご覧ください!

プロフィール

けんちょん
<ゲスト>
株式会社NTTデータ数理システム顧問
モノグサ株式会社 コンテンツアーキテクト
1988年生まれ。2014年東京大学大学院情報理工学系研究科修士課程修了。修士(情報理工学)。現在、株式会社NTTデータ数理システム顧問、モノグサ株式会社コンテンツアーキテクト。数学や情報科学の諸分野の啓蒙活動に従事。著書に『問題解決力を鍛える!アルゴリズムとデータ構造』講談社 (2020) がある。数理最適化や機械学習を活用した数理コンサルティング業務の経験も多数。趣味は競技プログラミング、虫食算作り、国内旅行など。

 

清野 隼史
<番組ホスト>
Qiita株式会社
プロダクトマネージャー
内定者アルバイトを経て、2019年4月にIncrements株式会社(現 Qiita株式会社)へ新卒入社。Qiita Jobs開発チーム、Qiita開発チームでプロダクト開発や機能改善等を担当。2020年1月「Qiita」のプロダクトマネージャーに就任。

テーマ「道具としてのアルゴリズム〜けんちょんさんと競プロ〜」

清野:本日のゲストを紹介します。株式会社NTTデータ数理システム顧問で、モノグサ株式会社 コンテンツアーキテクトのけんちょんさんです。

けんちょん:けんちょんこと大月です。よろしくお願いします。

清野:はい、よろしくお願いします。前回はけんちょんさんと「エンジニアのキャリアチェンジ」についてお話ししました。今回は「道具としてのアルゴリズム」をテーマに、早速お話しをお伺いしていきます。

「人が好き」という想い

清野:前回エピソードでも、大学時代にアルゴリズムに興味を持ち始めていろいろ始めたとお話されていましたが、今はその啓蒙活動もしていらっしゃいますよね。興味を持って、そこから啓蒙活動に入っていった流れやきっかけを、お伺いしても良いですか。

けんちょん:元々そういうのが好きというのは大きいと思います。いつかは、例えば競プロをやっていた時に、自分がやっている問題の解説とかは、自信が持てれば外に出したいという思いは学生時代からずっとありました。

やりたいという気持ちはたぶんずっとあったんですけれど、きっかけは数理システムの先輩です。発信活動や自分の作った成果物をGitHubで出していくといったの活動の重要性を訴えられていて、じゃあ僕もやってみようと始めたことがきっかけです。

清野:そうなんですね。そのようなアウトプットの文化みたいなのが、NTTデータ数理システムの中でもあったんですか?

けんちょん:その先輩の方が、元々アウトプットというか外部に出していくのが好きな方だったという感じですかね。先輩は多分好きというよりも、戦略的思考に基づくものだったと思います。

その会社として行っていることをきちんと示して、プレゼンスを高めていかないとっていう課題意識が強かったんだと思います。僕はそういうことをやりたかった一方、自信を持てていなかったのですが、実際やってみると周りからの好意的反応が多くて。役に立ったとか、分かりやすかったという声をたくさん聞いていくうちに、少しずつ自信が増していったってことだと思います。

清野:なるほど。けんちょんさんのお話聞いていて、いわゆるエンジニアってみんなアウトプットした方がいいとは漠然と思っているけれど、結構大変なので頑張ってやってるって方の方が多い気がしてます。

けんちょんさんは、そもそもアウトプットをしたくてやってるっていうのが新鮮だなと思いました。そういうアウトプットとか啓蒙的な活動をやりたいなとか、好きだなって感じた理由というか、そのような想いってどういうのがあったのですか?

けんちょん:「反応をもらえることが好き」っていうのはあると思います。人に何かしてその反応が返ってくるとか、たぶん人が好きなんですよね。人が好きだから人に何かアクションする、すると何か反応が返ってくるということ自体が単純に好きっていうのがあります。

自分にとって世の中に問いかけることがしやすいものっていうと、アルゴリズムとか、競プロとか数学だったり。なのでそういったものを問いかけて反応が返ってくるのが、楽しい、嬉しいのだと思います。

清野:じゃあアウトプット自体が良いことだからしてるってよりも、本当にこうして人が喜んでくれるとか反応をもらえること自体が好きで、そのような活動をやってらっしゃるんですね。

けんちょん:そうですね。

清野:けんちょんさんみたいにすごくたくさんのことを知ってらっしゃる方がそういう想いを持って活動してらっしゃるのは、僕自身も学ばせてもらってる側なので、本当にすごいありがたいなって、今改めて感じました。

競プロの面白さ

清野:またちょっと気になったのですが、そもそもアルゴリズムとか数学が好きな理由もお伺いしてみたいです。

エンジニアも結構タイプが分かれると思っていて、プログラミングやコードを書くこと自体は好きだけど数学は苦手なタイプと、逆に数値計算は好きだけどコードはあまり好きじゃないタイプがいる気がしています。

けんちょんさんが数理的なところが好きでずっとやってらっしゃる理由や、どの辺が好きなのかお伺いしてみたくなりました。

けんちょん:体験は幼少期に遡ります。公文式を幼稚園の頃とか小学生の頃とかやってたんですけど、やっていくうちにきっと数に対する感覚みたいなのが養われて、そこから自然に数学が好きになったという感じなんだろうなと。

清野:幼少期からそういうのが好きだったんですね。

けんちょん:そうですね。数学の何が好きかっていうところは結構難しいんですけど、僕自身は問題を解くのが好きっていうのが大きいと思います。数学が好きな人の中でもタイプがいくつか分かれるんですよ。いわゆる純粋な論理体系が好きだとか。その論理体系が好きっていうタイプの人は受験とかがあまり好きじゃなかったりして。いわゆる定義、証明みたいなものが好きなタイプの人は、大学に入ってから生き生きと数学をやってますよね。

僕は多分そこまででもなくて、もちろんある程度は好きなんですけど、問題が与えられてそれを問題を解く、そうして先生から褒められるところが好きだったと思います。

清野:結構パズル的な感覚に近いんですかね。

けんちょん:そうですね、パズルですね。競プロなんかもその延長って感じですよね。たまに「競技プログラミングってパズルコンテストだ」とか言ってる方いますもんね。

清野:そうですね。その延長線上で、競プロとかも好きなんですか。

けんちょん:はい、完全にそうです。

清野:なるほど、ありがとうございます。競プロとかになると、解く楽しさに加えて競技っていう概念も入ったりするじゃないですか。いわゆるレートとかハイキングとか。そのあたりはどのように感じてらっしゃるんですか?

けんちょん:競争が好きかどうかに関しては、競争はたぶん好きなんですけれど、自分にとってレーティングは資格試験を受けているような感覚に近いです。例えば数検とか英検とか受けて難級を取ると、その難級を取っている人たちと交流する資格が得られるみたいなイメージあるじゃないですか。

同じように競技プロもそのレーティングに達すると、そのレーティングの人と交流する資格が得られるみたいな感覚。実際は多分そんなそのレーティングにならなきゃ交流できないなんてことはないですが、自分の中ではそのレーティングに達することで、そのレーティングの人と初めて、より有意義な交流ができるというイメージがあるので、そのための資格試験っていう感じです。

清野:なるほど、確かに。コロナ禍に入ってから減っちゃいましたけれど、昔だとオンサイトというか、決勝に行くとリアルで会えて一緒にご飯を食べて仲良くなるみたいなのがあった気がします。確かに競技プログラミングって競技と言いつつ、コミュニティに近いというか、そういう感覚の楽しさはあるかもしれないですね。

競プロの楽しみ方

清野:競技プログラミングの話も入っていたので、そちらについてもお伺いしていきたいなと思います。

競技プログラミングは結構メジャーになってきていて、学生さんでやってる方も多いと思うんですけど、どうしても途中でいまいち問題が解けなくて挫折しちゃうとか、レートが上がらなくてしんどいとか、結構みんな感じてるところがあると思っています。

始めたあとの初期、中期、後期で、競技プログラミングをどう楽しむと良いかみたいなところも、ぜひ何かあったらお伺いしてみたいです。

けんちょん:言ってしまえば、人それぞれ納得するところが違うと思うので、自分がどういうタイプなのかっていうのを知ることが大事かなと思ってます。

例えば問題をひたすら解くことが好きなタイプであれば、、競プロって本当に無数の過去問があるので、それを解くことをひたすら楽しむということもできます。競争が好きであれば、その競争のところにコミットするのは良いと思います。結構人それぞれの楽しみ方ができるので、自分に合った楽しみ方を見つけることが大事かなと思いました。

清野:なるほど。ありがとうございます。
アルゴリズムを勉強して、能力を身につけていって、レートが上がるじゃないですか。インターネットでもたまによく議論されていると思うんですけど、それって仕事で実際に役立つのかどうかって、けんちょんさんはどう思ってますか?

けんちょん:これも人によって感覚が違いますが、僕自身はとても役に立ってると感じてます。特に数理システムで社員として働いていた頃は、競プロで培った知見とかを生かす機会がかなりありましたし、それこそ動的計画を使って解決した問題とかもたくさんあります。

あとネットワークフローみたいなのを流すといった話もありましたし、ちょっと特殊なデータ構造を実装しようみたいな案件もありました。やっぱり競プロをやってて、その延長で今の仕事をできてるって感じはありました。

清野:確かにそういう数理系だったらめちゃくちゃ役に立ちそうですよね。あとそれ以外にも、競技プログラミングの中で問題を見て理解して、別の問題に再定義し直してアルゴリズムを適用していって、そういうプロセスの考え方とかって結構共通のスキルな気がしています。

ウェブ開発とかでも「こういう機能を作りたい」となったときに、「こういう機能って言い換えるとこのような要件を持っていて、それを作るためにはこのツールを使う」などアルゴリズムとかアーキテクチャを採用するみたいな話になる気がするので、そこは僕自身も競プロをやってる中で培われた力だなっていうのは感じますね。

アルゴリズムを道具にするということ

清野:ちょっと話題を変えて。2020年にけんちょんさんは「問題解決力を鍛える!アルゴリズムとデータ構造」っていう本を出版されてるじゃないですか。アルゴリズムを自分の道具にしたい方向けにこの本を書かれてらっしゃると思うんですけど、アルゴリズムを道具にするって結局どういうことかを、もうちょっと詳しくお伺いしたいです。

けんちょん:例えばアルゴリズム勉強してて、これ何の役に立つか分からないって感じてる学生さんいると思うんですよ。でもそんなことはなくて、「アルゴリズムって役に立たせようと思えば様々な問題解決ができるよ」「これやると自分の力になるよ」ってことを見せたいって思いで書きましたね。

だからアルゴリズムを自分の道具にするのは、そのアルゴリズムを学んだことを使って、実際こんな問題も解けそうだとか、こんなことができそうだとか、そういったイメージが湧く状態になることかなと思います。

清野:アルゴリズムを勉強するだけではなくて、実際どのような場面で使えるかとか、こういう使い方ができるよね、というアイディアを培っていくのが、道具として使えるみたいなイメージになるって感じなんですかね。

確かに競技プログラミングの中で出てくる問題も、ただの問題として見るだけなら本当にただの問題になっちゃうと思うんですけれど、実生活や自分の仕事の中で言い換えるとどうなんだろう、みたいな見方もできる気がしています。

だからA子さんB子さんみたいな話だけではなくて、実世界で自分たちのサービスに当て込んだときに、データ量や計算量でユーザーにどのくらいのスピード感で届けたいかというような、アルゴリズムを活用するタイミングとか、そもそもその問題設定の仕方とか。そういうのはまさに道具としてアルゴリズムを使うってことなのかなと、お話を伺ってなるほどと思いました。ありがとうございます。

アルゴリズムの勉強法

清野:僕自身も競プロをやっていたり大学で勉強してるときに、やっぱりアルゴリズムって難しいなと感じていました。

考え方は理解しても、それをコードに落とし込むところが難しいとか、その逆のパターンもあると思います。書くのは簡単だけど考え方が難しいとか。そのターニングポイント的なのでよく語られるのが、DPとかかなと思います。DP分かる分からないで、入門と初級の間が分かれるみたいな。

どのようにアルゴリズムを理解したり勉強したりするのが良いかも、もしアドバイスとかアイデアがあれば、お伺いしてみたいです。

けんちょん:その目的だったらまさに競プロはジャストフィットするかなと思います。問題を解くことで自然にアルゴリズムの理解が深まることってすごくあります。逆に、例えば問題自体がそのアルゴリズムの中身をきちんと分かってないと解けないような問題が出されることもありますし。やっぱり問題を解くっていうのが、結構アルゴリズム力を身につけるのに有効だと思ってます。

清野:なるほど、ありがとうございます。最近は新しめの言語とかだと、よく使うアルゴリズムなどはライブラリ化されていることも多いですしね。そのあたりって、そういうツールを競プロの中でもすぐ使ってしまって良いのか、それとももう一回自分で書き直して理解したほうが良いのかというと、どっちなんですかね。

けんちょん:僕は使っちゃって良いと思ってます。コードの再利用って決して悪いことじゃないというか、むしろ積極的にやっていくことだと思うので。理想はやはり中身をちゃんと理解した上で、ガンガン使っていくっていうことだろうなって思います。

清野:じゃあ使うとしてもやっぱりその中身の仕組みの理解というか、例えば計算量が落ちているかとかパフォーマンスが良いのかとか、そういうところはちゃんと関心を持って使っていったほうが良いっていうような感じなんですかね。

けんちょん:そうだと思います。

清野:結構ソートとかに関しては、ドットソートやソート関数を使うと、それだけで最適なのがアルゴリズムで選ばれて最速になっちゃうこともある気がするので、やはりそういうところを改めて自分で書くことは大事かもしれないですね。

アルゴリズムの現実世界への応用

清野:もう一個お伺いしたいのが、勉強したりアルゴリズム書いたりしていて、競プロでこの問題はこういうアルゴリズム使えそうという感覚が培われていった次の課題として、どのようにそのアルゴリズムを実生活の問題の中でもパッと想起する能力を身につけるかとか、適応していくかみたいなところも、もう一個の難しさとしてあるなと僕は思っています。

競プロは競プロとしてスポーツとしてやっていて、仕事とは違うような感覚でやってる方も結構いらっしゃったりするんじゃないかなと思ってて。そのあたりを上手くつなげるための練習とか考え方とか、その辺のアイデアあったりしますか?

けんちょん:数理工学って、分野横断的に適応できるような考え方を抽出してそれを深めていくって学問なんですよね。例えば現実世界って様々な分野や世界があると思うんですけれど、どの世界で見てもこういう部分って似てるよね、みたいな。

僕も元々数理工学の畑にいたので、現実世界の問題を見て「これ数学的にはこういう感じだな」というようなことを感じ取る習慣は元々あったってことなんだと思います。なので、現実世界の問題であろうと競プロの問題であろうと、同じように見えるってとこがあります。

先ほどの話と被るかもしれませんが、世の中の問題を自分できちんと理解して問題を置き換えるというか、そのような問題設定を自分でしっかりとできる能力を癖づけるというのが大事かもしれないですね。

清野:けんちょんさん、今回もありがとうございました。次回もけんちょんさんとお送りします。

けんちょんさんの次の配信を聞く

さいごに

「エンジニアストーリー by Qiita」は、近年高まるエンジニア向けPodcastのニーズに応え、エンジニアのキャリア形成に有益な情報を発信しています。興味のあるテーマを見つけて配信を聞いてみましょう!

配信一覧を見る

関連記事