大三下修課心得

這學期初選第一次選課時就選到 22 學分,開學之後經過一些調整後變成 15 學分,後來覺得太少所以又加上了專題研究,總共是 17 學分。這樣的學分數算是非常少也很輕鬆,這學期的課只有《人工智慧導論》有期中考,所有科目都沒有期末考,大多都是期末專題。

  • 師大 黃冠寰 編譯系統設計|一般選修|3 學分
  • 陳尚澤、陳縕儂 人工智慧導論|必修|3 學分
  • 黎士瑋 系統軟體設計與實作特論|系上選修|3 學分
  • 張傑帆 計算機網路實驗|必修|2 學分
  • 李宏毅 機器學習|系上選修|4 學分
  • 黎士瑋 專題研究|必修|2 學分

這學期的課都是專業內的課程,沒有其他科系的選修與通識學分,因此整個學期都必須面對程式碼學習。主題大致上可分為 AI 和 Linux 系統,經過一個學期後,我發現我對於前者比較沒什麼興趣,對後者則充滿熱情,因此暑假打算深入研究 Linux。

這學期除了修課之外,我還讀了不少課外讀物,包括我印象最深刻的《賈伯斯傳》在內總共十一本,預計會在今年結束後寫一篇閱讀心得彙整。

評分量尺

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

師大 黃冠寰 編譯系統設計

週一 14:20 ~ 17:20|一般選修|3 學分

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

上課方式:老師使用自製的投影片上課,內容來自《Crafting A Compiler With C》,不過上課時老師主要用板書講解,老師表示這樣才有互動的感覺所以效果較好,這是老師個人的堅持。

評分方式:總共有九次為期一週的課後作業以及期中與期末專案,分數比例不公開,但是老師說分數是期末>期中>課後作業加總。課後作業大部分都可以在一個小時內完成,主要都是練習當週上課內容;期中專案是做一個特殊程式語言 Micro/Ex 的 scanner,期末則是把 parser 做出來。

心得:暑假的時候學了一點直譯器,當時覺得還滿有趣的,因此這學期到師大選了臺大沒有開的編譯器前端課程。因為我本身對程式語言有興趣、暑假學了直譯器以及上學期修了《自動機與形式語言》和《計算機結構》,這些先備知識讓我修這門課的時候如魚得水,可以專注在編譯器設計而非抽象死板的理論。

老師的板書上課

學期一開始的時候我幾度覺得這堂課進度太慢,我後來才知道不是每位修這門課師大學生都學過形式語言,老師需要時間教這些先備知識。不過到了 LL 與 LR parser 時課程突然就有趣了起來,編譯器的運作全靠遞迴,有了遞迴就能夠實現各種複雜的語法。使用 Lex&Yacc 寫編譯器的時候特別有成就感,我只需要設定好基本的語法,就可以做出功能強大的編譯器。

這學期結束後我覺得自己對於編譯器前端的運作原理熟悉了不少,寫完了 Micro/Ex 編譯器後,以前的四則運算 parser 現在對我而言只是小菜一碟,HTML 語法在現在看來只是超簡單的對稱語法。雖然現在不確定這些知識可以應用在哪裡,不過我確定自己對於遞迴的感覺有了更深的體會。

題外話,在上課的過程中看得出來老師不太會用 Windows 和 Linux,連 SSH 都需要用 GUI 工具,原來研究編譯器的學者可以對 CLI 這麼陌生嗎?不過老師的教學功力還是不錯的。

陳尚澤、陳縕儂 人工智慧導論

週三 9:10 ~ 12:10|必修|3 學分

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

上課方式:上半學期由陳尚澤老師授課,下半學期由陳縕儂老師授課,兩位老師都是用投影片上課,課後會將錄影上傳到課程網,陳縕儂老師還會把影片上傳到 YouTube。

評分方式:四份作業共 40%、期中考 30%、期末專題 30%。作業都是一半手寫一半程式,有時會花一點時間但都很簡單,期中考都是作業手寫題的題型,期末專題則是寫一個德州撲克 AI。

心得:這學期我幾乎都在課後看錄影學習,因為老師的語速偏慢,快轉會比較舒服一點。上半學期陳尚澤老師授課的部分我覺得內容中規中矩,是傳統的人工智慧理論,不過老師上課很卡,我懷疑老師沒有備課,上課時常常有超過五秒以上的停頓,而且老師很常說「這個」、「那個」而不是使用專有名詞,導致常常會跟不上。下學期陳縕儂老師的部分內容普通,主要是講機器學習,授課風格還不錯但不是我喜歡的風格,如果想要學的話我會更推薦李宏毅老師。

整個學期下來我覺得好像有學到什麼又好像什麼都沒學到,感覺不夠紮實,很多主題都是點到為止,但因為這是入門的課程所以也不是課程的問題,但是我希望可以有更多關於人工智慧的歷史內容。

