從編程思維開始,聊聊學編程

近年來大學最熱門的專業(yè)無疑是計算機,而在中小學基礎(chǔ)教育這塊兒,編程熱也是方興未艾,連奧巴馬也提出“編程要從娃娃抓起”。

當我看到才小學二年級的女兒,都已經(jīng)在學校學編程了,而七年級的兒子也才剛剛開始接觸Scratch(MIT開發(fā)的簡易編程環(huán)境),不禁有點按捺不住。于是靠教編程謀生的我,生平第一次動了讓13歲的兒子系統(tǒng)學編程的念頭。

為什么要學編程?

現(xiàn)在任何行業(yè)都離不開計算機,會編程這項技能,在求職時就如同90年代會英語一樣搶手。

學編程,不是為了將來當程序員。

而是為在自己行業(yè)里獲得更多的機會, 比如說做財務(wù)的,工作中少不了和excel表打交道,即使對每個菜單功能都很熟悉,還是有需要定制一些專門的查詢功能,這時編程就是不可或缺的技能。

也是因為計算機對今天我們的生活而言,就如同汽車對出行的重要。開車即使有定期去車行保養(yǎng),學習汽車相關(guān)的知識,萬一出行途中汽車發(fā)生故障也不至于驚慌失措;而且說不定因此感興趣了,鉆研進去,自己嘗試做個升級改裝也未嘗不可。學編程,也是同理。電腦或是手機無論硬件還是軟件,總會有出問題的時候,會編程的人可以自己做簡單故障定位,也可以作為興趣愛好在閑暇時間里做個網(wǎng)頁,寫給APP什么的。?

【1】編程,學什么?

每次聊起學編程,被問到的第一個問題往往是“學哪種編程語言好”。

回答這個問題之前,我想問你,覺得自動檔和手動檔的車,哪種好呢?

當前初學者中最流行的Python和Javascript 就像自動檔車,編寫簡單,強大庫函數(shù)支持廣泛應(yīng)用;而最為經(jīng)典的C語言就像手動檔,難學難用,還需要通曉編譯原理、操作系統(tǒng)和計算機體系結(jié)構(gòu),當然也最能體味駕駛的樂趣。

以前總覺得C語言對初學者太難了,這個想法今年5月在安大略省高中編程賽被徹底顛覆。一支由三個分別是五年級,七年級和八年級亞裔男孩組成的隊伍特別醒目,年齡比其他選手小很多,卻在由各個學區(qū)優(yōu)勝者組成56支高中編程隊脫穎且出名列第九。這三個孩子就是用C語言寫的程序,C語言也是他們唯一接觸過的編程語言。所以初學者具體學什么語言,因人而異。

思維指導行動。未來人人都會寫代碼,但程序設(shè)計是否簡潔高效,就得在思維上見高低了。十年前,卡耐基梅隆大學計算機教授Jeannette Wing 提出Computational Thinking “編程思維”的概念,指出通過學習編程,內(nèi)里培養(yǎng)的其實是認識問題和解決問題的思維方式,而這種思維方式可以跨界應(yīng)用到其他領(lǐng)域的學習和實踐中。

也就是說和編程語言相比,編程思維是內(nèi)功心法,在此基礎(chǔ)上,學習和使用哪種語言,猶如使用哪種兵器,只是工具層面上的東西

【2】什么是編程思維?

編程思維的四個組成模塊。圖片來源于網(wǎng)絡(luò)

編程思維本質(zhì)上來說,就是能夠把現(xiàn)實生活中的復雜問題,逐步拆分成可理解的小問題,(Decomposition 拆分),接著根據(jù)已有的知識和經(jīng)驗,找出新問題和以前解決過的問題的相似性,舉一反三琢磨出規(guī)律(Pattern Recognition 模式識別),然后將問題里涉及的數(shù)據(jù)抽象(Abstraction)到數(shù)據(jù)結(jié)構(gòu)(變量,數(shù)組,鏈表等等),把數(shù)據(jù)處理過程可重復執(zhí)行部分抽象(Abstraction)成函數(shù)模塊,通過循環(huán)執(zhí)行,最后根據(jù)前三步的分析成果,設(shè)計步驟,寫出算法(Algorithms),從而解決問題。

