在我之前的日志《聊聊讓孩子學(xué)編程的那些事兒》中,我曾經(jīng)提到一個(gè)觀點(diǎn),就是以Scratch為代表的圖形化編程軟件不是學(xué)編程的必經(jīng)之路,如果有條件的話,最好能盡快進(jìn)入真正寫代碼(coding)的階段,我家Vita哥哥也是跳過了Scratch,直接開始用蘋果的Swift Playgrounds學(xué)coding了。后來有一些朋友問我類似的問題,包括一位做網(wǎng)絡(luò)工程師的朋友(網(wǎng)絡(luò)工程師不是程序員,但他也懂編程),所以我想還是詳細(xì)整理一下我的觀點(diǎn)。
先說說Scratch
Scratch(官方網(wǎng)站)是由MIT(麻省理工學(xué)院)開發(fā)的一套圖形化編程工具,它被看作是用于青少年編程教學(xué)的一個(gè)標(biāo)志性案例。Scratch基本上是長這樣的:
所以Scratch是個(gè)啥呢?它大體上包括一個(gè)角色編輯器,一個(gè)背景編輯器,還有一個(gè)腳本編輯器。其中腳本編輯器就是我們“編程”的地方,里面把各種命令一塊塊積木一樣排列起來,就形成了一個(gè)程序。
現(xiàn)在有很多兒童編程班都是用Scratch來上課,Scratch在美國以及其他國家也非常流行,我也用Scratch給別的孩子講過編程課,感覺也挺好玩的。Scratch主要有這樣一些優(yōu)點(diǎn):
再看看Swift Playgrounds
Swift Playgrounds是蘋果公司官方開發(fā)的一款學(xué)習(xí)編程的App(僅限iPad,不支持iPhone),目的是培養(yǎng)青少年開發(fā)者,當(dāng)然還有一個(gè)目的是推廣他們新推出的Swift編程語言。和Scratch不同,Swift是一種正經(jīng)的編程語言,和C++、Java、Python等主流編程語言屬于同一級(jí)別的,蘋果推出Swift的目的是為了替代一直以來用于iOS和Mac軟件開發(fā)的Objective C語言,如果你要學(xué)習(xí)在iOS平臺(tái)上開發(fā)App,那么Swift就是首選的編程語言。
Swift Playgrounds是長這樣的:
看得出來,Swift Playgrounds是真正在寫代碼,和真正的程序員寫代碼的方式是一模一樣的,不過跟Scratch相比,Swift Playgrounds顯然更多地用到了鍵盤打字,而且不可能用中文來寫程序。
很明顯,寫代碼對(duì)孩子來說門檻更高,為啥我還要直接上hard難度呢?
首先,單純從這兩種形式上比較,我不認(rèn)為Scratch的圖形化編程相比直接coding來說有多intuitive,相反,花花綠綠的各種塊塊讓我覺得好亂,抓不到重點(diǎn)。關(guān)鍵是,那些命令只是套了一個(gè)圖形的框,里面的描述不還是文字么,感覺有點(diǎn)像脫褲子放屁。其實(shí)Scratch之所以門檻低,我覺得主要不是在所謂的圖形化上,而是在于可以用中文和可以少打字上。既然現(xiàn)在的小朋友都很早就學(xué)英文了,我覺得這不算什么問題吧;至于打字,其實(shí)Swift Playgrounds有很多快速輔助提示,真正需要用鍵盤打的東西也并不多。
其次,真正的coding就是學(xué)習(xí)一門語言(programming language),它也有詞匯、語義和語法。語言是編程的一個(gè)重要部分,在描述一些復(fù)雜邏輯時(shí),編程語言能夠比圖形具有更強(qiáng)的描述力,特別是對(duì)數(shù)據(jù)結(jié)構(gòu)的描述,以及對(duì)于類和對(duì)象的描述。我的網(wǎng)絡(luò)工程師朋友跟我說,他覺得編程就是一種思維方式,用什么形式去編程沒有那么重要,我不太贊同。思維方式固然是編程的重要部分,但語言是表達(dá)思維的載體,這句話不僅限于編程,我們?nèi)粘J褂玫恼Z言,也是表達(dá)思維的載體,你說學(xué)會(huì)好好說話重要不重要?我覺得很重要。
直接用編程語言編程,孩子必須得注意詞匯和語法的正確性。下面這張圖上,最后一句是有語法錯(cuò)誤的(這個(gè)函數(shù)沒定義),編譯器給出了一個(gè)紅點(diǎn)提示。此外,孩子還得注意大括號(hào)的左右匹配(特別費(fèi)神,哈哈),以及在適當(dāng)?shù)牡胤郊涌崭窈蛽Q行。這些東西在圖形化編程工具里面是不會(huì)遇到的,但我覺得這也是literacy的一個(gè)重要能力(不僅限于編程)。
引用著名計(jì)算機(jī)科學(xué)家、技術(shù)作家Paul Graham的一個(gè)觀點(diǎn):“編程語言是用來思考程序的,而不是用來表達(dá)一個(gè)你已經(jīng)想好的程序的。”這句話的意思是說,編程語言是思考的工具,而不是一種單純的表達(dá)形式,你不能指望用中文(或者英文)在腦子里思考一個(gè)程序,然后用編程語言把它表達(dá)出來。
也正是因?yàn)檫@一點(diǎn),我認(rèn)為從學(xué)習(xí)編程的早期就強(qiáng)調(diào)(或者說至少不回避)編程的語言屬性是很重要的。各位家長都不排斥讓孩子從小學(xué)外語,那么也不應(yīng)該覺得讓孩子學(xué)編程語言就有多難,因?yàn)樗鼈儽举|(zhì)上是一回事。
另一個(gè)我堅(jiān)信孩子可以直接coding的原因是,我小時(shí)候也是差不多這么大開始接觸編程的,那個(gè)時(shí)候哪里有圖形化的編程,連Windows都木有呢,都是Apple II兼容機(jī)上用BASIC語言寫程序玩。那時(shí)候也不會(huì)英語,什么if...then...else這種英文單詞也不會(huì)念的,就硬生生把拼寫背下來了,現(xiàn)在想想也是很拼的。其實(shí)我家Vita哥哥也沒正經(jīng)學(xué)過英文,phonics也不會(huì),也是硬生生把單詞背出來了而已,跟我當(dāng)年是一個(gè)套路……
總結(jié)一下,我覺得Scratch這種圖形化編程,就好像自行車上的輔助輪,輔助輪可以給你一種很快就能上手的感覺(而且多半是假象),但它跟真正騎自行車還是有太多的差別。我不反對(duì)用Scratch,我認(rèn)為它是一種很好的教學(xué)工具,但我認(rèn)為在可能的情況下,讓孩子早點(diǎn)接觸真正的編程語言,也是非常值得考慮的一種選擇。