大四上修課心得

上學期把必修課都修完之後,這學期開始都不會有必修課了。這學期的體驗和前三年都不同,因為這學期修的課都是自己精挑細選的課,學分並不多,整體修課的感受可以用「專注」來形容。除了我可以專心投入於專題研究外,其餘的四門課程也都是我有興趣的科目,沒有被迫學習的感覺。

  • 系上選修|3 學分|蕭旭君 計算機安全(第十四週停修)
  • 一般選修|3 學分|陳君明 編碼學
  • 全校通識|3 學分|朱敬一 個體經濟學原理
  • 系上選修|3 學分|廖世偉 高等編譯器設計
  • 系上選修|2 學分|黎士瑋 專題研究

當一個人進入「心流」狀態時,時間感知會變地遲鈍,因此會感覺時間轉瞬即逝,也就是「快樂的時間總是過得特別快」的感覺。我覺得這學期整體看來也可以算是一種「長時間心流」,每一週都在我專心研究與學習專業課程時不知不覺地開始與結束,沒想到剛放完暑假沒多久學期便到尾聲,記錄修課心得的時節已然到來。

評分量尺

這裡的三星是正常的意思,不是韓國企業,相當於一般人說的四分。除了極力推薦或極度不推薦,否則不會給一星或五星。

蕭旭君 計算機安全

系上選修|3 學分

  • 綜合:★★★★☆
  • 甜度:★★☆☆☆
  • 涼度:★☆☆☆☆
  • 紮實:★★★★★

上課方式:本學期的課程共分為 web, pwn, reverse 與 crypto 四大部分,這是一門臺大與交大合開的課程,由來自兩校有 CTF 經驗的四位助教講授,因此課程採直播與錄影的方式進行。內容著重在資訊安全攻擊面的 CTF 教學,課程中有不計分的 lab 而課後有 CTF 作業,需要應用上課學到的技術。

評分方式:作業含作業零共 65%,每份作業中若有解出 flag,則先得一半的分數,另一半的分數則來自 writeup;若沒有解出 flag,則全部分數來自 writeup。期末考是 AIS3 EOF ,表現與 writeup 佔 25%。最後的 10% 則來自課外參加公開 CTF,同樣是以表現與 writeup 評分。

心得:問過學長的修課經驗,就解出作業題目的同學比例而言,這學期的作業比往年難很多。我每週大約花 25 至 30 小時在這堂課上(含上課),這和我學期初以為可以專心在研究上的預期不符。我認為四個主題中最有趣的是 pwn,因為我的研究領域是作業系統,所以我對程式的底層運作很感興趣。作業中有不少題目需要攻擊程式堆疊(stack)、注入以組合語言編寫的 shell code 等技巧,每做完一題都讓我對程式的運作有更透徹的了解。做作業的過程中也學到了 gdb 的用法,以前一直想學 gdb 但找不到合適的機會,現在終於學會了。

Bonus 停修心得:學期將近尾聲時我開始投遞履歷,為了騰出時間以準備面試,我在學期第 14 週送出停修申請。身邊有些人認為我都已經修到第 14 週了,停修太可惜了,但我認為這取決於個人的價值觀。

有人會覺得停修可惜,是因為我們擔心這學期以來投入在課程中的沈沒成本,心疼我們付出這麼多努力最後卻沒換來收穫。但這樣的量尺是錯的,至少我不會使用以學分與成績作為刻度來衡量我的投入。

我停修的原因可以分成兩個部分:第一個部分是成績,我必須誠實說停修當然與成績有關,大多數人都不會喜歡自己拿到不好的成績。但對我而言,由於我不打算花時間繼續投入這堂課,所以停修的主要原因是不接受因為開天窗而拿到低分,並不是擔心最終拿不到好成績,因為我的分數排名在停修前屬前段班。另外停修這門課並沒有那麼高的沈沒成本,因為這是一門紮實的課,所以每上一週課、每做一份作業題目都能學到新知識、新技術,即使在最後一刻停修我也是滿載而歸。

