如何教新手程式設計
過去的一年中,許多計算機專業的教授和教育專家都寫了關於 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
相關文章
- 關於“新手教學”的新手教程(三):教學節奏設計
- 如何向新手程式設計師介紹程式設計?程式設計師
- 《通過遊戲程式設計實戰教新手學C++程式設計》學習筆記遊戲程式設計C++筆記
- 教機器學習程式設計機器學習程式設計
- 如何做少兒程式設計教學?程式設計
- UI設計新手看過來,UI教程教學UI
- 請教過濾選擇框設計程式設計如何寫程式設計
- 新手請教,遊戲入門程式 c遊戲
- 如何高效的向新手程式設計師們介紹程式語言?程式設計師
- 作為一個新手程式設計師該如何成長?程式設計師
- 好程式設計師Java培訓簡述Java新手如何學程式碼程式設計師Java
- PHP Web程式設計教與學PHPWeb程式設計
- 老婆讓我教她程式設計程式設計
- 程式設計師妻子自述:那些程式設計師教給我的程式設計師
- 程式設計師妻子自述: 那些程式設計師教給我的程式設計師
- 請教如何下手學習設計模式設計模式
- golang 新手教學群Golang
- 關於“新手教學”的新手教程(一):極少化教學文字
- 新手程式設計師程式設計必不可少的八大工具程式設計師
- 新手程式設計師必備10大技能程式設計師
- 新手程式設計入門先學什麼?程式設計
- 新手學程式設計,從哪裡開始?程式設計
- 請教對介面程式設計的含義!程式設計
- 遊戲新手如何搭建“關卡設計”知識框架?遊戲框架
- 新手如何學習網頁設計?自我建議網頁
- 程式設計老手的哪些特點,是值得新手程式設計師學習的?程式設計師
- 不要用物件導向程式設計分散新手程式設計師的注意力物件程式設計師
- 新手程式設計師該如何準備面試?【備戰春招/秋招系列】程式設計師面試
- 我給所有新手程式設計師的建議程式設計師
- 幫助你克服新手程式設計師最怕的事情程式設計師
- 每個新手程式設計師必看的 SQL 指南程式設計師SQL
- 給新手程式設計師的幾點建議程式設計師
- 為何開始教中文女友學程式設計程式設計
- 小程式新手 教你如何入手
- 程式設計師:學校教的數學知識,程式設計根本用不到!程式設計師
- Scratch少兒程式設計加盟,少兒程式設計課程和教學檔案程式設計
- 6個新手程式設計師程式設計必不可少的工具,你用過幾個?程式設計師
- 盲人程式設計師是如何程式設計的?程式設計師