113-1 台大資工大三上修課心得

90 min. read

Abstract

在這篇文章,我簡要(?)介紹了113-1學期修的8門課程,並附上修這些課的心得。這些課程合計21學分(包含停修的3學分),分別有:計算機結構計算邏輯簡介虛擬機器(VM)高等編譯器設計無線行動網路導論程式語言:命令程式設計(PLIP)桌球初級以Excel進行資料分析

(省流用)對於只想看課程心得而不想看廢話的人,以下是幾點我想事先說明的:

  • 有些課程因為沒有公佈成績組距或A+人數,導致我不確定它們到底甜不甜,畢竟NTU COOL的成績分佈會算到旁聽生的成績(不知道停修的會不會),只看那個非常不準。我會在這些課程的甜度的欄位加上一個?\mathord{?},表示甜度是隨便估的或根本沒填。雖然這麼說,但好像每個課程的甜涼度都是我隨便又非常主觀地估的欸(?

(欸?好像只有一點欸)
好了,可以接著翻到§IV§VIII\S \text{IV}\sim \S \text{VIII}找想看的課程心得了。

I. Introduction

又到了半年一度被自己(和同學)催生修課心得的時間。我原本打算在一月底寫完這篇心得,結果從一月中旬去日本玩回來後,我先是生了好幾天的病,還花了兩週出NASA的題目(12月底在接這個工作前還以為可以划水的==),再加上浪費大半天在網路衝浪是我每天的例行公事,導致我現在(第2學期開學前一週)才在趕出這篇心得。

這篇心得在各個課程的修課心得的編排與分類上,相較於以往的幾篇有較大幅度的改動。以前我都是用「系訂必修」、「系訂選修」等分類把心得分成多個sections,但我最近才意識到(如果這篇讀者不只我一個,)讀者不一定都就讀本校資工系。如果存在這樣的人,他的必修、選修科目想必和我的分別不是同一個集合。因此若他要找到特定課程的心得,用這種section title定位應該不太方便。就算也是讀資工系,他得先知道我也讀同個系才能快速定位他要查詢的課程心得。(廢話好多==)總之,本次的編排方式主要參考[1](超大學級的修課心得!),我把課程心得依照開課系所與通識、國文、體育這些對大部分台大學生都一致的類別去歸類。

希望下學期也能想出下篇心得要整什麼活,當然前提是我還有動力寫。

寫了那麼多廢話,主菜怎麼還沒端上來呢(惱)

II. Background

這學期我修了18學分,停修了3學分(高等編譯器設計)。除此之外還接了NASA工作(雖然都沒在做事),也修了NSLab的專題(但沒拿學分)。好像不知道還能寫什麼了......

III. Related Work

這裡是我同學這學期的修課心得:

IV. 資工系

計算機結構 CSIE3340

  • 雙班
  • 授課教師: 洪士灝
  • 涼度: 5/105/10
  • 甜度: 5?/105?/10
  • 評分方式:
    • Assignments: 30%30\% (原始分數共506506分)
      • 作業(5份): 占496496分/506506
        • HW1(全手寫題): 9696
        • HW2~HW4的手寫題: 各5050
        • HW2~HW4的程式題: 各5050
        • HW5(全手寫題): 100100
      • 隨堂點名: 占55分/506506
      • 隨堂小考: 占55分/506506
    • 期中考: 30%30\%
    • 期末考: 40%40\%
  • 課本: David A. Patterson and John L. Hennessy. Computer Organization and Design RISC-V Edition: The Hardware Software Interface (2nd. ed.)

資工必修。這門課評價蠻兩極的,詳細可以參考[3][4]

教授用投影片上課,而上課投影片有一堆寫錯的地方,且應該不是他做的,他上課時看起來對投影片不太熟悉。教授上課時很多東西不是草草帶過,就是照著投影片唸,我個人認為課本寫得比投影片與教授講的內容清楚太多了。我在聽教授教pipeline時幾乎什麼都沒搞懂,但看了課本對應的章節就會了。不過選擇看課本而不是聽教授上課(或自己啃投影片)來搞懂上課教的東西當然也有需要考量的tradeoff了,畢竟課本實在太多頁了。

教授說會不定期點名與小考,但只有在學期初至期中前點過1次名與考過一次試==,而且點名與小考其實就是在最後一節課下課時開放幾分鐘的COOL線上測驗讓同學作答,所以大概可以不去上課,12點準時上COOL檢查有沒有新測驗就好。

要說先備知識的話,大概就是OS的內容了吧。但其實這門課裡面與OS相關的內容都會從頭開始教(只是教得比較爛),所以沒修過OS好像也不會怎樣。

作業

有分手寫題與程式題,大部分都蠻簡單的。今天的最後一份程式作業甚至比洪士灝上次開這門課時的最後一份作業還簡單:以前好像要用Verilog美麗羅格接出pipelined CPU,今年只要接出single-cycle CPU,且只需要支援簡單的幾個arithmetic instructions,難度大幅下降。

我把所有程式作業的題目和我的答案都放在⟶⟶這裡⟵⟵,歡迎參考。

期考

兩次期考的題目都不知道在出什麼。期中明明範圍是Ch1~Ch4,但考卷裡根本沒有Ch2與Ch3的題目,偏偏Ch2教的還是我認為考試範圍裡與Ch4的pipeline同等重要、要花很多時間背的RISC-V instructions(不過可以把要背的東西放在大抄上)。期末考題就比較像樣了,但我不會寫的題目還是蠻多的(甚至比期中多),最後也沒寫完,空了好多題,不知道為什麼同學好像都寫得完==。
還有,我很不喜歡期考的配分方式:每小題——不管難還簡單——都各占5分。這讓我就算大費周章寫完一道很麻煩的題目,最多也只能拿5分,心裡很不是滋味。

由於期中同學普遍考得比較糟(COOL顯示原始成績的平均為57.93,挺創的吧),教授後有調整期中分數,據說是「調成跟期末考差不多」。調整後期中平均 71、中位數 76.8,期末(無調分)平均則為76.48左右(這是COOL上顯示的平均,我找不到確切數據)。

我把期中期末考的題目放在⟶⟶這裡⟵⟵,歡迎參考。

感想:不知道在教什麼ㄍㄅ的一門課,要不是隔壁楊佳玲班採用翻轉教室上課,我一定會選擇楊佳玲班而不是這班(我就不想回家看影片==)。要學東西也請去隔壁班。

計算邏輯簡介 CSIE4111

  • 授課教師: 王柏堯
  • 涼度: 7/107/10
  • 甜度: 8/108/10
  • 評分方式:
    • 作業 (77份): 50%50\%
    • 期中考: 20%20\%
    • 期末考: 20%20\%
    • 出席(基本上大家都能拿滿): 10%10\%

這門課在教理論電腦科學中的多個邏輯系統與應用(相關的演算法)。教授是中研院研究員。他使用應該是以beamer打出來的投影片上課,不點名(那個10%10\%出席分是送的)、不錄影。整學期用到的投影片只有4份,但平均每份有150頁左右,每頁內容也不少,所以教授上得還算蠻快的,每週能上50頁左右。我認為教授教課教得很好,他遇到重點(比如各種定理、演算法)會講得很仔細,還會怕同學沒聽懂而再講一次,而遇到不太重要的部份就不會深入投影片的細節。

課程分為四個單元(各一份投影片),每個單元會介紹一個或多個logic system(s),後面再介紹它的應用。按教的順序列出為(藍綠色的部份是理論,黃色部份是應用):

  1. Propositional logic(definitions, proof rules, semantics, CNF, validity, satisfiability, Horn clause), SAT Solvers(Tseitin transformation(這個蕭班ADA有教), SAT algorithms(Davis Putnam, DLL))。有修過偶數年FLOLAC或ADA的人應該會對部份的內容感到熟悉。
  2. Predicate logic(definitions, proof rules, semantics, undecidability of validity problem), expressiveness(reachability problem, existential second-order logic, universal second-order logic), Coq
  3. Proof-based program verification: Hoare logic(Hoare triple, proof rules, proof tableaux, loop invariant), Z3 solver。Hoare logic部份的內容幾乎是穆信成開授的程式語言:命令程式設計教的東西的subset,只是兩者視角與強調的重點不一樣。前者使用natural deduction來描述proof rules(像維基百科這樣),後者則使用calculational logic(先定義weakest precondition,再定義程式語言裡的各種語句組成的Hoare triple與什麼東西等價)。(我對邏輯還是不太熟,有錯請不吝指正。)我覺得還蠻有趣的。
  4. Model Checking: LTL, Promela & Spin, CTL, CTL*, LTL model-checking algorithm, CTL model-checking algorithm。LTL model-checking algorithm與自動機有關(有用到NFA),而CTL model-checking algorithm部份教到的fixpoint theorem其實高等編譯器設計的助教課也有教,只是後者教得很爛就是了。

這門課是我到目前為止在台大修過品質最高的課之一,同樣優質的課程好像只有蔡國榮教授的線性代數導論一/二。除了教授講課講得十分清楚外,教授與助教也都很熱心地回答同學問題。我在上完課後幾乎都會問問題前提是我沒蹺課,感謝他們讓我占用寶貴的時間。此外,這門課的高品質也體現於投影片上。教授的投影片內容充實、編排精美、格式工整,即使有些小缺陷,它還是能排在台大課程投影片排行榜的S tier。老實說,我常常因睡過頭而蹺課,但我都能在課後只靠著啃投影片吸收當週十成甚至九成的課程內容。可能有人會問我怎麼沒去上課也能知道教授教了什麼,這是因為教授上課講的東西幾乎都有寫在投影片上,但這並不表示教授上課時是照著投影片唸的——他是用自己的話解釋投影片的內容。

題外話,這門課是三類加選。學期初我為了修到這門課,每次加退選都有選,但直到最後一次加退選才從11抽4的競爭中搶到名額。真的非常感謝那些期初退選的同學,要是沒有他們沒退選我肯定修不到這門好課。

這裡列一些與這門課相關的課程好了:自動機與形式語言/計算理論, ADA/演算法, 軟體規格與驗證, FLOLAC(偶數與奇數年的課好像都有關), 程式語言:命令程式設計。

因為我好像寫太多了,以下就簡短介紹作業與考試好了。

作業

  • HW1: 證明propositional logic sequents的validity。這個應該一小時就能寫完了。
  • HW2: 用任意語言寫一個能生成鴿籠問題的CNF formula的程式,再把生成的CNF formula丟給指定的SAT solver去解。這個快的話應該一到兩小時就能寫完了(當然我寫了更久==)。另外這個網站幫了我很多。
  • HW3: 證明predicate logic sequents的validity。這個應該一到兩小時就能寫完了。
  • HW4: 使用Coq證明簡化版的中國剩餘定理。教授給了我們很多時間做這份作業,但其實寫起來沒有很難。最難的是搞清楚Coq的library裡面到底有哪些lemma與theorem可以用==。這份作業花了我約兩天寫完,其中大半的時間我在想辦法讓vim能正確區分Verilog美麗羅格與Coq檔案(啊怎麼都是.v檔......),以及上網查Coq要怎麼用、library裡有哪些東西可以用。
  • HW5: 證明hoare triple的validity。這個應該一到兩小時就能寫完了。
  • HW6: 給一個計算McCarthy 91 function的程式,要找出其中的while loop的loop invariant,並以Z3 Python表示之,以通過Python script的檢查。這份作業最難的部份是要找到給定迴圈的loop invariant。我在程式語言:命令程式設計課程裡想了整整三節課才想到loop invariant,期間幾乎沒在聽課,真的非常對不起穆信成。
  • HW7: 用Promela實現Needham-Schroeder protocol的MITM attack與對應的fix,並用Spin檢查上述的實作有無漏洞。這可能要花一小時到數小時才能寫完,取決於你有沒有看懂題目。另外,裝Spin也可能要花一點時間。

我把作業題目和我的答案都放在⟶⟶這裡⟵⟵,歡迎參考。

期考

這門課的期考開放電子產品的使用(不能上網),這意味著同學可以在考試時翻閱存在平板或電腦上的課程投影片。我認為所有課程的考試都應該仿效這門課。

期中考我認為偏難(當然這很主觀),考的5大題共12小題中我有3小題不會寫(包括寫錯)。好在滿分有120分,而且考卷改得蠻鬆的,所以分數應該蠻好拿像我不會寫3小題還撿到102分。甚至期中考只佔總成績的20%20\%,考爛了完全不用慌。至於改得有多鬆,以4(b)題為例,那題是要利用在4(a)題回答的構造,以及compactness theorem,去反證某個東西。結果我因為在4(a)想不到怎麼構造,4(b)就不會證明。最後我只臨時寫一句No. We can prove by contradiction using compactness theorem.就拿到4(b)全部的分數,有夠扯吧?

期末考非常水,每題都是臨場看投影片就會寫了,幾乎不用動腦,第一題甚至是問你喜歡哪些課堂內容(占20分)。大多數的人好像都早早寫完就交卷了。另外,我發現第5題考的東西在程式語言:命令程式設計這門課上教過(還是這門課某單元的重點之一),我在考試時就直接用這門課教的技巧寫了。

我把期中期末考的題目放在⟶⟶這裡⟵⟵,歡迎參考。

虛擬機器(VM) CSIE5310

  • 授課教師: 黎士瑋(Thisway)
  • 涼度: 4/104/10
  • 甜度: 5?/105?/10
  • 評分方式:
    • 作業(4份): 各10%10\%
    • 期中考: 25%25\%
    • Final project: 35%35\%
      • Oral presentation: 15%15\%
      • Report: 20%20\%
    • Participation bonus: 5%5\% (我不知道bonus是怎麼給的)
  • 課本:
    • Edouard Bugnion, Jason Nieh, and Dan Tsafrir. Hardware and Software Support for Virtualization
    • James Smith and Ravi Nair. Virtual Machines: Versatile Platforms for Systems and Processors

這門課為EMI課程,意味著教授與助教在課堂上全程使用英語,期中考時甚至規定向助教提問也要用英語。

教授使用他自己做的投影片上課。期中前主要在簡要地介紹x86與ARMv8架構上各自的hardware virtualization support (Intel VT-x與ARM VE)、KVM如何運用VT-x與ARM VE來達成虛擬化,以及缺少這些硬體支援時的虛擬化技術。期中後的內容為virtualization security(包含多個paper提出的解決方案)、container(包含Docker, K8s, 與Linux kernel中提供的support)與process VM。期中考前的內容似乎與第一本課本:Hardware and Software Support for Virtualization緊密相關。
教授在這門課中提到了很多技術,但幾乎都沒有深入介紹(他常常說如果要了解更多,請去看paper),因此我認為這門課比較像導論,應該叫做introduction to virtual machines\text{introduction to virtual machines}。又因為我對課程內容的吸收效率蠻差的,每次上課我都覺得自己被硬塞了一堆看不懂的名詞==。

話說教授的板書蠻抽象的,我經常看不懂他在黑板上寫的字與畫的圖。

作業

共4份,每份總分10分。HW3以外的作業目標都是修改source code(分別要修改KVM/ARM, KVM/ARM, QEMU),而HW1以外的作業都要繳交一份write-up。

  • HW1: 照著作業指示使用KVM在ARM VM (host)裡面運行一個VM(這部份要用到的指令作業幾乎都有提供,照著做就好了),並修改KVM source code幫助VM在運行某個指令的程式時跳出無窮迴圈。
  • HW2: 修改ARM VM (host)裡面的KVM source code,為用KVM運行在上面的VM創建一個virtual device,並寫一個能read from/write to這個virtual device的kernel module(當然是給上面的VM用的)。
  • HW3: 找到一個在pKVM host上access VM memory的方法,如果有找到第二個可以再加2分(bonus)。我只找出access memory但VM會直接crash(因此讀不出memory內容)的方法,這樣有拿到9分(被扣分是因為write-up寫錯),除此之外我想不到其他方法了==
  • HW4: 修改QEMU source code並讓QEMU用dynamic binary translation (不是KVM!)運行一個VM,目標是讓這個VM裡面的一個程式能在執行期間修改自己的code(即修改process memory的.text segment)。使用原本的QEMU的話那個程式無法修改自己,因為.text所在的page是read-only的,QEMU在執行address translation (page table walk)時會發現沒有read權限而產生page fault(應該是這樣吧)。總之就是要讓QEMU在對的時機繞過權限檢查。

作業最難的部份不是寫出程式(每份實際要寫的程式不會超過100行),而是想到要source code裡成堆的檔案與函數裡面找到實際要修改的部份,以及到底要在修改中使用哪些函數才能達到目的。但我沒有認識的同學能救我、不知道怎麼有效率地找到source code裡要用到的函數、也沒有太多讀source code的時間。因此,我選擇詢問網路上最了解KVM與QEMU source code又能讓我問的對象:ChatGPT。每份作業要改哪裡、怎麼改都是我跟ChatGPT來回很多次並不斷修改source code、debug後得到的答案。當然,ChatGPT不可能在第一次詢問就給出正解。我是將ChatGPT給的答案裡用到函數作為提示,自己去翻閱那些函數,再把從中找到的線索回報給ChatGPT。這個方法大幅省去了我鎖定出到底哪些函數才能達成題目要求的時間,在此推薦給沒跟麻吉一起修課的各位。諷刺的是教授在課堂上說GPT寫不出作業,他也有親自檢查過GPT的答案是錯的。

期中考

這門課只有期中考,沒期末考。
我認為期中很難,只考到63分,平均好像是53左右(COOL的課程被隱藏了我看不到成績,有寫錯請不吝指正)。好在教授後來有調整全班期中成績,方式為開根號乘以1010。另外我讀期中的方式是讀Hardware and Software Support for Virtualization這本書(畢竟另一本課本實在太多頁了,再加上我看不太懂課程投影片),以上供參。

Final Project

以小組為單位進行。教授會公佈好幾個set of papers,每個set有(約)三篇papers,都與virtualization相關,且每個set涵蓋了虛擬化在一個領域/技術的應用。每組要選一個set並看完裡面的papers。學期最後三週會安排時間讓各組上台用英文報這些papers的內容,而期末考週的下週要以小組為單位繳交一份書面報告。

高等編譯器設計 CSIE5054

  • 授課教師: 廖世偉
  • 涼度: ?/10?/10
  • 甜度: ?/10?/10
  • 評分方式:
    • 作業 (??份): 42%42\%
      • HW0: 7%7\%
      • HW1~4: 各8%8\%
      • Case studies (不知道有幾份): 共3%3\%
    • 期中考: 20%20\%
    • 期中補考: 15%15\%
    • 期末考: 30%30\%
  • 課本與教材:

這門課由廖世偉與Jserv教授與助教們合授,主要在教各種編譯器優化最佳化演算法與牽涉到的技術。編譯器優化就是編譯器會由intermediate representation (IR, 即編譯器在產出assembly之前會先將原始碼翻譯成的語言,用於分析程式)著手,將原本的程式替換成執行時間更短、佔用較少記憶體資源,但語意(semantics)相同(即執行結果相同)的新程式(以上內容是從維基百科[6]抄的)。這門課前半學期使用Bril作為intermediate language(表示IR的語言),後半學期則使用LLVM IR。這兩個語言的語法上課都不會教,要額外花時間自己學,開心吧?

上課都會錄影並放上NTU COOL,也不會點名,所以修這課只要期中考與期末考(與可能會有的補考、模擬考)有出席就好了。

整學期的課堂分為四種:

  1. 由廖世偉講課。廖世偉上課都使用他自己做的 (風格明顯的) 投影片,而他講課時常逼逼扯扯一堆與當週主題無關的東西,很多演算法與概念他都只是草草帶過、照著投影片唸、或乾脆跳過不講,叫學生回去自己看,似乎只在意講自己想講的東西。當然,除了講課內容堪稱一絕,他親自編輯的投影片更是令人晶彥——每份都像使用PowerPoint 2003做出來再轉換成Google slides,且格式嚴重跑版的檔案。令我頭痛的除了直接用Calibri字體表示且有些字元根本無法顯示的數學式子,更還有一份大量文字疊在一起的投影片。廖世偉在教到那份投影片時,甚至還自誇那裡面有他精心製作的動畫,但我在投影片裡看到的只有新出現的文字直接淡入並蓋在現有的文字上,而被蓋住的文字也沒有消失。Figure 1就是其中一張這樣的投影片。
    Figure 1: 抽象的投影片
    不是,教授,這樣誰能看懂上面在寫什麼?我有去向廖世偉反映這個問題。當時得到的回覆是「可能是格式跑掉了,之後會修改」,但那份投影片裡重疊的文字直到撰寫當下都還在,我不知道他到底修了什麼。此外,我也有向助教反映,他們只苦笑廖世偉做的投影片就是這樣,他們也沒法修改。學期初看到這種亂七八糟也無人可管的投影片時,我就幾乎決定要停修了。我在停修前得到的結論是:廖世偉教課很沒料,不該浪費時間聽他上課的。
  2. 由Jserv講課。這部份我沒去上課,也沒有看錄影,所以就不清楚了。不過我可以肯定的是Jserv的課比廖世偉的課遠遠值得去聽。
  3. 由助教們講課。上課時助教們是使用他們與廖世偉合做的投影片。這些投影片大概是因為有助教監督內容與排版,比廖世偉自己做的投影片好讀且豐富多了。助教們幾乎是照著投影片唸,所以我猜不聽課(包含不看錄影)並只看投影片也能吸收助教課八成的內容。不過我每堂助教課(截至停修前)的錄影都有看就是了。老實說,我認為助教其實教得蠻淺的但考試考得不淺>:(,但至少能學到得比在廖世偉的課還要多。
  4. Guest lecture。這部份我也沒去聽,也沒有看錄影,所以也不清楚。

課堂錄影與投影片

這裡放上一些課堂錄影與投影片連結,給想修這門課參考(順便勸退):

作業

我由於期中後就停修了,只寫了約半數的作業。以下只列出我有寫的:

  • HW0: 寫一個在Ubuntu機器上安裝Bril的shell script,使用Github classroom評分。由於Github classroom上用於autograding的workflow會事先把Python與deno等環境建好,官解好像只有6行,但我自己寫了40多行,還花了半天才寫完==。不過快的話應該一小時內就能處理掉。另外,我有寫一個用來把Bril裝在指定的目錄下的shell script,用法與Python的venv類似。用它建立臨時能用Bril的環境去寫HW2應該會比較輕鬆。
  • HW1: 手寫題,只有一題。它給了一個使用雙層迴圈計算某個array的簡單程式,問你能不能使用Affine space partition去將此程式轉換成多個各自被assign一個ID的CPU能同時執行,以計算出跟原本相同的array的程式。我的回答幾乎是抄Compilers: Principles, Techniques, and Tools (2nd Edition)(即課本)的chapter 11.7.3~11.7.7,畢竟Affine partition單元是由廖世偉教的,而我看不懂他的投影片。這份作業花了我好幾天寫,因為我要先花時間看懂Affine space partition在幹麻。
  • Case study A: Local value numbering (LVN)相關的問答題,外加跑幾個指令並附上結果。這個有看CS 6120: Advanced Compilers: The Self-Guided Online CourseLocal Analysis & Optimization單元就會寫了,應該一個下午就能寫完。
  • HW2: 用Python實作將非SSA(static single-assignment) form的Bril程式轉換為SSA form的演算法。這還蠻麻煩的,我花了一到兩天才寫完,全部程式約有五百行。
  • HW3(其實我沒寫): 延續HW2,用Python將SSA form的Bril程式轉換為LLVM IR。(我記不太清內容了,有錯請不吝指正。)

我把上述提到的作業的(大部分的)題目與自己的答案都放在⟶⟶這裡⟵⟵,歡迎參考。

期中考

如上所述,我期中後就停修了,所以只寫一點期中考心得。
期中考為closed-book的實體考試,使用Google form作答,題目有20來題。考試範圍包含助教課、廖世偉上的課與Jserv上的課,但好像大部份的題目是落在助教課教的範圍。只不過雖然題目都是從每週上課的主題出的,但好像有蠻多題考的是上課完全沒講過的東西(就跟其他資工系課程一樣)。期中前我有認真看完助教課和廖世偉課程的錄影(沒看Jserv的),但我在期中還是猜了半數的題目,其中有助教課講過但我沒背起來的 (當時我對期中考抱持半放棄狀態就沒特別背上課內容) ,也有那種我壓根就不知道上課到底哪裡提過的東西。最後我異常幸運地猜到了80分,動搖了我停修的念頭。有一說一,要是再修一次我還是不知道要怎麼準備這門課的考試,畢竟考的很多都沒教,或是有教但沒教清楚。

V. 電機系

無線行動網路導論 EE4027

  • 授課教師: 魏宏宇
  • 涼度: 6/106/10
  • 甜度: 7/107/10
  • 評分方式:
    • 手寫作業 (1份,即HW0): 4%4\%
    • 程式作業 (4份,即HW1~4): 各6%6\%,共24%24\%
    • mini project (aka HW5aka 迷你投影): 8%8\%
    • 期中考: 32%32\%
    • 期末考: 32%32\%
  • 參考書目:

這門課每兩年開一次,以往都是開在下學期,但這學年不知道為何改到上學期就開,開課時間也改了。由於我想了解無線網路,再加上我這學期不修的話,大概就無法在畢業前修不到了,所以就揪了同學一起修。

這門課的課程內容可以分為幾個大主題。藍綠色的部份是期中考前的內容,黃色部份是期中考後的內容:

  • 無線網路與行動網路(mobile network)在OSI model的layer 1~4從古至今發展出來的各種技術、models、protocols、遇到的困難與solutions。可再細分為:
    • Physical layer: 無線通訊的基礎知識(比如SINR, Shannon capacity)與無線電傳播模型(radio propagation model)。這部份是整課程最"數學"的內容,但其實會用到的數學工具只有高中教的指數與對數。(其實有個地方有用到三角函數,但我猜考試大概不會考。)所以修這門課其實不需要數學方面的先輩(ん?知識。
      (關鍵字: dB, SINR, Shannon capacity, path-loss, shadowing, multi-path fading)
    • Physical layer & MAC sublayer: Multiplexing, multiple access, frequency reuse。這部份主要在講要如何分配頻率、時間、編碼方式,來將一個頻段切分為好幾個channels,以及行動網路中每個cell使用的頻段是如何分配的。
      (關鍵字: DSSS, FHSS, TDD/FDD, TDMA/FDMA/CDMA/OFDMA, TDM/FDM/CDM/OFDM, frequency reuse factor, reuse distance, co-channel interference(CCI))
    • MAC (medium access control) sublayer: 讓多個裝置共享同一個無線傳輸媒介(即wireless MAC)會遇到的問題(如NASA應該會教的hidden node, exposed node, etc.)以及各種protocols(主要是polling與random access protocols)。
      (關鍵字: hidden/exposed node, near-far effect, capture, Aloha, slotted Aloha, CSMA, DAMA, reservation-Aloha, PRMA, reservation-TDMA, MACA, RTS/CTS, polling, ISMA, SAMA)
    • Network layer: 無線隨意網路(mobile ad hoc network, MANET)中的各種routing protocols。
      (關鍵字: AODV, DSR, OLSR, DSDV)
    • Transport layer: 在無線網路中使用TCP會遇到的問題與各種solutions。
      (關鍵字: Snoop, indirect ICP (I-TCP), mobile TCP (M-TCP), explicit loss notification (ELN))
  • IEEE 802.11 (即Wi-Fi)。可再細分為:
    • 802.11在physical layer的規範與使用的技術。(這部份占投影片的幾頁不到。)
    • 802.11在MAC sublayer讓多個裝置能共享同一個無線傳輸媒介,並避免封包發生collision所採用的protocol。這部份因為protocol的規則很多,我花了蠻多時間才勉強讀懂大部分的內容。不過這部份的優點是它比期中考後的幾個單元(對,我在說你,mobile network)來得具體許多,mobile network 5G/B5G與6G的部份實在是抽象到我看不懂。
      (關鍵字: CSMA/CA, IFS, RTS/CTS, DCF/PCF, paging, MIMO, …) (太多列不完==)
    • 其他802.11所定下的酷酷的功能/標準。
    • 最近加入或將要加入802.11的功能/標準。
  • 行動網路(mobile network)的架構,包含2G(GSM), 3G(UMTS)與其改進, 5G與其改進(即beyond 5G, B5G),以及6G可能會有的新功能、架構、應用、與其對未來社會影響。

老實說,在mobile network這部份,我能大概理解的範圍就到3G而已了。投影片充斥著各種專有名詞縮寫和圖,且編排雜亂無章,教授寫不會一一解釋圖中每個縮寫的意思(當然有些縮寫的全稱在前面的投影片有出現過,有些則根本沒有,要自己上網查才會知道意思)。這讓不會回家再自己查資料的我直到考前都還是幾乎不懂2G與3G的運作方式。至於後面的5G/B5G及6G課程,它們聽起來十分抽象且籠統,教授也沒有深入解釋每個名詞與每個技術的運作原理,上到這部份時我意識到再怎麼認真聽,能吸收並理解的內容也十分有限,於是我就把課堂當成演講課,去做自己的事了。當然期末考有一大題在考5G/B5G及6G,還好有同學的大抄救了我。

關於修這門課所需的先備知識,雖然這是一門開在電機系的選修課,但如果只是要應付考試跟作業,那其實只要會對數與指數、最基本的統計知識(因為shadowing的公式裡面有符合normal distribution的random variable,而這個公式會在作業中用到),以及Matlab、Python、C++其中一個語言的程設能力即可。儘管如此,我想擁有更多相關的先備知識能使我們對這門課教的內容的理解更全面。畢竟這門課有提到,甚至是將學問建立於其他課程(應該)會交到的技術或理論之上,例如Shannon–Hartley theorem, PSK, coherence time, distance vector routing, link-state routing, TCP。就我所知,與這門課相關的課程有信號、通原與計網(或電網導),但還有哪些課會教到相關的東西我就不得而之了。而且這三門課我一個沒學好,另外兩個根本沒修過,也沒修過通信相關課程,難怪我常常聽不懂教授在教什麼==

其實NASA一階中有一週的課程內容與這門課的高度重合,但簡化了許多,當中包括:digital modulation methods、radio propagation models、multiplexing、CSMA/CA、RTS/CTS等等,只是當時我幾乎完全聽不懂蔡欣穆在講什麼,他也只講個大概(畢竟只講了兩節課),所以對於大部分的內容我是在無線行動網路導論這門課才有比較完整的理解。至於NASA那週的課程,稱其為(introduction to)2 wireless and mobile networking(\text{introduction to})^2 \text{ wireless and mobile networking}也不為過。

教授使用投影片講課,不會錄影,不會點名。他的口條十分流暢,遇到重點常常一下就講完了,投影片也是跳得很快。這導致我為了作筆記或是太累睡著而漏聽個幾分鐘的課(我無法一心多用,這就是為何我基本上上課都不做筆記),等到回過神時往往發現教授已經在此期間講了好幾頁投影片。因此對我來說聽完完整的課程需要極高的專注度。

當然,語速快不是最要命的。這門課讓我吃最多苦的便是那編排「精美」投影片。教授編輯投影片之用心由貫通每份投影片的comic sans字體便能略知一二。首先,幾乎每張投影片都會有字型一樣大的標題,但只靠這些標題根本無法看出整份投影片的hierarchy,因為每個褾題只總結了個別投影片的內容,卻沒有標注當前投影片在討論整份投影片的哪個子主題。這如同一份\subsubsection\subsection全部被換成\section,且section number全部被拿掉的Latex文件,讓人難以摸清各個section之間的關係。你可能會問,難道投影片沒有附上outline嗎?的確,有些投影片有outline,但它們實在寫得粗略到有跟沒有一樣。再者,投影片的編排順序十分紊亂。有份投影片的前幾頁明明描述了三個random MAC protocols,而在這幾頁之後才接著統整random MAC protocols的components,就當我以為後面幾頁也是要十分general地描述random MAC protocols的性質時,下一頁又開始舉其他random MAC protocols,而到最後一頁,又總結出MAC protocols有哪些種類。你難道不能先在第一頁先放MAC protocols的種類,第二頁放random MAC protocols的components跟接下來要舉的protocols清單,再開始個別描述嗎?我認為教授可以參考敝系計算邏輯簡介的投影片,那幾份投影片做得好太多了。容我最後在這裡節錄李彥寰教授的貼文[5]:

如果不事先讓讀者/聽眾知道需要期待什麼、思考什麼,只是很麻木地一路寫/說下去,想著反正最後就會圖窮匕見,水落石出,那麼讀者/聽眾會有大半的時間被迫處於非常困惑,不知道你到底要幹嘛的狀態。他們甚至在中途無法思考,因為他們就是不知道你到底要幹嘛!......
......這會大大傷害你傳達你的研究結果的效率。讀者/聽眾有大半的時間都只能像個傻子被呆呆帶著走,無法思考,一直到最後水落石出的時候才能開始思考,這時前面吸收的資訊才起作用,然而讀者/聽眾早就忘掉他們在困惑狀態下吸收的那些資訊了。......

另外,如同前面所說的,投影片裡有大量的專有名詞縮寫。大部分的專有名詞都是第一次出現時以全稱表示,後面就通通用縮寫表示了。這門課的專有名詞這麼多,到底誰有辦法在上課看到縮寫時立刻想到它的意思?反正我是記不起來,每次看到縮寫都會到前面的投影片翻找或直接上網查它的意思。總之,大概是我少了輕鬆看懂投影片的慧根,以至於我對教授的這幾份使用comic sans的投影片有閱讀障礙,自己啃投影片會完全看不懂,一定要搭配教授講課才可以。說到投影片,這門課很久以前用的投影片可以在這裡找到,我想這學期用的投影片應該跟以前的沒有差太多,只不過撰文當下我連不上這個網站就是了。

在台大課程資訊交流區的課程評價中有提到教授每講解一個段落都會停下來讓同學發問,且通常有不少同學發問。然而這學期的課程裡,教授雖然也經常問同學是否有問題,但幾乎沒有任何人發問,教授似乎也蠻錯愕的樣子......。我自己沒發問是因為坐得太後面不敢舉手發言,但我有時會在下課後去問問題。

作業

手寫作業(HW0)要看關於5G/6G的影片並寫一頁心得,這個唬爛就好,沒什麼好介紹的。

程式作業(HW1~4)是要用程式(Matlab、Python、C++擇一)模擬在單個或多個行動裝置與基地台的環境,當中手機會傳送信號給基地台或由基地台傳給手機,並要計算接收端從一個發送端收到的信號強度,與從其他發送端收到的干擾強度(當然還要做一點計算)。程式部份還蠻簡單的肯定比2023DSA的腳踏車麵包店簡單,我是選擇用Python寫,畢竟Python是(我認為)這三個語言裡用來應付這種作業寫起來最輕鬆的。 你知道的,我一直是蟒蛇的粉絲。至於矩陣實驗室,我祝它幸福。 另外,除了程式外還要交一份report,回答題目裡問的一些問題。
雖然說簡單,我在每份程式作業都還是花了一到兩天寫,後兩份作業的lines of code甚至在500(行)左右,各花了兩天,這完全是出於我每次寫作業時的莫名執著。例如前兩次我就想用funcy package裡面的compose,partial,curry這種東西把程式包成一個又一個的函數,至於後兩次我就想把任何會用到的東西包成class跟method,也就因此花了很多時間在想程式怎麼寫會比較好看==(但還是很亂就是了)。不然正常寫的話,每份應該半天就能寫完了。
喔對了,HW2~HW4都有bonus題,但bonus才占每份作業的5分而已(一份作業滿分100+5),把時間花在上面十分不划算(卷狗例外)

期末要交一份mini report,即HW5,其內容是讀兩篇IEEE magazines上與無線網路或行動網路相關的articles(可以自己挑),並寫下一份report,包含summaries、strengths、weaknesses、comparison、comments。有修過CNS(密碼學與資訊安全)的應該會發現這跟CNS要交的paper critique差不多,而且其實IEEE magazine articles也跟paper沒兩樣,所以之前寫過paper critique的人在這份作業上應該不會遇到什麼困難。
這份作業的截止時間在期末考後一週,讓學生可以在各科期末考後再著手處理它,正常來說可以不太有時間壓力地寫完。然而很不幸地,由於我在期末考前很忙,於是就將這學期修的另一門課——虛擬機器——的期末書面報告延到期末考通通結束後再寫。其結果就是等到我寫完虛擬機器報告才打算開寫mini report時,離死線只剩一天了==。

我把所有作業的題目和我的答案都放在⟶⟶這裡⟵⟵,歡迎參考。

期考

期考都是考問答題,可帶一張雙面A4大抄。期中滿分100,期末則是105。期考有很多題要針對設計一個無線系統中會遇到的問題或一個無線系統的使用情境提供solution/design。我認為要給出完整且可行的設計還蠻困難的,如果教授改得很嚴,我可能在大部分的設計題都只能拿到筆墨分。不過好在期考改得非常鬆,回答即使不完整,只要看似合理就應該拿得到大部分的分數。例如,我在期中的II(c)只寫了一句話就拿到4分(該題共6分),真的非常扯。期考平均也還不意外地非常高:期中平均82.69,期末平均87.69。我想平均這麼高除了因為電機系學生非常卷,另一個原因就是考卷真的改得很鬆吧。

我把期中期末考的題目卷也放在⟶⟶這裡⟵⟵,歡迎參考。(請注意卷子上寫的exam time是錯的。)

老實說,儘管作業與考試對課程內容的吸收程度的要求不高,我認為能從這門課學到的知識量上限挺高的,畢竟這門課真的提到了很多東西,只是對於大部分的內容教授都沒有深入講解而已。要是除了單聽教授講課外,也勤於查資料與問問題的話,我想應該能學到不少有用的東西而不是像我一樣只學到了皮毛

VI. 資管系

程式語言:命令程式設計(PLIP) IM5065

  • 授課教師: 穆信成
  • 課程網頁: https://scmu.github.io/plip
  • 涼度: 8/108/10
  • 甜度: 7?/107?/10
  • 評分方式:

    學期成績=min(期中成績,期末成績)30%+max(期中成績,期末成績)70%\text{學期成績}=\min(\text{期中成績}, \text{期末成績})\cdot 30\%+\max(\text{期中成績}, \text{期末成績})\cdot 70\%

  • (主要使用的)參考書目:
    • A. Kaldewaij. Programming: the Derivation of Algorithms
    • D. Gries and F. B. Schneider. A Logical Approach
      to Discrete Math
    • E. W. Dijkstra. A Discipline of Programming

內容與這門課最相近的課程可能是蔡益坤教授的軟體規格與驗證(我原本這學期要修),其次是王柏堯教授的計算邏輯理論(我這學期有修)。

(剩下待補)

期考

期中水到不行,完全在送分,但期末偏難(我認為答案要寫完整的話要寫很多東西,但時間不夠用)。

我把期中期末考的題目也放在⟶⟶這裡⟵⟵,歡迎參考。

(剩下待補)

VII. 體育

桌球初級 PE2074

  • 授課教師: 陳逸杰
  • 涼度: 6/106/10 (因為每週都要出席,還要課外練習15小時)
  • 甜度: 8?/108?/10
  • 評分方式:
    • 出席: 40%40\%(缺課3次以上會直接拿F)
    • 測驗: 40%40\%
      • 期中測驗:
        • 正手發平擊球20顆(直線x2+斜線x2,每條線各5顆)
        • 正手對打10組(跟組員打)
      • 期末測驗:
        • 左推右攻10組(跟組員打,一個打直線一個打斜線)
        • 發下旋球5顆(助教會負責試著用力把你發出去的球推回去,他沒推回去(即掛網)才算分,因此發的球要夠旋)
    • 課外練習15小時(繳交一份紀錄表): 15%15\%
    • 期末書面報告(300字心得與課程建議): 5%5\%

就是很普通的體育課普通和理所當然是什麼呢,老師人很好。

這門課比較特別的可能是那個課外練習15小時的作業。我之前修過的網球初級沒有要求同學要利用課餘時間練習這麼久,所以我認為修這門課每週要花的時間比修那門網初還要多。不過老師檢查同學是否真的有練習的唯一依據是一張期末要繳交的紀錄表,上面只須寫上每次練習的時間、地點與練習對手的簽名,所以關於要怎麼輕鬆拿到這15分,你我應該心知肚明。但老實說,我不確定老師會不會通過某些管道驗證同學繳交的紀錄表的真實性。

VIII. 通識

以Excel進行資料分析(通識A6) GenSys5023

  • 英文班
  • 授課教師: 林友瑜
  • 涼度: 7/107/10
  • 甜度:
    • 主觀(如果是電資學生的話一定也會這麼想吧): 8/108/10
    • 客觀(只看班平均和組距的話): 4/104/10
  • 評分方式:
    • 討論(在NTU COOL討論區回答2個別人問的問題): 10%10\% (每次回答各5%5\%)
    • 作業(名義上有7份,但因為有分基礎題與進階題,兩者形式也不同,所以也可以當14份): 40%40\%
    • 期中考: 25%25\%
    • 期末考: 25%25\%

這裡有篇Dcard上的課程心得。作者寫得十分完整,想省流看這個就好:https://www.dcard.tw/f/ntu/p/255919163

上課方式與內容

這門課有分上午班(英文授課)和下午班(中文授課),我是修上午班。課程內容主要為教你如何使用Excel的functions。Figure 2是我這班(英文班)的syllabus:

Figure 2: Excel課(英文班)的syllabus

上課方式為投影片搭配excel實際操作,不錄影,不看出席。投影片會事前放在COOL,每個單元都有一份。老師的英文是蠻標準的美國口音,完全不用擔心聽不懂老師的口音。

老師鼓勵學生利用NTU COOL討論區發問,通常在有學生發問後,老師會等幾天才做回覆,讓有願意教別人或想拿10%10\%討論成績的學生有機會回答。老師的回覆非常認真,會先引導學生思考excel運作邏輯才給出答案。當然也可以實際去現場問問題,他也會很認真回答你。

作業

每次作業都有分基礎題和進階題。共有7次作業,每次作業會給你一週完成。要注意的是作業出的頻率不太一致,短則一週一份作業(學期初到期中時通常是這樣),長則三週才一份(後面幾份作業通常是這樣)。不過要到後面的作業才比較難,所以應該不會有趕作業的壓力(?

基礎題是簡單(?)的COOL線上測驗,這裡說簡單是因為可以不限次數重考直到拿滿分。考得還蠻細的,我做題目的時候常常翻當週的投影片出來看,才會發現我漏掉一堆細節,有時候也會考投影片幾乎沒提到的規則。

進階題是給你excel檔案,要你在特定幾格寫上公式再複製貼上到其他格,讓每格的回傳值跟題目要求的一樣。

期考

期中跟期末都考20題。期末是19題單選跟一個簡答題,期中我忘了但大部份都是單選。期中是考學期初到期中教的所有單元,期末是考期中後教的所有單元,每個單元會考大概3題。
題目基本上跟作業基本題一樣是有背投影片有分,考得也還蠻細的。不過要準備考試應該不用複習進階題怎麼寫,複習基礎題(跟背好投影片)就好了。(雖說蠻細的,但其實也沒有那麼細)
有一說一,考試是那種有背到就會,沒被到只能隨便猜個答案的那種題目。又因為題目超級少,所以兩次考試半數的人都寫半小時就交卷了。

題目難度跟與考的細度: 作業基礎題<期考作業進階題\text{作業基礎題}\lt\text{期考}\ll \text{作業進階題}

分數

Figure 3展示了NTU COOL顯示的期考與總成績分佈(順便偷偷炫耀我的成績)。老實說,我不太理解為何期中與期末考的班平均這麼低。我猜從電資學院裡隨便抓一個同學來修,他都可以拿到A字頭的等第。

Figure 3: Excel課(英文班)的期中考、期末考與總成績分佈

以下則是總成績組距。看得出來對大部分修這門課的同學來說,這課一點都不甜:

成績 人數
0 - 9 0
10 - 19 0
20 - 29 0
30 - 39 0
40 - 49 0
50 - 59 0
60 - 69 10
70 - 79 8
80 - 89 8
90 - 99 4
100 0

結論

Excel的邏輯本身是坨屎,但老師很認真地在帶領我們認識這坨屎。另外這門課修起來像比較輕鬆的SP。
此外我其實有寫一份這門課的筆記(但沒完成!),看這個應該能學得比較輕鬆些:https://hackmd.io/@forvkusa/excel-fuckedup
(希望有人能幫我補完......)

IX. Discussion & Conclusion

明明沒有修很多課,整學期卻還是又忙又累......

Acknowledgement

感謝VM組員survey了第三篇paper,讓我只需要負責一篇,減輕了不少期末壓力。
感謝跟我做計結大抄的同學做了大抄大部分的內容,還願意把大抄給我用。
感謝桌初組員願意在測驗通過後留下來陪我重考左推右攻,拯救我在第一次考左推右攻拿的可悲分數。
感謝穆信成教授願意在課後讓我問很久的問題。
感謝NASA有線組的其他組員做了有限組幾乎所有的工作。而我幾乎什麼都沒做,非常抱歉。
感謝同學願意分享精美的無線網期考大抄給我用,拯救了我的期考成績。
感謝廖世偉教授讓我見識到教學品質的下限。
感謝所有其他這學期幫助過我的人。

References

  1. YunXiuRZ, “台大資工大二下修課心得,” $ cat YunXiuRZ, https://yunxiurz.github.io/posts/台大資工大二下修課心得.
  2. Laplacian Δ, “台大資工大二上修課心得,” Laplacian Δ, https://laplacian2004.github.io/2025/01/12/台大資工大二上修課心得.
  3. YunXiuRZ, “台大資工大三上修課心得,” $ cat YunXiuRZ, https://yunxiurz.github.io/posts/台大資工大三上修課心得.
  4. Achi_kyw, “台大資工 113 學年度第一學期修課回顧,” Achi_kyw的札記, https://achi-kyw.github.io/posts/2025/01/台大資工-113-學年度第一學期修課回顧.
  5. Yen-huan li, Facebook, https://www.facebook.com/yenhuan.li/posts/pfbid02h1niQsxyKr9abF1YVhZiPL5vf1ESEG6CExo9d5u4KNy9izqBA233GqXDVLxbcZTwl.
  6. 优化编译器, Wikipedia, https://zh.wikipedia.org/zh-tw/优化编译器.