當然,如果這是一門沒有內容的課,沈沒成本就會很高。最好的做法就是儘早離開,或是如果必須取得學分那就撐完整個學期。

EOF joke 助教想幫我加分也加不到了。

延伸閱讀

陳君明 編碼學

一般選修|3 學分

  • 綜合:★★★☆☆
  • 甜度:★★★★★
  • 涼度:★★★★☆
  • 紮實:★★★☆☆

上課方式:與《密碼學導論》類似,但因為這門是新開的,所以沒有看預錄影片和回答 Slido 的環節。上課內容參考 Raymond Hill 的《A First Course in Coding Theory》。和師大教編碼學多年的江政融老師合授。

評分方式:隨堂考取五次高分共占 25%。兩份作業共佔 25% 且會在期中與期末考前約三週發布,題目多來自課本。期中期末考各 25%,有選擇題、填充題和手寫題,花點時間讀熟作業的題目就能拿到高分。

心得:我這學期本來就想要修和資訊理論相關的課程,恰好看到陳君明老師開了這門新課,因為二下修了陳君明老師的《密碼學導論》還不錯,所以決定修這門課。由於是第一年開,所以課程內容有點凌亂是可以接受的,之後的幾年應該會改善。整個學期下來老實說我沒有學到很多,因為很多數學基礎內容都和《密碼學導論》重疊,編碼學的部分都圍繞在線性碼的生成、校驗與修正,每介紹一種新的編碼就會講這個編碼對應的操作。

要注意的是,這堂課所謂「編碼」並不只是狹義的 ASCII、Unicode 這些編碼,這兩種編碼沒有錯誤修正可言,ASCII 錯了就是錯了,不會自動修正回你想要的字元。這堂課學的編碼是「廣義」的編碼,除了不能修正錯誤的編碼,還包含可以修正錯誤的編碼,課程的最後會介紹如何用這些編碼建構 QR code,最高可以修正高達 35% 的錯誤如磨損、缺失等。

延伸閱讀

朱敬一 個體經濟學原理

一般選修|3 學分

  • 綜合:★★★★☆
  • 甜度:★★★★☆
  • 涼度:★★★★☆
  • 紮實:★★★★☆(就通識角度)

上課方式:老師使用自製投影片豬八戒力點講義上課,課本是老師寫的書《經濟學》,不強迫購買。課堂最後留最後三十分鐘小考,內容是上次的課堂內容,沒有課堂錄影。

評分方式:七次小考取前五高佔 20%,期中期末考各佔 40%。

心得:原本以為這堂課可以學個人決策如何影響市場,但老師實在太有內涵。第一堂課老師便談何謂通識,接著每堂課都會用該堂課的知識來針砭時事,如用供給需求分析為什麼雞蛋荒時要銷毀雞蛋?用蓄奴來解釋經濟效率的狹隘等。整體上是能夠改變我的想法的課程,很慶幸這門課在多門個體經濟學中讓我選中,讓我知道理性思考也能添上人文關懷。

冰棒 假設臺大學生都喜歡「會請大家吃冰棒的老師」,豬八戒老師會給別的老師帶來什麼外部效果?

Bonus

為什麼不該蓄奴?:Robert Fogel 研究指出,蓄奴可以提升種棉花的經濟效率,那麼就理性而言,我們就應該認同蓄奴這件事才能最大化人類社會的效率。而這堂課中老師介紹了「無知之幕」的概念,假設我們都還沒出生,我們不知道出生後自己聰明嗎?家庭和諧嗎?出生在戰亂國家嗎?還是要當終生奴隸?就算我們都認同蓄奴可以提升社會效率,但你我都不會想成為奴隸。那我們來商量一下,我們禁止這個社會蓄奴好不好?這樣我們就不會變成奴隸了。相信我們都會同意禁止蓄奴,於是我們在出生前就決定禁止蓄奴,且出生後也要繼續主張禁止蓄奴來維持出生前的承諾。

