Georgia Techのコンピュータサイエンス修士課程を無事に卒業する事ができた。 友人や同僚にこの話をすると色々質問をされるので、オンラインでコンピュータサイエンスの修士を 取りたい人や興味のある人に参考になるかもと思い、書いてみる事にした。
振り返り
2019年1月に入学して昨年の2021年12月に卒業できたので、 ぴったりちょうど3年間で卒業できた。 2018年にTOEFLを受験し始めたので、準備をスタートしたときから考えると 卒業まで4年ほどかかった。 なかなかの長い期間、大学院のことを考えて過ごしていたことになる。
密かにオールAを目指していたが、あるクラスでBを取ってしまい、 最終的なGPAは3.9で卒業となった。 仕事しながらの勉強になるし、アメリカの大学院である。 そもそも卒業できるだろうかと不安だった事を思えば、我ながら上出来すぎるほどだと思う。
僕の場合はモチベーションはそれほど落ちず、最後まで走り抜けることができた。 しかし、仕事の変化や家庭環境の変化などで、勉強を一時ストップするケースなど、 モチベーションをどう保つかは大事な点だと思う。 仕事しながらだと3年というのが一つの目安になると思うので、 無理のない学習プランと生活をキープできるかどうかが大事だろう。
履修したクラスと成績
# | Semester | Course # | Course | Grade | おすすめ度 |
---|---|---|---|---|---|
1 | 2019 Spring | CS 6200 | Graduate Intro to OS | A | ⭐⭐⭐ |
2 | 2019 Summer | CS 6250 | Computer Networks | A | ⭐⭐⭐ |
3 | 2019 Fall | CS 6035 | Intro to Info Security | B | ⭐⭐ |
4 | 2020 Spring | CS 7641 | Machine Learning | A | ⭐⭐ |
5 | 2020 Summer | CS 7646 | Machine Learning for Trading | A | ⭐⭐ |
6 | 2020 Fall | CS 6515 | Intro to Graduate Algorithms | A | ⭐⭐⭐ |
7 | 2021 Spring | CS 6210 | Advanced Operating Systems | A | ⭐⭐ |
8 | 2021 Summer | CS 6262 | Network Security | A | ⭐⭐ |
9 | 2021 Fall | CS 6603 | AI Ethics Society | A | ⭐ |
10 | 2021 Fall | MGT 6311 | Digital Marketing | A | ⭐ |
一つのテーマについてじっくり理解しながら勉強したいと思っていたので、 1学期につき1つのクラスを取るようにしてきた。最後の2021 Fallだけ2つクラスを 取ったのは、子供が生まれることが分かったので、早く卒業できるように最後だけ2つ 履修することにして頑張った。
Computing Systems を専攻したので、OSに関する授業やアルゴリズム、情報セキュリティに 関するクラスを中心に取り、残りは興味に応じて履修した。 機械学習やAIにも興味があったので3つほどその関連のクラスを履修している。
最終的なGPAは3.9。9個のクラスがAで、1つだけBだった。 Bがなければ全Aなのでとても悔しいが、自分としては良く頑張った結果だし、GPA3.9なんて大満足である。
どれぐらいの勉強量が必要か
ざっくり答えると、もちろん人によるけど週に10時間〜20時間程度だと思う。
大きな変数は3つあって、(1) クラスの大変さ(内容の難易度、課題の量、テストの難易度等)、 (2) 自分がそのクラスの分野についてどれぐらい理解しているか、 (3) 1学期にいくつのクラスを取るかによって大きく変わる。
一般的な目安は、
- 簡単なクラス: 5~10h / week
- 普通のクラス: 10~15h / week
- 難しいクラス: 15~25h / week
というところじゃないだろうか。 僕の場合は、普通または難しいクラスは1学期に1つで大変だったので、 仕事しながら勉強する人には1学期に1つをおすすめする。 (とは言え、仕事しながらなのに、1学期に3つ履修してAを取って卒業していった人を知っているので、本当に人によるとしか言えない。)
不満だったことは?
ほとんどないが、全くないと言えば嘘になる。 例えば、課題で求められている内容が不明瞭だったりすると、そこを明確にするためにTA等に質問をしたり、 生徒同士で手探りで話し合ったり、本質的な部分ではないところで時間を取られるのはストレスだった。 また、課題の採点もTAが行うことが多いが、TAによって採点にかなりのバラつきがある。 この完成度で70点?と思うこともあれば、これで95点?みたいなこともままある。 一貫した採点をお願いしたいが、ある程度我慢するべきところではあるのかも知れない。
なぜ大学院でコンピュータ・サイエンスの勉強をするのか
地図をつくること
自分は大学時代は物理学科だったので、コンピュータサイエンスを網羅的に学習していなかった。 とは言え、ソフトウェア・エンジニアとして仕事をしていたので、 仕事で必要な知識は独学で学んでいた状態だった。 しかし、仕事で必要になって学んだ事は、結構つぎはぎの知識で、抜けが多かった。 例えば、Computer Networksというクラスでは、ネットワークに関する内容を網羅的に学んでいく。 Webのエンジニアとして仕事していたので、TCP/IP, HTTPなどは理解していた。しかし、そこから 一歩出ると知らないことだらけだった事を思い知らされた。 Autonomous System (AS)、BGP protocolやその脆弱性、SDN (Software Defined Network)等々。
大学のクラスで学ぶとこういった網羅的な知識を学ぶことで、脳内に地図が出来上がることに 価値を感じていて、そういう意味では多様な地図を作ることができて大満足である。
課題を通じて学ぶ
地図を作るだけだったら、自分で本を読んでも作ることが可能だ。 だけど、地図は平面的な2Dの地図ではなく、実際には理解の程度によって奥行きや高さなどの 3Dの地図になるはずだ。
大学院で多くの課題と向き合う中で、どういう部分が理解できていなかったか、 何が大事なのか、そういうことを知らず知らずのうちに学ぶことができる。 授業だけでは全然足りなくて、課題を通じて学んだことの方が(圧倒的に)多い。 独学ではこの量の課題をこのペースでこなすことはおそらく自分には無理だったので、 地図に奥行きをもたせてくれた課題にはとても価値を感じている。
修士の価値とは
余談ではあるが、学士と博士の間に位置する修士の価値とは一体なんなのだろうか。
修士を卒業する事で期待される事は、僕が思うところでは、論文が読める・理解できるという事ではないだろうか。 学士は専門分野のスタート地点に立ったばかりで、基礎を理解している。 修士では専門分野のより深い知識を得ることで、論文を読んで(なんとか)理解して役立てることができる。 コードに落とし込んだりする。(実際にそういう宿題が結構あり、論文を読んで答えたり、論文の内容を再現するコードを書いたりする。) 博士はさらにその先を行き、論文を書くことができる(新規性のある研究ができる)。 課題や授業で論文を読むことは結構あったので、論文になれることもできたのは大きな収穫だった。
その他には、国によっては修士を持っているとビザが取りやすい等の優遇を受けられることが結構ある。 僕の場合はそれも一つの理由だったので、将来外国に住みたい人にはおすすめできるかも知れない。
もちろん、そういった能力を現実世界で役立てられるかどうかは自分次第なので、 さらに頑張っていきたい。
by @takp