tl; dr
大学院に入学した
2018年4月から仕事を辞めて筑波大学のシステム工学研究科コンピュータサイエンス専攻の修士課程で大学院生をやっている。
働きながら入学手続きしたり引っ越ししたりと色々やっていたので3月、4月はずっとバタバタしていたのだが、ようやく落ち着いてきたので近況についてまとめておこうと思う。
背景
一応5年ぐらいソフトウェアを書いて仕事をしてきた訳だけど、自分はCSの学位を持ってる訳でもなく、ちゃんとCSの基礎的な勉強したことがなかった。*1
そのせいか、業務要件をコードに落とし込むことはできても、「なぜこのアルゴリズムを使っているこっちのライブラリの方が早いのか」「こういうのを早くするためにはどういう最適化をすべきなのか」というような、技術に特化した課題に直面した時に、何もできないタイミングがちょくちょくあった。
特に、サーバーサイドで動作するバッチのパフォーマンスチューニングの面で、「とりあえずプロセスを増やせばスケールできるように設計したが、本当はもっと実装を最適化して必要なサーバ台数を減らすための工夫ができるのではないか?」ということが疑われるケースにおいて、自分の持っている知識の範囲では何もできないケースが多く、これはレベルの低いエンジニアリングだと思っていた。他にもいくつか似たようなケースに直面したこともあって、ソフトウェアのパフォーマンスをエンジニアリングの観点から改善できないことが自分の壁だと認識するようになった。
この壁を何とかしなければ自分のエンジニアとしての未来はないと思えた。ありとあらゆるものがサービス化される昨今で、今自分が作っているAPIやバッチすらも、GUIでモデルやパイプラインを定義して誰でも作れるようになるという予感もあったので、ウェブアプリケーションからクライアントにjson返すしか能がない自分はいつか職を失うだろうという危機感があった。
この壁を突破し、エンジニアとしての仕事を維持していくために自分に今何が足りないか?と考えると、明らかにインプットが足りていなかった。ソフトウェアというものを現場でのみ学んできた自分にとって、経験したことがない問題に対してほとんど何もできないという弱点があることに気づいた。その弱点が露骨に表れるケースの1つが前述のような大規模データの取り扱いだった。
そのため、5~6年前から、どこかのタイミングで仕事を辞めてインプットに専念する時期を作りたいと考えるようになった。しかし金銭的な余裕がない、卒業後に雇用され得るだけのスキルがない、という2つの理由で躊躇していた。しかし幸いにして、ここ数年でエンジニアとしてはそこそこのレベルになれたので最低限食うには困らないという気持ちになり、かつ貯金がそこそこ貯まったこともあり、やっていきが高まってきたので実行に移すことにした。
大学院という選択肢について
貯金があると言っても仕事を辞めないにこしたことはないので、当初は働きながら夜間に通える大学でCSを勉強しようかなと思っていた。しかし、日本だと夜間コースでCSが勉強できる大学は殆どなく*2、またカリキュラムを見ると基礎的な内容が多く、今の自分にとっては学びが少ないように思えた。通信教育系のカリキュラムもいくつか調べてみたけど、どれも基礎的な内容というかプログラミングのカリキュラムという感じで、どうにもしっくりこなかった。
なので、思い切って仕事を辞めて普通に大学院に行くことにした。
色々調べた結果、今の日本ではちゃんとしたCSを勉強するには昼間に通う大学院に行くしかないと思えた。その事実の是非はともかく、今自分が新しいことを勉強できる環境に身を置くとしたら、大学院で研究することが最も効率的な選択だと思えた。
入学までの経緯
別のブログに院試までの準備とか最近の様子とかをまとまているので、興味があればこちらを参照してほしい。
今後も学生生活ネタや研究ネタはこちらのブログに書いていく予定である。
serihiro-graduate-school.hatenadiary.jp
大学院で何を研究するのか
配属はHPCS研究室というHPC関連の技術要素を扱う研究室で、もともと興味があったMapReduce on HPCでの性能改善に関するネタを探そうと思っていたのだ。しかし、MapReduceはあまりにレッドオーシャンで論文のネタになりにくそうという話になり、深層学習 on MapReduce(もしくはそれに類する分散環境)はどうかという話となった。
深層学習については以前に一度本を読んで写経した *3ぐらいの知識しかなく、TensorFlowやChainerもMNISTチュートリアルをやったぐらいの経験しかない。しかし、せっかく時間を取って研究するならやったことがない事の方が学びが多かろうということもあるので今は深層学習について論文を読んで知見をinputしている。同じ研究室内には深層学習を扱っている人はいないので何とか一人で頑張ってみる次第である。
最近の様子
大体、朝8時から19時か20時ぐらいまでは大学内にいる感じである。*4
M1の間に必要な単位をできるだけ稼いだ方がよさそうなので、5日間の平日のうち4日は何らかの講義を1日に1,2個履修している。CS専攻のカリキュラムページ はMkDocsで書かれていて読みやすくて良い。
今取っている講義は、自分の研究に関連する分散処理に関するものや、自分が単純に興味がある遺伝的アルゴリズムや数理最適化に関する理論などである。他にも、インテルの中の人が来て最近のインテルのCPUアーキテクチャに関する説明をしてくれる講義なんかも取っている。色々あって楽しい。
講義以外の時間は研究室にいて、今月は研究テーマを決めるための関連研究の調査をしている。まずは基礎的な所からということで、MapReduceや分散深層学習に関連するものを中心に読んでおり、や英語の論文を読んで要約する作業も最初はかなり時間がかかったが、2,3本読み切った辺りから段々と早くなってきた気がする。あと深層学習について復習するために ゼロから作るDeepLearningを最初から写経しながら読み直した。*5
それ以外だと、大学の図書館に行ってみたら大量に技術書があって、何時間でもいられそうな環境であるということを発見したので帰宅する前とかに図書館に寄って漁ってたりする。この土日も図書館に行って技術書を読んでいた。詳解LinuxカーネルとかTypes And Programming Languagesとかドラゴンブックとかの、普通に買うと余裕で7000円とかする本がタダで読めるのは大変ありがたい。大学にいる間にできるだけ読んでおきたい。
お金の話
「無職なのにお金はどうするの?」という話をよく聞かれるのだが、率直に答えると、必要な予算を計算したところ、自分の貯金を全部使っても若干足りなかったので、足りない分は親からの借金でカバーしている。
大学の入学金・授業料*6は国立なので大した額ではないのだが、2年間の住民税*7・国民年金・保険*8・生活費が、必要予算の大半を占めている。2年間は旅行はおろか、技術系カンファレンスに日帰りで行くことも厳しくなりそうだが致し方ない。改めて自分が生きていくのに必要な予算を計算することで、ただ生きているだけで物凄くお金がかかるということを実感できる良い機会になった。卒業後は、借りた金を早く返せるように、また貯蓄を増やしなおすべく、前職以上に稼げるようになろうと決意した。
卒業後の話
もちろん就職はするのだが、どの企業を受けるかまでは決めていない。
できれば分散システムを利用したプロダクト開発に関われるソフトウェアエンジニアとしてのポジションに就きたいと思うが、具体的な就職活動的なものは来年以降にやることとし、今年は研究に専念したいと考えている。また、在学中のインターンについても行ってみたい会社がいくつかあるので、その辺りにも挑戦してみようと思う。
*1:独学でやった勉強と言えばパタヘネを読んだぐらいか。
*3:その時の話は別エントリに書いた https://serihiro.hatenablog.com/entry/2016/12/22/000000
*4:前職時代がこんな感じだったのでそれをそのまま引き継いでいる感じ
*5:余談だが、最初の方の版は誤植が多いので、古い版を持っている場合はgithubにあるerrataを見ながら読んだ方がいい
*6:実際の額は http://www.tsukuba.ac.jp/admission/graduate/tuition.html を参照
*7:特にフルタイムで働いていた2017年度の所得で計算される2018年度分がとてもとても痛い
*8:1年目は関東ITSの任意継続の方が安かったのでそちらを使い、2年目からは国民保険の方が安いのでそっちに切り替える