永續民主:先從永續發展談起,什麼是永續發展?或許我們可以定義成:「經濟發展不得縮減後代的選擇」,如全球暖化會造成無法回復的環境破壞如海平面上升、北極熊滅絕等,後代以後看不到北極熊就算選擇被縮減了。那麼「永續民主」呢?遵循同樣的思路可定義為:「民主決策不得縮減後代的選擇」。以英國為例,1957 年英國想要加入歐洲經濟共同體,但是因為國內投票未通過而失敗;然而在 1973 年卻因投票通過而加入了歐洲經濟共同體。後來演變為歐盟後,2016 年英國國內公投通過脫離歐盟,又再次推翻了前人的決策。這展現了英國的永續民主:後代永遠可以翻轉前人的決策。

Bonus 研究的三種類型:老師說研究分為三種:第一種是開闢一條新的道路,帶領世人前往未知的領域;另一種是在道路旁建造一座美麗的花園,路過的人都會讚嘆不已;最後一種是在花園內種上一朵花,不但沒有實質貢獻,也不會讓人注意到它。我們做研究應該要盡量建花園而不要種花,如果能夠開闢新道路那就更理想了。

廖世偉 高等編譯器設計

一般選修|3 學分

  • 綜合:★★★☆☆
  • 甜度:★★★★★
  • 涼度:★★★★☆
  • 紮實:★★☆☆☆

上課方式:通常都由助教授課,內容涵蓋 local analysis, data flow analysis 等基本編譯器後端優化演算法。偶爾 Jserv 會當客座講師授課,內容主要是他帶學生做的開源專案,以及檢討他在期中考出的題目。

評分方式: 作業零 6%,六份作業各佔 12.5%,期中期末各佔 20%,出席 4%,總計 112.5%。

心得:感覺微妙(如下圖)。因為不同的主題由不同助教授課,且主題沒有跟著一本課本走,所以變成各說各的。說沒學到東西吧,但我有刻出 Bril SSA;說有學到東西吧,我又不太清楚各種優化是怎麼兜在一起的,簡而言之就是見樹不見林。

微妙 你問我有沒有學到東西,我的表情就跟硝子被問為什麼換造型的表情一樣。

作業題目都還不錯,雖然也沒有很簡單,但是 AI 都很會寫的樣子,聽別人說打開 GitHub 時 AI 就幫他寫完了。

考試的話 Jserv 會負責出一半的題目,雖然題目很簡單,但是選項很多,多到我認為 Jserv 不小心放了多個正確答案,導致單選題會被冤枉扣分。而廖世偉老師這邊的題目則會超出課程內教的,有些題目是前幾年有教但今年沒教,可想而知助教沒有在審題。不過從另一個角度看,可以請教請教以前有修過這堂課的學長姐,請他們傳授「考試的經驗」就可以考得很好了。

黎士瑋 專題研究

一般選修|3 學分

  • 綜合:★★★★☆
  • 甜度:未知
  • 涼度:★★☆☆☆
  • 紮實:★★★★★

上課方式:和上學期自主研究不同,這學期老師將我分配給一位學長,學長帶著我研究他的專案,每兩週會與老師和學長實體開會。我遇到問題時都會請教學長,且他也是無所不答,另外我們幾乎每週都會見面討論。

心得:因為我覺得上學期研究 C2Rust 沒有真正在研究作業系統的運作,因此我向老師提出更換專題主題。這學期老師就將我分配給一位學長,我在學長的領導下研究 Linux 的網路主題,著重在 vsock 與 sockmap,兩者都不是傳統的網路架構,但都是對於雲端運算很實用的技術,可以有效降低網路延遲。

我覺得做專題有一位學長帶領是比較好的,因為專題的主題如 Linux 過於複雜龐大,一時不知道從哪個角度切入才好,這時候學長就可以告訴我們應該專注在問題的哪些面相。我這學期學到最珍貴的知識是學長教我怎麼 trace Linux 程式碼,我一開始也想說這個有什麼好教的,但是我看著學長 trace 時偶爾使用 vim 內建的搜尋,偶爾使用 telescope,偶爾又使用 grep,多種工具切換自如能夠應對不同情境,這過程中真的會學到很多眉角。

延伸閱讀