另外是關於課程管理,期末專案的程式碼助教會一直修改專案使用的公開程式碼,甚至會影響已經繳交的程式結果,原本打得贏的 AI 變成打不贏。誇張的是整個專案大約有一個月的時間,助教在截止的兩天前修改程式碼,感覺沒有體諒到早交作業的同學。還有更誇張的,截止日期是在暑假第一週的週三,助教在當天修改程式碼並延後截止日期到週日,突然跟說要延長而且還會影響成績,如果有同學已經排好出國行程了怎麼辦?我覺得這些處理完全不及格,老師可以當掉助教嗎?

黎士瑋 系統軟體設計與實作特論

週一 14:20 ~ 17:20|系上選修|3 學分

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

上課方式:上半學期主要由老師用投影片上課,下半學期有期末專案提案、報論文和期末專案發表,每個禮拜都在下面聽同學的報告。

評分方式:兩份作業共 30%、報論文 15%、期末專案發表 15%、書面報告 30% 以及參與分數 10%。除了參與分數是個人分數,其他都是小組分數,我很慶幸有好隊友。第一次作業是做一個 Linux 模組,可以用來修改行程的名稱,第二次則是修改 Linux 核心讓使用者空間處理分頁錯誤。論文則是從老師提供的論文池中抽選,期末報告可以做任何和系統有關的主題,這學期的主題有 GPU 優化、正規驗證、檔案系統等。

心得:這堂課的內容主要是 Linux 核心簡介,上半學期老師會講解 Linux 核心主要元件的運作原理,包括啟動流程、排程器和檔案系統等,但是都沒有很深入,感覺沒有學到什麼。報論文的部分,因為我們對 Linux 都不太熟悉,老師就叫我們報告這些內容,不但報告的人不知道自己在報什麼,台下聽的同學也聽不懂,教學效果不佳。

比較好玩的是期末專案,我們這組做的是 Zram 動態演算法,可以根據系統的記憶體壓力自動切換壓縮演算法。在實作的過程中我們一直找不到動態演算法的優點,因為動態演算法的速度和壓縮品質都不是最快的,很難說服別人用我們的動態演算法,但是我們後來發現動態演算法居中的表現才是優點,可以有不錯的壓縮品質和壓縮速度。

期末專案

張傑帆 計算機網路實驗

週一 14:20 ~ 17:20|必修|2 學分

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

上課方式:沒有上課,學生要分組按照投影片做實驗,期末有專案提案與報告。

評分方式:三個實驗共 60%、期末報告 40%

心得:修這堂課前絕對要先找好隊友,而且一定要有算力充足可以開虛擬機的 x86 電腦。我們這組剛好沒有這樣的算力,所以只能用電腦教室的電腦,偏偏電腦教室的電腦記憶體不足又不能拔主機的以太網路線,導致原本三小時能做完的實驗需要做超過六小時,令人感到挫折又浪費時間。另外是組員人數過多,六個人一組不容易分配工作,一定會遇到有人沒事做的狀況。

李宏毅 機器學習

週一 14:20 ~ 17:20|系上選修|4 學分

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

上課方式:老師用投影片上課,課堂錄影會上傳到 YouTube,看李宏毅老師的 YouTube 頻道就知道老師怎麼上課的。

評分方式:每份作業 10% 共 10 份作業,每份作業都會分三個標準線,分別對應到 6 分、8 分和 10 分,通常取得 10 分都非常容易。有些作業是程式,不需要會寫 Python,有些則是看論文,詳細的題型可以看李宏毅老師的課程網站。

心得:什麼叫做把修課當作追新番?這堂課就是這樣,每個禮拜的課程沒有很強的關聯性,這週把課上完、作業做完就結束並進到下一集了,也沒有考試逼學生複習。作業也都很簡單,都是簡單接觸上課說過的內容。上完這學期的課之後,我覺得我對 LLM 的運作原理更了解了,尤其是因為老師講的內容都是最新的研究和產品,所以學到的知識可以在最新的 LLM 上見到。

黎士瑋 專題研究

週一 14:20 ~ 17:20|必修|2 學分

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

上課方式:老師在期初給我一個主題研究,之後每週老師根據我的研究週報給回饋,然後指引下一週可以研究哪些方面。

心得:修了這堂課之後可以學到如何將一個未知的研究主題拆解成小主題循序漸進地研究。這堂課是我花較多時間的一門課,不像傳統的課程按照課堂內容完成作業即可,這堂課需要自己想下一步該怎麼做,以及遇到困難時該如何解決,此時有位能引導我的老師就顯得很重要了,藉由老師的每週引導讓我學習該如何做研究。

我的研究紀錄放在 HackMD 上。