2025年3月末で北陸先端科学技術大学院大学の博士前期課程を修了し、修士(情報科学)が授与されました。 2021年に入学してから4年かけての修了です。
僕はJAISTの社会人学生史上一番ダメな学生だったと思います。入学時は「修了したブログを書いてドヤるぞ!」と意気込んでいましたが、今は「教授になんとかしてもらった」という感謝しかなく、自分自身が誇れることは全くないです。 もし、JAISTに入学を考えている社会人がいたら、反面教師として読んでほしいです。
筆者について
入学時26歳、修了時30歳。一般企業に勤めているソフトウェアエンジニア。文系の私立大学出身の学士で、入試で全く数学を使っていません。
なぜ大学院に入学したのか
僕が大学院に入学しようと思ったきっかけは、自分が尊敬しているエンジニアの方が修士を持っていたというものです。また、情報科学に関する教育を全く受けていないのにソフトウェアエンジニアとしてお給料をもらって良いのだろうか..?という引け目もありました。その他にも、当時働いていた職場では社会人で大学院に通う方が珍しくなかったのも入学の後押しになりました。
今思うと、学歴関係なく優秀なエンジニアの方はたくさんいるし、勉強は独学すればいい話です。ただ当時は、「まぁ暇だし、自堕落な自分には良い目標になるかもしれない」という軽い気持ちで入学しました。
なぜJAISTにしたのか
とりあえず大学院というものを知るため、JAISTの科目履修生という制度を使って非正規の学生として一コマ授業を受けました。その授業は面白く、毎週の課題もよく考えられた興味深いものばかりでした。 その授業を受けた時点でJAISTに入学することを決めました。今思えばもっと他の大学院も見て決めるべきだと思いますが、当時は「この授業が面白いから、この大学院に入る」という単純な思考でした。 これから大学院に入学を考えている人は、もっとよく調べたほうが良いと思います。研究をしなくて良い大学院があったり、海外の大学院をオンラインで受けることもできます。そもそも学部から情報科学を学ぶこともできます。自分にあった学習場所を選ぶことが大事だと思います。
授業
JAISTの授業は、数学的に難しい授業もありますが、ソフトウェアエンジニアとして働いている人なら卒業のための単位取得は十分可能だと感じました。例えば、試験の問題がほぼIPAのネットワークスペシャリスト試験の問題だった授業もありました(内容は面白かった)。分数の割り算すら怪しい僕でも単位の取得はできたので、「研究したいことがあるけど、数学が苦手だから大学院に行けない」という人は、心配しなくても大丈夫だと思います。
2年で卒業しようと思うとスケジュールは結構大変だと思います。3ヶ月間土日が一日潰れる授業に合格してやっと2単位という感じです。卒業には24~28単位ほど必要です。2年で卒業するとなると1年間で14単位取得が必要ですが、かなり大変だと思います。ただ、一週間出席すれば取れる単位もあったりするので、工夫すれば2年で卒業することは可能だと思います。
注意点として、同じ時期にやっている授業を重複して履修することはできません。授業は二年のサイクルで同じ授業をやっているらしく、自分でも合格できそうな授業が重なってしまうと、再来年まで取れないのも気をつけましょう(一敗)。
特に面白かった授業は ソフトウェア設計論
、関数プログラミング
、ソフトウェア検証論
です。どれもプログラムの動作とか意味への洞察が深まる授業でした。脳内のインタプリタに別のセマンティクスが生まれると思います。
僕は単位を全て取り終えるのに3年かかりました。他の卒業された方の記事をみると、2年ほどで単位を取り終えている方が多かったので、僕の能力と意欲が足りなかったようです。僕には家族もいませんし、仕事も比較的時間の融通がきく職場でした。その状況でここまで時間がかかってしまったのは、ゲームをしてしまったり遊んでしまったりしていた僕自身の責任です。もし大学院に入学を考えている方がいたら、自分がどれだけ真剣に卒業に取り組めるかをよく考えてから入学することをお勧めします。
研究
単位を取り終えたのが2024年の4月、そして単位以外に必要な諸々をやっているともう2024年の9月頃になっていました。研究も授業の合間に行ってはいたのですが、なかなか進まず、この時点での進捗は白紙に近かったです。教授にかなり助けてもらいなんとか形にできました。
内容ですが、プログラミング言語の形式手法に関する研究をしていました。形式手法というのは、物事を形式的、つまり曖昧さのない形で記述することで、その物事の正しさを証明する手法です。プログラミング言語の形式手法は、プログラムの意味を曖昧さなく定義してプログラミングの性質を証明する手法です。プログラムのミスが人命に関わりかねない昨今、大事な研究です。
形式手法には大きくわけて3つの手法があります。表示的意味論、公理的意味論、操作的意味論です。前者2つはそれなりの数学の素養が必要ですが、操作的意味論は状態遷移を使ってプログラムの意味を定義する手法で、VMを実装したりしたことがある方ならある程度理解できると思います。僕は操作的意味論を使ってJavaとかCとかの既存のプログラミング言語の動作を形式的に記述したことで話題になったらしい K Framework というツールに関して研究しました。
「既存のツールを研究する」で研究になるのか?と思う方もいるかもしれませんが、JAISTには課題研究という制度があり、論文ではなく課題研究書を提出することで学位を取得できます。課題研究は単位が少ない代わりに新規性が求められないので、既存の研究の理解を深めるという方向性で研究することができます。僕は課題研究でK Framework 及び K Framework で記述されたプログラムの動作を研究していました。その中で、状態遷移の図がほしいと感じることが多く、状態遷移図を自動生成するツールを作成したところ、教授が「これでいってみましょう」と仰ってくださり、研究が始まりました。
研究といってもほとんどツールを動作させる作業に費やしており、起動方法を専用のDiscordサーバーで聞いて解決したあたりがハイライトです。
一人での研究の他に、月に一度の頻度で研究室セミナーが開かれました。セミナーでは教授の前で生成した状態遷移図を説明しました。これは本当に素晴らしい場でした。自分がいかプログラムの動作についてわかっていないかわかりました。教授はなにも説明できない僕でも呆れず、最後まで質問してくれました。教授には本当に感謝しています。
教授への感謝
僕はこの4年間で教授に4回「退学を考えている」という旨を伝えました。教授はそのたびに具体的に励ましてくれました。今こうしてブログを書いていると「なんて迷惑なやつなんだ」と思います。教授、本当にありがとうございます。他にも色々な方に相談にのってもらいました。ありがとうございます。
4年間何をしていても「大学院のことをしないでこんなことしていて良いのか?」という罪悪感があるのは本当に辛かったです。自分から望んで入学しているのに何を考えているんでしょうね。大学院でなにをしたいかを考えず、軽い気持ちで入学してしまったのがいけないのだと思います。
修士課程でなにか変わったか?
情報科学の基礎力
講義は素晴らしいものでしたが、自分の学力不足であまり活かせませんでした。情報科学の基礎力が向上したかというと怪しいです。ちょっと聞いたことある単語というのは増えました。 むしろ自分が計算機のことを全くわかっていないことがわかりました。情報科学ってすごいです、いろんな天才がいろんな仕組みについて考えています。
理系の人への敬意
理系の人の論文を書いて卒業している人たちへの敬意が深まりました。論文を書くのは本当に大変です。僕は課題研究で新規性は求められませんでしたが、新規性を満たしつつ、しっかり他人を納得させる研究をするのは本当に大変だと思います。
自分はなんとか修士号という紙をもらっただけに過ぎず、同じ修士でもしっかり研究していた方とは天と地ほど差があると感じています。自分の意志力や能力のなさがよくわかりました。
JAISTに入学する前に知っておいてほしいこと
もし、JAISTに入学を考えている社会人がいたら、教授と密に連絡を取りましょう。私は連絡を取るのが怖くなってしまい具体的な助言をもらい始めたのは卒業の半年前からでした。もっと早く連絡を取っていれば、もっと実りのある学生生活になっていたかもしれません。研究で悩んでいること、授業で悩んでいること、何でも教授に相談しましょう。 厳しい場所と噂されがちな研究の発表会も怖い場所ではありません。僕は「中学生の自由研究ですか?」と罵倒される覚悟で望みましたが、審査してくれた教授の方々はとても優しく、最後まで質問してくれました。研究の発表は自分の研究を深めるいい機会です。教授陣はとっつきづらく見えるかもしれませんが、とても優しい方々です。
在学中に読んで良かった本
このままだと僕が怠惰な学生だったことしか伝わらないので、読んで良かった本を紹介します。 前提として、書籍の内容を1割理解できているかどうかが精一杯なので、内容の正確性は保証できません。
はじめての数理論理学
数理論理学の基本的な考え方を学べる本です。わかりやすい文章で書かれています。そして、一番大きいのは演習問題の答えが載っていることです。独学で数理論理学を学ぶには最適だと思います。
アンダースタンディングコンピュテーション
Rubyを通してプログラミング言語の形式意味論に関する用語を色々学べます(オートマトンとか値渡しとか停止性とか)。Rubyを学んでいて良かったと感じる本でした。
プログラム意味論の基礎
プログラム意味論の基礎を学べる本です。(プログラミング言語の意味論とプログラム意味論のどっちが正しい表記なのかわからない)いい具合にアカデミックな文章が掲載されているので、論文を読むための下準備としてかなり適していると思います。これも演習問題の答えが載っています。
Algebraic Semantics of Imperative Programs
教授に教えていただいた本。この理論をもとにK Frameworkが作成されたらしいです。OBJという形式的にプログラムの動作を記述できるツールを用いて簡単な命令形プログラミング言語の意味論を解説してくれています。物理本しかなく英語で書かれた書籍ですが、もし英語に抵抗がない方は読んでみるといいかもしれません。
最後に
改めて、教授、研究室の方々、本当にありがとうございました。一つ一つの質問が自分の理解を深めることにつながりました。研究室には今後もK Frameworkを研究する方がいらっしゃるようなので、僕の研究が役に立つことがあれば嬉しいです。 また、この4年間働いていた2つの企業にも感謝します。どちらも働きながら大学院に挑戦できる良い環境だと思うので、もしそういった会社が気になる方はお声がけください。