為孩子寫一本編程書系列:學(xué)習(xí)命令像計算機一樣思考
我們已經(jīng)做好了學(xué)習(xí)編程的所有準(zhǔn)備,小Ian也早已躍躍欲試,迫不及待地想要去Playground中完成那些編程挑戰(zhàn)了,你是否也準(zhǔn)備好了呢?讓我們就從認(rèn)識命令開始吧。
認(rèn)識命令
我們都知道,當(dāng)你和一個英國人講話時,需要說英語,而和日本人講話時,就得說日語。我們也曾說過編程是人與計算機之間的交流方式,那么,計算機能夠聽懂的語言又是什么呢?我們把計算機能夠聽懂的語言稱為命令,我們通過將一條一條的命令按一定的順序組織起來,并且輸入計算機來告訴它做什么以及如何去做。
- 命令:一條命令就是告訴計算機去完成一個具體的行動(任務(wù)),比如我們稍后就會用到的:moveFoward() 向前走命令,collectGem() 抓寶石命令。
- 順序:命令的順序則是告訴計算機這些行動(命令)執(zhí)行的先后次序
如果命令寫錯了,那么計算機無法理解,也就不會去執(zhí)行。而如果命令的順序?qū)戝e了,雖然計算機能夠執(zhí)行,卻無法達到你想要的結(jié)果。因此,要寫出正確的程序,就必須同時寫對命令以及它們的執(zhí)行順序。
Tips: 對于初學(xué)者來說,學(xué)習(xí)編程的***步,是學(xué)著像計算機一般思考和解決問題,而它的起點便是熟悉命令的使用與它們執(zhí)行順序的編排。未來我們還會學(xué)習(xí)更多編程有關(guān)的知識,但它們大部分都是圍繞著命令(用于提供更豐富的功能)和順序(用于提供更復(fù)雜的控制邏輯)去展開的。
從最簡單的命令開始
終于到了我們可以一試身手的時候了,Playground中的每一小節(jié)都是由一個小游戲構(gòu)成的編程挑戰(zhàn)。而我們要完成的***個挑戰(zhàn),便是幫助下面這個游戲中的主人公Byte,穿越迷宮抓到那顆閃著紅光的奇異寶石。這里,你將需要使用moveFoward()向前走一格命令,和collectGem()抓寶石命令來完成這個挑戰(zhàn)。
Tips:我將Playground中***個挑戰(zhàn)游戲翻譯為中文,即使你英語不夠好,只要你熟悉了那些簡單的操作,以及Playground中的基本任務(wù)設(shè)置,便可以輕松地使用Playground來教孩子們或自學(xué)編程了。
小Ian很順利地完成了***次的編程挑戰(zhàn),并寫下了他的***段代碼:(讓Byte向前走三格,然后抓到寶石)
運行上面的命令,看看效果如何?太棒了,Byte抓到了那顆紅色寶石,相信你的孩子(或你自己)也一定成功完成了這次挑戰(zhàn)吧。讓我們將Playground中彈出的提示信息,大聲讀出來吧,“祝賀你!你已經(jīng)寫出了自己的***段Swift代碼。Byte以正確的順序準(zhǔn)確執(zhí)行了你所寫的命令,并最終成功抓到了寶石!”
命令的命名
大家已經(jīng)完成了自己的***個編程挑戰(zhàn),讓我們回顧一下所使用的那兩條命令moveFoward()、collectGem,大家有沒有發(fā)現(xiàn)我們總是會在一條命令后面加上一對括號 ()?讓我們暫且記住這個命令的命名規(guī)則,因為再往后學(xué),我們將能夠通過在括號中加入更多參數(shù),使命令變得更加強大和有趣。
另外你可能也注意到了,Palyground中那些預(yù)定義的命令moveFoward(),collectGem(),trunLeft()都是由一個動詞+名詞(或副詞)組成的。由于命令是讓計算機執(zhí)行一個任務(wù),因此,人們總是習(xí)慣使用一個動作來為一條命令命名。而當(dāng)我們需要在一個命令中使用多個單詞時,會將***個單詞的首字母小寫,而后面單詞的首字母大寫,來給命令命名。這被稱作是駱駝式命名法(Camel-Case)又稱駝峰命名法。下面這些命令中大小寫字母構(gòu)成的高低起伏是不是像極了駱駝背上的駝峰呢?
雖然計算機并不在乎你給命令起什么名字,但作為一名編程者,我們不僅會不斷地編寫新的程序代碼,也時常需要去維護和更新我們所寫的那些舊代碼,特別是當(dāng)我們需要與同伴們一起去完成復(fù)雜的編程任務(wù)的時候,更需要讓自己寫的代碼易于閱讀,便于他人的理解和維護。因此,正確地為我們所寫的命令命名,是每個優(yōu)秀編程者從一開始就應(yīng)該養(yǎng)成的習(xí)慣。
Tips:對于國內(nèi)孩子,在對英語詞匯掌握不足的情況下,可以使用拼音來代替英文命名,但切記使用能夠清晰反應(yīng)命令作用或目的的動詞來進行命名,當(dāng)包含多個單詞時,使用駝峰命名法。
調(diào)試 Debugging
編程和很多創(chuàng)造性的工作一樣,都是將頭腦中的東西通過某種形式表現(xiàn)出來。比如,繪畫時我們用線條和圖形進行創(chuàng)作,寫作時,我們則用文字來構(gòu)成文章,而在編程的時侯,我們是用一行行的命令來寫出程序。就像我們不太可能一筆不錯地去完成一幅繪畫或一篇文章一樣,在編程時,也經(jīng)常需要糾正或修改我們所寫的代碼,并使它最終能夠按照我們的意愿去執(zhí)行并解決問題。
我們將編程中發(fā)現(xiàn)與修復(fù)錯誤的過程叫做調(diào)試,程序員們也經(jīng)常將它形象地稱作抓Bug(蟲)。即使那些最有經(jīng)驗的程序員也會在寫代碼時出錯,所以當(dāng)你寫的程序出現(xiàn)問題(無法達到預(yù)期效果)時,不用著急,使用一些簡單的調(diào)試技巧去找到問題,并修復(fù)它們就可以了。
我們最常用的調(diào)試方法,就是通過觀察程序的運行效果與代碼之間的關(guān)聯(lián),來找出問題。例如,在之前的那個編程挑戰(zhàn)中,如果有人寫了上面這段代碼,你是否能通過運行它,很快發(fā)現(xiàn)錯誤的原因呢?——是的,***兩個命令之間漏掉了一個moveFoward()命令,Byte沒有走到寶石所在的方格便去抓寶石了,當(dāng)然會失敗咯。讓我們加上一條moveForward()命令,再次執(zhí)行,這一回Byte成功抓到了寶石。你通過調(diào)試成功地修復(fù)了一個程序Bug,并讓程序恢復(fù)了正確。
Playground中的調(diào)試選項
Playground中有一些非常實用的調(diào)試選項,點擊動畫演示區(qū)左下角的儀表盤圖標(biāo),便能顯示出來了。
- Run Fastest 以最快速度運行代碼,一般用于快速驗證代碼執(zhí)行結(jié)果
- Run Faster 以較快速度運行代碼
- Run My Code 以一般的速度運行代碼
- Step Through My Code 單步調(diào)試,命令的執(zhí)行與動畫演示中的步驟關(guān)聯(lián)起來,非常有利于查找問題,或?qū)W習(xí)那些較復(fù)雜的控制邏輯。
- Step Slowly 非常緩慢地運行你所寫的命令,讓你在調(diào)試的每一步,都有時間進行思考
Tips:調(diào)試不僅僅是在幫助學(xué)習(xí)者寫出正確的代碼,它這也是一個加深印象、培養(yǎng)編程感覺、熟悉編程界面與鍵盤操作的良好機會。在這個過程中,我們需要檢查自己的代碼,刪除或修改出錯的命令,不斷嘗試,直到獲得正確的結(jié)果。對孩子們來說,這種獨立解決問題的方法對他們?nèi)蘸髮W(xué)習(xí)其他學(xué)科同樣很有幫助,因此不要過早糾正孩子們編程中的錯誤,而是嘗試著讓他們自己去發(fā)現(xiàn)和解決問題。
小節(jié)
通過這一節(jié)的學(xué)習(xí),我們認(rèn)識了編程中的命令,通過將命令組合起來去解決問題(幫助Byte去完成Playground中設(shè)定的那些挑戰(zhàn))。而在出現(xiàn)問題時,我們也知道了如何通過調(diào)試,去發(fā)現(xiàn)和修正那些錯誤,并最終讓程序的執(zhí)行達到我們的預(yù)期。在下一節(jié)中我們將會學(xué)習(xí)編程中的另一個重要概念函數(shù)Function。
練習(xí)
請大家完成Playground中,Commands這一節(jié)中的其他編程挑戰(zhàn),它們包括:通過運用更多命令來解決復(fù)雜問題;通過調(diào)試,修復(fù)代碼中的錯誤;找出解決問題的最短路徑(用最少的代碼解決問題)。完成這些練習(xí)后,你將會得到一個更熟悉和自然的編程體驗,相信也會對后面的學(xué)習(xí)更加充滿信心。
【本文是51CTO專欄作者“陳逸鶴”的原創(chuàng)文章,如需轉(zhuǎn)載請聯(lián)系作者本人(微信公眾號:techmask】