Python, Git, GitHub-Flow:大一計概助教課

計概助教
這學期有幸擔當資工系大一計算機概論的助教,這是一個換算時薪大概150不到的苦差,大概每兩個禮拜花幾小時會出一次作業、幾小時改一次作業,加上期中期末考,相當扎實。
不過除了作業考試之外,這們課也給我一個有趣的機會 — — 教Python!
教什麼?
自從在高中當了一學期電算社的不專業講師以後,我已經很久沒有教Python了。隨著程式資歷的成長,對於寫程式這件事情的看法也跟高中時大不相同,對象也從懵懂無知的高中生,變成有點程式能力的資工系大一。如果只教Python語法,感覺有點太無聊了,我自己應該都會睡著。
所以,要教什麼呢?我掙扎了許久,最後還是決定:Linux、Python、Conda、coding style、Git、GitHub-Flow、frontend/backend、CI/CD … 我會的全部都教吧!
一堂課
一堂課,當然沒辦法教那麼多東西。實際上,我大概只帶完Python基礎跟Git基本操作,便在回答各種問題中結束了那堂課。
不過我還可以出一次作業!這才是我覺得好玩的地方XD
我覺得只有自己實作,才能會使用這些工具,所以我一開始不打算講解太多內容,而是藉由建立良好的環境、讓學生在實作中了解這些東西的重要。
由於時間有限,這次作業以熟悉Python+Git+GitHub-Flow為主要目標,其餘都只要照著指示做就好。
接下來讓我們一起看看這份作業的要求吧。
GitHub link: https://github.com/amjltc295/PythonHomework
PythonHomework
這份作業的主軸大概就是用GitHub-Flow繳交作業:
架設環境 -> 看懂code -> 完成八個基本的Python task -> 發PR -> TA review -> Merge -> Auto-grading
- 整個repo是一個frontend/backend架構:frontend用簡單的React寫,架在Netlify上;backend用Flask,架在Heroku上。
- Repo也包含簡單的CI/CD:PR會有自動測試,merge後就會deploy並批改成績,最後顯示在前端的leaderboard。
- 學生可以不用理解完整的架構,只要在
src/students/
建立自己的檔案就可以了。 - 問題只能用issue問!
- 用Windows有問題的話自己解決!
(其實我原本是想讓全班一起做一個project,每個人負責不同的部份,畢竟PR不是設計來教作業的,不過後來因為不好評分/怕同學做不出來,所以就打消這個念頭了。如果有誰有機會帶比較有經驗的學生,可以試試看XD)
Task 0: Environment Setup
這部份是要上課之前完成的環境設定。
- 要求使用Linux/MacOS,強迫熟悉使用command line。
- 辦GitHub帳號
- 用Conda管理環境/套件版本
- 使用Flake8做style/syntax檢查
- (Optional)Oh-my-zsh/Vim/ALE/YouCompleteMe/Ack/Oh-my-tmux…各種好用的坑。看到來問問題的同學有裝Oh-my-zsh心情就覺得舒暢許多XD
Python Task 1–8
這部份主要是讓學生練習讀document、熟悉Python語法與一些常見用法。我寫了八個註解詳細的function(task),並留下一些 # TODO tag,學生只要填空就可以了,總共加起來需要寫的code大概30行。
- Task 1: Basic Syntax and Flake8 Checker
- Task 2: Data Types: String, Integer, Float, List, Dictionary
- Task 3: Conditions
- Task 4: For and While Loop
- Task 5: I/O
- Task 6: Function
- Task 7: Class
- Task 8: Modules
Grading
- 完成PR流程(20%)
- 通過8個task,包含public/private data(60%)
- 通過Flake8 check (10%)
- Coding style & commit message (10%)
- (Bonus) Issue提問/回答/發現bug問題 (10%)
- (Bonus) 發PR修bug (30%)
遇到的問題
- Autograder不好寫,每個task需要的檢查不一樣,得寫不同種檢查方式,最後一題要在圖上寫學號還得review時人工檢查
- Heroku的App boot time有60秒的限制,HTTP request也有30秒的限制,隨著繳交的學生越來越多,Heroku就超過時間crash了,server開不起來。最後只能off-line自動批改,dump結果後上傳,有點失去CI/CD的價值。這部份我還沒想到要怎麼解決
- 要寫的code不多,抄襲不好抓,抓到也有點困擾
- Commits最後變得很多,而且有人不小心寫很髒的東西(如把Miniconda的安裝檔加到commit再移除),最後整個repo變得很大,pull要很久
- 評Coding style要一個一個review,還得把一個一個分數放在Netlify的環境變數裡面
- 沒寫什麼unit test QQ
總結
覺得做了一個很有趣的Project,應該記錄一下。前後花了不少時間Review/回答問題,也額外開了兩個晚上的TA hours,不過比改作業跟考卷有趣多了~
我一個大一都不認識,只能從有限的feedback評估這次作業的效果。不少人說有學到東西啦,只是不知道他們寫這個作業有多崩潰XD,我想應該是滿多同學有互相討論的,希望有成功把他們引入寫好程式的門(?
對這個Project有興趣的歡迎討論、或者發PR修bug XD