スタンフォードのコンピュータサイエンスの授業の感想(後編)

2017年にも同じタイトルの記事を書いたのだけど、その後無事にスタンフォード大学院のコンピュータサイエンス学部を卒業することができたので、前回の記事以降に取った授業について、僕なりの感想をちょっとまとめたい。

CS255 暗号入門 (2018Q1)

文字通り暗号についての授業。対称鍵暗号、公開鍵暗号、メッセージ認証、一方向ハッシュ関数などのトピックについて学ぶ。プログラミングではなく理論中心の授業。

宿題では、例えばこういう手順で暗号化される通信が安全であることを証明せよ、みたいな問題が出た。こういう問題は、もし安全ではないとしたらそれを利用して安全とされている暗号(AESとか)を破れてしまう、みたいな背理法で証明を行う。そういう巧妙な証明を考えるのは結構面白かった。あるいは逆に、このように暗号化された通信方式の穴を見つけよ、みたいな問題も出た。

AESやSHA256そのものがなぜ安全と思われているかみたいなトピックは、数学的すぎるのか特に深堀りすることはなかった。RSAやElGamal、Diffie-Hellmanなどの説明はあった。

この授業を受けて痛感したのは、暗号を使った技術の繊細さだ。一見なんの問題もなさそうな暗号手順でも、メッセージの一部が漏洩してしまったり、正当なデータの後に偽のデータを追加できてしまったり、悪意ある第三者が認証付きメッセージを偽造できてしまったりすることがよくある。やや逆説的だけど,授業を受けた後には、自分ではなるべく暗号に関するものを新たに作らずにTLSのような既存のものを使おうという気持ちになった。TLSでさえ情報を完全に秘匿できているわけではないんだけどね(通信そのものの存在とかメッセージの長さとか)。

お勧め度: ⭐️⭐️⭐️⭐️

CS240 OSの発展的トピック (2018Q2)

ファイルシステムやメモリサブシステム、仮想マシンといったOSについての論文をひたすら読んでいく授業。毎週何個か論文を読んでいって、授業で教授と生徒がインタラクティブに議論する。リモートで受けていた僕は議論には参加できず議論している動画を見るだけだったので、その点はいまいちだった。ただし論文自体の内容は、ここ70年くらいのOSの歴史のなかで記念碑的なものを選んだだけあってとてもおもしろかった。実際に新たなアイデアをいくつも知ることができたので、こういう授業はとても有意義だと思う。

試験では、授業で扱われた論文を読み込んでくるのを前提に、それに関する問題が出た。例えば論文Xのページ7のグラフでは、nが1024のときにだけパフォーマンスが逆転しているが、それはなぜか、みたいな(もちろん論文自体は持ち込み可)。あるいは、こういうシナリオのときに論文Yの手法はどのように振る舞うか説明せよ、みたいな。授業に出てきた論文を読み込んで、生じた疑問をあらかじめ解決していけば、大体の問題には答えられるようなテストになっていた。なかなかよいテストだったと思う。

返ってきた答案にはことごとく赤ペンで✓がついていて一瞬ぎょっとしたけど、これは日本でいうところの○という意味なのだった。

お勧め度: ⭐️⭐️⭐️⭐️⭐️

CS154 オートマトンと複雑性理論入門 (2018Q4)

オートマトンとかチューリングマシンとかP/NPみたいなものについて学ぶ授業。こういうトピックは、単語は知ってるけど厳密にはどういう話なのか知らないみたいなことが多いので、そういうことについて学べたのはよかった。あと、普通のプログラマのスキルとしても、有限状態オートマトンとか、なにが正規表現の範囲でなにが違うのかみたいなことは、普通に知っておいたほうがいいと思う。

教科書はIntroduction to Theory of Computationという本だった。この教科書、難しいトピックをかなりわかりやすく説明していていい本だと思う。とはいっても数学の本みたいなものなので、本当にスラスラ読めるというわけではないけど、じっくり腰を据えて1ページごとに十分に時間をかけるつもりで読んでいけば、それなりにフムフムという感じで読み進めていける。日本語だと計算理論の基礎というタイトルで翻訳がでているようだ。

