Findy Engineer Lab

エンジニアの"ちょい先"を考えるメディア

数学は難しい、だからこそ面白い。アカデミアを諦めてプログラマーに戻った私が今でも学び続ける理由

20221209131614

はじめまして、千葉竜介(@metalunk)です。
ソフトウェアエンジニアとしてのキャリアをサーバーサイド開発からはじめ、その後は数学の知識と組み合わせることで機械学習エンジニア、検索エンジニアとして働いてきました。現在は株式会社10X で検索と推薦のシステムを作っています。

機械学習と検索は、ソフトウェアエンジニアリングの中でも特にコンピュータサイエンスの知識が重要である分野だと思います。実際に、機械学習と情報検索は現在アカデミアでもっとも活発に研究されている分野の一つです。

そんな分野の専門エンジニアを名乗るような人というのは、小さい頃から算数が大好きで、大学一年の線形代数に躓くことなく進んできたに違いない、と思うかもしれません。しかし、少なくとも自分は違いました。

そんな自分のキャリアについて、この記事では数学を軸に据えてお伝えできたらと思います。

はじめに:ぼくが理系に進んだ理由

幼い頃からこれまで、ずっと乗り物が大好きでした。幼少期は"はたらくくるま"にハマり、ゴミ収集車を見つけて喜んでいましたし、大人になってからもバイクやクルマに乗って遊ぶのが好きです。乗ってみたい乗り物はジェット機とロケットで、宇宙飛行士になると乗れることを知ってからは宇宙飛行士が夢の一つになりました。

それ以降、大事な選択の局面では、宇宙飛行士選抜試験の応募資格を満たす方向にキャリアを進めることを頭の片隅で意識していました。例えば STEM 分野の知識を身につけるために理系の学部を選択したり、修士号を取得するために大学院進学したり、英語のスキルを身につけるためにアメリカに行くチャンスがある会社に就職したり、などです。

実はあまり好きではなかった数学

数学については、高校生までは得意科目だと感じていましたが、ただパズルみたいで楽しいというくらいで、発展的な内容に取り組んだり、自学したりするほどの面白みは感じず、正直に言ってあまり好きではありませんでした。

大学に入学して臨んだ最初の授業で、線形代数、解析といった難しい数学に出会いました。その中で、ε-δ(イプシロン-デルタ)論法による関数の連続性の証明が理解できず、苦戦したのを覚えています。いま思うと、そもそも基本的な数学の論理の進め方がなっていなかったのだから、わからないところから勉強し直すべきだったのです。しかし、当時の自分はわからないことを曖昧にして進めてしまいました。なんとか単位は取れたものの成績は振るわず、たしか解析学の成績はBでした。そこではじめて、自分は数学が得意ではなかったんだと気付いたのです。

数理最適化との出会い

大学の勉強で壁にぶつかり数学を得意だと感じなくなった一方で、難しいからこそ面白いと思える分野に出会うことができました。特に三年生でやった巡回セールスマン問題のソルバ開発が、数理最適化の面白さに目覚めるきっかけとなりました。

数理最適化は、問題を数式で記述し、それに対する解決方法(アルゴリズム)を考え、プログラミングして解く学問です。自分が好きなプログラミングで数学の問題を解けることが面白く、さらに、そのアルゴリズムが出す解の精度や収束性を、数学を使って証明できることに驚きました。最適化のこんな性格にすっかりハマったおかげで、最適化の研究室に入ることにしたのです。

数理最適化の研究室では、さらに面白い数学に出会うことができました。それまでよりも一生懸命に勉強したのですが、それでも数学が得意だと思えるまでには届きません。ゼミの発表では毎回コテンパンにされ、学会の発表を聞いてもちんぷんかんぷんで、打ちひしがれました。

(のちに最適化の友人たちとビールを飲みながら話してわかったことですが、いまは博士を持っているような数理最適化の天才たちもゼミでコテンパンにされたし、学会発表ではちんぷんかんぷんだったそうです)

数学に未練を残したままソフトウェアエンジニアを職業に

4年生になり、理系ということでほとんどの同級生が大学院進学をすることが分かっていましたが、自分は進路を決めきれず、悩みながら就職活動をしていました。大学院に進学して数理最適化をより深く研究することは面白いだろうと思っていた一方、趣味やインターンでやっていたプログラミングを仕事にしてみたい思いを捨てきれずにいたのです。

