他教會了一個學生如何自學,這裡是他總結的編程學習方法……

2021-02-14 麻瓜編程
今天推薦一篇影響我很深的文章,是一位老師手把手教一位企業家,幫助他從零基礎到獨立完成項目的過程。不謀而合的是,在我們的課程中,同樣有基於項目的學習、老師的輔導,我們的最終目標,也是希望學生能掌握自學的能力。

過去的一年中,許多計算機專業的教授和教育專家都寫了關於 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

相關焦點

  • 0基礎如何自學軟體編程開發
    0基礎如何自學軟體編程開發?學習軟體編程首先需要選擇一門程式語言,如C或JAVA語言,作為基礎程式語言學習,掌握語言的邏輯,學習語法,其實編程實質上就是思路的運用,編程思路有了再想學習其他的程式語言就會變得順風順水。軟體編程開發,對於現在的學生來講到底有多重要呢?
  • 零基礎程式設計師自學編程的6種方法
    下面小編就介紹一些自學編程的小方法,希望能對你有幫助:首先我們要明確自己的學習目標,不管我我們學習什麼樣的知識,都要有一個明確的目標,我們需要朝著目標前進,才能少走彎路,從而在學習中得到提升。另外閱讀代碼也可以幫助你解決問題,了解最佳做法,這裡的閱讀代碼是指書籍,博客文章,開原始碼等等。編程教學視頻可以讓你迅速掌握編程語法等等,但通常比較生動、淺顯,不成系統。而書本是比較系統,深入,但是枯燥,所以最好的方法是書和視頻結合。
  • 零基礎程式設計師如何自學編程?用這6種方法就夠了!
    在自學編程的過程中,一部分程式設計師遇到冰冷的英語字母,枯燥的編程教程,果斷選擇了放棄。但其實自學編程不是那麼難,只要是理工科生、邏輯思維還行的小夥伴,編程入門完全可以。下面w3cschool給程式設計師小夥伴們分享自學編程的6種方法,這些方法足夠幫助你入門、進階:0、書本+視頻也許是最好的編程學習方式對於初學者來說,可以採用視頻+書籍的方式進行學習。這兩種方式形成互補關係。
  • 學生如何在大學學習程式語言
    攻讀計算機科學或自學程序設計大學學位的大多數學生通常會感到困難,而有些人則認為它很有創造力和樂趣。如果您還想學習編程,這裡是在大學學習程式語言的指南。學習編程的簡便方法編程是當今越來越多的學生採用的最先進和最有價值的技能之一。
  • 黑馬程式設計師教你自學編程的最優方法
    說起來自學編程的話,很多人走了很多彎路。只有學過來之後才知道什麼是最高效的方法。下面黑馬程式設計師就以十多年的教學經驗總結給大家自學編程的最好的方法。1.選擇目標首先就是編程環境的搭建,很多人自學第一步就卡在這裡了。但是先不用著急去配置環境,在這之前我們要做的是選定方向。大的方向就是:前端、後端、移動開發、雲計算、數據處理、智能軟體、物聯網等等。有關這些方向的程式語言就很多種。要先來選定一個方向,再從方向選擇一個語言。
  • 自學編程,閱讀成為他最好的老師
    毛澤強說,對於高中時期的他來說,前者枯燥、深奧,後者是他能夠看懂且能應用於生活的知識。這些書籍都是他的啟蒙教師,在他心中萌發了嫩芽。大學之外仍需自學,開啟編程之路隨著高考的落幕,毛澤強毫不猶疑地選報了機電一體化職業。大學完備的圖書館開啟了他的編程之路。「說起編程,入門是最難的。」
  • 自家小學生C++編程學習半年總結
    時下「兒童編程」是繼「機器人」熱之後的又一大教育熱點。我今天不談小學生有沒有學編程的必要性,也不談應該如何學習編程。這是因為——我也不懂我今天只寫寫我家是如何學的。當我發現他能夠坐在那裡3、4個小時進行編程設計的時候,我感覺我可以開展下一步計劃了。於是去年下半年的時候我開始給孩子物色NOIP學習的老師、機構。
  • 學習編程,要不要去IT培訓機構?自學和去培訓班哪種方法更合適?
    導讀:學習編程,要不要去IT培訓機構?自學和去培訓班哪種方法更合適?隨著網際網路和IT行業的不斷興起,現在越來越多的人開始學習編程。不過,說到學習這個問題,一般來說,大家會有三種途徑:自學、學校學習、課外班學習。現在網絡上隨處可見網課教程,相比起IT教育培訓機構,這種學習方法看起來更加靈活,對時間的要求比較低,而且就算是大家半途而廢也不會給自己造成經濟上的損失。不過,在我看來大家學習就是為了學有所成,自學雖然成本比較低,但是對於人的自律性和自覺性要求比較高。
  • 程式設計師自學編程必備的6大方法,看視頻和看書學編程有什麼區別?
    在自學編程的過程中,一部分程式設計師遇到冰冷的英語字母,枯燥的編程教程,果斷選擇了放棄。但其實自學編程不是那麼難,只要是理工科生、邏輯思維還行的小夥伴,編程入門完全可以。下面w3cschool給程式設計師小夥伴們分享自學編程的6種方法,這些方法足夠幫助你入門、進階:0、書本+視頻也許是最好的編程學習方式對於初學者來說,可以採用視頻+書籍的方式進行學習。這兩種方式形成互補關係。
  • 大學四年總結:大學的計算機專業學生怎麼學習?千萬別重蹈覆轍
    現在到大學基本上都是上了十幾年學,不說是學習老手,也是應試老手了,十幾年的學只是教會了我們怎麼考試,但是沒有教會我們怎麼學習!但是大學越上越不會考試了,更不會學習了,特別是怎麼自學,在大學四年,慢慢就發現現在學的不是學習,而是怎麼學習,在這個技術快速更新的專業,學會學習,才是立命之本。
  • 計算機的學生如何系統的學習編程?找對學習「套路」很重要
    對於任何內容和技能的學習,都是一種方法存在的,這種方法我們往往稱之為「套路」。當我們接觸和學習一些新的東西時,用我們人類最簡單的一個原始技能可以完成,這個技能稱之為模仿。也就是我們所說的比著葫蘆畫瓢。這個時候,體現在個體上面,就會因為統籌能力,總結分類能力等的不同,產生出參差不齊的效果,也就是最終的個人綜合職業技能的差異了。如何解決這個問題呢?其實很簡單,在面對複雜綜合技能的時候,只需要能夠幫助個體梳理清楚學習的順序,先學什麼,後學什麼,按照一定的先後順序各個擊破,就完全可以讓個體達到較高水平的能力。
  • 學習程式語言,自學還是培訓?
    學習程式語言,不管你是培訓還是自學這都不是關鍵,最關鍵在「編程」這兩個字,說白了就是實踐,親自動手在計算機上把代碼寫出來,調試通過。我是非計算機科班畢業,從事軟體編程工作已經八年有餘,一路過來都是自學,而且不論是大一自學C語言通過計算機二級考試,還是為了賺廣告費自學Android Java開發,以及工作需求學了C#,到後來長期做的C++,都始終遵循一個學習原則「學寫結合」,且寫的時間要遠大於學。
  • 學習計算機程式語言最好的方法是什麼?
    ;再就是那幾個大牛級別的,學一門語言就要鼓搗幾個編譯器;通過這些不同的學習方式和不同大神的回答我們可以看出每個人都有著自己不同的學習方式和學習方法,對於那些在某一個程式語言中已經是大神般的存在來說可以自己鼓搗編譯器去學習新的程式語言,那麼對於廣大的讀者而言很多人都是零基礎,那麼零基礎有哪些好的學習方式方法呢?
  • 為啥自學工業機器人編程很難找到工作?
    通過自學順利找到機器人行業相關的工作可謂鳳毛麟角。下面,談談自學工業機器人編程為啥那麼難,筆者根據十幾年的機器人編程經驗,總結了以下幾點原因。一、沒有學習大綱,亂學一通,最後沒有繼續學下去的勇氣。而且這裡學一點那裡丟一點,沒有辦法把實操和編程結合,等於紙上談兵,到了工廠維修工業機器人,依舊是濫竽充數,難以解決機器人故障問題。三、很難一直堅持到底學,耐不住寂寞,編程的學習細緻,比較燒腦。
  • 自學編程和計算機科班出身差在哪?
    自學編程的程式設計師,似乎都處於鄙視鏈的底端,而計算機專業的畢業生,似乎天然存在著一種優越感。 有的人就會說了,科班生在學校會學習計算機底層邏輯,算法等等,而自學的很多沒有接觸這方面知識。 那到底自學編程和科班程式設計師差距會很大嗎?今天,小千幫你分析一下。
  • 我是如何用10天自學編程,改變一生
    最近有不少人,來問我,想學編程,但是又不知怎麼開始。所以,我想把我8年前影響我一生的10天自學編程的經歷,毫無保留的分享出來。如果看到這標題,會讓你覺得,讀完一篇文章就能快速的掌握編程技術的話,這可能會讓你失望,這裡甚至沒有一行代碼。霖哥想分享的,是霖哥最初自學編程的經歷和心法。1.決定
  • 非專業自學編程的人,如何找第一份開發工作?
    那麼在自學編程、轉行找工作的過程中,有哪些值得注意的問題和可以借鑑的經驗?之前我在知乎上有過一個相關的回答,今天在這裡給大家分享一下:非計算機專業,畢業兩三年之後才開始自學編程的人,都是怎麼找到第一份編程工作的?招聘要求中有很多學歷,專業和n年工作經驗的要求,感覺會很難的樣子。從零基礎自學到獲得第一份編程工作又需要大概多久?
  • 程式設計師必讀經典長文:用十年時間自學編程
    你將沒有時間和一個有經驗的程式設計師一起工作,並理解在 C++環境中編程會是什麼樣子。簡而言之,你將沒有時間去學習多少東西。所以這本書只能說是膚淺的熟悉,而不是深刻的理解。但這種情況下,你不是在學習如何編程,而是在學習如何完成這項任務。在 24 小時內:不幸的是,這根本不夠,正如下面所說的那樣。
  • 千裡之行始於足下,我的 10 年自學編程之路
    還有多種變化,例如「學習」替換「自學」,「天」替換「小時」。結論:要麼大家都特別匆忙地在學習編程,要麼編程在某種程度上令人難以置信地比其他任何東西都更容易學習。Felleisen等人在他們《How to Design Programs》這本書中對這種趨勢表示了贊同——「寫出不好的程序很容易。傻瓜也可以在21天時間內學習編程。即使他們毫無基礎。」
  • 谷歌空間推薦:如何自學編程,有哪些實用輔助學習軟體?
    他們發現全世界1萬名相關學生裡面,接近三分之二都在自學編程。IT業發達的美國,更是有五分之四的學生靠自學掌握技術。出現這種情況並不值得奇怪。計算機領域,學校教授的知識雖然經典,但這個行業變化飛快、類似Go、kotlin這種企業需要的新技術、學校經常沒法跟上。學習程序開發、提升技能水平,「自學」是必經之路。