University of Bristol - MSc Computer Science 課程內容分享(上)
此篇內容將會介紹系上的生存規則、以及第一學期( 9–12月)的課程。除了作為那三個月的學習紀錄外,也希望能幫助到對這個系所感興趣的學弟妹們。
英國的研究所學制大多為一年,共有三個學期,一學期大約三個月。通常開學一個半月就會遇到期中考,加上以自我學習為導向的風氣,還蠻考驗學生短時間內對於知識的掌握及應用能力的。
▍生存規則
在英國是 50 分為及格,若畢業時總均分為 50 分那畢業證書上會寫 Pass、60 分可以拿 Merit、70 分以上則是 Distinction(最佳成績)。但並不是每一科的 50 分都很容易,有些科目可以 pass 其實就很不錯了,如果對成績的期待還停留在台灣,那你可能會失望,因為對系上很多教授來說,70 幾分已經很頂了,至少這學期程式作業最高只看過 76 分。來看看教授訂的評分標準其實就不難理解這件事了:
上面寫了,C 的程式作業如果想拿 70 以上,要超出教授所預期的表現。但如果能要求自己好好優化程式、注意所有老師會挑惕的地方還是很有機會拿到的。
而關於 Computer Architecture 考試的標準,能考 70 以上代表掌握了超越教學範圍的知識。
想要畢業你必須…
每一門課都要拿 50 分 (pass) 以上,否則就要等到畢業前兩個月才能補考,補考沒過就拿不到碩士學位(只有證書)。原本規定只要一科被當就要延畢,但可能後來被當的人太多了,所以規則又有再微調。不過個人覺得畢業前那段時間有很多更重要的事要做(例如刷題、找工作),因此還是盡量讓自己避免要補考的狀況吧!
然後程式作業絕對 不能抄!不能抄!不能抄!作業都會被丟到比對系統,一旦被發現抄人與被抄的同學都以 0 分計算!這件事一開始院長就會嚴正提出,所以記得也要保護好自己的作業,不論圖片、文字、信件等形式都建議不要傳給其他人,僥倖的心態是危險的,但互相討論絕對是可以的。
接下來終於要進入 TB1 課程分享的部分囉!TB1 的課基本上都是在練基本功,但到了 TB2 就會以一些實際工具的應用為主(下一篇會介紹)。
▍Programming in C
這是一堂拿來磨你程式技能和培養良好 coding style 的課。
#上課方式
每週會有三堂 Lab(一堂2–3小時)、一堂 Q&A(1小時)、沒有 Lecture,意即「教授並不會授課,大家於 lab 實作如果有問題再於課堂上找教授或助教討論」。在 lab 開始前,要盡量自己先找時間把當週的教材看完,到了 lab 就是自行實作了。除了課程影片之外,每週也都會有 10–20 題的練習題可以寫,難度則隨著時間增加,但越到後面就越難做完全部的練習,因為可能連當週要交的算分作業都快來不及寫完了(? 不過還是建議大家盡量寫,我自己從中學到很多,題目內容其實不少都是換個描述的 leetcode 題,難度從 easy 到 medium 偏 hard 都有,但用 C 寫絕對是難上加難,所以練習題的部分也有人會直接換成 python 刷,不然光搞資料型別和 pointer 就可以累死自己(像是我)。
#課程心得
其實班上有不少人已經修過或學過 C 了,但因為這堂課的教授在測試和評分作業上頗為嚴格、看得也很細,還有好幾頁長的 coding style 要遵守,所以要通過他所有的 test cases 或拿到超過 70 分都不太容易。其中我覺得最棒的地方是每份作業教授都會給 general & individual feedback,可以從中思考自己在程式編寫和架構規劃上的不足,而在不同環境 compile 發生預期外的錯誤時,也能更認識 C 語言本身的特性和嚴謹度。另外,這堂課算是以 TDD (Test-driven development) 的方式在要求我們,因此學期結束後會發現自己對於 testing 和 edge cases 的思考更熟練更完整了。但演算法和資料結構會是混雜在課程和作業當中,因此不熟悉的人會需要自己補強,未來找工作肯定也會需要用到的。
#成績計算方式
5 份程式作業成績共佔 90%、限時 coding test 佔 10%。
#Lab Test 形式
一小時內要解完兩道題+測試,一題 50 分,有一點小問題都會以 0 分計算。這大概是我第一次被這樣考 coding,所幸題目算簡單,所以我大概半小時寫完上傳,旁邊的英國大神朋友更早就交完離開了,不過兩題都沒有寫出來的也不算少數。
#作業範例與評分
礙於篇幅關係,來個敘述簡短、大家公認最簡單的題目。這個教授不論是一般的練習題、還是作業,題目敘述和條件設定都超級長,常常都洋洋灑灑兩三面。你可以將它視為你要開發時會拿到的 spec,所以確保自己有完全理解內容和所有邏輯要求是很重要的,否則你會寫出一坨無法通過教授 testing script 的程式,而 test cases 沒過可能就會不及格。
我個人是習慣把題目讀個幾遍確定沒問題後,就把所有在設計程式架構時須考量的條件都先寫下來,然後在紙上大概規劃好程式骨架、再順一次邏輯覺得沒問題才開始進行 coding 的動作。雖然這並不代表事後就沒有需要修改的部分,但需要大幅改動的機率會低很多,畢竟寫到後面才發現一開始沒把底層結構規劃好、要大改整支程式實在是一件痛苦又沒效率的事。
作業評分指標:
1. 在 Linux 系統 Compile & execute 不能出現任何 warning 或 error。
2. 是否通過所有教授寫的 test cases 。
3. 程式是否符合 housing style(例如不能用 break、統一空格斷行)。
4. 每個 function 是否都在合理的長度內、是否能做 unit test。
5. 被 valgrind 和 sanitizer 檢查記憶體洩露必須沒問題。
6. 程式架構和可讀性。
7. testing 寫得夠不夠完整詳細。
8. makefile 寫得是否正確。
9. 是否出現 magic number(沒被 #define、突然出現在程式中的數字)。
然後建議大家交作業前先在 linux 系統把檔案全部都測過一次、不要只在自己的 macOS 上測試,不然最後不小心可能會功虧一簣QQ
(作業 feedback 部分截圖)
第一張是第一次作業的 feedback,可以看出來我第一次交作業時還不知道老師會測 valgrind、也不知道 valgrind 在 mac 上無法使用,所以跑起來都以為沒問題。而最後一次交作業,儘管程式複雜程度已經是當時的數倍,但那些問題已經都能處理得當了、也越來越懂得如何更好的拆解 function。回過頭來看教授給的評語真的讓我逼迫自己進步了不少,相信大家上完這學期的課,對 C 的掌握度應該就會蠻不錯了。(預告:期末可能要寫一個類似 matlab 語言的 parser + interpreter,簡單說就是用 C 去實作另一個語言,所以前面要好好練啊!)
▍Overview of Computer Architecture
如果之後想進 IC design house,這科絕對要學好!!再把 C 練好應該是蠻有機會的(應該)。不過這是一堂有三十幾個人考不及格的課(汗
#上課方式
每週會有一次 lab(3小時)、一堂線上 Q&A(1小時)。
雖然這門課非常的理論,但跟 C 一樣要自己在 lab 前就先看完教材,然後上課就直接開始研究 worksheet 插電路板,後期還要用 ModuleSim 畫 CPU 設計、寫 ARM assembly code,說真的短時間內要能做這些確實不太容易。
#課程內容
從 Boolean Algebra、Transistor logic and CMOS、Logic gate、Simple device (e.g. Ripple carry adder)、Memory(e.g. D-type flip flop, SRAM, DRAM)、CPU、ARM assembly、Compiler,到 Energy consumption。
細項太多,但基本上就是把下圖提到的東西大概都摸過一遍了:
#上課心得
這世界是由 0 和 1 組成的,以前只能懂表面上的意思,現在能完全理解了。這堂硬體課算是我們學校 CS 研特有的課,其他學校的對應系所是沒有的,由於每堂課的知識量都非常大,所以我們有些人會再自己看國內的 open course ware,像我自己是看友人推薦的清大【10020黃婷婷教授:計算機結構】,雖然範圍其實不太重疊、但可以幫你補到課程中沒提到的背景知識。我們一堂課大概等於國內4–5堂課的內容,短短幾天內要吸收完確實不容易,再加上全英文沒字幕可能會多一個門檻,不過我個人是覺得內容還挺有趣的,上完會有種任督二脈被打通的感覺。雖然讀這科又硬又沒寫程式的那種成就感,不過如果未來真的想進 IC 廠、或想當更優秀的工程師(?,這科肯定是得學好的,甚至還要額外自己補沒教到的部分喔!
#成績計算方式
100% 考試評分,分為期中考(40%)、期末考兩次考試(60%)。
#考試方式
考試會需要進入學校系統考,一次只會顯示一題,上方會有倒數計時器,時間一到就自動幫你送出,但最需要注意的是有「不能返回看前面的題目」的設定,因此只能依序作答、無法先做高分題(很機車)。詳細說明如下:
- 期中考:
滿分 30 分,皆為選擇題,都是 5 個選項,但一個選項可能就偷渡好幾個項目,基本上把單選題當多選題在出,只算出一個答案可能無法作答。個人覺得比較難的會是關於電晶體、邏輯閘、代數的題目,其他像是 data representation 的運算、state machine 設計或記憶體架構等難度都還可以。題目不少,一小時內很可能寫不完,雖然前面一題才一分,但分數都要盡量拿到,假如後面高分困難題不會寫至少還有點分數。 - 期末考:
滿分 60 分,有多選題、填充題、下拉式選單、交設計檔案、assembly code 檔案等,只差沒有申論題。考試範圍很大又很雜,但題目比期中友善很多,只是要拿高分還是不太容易,尤其我們這屆又多了 moduleSim 設計 CPU 這塊,個人覺得寫組合語言都比這簡單很多…。
#備考建議
雖然絕對不是最高分,不過期中和期末考都有 70+,可以給大家一點備考建議。先說心態方面,這科原本就是大魔王,這次的教授又是大刀,期中考真的很像 IC design 版的智力測驗,不只要融會貫通、還要能延伸應用於計算或邏輯推論,有及格就很值得為自己歡呼了,所以不要有太大的分數壓力!而且每年的教授都不太一樣、也不會給範例或 past paper,沒人清楚難易度,所以心態上嚴謹一點、把考試想得難一點,當下才不會太慌。
實際準備的部分,真心建議讀這科一定要紮實的打好相關基礎、不要好高騖遠,很多東西多讀個二三遍就會發現不同的 insight,到後期還要常常丟假設性&整合性問題檢驗自己,才知道有沒有讀通。我發現考得不理想通常是因為不知道自己不懂什麼,單純看懂和真正掌握核心知識也還是有段距離的,個人會習慣先了解科目全貌、現在學的東西處於什麼位置,再精讀和複習各章內容,有不懂的就去找老師或同學討論。而已知要考計算的部分一定要多練習,要讓自己看到最難的題目都不害怕!然後不要放過細節,重點往往都在細節裡,不一定要看太多課外讀物,但一定要能掌握講義上的內容。最後,質疑自己的理解程度永遠都是必要的!
▍Introduction to Computer Science
這是唯一一堂可以交報告過關的課,課程目的是要讓你探索 CS 領域裡的各個專項、並且找到畢業論文的方向。
#上課內容
這堂課算是有趣、但相較另外兩堂確實有點廢。由於 CS 領域之廣,除了一般人最常接觸到的 web / app 之外,還有像是密碼學、資安、電腦視覺、物聯網、AI、大數據等等(族繁不及備載),為了讓我們有機會探索這些領域,每一週課前都會有不同的主題影片要看,上課還要做隨堂測驗。寫完測驗剩下的時間就是和組員討論團體報告的內容,也是一個很好與外國同學交流的時刻,後期很常會有客座教授來講課,但內容不算太重要,所以可當作調劑身心。
#成績計算方式
20% 隨堂考試,80% 團體報告。
#報告內容
2000 字、視覺化 PPT、20 分鐘 presentation。
我們這組是研究 Neuralink( Elon Musk 公司)的核心技術: Brain–Machine Interfaces (BMIs),其中的軟體應用其實不多,但還是有可以著墨的部分,其他技術串接的探討也很有趣,算是從中學到了一些新知。
▍後記
基於常常看到留學版有人問相關問題、可參考的資源又不多,所以希望這篇文章能幫助學弟妹評估這個 program 是否符合自己的預期或學習需求(雖然這只有第一學期的啦)。至於最常有人問的課程難度,可能因為 Bristol 是理工學校,我們系所是出了名的硬,中途陣亡率也蠻高的,剛開學兩個月就有近十人因學習狀況不佳而退/休學了,在重視自學精神和自主實作的課程風格下,對於底子不夠的人其實蠻不友善的(雖然收非本科)。而且 CS 不只是在寫程式、還要學習很多電腦底層的架構與運作,寫的東西大多也不是大家平常會接觸到的項目,困難程度與壓力跟自己買網課做網頁或小專案完全不同,也不能挑食只寫特定語言(來這一定要寫 C & Java),所以來之前要做好對應的身心準備喔!
我相信不管到哪間學校,只要想走這條路,自學能力和熱忱永遠是最重要的,學歷只是一張門票與加成、讓你有更紮實的知識基礎,並不是讀了 CS 就能治百病或變得超會寫扣,修行仍是在個人。不過之後還是可以分享有了這個學歷後在求職上的一些好處!再等等我嗚嗚~
最後的最後,我的第一學期總成績拿到 Distinction 啦!(撒花