そんな中、選考に進んでいた GREE から内定をいただきました。 当時の GREE は勢いがあり、スキルの高いプログラマーがたくさん在籍していました。その環境で働くことでプログラマーとして成長できると考え、入社することに決めました。

GREE では新卒研修ののち、GREE News チームに配属されましたが、そこでメンターを勤めてくださった塩飽さんにビシバシと鍛えられる日々を過ごしました。

学生時代もプログラミングをして遊んでいましたが、素人のお遊びレベルだったと痛感しました。PHP の class をまともに使えていませんでしたし、git によるバージョン管理もされていませんでした。もちろんデザインパターンのようなものも理解していませんでした。そんな状態の自分をメンティとして迎え入れ、レビューに付き合ってくれたメンターにはとても感謝していますし、頭が上がりません。

20221209132954
↑GREE時代の著者

その後の消滅都市チームでの経験も含め、GREE での2年間でサーバーサイドエンジニアとしてのスキルを鍛え、手に職をつけることができました。

諦められなかった大学院進学

GREE で忙しくも充実した日々を過ごしながら2年目を迎える頃、一時は諦めた「いつかは大学院に行きたい」という思いが再燃しはじめていました。学生時代は毎日のように、数学の勉強がつらくなったときにはプログラミングに逃避して、コードを書いて遊んでいたものですが、プログラミングを仕事にしたら今度は数学が恋しくなってきたんだと思います。

数学に心血を注いだ大学院生活と金銭事情

大学院に行くためには院試に合格することと、学費や生活費を支払うためのお金を準備することが必要です。当時の自分は、どちらもなんとかなるだろうと楽観的に考えて院試を受験。合格したので GREE を退職して、4月から大学院に進学することに決めました。

後から振り返ると、お金はなんとかなるだろうという考えは甘かったのですが、実際なんとかなりました。社会人2年間での貯金、奨学金、在学中にやったアルバイト代*の合計500万円は、卒業した月には残り3万円となっていました。お金に関して詳しくは ブログに書いてありますので、これから自費で大学院に進学するという人はぜひ参考にして欲しいです。入学する年の年収を調整することで親の扶養に入るとか、学費免除を狙うといったテクニックがあります。

*...大学院は勉強をするところだからアルバイトはしない方がいいと思います

大学院ではかなり真剣に勉強をしました。数学をやるために睡眠時間を削りたく、妙な生活リズム(眠さの限界を迎えたら一時間だけ寝て、また起きたら数学をやる、というのを延々と繰り返す)を実践していたため、後半はずっと血尿が出ていました。いま考えると体と心の健康が研究のための資本であるから、夜寝て昼間起きる生活リズムを実施するべきでしたし、太陽光を浴びて運動をするべきだったと思います。

↑大学院での様子

勉強をやりきったことで再び就職の道を選ぶ

自分がこれほど頑張れたのは、勉強できることのありがたみを感じていたからです。学費や生活費はすべて自分のお金で支払っていたため、その価値を強く理解していましたし、一度社会人を経験しているから好きなだけ勉強できることの貴重さも実感していました。

大学院生活では多くの時間を勉強に割いてきたものの、研究で思うような成果を出せませんでした。当初は博士を取りたいと考えていましたが、修士の2年間の経験から自分は研究に向いていないと考え、また就職することにしました。

自分にとって、数学とプログラミングはシーソーのような関係です。数学をずっとやっていると、対岸のプログラマーという仕事がキラキラ輝いて見えるようでした。手元にないものを欲しがっているだけなのかもしれませんが。

↑研究室から見える美しい朝焼け

わかることが増えるほど、わからないことも増えていく

ところで、大学院では自分なりにかなり頑張って勉強していましたが、いつまで経っても数学はわからないことだらけでした。数学を学んでいると、ひとつ理解したらわからないことがみっつ出てきます。これが辛く、勉強が嫌だと感じることがあったのですが、最近『独学大全』の「技法22 調べものの航海日誌 リサーチログ 無知の坂を超える」を読み、いい理解をして克服できました。せっかくなので、ここで自分なりの理解を紹介させてください。

