逃?jì)?/strong>
坐標(biāo)美國(guó)達(dá)拉斯
今天我打算和大家好好聊聊這個(gè)話題。別的不敢說(shuō),作為一位本碩七年計(jì)算機(jī)專業(yè),世界五百?gòu)?qiáng)公司里寫過(guò)代碼,帶過(guò)軟件團(tuán)隊(duì),教育公號(hào)里最會(huì)寫程序,IT行業(yè)里最會(huì)寫教育文章的麻麻(捂臉.jpg),我想這個(gè)話題我還是能從專業(yè)的角度給出一些見解的。
不過(guò)要想把這個(gè)事情說(shuō)透并不容易,我打算分兩次來(lái)分享。今天主要講編程到底對(duì)孩子有什么用,下次咱們?cè)倬唧w討論孩子究竟該怎么學(xué)編程。
首先我得說(shuō)明一點(diǎn),學(xué)編程不等于一定要當(dāng)碼農(nóng)。我大學(xué)同學(xué)畢業(yè)后頭5年大多都還在IT行業(yè),在寫程序,不過(guò)10年后都七七八八地“跨界”去了,我就是其中之一。編程中積累的經(jīng)驗(yàn)和能力讓我們?cè)谄渌袠I(yè)也游走得尚好,因?yàn)樗还馐且豁?xiàng)技能,更是培養(yǎng)一種思維,一種思考問(wèn)題的角度。
小時(shí)候?qū)W畫畫時(shí)老師跟我說(shuō),學(xué)了畫畫之后你看待世界的視角和之前是不一樣的。后來(lái)發(fā)現(xiàn)還真是,學(xué)畫畫的人往往會(huì)更注意一個(gè)東西的細(xì)節(jié)、質(zhì)感,喜歡變換看事物的角度,試圖去尋找它“透視”在不同平面上的樣子。
每一個(gè)新領(lǐng)域都能給我們帶來(lái)新的知識(shí),裝載著這些新知識(shí)的我們自然也會(huì)獲得新的思維,新的能力,新的看待世界的角度。學(xué)編程也如此。
編程的本質(zhì)是什么?用一句話來(lái)解釋,編程就是和電腦對(duì)話,用電腦聽得懂的語(yǔ)言,告訴它我想讓它做的事。
這跟和人說(shuō)話有什么不同呢?比方說(shuō)我想喝水,可以跟逃逃說(shuō)“Hey逃逃,幫我倒杯水!”同樣的一句話如果要讓電腦明白該怎么講?我得先告訴它什么是“杯子”、什么是“水”、什么是“倒”,然后再告訴它怎么去倒,比如先左轉(zhuǎn)75度,往前走兩米,左臂下放50度…
OMG, 很刻板很麻煩很不舒服對(duì)不對(duì)?是的,咱們?nèi)祟惖奶煨岳锍錆M了感性、隨意、散漫、喜歡八卦、愛聽故事。但電腦不是,作為新時(shí)代的高科技產(chǎn)品,它理性、嚴(yán)謹(jǐn)、不講故事講數(shù)據(jù),它要不聽不懂我們的指令,一旦聽懂了就會(huì)執(zhí)行,而且每次都會(huì)執(zhí)行。可不像逃逃那樣,明明聽懂了,但幫不幫我倒水主要看心情。
所以,要跟電腦溝通對(duì)話,我們也必須讓自己變得理性、嚴(yán)謹(jǐn)起來(lái),從電腦的角度去思考問(wèn)題,這就是所謂的編程思維。
這種思維能帶給孩子什么好處?下面我用一個(gè)大家都很熟悉的游戲“貪吃蛇”作例子,把編程思維所培養(yǎng)的能力逐個(gè)掰一掰?!柏澇陨摺笔俏覍W(xué)會(huì)編程之后所寫的第一個(gè)完整像樣的程序,寫完了自己玩得樂此不疲,所以印象特別深刻。
貪吃蛇游戲規(guī)則:用上下左右鍵控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,而且蛇的身子會(huì)越吃越長(zhǎng),身子越長(zhǎng)玩的難度就越大,不能碰墻,不能碰到自己的身體,等到了一定的分?jǐn)?shù),就能過(guò)關(guān),挑戰(zhàn)難度更高的關(guān)卡。
拆——分解問(wèn)題的能力
要寫一個(gè)“貪吃蛇”游戲,哇,這是一個(gè)很大的問(wèn)題,該怎么入手?如剛才所講,得想辦法讓電腦把這件事情搞明白,有哪些步驟,每一步該干什么,哪步在先哪步在后…所以我們首先得把這個(gè)大問(wèn)題給拆了。
拆解
在這個(gè)程序里,電腦主要處理兩件大事:
1. 處理輸入 – 收集用戶操作信息
2. 輸出響應(yīng) – 根據(jù)不同的輸入,做出不同的響應(yīng)
再拆解
1. 輸入 - 用戶的操作可以有按上、下、左、右鍵四種
2. 輸出 - 相應(yīng)地,貪吃蛇也要做往上、下、左、右走的動(dòng)作
我們把第2點(diǎn)再拆解
貪吃蛇每走一步,可能有這幾種情況:
1. 吃到蘋果
2. 撞到墻
3. 撞到自己
4. 什么都沒發(fā)生
我們把第一點(diǎn)“吃到蘋果”抽出來(lái),再再拆解
在這步里,電腦可能要這些事情:
蛇張開嘴巴
蘋果被咬掉
播發(fā)吃蘋果的聲音
蛇閉上嘴巴
身體長(zhǎng)長(zhǎng)一截
看起來(lái)很簡(jiǎn)單的程序,拆解后步驟可真多呀,而且這還只是其中的一條分支。孩子學(xué)習(xí)編程的過(guò)程,就是不斷地訓(xùn)練他把復(fù)雜、龐大的問(wèn)題拆解、理順的過(guò)程。
這種思維在學(xué)習(xí)、工作、生活中處處都用得著。在解決復(fù)雜問(wèn)題時(shí),問(wèn)題的分解必不可少,因?yàn)橹挥蟹纸獬擅恳粋€(gè)可以操作、可處理的小問(wèn)題時(shí),才算是把“大問(wèn)題”落了地,一個(gè)一個(gè)小問(wèn)題搞定了,大問(wèn)題也就解決了。
具備這種能力的人做事情是耐心的、有條不紊的。比如同樣面對(duì)一道有挑戰(zhàn)的數(shù)學(xué)題,分解能力好的孩子會(huì)列出清晰的解題步驟,搞定一步是一步,即使最后不一定能完全解答出來(lái),也能清清楚楚地知道自己的進(jìn)展;而有些孩子則不是,沒有分解的耐心和能力,遇到難題時(shí)腦子一團(tuán)亂麻。
整——發(fā)現(xiàn)并且整合“重復(fù)規(guī)律”的能力
先告訴大家一個(gè)秘密,程序員圈子普遍比較清高,常常為了表現(xiàn)自己與眾不同,會(huì)用些聽起來(lái)很高大上、但讓外行很費(fèi)解的術(shù)語(yǔ),比如接下來(lái)我說(shuō)的發(fā)現(xiàn)“重復(fù)規(guī)律”,99%的程序員GG會(huì)告訴你的是“要模塊化”,搖頭聽不懂的話,他再假裝體貼地解釋,哎呀,就是善用“函數(shù)”,封裝方法啦~
都是些什么鬼?
其實(shí)說(shuō)白了,就是幼兒園孩子都能搞得懂的“找規(guī)律”,觀察和找到那些重復(fù)發(fā)生的規(guī)律。比如“貪吃蛇吃蘋果”所發(fā)生的一系列動(dòng)作,是程序中多次會(huì)發(fā)生的,無(wú)論蘋果在左上方還是右上方,無(wú)論蛇是從上面吃還是從下面吃,都是同樣的一組動(dòng)作,那么我們就可以把這組動(dòng)作打包,給它取一個(gè)名字叫“吃蘋果”。每次蛇遇到蘋果時(shí),就可以直接把“吃蘋果”拿出來(lái)用,而不用重新把它所包含的一系列動(dòng)作再想一遍,搞不好的話還會(huì)有錯(cuò)漏。
在編程的過(guò)程中,孩子得一直在做這樣的訓(xùn)練,發(fā)現(xiàn)一些可以重復(fù)的單元,把它整合起來(lái),讓計(jì)算機(jī)去重復(fù)它。
這種能力可以大大提高我們做事的效率。舉個(gè)數(shù)學(xué)上最簡(jiǎn)單的例子,比如計(jì)算32×(37 4)+47×(37 4)+21×(37 4),它就相當(dāng)于(32 47 21)×(37 4),其中的(37 4)就是一個(gè)重復(fù)的單元,可以整合。
觀察那些做事麻利,效率特別高的人,就是具備了這個(gè)能力。很多孩子解題快,就是他善于發(fā)現(xiàn)和總結(jié)“重復(fù)規(guī)律”,腦袋里自備了一個(gè)裝有很多類似于“吃蘋果”那樣的方法庫(kù),遇到時(shí)直接調(diào)用,不用再?gòu)念^到尾想一遍,也不會(huì)錯(cuò)漏。
有段時(shí)間美國(guó)沃爾瑪超市發(fā)現(xiàn)尿不濕和啤酒這兩樣商品經(jīng)常會(huì)被一起銷售,背后的原因是媽媽得在家里照看孩子,買尿不濕的通常是下班后的爸爸,這時(shí)爸爸很喜歡順便再買幾瓶啤酒犒勞自己。發(fā)現(xiàn)這個(gè)規(guī)律后沃爾瑪就把這兩樣?xùn)|西放在一起,結(jié)果不僅提高了尿不濕和啤酒的銷量,還大大提高了整個(gè)超市的客流量,因?yàn)榘职謧儼l(fā)現(xiàn)逛沃爾瑪比其他超市更方便。
創(chuàng)新不一定指做出個(gè)前所未有的新產(chǎn)品,對(duì)現(xiàn)有的運(yùn)行方式進(jìn)行優(yōu)化改進(jìn),就是一種創(chuàng)新。而發(fā)現(xiàn)并整合“重復(fù)規(guī)律”的能力讓我們更容易找到創(chuàng)新的機(jī)會(huì)。
析——邏輯思維能力
這大概是程序員最引以為豪的一種能力。先看個(gè)笑話,
娃媽給程序員娃爸打電話:“下班順路買10個(gè)包子帶回來(lái),如果看到賣西瓜的,就買一個(gè)?!?/p>
結(jié)果娃爸手捧一個(gè)包子進(jìn)了門。娃媽怒道:“你怎么就只買了一個(gè)包子?!”
娃爸答曰:“因?yàn)榭吹搅速u西瓜的。”
類似這種“黑” 程序員的段子有很多。不過(guò)我得再悄悄告訴你一個(gè)秘密,這些段子的創(chuàng)造者不是別人,正是程序員圈子本身,嘿嘿,他們只是換著法子來(lái)得瑟自己的思維有多么嚴(yán)謹(jǐn)。
前面說(shuō)到,編程就是和理性嚴(yán)謹(jǐn)?shù)碾娔X對(duì)話,所以編程者也必須較真起來(lái)。
邏輯思維中有個(gè)非常重要的原則叫做MECE(Mutually Exclusive and Collectively Exhaustive),意思就是“相互排斥且整體完備”,也就是“不重復(fù),不遺漏”。比如下面右圖是遵循了MECE原則的,左圖就沒有。
在編程過(guò)程中,處處要考慮和遵循MECE原則。比如在貪吃蛇的程序里,蛇每往前走一步,可能會(huì)出現(xiàn)4種情況,
a. 吃到了蘋果
b. 撞到墻
c. 撞到自己
d. 什么都沒發(fā)生
這4種情況是互斥的,比方說(shuō)吃到蘋果的時(shí)候就不可能撞到墻,那么程序中就不能讓蘋果出現(xiàn)在墻上;而且,這4種情況覆蓋了所有可能性,在寫程序時(shí)如果只考慮了其中的2種或3種,就不“完備”了。此外,編程過(guò)程中還會(huì)涉及到很多處理“與”、“或”、“非”等布爾邏輯操作。比方說(shuō)“蛇沒有吃到蘋果”與“蛇沒有撞到墻”(!a && !b ),就等價(jià)于,“蛇撞到自己”或“什么都沒發(fā)生”(c || d)。
這些思考對(duì)孩子的來(lái)說(shuō)都是非常好的邏輯訓(xùn)練。
改——調(diào)試糾錯(cuò)能力
最重要的事情最后講。
當(dāng)我把編程能帶給孩子幾項(xiàng)能力一一列出來(lái)的時(shí)候,發(fā)現(xiàn)這點(diǎn)是最重要,也是孩子最需要的。
任何事情都很難一次就完成得盡善盡美,程序運(yùn)行起來(lái)發(fā)現(xiàn)不對(duì)有問(wèn)題,這時(shí)就需要孩子去尋找出錯(cuò)的地方,并將它一點(diǎn)一點(diǎn)去改正。
程序的世界很單純,只有0和1,對(duì)和錯(cuò),沒有模糊值。這跟寫文章、畫畫什么的不一樣,當(dāng)讀者、觀眾感覺一般時(shí),可能是見仁見智,并不一定證明你的作品不好或者哪里有錯(cuò),你也根本不知道該怎么改進(jìn)。
但程序不一樣,只要運(yùn)行結(jié)果和期望不符合,就證明中間肯定有哪兒出錯(cuò)了,不過(guò)同時(shí)也意味著只要足夠努力,就肯定能把這個(gè)錯(cuò)揪出來(lái)。就像你告訴一只貓,小黑屋里肯定有老鼠,它負(fù)責(zé)把老鼠抓出來(lái),比它不知道小黑屋里究竟有沒老鼠聽起來(lái)要容易和有信心得多。
然而,實(shí)際上程序中很多bug都不是一下就能找到的,常常需要從頭到尾把程序的運(yùn)行順序一步一步地跟走一遍,觀察每一步的運(yùn)行結(jié)果(專業(yè)術(shù)語(yǔ)叫“單步調(diào)試”)。這需要很多的耐心、觀察力和專注力,對(duì)孩子的抗挫折能力也是一種磨練。
當(dāng)調(diào)試經(jīng)驗(yàn)豐富之后,孩子在寫程序時(shí)還會(huì)懂得給那些“有可能會(huì)出錯(cuò)”的地方先做個(gè)記號(hào),方便回頭來(lái)檢查糾錯(cuò)。他更關(guān)注于提高自己糾錯(cuò)的技能,而不是害怕、回避或者掩蓋錯(cuò)誤。孩子會(huì)越來(lái)越懂得,有錯(cuò)很正常,只要能把它揪出來(lái),改正就好。
有些人總是在進(jìn)步,因?yàn)樗S時(shí)懂得回溯、調(diào)試、糾錯(cuò),進(jìn)而提升自己。
一不小心寫了很多,不知說(shuō)清楚了沒有。
以上這些能力,其實(shí)并不是編程特有的,但它們卻是在編程這件事情上集體出現(xiàn)的。所以要是你問(wèn)我,孩子有沒必要學(xué)編程,我會(huì)很肯定地回答,有必要,因?yàn)樗拇_培養(yǎng)孩子的綜合能力。
可幾歲學(xué)、怎么學(xué)?市面上關(guān)于編程的產(chǎn)品很多,繪本、桌游、APP、網(wǎng)站、課程……該怎么選?我下次會(huì)再來(lái)一篇好好談?wù)劇?strong>這里再透露個(gè)秘密,編程不一定非要對(duì)著電腦來(lái)學(xué),尤其是接觸初期。從上面幾點(diǎn)大家應(yīng)該可以看到,更多的是需要Get思維,培養(yǎng)能力。
Oops,我是不是說(shuō)得太多,泄密太多,沒準(zhǔn)兒要被程序員圈開除了。所以,關(guān)于孩子具體該怎么學(xué)編程的話題,咱們下次聊啰~
聯(lián)系客服