1.前言

相信每個人在大學研究所階段,都會遇到 N 個助教,有些就像天使般幫助你,有些則像從不存在過一樣。所以我下定決心,如果我當助教我要當非常稱職的那種,因為我超痛恨尸位素餐的助教,雖然說照學校給那塞牙縫都不夠的薪水,確實不該太認真做事(?)

這篇基本上就是講我在陽明交大平行程式當了兩學期助教做了啥,雖然我也當了四個學期數值軟體開發的助教,以及混分一學期編譯器助教(只負責改考卷),但平行程式是我花最多心思投入的一門課,相信這些經驗對想認真當助教的同學會有啟發,其他平行程式課的老師助教也可以參考一下我的一些經驗。

Cover Picture

2.如何準備一門課

2.1 學習階段

助教來源有很多種,老師從系上找來的、自己實驗室的、修課過的學生等等,一般來說由於資工所或資工系的課大多由碩士生來擔任,而碩士生可能原本不是念資工系,或是本來不是來自這間學校,又或是直升但就剛好沒修過這門課,所以在這情況下要怎樣去承擔助教的任務呢?

當然如果你已經預期之後會接助教的話,先去修過該堂課是最直接的方式,很多實驗室是碩一修課,碩二接助教,但也有情況是碩一進實驗室就被拉去當助教了。以我當助教的所有經驗來說,平行程式、數值軟體開發、編譯器通通都沒修過,所以這邊介紹我自己的另一種方式。

另一種方式就是自學,身為資工系/所學生怎麼可以不會自學呢?以我們實驗室—陽明交大系統軟體實驗室來說,我在接平行程式助教時,所有該會的東西都是這過程中自學來的,而我們的另一門課編譯器,實驗室負責的同儕當初也都是靠自學把基礎知識學起來。

怎麼自學感覺不是本文重點,不過我快速帶過。以「平行程式」來說,你可以直接搜尋國外一流大學,例如 MIT、CMU、Stanford 之類的,看看他們有沒有公開的課程 (OCW),抑或是看看 MOOC 平台上有沒有類似的課程,基本上都可以查到不少。一般來說,資工系開的課程幾乎可以保證其他學校一定也有會比較好找,研究所的課可能依老師專長背景會有所特製,但應該都可以找到性質類似的。

我自己進交大念碩士前沒有平行程式相關修課經驗,但近來後在探索碩士題目的過程中,其實一直接觸到高效能計算相關領域,而平行程式其實就是其中的子領域,所以對平行程式還是比較有概念的,畢竟讀論文的過程中常常就會接觸到一堆相關知識。

不過要能當一門課的助教,還是要有比較扎實的知識,讀論文學到的東西其實有點東拼西湊,所以我後來有去看 CMU 的線上課程,此外我也買了不少相關書籍,我在平行程式課程網頁裡面的參考資料列的資源,基本上我都翻過讀過,然後大概就把平行程式這門課需要懂的東西了解得差不多,所以如果你跟我一樣把這些資源通通都看過後,你應該也不需要修這門課了。

2.2 課程網站

一堂課通常會需要有精美的課程網站,當你知道你要當資工系助教之後,你可能是接下傳承下來的網頁繼續維護,抑或著需要自己重新架設。架設網站應該不需要我說明太多吧,畢竟都念到資工所了,一般就是架在 Github Page 或自己實驗室 Server。平行程式是架在 Github Page 上,因為課程 Repo 也是使用 Github 管理。

PP-s21 Github

Github Repo 本身是 Private,但有開啟 Github Page,Github Action 會直接編譯生出網頁檔案。

PP-s21 Webpage

專案保持 Private 原因是不想讓學生看到大量修改的紀錄,此外作業答案和助教的腳本也都放在裡面,但有些大學像是史丹佛,就是把整個專案公開,這感覺就是見仁見智吧。

2.3 架設工作站

一些課程性質,你可能會需要建立工作站環境給同學,因為不是每個同學都有辦法取得需要的硬體資源,以平行程式來說,學生會需要有多台 CPU + GPU 的環境,不會預期學生能自己取得,所以只好由我們來提供。

