見出し画像

Georgia Tech OMSCS 1年目総括

履修計画記事から1年が経過した。

この1年で履修した3科目と全体的な振り返りを書き残しておきたい。いまのところ履修計画通りに進めている。

科目毎の内容や学期毎の振り返りは、Twitterブログに都度書いている。この記事では、自身がこれからOMSCSで履修を進めていく上での教訓を中心にまとめる。授業の紹介を意図したものではない。

CS 6310 Software Architecture and Design

シラバス

授業の負荷、難易度、内容的に大体わかりそう、設計の話が好き、プログラミングがある、OMSCSで取り組みうる授業の要素形式が幅広く含まれてる(講義、課題提出、グループワーク、ピアレビュー)というモチベーションで履修した。履修しなければよかったという気持ちが強い。

授業の内容で学べてよかったと思うことは特になく、小テストやグループワークは地獄(不毛。どうしてもチーム開発を授業内で経験したい人にはいいかもしれない。)だった。卒業要件は10の授業をB以上で修了。10以上積極的な興味がある授業がある中、限りある履修枠や年の1/3を様子見に費やすのは無駄であるというのを胸に深く刻み込んだ。

まなび、教訓、よかったこと

  • 名前がついたデザインのパターンは昔の論文内でさえも何千もあったのを知れたこと。個別のパターンの具体的な実装にあてはまるかどうかに固執するよりは、気持ち、原則、Whyや課題解決されるかどうかを軸に打ち手の引き出しにラベル付けするくらいの感覚がよさそうという気持ちが強まった。

  • 授業を聴いて理解できるようにすべきという理想や、その力を向上させられる期待があった。しかし、文字で読む方が速いし、それを繰り返したほうが定着度も高いので必ずしも聴いて理解できる状態になるのが正義でないという割り切りをもてた。

  • 設計の理論あってのUMLというのがこの教科書で学べた。ツールの良し悪しは、ツールの機能だけで決まるものではない。

  • 授業の体系に沿って半強制的に論文を読まされる期間があるのはよい。

  • 個人で進めるオプションがないグループワークのある授業はとらない。

  • ピアレビューの採点方法がよかった。人からのフィードバックが自分の評点になるのではなく、自分が人にどうフィードバックしたかがTAによって採点される。たまにPRレビューのレビューみたいなのも、考えてみると面白いのかもしれない。

授業内容の詳細は以下のツイートにぶらさげている。

CS 6250 Computer Networks

シラバス

OCI参照モデルをざっと復習してから、さまざまなルーティングのアルゴリズムや輻輳制御、BGP、ルーターのアーキテクチャ、SDN、DNS、CDNなどいろいろなトピックを扱えてよかった。提出課題はPythonでそれらのアルゴリズムを実装したり、BGPで公報されるデータをパースして分析したり、ファイアウォールのコントローラーを実装したりと、手を動かしながら授業の理解を促進するものだった。

業務で出てくるネットワークまわりの言葉のイメージもわきやすくなった感じがする。自分はコンピューターサイエンスのバックグラウンド、スイッチやルーターなど物理ネットワーク機器設定への親しみ、業務上のインフラ知識・経験などが乏しい。その上で、バックエンドエンジニアからプラットフォームやSRE領域にロールを転向したり増やしたりしているので、依然としてネットワークに強い苦手意識がある。授業1つ履修しただけで払拭されるわけではないが、克服するきっかけのひとつとしてはとてもよかった。

まなび、教訓、よかったこと

  • 抽象化されてよくわからないクラウドのネットワーク設定も、基礎から知識を積み上げたり、(機器をいじるまでもなく)ソフトウェアでの実験で理解が深まるということが知れた。

  • 読もうと思って読んでなかった『マスタリングTCP/IP』をついでに読み切れてよかった。

  • 7、8行のコード提出で不正扱い(該当課題の得点0)が理不尽過ぎるし、反論しようがなくてつらい。それ1つで成績Aでなくなるのでつらい。成績気にせず学びたい科目に突っ込んでいく、といいつつAでないのは本当に嫌だ。

  • gradescopeの詳細な仕様

  • 定期テストの勉強がつまらなくてつらい。

授業内容はツイートしているかと思ったら、外向きには何も残していなかった。

CS 6340 Software Analysis and Testing

シラバス

プログラムのバグを探すためのさまざまな動的・静的な手法やその限界を学ぶもの。身近なFuzzingから動的・静的な分析両方を取り入れてテストケースを生成するDynamic Symbolic Executionのようなものまで、幅広く扱われていてよかった。トピック毎にプログラミング提出課題があるのだが、LLVM Passを中心的に扱っているのが特によかった。

