如何教新手程式設計

zhongqi發表於2012-12-07

過去的一年中,許多計算機專業的教授和教育專家都寫了關於 MOOC 如何擴大計算機教育服務的規模,使得成千上萬的學生都能享受到。而我想從另外一個角度,說一說我是如何在 9 個月的時間裡向 1 位學生教授計算機程式設計的。

2011 年 7 月到 2012 年 3 月之間,我給 Brian Goler 教授基本的程式設計知識;他是舊金山灣區一位有經驗的企業家,在市場、銷售和產品開發等方面都有廣泛的經驗。Brian 之前沒有程式設計經驗,但在幾個月的時間裡,他就做出了 SwearBuy,一個讓人們對喜愛的產品發表評論的免費 web 應用程式。更重要的是,Brian 獲得了自學的能力,能夠接下來自己搜尋、學習更高階的技術內容。我的主要貢獻,是指導他克服一些通常會打擊初學者的障礙。

背景

Brian 通過我的個人網站上知道了我,因為裡邊有幾篇電腦科學教育的文章。下面摘錄他在 2011 年 7 月給我發的第一封郵件裡的一段內容:

我們沒見過面,但我想試試看能否從您這兒得到些建議。

我在網上搜尋能幫我學習程式設計的導師的時候發現了你的網站。更準確地說,我在上一門計算機課程,我希望找一個導師,每週能當面輔導我 1-2 次,每次 1 小時左右。

我正在上 MIT 的 OCW 6.00 課程。儘管 OCW 和其他的線上課程都很棒,但我覺得如果有個人可以請教、還能檢查我的作業,並給與反饋,那我的進度應該會更快些,對概念的理解也會更深入。

您在 MIT 和 Stanford 都待過,應該認識一些合適的人吧?或者,可以給我推薦下去哪兒找合適的人?當然,我會向輔導的人付錢的。

因為那會兒我剛好不忙,於是我就親自輔導 Brian。我們第一次的一小時會面是在他家,第二次是在附近的一家咖啡館。之後我去參加某個學術會議,於是第三次的輔導我們就通過 Skype 線上視訊電話進行。我們用了 Skype 的螢幕共享功能,這樣在聊天的時候我就能同時看到他的電腦螢幕。這種形式非常適合輔導,於是我們決定接下來的所有輔導都通過 Skype 進行。我只當面輔導過 Brian 兩次,而我們的 Skype 視訊通話時長高達 50 小時(大約 40 次)。

在 Skype 上的線上輔導進行的如此順暢,我們都感到很驚喜。這甚至比我們當面聊天更有效,那樣還會受困於嘈雜的咖啡廳和狹小的膝上型電腦螢幕。藉助 Skype 的螢幕共享功能,我能在我自己的公寓裡邊舒服地看到 Brian 的電腦螢幕,並且與他實時互動。如果我需要畫些草圖來說明,那我只需要共享螢幕,然後用繪圖板來畫就行了。(Salman Khan 就是用類似的辦法教他的表弟,於是就有了現在知名的可汗學院教育視訊。)

基於專案的學習

Brian 的目標是學習基本的程式設計技巧,提高自己;而不是要獲得一份程式設計師的工作,或是成為一名研究人員。在見我之前,Brian 已經通過上 MIT 開放課程中的 電腦科學與程式設計基礎,自學了幾周 Python 程式設計。開始的幾次輔導中,我們通過課程講義和作業,複習了基本的程式設計概念。

然而,我很快就意識到,僅僅通過學院式的課程資料來學習,無法讓 Brian 足夠投入,尤其考慮到他已經大學畢業 20 年這個現實。他看起來並不滿足於只學習一些計算機學科的術語、做一些針對大學生的數學相關的小練習。

因此,我決定教 Brian 成為一個實用主義的業餘程式設計師,而不是一個飽學的電腦科學專家。我鼓勵他想出一個給自己或朋友用、自己也願意做的軟體。相應地,我將指導他完成這個軟體專案。這個想法如此簡單,但效果卻異常好。

Brian 提出了一些 idea,並最終決定實現其中的一個,也就是後來的 SwearBuy。在接下來的 9 個月裡,他每週都投入十幾個小時的時間編寫 SwearBuy,常常幹到深夜。我們每週都有一到兩次的 Skype 輔導,每次持續一到兩個小時。輔導中的大部分時間,我都用來回答 Brian 的問題,幫他除錯 bug,有時還跟他結對程式設計,一起寫點兒程式碼。我每次講的時間都只有幾分鐘。除了能讓他的注意力高度集中外,這種基於問答的形式對我來說也很不錯,因為我幾乎不必花時間提前做什麼準備。

基於專案的學習十分高效,因為 Brian十分重視他自己的第一個專案。他的學習被需求牽著走,而不是一些預先設定好的的學術課程。因為他對 Swearbuy 的熱情非常高,所以常常會想出很多新功能的點子。為了實現這些功能,他必然要學習一些新的程式設計技術。因此,我的角色就變成了:

  • 評估他想實現的功能的可行性,如果需要的話,指導他完成一個簡單版本;

  • 挑選最適合他需要的程式設計工具、風格以及技巧;

  • 給他找到合適的自學資料(比如程式碼示例、部落格、線上教程、書等);

  • 在他努力理解和應用自學的內容時,回答他的疑問。

程式設計實現一個任務,常常有幾十種甚至上百種方式;這種選擇的多樣性常常讓初學者手足無措。因為選擇太多,他們反而不知從何入手。我要做的,主要就是幫他將選擇範圍縮小到一個可控的範疇,適合他各個階段的學習;然後讓他去自學,遇到問題時我再解答他的疑問。

