兒童從零學編程,及2款APP & Scratch

有人說,未來的世界每個人都要會編程,就像每個現代人都會寫字說話一樣。也有人說,大眾是愚昧的,會編程的人群不可能有很大比例。我也不知道未來什麼樣,但是我知道另外兩件事情。一是,程序設計的邏輯與日常和工作中的推理沒有區別,遵循和表達流程,在程序設計和現實世界中也是一樣的。會編程序的人,更容易相信邏輯,而不是單純的願望。二是,曾經,人們認為普羅大眾都能說會寫--估且不論說寫的水平如何--是不可能的。中國掃除文盲也並沒有多久,只是大家沉浸在現代化裡面一二十年就忘記了原本的樣子。多數人不識字因而不能讀寫家信,集市有專門的人才負責這項工作,這也不過是一百年前的事。如果你認為一百年很久遠,那麼,我的小學語文老師就講過,為自己的姨輩掃盲,在鍋台、牆壁、門窗上都貼上字,什麼東西上就貼什麼字,她因此得了標兵。這應該是發生在建國以後的事情。如今,幾乎沒有人不識字,儘管傳聞漢語有多麼難學。

劉慈欣先生說,未來的時候,不是撓手機就能活下來的時代。鄧小平同志說,計算機要從娃娃抓起。我覺得都挺有道理。

0. 我的入門

我學習編程入門是在高中的時候,1992年左右,使用的機是蘋果II、長城6502,單色顯示器,一個或兩個軟碟機,高密的是好的,一般是低密的。

教材是 蘋果-Ⅱ BASIC程序設計 / 張世英編,北京 : 北京師範大學出版社, 1985,500多頁的小冊子。

當時最喜歡的有兩項。一個是玩現成的遊戲,插進軟體,似乎要怎麼怎麼運行,然後有一堆綠色的方塊在屏幕上扭來動去,有時嘟一聲。同學中的前輩告訴我,那是兩個武士在持劍格鬥。我完全看不出來,而且確實比魂斗羅之類的效果要差很多。另一個更喜歡一些,就是把書上的BASIC代碼錄入進去,然後修改,畫出不同的圖形,計算不同的結果。因為能看到更多可控的因素,所以編程比看不懂的遊戲更有意思吧。

1. 失敗的嘗試

二貓同學在大約五六歲的時候,我嘗試了兩次教她編程,不怎麼成功。

第一次的教材是《與孩子一起學編程》,作者[美] 桑德Warren Sande / Carter Sande,人民郵電出版社, 2010-11。

從第一章或第三章開始。最初的實驗是編個程序,能算出 1+2 這樣。為避免你誤會我的意思,以為是自動生成考卷之類的,具體地說,代碼就是 print 1+2這麼一行。如果想算 3+5,那就手動再改一下代碼。

對於二貓來講,體驗是神奇的。因為除了她,居然還有這麼個東西也能算加法,而且計算結果和她的一樣。所以,她一直希望,"再算一個幾加幾"。

然後我嘗試教她循環,這就是失敗的開始。在循環中,需要要循環變數,需要有對求和連加的抽象表達。我忘記了,連 print 這樣一個單詞她以前都沒有見過。這些全都是新的信息,風暴一樣灌進來。她甚至還沒有學過連加和乘法。

後來我們說,今天就到這裡吧。印象里,她沒有特彆強烈地要求繼續,相信已經有些挫敗感了。雖然說,挫敗感是只有一定程度投入才能產生的反應,但是我不敢繼續嘗試了。

另一次編程學習的嘗試,是在 ipad mini 里裝了個 logo。logo又稱海龜做圖,基於極坐標或平面直角坐標系,移動海龜游標,指揮它畫圖。我用 logo 給二貓畫了個直線,畫了個三角形,畫了個多邊形,逼近了圈,她試了試改其中的幾行,覺得不錯,挺神奇。正準備用極坐標畫個萬花規圖形,發現二貓開始禮貌地表達興趣。

萬花規作圖,需要極坐標方程,需要一堆代碼。更重要的,二貓告訴我,其實從畫三角形開始,一圈是360度,每個角應該多少度,甚至走多少步在平面直角坐標繫上的含義,這些都是全新的知識。直角坐標系的概念,直到最近2017年初她讀可怕的數學系列,才學到了,自覺用在了 scratch 中,極坐標可能仍然沒有概念呢。