お勧め度: ⭐️⭐️⭐️⭐️

CS157 計算論理 (2018Q4)

この授業では∀とか∃みたいなものと、厳密に定義された推論規則を元に、ある言明が真であるか偽であるかを調べる、みたいなことをやった。実際のところは単なるパズルゲームのようだった。たとえば、与えられた規則だけを使って変形を繰り返すことで、「AならばB」という言明を「BでないならばAではない」に変形したりする。他にも、ある言明について「すべてのものがそれを満たす」「満たすものもある」「ない」を判断したりとか。必修だから取った授業だったけど、ちょっと簡単すぎる感じがした。

お勧め度: ⭐️⭐️⭐️

CS144 コンピュータネットワーク入門 (2019Q1)

TCPの輻輳制御とか、スイッチでのパケットスイッチングとか、経路制御のアルゴリズムとか、NATの仕組みとか、そういうことを学ぶ授業。プログラミングの課題では、VMをたくさん立ち上げてネットワークを組んで、その上で簡単な実装のTCPを書いたり経路制御をしたりする。普通にネットワークの基礎知識という感じで、ためになる授業だった。

お勧め度: ⭐️⭐️⭐️⭐️

CS155 コンピュータとネットワークセキュリティ (2019Q2)

セキュリティの授業。VM環境の中で、rootにsetuidされたプログラムの穴をついて任意コード実行したり、脆弱性のある(というかセキュリティがガバガバな)Webアプリで他のユーザになりすましたり、みたいなことをやる。なんか理論的なことをやるのかなと思ったら、HTTPのsame origin policyとかContent-Security-Policyヘッダみたいなすごく実用的な話題も扱っていたりして、なんかふつうにチュートリアルみたいな感じだなと思った。

お勧め度: ⭐️⭐️⭐️⭐️

CS251 暗号通貨とブロックチェイン技術 (2019Q4)

中身をよく理解していないのにブロックチェインに興奮している人たちがいるなぁと思っていたけど、僕も理解していなかったので、この授業を取ることにした。

この授業では、10週間くらいあるコースの最初の2〜3週間でビットコインの仕組みをやって、そのあとはひたすら発展的話題をやる。発展的話題というと、例えばビットコインの送金履歴をうやむやにする手法とか。ビットコインの送金履歴は誰にでも読めるデータなのだけど、匿名の参加者同士で巧妙にデジタル署名を使って、安全な(持ち逃げ不可能な)形でビットコインを交換する技みたいものがあるのだ。たくさんの参加者で何度もコインをシャッフルすると、コインの元の出どころは追跡しづらくなってしまう。

ビットコイン以外のブロックチェインについてもレクチャーがあった。例えば分散システム上で任意の計算をさせることが可能なEthereumとか。Ethereum上でセキュアな軍人将棋みたいなゲームを作ってみましょうみたいな課題がでたけど、Ethereum専用のSolidityというプログラミング言語がしょぼすぎたし、設問自体も穴が多すぎて、この課題には不必要に苦労させられた。何日も有休を取って宿題をやっていた気がする。この課題、分散システムじゃなく中央サーバがあったらずっと楽だなろうぁという、本来の趣旨とは多分逆の感想が得られる課題だった。

また別のブロックチェインとしては、ゼロ知識証明を利用することで誰から誰にいくら送られたのか知ることができないZcashという暗号通貨の話もあった。Ethererumくらいは僕でも考えつきそうだけど、Zcashはそういうことが可能であるということ自体が驚きで、ちょっと感動があった。とはいえ授業なので、JavaScriptでZcashの内部のロジックの簡易版を実装してみましょうみたいな課題がでるので、ゼロ知識証明ってなんだっけというレベルから始めると結構大変だった。