編程思維本身是一個非常抽象的概念,下面我舉個例子來詳細解釋一下它的四個組成模塊。

【3】編程思維1-2-3-4

我們都聽說過這樣一個故事:數(shù)學家高斯在三年級時候,老師要求從1+2+3開始一直加到100,其他同學都費勁的一個數(shù)一個數(shù)的加,只有小高斯注意到了這些數(shù)可以兩兩配對,相加和為101:

1+100=101

2+99=101 等等

一共有50對,最后的和可以用乘法來做:(50X101)=5050

高斯的上述解題思路充分體現(xiàn)了編程思維中的拆分和模式識別,再進一步延伸,就可以概括出求任意范圍【a, b】連續(xù)整數(shù)求和公式:(a+b)x (b-a)/2。

把原題擴展一下:

假設(shè)你有100張撲克牌,依次編號,從1到100,打亂洗牌后,突然發(fā)現(xiàn)少了一張,怎么知道少掉的是哪張?

下面我們試著用編程思維一起來一步步的解決這個問題。

第一步拆分:通過一張一張的查找,先在這堆牌里找1,再在剩下的牌里找2,然后再找3,依次下來,最后總能發(fā)現(xiàn)哪張少了。這種方法的局限是如果牌張數(shù)少還行的通,如果張數(shù)多,費時費力的,但符合一般人的解題思路。

第二步模式識別:如果能聯(lián)想到高斯的求和題,所有牌的面值總和應(yīng)當是5050,將手上的牌一張接一張的加起來,假設(shè)得到的和是5040,用5050-5040=10,很快知道少掉的那張牌是10.這種方法比起前一種,明顯棋高一著。

第三步抽象:擴展到現(xiàn)實生活中,假設(shè)有一副撲克牌,少了一張,如何快速定位少的是哪張?

一般情況下,我們都會重新理牌,先把4張Ace都找出來,再把四張2放在一起,依次下去,最后總可以看出哪張牌的哪種花色少了。

這種常規(guī)方法效率很低,如果聯(lián)想到我們剛剛建立的求和模型,是不是可以用來更為快速有效的解決這個問題?粗看每個數(shù)字都有四種花色,不唯一,好像不適用。

但是如果我們能解決如何把撲克牌花色和數(shù)字映射到計算機可以處理的數(shù)據(jù)的問題,就可以試用剛才的求和模型了。這也是考驗抽象的能力的時候了。

不妨按花色來,設(shè)紅桃A 為1 , 紅桃2 為2 ,依次到K是13,然后方塊A為14,到方塊K是26,以此類推,黑桃A到K是 27到39,梅花則是40到52。

這樣一來問題就轉(zhuǎn)化成了有52張撲克牌,依次編號,從1到52,洗完牌,發(fā)現(xiàn)少了一張,請問少掉的是哪張?是不是就可以很容易的套用第二步里總結(jié)的求和解題模型了?

再試想你有一千,一萬,甚至上百萬副撲克牌,每副都少一張(不盡相同),怎么能快速定位的少掉是哪些牌呢?

只要你能設(shè)計出快速定位一副牌里缺了哪張牌的計算方法,無論多少副牌,計算機都能在一眨眼的功夫,全部準確無誤的給你找出來。計算機相對于人腦,有存儲容量大和處理速度快的優(yōu)勢,所以計算機最擅長的就是重復勞動。能夠讓計算機從事高效的重復勞動的前提,是人先思考和分析怎樣把復雜工作分解成多個可機械重復執(zhí)行的模塊,然后才可以通過程序讓計算機來處理。而這步比寫程序本身來的重要的多。?

第四步 算法:當要處理的數(shù)據(jù)映射到合適的數(shù)據(jù)結(jié)構(gòu),可復用的處理模塊也都分辨識別出來后,下一步就是利用條件,循環(huán),子程序模塊,來規(guī)劃出程序設(shè)計步驟,從而解決問題。