我十多年的程式設計和教授程式設計的經驗,使得我在每個需要選擇的點上,都能將選擇範圍縮小到我認為最適合 Brian學習的程度。比如,我選擇讓他用最基本的程式語言(比如 Python,JavaScript,SQL)功能來“從頭”搭建 SwearBuy,而不是在已有的一些複雜的 web 應用開發框架上開始。儘管為此 Brian 不得不寫更多的程式碼來“從頭”(這個詞兒可能有些不準確,因為不可能完全從零開始)開始實現期望的功能,但他通過這個過程,能夠深入到內部原理,深入理解各個部分是如何組合到一起的。

Brian 的專案是我們 Skype 會話的絕好的基礎,因為我能將自己要教授的新概念融入到他想實現的新功能中去。哪怕更多的課後練習所發揮的作用,也比不上一個屬於學生自己的的應用程式。

在掙扎中學習

在我們每次 1-2 小時的 Skype 輔導開始前,Brian 通常會程式設計 10-15 個小時,所以他總是用大量急切的問題要問,有很多新寫的程式碼需要我幫他來除錯和優化。如果我只是給他講課,而不基於任何背景,那他不可能消化的這麼徹底,很可能只是點點頭,然後說“嗯,好吧,好像是這麼回事兒……不錯,然後呢?”相反,因為他在每次輔導之前,都一直在和具體的程式碼相關的問題糾纏——甚至經常因此而受挫和沮喪——所以每當我給他解釋清楚了什麼之前看起來好像不可逾越的問題時,他的反應往往是“哇哦!現在我算是徹底明白了!”。他的喜悅和釋然每次都那麼明顯。我覺得對消化知識來說,沒有比這更好的方式了:先花上幾個小時努力解決問題,不斷積累心中煩躁的情緒,然後再接受導師的指導。

為了減少 Brian 的痛苦,我幫他搭建了開發環境,做了一些乏味的工作,因為這些東西不會直接促進他的學習。我希望他把精力花費在程式設計和搭建 SwearBuy 上,而不要浪費時間做些不相關的事情,比如搭建伺服器或是版本控制系統。(當然了,如果他的目標是成為一個系統管理員,那我儘可以讓他去糾結那些細節。)

有很多時髦的書、線上教程以及直播節目,都宣稱能讓你在 7 天或是 3 周時間裡學會程式設計(或者別的什麼技能)。很明顯,你不可能在幾周裡就掌握一門新技能,而且我覺得也沒幾個人真的相信。這些“快速獲取技能”計劃的真正問題在於,他們忽視了可持續性。這些課程就好像減肥食譜一樣,可能會讓你馬上減掉 10 磅體重,但卻無法讓你保持住,除非你真正地養成了好的習慣。類似的,除非你不斷努力很多年,否則也無法精通程式設計;為了激勵自己不斷努力,你必須是在做自己有熱情的事情。努力掙扎可不是什麼有趣的事兒,如果沒有適當的激勵,太容易早早地放棄了。

當 Brian 意識到他不再需要我的輔導時,我知道我成功了。儘管他也承認要成為一名技藝精湛的程式設計師,自己還需要努力好幾年,但他已經知道在現有的水平下,如何努力才能到達那個高度。在過去的九個月裡,他學到了足夠多的東西,能夠支援他繼續自學下去。我給了他足夠的方法和智慧來繼續自學,而不是填鴨式地應付一個學生,我感到很自豪。

最後的思考

在我們的輔導結束之後,Brian 反映說,儘管他受益於這種“通過做來學習”的方法,但他仍然認為,將基於專案的學習和傳統的計算機課程學習結合起來,有很大的價值。在構建 SwearBuy 的過程中,他經常通過 Google、閱讀技術部落格、從 StackOverflow 上拷貝程式碼等方式,來臨時解決自己的問題。結果,他發現自己經常得出並非最優的方案,而且用的東西自己都無法完全理解。Brian 的一些巨大的進步,來自於他從專案中抽身出來,轉而去看書或聽課時學到的新的概念,然後想著如何將其用到 SwearBuy 中。

自從我們 2012 年 3 月結束最後一次的輔導以來,我 6 個月沒有收到 Brian 的訊息了。最近他給我發的電子郵件中提到,他剛剛寫了個 Python 指令碼,幫自己給個人股票投資建立模型:“對這個指令碼我感到很自豪,因為這是我做的第一個實用的自用工具。我過去一直都在評估股票投資專案,一直想模擬各種場景;一開始我用的是 Excel,但後來終於發現 Python 才是做這件事兒的不二之選。

我很喜歡這封郵件,因為它展示了程式設計技能的作用,讓原本無聊且困難的任務能夠輕鬆完成。我希望每個學習程式設計的人都能有邁過那道坎兒的時刻,從那以後就不僅是為學校或公司的活兒而程式設計,而更多的是為自己而程式設計。

我還想說一遍那句老話,積極性意味著一切。Brian 的積極性來自自己的專案,所以實際上他是自學的。我要做的僅僅是定期指導一下他,幫他最有效地進步,讓他的努力變為有效的學習。

我的這些經驗如何才能推廣到教授大批的自我激勵的程度遠不及 Brian 的學生的教學實踐中去?我摸索出的這些技巧如何能不再侷限於一對一的輔導這種形式?我也不知道。我只知道,如果你能讓學生產生真正的積極性,幫他們移除學習中一些不必要的障礙,而且在適當的時候拉他們一把,那麼實際上他們就完全可以自學。

原文:Teaching Programming To A Highly Motivated Beginner

作者:Philip Guo

譯者:zhongqi

相關文章