この授業の教授Dan Bonehは、暗号の世界では有名な人らしかった。BLS署名というアルゴリズムがあるのだけど、調べてみたらBLSのBは教授の名前BonehのBだった。ゲーデル賞なんかも取っていたりして(これは僕が思うにチューリング賞の次くらいに権威ある賞)本当にすごい。そういうのは普通に授業受けてるだけだと全然わからないから、すごい人は自分はすごいんだとちゃんと初回の授業で説明してほしい。

授業自体、そしていろいろなブロックチェイン自体は技術的に興味深くてとてもおもしろかった。その一方で、ブロックチェインをむやみに素晴らしいテクノロジのように扱う人々のうさんくささはむしろ確信が深まった気がする。ビットコインでもゴールドでも火星の土地の所有権でも、みんなが欲しがれば値段はどんどん上がるだろうし、そのこと自体は否定しないけど、それとブロックチェインがいいかどうかは別の話。

お勧め度: ⭐️⭐️⭐️⭐️⭐️

CS230 ディープラーニング (2020Q1)

僕はシステムズプログラミング専攻で授業を取ってきたので、OSとかコンパイラみたいなものばかりやってきたんだけど、このご時世にディープラーニングをやらずに卒業するのはいかがなものかと思って、この授業を受けてみた。教授は、この業界なら全員知っていると言っても過言ではないAndrew Ng先生。

授業の内容はオーソドックスなもので、ニューロン1つの定義に始まり、バックプロパゲーションとかを説明して(ただし数学的なものは扱わないので、Pythonでちょいちょいとやるとバックプロパゲーションできてしまう)、CNNとかGANみたいな内容に進んでいくみたいな感じだった。多分Courseraでもほぼ同じ内容の授業を無料で受けることができると思う。

学期末には、TAと相談した上で何か1つディープラーニングを使ったものを作ってきて、ポスターセッションをするということになっていた。聞いた話ではシリコンバレーのベンチャーキャピタルもそこに来て、めぼしいものにツバを付けていくみたいなこともあるらしいのだけど、このあたりでコロナが流行し始めて、ポスターセッションはなくなってしまった。学校も閉鎖になったので、最終課題は提出しなくてよいということになり、僕も途中まで作ったものの結局提出しなかった。

お勧め度: ⭐️⭐️⭐️⭐️

CS244 ネットワークの発展的トピック (2020Q2)

授業1回ごとに1つの論文を読んでいくという授業。授業の中で教授が、自分の決断がインターネットのアーキテクチャにそこそこ大きな影響を与えてしまったみたいな話をちょくちょくするので、何をやっている人なんだろうと思って調べてみたら、教授のNick McKeownはSDN(Software-Defined Network)を発明した人だった。そりゃすごいわ、ちゃんと最初に説明してよ案件だよ。

NickはSDNを発明したあと、それを作っていた大学院生と一緒に起業して会社を1000億円以上で売却していたりするので、そういう意味でもすごい人だった。ビジネスでも成功している教授は素直にかっこいいと思う。

リモート授業に移行して、むしろいろんな人にゲストレクチャーしてもらいやすくなったせいか、授業の後半には毎週のようにゲストが来ていた。そのゲストが豪華だった。例えばMITでWiFiメッシュネットワークの研究をしていて、それを元にMerakiという会社を作りCiscoに売却して大金持ちになった人とか。極めつけは最終回で、Netflix CEOのReed Hastingsが登場した。たった数十人の授業にNetflixの創業者CEOが来るなんて、ホームパーティーで世界的アーティストが歌ってくれるみたいなものだ。

Reed Hastingsはコンピュータセキュリティでも記念碑的な業績のあるすごい研究者なのだけど、NickとReed Hastingsはもともと仲が良くて、Nickの結婚式ではReed Hastingsが花婿付添人をやったらしい。1990年代にReed HastingsがDVDオンラインレンタル業を始めるといったら(Netflixは元々は郵送でのDVDレンタル業だった)、Nickは「もっとテクノロジっぽいことやったほうがいいんじゃない?」と「アドバイス」をしたそうだ。

