前言
某天,上小學二年級的兒子突然對我說: “爸爸,我想學編程。”其實更早時候我就在網上看到過有關兒童學習編程的一篇文章,其中提到了幾個軟件,都是充滿游戲風格,著重設計與規劃,以完成特定任務為目的的模式。這些軟件并沒有涉及指令或語句的概念,所傳授和培養的是一種更廣義的“編程”(也許翻譯為“規劃”或“設計”更合適)思維和能力。文章指出幾歲孩子就可以通過這些軟件學習編程。
兒子還在上幼兒園時就在手機上玩過LightBot游戲。當時給他玩的是初級版本,但已經有循環、函數調用等功能,比起網上那篇文章所介紹的軟件,更像計算機編程。LightBot游戲中的小機器人能夠按照玩家編寫的指令序列執行動作,對玩家的編程成果給予直接且明確的反饋,因此即使我沒有給兒子講過任何編程概念,他也完全能夠在游戲軟件中學習、理解和掌握那些編程元素,通過不斷嘗試來修正自己的程序,完成游戲中的所有關卡任務。可見,一個吸引人的有趣平臺加上直觀的反饋,完全能夠讓孩子在玩中學習編程,而且是學習相對抽象的計算機指令的編程。
我在清華大學計算機系取得本科、碩士和博士學位,在計算機系教程序設計課程,而且負責程序設計競賽,自然早想過什么時候讓孩子學編程、學什么程序設計語言、怎么學這類問題。雖然還沒有明確的答案和計劃,但可以肯定的是——小學階段就可以學編程,因為很多編程的概念并不高深。更小年齡的孩子雖然也可以學一些編程,但受認知能力所限,學不了太多,不得不淺嘗輒止。而對于小學生,特別是小學中高年級學生來說,完全能夠在相當長的一段時間內有計劃地學習一定量的內容,而且所學內容足以用來進行豐富的創作或解決一些實際問題。同時,正因為學習者是小學生,往往教與學雙方都更關注基礎和必要的編程元素,不易受細枝末節的干擾而偏離“大道”。
我相信和追求“快樂學習”,希望學習路徑方向正確,不走彎路。我認為C/C++語言、Java語言用作學習編程的入門語言并不理想,因為初學者難以用所學的內容編寫出有趣的程序,即使最簡單的“Hello world!”程序也會留給初學者一大堆問題,而且這些問題的答案不是初學者適合去了解的。如果未來想在程序設計方面往更專業一些的方向發展,我認為不宜在學習C/C++語言、Java語言之前就接觸Python語言。我曾考慮過讓兒子學習Logo語言,我初中時就學過它,有一定了解,但Logo語言除了畫簡單圖形外好像也沒有其他直觀有趣的功能。“你想學編程,很好呀!但是你具體想學些什么呢?”我問兒子。
“我想學Scratch。”兒子毫不猶豫地回答。我聽說過Scratch,但沒有專門了解過。兒子想學Scratch,是因為學校高年級學生在風采展示的活動中展示了一些用Scratch編寫的程序,引起了他的興趣。我告訴兒子: “沒問題。爸爸可以幫你了解一下,看看怎么來學。”
零基礎學Scratch編程前言我從MIT的Scratch網站上下載了Scratch 2離線編輯器,從軟件自帶的教程開始了解。教程由若干很小的編程任務組成,各個任務大體上按照從最簡單到略復雜的順序排列。我一步一步照著做,完成前幾個小任務就已經熟悉了Scratch的常用積木語句。我認為這些小的編程任務非常適合用來進行Scratch入門教學,對兒子來說,只需要幫他克服語言上的障礙——將英文翻譯成中文。很自然地,我將教程內容展開并翻譯做成PowerPoint幻燈片,同時把自己實踐時所想的一些問題,也總結并在幻燈片中提出來,鼓勵兒子通過動手嘗試來找到答案。一些我認為基礎和重要的程序設計概念和思想,在編程任務涉及時,及時在幻燈片中提出來。
我將筆記本電腦與家里的電視機連接,教兒子用雙屏模式來學習,一個屏幕播放PPT幻燈片,另一個屏幕進行Scratch編程操作。PPT幻燈片的動畫控制與頁面切換,既避免了書本內容的一覽無余,又能形成一種有控制的交流,還能讓孩子自己來主導學習的進度。兒子對Scratch的學習就這樣開始了,基本上是一種自學的模式,當他實踐遇到困難時才找我幫忙解決。
兒子學Scratch學得很快樂。教學實驗室的同事知道后,向我要了幻燈片給自己兒子學。他兒子也學得很快樂,而且會主動與老爸討論“什么是變量”之類的問題。同事建議:可以開個班,讓系里老師們的孩子一起來學Scratch。清華大學計算機系教職工孩子們的第一期編程學習班就這樣開始了,每周五晚上一次課,持續大半個秋季學期。在學習內容上,除了更新最初的PPT幻燈片以外,我認真地規劃了各次課的內容,一是考慮新知識循序漸進地分布在各次課程中,二是考慮后面的課程內容能夠起到復習鞏固前面課程內容的作用。課程內容前期主要來自于Scratch教程,后期來自于自己的設計安排。教學方式同樣采取雙屏自學模式,孩子們利用機房的計算機播放PPT幻燈片,同時在自帶的筆記本電腦上進行Scratch編程操作。這個編程學習班的助教隊伍超級豪華,因為孩子們的家長,即清華大學計算機系的老師們,可以陪著孩子一起參加這個編程學習班輔導自己孩子,因此這個編程學習班也是一個親子活動班。系里老師們都沒有用過Scratch,對這種編程語言也很感興趣,有時兩位大牌教授會丟下孩子,相互討論眼前的Scratch編程任務。這并不奇怪,我在學習了解Scratch的過程中,同樣很快就喜歡上了它。每次課程中,我會在機房走動,了解各個孩子的自學進展,解答他們的問題,幫他們排除一些困難,不過更多時候是引導他們自己來排查問題解決困難。一些共性的問題,我會總結并在下一次課程時講解。這樣的編程學習班得到了孩子和家長們廣泛的好評,有兩次我出差無法上課,還有家長主動代課,并且提前與我討論并準備PPT幻燈片。同樣的課程內容,后來又開了一期編程學習班,為了達到更好的教學效果,還專門為每次課程設計了課后練習。本書的第一部分就來自于這一期編程學習班的內容。
在第一期編程學習班孩子與家長們的要求下,我開設了后續的Scratch編程學習班。在這后續的“提高組”(第一期相應稱為“入門組”)編程學習班上,我主要讓孩子們體驗編程與數學的關系,了解計算機解決問題的方式方法,普及一些基礎而重要的程序設計算法思想,為進一步深入學習程序設計甚至是信息學競賽打基礎。提高組編程學習班仍然采用PPT幻燈片自學的方式,教學內容形成了本書的第二部分。
在組織孩子們學習Scratch編程的過程中,我看到了孩子們的學習能力和創新能力,多次從心底為他們的優異表現喝彩。這兩種能力也是我采用這種教學模式所希望激發和培養的能力,相信對孩子們的一生都有裨益。言歸正傳,該系統地介紹一下本書的內容了。本書共20章,分為三個部分。第1章~第10章為第一部分“基礎技能”,主要介紹Scratch中角色、造型等基礎概念,由淺入深地引入各類積木語句的實踐應用;第11章~第16章為第二部分“思維訓練”,從繪制圖形入手,強化數學思維,介紹遞歸、遞推、枚舉、篩法、二分法等算法思想;第17章~第20章為第三部分“應用實踐”,是Scratch編程實踐的綜合與提高。
本書的前兩個部分分別來源于前文提到的“入門組”和“提高組”編程學習班的課程內容,沒有任何編程經驗的孩子也能夠輕松地從第1章開始學習。在寫作本書過程中,官網的Scratch 2離線編輯器改版升級為Scratch 3桌面編輯器,在界面上有較大改動,在功能上也有變化,經過考慮將章節內容都更新為與新版編輯器一致。第三部分的內容來源于孩子們學習Scratch過程中實際編寫的游戲項目,以及我本人特別想用Scratch實現的功能(我實在太喜歡Scratch這一編程語言了)。與PPT幻燈片相比,書本缺少了逐步呈現的控制,但可以用更詳細的文字進行解釋說明,算是各有優劣。此外,在寫作過程中,產生了一些新的想法和更深入的思考,也融入到本書的內容中。如何學習本書呢?不建議小學低年級甚至更小的孩子學習本書。雖然他們也能夠完成前幾章的學習,但后續的章節對他們來說挑戰太大,而學得太少的話,意味著掌握的工具少,實踐與創新的空間小,得到的鍛煉與相應收獲少,樂趣也少。另外,因學習內容太難導致半途而廢并不是好的體驗,沒必要給孩子留下編程很難學的印象。
建議孩子自學。家長可以給一些基礎的幫助,例如,安裝Scratch桌面編輯器,教孩子基本的計算機操作,例如登入系統、運行程序、輸入漢字等,但學習Scratch編程還是讓孩子按自己的節奏來。自學能力是個人不斷成長的必備能力,培養鍛煉孩子的自學能力,是本書的重要目的之一。
學習編程的方法與學習語文、數學、英語都不一樣。編程是一種思維與實踐緊密結合的創造性活動。書上的內容都理解了,并不意味著就會編程。我敬愛的導師吳文虎教授給學生們上課時,就多次強調: “編程不是學會的,是練會的。”本書建議的自學方法是: 逐段地閱讀理解→實踐探索→思考總結→實踐應用。
閱讀本書時,身邊應該有一臺已經打開的計算機。書中講到了什么操作,讀者就應該同步地在計算機上進行相應的操作;書中提出一個問題,讀者就應該暫停住,先思考自己的想法和答案,再往下閱讀;書中提出要自己嘗試,讀者就應該自覺地想辦法去探索和嘗試;書中有時只提出問題,并不給出答案,但讀者真正實踐了就會得到正確的答案。我希望給予孩子探索與收獲的學習樂趣。
本書并沒有采用講解展示語句功能的方式介紹Scratch語言,而是從要完成的任務、要實現的功能或效果出發,即從需求出發引入可用的語句,把語句、編程語言視為解決問題的工具。與編程語言相比,分析問題→設計方案→規劃程序→具體實現→修正調優這種以程序設計為手段解決問題改變世界的方法,才是更重要的。這種方法,以及在方法運用的過程中涉及的思想和技術,與具體編程語言無關,才是學習編程所真正要學的東西。我相信,這樣的編程學習才能夠更好地培養孩子解決問題的能力,才能更好地支持孩子將心中的創意展示出來,將創新的想法具象化,敢想敢干,能想能干。
本書剛開始的幾章內容簡單,學起來較快,后續章節會不斷用到前面已學的內容,越來越復雜,對思維能力和動手能力的要求也越來越高,學習進度自然會慢下來。而且,隨著綜合的編程能力提升,孩子會想要實現自己設計的動畫和游戲,這是應該鼓勵的事情。家長最好能夠給孩子一些命題編程任務,即給出一個主題,讓孩子想辦法編程來表現,例如,讓孩子實現一個堆雪人的場景或游戲。這些書本外的編程活動,是孩子學習編程最好的練習,比每章后面的練習題好百倍。能夠多做這些自由的編程練習的話,完全不必著急學后續章節。畢竟學完一本書并不是真正的目的,打下堅實基礎,熟能生巧,讓孩子將來學得更好才是目的。另外,本書第二部分、第三部分靠后的章節難度很大,對初中生來說也是不小的挑戰,因此建議孩子按自己舒適的進度去學習,花兩年、三年甚至更長時間也可以。
編程學習遇到的最大困難可能就是查錯調試了。初學者可能犯任何錯誤,而且自己完全找不出問題來。雖然編程調試有利于培養孩子的耐心和細致,但最好能夠有懂程序設計的人提供“保底”的幫助,避免孩子長時間無法解決問題,學習熱情受到打擊。如果有同樣在學Scratch的小伙伴一起討論查錯,也是非常好的。本書附錄D專門介紹了一些調試的方法和技巧,但對初學者的幫助有限。有條件的家長,可以考慮和孩子一起來學Scratch,這樣與孩子有共同的語言,一起學習、一起討論、一起成長,也是珍貴和難得的體驗。飲水思源,感謝促使本書成文的所有人!首先感謝以吳文虎教授為首的師尊前輩,本書一脈相承了他們關于程序設計教學的理念。感謝教學實驗室和系里的同事們對編程學習班的支持,感謝孩子們、家長們對編程學習班的學習方式和學習內容的肯定。感謝系里的喻文健老師,本書中基礎彈球游戲的若干項擴展來自他的創意。特別感謝金山西山居的唐一鳴先生,本書第20章來源于特邀他給提高組編程學習班帶來的一次課程。當然,也要感謝兒子促成我進入了Scratch的奇妙世界。孩子是我們未來的希望,愿本書的小讀者們永保學習的愿望與樂趣!
鄔曉鈞2020年5月新冠肺炎疫情期間于清華園