博士課程を満期退学してエンジニアとして就職してみた
はじめに
本記事はZOZO Advent Calendar 2023 シリーズ3の3日目の記事です。初めてのアドカレ参加です。がんばります。
私は2022年3月に博士後期課程(以下、博士課程)を修了……せず、満期退学して翌月4月にZOZOに入社しました。以前から研究だけでなくエンジニアリングにも興味があり、自らすすんでエンジニアを志望し、MLエンジニアとしての業務に従事しております。
あれから早くも1年半が経ち、まもなく3年目に突入しようとしているところで、あらためて「博士課程からエンジニアに就職してよかったこと、大学院時代にやっておくべきだったこと」をまとめてみよう、と思いました。現在博士課程在学中でエンジニアとして就職しようか悩んでいる方、まだまだ進路に悩んでいる学生のみなさんの参考になれば幸いです。
研究生活での経験が活かせたところ
まずはじめに、研究生活(学部・大学院時代も含めて)で学んだこと、訓練したこと、経験したことが現在の仕事でも活かせており、「やっておいてよかった」と思うことをいくつかまとめます。
MLライブラリをすぐに使える・初めて使うライブラリでもなんとなく勝手がわかる
私が研究を始めた頃はTheanoやChainerを使い、最終的にPytorchへ移行しました。少しだけKerasを触った経験もあります。研究に必要なコーディングのほとんどがこれらのライブラリを使ったものだったので、業務でもすぐにコードを書き始めて実験を進めることができました。PytorchだけでなくTensorflowとKerasを使う機会もあり、あまり経験がなかったため最初は不安でしたが、Tensorflow 2.xはEager Executionがデフォルトになっており(つまりDefine-by-run)、意外とすんなり使い始められました。
専門さえ合えば研究生活で得た知識をフル活用できる
私は研究室で、主に知能ロボットの研究に取り組んでいました。ZOZOと知能ロボットはあまり関係ない気がしますが、私が特に従事していたのはロボットビジョン、つまりコンピュータビジョンの研究です。その経験から、現在は商品画像を取り扱うデータサイエンスの部署に所属しています。おかげさまで、研究生活で得た知識をそのまま活かして業務に取り組むことができています。
クオリティの高い資料をサクっと作成できる
私の所属していた研究室は資料作成をかなり厳しく指導しており、学部3年生の時点で先輩からの指導が入ります。私が修士になってからは、毎年3月に資料作成のレクチャーをする習慣もできました。おかげさまで、学会では大変わかりやすく美しいスライドを使って発表できたと自負しております。実際、MIRU2020若手プログラムにて「いかに良いプレゼンテーションができるか」を競い合いましたが、私の率いるチームは2位でした。
その経験は業務に入っても活かすことができています。実験結果や技術調査のレポートなどを手早くわかりやすく作成するよう心がけています。実際にも社内の技術共有会で「荒木さんの発表がわかりやすい」とお褒めの声を頂いたり、上司からもアウトプットの質を評価頂いております。ここは自分の強みとして、引き続き伸ばして行きたい所存です。
論文執筆の経験をテックブログの執筆やレビューに活かせる
上記同様、論文執筆についても厳しく指導されてきました。おかげさまで、日常生活でも違和感のある日本語を見つけると脳内で「自分ならこう修正する」と添削を始められるまでになりました。もともと文系人間だったこともあり文字を書くことが好きなので、この点をうまく伸ばせたのは良かったと思います。
この経験はテックブログの執筆に活かせました。違和感のある表現を自分で気づいて修正するだけでなく、同じコンテンツでもよりわかりやすく、より読みやすく書くことを心がけて執筆できたと思います。そんな私が書いたテックブログはこちらです(同期の平川と執筆しました)。
自身の記事執筆だけでなく、他の方のレビューにもこの経験は活きています。一度、同じチームの方が書いた記事をレビューしたことがあるのですが、長い記事にも関わらずテキパキと行うことができました。
研究以外での経験が活かせたところ
在学中、研究以外でも個人的興味でいろいろ勉強したり、対外的に活動したりしていました。その経験も決して無駄ではありませんでした。
CS全般の知識を満遍なく持っておいた
CS系の学科を出ている方なら当たり前かもしれませんが、これが意外と大事です。会社に入ってから、学部3年の実習ぶりにSQLを書いたり、趣味で出場していたハッカソンぶりにフロントエンドを書いたり、大学院の授業ぶりに認証まわりの技術について触れたり、「研究ではやらなかったけど他で触る機会があった」ことを業務で使う経験がかなり増えています。真面目に授業を受けて、研究外でも技術に触れる機会を作っておいてよかった、と思うことがよくあります。
そして、いわゆるITパスポートで言うところの「テクノロジ」だけでなく、「ストラテジ」「マネジメント」もちゃんと習得しておくことが大切です。在学中はあんまりパッとしませんが、社会に出ると途端にその重要さを目の当たりにするでしょう。私は小学校の頃からパソコンオタクだったので学部の授業をいつも楽しく聞いていましたが(むしろ知っていることばかりで退屈なこともあった)、あの頃していた勉強で「無駄だった」と思うことはほとんどありません。ちゃんと授業に出ましょう。
ハッカソンに参加してプロダクト開発の一連の流れを学べた
先程少し言及しましたが、何度かハッカソンに参加する機会がありました。最終的に結果を残せたのは学内版HACK Uでしたが、メンバー3人でフロントエンド・バックエンド・MLモデルを一通り実して簡単なWebアプリを作成しました。本当にごくごく簡単なものではありますが、プロダクト開発の一連の流れを学べたことは大変良い機会でした。
やっておくべきだったと思うところ
一方で、研究室での経験だけでは不十分だったこともいくつかありました。そもそもやるべきことが「研究」メインから「開発」メインに変わったこともあり、開発に必要な知識はまだまだ不足しているな、と実感しました。
オンプレだけでなくクラウドでの開発にも慣れておく
研究室では2010年代初頭から深層学習の研究に取り組んでいたため、私がメンバーになった時はすでに大量のGPUサーバが研究室で稼働しておりました。パソコンオタクだった私はそれらの管理を買って出たこともあり、オンプレサーバの管理には慣れておりました。一時期はOSのインストールからNVIDIAドライバのセットアップまでそらでコマンドを打っていたこともありました。一方でクラウド上でなにかする経験はほとんどなく、趣味でGoogle Compute EngineのFree tierでちょっと遊ぶ、くらいしかしていませんでした。実際には私が博士課程に入ってから、研究室ではABCI(AI橋渡しクラウド)等を利用していましたが、私の作るモデルはそこまでメモリも必要なかったことからオンプレサーバを使い続けていました。
そのため、入社直後は「使っていないときはVMの電源を落としておく」という常識がありませんでした。研究室ではサーバは基本電源を入れたままでしたので、学習が終わってもそのまま放っておいて、手が空いたら結果を見る、といった感じでした。クラウドでは電源を入れてGPUを掴んでいる間、ずっと課金が継続されてしまいます。入社以降は節約を意識して、学習が終わる時間をカレンダーに登録して、終わっていればすぐにVMを落としたり、そもそもサーバレスなKubeflow (Vertex Pipelines) を使うことも増えてきました。モデルの学習ひとつをとっても、フローが大きく変わりましたね。まあ正直、このあたりは会社によって異なるところだと思うので、入社後にスムーズに習得できれば良いだけの話ですが……。
GitHubをもっと活用してチームで開発する
私の学科ではあまりGitHubを使う機会がなく、研究室に所属した頃も積極的に使うメンバーが少なかったこともあり、最初はよくわからないまま使っていました。大学院に入ったあとは研究室でも使うメンバーが増えてきたものの、基本的に誰かとコードを一緒に書いたり、同じレポジトリで作業することは数える程度しかありませんでした。
そして入社して最初の月に行われた開発研修のとき、複数人でブランチを切って同時並行で作業をしたり、お互いのコードをレビューしたり、といったことを本格的に行いました。研修がなければ配属後に困っていたことでしょう……。もっとハッカソンとかインターンとかたくさん行ってチーム開発の経験をたくさんしておくべきだったかな、と思っています。
コーディング規約を守ってコードを書く
当たり前ですが、研究者のほとんどが「きれいなコードを書く」ことよりも「よりよい成果を出す」ことに重きをおいています。それ自体は良いのですが、実際はどちらも大切なことです。ですが、私はきれいなコードを書くことを蔑ろにしてしまいました。書くコードは規約違反まみれ、可読性は最悪、なんとか動くけど手を加えにくい、ひどいコードを量産していました。CVPRなどのトップカンファレンスに通っている論文の著者実装をいくつか見ていると、しっかり規約を守って理路整然と書かれたコードが多い事がわかるかと思います。最近では、良い研究は良いコードから生まれるのではないか(もちろんそれだけではないが)、と考えるようになりました。
ココだけの話ですが……開発研修のとき、私は初めてリンターとフォーマッターの存在を知りました。こんなに便利なものがあるのか、と感動しましたが、他の新卒メンバーは当たり前のように使っていたので一人でこっそりと感動していたことを覚えています。
スケジュールを立てる能力を身に着けておく
これは研究室で得られなかった経験というよりも、自分の問題ですが、私はスケジュールを立てることが本当に下手です。時間も決めずにダラダラ研究して、締切直前は徹夜する、という適当な時間感覚で生きていたこともあり、スケジュールを立ててもすぐに破綻したり、そもそも無理なスケジュールを立てたり、といったことを何度もやっていました。
社会人になってからは、ちゃんとガントを引いてスケジュール通りにタスクをこなしたり、必要に応じてスケジュールを見直したり、自分のスキルと周りの状況からタスクにかかる時間をおおよそ予測したり、といったことができるようになってきました。ダラダラ残業ばかりすることもなく、生活リズムも大幅に改善され、睡眠の質までもが向上しました。もちろん他の要因もあるのですが、時間の使い方を見直すだけでここまで生き方が変わるものかと驚くばかりです。もっと早く気づくべきでした。
研究生活で身についたけど結局仕事では使わなかったこと
つまり、研究生活で無駄だったな、と思うことです。正直に申し上げますが、ありません。学部4年からの6年間で学んだことで、無駄だったと感じることは一切思いつきませんでした。どの知識、どの技術も、何かしらの方法で業務に活かせております。まあ、これは考え方の問題かもしれませんね。「知能ロボットの論文を書くために四元数と格闘した」という、表面上は現在の業務に関係ないと思うことも、見方を変えれば「数学と真面目に向き合った」という大切な経験です。やはり人生に無駄なことはないのかもしれません。
おわりに
以上、私が思う「博士課程からエンジニアに就職してよかったこと、大学院時代にやっておくべきだったこと」でした。実際に文字にすると自分のこれまでの業務の振り返りや反省にもなり、スッキリとした気持ちでまた業務を頑張ろう(そして学位論文も頑張ろう)、という気持ちになれました。
今後、自分がどうなりたいかというビジョンが明確にあるわけではないですが、まずは最終学歴を満期退学で終わらせずに学位を取り、リサーチャーのバックグラウンドを持ったエンジニア、あるいはエンジニア経験のあるリサーチャーとしてハイブリッドに活躍できる人材を目指していきたいなと思います。弊社が掲げるZOZOらしさのひとつ「ソウゾウのナナメウエ」を、自分なりの方法で体現していけるように精進します。
この記事を読んでくださった学生さん、なにか参考になったことはありましたか?私自身たいした人間でもなく、かなり変な生き方をしていますので、「私みたいになれ」とか「私を目標にしろ」なんてことは口が裂けても言えませんが、少しでも参考になることがあれば幸いです。
Discussion