方法有兩種,一種是由系上或實驗室提供大量機器進行架設,另一種則是使用 AWS、GCP 等雲端平台,拿學校資源好處是彈性比較大、連線速度快、不需要付錢,而使用 AWS 這類的話,雖然有提供教育版本,但限制會比較多、連去海外速度也會比較慢、也有可能需要負擔一些費用。

交大平行程式我是自己用系上提供機器去架設整個工作站系統,架設工作站環境其實花了我不少時間,這邊簡單說明一下會需要幹嘛。假設你有很多台機器:

  • 建立 NIS 系統,會由其中一台 server $S0$ 當作主控,負責管理所有機器的帳號密碼,這樣就只需要設定帳密一次,所有機器通通可以用。主控叫做 NIS Server,其餘的叫做 NIS Client。詳細教學可以看這篇文章
  • 建立 NFS 系統,一樣透過 $S0$ 當作主控,建立一個大家共享的網路虛擬的儲存空間,當其他機器存取這個虛擬空間時,其實都是將檔案寫入到 $S0$ 上,因此可以保持所有機器中檔案同步。有了 NFS 就不會同學登入 $S1$ 存了資料,下次登入 $S2$ 發現裡面沒東西。教學可以看這篇
  • 批次建立所有學生帳號在 $S0$ (NIS Server),設定好檔案系統權限 (包含 NFS Server、每台機器個別檔案系統)。
  • 你可以使用 parallel-ssh 之類的工具,一次連線到所有機器,批次安裝所有軟體,包含 g++、clang++、OpenMP、OpenMPI、CUDA、OpenCL,這邊其實滿瑣碎的,每個軟體安裝時都有一堆坑,我就不一一介紹了,讓大家親自去踩坑(笑),提醒一下所有機器版本都要裝一模一樣比較不會出事。

可以發現其實弄個環境是滿麻煩的,但我後來發現學習平行程式的過程中,了解怎樣把環境弄出來也很重要,所以我其實鼓勵其他要設計平行程式的學校,可以考慮讓學生自己使用 AWS 去把整套環境弄出來,畢竟等學生真的有實際需求要用到平行程式的時候,他也是必須自己把整套系統搞定。

我覺得有好有壞吧,幫學生架好好處是可以讓學生專注在新技術上,缺點是學生完全不知道從零設定環境的過程。

2.4 教材與作業設計

有些老師會包辦教材和作業,但也有些都交給學生。一般來說教材比較可能還是老師自己弄,畢竟自己弄才知道怎樣教,但作業就比較大機率是給學生處理。像我們老師游逸平教授習慣就是教材是他自己的,但作業都交給助教設計,我實驗室同屆的所有人腦袋想不開,我把平行程式設計的作業全部換掉,我同儕也把編譯器的作業全部更新,而更新真的是超級繁重的工作。

上課教材我沒經驗,所以就不介紹了,等以後我有機會當教授再分享。

作業通常是要公布之前設計好就可以,當然如果在開課前全部設計好是最好的。因為我把平行程式的做有作業都換新,所以我其實過著被作業追殺的日子,每兩個禮拜要出一份新作業,通常第一個禮拜要改上次作業,第二禮拜要出新作業,如此循環,跟大學時期中考無限轟炸到期末的感覺一模一樣。

之所以把作業全部換新,是因為我覺得原本的作業難度不夠強,畢竟平行程式是研究所等級的課,原本比較像大學部的選修。但我怕很多人可能聽學長姊說以為很涼,所以期初還有特別寫勸退信,告訴學生這學期換我當助教,課程難度和質感絕對不一樣。(雖然最後期末成績,大家幾乎還是跟以前一樣高)

教材方面可以參考 2020 秋季班課程網頁,因為秋季班是碩士班的課我的作業難度是原始的,2021 春季班是在職專班,考量學生可能無法花大量時間寫作業,因此難度有調低。

作業有些是從 CMU、Stanford 那邊抄來的,有些是根據以前的作業改良的,有些則是我原創的。不論是哪種,我都要花大量時間去思考作業要怎樣設計,如何能夠真的讓同學練習到平行程式的精隨,同時我也花大量時間修改作業的模板或架構。

舉例來說,我覺得平行程式在系統優化方面十分重要,所以我要求同學都要用 HackMD 寫分析報告,並且設計比賽機制讓大家去競速。或是在 MPI 這個單元,我選擇先出一個教學型的作業,讓學生一步一步照著做感受不同 MPI 演算法的好處,接著才要他們使用 MPI 想辦法最大化加速矩陣運算。