後來二貓幾次主動提出希望再玩 python,我沒有想好怎麼教學,還是沒帶她玩。

如果沒有學過加減法,如果沒有學過角度,那麼 python 和 logo 就沒法開始。那麼,是不是沒有這些基礎,就任何程序也不能編呢?到底具備什麼樣的基礎才能開始學習編程和邏輯。

約十年前,李記者、典同學、我曾經討論過很多輪,需要具備什麼樣基礎或者特性的人,才能成長為優秀的程序員。其中,我提到過一個遊戲《不可思議的機器》,設計路線讓小老鼠躲開貓的追擊。有針、彈簧墊、氣球這樣的道具,它們在一定程序模擬的物理引擎上交互。由玩家觸發開始以後,道具一頓亂跳,最後貓失敗老鼠跑掉。這個遊戲有編程的基本思想,計劃、條件、隱含的循環。但是,這個遊戲並不需要任何數學基礎。所以,不需要數學基礎的編程,應該是可能的。

《不可思議的機器》並不適合兒童編程教學。一方面是因為難度偏好,另一方面離程序設計最終功利的目的太過遙遠,從遊戲里不太容易直接看出與編程思想的對應,我擔心這樣的技能向真實編程移植可能相當困難。

2. 點燈機器人 (Lightbot Hour"14, Lightbot Hour)

最初我在網上某篇文章里看到 lightbot 介紹,討論的就是兒童編程。這篇文章一時沒有找到,類似於[《編程機器人》:胸中有塊壘,大腦漲智慧 - 觸樂]。

lightbot看名字的暗示,程序員應該1小時左右通關吧。實際上,我的體會,比那還要難一些。

我和二貓是在 ipad mini 上玩的這個遊戲,剛剛注意到,還有 flash 版本可以在PC機上玩,在 bing 上搜索 點燈機器人,有不少。

玩家為一個機器人制定行動計劃,操作它在方塊場地行走,目的是把所有的燈都點亮。我玩的兩個版本都是8+6+6關。

2.1 其中第一部分8關,只使用基本操作,包括 左轉、右轉、前進、跳、點燈/滅燈。其中點燈和滅燈是同一個動作,如果把燈的狀態由滅/亮改為亮/滅。這符合演繹思想的基本路線,由幾個基本元素,經過幾個基本規則的組合,構造出更複雜的行動--行動的結果,正是意圖的目標。這是分解,考察如何把意圖分解為若干步驟。python 和 logo 的問題在於,涉及過多的基礎知識,因此入門所需要的元素也就很多。lightbot限制動作只有上述5個,是這個遊戲定義的,所以不需要基礎知識。從現實來的隱喻--機器人會走、會點燈,單純所以容易掌握。就轉向而言,只提供左轉、右轉,限制了機器人轉向的可能只有2種,而不會是360種,所以不需要使用 轉向(左|右) 這樣帶參函數或動賓 (動補?) 的複雜結構,可以枚舉為 左轉、右轉。

在這一部分中,玩家能夠掌握 1.順序執行的概念,2.在每個步驟中可以選用若干語句 (向前、左轉、右轉、跳、點燈/滅燈) ,3.這些語句只有在特定的上下文中才具有意義,比如在不是台階的地方不能跳,台階處不能向前,燈是開關量。

這些都是某些人在學習程序設計中遇到的障礙,並不是像某些一學就會的程序員認為的那樣是顯而易見的。由原本生活所帶來的各種刻板印象支配我們對新學習的知識的猜測路線,信息和手冊往往又並不充分,所以猜錯幾次非常正常。由於程序設計與現實的差異,不容商議地必須完全正確,不少人錯到不知道如何繼續,挫敗感很強。所以,設計 少量元素+簡單規則,推演出更豐富的結果,很適合用於了解熟悉構造性的思路。而且,又剛好不是像某些人認為的平面幾何那麼難 (初中卻學得不錯?),所以更佳。雖然我猜,lightbot 就等價於弱的平面幾何,在抽象代數的意義上上。這是良藥何需苦口的典型範例。

2.2 第二部分6關,需要使用子程序 (或稱過程?)。逼近或誘導玩家使用子程序的原因是,原來的主程序中,能夠放置行動卡片的槽位有限。如果用"笨"辦法,那麼步驟數量多於槽位,遊戲不能成功。比如向前走4步點4盞燈,按基本操作,就是 走1步、點燈、走1步、點燈、走1步、點燈、走1步、點燈,需要8個槽位;按子程序的辦法,可以是 主程序中為 P1、P1、P1、P1,4個槽位,P1中是走1步、點燈,2個槽位。遊戲在這一關里設定為,主程序只有4個槽位,按基本操作的8個步驟就過不了關。

在第二部分的開頭,有圖示和文字指導,表示P1可以像基本操作一樣作為卡片放在主程序中,並把P1展開表示是步驟的一部分。

在 lightbot 中,P1子程序入口和出口都不帶參數。我認為這是對一般編程的合理簡化,利於掌握。

2.3 第三部分6關,涉及遞歸,P1可以調用P1。在 lightbot,很令我意外的,沒有循環,只能使用遞歸完成迭代。典同學會說,這才是合理的思維方式吧。同樣由於槽位的限制,如果不使用遞歸,就不可能完成任務,所以誘導玩家掌握遞歸思想。

沒有遞歸跳出條件,當所有燈都點亮以後,遊戲就通過此關。由於不需要遞歸的跳出條件,也就沒有變數和循環變數存在的必要。

遊戲通關以後可以申請電子證書,看起來花樣繁複,很值得一顯擺的樣子。可以指定把你的名字印在上面,不過似乎不支持漢字。

3. Robot School

單位黨支部組織生活,會後的路上同事們和蹭車的我學術交流。朱老師告訴我還有個遊戲也很好,Robot School,也是在 ipad mini 上玩的。

樂高風格,科幻風格的流程圖 (或文字) 展示代碼。機器人在玩家的計划下,穿過場地去找電池充電的故事。場景三維的,有透視效果,轉起來的時候我有點暈,但是沒吐。一共9頁,共45關,我玩了大半宿,可能4個小時左右,挺有意思的。

遊戲有這麼幾個特色,因此適合初學者上手學習編程。

3.1 受機器人能量 (步數)限制,類似於 lightbot 的槽位,逼迫或誘導你不得不選擇新學的手段完成任務。

在軟體工程科目中,同學們通常都會有疑問,我用更基本的方法明明能做的題目,為什麼非得逼我用你的某種方法。教師強迫使用,會讓同學們形成對威權的服從和避免思考帶來的傷害,也不會信服新方法就多麼好,尤其在問題規模並不大的時候。所以,適合的限制,使得使用舊方法一定不成,就不是人為的,而是來自自然力的限制,讓人舒服多了。

遊戲里通常有這樣的設計,比如《帝國時代》的任務里,明明你的那個兵種這麼這麼就能贏,但是他剛好那天把刀放在了家裡,只能徒手格鬥。這種限制,如果你能接受作為遊戲一部分,而不是故意難為你,那麼還是挺有意思的。如果你不按受,那麼感覺就類似於足球場上22個人搶那麼唯一的一個球,多發幾個不就行了嘛。

3.2 循序漸近地引入知識。Robot School 比 lightbot 的關數更多,涉及的技術手段也更豐富。在這種情況下,逐步而不是一次性引入所有操作,就非常必要。

基本動作涉及:行走 (距離),轉彎 (方向),開門,開盒子。這些動作幫助掌握順序執行和多種語句 (服從目的或遵循上下文環境)的選擇。

邏輯控制包括:循環 (次數),在循環中行走、轉彎、開門,多重循環 (在循環中循環)。在循環中插入動作,不像 lightbot 中那樣槽位明顯,而是可以擴張的隱含的語句塊。

循環的引入也是個特色,通過 碰撞檢測道具 (每步檢測),機器人撿起那個道具以後,肩膀後面會多個像火箭炮一樣的裝備。到最後可以裝上3門之多,各有用途。每步檢測,表達的是循環,檢測磁撞,相當於 if,連接在一起就是 while (cond) { do something; }. 這讓學習者對於 while...do 中到底發生了什麼,有了可視的認識,更容易想像。

大炮筒一樣的道具,除了碰撞檢測,還有顏色檢測。最初只是根據顏色作判斷 (引入判斷分支,然後引入判斷嵌套),後來顏色可以臨時存儲在變數中,等到以後再提取出來使用。

大炮筒道具,還有障礙距離檢測,檢測的結果也可以存入變數中。這樣,又引入了多個變數以及變數命名的必要性 (不涉及變數命名的易讀易記 convention,僅用於區別三兩個變數)。

進一步,變數需要做簡單的算術運算 ( des1 -3 這樣的),從而引入了表達式,然後把表達式置入檢測條件。

最後階段,引入了一個障礙物,可以搬起來、帶著移動、放下。這個障礙物的引用,看起來是前面所有知道的綜合應用。在多個障礙物的關卡中,受能量的限制,玩家需要把 (1) 多次搬移磚塊, (2) 用相同而有略有差異的語句表達, (3) 然後放入循環中,把差異作為循環中的變數。這要求在流程中發現模式,並用抽象 (abstract/common) 的方式表達出來。

最後一關,看起來陰森恐怖,是個迷宮。迷宮並不會變,但是能量不足以供你根據迷宮的樣子寫出計劃,所以,需要寫出能走出迷宮的演算法。二貓說,這個我從一本書上看到過,如果走不出去了,就沿著一側的牆走。我聽說這叫做走迷宮左手或右手法則,用 Robot School 流程圖的面板寫出來不短,所以完成以後頗有成就感。

4. Scratch (不是移動端APP)

以上這些遊戲,二貓有的在我幫助三兩次後完成,有的還在進行中,興緻盎然。Scratch現在自學加我的幫助,玩得也很高興,並且是這裡面最喜歡的。

有不止一位同事朋友向我推薦過Scratch,大名鼎鼎。最初我自己嘗試的時候體驗並不好,因為網速。後來下載了PC版本,用起來倒是流暢了,如果不分享作品到官方站點,可以容忍。提醒你時不時更新一下。我曾經遇到過一個非常費解的變數和循環的問題,感覺應該可以那麼用,雖然教程和手冊都沒有提到。請教了三兩位同事朋友,等答覆期間發現,是我的 Scratch PC版版本低,升級了以後毛病全無。

有些同事朋友的孩子直接使用了英文版,或者英語才是他們的母語,教程和工具都用英文,更方便一些。就二貓而言,做了幾個實驗以後,仍然更喜歡中文版,雖然她也認同中文版的翻譯錯誤,比如 "mouse down" 翻譯為滑鼠下移,而其含義是滑鼠左鍵單擊。

二貓第一次接觸Scratch時小學一二年級,做的是小貓跳舞。沒有看教程或視頻,帶著她做了一遍,過程中講解需要的幾個部件,然後她自己修改和重做。作品是一個角色換幾個動作 (循環10次) ,換動作的時候放一小段聲音,看起來像跳舞的樣子。二貓認為角色動作生硬,更像是體操,但是覺得挺好玩。

最近讓她讀了一本中文教材,然後她自己照做和修改了一些實驗。教材是 Scratch兒童編程樂園,凌秋虹 編著,江蘇科學技術出版社。連同網上還有些中文的手冊和教程,我自己都沒有讀過,沒法推薦。英文的,據說 youtube 上視頻教很多,官方站點上也有,但是,都是看不到的。英文手冊可能也不錯,不過,如果你是程序員打算教孩子的話,我猜不用太看。容易學會,困難的是教會孩子。

二貓看了教材以後,自己選擇了實驗的路線。我認為設計合理,略難,但是可以承受,沒有干預。每個實驗她要求我幫助一至兩次,然後自己就能完成。

(1) 小貓和小猴踢球,重複幾次,每次說一句話 (文字+氣泡) ,最後一下球踢飛了。我剛開始看踢來踢去,心想,這什麼破玩意,也禮貌地表示挺好。最後球踢飛那下,我哈哈大笑。不錯。

不得不說,經常有些實驗設計得都太無聊,指向性太明確,大大地降低了學習者的興趣。有點起承轉合,明顯感覺好多了。

(2) 打地鼠。場景上挖幾個洞,地鼠一會兒出來一會消失。你操作一個大紅槌子,砸,砸到就加分,還"吱"一聲。

這個實驗作為第2個,對於二貓來講,我覺得有些難。實驗操作並不像有些人想的,照抄一遍就一定能成功。整個實驗如果有20個元素參與,加上這些元素間的順序和關係,一處錯誤,程序就跑不起來。找起bug來,對能力的要求遠不是抄實驗能解決的,而是必須理解實驗中的每個步驟應有什麼效果。對照教材仔細核對這種事,是不行的。

不過,這個實驗的難度仍在可承受範圍內。我簡單提示兩次,二貓迅速找到bug,解決了。實驗完成後,她要求玩一會兒。這是合理的訴求,我經常做完程序玩上幾遍,再玩上幾遍。既找bug,也滿足成就感。好像實體的玩具,做好以後,一定要多把玩幾次,才過了癮,雖說做的過程比玩要有意思得多。

(3) F1賽車,車自動向前走,鍵盤控制方向,躲避障礙物。有了打地鼠作為基礎,這個實驗照書獨立完成,毫無難度,不需要我。

(4) 飛機躲隕石,聲音控制,聲音大就向上,聲音小就向下。二貓解讀代碼 (而不是根據實驗效果) 指出,因為有"-3",所以如果沒有聲音,飛機也會往下掉。

聲音控制很難,二貓又把代碼改為用鍵盤控制,還發現了書中代碼的冗餘部分,刪除了。

(5) 畫筆,如圖所示,二貓的程序,二貓用程序畫的。

(6) 迷宮,正在做,玩家操作角色走迷宮,共10關。二貓設計了10個按鈕,不用的時候隱藏起來,我啟發後準備修訂為用變數,表示第幾關、過關顏色、死亡顏色、場景,每過一關,表示第幾關那個變數+1。

Scratch除了兩個機器人APP以外的特色以外,可以支持功能更強更複雜的定製腳本 (比如10關迷宮) ,也可以完成非常簡單而有趣遊戲 (小貓跳舞)。所以適合零基礎入門並可以學習到相當難度。

Scratch使用角色 (及角色的動作、背景) 表徵變數的狀態,支持循環 (和條件偵測) 、判斷、變數、鏈表、表達式等。二貓問我,"能用Scratch做個Scratch么?"我猜能,是通用圖靈機吧。

5. 其他

小車循跡、走迷宮比賽、機器人滅火 (蠟燭)等也有不少,我接觸不多,只聽說過有 飛思卡爾、CoSpace、樂高、Scratch、FIRST、FRC。還看到過小學門口有玩魔方的"星門"。

6. 基礎理論

春節期間,應二貓要求,給她講過二進位入門。就是那個著名的遊戲和變形,15

個姓氏寫在4個卡片上,卡片的權重分別是8、4、2、1。玩家說出姓氏在哪幾個

卡片中出現,但不說具體姓氏是什麼,game master累加卡片權重可得數字1~15,

查表就知道是哪個姓氏。

下圖是我給二貓講的圖示。

下圖是二貓自己發揮的新創遊戲。

這也許應該算是數學吧,跟上述編程的邏輯和推演,還有很遠的距離。

下圖是洋蔥表皮細胞,鋼筆水染色,放大500倍 (帶USB的顯微鏡) ,可以看到細

胞核。與題目無關,就是好玩,供你參考。

————————————————————

博客會手工同步到以下地址:

[知乎專欄]

[楊貴福 - 重劍無鋒,大巧不工]

[楊貴福 的專欄 - 博客頻道 - CSDN.NET]

[giftdotyoung.blogspot.com]
推薦閱讀:

如何評價《可怕的是,我們的孩子一直在通過動漫認識世界》一文?
中國小孩在國外長大如何培養中文能力?
幾乎每天都會為女兒不肯做作業,全家人都弄的大發脾氣,很不愉快,感覺生活很沒意思,該怎麼辦?

TAG:编程 | 自学编程 | 儿童教育 |