所以說,編程思維的核心,不是編程語言,也不是語法,甚至不是算法或數(shù)據(jù)結(jié)構(gòu)本身,而是如何分解問題,從中發(fā)現(xiàn)規(guī)律,建立解決問題的模型,并映射到合適的數(shù)據(jù)結(jié)構(gòu)和算法上,然后才能根據(jù)算法寫程序?qū)崿F(xiàn)。在此過程中,前兩步分解和模式識別,其實完全隸屬數(shù)學思維范疇,也是編程思維的基礎(chǔ)。而抽象和算法才是編程思維所獨有的。 也是在孩子學編程過程中,最需要強調(diào)的。?

【4】編程思維,怎么學?

從以上對編程思維的解析來看,培養(yǎng)編程思維的前提條件是有扎實的數(shù)學,尤其是代數(shù)基礎(chǔ)。數(shù)學基礎(chǔ)還沒打牢,就開始學編程,無異于建造空中樓閣。

在孩子有一定代數(shù)基礎(chǔ)的前提下,抽象思維和算法這兩部分應(yīng)該是編程思想的重點,也是難點,那么該怎么學呢?

如果對這方面有興趣的話,我建議你了解AP College Board新推出的一門課程叫 AP Compute Science Principles,這門課過去四年在不少大學里已經(jīng)試點開設(shè),旨在教授編程思維和計算機科學中的核心基礎(chǔ)內(nèi)容。我打算讓兒子自學的斯坦福的CS101課程也是因此而產(chǎn)生的。而AP Compute Science Principles這門課程從今年秋天起也會在高中開設(shè),這是計算機教學領(lǐng)域里非常值得期待的一件事情。

回到學編程的話題,能夠讓孩子主動心甘情愿的學任何東西,大都滿足兩點要求:“有趣”和“有用”。因為有趣,才能激發(fā)其好奇心,去探索思考。因為有用,才能從中獲得成就感,成為進一步學習的動力。

遵循以上兩點,我給兒子制定了如下的編程學習計劃。

第一周: http://lightbot.com/hocflash.html 這款基于Flash的可編程游戲,不用來學編程,單純作為益智類類游戲來完也很有意思。 從最初的順序執(zhí)行指令,到后來引入條件,循環(huán),和子程序,是訓練編程思維的好工具。 其中子程序部分,非??简灪⒆佑行Х直婵蓮陀镁幊棠K的抽像能力。

同時閱讀Blown to Bits的部分章節(jié) http://www.bitsbook.com/excerpts/? ,全書的PDF版可以在鏈接里免費下載。學習編程,首先需要回答為什么要學的問題?這本書通俗易懂的介紹了作為信息技術(shù)主體的計算機如何改變著人類社會的方方面面,引導孩子在信息爆炸的時代里辯證的看待各種新興技術(shù)及其影響。?

第二周:介紹編程思維,可以用我上面所舉的找撲克牌的例子,看看孩子能否結(jié)合他玩lightbot游戲的經(jīng)歷,對編程思維有所認識。

第三周開始:使用斯坦福大學的CS101在線課程開始自學。?

https://lagunita.stanford.edu/courses/Engineering/CS101/Summer2014/about

該課程以Javascript作為工具,教授編程思想和計算機技術(shù)中的核心基礎(chǔ)內(nèi)容, 課程以視頻和在線練習結(jié)合的方式,自學模式下,預(yù)計六周完成。而這門課雖然不是專門教編程的課,但是涉及的編程都是孩子們普遍感興趣的數(shù)字圖像處理實驗,相信不少孩子會喜歡。

下圖是一些學生在學這門課程過程中,用JavaScript寫的程序生成的Fractal(分形)圖像。

圖片來源:Richard Kick

順便提一下編程語言,我一直比較傾向于初學者學JavaScript,JavaScript作為Web客戶端的主流編程(腳本)語言,可以在瀏覽器里直接運行,孩子寫幾行代碼,就可以在計算機或智能手機上查看效果,即簡單直接,又有用有趣。