我認為資工系的課能不能讓學生真的學會,最重要的往往是程式碼的實作,有時候上課沒聽懂,回去把作業做出來就會了解原來是這麼一回事,這也是我很看重作業設計的原因。我花了非常多心力在設計作業,我覺得幾乎是整門課最有價值的部分了。

2.5 作業批改

出作業本身是一件很快樂的事情,只要想著如何折磨學生就好(誤)

但改作業就不是這麼一回事了,改報告超級無敵花時間,改程式作業又會有一堆天兵同學交了一段意義不明的程式碼。

在設計作業的時候就要考慮到之後改作業的容易度,能用程式批量批改是最好的,為了減少學生出錯的機率,我們還提供學生測試腳本,在繳交作業前如果通過測試腳本,基本上可以相信交的檔案沒問題,不過還是有一堆天才交錯檔案,我的原則是不通融,學生有義務交正確檔案。

設計批改腳本就是一件非常麻煩的事情,要考慮各種出錯的情境,各種評分的細項,不過因為我是大助教,所以我可以指揮小助教去幫我搞定這些事情。XD

同時像是報告或是程式碼,我會認真看完並且給回饋,例如報告同學中哪裡寫得好或寫得差都會點評,甚至分享到臉書討論區給其他同學觀摩。在平行程式課我沒辦法一個一個看 Code,但在另一堂課數值軟體開發,因為學生比較少,我是會認真一個一個看 Code 給建議的。

2.6 其他

根據課程設計,你可能還要思考怎樣處理學生分組,如果學生要報告要怎樣安排。以平行程式來說,大家要分不同組,然後期中要交專案企劃書,期末要上台報告,那身為一個助教就要去把這些事情都處理好。

此外有些可能有校外教學,有演講邀約,有企業參訪,要去採購設備等等,這些大概就是見招拆招吧。

學生報告
(學生期末報告)

3. 與學生溝通渠道

一門好的課,助教協助學生的部分是少不了,還記得你還是學生時滿滿的問題嗎,徬徨的你是否急著找助教討論呢?

3.1 學校課程系統

通常學校會有自己的課程系統,裡面內建公告、作業、討論區等等,視情況採用,但我自己認為學校平台學生通常不太會打開,互動率會太低,所以我只用它來發公告、出作業、繳交作業。

3.2 臉書社團討論區

開一個臉書社團是根據我在台大修張智星資料結構與演算法,以及看成大 jserv 經營系統軟體系列討論區,覺得臉書的效果確實不錯。因為學生平常不看書,但都很會滑臉書,把一些公告、作業、補充資料放在臉書上觸及率都滿高的,此外臉書提供一個大家發問討論的地方,同學有問題可以在臉書上提出,別的同學如果會的話也可以幫忙回答,這樣的互相幫助可以讓學生彼此增長,此外也某種程度上紓解我每天要回答一堆問題的工作量。

Facebook Group

3.3 Email

Email 是我接受學生私下訊息的唯一方式。由於我有很多社群帳號,很多地方可以找到我,但我認為助教本身是一項工作,工作的事情就用 Email 聯絡,不然我跟臉書朋友聊天還會跳出回答同學問題訊息,會讓我覺得很焦慮。很多同學真的會鬼打牆,我學期初都會聲明,但仍不斷想私訊我。

4. 結論

我在本文中分享我在陽明交大擔任平行程式課程助教的經驗與心得,希望這些內容能幫助大家去當一個更好的助教。我覺得一堂課的好壞,老師與助教都功不可沒,可惜很多課程的助教往往沒有盡該有的義務。

但也不得不抱怨,照學校給我的卑微薪水,實際上大概只夠付我架設網站的薪水吧,我花大量心血出作業、回答同學、處理雜務,基本上都是因為我對教學本身帶有熱情,才能支撐我這麼用心地做完。

最後感謝游逸平老師放任我對平行程式這門課做各種嘗試,我得以依照我對教學的憧憬與要求去做設計修改,雖然過程中十分辛苦,但我也學習到很多,希望有朝一日能夠以教授的身分來設計一門課。