【美國留學】RICE MCS 第二學期

COVID-19 的爆發,使得下半學期完全以遠距教學的模式進行,儘管有著各種不便,還是兢兢業業地學好學滿,對於 Computer Science 領域的認識,又更上層樓了。

I-No Liao
工程師小夫妻
12 min readMay 21, 2020

--

Rice University. Photo by I-No Liao.

修課心得

這學期一口氣修了四門課,主要原因是希望最後一個學期可以只選一門課,好騰出時間找正職工作以及節省學費。儘管四門課看起來很多,但實際上比 2019 Fall 三門課比較起來其實相對輕鬆一些,再加上遇到了毀滅性的新冠肺炎影響,許多內容在下半學期都被閹割,以應付停課一週及遠距教學的不便,雖然很惋惜,但還是透過 Project 學到了許多計算機科學的底層知識。整體而言個人喜好的程度為 COMP 556 > COMP 506 > COMP 541 = COMP535,以下就讓我來分享我對於這四門課的心得。

COMP 556 Introduction to Computer Networks

  • Instructor: Prof. T. S. Eugene Ng
  • Workload: Medium
  • Language: C/C++
  • 2 assignments
  • 3 projects
  • 2 Exams
  • Personal rating: ★★★★★

本學期最愛的一門課,教授是我自 Rice 就讀以來,我認為最會教學的一位,課堂上的新知識教授解釋地條理分明,許多複雜的演算法教授也都可以抽絲剝繭地帶著我們理解,體現了 Divide & Conquer 的精髓,教學功力相當強。另外,這門課的三個 Project 都很精實,而且並沒有受到疫情的影響而被閹割,算是學好學滿值回票價的一門課。

第一個 Project 是使用 TCP (Transmission Control Protocol) 實作 Ping-Pong Protocol 以及 Web Server。這個 Project 主要是讓學生熟悉 Linux Socket Programming,整體而言並不會太難,也相當有趣。透過自己實現的 Ping-Pong 功能,測試 Rice 校園的網路速度,並深度瞭解 TCP Packet 特性及 Socket Buffer Limitation。另外,Web Server 方面則實現了處理 HTTP Request 的及 Routing 的功能,應用上學期修過 COMP 531 Web Development & Design 的經驗,實作起來相當輕鬆。

第二個 Project 是使用 UDP (User Datagram Protocol) 實作 Reliable File Transfer Protocol (Sender + Receiver),也是我這學期最喜歡的一個 Project,大滿配的資料傳輸技術全用上了,包含 Handshake,FIN Packet Termination,Sliding Window,Timeout Retransmission,Error Detection,Memory Management 等等,相當有意思。能夠做到只使用 1.5 MB Memory 就傳輸無限容量的檔案,很有成就感。

第三個 Project 難度最高,主要是實作 Intra-Domain Routing Protocol,包含 Distance Vector Protocol 及 Link State Protocol。這兩個 Protocol 的核心算法都不難,但是實現起來其實有非常多的細節需要注意,Debug 要格外細心。值得紀念的是這也是我這門課唯一拿到滿分的 Project。

考試方面,只要老師的講義讀熟,就都可以拿到很好的成績。總體來說還是 Project 的 Loading 比較重,尤其是第一個 Project 及第三個 Project 隊友們因為別的科目忙不過來,必須一個人獨立完成,還是相當不容易的。但多做多學,挺慶幸在三次的 Project 中我都願意把自己手弄到最髒,把握住任何學習的機會,寫程式不就是要透過多敲幾行代碼來積攢經驗嗎?

COMP 506 Graduate Compiler Construction

  • Instructor: Prof. Michael Burke
  • Workload: Medium
  • Language: C
  • Compiler Framework: Flex (Scanner) and Bison (Parser)
  • 2 projects
  • 2 Exams
  • Personal rating: ★★★★☆

選這門課的主要動機,是想瞭解自己天天在寫的 Code 究竟是如何被編譯後執行,以及 Compiler 跟 Interpreter 的差異。教授講課的方式中規中矩,步調偏慢,很適合我這樣的 Compiler 初學者。課程內容分為三大部分:Compiler Frontend、Optimization,以及 Compiler Backend。Compiler Frontend 包含 Lexical Analysis,Automata Theory,Scanner & Parser Implementation (Flex & Bison),Semantics Analysis,Abstract Syntax Tree 等等。Optimization 則涵蓋 Intermediate Representation (IR),Local & Global Optimization,Control Flow Graph Analysis。最後 Backend 則是學習如何把 Low-level IR 轉為 Machine Instruction Set,像是 Instruction Selection & Scheduling 如何實現。

第一個 Project 是實現 “DEMO” 語言的 Scanner 及 Parser,主要使用的 Framework 是 GNU 的 Flex 及 Bison。整體而言我覺得很簡單,大多數的時間是在解決 Grammar 上 Ambiguity 的問題,學習如何使用 Bison 提供的輸出來優化 Grammar。另外,Error Message 的可讀性、行數的判斷、和避免 Spurious Errors 也是重點之一。

第二個 Project 就比較有趣了,延續第一個 Project 的成果,並賦予語意 (Semantics) 到 “DEMO” 這個語言。在 Compile Time 建立 Parse Tree 的同時也建立 Abstract Syntax Tree (AST);而在 Runtime 時,藉由 Post-order Traversal 從 AST 的 Root 開始向下遊走,一步步將作者的語意轉譯出來。具體功能其實就是讓 “DEMO” 可以像一般程式語言一樣被編譯並執行,例如 Type Checking & Conversion,If-Then-Else,While-Loop,Arithmetic Computation,Standard Output (Stdout) 等等。

