我在阿拉斯加州東南部的一所小高中教書,每年我都教授程式設計課的導論(介紹)。最近我學會了如何用IPython Notebook,並且它已經徹底改變了我教課的方式。對於CS(電腦科學)教育而言,美國的K-12教育體系中還有很多地方需要提升,因此分享我們的故事和資源對於我們提供給學生的(幫助)會有長遠的影響。
我的第一堂程式設計課
如同很多教授程式設計課簡介的人一樣,我沒有一個正式的CS(電腦科學)學位。當我還是個孩子的時候,我開始學習程式設計,並且之後攻讀到了物理學位。我一直把程式設計當做樂趣(為了樂趣而程式設計),然而,最近我對待程式設計的態度開始認真了起來。由於我已經對自己的程式設計更加認真了,我編開始尋找一些方法將其帶入到我的課(堂)上來。
我第一次教授程式設計導論的時候,我覺得每天的課都有創新(創造了每天的課),並且想出一些練習和挑戰讓學生們去嘗試。學生們喜歡這種課程,因為他們大部分時間都在試著將他們正學到的知識運用到他們能夠解決的問題上來。從第一堂課開始,他們就像真正的程式設計師一樣。作為一個程式設計教師來說,這門課對我來說是一個不錯的開始,但這種方式並沒有持續多久。只是因為創造一堂能夠跟上我那些更有才能的學生的步伐的課程實在太難了。由於沒有一個正式的CS背景,這一路上我也有很多知識需要自己先弄清楚。
第二次(授課)時,我試著基於一個既定的課程之上來講我的課。我試圖用Zed Shaw的《笨辦法學Python》來指導我的課程,因為我曾在所有我參加過的技術社群中聽說過這個教程有著持續的好處。然而這個方法並沒有奏效,因為學生們只是沒有跟上LPTHW(《笨辦法學Python》)中講的方法。我指導LPTHW要求學生自己編寫程式,但對於那些剛開始接觸程式設計的新手來說,即使有個老師在教室中指導,他們也還是有太多的東西需要弄清楚。我的(班裡)有個學生真正喜歡這個教程,但對於大多數學生來講,我的第二次課並沒有比第一次授課進步太多,相反,在他們前進的道路上少了許多樂趣。這並不是對Zed的教程的批判,只能說明我沒有用他的課程抓住我學生對於程式設計的興趣。基於剛學習的知識,我的學生們似乎對於非常具體的習題做出更好的反應,循序漸進的轉向練習和挑戰能夠使他們運用自己的想法,結合剛學到的知識(來解決問題)。
今年的課程
這次的課程,我想要重新回到自己創造講課方式的方法上,並且要比之前有更高的效率。同時我也需要一份備用計劃來應對那些超過我教學進度的學生。去年的每天我都在PyCon聽到IPython Notebook,所以我決定去看一看究竟。一旦我習慣了它,我簡直不敢相信如果用IPython Notebook來做教學工具的話會有多麼高的效率。
如果你對於IPython Notebook不熟悉的話,它基本上可以讓你在同一頁面上混合Python 程式碼和文字,並且可以讓你的程式碼塊作為單獨的程式來執行。IPython Notebook 是為科學計算程式設計而開發的,你可以通過一系列較小的程式來解決比較大的問題,同時能對程式的進展做註釋。這種講註釋單獨註釋到文字檔案的方法比寫一系列單獨的程式設計檔案的工作效率高的多。
作為一個老師來說,我發現這是個建立課程的完美的工具。關於一個題目我寫了一些註釋,之後寫了一個小程式來說明怎樣用程式碼實現這個題目。IPython Notebook讓這些課程變得容易教學,GitHub讓這notebooks能夠非常方便的儲存在可公開訪問的地方。之後IPython Notebook的瀏覽者可以使其以一種便於閱讀的方式開啟。
我的基本工作流程:
我建立一個筆記來記錄我要遵循的課程大綱。
對於大綱中的每個主題,我建立一個本地的筆記,其中包括了本次課程中這個主題中的所有內容。
當我有時間的適合,我在家建立課程並且使內容變得生動。
在我教學的過程中,我總是使我的電腦連著投影儀,當我在課堂上搞清楚一些問題時,我在課後會盡可能及時的把變動放到GitHub上去。
如果我在課上完成了一個新的主題,我在其中一個筆記中直接寫上我的例子,如果這些東西筆記清楚易懂,我會把它們直接傳到GitHub上去。如果當堂的工作需要再梳理一下,我會本地提交,當我有機會更仔細的看這些筆記時,我會在課後提交。
如果有個學生開始超越我(的進度),我可以引導他們學習更系統的東西,如Udacity或者Coursera。這些東西是需要學生更獨立自主的學習才可能取得成功的。
目前為止的成果
到目前為止,我和學生對於這個工作流程都很滿意,我們都和我第一年教程式設計課時一樣有樂趣,但我們也覆蓋了更多的知識,並且學的更快。在這個工作流程中我能感受到一些好處:
- 學生可以在自己電腦上開啟所有課程的材料的副本,並且在課堂外也可以用(訪問)。
- 我們可以根據整個課堂的意願增加或者修改練習題和挑戰。
- 學生們能夠逐步接觸一些當他們程式設計更加熟練後要用到工具,如git, GitHub, IPython等等。
接下來做什麼?
我真的想找到一種方式使程式設計在全學年都融入到我們學校的文化中去,以下是我對於怎樣推進這一目標的一些想法:
- 本學期中繼續發揚notebooks。這個涉及到將一些曾經發布過的舊部落格轉為IPython notebooks的工作。
- 制定一系列學生能夠在任何課上做的核心工作,讓他們的用自己的程式設計能力在其他課程上幫助他們。舉個例子,用你對Python字典的理解來追蹤你正在學習的每堂課的關鍵詞。
- 建立一個體系,使那些對程式設計有一定的理解,到達一定技術水平的學生開始用我們的課程資料教授新學員,這將減輕我一直要教授導論課程的壓力,並且可以讓我教一些更加高階的程式設計課。
- 清理筆記,使學生獨立思考而不是為課堂筆記而學習。眼下,學生們如果要自主學習讀這些筆記還是不夠的,這可以被改善,雖然它們可能不該變得太冗長。
協作
如果你想和這些notebooks玩,檢視GitHub上的這些專案,我會很樂意與您合作構建這些資源,因此如果你想做出貢獻就聯絡我們。可以通過郵件聯絡我,gmail上的ehmatthes,或者在twitter上@ehmatthes。如果你在GitHub上很活躍,你也可以在Issue#10下面留下反饋。