知るということは自分がわかる領域を広げることである。 そして、そのわかる領域に隣接している領域だけが自分が知覚できるわからない領域である。 それ以外の領域は知覚できず、わからないかどうかもわからない領域である。 だから、勉強することでわかる領域を広げると、同時にわからない領域も広がる。 よって、勉強すればするほどわからないことが増えるのである。
参考:読書猿(2020.9)『独学大全 絶対に「学ぶこと」をあきらめたくない人のための55の技法』ダイヤモンド社

この理解を得てからは、わからないことに直面したときに嬉しい気持ちになれるようになりました。

数学 × ソフトウェアエンジニアリングの生存戦略

退職してまで入学した大学院で思うような成果を出せませんでした。だからといって大学院に行かなきゃよかったのか?というと、決してそうではありません。得られたものはいろいろありました。

まず、自分の中にあった「大学院に行って勉強したい」という幻想のような憧れ、モヤモヤに踏ん切りをつけることができました。さらに、数学とソフトウェアエンジニアリングの両方に専門性を持つことでキャリアの選択肢を増やすことができたのです。

大学院に残るか、事業会社に行くか

大学などのアカデミアでも事業会社でも、同じ「検索」や「機械学習」についての研究、開発が行われていますが、それぞれ目的が異なることにより、性質が異なります。

次の学校教育法の通り、大学は研究すること自体が目的の一つです。だから、応用まで時間のかかる基礎研究にも取り組むことができるわけです。

学校教育法 第九章 大学 第八十三条 大学は、学術の中心として、広く知識を授けるとともに、深く専門の学芸を教授研究し、知的、道徳的及び応用的能力を展開させることを目的とする。

“学校教育法”,e-Gov 法令検索,https://elaws.e-gov.go.jp/document?lawid=322AC0000000026

一方、事業会社は一見アカデミアと同じような研究をしていても、その目的は利益をあげることにあります。BigTech のように会社が巨大になると、アカデミアのような基礎研究をしていることもありますが、それも突き詰めれば利益に結びつくはずです。

例えば、数十人もの研究者が何年も検索のコア技術の研究に勤しんで検索精度を1%改善したとします。一見それは利益に繋がらないもののように見えるかもしれません。しかし、その検索サービスの突出した検索精度によって多くのユーザーがサービスを使うことになり、会社は利用者のデータを集めることができ、メイン事業である広告事業に莫大な利益が上がる、といったようにです。

一方スタートアップの場合、開発から利益を上げるまでの時間を短くする必要があります。そのため、必然的に基礎研究よりも応用研究、応用研究よりも既存研究、既存研究よりもコモディティ化したデファクトスタンダードな技術と、上位の階層の技術を使うことになります。この階層が上がるにしたがって、学ぶ労力は小さくなるのです。

つまり事業会社、特にスタートアップではコモディティ化した技術を利用することが多く、学術分野での専門性がそれほど秀でていなくてもやっていける環境だといえるのではないでしょうか。

アカデミアに残り、博士を取って研究者として働くには突出した専門性が必要です。実際に、アカデミアにいる自分の知り合いはみんな数学の天才です。

一方、事業会社で、特に検索エンジニアや機械学習エンジニアとして働く場合、ソフトウェアエンジニアリング + 少しの専門性で上げられる成果はたくさんあります。なぜなら、TensorFlow, Kubeflow Pipelines, Elasticsearch などコモディティ化して利用しやすい技術がたくさんあるからです。

ソフトウェアエンジニアリング + 少しの専門性で築いた市場価値

自身の経験を振り返ってみると、大学院を卒業した2017年にメルカリに入社して検索エンジニアとして働きました。実はこのときはまだ検索エンジニアとしての経験はなく、検索の基礎知識の勉強が必要でした。ただ自分にはコンピュータサイエンスの知識のベースがあったおかげで、新たな専門分野の知識を身につけることができたのです。

さらに、当時の AI ブームに乗るために、正月休みを利用してCoursera の有名な Machine Learning のコースを受講しました。これまで機械学習は一切勉強したことがありませんでしたが、機械学習の内部では自分の専門である数理最適化が利用されていること、また基礎の線形代数も勉強した経験があったからこそ楽に修了できました。その後はメルカリで AI チームを勝手に手伝うことで無理やりチームに加入し、機械学習エンジニアとしての経験を積むことができたというわけです。

20221209132654
↑メルカリ最終出社日の様子