大学で研究したことを元に起業してこんなにみんなすごいお金持ちになっているんだったら、誰らにだってできそうだなという気にさせてくれる授業だった。

なお、教授のNickはその次の年にIntelのSVP(CEOの次のポジション)に就任していた。やっぱりすごいわ。

お勧め度: ⭐️⭐️⭐️⭐️⭐️

CS399 研究プロジェクト (2020Q4)

僕にとっての最後の授業には、個人プロジェクトを選んでみた。教授にスーパーバイズを頼んで何か面白いプログラムを学期内に書くと単位がもらえるというコース。スタンフォードの教授に個人教授を頼むなんて普通はできないだろうけど、学生の立場ならば毎週1時間とか1:1で時間を取ってもらえるので、学生は得だなと思った。

僕はコンパイラをやろうと思って準備していったのだけど、初回のミーティングで「単に作るだけじゃなぁ・・」みたいなことを言われてしまったので、「じゃあ超速いリンカを作ります」と言ったらテーマがそれになった。僕はこの授業ではどうしてもA+が欲しかったので(A+はGPAで4.3にカウントされるのだけど、ここでA+を取ればぴったりGPA 4.0で卒業が可能だった)、すごくがんばって、2ヶ月半くらいで大きな実用プログラムがリンクできるプログラムを書き上げた。出来上がったプログラムは実際にすごく速くて当初の目標は達成できたんだけど、もらえたグレードはAだった。そもそもこの授業ではどれだけがんばってもAしかもらえない話だったらしい。トホホと思ったけど、まあGPA 3.97で卒業というのも十分以上によい成績だ。研究プロジェクトは教授との個人的なコネクションもできるので、もっと何個もやっておけばよかったと思った。

お勧め度: ⭐️⭐️⭐️⭐️⭐️

まとめ

仕事をしながらパートタイムで大学院生をやっていたし、最初の履修計画が適当すぎたり寄り道が多かったりで、卒業に5年もかかってしまった(最小45単位で卒業できるのに、68単位も履修)。今から考えれば途中で休職して、物理的にも毎日学校に通って、集中してやればよかったかもしれない。

5年間のうち、かなりの期間、平日の夜や休日をまるまる使って、それでも足りないときには有休を使ったり時には徹夜してまで課題等をしていたわけだけど、やってよかったと思う。まずは、今まで知りたいと思っていたことをいろいろ知ることができたのが、単純によかった。ソフトウェアエンジニアとしての腕も上がったと思う。僕の場合は関係ないけど、よい成績で卒業すれば就職も有利になるはず(少なくとも僕の周りでは、学問だから役に立たなくて良いみたいな高尚なことを言うひとはおらず、ここで学んだことをその先のキャリアにつなげるために学校に来ている人が多かった)。

証明問題の宿題がたくさんでたのも、きちんとした説明をわかりやすい英語で書く訓練になってよかった。こういうスキルは、きちんとした文章を書いたりソースコードのコメントを書くときなどにはかなり役立つけど、なんとなくで身につけるのは大変な気がする。

また、スタンフォードのコンピュータサイエンス(世界ランキングトップとの一つ)の授業が、ある意味この程度かというのがわかったのも、ある意味ではよかったと思う。まじめに勉強はしないといけないけど、僕でも全然通用するし、それどころかオールA(Aマイナス以上)で卒業できたりするのだ。コンピュータサイエンスは、簡単ではないかもしれないけど、ステップを追ってきちんと勉強していけばなんとかなるものなのだなと思った。これは多分、ほかの勉強もそうなのだろう。

僕は仕事をしながら学校にいっていたけれど、何歳から何を始めても別によいと思うし、いまさら学校と思わずに、もっとこういうことをする人が増えるといいなと思う。

この記事が気に入ったらサポートをしてみませんか?