透過這兩次 Project,我成功地實現了一個屬於自己的程式語言,能夠編譯能夠執行,雖然只是 Toy Example,但其中的精髓還是相當受用的。而我也終於了解 Compiled Language 及 Interpreted Language 底層的差異究竟為何,對於程式語言有了更深層次的瞭解,相信這對於我往後的 Programming 生涯會有很大的幫助。

考試方面,主要也就把老師的講義讀熟就差不多了,但其實考試內容頗難,這也是因為 Compiler 的學問本身就比較艱深,需要花多點時間讀書,像我這種比較喜歡動手做 Project 的人來說,Compiler 的考試還挺煩的。

COMP 541 Introduction to Computer Security

  • Instructor: Prof. Nathan Dautenhahn
  • Workload: Medium
  • Language: C, Python, JavaScript
  • 3 assignments
  • 4 projects
  • Personal rating: ★★★☆☆

自從轉行 CS 以後,天天都聽到別人說 Computer Security 好難超級難無敵難而且是駭客必修課,於是在好奇心的驅使之下,選擇了這門課。的確,Computer Security,一個學期下來的感想就是真的很難,但同時也是個有趣的學科。之所以困難的原因在於 Computer Security 涵蓋的內容幾乎就是整個 CS 學科,從底層 OS 系統,到 Networks,Database,密碼學 (Cryptography),Web 等等,無所不包。

在這邊不免抱怨一下教這門課的教授,首先本來就不是很會教學,作業跟 Project 都是靠自己上網找資料學習才有辦法寫得出來。再來,自從 COVID-19 疫情爆發,改為遠距教學開始,老師就開始不務正業地彈吉他唱歌,雖然一開始是很酷沒錯,但頻率實在太高了,每堂課都在自彈自唱,如果教得好,那都還可以忍受,就已經教的差了還整天搞餘興節目,我上課上得心都累了。最令人受不了的是,彈完唱完,教授就忘記自己本來要講什麼,導致整節課毫無脈絡章法,非常無言。(僅針對教學方面提出我的看法,對於教授本身並無任何意見,而且其實還挺欣賞這位教授的處事及生活態度)

所幸作業及 Project 都還是相當有深度,好好自學還是可以學到很多 Hacking 的技巧,以及如何防禦。整學期下來,學到包羅萬象的 Hacking 技巧,像是如何利用 Buffer Overflow 在受害者的電腦開起擁有 Root 權限的 Shell、利用統計方法破解 Vigenère cipher、Length Extension & Collision Attack for MD5 Hashing、RSA Signature Forgery、SQL Injection、XSS、CSRF、Network Port Scanning、Computer Autopsy 等等的 Hacking 技術,上完課簡直就可以穿著黑色帽 T 躲在小角落駭爆別人的電腦。

最後來一張教授用 Twich 教課時自彈自唱的螢幕截圖,好啦,是很帥,後面的背景佈置也很潮,的確很能夠吸引學生。

Rice COMP 541 Computer Security. Screenshot by I-No Liao.

COMP 535 Approximate Computing System for Big Data

  • Instructors: Prof. Krishna V. Palem and Prof. Robert Cartwright
  • Workload: Low
  • Language: Python
  • Framework: Tensorflow and Keras
  • 1 project with 3 presentations and 1 final report
  • 1 exam
  • Personal rating: ★★★☆☆

學長姊們口中的涼課,因為這學期目標修四門課,所以選了一個涼的讓這學期好過點。不過有別於以前,這門課多了個考試,而且我還考炸了,導致它反而成為我這學期最提心吊膽的一門課。

前半學期主要是學我覺得超難的 Boolean Function,一堆數學證明真的很崩潰,非常要求線性代數跟機率的底子,學習方式主要是透過看老師錄好的影片以及寫 Worksheet,然後期中考的內容就是考 Boolean Function。

後半學期有趣多了,讓我對這門課的看法有了很大的轉變,我們這一組的 Project 題目是研究 Lorenz-63 Chaotic Dynamical System,用 Machine Learning 的方法取代傳統偏微分,達到更高效率的計算。我們使用 Long Short-Term Memory (LSTM) 及 LSTM Ensemble 做為主要 Model,進行時序性 (Time Series ) 資料的預測。3 次的報告包含了 Proposal、Paper Review,以及 Final Poster。非常高興與一群很棒的隊友們一起合作完成這個規模較為龐大的專題,雖然本身對 Machine Learning 沒什麼興趣,但還是很享受各個 Presentation 以及撰寫 Final Report 的過程,從中學習良多。

個人認為這門課的缺點在於前期讀書的內容其實跟後期 Project 沒什麼關聯性,整體而言並不是很連貫,然後兩位重量級的老師不會回 Email,導致很難跟老師保持聯繫,我們 Project 主要都是諮詢一位之前做過這個 Project 的超強大學生 Nikola,雖然他人在歐洲,跟美國這邊有時差,但每次 Email 都是秒回而且回的很詳細,沒有 Nikola 這個 Project 我還真不知道能不能做完呢!

結論

以 Workload 而言,雖然這學期有四門課,但都還比 2019 Fall 三門課輕鬆些,一來是作業量有比較少,二來是自己也更適應 Rice CS 上課的節奏,整體而言過得比上學期還像個人。這學期最喜歡的 COMP 556 Introduction to Computer Networks 讓我學到非常多有用的 Network 技術,也磨練了底層系統的 Programming Skills。另外,這學期幾乎都是寫 C 及 C++,補足了我在程式語言比較不足的一部份,也因為如此,對於 Memory Access & Management 的掌握度提高了不少。

--

--