来年に学ぶOS関連の授業のウォーミングアップも兼ねて、C++で提出課題が出るというのと、大学院のCSの授業で扱うソフトウェアテストの話ってなんやねんという興味で履修した。

シラバスには、C++になじみがないとかなりの努力を要するという記載があった。結果的には、課題はC++だけでなくJava、TypeScript、Cと多岐に渡ったが、特定の言語機能を理解しなければ解けないものはなかった。C++準備として2冊の本を読んでちょっと練習したというのはあるにせよ、実行環境や依存ライブラリ管理は提供されるDockerイメージで困る場面はなかったし、構文的にはエディタの補完で十分だった。一から書くものもなく、実行コードの大枠が準備された上で、関数単位で実装するものなので大きな混乱もない。

一方で、初めて触れたLLVMは最初扱いがわからず面食らった。LLVM Passを利用して元のコードをいじらず、静的な解析により中間生成コードに処理を差し込むのは慣れてくると楽しく、いわゆる「完全理解」にすら到達してなくてもポジティブな感情を抱けたのが今後もがんばっていくモチベーションになった。

まなび、教訓、よかったこと

  • シラバス上の必要要件が厳しい風に書いてあっても、そうでもないこともある。興味あることが一番大事なので物怖じせずに科目選択する。

  • 履修予定になってるものの最高難易度のCS 8803 O08: Compilers - Theory and Practiceを履修するモチベーションが高まった。OSやコンピュータアーキテクチャの予習を進めていても、Computing Systems専攻ならコンパイラは必須やろという気持ちは高まってくる。

  • LLVMには構文解析ツール的な触れ方をしたが、コンパイラとしての挙動やアセンブリ言語入門としての中間生成コードで来年から履修する一連の授業への連続性を感じることができた。

  • 授業で扱われるトピックを身近な実装(GoのFuzzinggollvmなど)でどう実現されているか、(業務上の)身近な課題にどう適用できるかの考察、実験、アウトプットはやっていきたいがそこまで手が回らなくてもどかしい。低レイヤーの話になっていくとよりやりづらくなる気がしているが、やってみないとわからないので覆したい。

  • 定期テストの勉強がつまらなくてつらい。

授業内容の詳細は以下のツイートにぶらさげている。

1年目総括

前半にコース自体でつらいことや理不尽なことがあったり、その他公私厳しいことが重なるタイミングでは心身ともに早くも限界だった。何を問うてるのかよくわからない小テスト、採点結果待ち(また不正扱いされるのではという恐怖)、答えにたどり着かない課題と迫る提出期限など、一定のマインドシェアが奪われるものの単独では大した問題ではない。しかし、手術が失敗したり、腰を痛めて身動きがとれなくなったり、その他の不調が重なるととても大変だ。

それでも、全体としては1年やりきってよかったと感じる。自分が大学院でCSを学ぶ主目的は「業務に活かす」ということではない。しかし、履修や専攻は業務と無関係ではないし、より専門的かつ興味の強い科目になっていったときに業務と遠すぎたらちょっと見直してみてもよいのかもしれない。そこまで考え詰めなくても、ネットワークのように苦手意識払拭の手がかりが得られたり、ソフトウェア分析のように身近な事例で具体的に考えてみたり、諸説あるソフトウェア・プロダクト開発業務とCSの距離感は遠くない。そして何より、LLVMのように知らないことを理解し、その先の既にある興味関心につながったり、興味関心自体が広がったりしたことは、エンジニアとしての文脈に限らず生きる上でとても価値あることだと思う。

2年目に向けて

もともと年次で振り返りを書く予定がなかったが、思ったよりポジティブな気分になれたので書くのがよさそうだ。授業・課題単位でのTweetやブログでの四半期ごとの振り返りも続ける。ただ、今回の記事のようなまとめを書くタイミングでは忘れていることも多いので、noteの下書きも作っておこうと思う。

来年からは履修計画に沿って次の授業を履修していく。

コンピュータの動作原理を学ぶという意味では、いくつか提供されているセキュリティ系の授業を挟んでもよさそうだ。難易度はOMSCS全体でCompilers、Distributed Computing、Systems Issues in Cloud Computingにつぐものだが、特にCTFを含むCS 6265: Information Security Labは実りが多そうだ。

妄想は捗るが、授業の難易度も負荷も上がるのでだいぶ警戒しながら学期間の休暇を過ごしている。

総合的に人生を考えたときに、また別の妄想が頭をよぎる。

  • 他を削ってこのまま1学期1科目ずつ進めていく

  • いったん仕事やめて残りを1.5年につめこむ

  • 週4くらいで働いて1学期1科目ずつ進めていく

  • 学業主体に1学期1科目ずつ進めるが業務委託で生活する

心身ともに持続的に挑戦できる状態を目指したい。

いいなと思ったら応援しよう!