以下為該課程涵蓋內(nèi)容:
? The nature of computers and code, what they can and cannot do
? How computer hardware works: chips, cpu, memory, disk
? Necessary jargon: bits, bytes, megabytes, gigabytes
? How software works: what is a program, what is "running"
? How digital images work
? Computer code: loops and logic
? Big ideas: abstraction, logic, bugs
? How structured data works
? How the internet works: ip address, routing, ethernet, wi-fi
? Computer security: viruses, trojans, and passwords, oh my!
? Analog vs. digital
? Digital media, images, sounds, video, compression

我把每章節(jié)內(nèi)容從頭到尾過了一遍,總體難度適中,如果家長能夠給予適當?shù)闹笇Ш蛶椭脑?,初中生自學不成問題。如果孩子通過以上兩個月課程,對編程產(chǎn)生興趣的話,那么下一步,就該系統(tǒng)的掌握一門編程語言了。

【5】學了編程思維,然后呢?

沒有實踐的思維,只是空想。學完編程思維之后,還是有必要深入的學習一門編程語言,在實踐中應(yīng)用編程思維解決問題。學習編程語言,網(wǎng)上有大量優(yōu)質(zhì)資源,孩子可以用來自學。

我在教學中常用的有以下幾個網(wǎng)站:
Codecademy 好處是常用的編程語言的教程都有。缺點是Bug不少,明明按照要求輸入完全正確的代碼,服務(wù)器端老是顯示代碼錯誤,讓孩子非常沮喪。遇到這種情況,多試幾次,如果還是不行,鼓勵孩子到Q&A論壇上看其他人是如何解決這樣問題。
https://www.codecademy.com/?

滑鐵盧大學計算機系的CS Circles, 也是相當不錯的學習Python的資源。
http://cscircles.cemc.uwaterloo.ca/

Codingbat是我很喜歡的在線Java和Python的練習網(wǎng)站。
http://codingbat.com/

雖然編程可以自學,條件允許的情況下,幾個程度相當孩子一起學,互相交流,互相幫助,共同進步的效果會更好。前文提到我在省高中編程競賽時遇到秒殺很多高中生的三個用C語言的小男孩,當時很感興趣的追問他們是在哪里學的編程。原來他們每周課后兩次到附近的高中Woburn CI,參加由那里學生組織的編程俱樂部。編程俱樂部以師傅帶學徒方式運作,大孩子教小孩子,有經(jīng)驗的幫助新手。雖然沒有老師指導,但是這種以共同興趣為基礎(chǔ)的互助氛圍里培養(yǎng)出來的孩子居然完勝那些經(jīng)過兩三年正規(guī)編程訓練的大孩子,真是很讓人深思的事情。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文把程序員所需掌握的關(guān)鍵知識總結(jié)為三大類19個關(guān)鍵概念,然后給出了掌握每個關(guān)鍵概念所需的入門書籍,必讀書籍,以及...
    dle_oxio閱讀 11,373評論 6 244
  • UI設(shè)計行業(yè)目前來說發(fā)展前景還是不錯的,所以這是現(xiàn)在很多人想要轉(zhuǎn)行UI設(shè)計的原因,成為真正意義上的白領(lǐng),拿著過萬的...
    UI設(shè)計司閱讀 458評論 0 0
  • 我們在致歉中成長我們在成長中致歉 我們在反省中成長我們在成長中反省 一生太長太短,我們總是會犯很多錯誤,有大有小。...
    一人青爭閱讀 467評論 0 0
  • 你的臉怎樣,其實代表了你的生活狀態(tài)。如果你經(jīng)常感覺壓力山大,你眉頭肯定緊緊的;反之,如果內(nèi)心舒暢,就經(jīng)常眉笑眼開,...
    瀟雨姑娘閱讀 394評論 3 2
  • 這些天跟著電視追劇,看了幾集《歡樂頌》。在這些女孩子各自的苦樂人生背后,除了價值觀、階層差異和固化、職場規(guī)則、拜金...
    西川紫閱讀 956評論 1 1

友情鏈接更多精彩內(nèi)容