それ以外にも、起業してサービスを立ち上げるときの Deep Learning モデル開発、10X での検索システムの高速化などで新しい知識を獲得してきましたが、その際いつも数学の基礎知識が理解を助けてくれました。

↑10X で撮影した一番好きな写真。検索速度が 10x した

キャリアの選択で迷ったら

この通り、自分のキャリアはソフトウェアエンジニアリング + 少しの専門性で構築されてきたといえます。

ところで、大事な選択を迫られたときはいつも祖母の言葉がぼくの頭をよぎりました。その「仙台のおばあちゃん」は母方の祖母で、たぶん英語もしゃべれないのにカナダへ旅行に行ったり、退職してから畑を始めてキャベツを何百個も作ったりと、パワフルなおばあちゃんです。ぼくは小さい頃からおばあちゃんが大好きで、正月とお盆の度に遊びに行っていました。そんな仙台のおばあちゃんから言われた、「迷ったら大変な方を選びなさいよ」という言葉がずっと忘れられずにいます。新卒で入社するときも、大学院進学を決めるときも、起業をするときも、その言葉に背中を押されて決断しました。

基本的に自分ががんばらない屋さんだから、祖母はこんなことを言ったのかもしれませんが、なんだか説得力があるように感じるし、実際そうする方が学びも多いような気がしています。

おわりに:これからも学び続けたい

宇宙飛行士試験への挑戦

2021年、JAXA では13年ぶりに宇宙飛行士候補者を募集することになり、ずっと宇宙飛行士になりたいと思っていたぼくは、すぐにこの試験を受けようと決めました。

はじめにお話したように、これまで過去に行われてきた宇宙飛行士選抜試験の応募資格を満たせるようにキャリア選択をしてきました。だから今回、理系の修士を保持し、理系の会社で働いており、英語を使って仕事をした経験がある、応募に十分な状態で臨めました。ちなみに今回の募集は、門戸を広げるという意図でこれらのスキルは応募資格にありませんでしたが、選抜の中で重要なスキルであることには変わりません。

試験までは入念に準備をしました。宇宙飛行士という仕事についてよく考えてエントリーシートを作成し、健康診断を受け、英語試験のための英会話レッスンを毎日やり、一般教養試験、STEM 試験、小論文のために勉強をし、体力作りのためにトライアスロンに出場しました。この期間は平日の仕事終わりと休日のほとんどを準備に費やしていました。

↑伊勢志摩・里海トライアスロンに出場

結果、今回の選抜は落ちてしまいました。とてもがっかりしていますが、次の募集でチャンスをつかめるよう継続的に勉強を続けていこうと思っています。まだ選抜試験に残っている皆さん、がんばってください!

やっぱり数学は面白い

数学は今でもライフワークとして勉強しています。メルカリ時代に数学部を立ち上げ、ゼミを開催していましたが、そこから派生して外部メンバーと始めた最適化ゼミは、もう5年も続いています。

当初はメルカリオフィスの会議室を借りて開催しており、その後ぼくが退職してからはメンバーの所属機関である青学、東工大などで開催していました。コロナ禍になってからはオンラインで開催しており、Google Meet と Google Jamboard を使うスタイルに落ち着いています。この方法だと移動の負担がなく、資料も事前に Jamboard に作り、当日は書き込みながら進めることができるからとても良いです。コロナが落ち着いてオフライン開催が可能になったとしても、ゼミはこのままオンライン開催を継続するんじゃないかというくらい気に入っています。

↑ゼミで利用した Jamboard

現在は Nesterov のLectures on Convex Optimization を読んでいますが、これがなんとも難しく、心が折れそうになりながら毎週一歩ずつ進んでいます。読み始めてもうすぐ3年になりますが、まだまだ先は長いです。

正直なところ、このゼミで学んだ内容が自分に役立つことは一切ありません。仕事は全然関係ないことをやっていますし、最適化の仕事をしていたとしても、ゼミの内容は基礎に寄りすぎているため応用までかなり遠く、使うことはないと思います。

しかし、この活動はライフワークとしてやっているので、いくら使えなかろうと、知恵熱が出ようと、遊びと思ってやり続けようと思います。いまの本業がプログラマーだから、勉強が気楽にできているのかもしれません。学ぶことでわからないことがどんどん増えていきますが、それも楽しみながら、生涯学び続けたいです。

編集:河原崎 亜矢