![見出し画像](https://assets.st-note.com/production/uploads/images/167996811/rectangle_large_type_2_9bd56185b0030b05f3ee79da92c56fa0.png?width=1200)
Georgia Tech OMSCS 3年目総括
今年もこの1年で履修した3科目と全体的な振り返りを書き残しておきたい。今年は履修撤回なく1学期に1科目ずつ履修したので、OMSCSの卒業に必要な授業はあと2つとなった。
科目毎の内容や学期毎の振り返りは、Xやブログに都度書いている。この記事では、自身がこれからOMSCSで履修を進めていく上での教訓を中心にまとめる。授業の紹介を意図したものではない。
CS6211: System Design for Cloud Computing
シラバス
クラウドを作る仕事は職業上の憧れのひとつなので履修した。昨年履修したCS 6210 Advanced Operating Systemsの教授が担当するより発展的な授業だ。SDN、NFV(Network Functions Virtualization)、Systems(MapReduce)、Apps(PaaSやストリーム処理系サービス)の4モジュールにペアワークで取り組んでいった。毎週実装課題があり、TAの予定をおさえてデモする。
まなび、教訓、よかったこと
ネットワークの苦手意識は相変わらず払拭できない。私がエンジニアとして触れるネットワークは、クラウドやKubernetesのネットワーク設定とアプリケーションのデバッグあたりだ。なんとなく調べはするものの、設定を行ってからコンポーネント同士が最終的につながる(遮断される)まで中で何が起こっているかイメージできていないことが多い。ネットワーク系の名著を読む中で補完される部分もあるが、仮想的にネットワークトポロジーを構築し、ツールでトラフィックを観測する王道を行くしかないのではないかと改めて思った。授業では単純なネットワークトポロジーにはじまり、ファイアウォールやNATの設定、さらにそれらのソフトウェア制御を行った。物理の世界だとよりイメージも湧くかもしれないが、仮想環境の設定をいじってデータを届くようにしたり、各ネットワークレイヤーのツールを使ったデバッグによる擬似的な体験でかなりカバーされるように思えてよかった。
最初のモジュールはSDN。Mininetでトポロジーを作りながら、Ryu SDN…
— カエル氏の闘争 (@toshi0607) May 6, 2024
2つめのモジュールはNFV。引き続きRyuを使いながら、NATやFirewallなどセキュリティや負荷分散など機能を実現するためにflow ruleをスイッチにインストールする実装を行った。
— カエル氏の闘争 (@toshi0607) May 6, 2024
プロジェクトはsrcホスト(コンテナ)2つ、スイッチ(Open…
MapReduceではフレームワークをGoで実装し、ユーザーが実装したMap/Reduceロジックをアップロードできるようにした。実行環境が限定される中であらゆるケースの安全な実行を担保するものではなく、アップロード方法も限定してはいた。それでも、多くのユーザーを支えるための堅牢なインフラや利用者の開発体験をイメージしながら進めた開発は、授業の趣旨である「クラウドプロバイダーの気持ち」を味わうには十分だ。私が携わっているプラットフォームエンジニアリングは、社内のユーザー向けに似たようなことを行うエンジニアリング領域だが、クラウドサービスはその延長線にあると思っているのでいつか携わってみたい。
自由課題では、授業に関する質問にLLMで答えるチャットサービスを作ってLLMOps入門した。LLMと検索エンジンに何の関係あるのか疑問に思っていたところから、LLM入出力のトークン数制限を精度を落とさずいかに克服するかのような課題を通じて単語だけよく聞くRAGだったり、検索方法の種類と精度など、つながりのある出会い方ができた。
最後のモジュールはApps(PaaSやストリーム処理系サービス)でAzureのサービスを複数使ったフリースタイルサービス実装、App Serviceのスケールの可視化、Spark or Stormのハンズオンやった。…
— カエル氏の闘争 (@toshi0607) May 6, 2024
この授業は何よりも、強いエンジニアの課題の読み方、設計、コーディングを間近で継続的に見られたことが大きな財産になった。
1月から毎週締め切りとデモがあって週平均30時間とかなりタフな授業やったけど、チームを組んでもらった @yusuktan…
— カエル氏の闘争 (@toshi0607) May 6, 2024
授業内容の詳細は提出課題を中心に以下のポストにぶらさげている。
Spring 24は今受けてるCS 6210: Advanced Operating Systemsの教授がやってるより発展的な授業を履修するので、今学期の最後の試験が終わったら準備したい
— カエル氏の闘争 (@toshi0607) November 26, 2023
/CS 6211: System Design for Cloud Computinghttps://t.co/FWHYDTV5l6https://t.co/jiJNhbOEoS
CS6747 Advanced Topics in Malware
シラバス
セキュリティ系の授業もとりたいと思い履修した。Ghidraを使って実際のマルウェアを解析する。
まなび、教訓、よかったこと
私が履修した範囲では、他人のコードのコピーが禁止されることはあっても、LLM利用が禁止されたことはない。その中でも、この授業で特徴的だったのは「現代のアタッカーは、LLMなどあらゆる手段を尽くして攻撃を仕掛けてくる。そのため、この授業でもあらゆる手段を尽くしてそれに立ち向かう必要がある。LLMの利用も行うべきだ」というスタンスが明示されていた点だ。実際単純なプロンプトで課題にドンピシャなアウトプットが出てくることは少ないが、教育文脈でカンニングしているようなバツの悪さを抱きながらおそるおそる使うより、ツールを使いこなすことも含めて鍛錬だと思って取り組むほうが実践的な知見も得られるだろう。
1つのマルウェアを色んな手法で解析すると、プログラムに対する理解が深まる。マルウェアをデコンパイルしたアセンブリコードをある程度の意味のまとまりごとに何の処理を行っているのか全行コメントをつける気の遠くなるような作業に始まり、instruction毎に変更対象のレジスタと利用するレジスタのラベルを付与したcontrol flow graph生成、VMで実際にマルウェアを動かしながら出力するdynamic control dependence graph生成まで静的・動的に処理の記述やふるまいを追えた
全体を通して、セキュリティの授業を受けているというよりは、「アセンブリコードをがんばって読んで解析して理解する」という印象を受けた。マルウェアも配布者の悪意ある実装や法令に直接・間接的に違反する結果を生じさせなければ単なるプログラムだが、悪意の延長線上に難読化や解析ツールブロックなど、マルウェア固有のテクニックがあるのだなと感じた。セキュリティの典型的なトピックはある一方で、レイヤーを問わない動作原理の正確な理解が根本にあると思う。セキュリティだからといって、特別扱いしすぎずに取り組んでいけたらよさそうだ。
授業内容の詳細は提出課題を中心に以下のポストにぶらさげている。
Summer 24はマルウェア分析やる。Ghidraを使った6つのプロジェクトに取り組み、論文32本要約する。セキュリティ系何かしら取りたくて、CTFの
— カエル氏の闘争 (@toshi0607) May 6, 2024
labもあったけど、基礎皆無で夏学期にやるとヤバいのでこっち
CS 6747: Advanced Malware Analysishttps://t.co/9SavtdNAJohttps://t.co/2Gw6P0qkc7
CS7210 Distributed Computing
シラバス
分散コンピューティングを学ぶのが入学のひとつの理由だったので履修した。emichael/dslabsをベースに分散キーバリューストアを構築する。
まなび、教訓、よかったこと
何よりも、履修に挑戦してよかった。この授業はレビューサイト上OMSCSにおいてコンパイラや上述のSystem Design for Cloud Computingと並び最も難易度の高い授業のひとつであり、週平均負荷も50時間(近年はスケジュール調整もあり30時間程度)と高く、仕事と両立できるイメージがまったくわかない。それでも、「大学院でCSを学びたいと思った動機の核のような部分」などと理由をつけて無理やりねじこんだのは自分の限界を広げていくきっかけになるのだろう。
結果的に最後の2つの課題は消化不良だった。あるべき姿を理解し、挙動を追って修正する基礎的なふるまいができていなかったように思う。今回は、Paxosという複雑な仕様と実装のヒントの理解、分散システムの挙動の負いづらさの両面に難しさがあった。理解と実装は螺旋的な取り組みだし、コンポーネントの相互作用全体で仕様を実現するシステムだと余計に難しいと思うが、一度に意識するスコープをもう少し小さくできないものだろうか。他のアプローチがないかも知りたい。このあたりはどう取り組めばよいかわかっていないので、つぎの授業でも意識してみたい。
上述の複雑な課題に取り組むアプローチとともに、精神的なあり方にも課題に感じている。締切のある課題なのでしょうがない面もあるが、理解を差し置き、とにかく提出できる解を安直な方法で求めているようだ。結果的に求めている3割くらいの解には素早くたどり着くが、4、5割と深めていく道が見つけられなかったり、3割周辺をさまよっていたずらに時間が経過して疲弊する。「性急に証明や理由を求めずに、不確実さや不思議さ、懐疑の中にいることができる能力」をネガティブ・ケイパビリティと呼ぶ。知的な文脈に限らず、そういう耐性が低いのではないかという仮説がある。この概念の理解や向き合い方を直近のテーマにしたい。
よくわからなかったことに対して強い感情を持たない。授業を受けるからには当然授業期間中に課題を解き切りたいし、概念を完全理解したい。しかし、解けなかったり、そのタイミングで理解できなかったとき、過度に悔しがったり、自分は一生理解できないのだと付き合うことを諦めたりしない。今同じ論文を読んだら、驚くことに理解できる部分が増えているかもしれないし、「できなかった」という強い感情はそのテーマに近づくことを無駄に遠ざけてしまうかもしれない。自分とわからないものとの距離感を即断して確定するのではなく、長い付き合いができるようになりたい。
授業内容の詳細は提出課題を中心に以下のポストにぶらさげている。
どう考えても大変そうやけど、note記事振り返ってみたら「大学院でCSを学びたいと思った動機の核のような部分」と書いていたので挑戦することにしました!
— カエル氏の闘争 (@toshi0607) June 14, 2024
/Distributed Computinghttps://t.co/hQbcdevwA4https://t.co/EM9dR679aw
4年目に向けて
2025年はつぎの授業を履修する予定だ。
Database System Implementationは、2025年春学期の履修登録タイミングで新設される授業だ。 ストレージ管理、インデックス構造、クエリ実行などのトピックを扱いながら、C++でDBシステムを実装する。授業の内容に加え、授業運営や開発環境の知見が蓄積されてない部分での不確実性は高い。しかし、DBの内部実装理解や、仕様理解と実装のイテレーションに向き合えるので履修してみようと思う。
Intro to Graduate Algorithmsは、ほとんどの専攻で必修の科目で履修登録が殺到するので、最後まで履修登録できないケースが多い。夏学期に履修して卒業したいが、今のところ直近の状況に鑑み夏学期に受ける勇気はない。秋学期で終えようかと考えている。
- 2024夏学期からコース設計変わった
— カエル氏の闘争 (@toshi0607) October 13, 2024
- 課題が成績の25%になった(元々10%のはず)
- 擬似コードだったのがPythonに変わった
- plagiarismの扱いめぐる環境(教授不在、正式プロセスと異なる、TA権限強すぎ & 生徒の証拠提出無視)
とか色々ありそうhttps://t.co/aZw45Cm4g1https://t.co/Al8AxThBnr
Natural Language Processingも事業ドメイン柄気になっているので、必要単位は超過するが履修してみる気になってきた。