Rice MCS 2022 Spring修課心得

In the C world, you are God

顏廷 Tim Yen
8 min readOct 5, 2022
Autumn @ Rice University

前言

這學期決定選擇System當作我的Specializtion Track,於是選擇了OS和Computer Security來滿足這個track的條件。除了網路是我本來就決定要修的課以外,第四門我本來是打算選個ML相關的課程,結果最後被Alex說服,說如果沒有打算走ML相關的路,修一門ML也沒啥用,不如再修個Database Implementation,畢竟DB的知識作為任何一種SWE都是很重要的。

經過這學期,我對C語言和電腦底層的掌握度有了很大的提升,但是loading是真的重,但隨者痛苦帶來的是成長,我更害怕的是過得很爽,但感覺不到進步抑或不知道如何進步的那種痛苦,所以對於這學期的的選課算是非常滿意。

COMP521 Operating Systems And Concurrent Programming

  • Language: C
  • Professor: Dave Johnson
  • Workload: 3 projects, 2 exams

這學期最愛的一門課,本來看到別人分享這堂超硬而有所卻步,但聽說教得超好再加上有朋友一起,就決定修下去了,事實證明是個非常正確的決定。

之前大學上的OS課都只教概念,完全沒實作,導致當時很多東西都沒有理解。反觀,Dave這堂OS就利用非常複雜的labs讓學生能夠深刻理解OS課本中的觀念。

Lab 1是個人作業,要設計一個terminal device driver,並利用monitors去處理multi-threads synchronization。

Lab 2則為兩人一組實作一個kernel和常見的Unix system calls, 並提供multiple terminals讓users能夠執行這些system calls。Kernel包含的features有virtual addressing and memory protection,還要在one CPU core的情況下提供process concurrency,讓多個process能同時執行。Unix system calls則有Exec, Fork, Wait, Delay, Exit這些對於process的操作。

這個lab真的超複雜,光是Lab Doc就有45頁,實作過程中還一直遇到各種memory error,最後寫出來整個成就感爆炸。

Lab 3同樣是兩人一組,要實現一個File System,並提供操作檔案的Unix system calls,包含read, write, create等。雖然實作起來lines of code也很多,但觀念上卻比lab2簡單很多,所以實作時沒遇到什麼障礙。

這些作業都是跑在教授自己開發的simulator上,因此學生只需要專注在教授要我們學的觀念上,不用去處理一些非常瑣碎的部分,能感受到教授的用心。

Exams是線上限時做完,一次就佔學期成績25%,我第一次考超爛,還以爲會被當,怕爆。

Dave非常註重細節,每份lab doc都寫得很詳細,回答也非常注意遣詞用字以確保觀念上的正確性。同時,他在piazza上的回覆時間極快,因此大部分遇到的困難都可以及時得到解答,不會卡太久,是個超認真對待教學的教授。

COMP556 Introduction To Computer Networks

  • Language: C, C++
  • Professor: T. S. Eugene Ng
  • Workload: 3 projects, 2 exams, 2 homework

Eugene課程設計得很讚,課程內容從OSI Model底層講到高層,帶我們一步一步認識網路如何發展到今天的地步,如何解決reliability, scalibility等問題。一堂課的內容不會太多,教授語速適中,講話清晰。

Project1是實作一個簡單的Ping-Pong Client & Server Program,主要是讓大家熟悉socket programming。

Project2是設計一個Reliable File Transfer Protocol,將一個檔案成功從電腦A傳到B。我們需要使用UDP的情況下,去實現TCP的Reliability,讓其能處理packets out of order, duplicate, drop, delay, and data corruptions。永遠都會記得我去Vegas玩的時候,在旅館寫這個作業寫到半夜。下午在大廳寫的時候,櫃檯還過來說我們感覺很聰明(感覺就是外國人看到幾個Asian開著電腦寫扣會有的想法 XD)。

旅行回來後的某個半夜,看到封包無論被怎麼搞,都能完美地從A傳到B時,那種感動難以言喻。

Project3則是要做出一個Intra-Domain Routing Protocols,並要求用Distance Vector和Link-state兩種方法去實現。這個作業我的參與度就不高了,感謝我的隊友Annie和Michael的照顧。

Homeworks就是兩次Exams前的複習,題目重複性很高。Exams的形式是在家裡做完上傳。

這堂課涵蓋幾乎所有計算機網路的基本知識,跟OS一樣,做完projects後對於課本上的知識會有更深的印象和理解。同時,作為一個軟體工程師,免不了會碰到和網路相關的知識,所以這堂課的內容對於未來應該是非常有幫助的。

COMP541 Introduction To Computer Security

  • Language: C, Python, JavaScript, SQL
  • Professor: Dan S. Wallach, Nathan D. Dautenhahn
  • Workload: 4 projects, 3 homework

這堂課教得很雜,課程Slides也很亂,但作業出得蠻好的,所以我後半段都沒在上課,只做作業。

課堂先從基礎的密碼學開始介紹,再到網路的各種攻擊及防禦手法,最後是跟OS相關的安全問題,算是很多元的介紹了資安的各種面向。

Project 1是跟選舉相關的加密。由於Dan的研究和vote securtiy有關,於是這個作業主要是想讓我們了解密碼學如何應用在投票上。

這個project算是我第一次去traverse比較複雜的codebase,由於要去找各種教授寫好的各種methods來用,因此開始熟習vscode的快捷鍵。

Project 2則是要我們去攻擊教授設計的網站,攻擊手段包括SQL injection, XSS, CSRF。寫這個作業時,上學期修過的COMP531 web application就派上用場了,否則在不了解網站運作原理的情況下,要完成可能有點吃力。

Project 3是control-flow hijacking,就是利用process在執行function時若沒有保護到process stack上的return address,就可以透過buffer overflow去改寫return address,使process去執行我們指定的部分。我自己蠻喜歡這個作業的,因為可以了解function在被執行時和stack是如何互動的。

整體來說,我覺得這堂課作為資安的入門課算是很不錯,作業跟projects都沒有到非常難,但是對於資訊安全的各個面向都能有一定的認識,而且小時候對於駭客有一定的憧憬,修完這門算是有了解到其皮毛。

COMP530 Database System Implementation

  • Language: C++
  • Professor: Christopher M. Jermaine
  • Workload: 7 projects, 5 exams

當初本來是想藉這堂課來練習C++,結果由於另外三堂loading太重,這堂我一個作業都沒寫,完全靠大衛凱瑞。雖說如此,透過上課內容跟考試,還是有稍稍增加我對於database底層運作的暸解。

這堂課的projects就是將database從最底層一路寫到最上層,最後要能做SQL queries。教授會給一些他寫好的部分,所以不完全算是從頭刻。每個作業可以選擇用自己前一個作業寫的部分,也可選擇教授幫你寫好的。刻完相信對於整個DB的運作會有很深的認識,可惜我啥都沒寫到…

心得

能夠放心地修這麼多硬課也是因為開學初就確定拿到Meta summer internship offer,運氣算是不錯。作為一個轉專業仔,我只想盡快將基本的電腦科學知識補齊,所以堅持不修廢課,雖然會有像COMP530這種handle不過來的課,但就算分數比較低,至少還是能學到東西(最後分數並沒有很低,因為大衛太屌…)。

我認為修了這些computer system的課是很重要的一個決定,因為這讓我在未來有更多除了full-stack engineer以外工作上的選擇,也許可以試著嘗試更多會觸碰到low level的職缺。

這學期除了上課的知識之外,也找了個git tutorial將常見但不熟的地方搞清楚。由於更常跟terminal打交道,於是將iTerm設置得更方便。同時,還學會了如何設定ssh公私鑰,不用每次連上學校的server都要打密碼。簡單來說,就是越來越熟悉一個軟體工程師需要的技能以及如何優化工作流程。

--

--