- 給孩子的計(jì)算思維書(shū):圖形化編程及數(shù)學(xué)素養(yǎng)課(進(jìn)階篇)
- 昍爸
- 9630字
- 2023-10-25 20:17:37
前言
不搞信息學(xué)奧賽,為什么還要學(xué)編程?
在我策劃和寫(xiě)作本書(shū)的時(shí)候,有許多家長(zhǎng)問(wèn):“孩子到底要不要學(xué)編程?”雖然人工智能已經(jīng)漸漸普及,但依然有大量的家長(zhǎng)并不知道要不要讓孩子學(xué)編程,也不知道該怎么學(xué)。部分家長(zhǎng)的心態(tài)很現(xiàn)實(shí):“學(xué)編程能帶給孩子什么,特別是,能不能對(duì)升學(xué)有幫助?”
在編程逐漸普及的過(guò)程中,出現(xiàn)了兩種不同的聲音。一種是編程對(duì)數(shù)學(xué)基礎(chǔ)要求很高,數(shù)學(xué)基礎(chǔ)不好,編程也肯定學(xué)不好;另一種是無(wú)論誰(shuí)都可以從編程學(xué)習(xí)中獲益,編程并不需要太好的數(shù)學(xué)基礎(chǔ)。
那么,到底哪一種是對(duì)的呢?下面8個(gè)問(wèn)題的回答將為大家釋疑。
問(wèn)題1:編程=信息學(xué)奧賽?
產(chǎn)生上面不同聲音的一大原因是許多人在信息學(xué)奧賽(全稱(chēng)為全國(guó)青少年信息學(xué)奧林匹克競(jìng)賽)和編程之間畫(huà)上了等號(hào),但顯然這是不正確的。信息學(xué)奧賽只是編程的一個(gè)小子集。這就跟我們所有人都要學(xué)數(shù)學(xué),但只有極少數(shù)人會(huì)去參加數(shù)學(xué)奧賽是一個(gè)道理。
在編程門(mén)檻日益降低的當(dāng)下,一般的編程只需要一定的邏輯思維能力即可。大部分的核心算法和框架都是現(xiàn)成的,普通的編程人員只要按需將它們組裝起來(lái)就能實(shí)現(xiàn)某個(gè)特定的功能。所以,千萬(wàn)不要把程序員的職業(yè)想得有多“高大上”,大部分程序員只是代碼的搬運(yùn)工和組裝者。但參加信息學(xué)奧賽則不同,參賽者需要非常強(qiáng)的數(shù)學(xué)能力、問(wèn)題分析能力和問(wèn)題解決能力。即便是一名擁有多年工作經(jīng)驗(yàn)的老程序員,在面對(duì)信息學(xué)奧賽的問(wèn)題時(shí),解答不出來(lái)也是很正常的。
問(wèn)題2:編程是什么?
信息學(xué)奧賽是不是編程?是!
孩子組裝個(gè)機(jī)器人、搭個(gè)積木是不是編程?也是!
這好比是問(wèn):100以?xún)?nèi)的加減法是不是數(shù)學(xué)?費(fèi)馬大定理是不是數(shù)學(xué)?它們當(dāng)然都是數(shù)學(xué)!
所以,編程到底是什么呢?
編程的目的是讓計(jì)算機(jī)幫助人類(lèi)解決問(wèn)題。為了使計(jì)算機(jī)能夠理解人的意圖,人類(lèi)就必須將需要解決的問(wèn)題的思路、方法和手段通過(guò)計(jì)算機(jī)能夠理解的形式告訴計(jì)算機(jī),使得計(jì)算機(jī)能夠根據(jù)人給出的指令一步一步地去完成某項(xiàng)特定任務(wù)。這種人和計(jì)算機(jī)之間交流的過(guò)程就是編程。
編程的難易主要取決于兩個(gè)方面:一是程序設(shè)計(jì)語(yǔ)言的友好性,二是所要解決問(wèn)題的難度。其中,起決定性作用的是后者。從最早的機(jī)器語(yǔ)言到匯編語(yǔ)言,再到高級(jí)語(yǔ)言,再到現(xiàn)在的圖形化編程語(yǔ)言,程序設(shè)計(jì)的語(yǔ)法已經(jīng)變得越來(lái)越友好了。但無(wú)論用哪種編程語(yǔ)言,能寫(xiě)出可以解決“八皇后問(wèn)題”的程序的程序員還真不多(“八皇后問(wèn)題”在本套書(shū)的基礎(chǔ)篇第6章介紹)。
這就好比英國(guó)人覺(jué)得法語(yǔ)要比中文容易學(xué)。但不管怎樣,只要肯學(xué),學(xué)會(huì)一門(mén)語(yǔ)言并能與人交流并不是太難的事,但要用這門(mén)語(yǔ)言創(chuàng)作一首詩(shī)歌或一篇小說(shuō),則要難得多。
問(wèn)題3:為什么信息學(xué)奧賽如此受關(guān)注?
信息學(xué)奧賽是與數(shù)學(xué)奧賽、物理奧賽、化學(xué)奧賽和生物奧賽并列的五大學(xué)科奧賽之一。
目前國(guó)內(nèi)面向青少年的信息學(xué)奧賽,從難度與規(guī)模來(lái)說(shuō),分為下面4個(gè)階段。
●省級(jí)考試:CSP-J/S
CSP是非專(zhuān)業(yè)級(jí)計(jì)算機(jī)軟件能力認(rèn)證標(biāo)準(zhǔn),分為CSP-J(入門(mén)級(jí),Junior)和CSP-S(提高級(jí),Senior),均涉及算法和編程。每年的9月初賽,形式為筆試;10月復(fù)賽,形式為機(jī)考。
●省選級(jí)考試:NOIP
全國(guó)青少年信息學(xué)奧林匹克聯(lián)賽(NOIP)自1995年至今(除2019年外),每年由中國(guó)計(jì)算機(jī)學(xué)會(huì)(CCF)統(tǒng)一組織。NOIP在同一時(shí)間、不同地點(diǎn)以各省市為單位由特派員組織考試,全國(guó)統(tǒng)一大綱、統(tǒng)一試卷。高中或其他中等專(zhuān)業(yè)學(xué)校的學(xué)生可報(bào)名參加聯(lián)賽。聯(lián)賽分初賽和復(fù)賽兩個(gè)階段。初賽考查通用和實(shí)用的計(jì)算機(jī)科學(xué)知識(shí),以筆試為主。復(fù)賽考查程序設(shè)計(jì)能力,須在計(jì)算機(jī)上調(diào)試完成程序設(shè)計(jì)。聯(lián)賽分普及組和提高組兩個(gè)組別,難度不同。
2019年8月,CCF發(fā)布公告稱(chēng)NOIP從2019年起暫停。在暫停NOIP比賽后,CCF在同年8月23日宣布舉辦CSP-J/S非專(zhuān)業(yè)級(jí)軟件能力認(rèn)證活動(dòng)。2020年9月,CCF發(fā)布通知恢復(fù)舉辦NOIP,并指出:凡是在由CCF認(rèn)定的國(guó)內(nèi)國(guó)際程序設(shè)計(jì)競(jìng)賽中或能力認(rèn)證(CSP-S)活動(dòng)中取得優(yōu)秀成績(jī)的學(xué)生可以獲得NOIP的參賽資格;學(xué)生也可以通過(guò)CCF認(rèn)可的指導(dǎo)教師的推薦獲得NOIP的參賽資格,但推薦人數(shù)有限,大部分的學(xué)生如果想要參加NOIP,還是要先通過(guò)CSP-S。
通知中還指出:參加NOIP是參加NOI(全國(guó)青少年信息學(xué)奧林匹克競(jìng)賽)的必要條件,不參加NOIP將不具有參加NOI的資格。因此,可以認(rèn)為CSP-S是NOIP的選拔賽,NOIP是考生參加NOI的必要條件。
●全國(guó)級(jí)比賽:NOI
NOI即全國(guó)青少年信息學(xué)奧林匹克競(jìng)賽,是面向初、高中或其他中等專(zhuān)業(yè)學(xué)校學(xué)生的全國(guó)性質(zhì)的編程最高級(jí)別比賽。每年在NOI中取得優(yōu)異成績(jī)的學(xué)生可以進(jìn)入國(guó)家集訓(xùn)隊(duì)(50名)。
●國(guó)際級(jí)中學(xué)生比賽:IOI
IOI(國(guó)際信息學(xué)奧林匹克競(jìng)賽)是面向全世界中學(xué)生的一年一度的信息學(xué)學(xué)科競(jìng)賽,每個(gè)國(guó)家最多可選派4名選手參加。
問(wèn)題4:編程和數(shù)學(xué)到底是什么關(guān)系?
這取決于學(xué)編程的目的。
如果就是想?yún)⒓有畔W(xué)奧賽學(xué)編程,那編程與數(shù)學(xué)絕對(duì)是強(qiáng)相關(guān)。因?yàn)樾畔W(xué)奧賽本身承載了選拔的重任,而數(shù)學(xué)能力是最基礎(chǔ)的。具體地說(shuō),信息學(xué)奧賽主要涉及離散數(shù)學(xué)的內(nèi)容,知識(shí)點(diǎn)涵蓋計(jì)數(shù)、數(shù)論、集合論、圖論、數(shù)理邏輯、離散概率、矩陣運(yùn)算等。思維和方法方面,對(duì)遞歸和分治的要求比較高。當(dāng)然,除了數(shù)學(xué)能力,信息學(xué)奧賽還對(duì)閱讀理解、問(wèn)題分解、編碼與調(diào)試等一系列綜合能力有一定的要求。
那如果不參加信息學(xué)奧賽呢?編程和數(shù)學(xué)就沒(méi)有那么強(qiáng)相關(guān),有些時(shí)候甚至可以說(shuō)是弱相關(guān)。現(xiàn)在編程的門(mén)檻越來(lái)越低,有些編程工作其實(shí)只是簡(jiǎn)單地做了些功能的調(diào)用。程序員懂一些基本的編程語(yǔ)法,會(huì)閱讀接口的說(shuō)明書(shū),就能實(shí)現(xiàn)一些很有用的功能了。要求稍高一點(diǎn)的,需要自己原創(chuàng)一些代碼,這時(shí)對(duì)邏輯思維能力和抽象能力的要求也就更高。再難一點(diǎn)兒,涉及核心的算法,那數(shù)學(xué)能力就必不可少。我國(guó)的程序員數(shù)量不少,整個(gè)群體結(jié)構(gòu)呈金字塔狀,涉及核心算法的群體屬于金字塔塔尖,實(shí)屬少數(shù),大部分程序員并不需要學(xué)習(xí)太復(fù)雜的數(shù)學(xué)知識(shí)。
問(wèn)題5:什么時(shí)候開(kāi)始學(xué)編程合適?
如今,市場(chǎng)上有些機(jī)構(gòu)宣傳孩子在幼兒園階段就可以開(kāi)始學(xué)編程,讓一些不明就里的家長(zhǎng)無(wú)所適從。我個(gè)人認(rèn)為,除了極少天賦異稟的孩子,大部分孩子在5歲以前邏輯思維尚不健全,很難明白編程的內(nèi)涵。而且,即便是學(xué)普通的編程,最基本的四則運(yùn)算和邏輯運(yùn)算也是必備的基礎(chǔ),從課內(nèi)的數(shù)學(xué)教學(xué)進(jìn)度來(lái)看,至少得要小學(xué)二年級(jí)以后才適合學(xué)習(xí)編程。
很多家長(zhǎng)想借鑒孩子學(xué)英語(yǔ)的經(jīng)驗(yàn),希望孩子在編程方面也能像學(xué)英語(yǔ)一樣早早起跑。我并不是說(shuō)更小的孩子不能學(xué)編程,只是編程和英語(yǔ)真的不一樣。孩子從小開(kāi)始學(xué)習(xí)英語(yǔ),學(xué)3年,它的效果很明顯,晚學(xué)的孩子花幾個(gè)月時(shí)間根本追不上。但換成編程就不一樣,同等智力的孩子,從5歲開(kāi)始先學(xué)3年編程,后學(xué)的孩子用短則兩三個(gè)月、長(zhǎng)則半年的時(shí)間就能追上。所以,思維沒(méi)有到一定地步,過(guò)早開(kāi)始學(xué)習(xí)編程反而會(huì)事倍功半。
問(wèn)題6:孩子學(xué)習(xí)編程的語(yǔ)言怎么選擇?
如果想讓孩子早點(diǎn)兒接觸編程并對(duì)編程產(chǎn)生興趣,那可以先讓孩子接觸圖形化編程。待孩子理解了程序的工作原理,后面想讓孩子參加信息學(xué)奧賽的家長(zhǎng)可以選擇在四年級(jí)以后讓孩子學(xué)習(xí)C++代碼編程。數(shù)據(jù)表明,信息學(xué)奧賽頂級(jí)選手的成績(jī)與起步時(shí)間沒(méi)有明顯的相關(guān)性,因此,家長(zhǎng)大可不必?fù)?dān)心孩子是不是學(xué)習(xí)編程起步晚了。
如果孩子數(shù)學(xué)天賦一般,或者家長(zhǎng)并沒(méi)想讓孩子參加信息學(xué)奧賽,只是純粹想讓孩子體驗(yàn)編程的樂(lè)趣并建立計(jì)算思維,那么對(duì)于圖形化編程的學(xué)習(xí)可以持續(xù)到五六年級(jí)。再往后,Python是一個(gè)不錯(cuò)的選擇,因?yàn)槭褂肞ython可以很快做出一些很酷的程序。
問(wèn)題7:圖形化編程能訓(xùn)練計(jì)算思維嗎?
有些家長(zhǎng)認(rèn)為訓(xùn)練計(jì)算思維一定需要學(xué)C++或Python這類(lèi)編程語(yǔ)言才行,而圖形化編程只是搭搭積木,沒(méi)法訓(xùn)練計(jì)算思維。其實(shí),這種認(rèn)知是片面的。
圖形化編程目前看起來(lái)沒(méi)有起到很好的訓(xùn)練計(jì)算思維的效果,問(wèn)題不在于圖形化編程本身,而在于市場(chǎng)把圖形化編程的學(xué)習(xí)下沉得太厲害,很多機(jī)構(gòu)已經(jīng)把圖形化編程下沉到三年級(jí)以下。幼兒園甚至是小學(xué)一二年級(jí)的小朋友,大都不具備邏輯與數(shù)學(xué)基礎(chǔ),對(duì)這個(gè)階段的孩子進(jìn)行計(jì)算思維的培養(yǎng)實(shí)在有點(diǎn)“巧婦難為無(wú)米之炊”。如果孩子在更高的年級(jí)(比如小學(xué)的四至六年級(jí))去學(xué)圖形化編程,那圖形化編程完全可以作為計(jì)算思維訓(xùn)練的載體。
從本質(zhì)上來(lái)說(shuō),計(jì)算思維的訓(xùn)練與具體的編程語(yǔ)言無(wú)關(guān)。這就好比一個(gè)人的文學(xué)修養(yǎng)與他所使用的語(yǔ)言沒(méi)有關(guān)系,作家用文言文可以寫(xiě)出優(yōu)秀的文學(xué)作品,用現(xiàn)代白話(huà)文和英文也一樣。
問(wèn)題8:編程會(huì)影響學(xué)科類(lèi)課程的學(xué)習(xí)嗎?
有些家長(zhǎng)會(huì)有這樣的顧慮:孩子學(xué)編程需要花費(fèi)大量的時(shí)間,等到進(jìn)入初中后會(huì)不會(huì)影響學(xué)科類(lèi)課程的學(xué)習(xí)?也正因?yàn)榇耍M(jìn)入初中后,很多家長(zhǎng)就不再支持孩子學(xué)編程了。
有這個(gè)顧慮是很正常的,但如果學(xué)習(xí)的目的是訓(xùn)練計(jì)算思維、培養(yǎng)編程素養(yǎng),這樣的擔(dān)憂(yōu)就是沒(méi)有必要的。
我們不妨來(lái)看看編程能培養(yǎng)孩子的哪些能力。
編寫(xiě)程序是為了解決某個(gè)具體問(wèn)題,但這個(gè)問(wèn)題通常是以某種情景表現(xiàn)的,不像數(shù)學(xué)題那樣抽象。因此,編程學(xué)習(xí)首先有助于提高孩子的問(wèn)題理解、分析和抽象的能力。
一個(gè)稍微復(fù)雜一點(diǎn)兒的問(wèn)題往往由若干個(gè)子問(wèn)題構(gòu)成,其中有些是我們熟悉的,可以利用現(xiàn)有的程序,有些是我們需要去編寫(xiě)的。編程學(xué)習(xí)非常有助于提高孩子們的問(wèn)題分析能力。
在編寫(xiě)程序的過(guò)程中,邏輯思維能力極為重要。程序里用得最多的就是邏輯判斷和循環(huán)。滿(mǎn)足什么條件執(zhí)行哪個(gè)分支程序,滿(mǎn)足什么條件退出循環(huán),這些問(wèn)題的解決都需要較高的邏輯思維能力。當(dāng)然,如果沒(méi)有良好的數(shù)學(xué)素養(yǎng),寫(xiě)出的程序可能并不理想。擁有良好數(shù)學(xué)思維的人往往可以寫(xiě)出非常簡(jiǎn)潔且高效的程序。
寫(xiě)程序常常是一個(gè)不斷優(yōu)化的過(guò)程。一開(kāi)始寫(xiě)出的可執(zhí)行程序,往往效率并不那么高,結(jié)構(gòu)并不那么美。這時(shí),我們可以不斷去尋找更優(yōu)化的方法,不斷提升程序的效率和可讀性。因此,編程能鍛煉孩子不斷優(yōu)化、追求卓越的品質(zhì)。
數(shù)學(xué)題解錯(cuò)了,如果我們不驗(yàn)算,就很難看出來(lái),更何況有些數(shù)學(xué)題也不好驗(yàn)算。但程序不允許一絲一毫的馬虎,錯(cuò)了要么無(wú)法運(yùn)行,要么執(zhí)行結(jié)果不符合我們的預(yù)期。編程不允許半點(diǎn)兒粗心,一旦發(fā)現(xiàn)了錯(cuò)誤,就得像福爾摩斯一樣去尋找問(wèn)題所在。有可能一個(gè)不經(jīng)意的小錯(cuò)誤,我們得花上半天甚至更長(zhǎng)時(shí)間才能找出癥結(jié)。所以,編程非常有助于幫助孩子克服粗心的毛病,鍛煉孩子的耐心,提高孩子的錯(cuò)誤診斷能力。
對(duì)于一個(gè)大型的程序,我們常常需要幾個(gè)人一起協(xié)作完成。這個(gè)時(shí)候,程序就不單單是寫(xiě)給自己看,還要讓別人也能看得懂。因此,編程非常有助于鍛煉孩子的團(tuán)隊(duì)協(xié)作能力和結(jié)構(gòu)化與模塊化思維。
沒(méi)錯(cuò),編程確實(shí)很花時(shí)間。如果連學(xué)科內(nèi)容都學(xué)得吃力,那我不建議去學(xué)編程。如果學(xué)有余力并且對(duì)編程感興趣,那在學(xué)習(xí)編程的過(guò)程中無(wú)論是直接或間接獲得的能力,對(duì)孩子的學(xué)科類(lèi)學(xué)習(xí)和長(zhǎng)遠(yuǎn)發(fā)展都是有益的。
本書(shū)的特點(diǎn)
我發(fā)現(xiàn)目前的編程教育存在一個(gè)問(wèn)題,就是重算法、輕結(jié)構(gòu)。我在大學(xué)從事計(jì)算機(jī)專(zhuān)業(yè)的教學(xué)工作,在工作中發(fā)現(xiàn)這個(gè)問(wèn)題在本科生或研究生寫(xiě)的程序里體現(xiàn)得非常明顯。我曾經(jīng)參與起草由全國(guó)高等學(xué)校計(jì)算機(jī)教育研究會(huì)、全國(guó)高等院校計(jì)算機(jī)基礎(chǔ)教育研究會(huì)、中國(guó)軟件行業(yè)協(xié)會(huì)、中國(guó)青少年宮協(xié)會(huì)4個(gè)團(tuán)體聯(lián)合發(fā)布的《青少年編程能力等級(jí)》中的圖形化編程部分。在那篇標(biāo)準(zhǔn)文件中,我把數(shù)學(xué)思維和結(jié)構(gòu)化思維的培養(yǎng)放在了與算法同等重要的位置。這一思想也貫穿了本書(shū)的撰寫(xiě)過(guò)程。本書(shū)并不是簡(jiǎn)單地讓孩子搭積木玩,也并非止步于了解一下編程的規(guī)則,而是更側(cè)重于計(jì)算思維和編程素養(yǎng)的培養(yǎng),因此更適合于小學(xué)中高年級(jí)的孩子,也適合從事少兒編程教育的從業(yè)者。
什么是計(jì)算思維?
我們生活在一個(gè)數(shù)字世界,軟件和技術(shù)已經(jīng)徹底改變了我們的生活。為了能游刃有余地生活和工作,我們需要了解自己所生活的這個(gè)數(shù)字世界。這就是計(jì)算思維被稱(chēng)為“21世紀(jì)必備技能”的原因,它對(duì)每個(gè)人而言都很重要。學(xué)習(xí)計(jì)算思維對(duì)于了解數(shù)字世界的運(yùn)作方式、利用計(jì)算機(jī)的力量解決棘手的問(wèn)題都至關(guān)重要。它還能幫助我們進(jìn)行批判性的思考,不僅可了解某些技術(shù)的好處,也懂得它們的潛在危害、道德影響或意外后果。
雖然我們?cè)谶@里及前文中多次提及了計(jì)算思維,但究竟什么是計(jì)算思維呢?讓我們來(lái)看看卡內(nèi)基梅隆大學(xué)周以真教授的學(xué)術(shù)定義:
“計(jì)算思維是涉及確切表達(dá)問(wèn)題及其解決方案的思維過(guò)程,使解決方案以一種信息處理代理可以有效執(zhí)行的形式來(lái)表示。”
聽(tīng)起來(lái)夠繞吧?但其實(shí),這只是用高大上的語(yǔ)言來(lái)表達(dá)簡(jiǎn)單的想法。“信息處理代理”是指任何遵循一組指令來(lái)完成任務(wù)(我們稱(chēng)之為“計(jì)算”)的東西。大多數(shù)情況下,這個(gè)“代理”是指計(jì)算機(jī)或其他類(lèi)型的數(shù)字設(shè)備—但它也可以是人!為了使事情變得簡(jiǎn)單,我們將其稱(chēng)為計(jì)算機(jī)。為了以計(jì)算機(jī)可以執(zhí)行的方式表示解決方案,我們必須將它們表示為一步一步的過(guò)程,即算法。為了創(chuàng)建這些算法解決方案,我們應(yīng)用了一些特殊的問(wèn)題解決技能。這些技能構(gòu)成了計(jì)算思維,它們可以遷移到任何領(lǐng)域。
計(jì)算思維同時(shí)借鑒了數(shù)學(xué)思維和工程思維。然而,與數(shù)學(xué)不同的是,我們的計(jì)算系統(tǒng)受到底層“信息處理代理”及其操作環(huán)境的物理限制。因此,我們必須擔(dān)心邊界條件、故障、惡意代理和現(xiàn)實(shí)世界的不可預(yù)測(cè)性。但與其他工程學(xué)科不同,由于我們獨(dú)特的“秘密武器”軟件的存在,在計(jì)算中我們可以構(gòu)建不受物理現(xiàn)實(shí)約束的虛擬世界。因此,在網(wǎng)絡(luò)與數(shù)字世界中,我們的創(chuàng)造力僅受想象力的限制。
計(jì)算思維可以被描述為“像計(jì)算機(jī)科學(xué)家一樣思考”,但它現(xiàn)在是每個(gè)人都需要學(xué)習(xí)的重要技能,無(wú)論人們是否想成為計(jì)算機(jī)科學(xué)家!有趣的是,計(jì)算思維和計(jì)算機(jī)科學(xué)并不完全與計(jì)算機(jī)有關(guān),它們更多地與人有關(guān)。計(jì)算思維的訓(xùn)練甚至可以完全脫離計(jì)算機(jī)而存在!你可能認(rèn)為我們?yōu)橛?jì)算機(jī)編寫(xiě)程序,但實(shí)際上我們是為人編寫(xiě)程序—編寫(xiě)程序的最終目的是幫助人們交流、查找信息和解決問(wèn)題。
例如,我們使用智能手機(jī)上的應(yīng)用程序來(lái)獲取前往朋友家的路線。這個(gè)應(yīng)用程序就是計(jì)算機(jī)程序的一個(gè)例子,而智能手機(jī)是為我們運(yùn)行該程序的“信息處理代理”。那些設(shè)計(jì)計(jì)算最佳路線的算法,以及設(shè)計(jì)交互界面和如何存儲(chǔ)地圖等所有細(xì)節(jié)的人,都應(yīng)用了計(jì)算思維來(lái)設(shè)計(jì)這個(gè)應(yīng)用。但他們?cè)O(shè)計(jì)這個(gè)應(yīng)用并不是為了智能手機(jī),而是為了幫助使用智能手機(jī)的人。
一門(mén)教授計(jì)算思維的課,應(yīng)該教會(huì)學(xué)生以下5個(gè)方面的內(nèi)容。
●描述一個(gè)問(wèn)題。
●確定解決此問(wèn)題所需的重要細(xì)節(jié)。
●把問(wèn)題分解成小的、合乎邏輯的步驟。
●使用這些步驟來(lái)創(chuàng)建解決問(wèn)題的流程(算法)。
●評(píng)估這個(gè)過(guò)程。
事實(shí)上,業(yè)界對(duì)計(jì)算思維有多種定義,但大多數(shù)定義都涉及計(jì)算思維背后體現(xiàn)的解決問(wèn)題所必備的技能。

計(jì)算思維
下面,我列出6種重要的技能。
1.抽象
計(jì)算思維中最重要和最高級(jí)的思維過(guò)程是抽象。抽象的作用是簡(jiǎn)化事物,它賦予我們處理復(fù)雜問(wèn)題的能力。抽象需要確定問(wèn)題最重要的方面是什么,并隱藏我們不需要關(guān)注的其他具體細(xì)節(jié)。我們根據(jù)問(wèn)題最重要的方面來(lái)創(chuàng)建原始事物的模型。然后,我們可以使用這個(gè)模型來(lái)解決問(wèn)題,而不必一次處理所有的細(xì)節(jié)。
抽象用于定義模式、將個(gè)體實(shí)例泛化和參數(shù)化。抽象的本質(zhì)是在個(gè)性中找共性,它識(shí)別出一組對(duì)象共有的屬性,同時(shí)隱藏它們之間不相關(guān)的區(qū)別。例如,算法是一個(gè)過(guò)程的抽象,它接受輸入、執(zhí)行等一系列步驟并產(chǎn)生預(yù)期的目標(biāo)輸出。一個(gè)排序算法既可以對(duì)一組數(shù)排序,也可以對(duì)一組學(xué)生姓名排序。抽象數(shù)據(jù)類(lèi)型定義了一組抽象的值和用于操作這些數(shù)據(jù)的操作,對(duì)使用這些數(shù)據(jù)類(lèi)型的用戶(hù)隱藏了數(shù)據(jù)的實(shí)際表示,這就好比駕駛汽車(chē)的人只需關(guān)心方向盤(pán)、油門(mén)、剎車(chē)等的使用即可,不需要知道內(nèi)部引擎是怎么工作的。
計(jì)算機(jī)科學(xué)家常常在多個(gè)抽象層次上工作。反復(fù)應(yīng)用抽象使我們能夠構(gòu)建越來(lái)越龐大的系統(tǒng)。最底層(至少對(duì)于計(jì)算機(jī)科學(xué)而言)是位(0和1)。在計(jì)算中,我們通常基于抽象層構(gòu)建系統(tǒng),這使我們能夠一次只關(guān)注一層及相鄰層之間的關(guān)系。當(dāng)我們用高級(jí)語(yǔ)言編寫(xiě)程序時(shí),我們不必?fù)?dān)心底層硬件、操作系統(tǒng)、文件系統(tǒng)或網(wǎng)絡(luò)的細(xì)節(jié)。
我們?cè)谌粘I钪薪?jīng)常使用抽象。比如,地圖通過(guò)省略不必要的細(xì)節(jié)(例如公園中每一棵樹(shù)的位置),只保留地圖閱讀器所需要的最關(guān)鍵信息,例如道路和街道名稱(chēng),向我們展示了整個(gè)世界的簡(jiǎn)化版本。
計(jì)算機(jī)一直都在使用抽象對(duì)用戶(hù)隱藏盡可能多的不必要信息。例如,假設(shè)你在上次旅行中拍了一張漂亮的風(fēng)景照片,現(xiàn)在你想在計(jì)算機(jī)上對(duì)它進(jìn)行編輯并調(diào)整其中的顏色。通常我們可以通過(guò)打開(kāi)圖片編輯程序、調(diào)整一些顏色滑塊或選擇過(guò)濾器來(lái)做到這一點(diǎn)。當(dāng)你這樣做時(shí),會(huì)有很多復(fù)雜的操作發(fā)生,而這些操作是計(jì)算機(jī)對(duì)你隱藏的。
你拍的照片在計(jì)算機(jī)上是作為一個(gè)像素陣列存儲(chǔ)的,每個(gè)像素有不同的顏色,每種顏色都用一組數(shù)字表示,每一個(gè)數(shù)字都存儲(chǔ)為二進(jìn)制數(shù)!這將是非常多的信息。想象一下,如果你在調(diào)整顏色時(shí)必須查看每個(gè)像素的顏色值對(duì)應(yīng)的二進(jìn)制數(shù)并更改其中的一部分,那會(huì)不會(huì)崩潰?好在計(jì)算機(jī)為你隱藏了這些信息,因此你不需要知道這些二進(jìn)制信息就能達(dá)成你的目標(biāo)。
2.分解
分解是將一個(gè)復(fù)雜的問(wèn)題分解為更小、更簡(jiǎn)單的部分,然后專(zhuān)注于解決每個(gè)小問(wèn)題。這些更小、更簡(jiǎn)單的問(wèn)題的解決方案組合成了我們最初的大問(wèn)題的解決方案。分解有助于讓大問(wèn)題變得不那么令人生畏!
由于計(jì)算機(jī)需要非常具體的指令,因此分解是創(chuàng)建可在計(jì)算設(shè)備上實(shí)現(xiàn)的算法和過(guò)程的一項(xiàng)重要技能。我們需要告知計(jì)算機(jī)它應(yīng)該遵循的每一個(gè)步驟,才能讓計(jì)算機(jī)幫助我們做事。
例如,制作蛋糕的整個(gè)任務(wù)可以分解為幾個(gè)較小的任務(wù),每個(gè)任務(wù)都可以輕松執(zhí)行。
制作蛋糕
1.烤蛋糕
●將原材料(黃油、糖、雞蛋、面粉)放入碗中
●混合原材料
●將混合的原材料倒入鋁合金模具
●放入烤箱烤30分鐘
●從鋁合金模具中取出蛋糕
2.打發(fā)奶油
3.將奶油涂在蛋糕上
3.算法思維
算法是計(jì)算思維和計(jì)算機(jī)科學(xué)的核心。在計(jì)算機(jī)科學(xué)中,問(wèn)題的解決方案不僅僅是一個(gè)答案,而是算法。算法是解決問(wèn)題或完成任務(wù)的一步步過(guò)程。如果我們正確地遵循算法的步驟,即使對(duì)于不同的輸入,也會(huì)得到正確的答案。例如,我們可以使用算法來(lái)找到地圖上兩個(gè)地點(diǎn)之間的最短路線。相同的算法可應(yīng)用于任何一對(duì)起點(diǎn)和終點(diǎn),因此最終的答案取決于算法的輸入。如果我們知道解決問(wèn)題的算法,那么我們隨時(shí)可以輕松解決這類(lèi)問(wèn)題而無(wú)須思考!我們只需按照步驟操作。計(jì)算機(jī)自己并不能思考,所以我們需要給它們算法,告訴它們?cè)趺醋鍪隆?/p>
算法思維是創(chuàng)造算法的過(guò)程。當(dāng)我們創(chuàng)建一個(gè)算法來(lái)解決一個(gè)問(wèn)題時(shí),我們把創(chuàng)建出的算法稱(chēng)為算法解決方案。算法的構(gòu)成元素相對(duì)較少,因?yàn)橛?jì)算設(shè)備只有幾種類(lèi)型的指令可以遵循。它們可以做的主要事情是接收輸入、提供輸出、存儲(chǔ)值、按順序執(zhí)行指令、根據(jù)分支進(jìn)行選擇和在循環(huán)中重復(fù)執(zhí)行指令。盡管指令的范圍非常有限,卻描述了計(jì)算設(shè)備可以計(jì)算的所有內(nèi)容,這就是為什么我們要將算法描述為僅限于這些元素的過(guò)程。
4.泛化和模式
泛化也被稱(chēng)為“模式識(shí)別和泛化”。泛化是將問(wèn)題的解決方案(或解決方案的一部分)進(jìn)行普適化,以便它可以應(yīng)用于其他類(lèi)似的問(wèn)題和任務(wù)。由于計(jì)算機(jī)科學(xué)中的解決方案是算法,這意味著我們將一種算法變得足夠通用,它就可以解決一系列問(wèn)題。這個(gè)過(guò)程涉及抽象。為了使事物更通用,我們必須剔除與特定問(wèn)題或場(chǎng)景相關(guān)但對(duì)算法的運(yùn)行而言并不重要的細(xì)節(jié)。
發(fā)現(xiàn)模式是這個(gè)過(guò)程的重要組成部分。當(dāng)我們思考多個(gè)問(wèn)題時(shí),我們可能會(huì)認(rèn)識(shí)到它們之間的相似之處,并發(fā)現(xiàn)它們可以用相似的方式予以解決。這被稱(chēng)為模式匹配,也是我們的日常生活每時(shí)每刻在做的事情。
泛化的算法可以被重用,用于解決一組相似的問(wèn)題,這意味著我們可以快速有效地提出解決方案。
5.評(píng)估
評(píng)估涉及找出解決問(wèn)題的多種算法,并判斷哪種算法最好用,它們是否在某些情況下有效但在其他情況下無(wú)效,以及如何改進(jìn)它們。在評(píng)估一個(gè)算法方案時(shí),我們需要考慮一系列因素。例如,這些過(guò)程(算法)求解問(wèn)題需要多長(zhǎng)時(shí)間,它們是否可擴(kuò)展,是否能夠可靠地解決問(wèn)題,或者是否在某些情況下會(huì)以非常不同的方式執(zhí)行。評(píng)估是我們?cè)谌粘I钪薪?jīng)常做的事情,常常,我們還需要用戶(hù)的反饋來(lái)幫助我們改進(jìn)方案。
我們可以通過(guò)不同的方式來(lái)評(píng)估算法。比如,可以通過(guò)在計(jì)算機(jī)上實(shí)現(xiàn)并運(yùn)行算法來(lái)測(cè)試它們的速度;或者可以從理論上分析算法需要的執(zhí)行步數(shù)。我們可以通過(guò)給算法許多不同的輸入并檢查它們是否按預(yù)期工作來(lái)測(cè)試它們是否正確。此時(shí),需要考慮用于測(cè)試的不同輸入。我們并不想檢查每一個(gè)可能的輸入(通常有無(wú)數(shù)個(gè)可能的輸入),但仍然需要確認(rèn)所給出的算法是否對(duì)所有輸入都有效。測(cè)試是計(jì)算機(jī)科學(xué)家和程序員一直在做的事情。但是,因?yàn)槲覀兺ǔo(wú)法測(cè)試所有可能的輸入,所以我們也會(huì)嘗試使用邏輯推理來(lái)評(píng)估算法。
6.邏輯
在嘗試解決問(wèn)題時(shí),我們需要進(jìn)行邏輯推理。邏輯推理是指通過(guò)觀察、收集數(shù)據(jù)、思考,然后根據(jù)已知事實(shí)搞清楚整個(gè)事情的緣由,從而試圖完整地理解事物。
例如,假設(shè)你正在編寫(xiě)軟件來(lái)計(jì)算從你家到某個(gè)位置的最短路線。在地圖上看,如果你從家向北走,到圖書(shū)館需要2分鐘,但如果你向南走,則需要3分鐘才能到達(dá)下一個(gè)十字路口。你可能想知道:如果一開(kāi)始就向南走,去圖書(shū)館是否有更好的路線?顯然,從邏輯上講這不可能,因?yàn)槟阈枰叫?分鐘才能到達(dá)第一個(gè)十字路口。
在更深層次上,計(jì)算機(jī)的運(yùn)行完全建立在邏輯之上。它們使用“真”和“假”,并使用被稱(chēng)為“布爾表達(dá)式”的東西(比如“年齡>5”)在計(jì)算機(jī)程序中做出決定。追蹤程序中的錯(cuò)誤的位置和原因也需要用到邏輯思維。
一個(gè)甜甜圈的例子
最后,以一個(gè)甜甜圈的例子來(lái)形象地說(shuō)明什么是計(jì)算思維。
假設(shè)我們現(xiàn)在有一個(gè)任務(wù),要從商店帶甜甜圈給我們的同學(xué)。我們收集了每個(gè)人的訂單,形成了一張110個(gè)甜甜圈的購(gòu)買(mǎi)清單列表,我們希望在去商店之前計(jì)算出所有甜甜圈的總價(jià)格。計(jì)算思維可以幫助我們更容易地解決這個(gè)問(wèn)題。
我們首先定義問(wèn)題:計(jì)算110個(gè)甜甜圈的總價(jià)格。
看到這個(gè)問(wèn)題時(shí),我們的第一反應(yīng)通常是拿起自己的手機(jī),并將甜甜圈的價(jià)格一個(gè)個(gè)累加起來(lái)。這個(gè)方法可行,卻是一種低效的方法。計(jì)算思維為我們提供了一種更好、更省力的方式。
我們可以將問(wèn)題分解為更小的步驟(分解)。
(1)給出每種甜甜圈的價(jià)格。
(2)給出我們購(gòu)買(mǎi)的每種甜甜圈的數(shù)量。
一旦知道了這兩點(diǎn),就可以計(jì)算出總價(jià)格,下面給出了一個(gè)實(shí)例。
不同類(lèi)型甜甜圈的單價(jià)表:
類(lèi)型A:每個(gè)3.00元
類(lèi)型B:每個(gè)1.60元
類(lèi)型C:每個(gè)2.00元
類(lèi)型D:每個(gè)2.10元
類(lèi)型E:每個(gè)2.15元
按類(lèi)型劃分的甜甜圈數(shù)量:
25個(gè)甜甜圈A,每個(gè)3.00元
30個(gè)甜甜圈B,每個(gè)1.60元
10個(gè)甜甜圈C,每個(gè)2.00元
15個(gè)甜甜圈D,每個(gè)2.10元
30個(gè)甜甜圈E,每個(gè)2.15元
現(xiàn)在,通過(guò)把甜甜圈按照類(lèi)型和數(shù)量有序組織成價(jià)格列表,我們發(fā)現(xiàn)列表中的每一項(xiàng)都遵循相同的模式(發(fā)現(xiàn)模式),這使我們能夠建立一個(gè)公式來(lái)計(jì)算每種甜甜圈的總價(jià)格。
甜甜圈A的總價(jià)格:25個(gè)×3.00元/個(gè)=75元
對(duì)于模式化的數(shù)據(jù)類(lèi)型,可以對(duì)列表中的每一項(xiàng)簡(jiǎn)單地重復(fù)使用這個(gè)公式。
甜甜圈B的總價(jià)格:30個(gè)×1.60元/個(gè)=48元
甜甜圈C的總價(jià)格:10個(gè)×2.00元/個(gè)=20元
甜甜圈D的總價(jià)格:15個(gè)×2.10元/個(gè)=31.5元
甜甜圈E的總價(jià)格:30個(gè)×2.15元/個(gè)=64.5元
最后,我們可以將每種類(lèi)型的甜甜圈價(jià)格相加來(lái)計(jì)算總價(jià)格。
75+48+20+31.5+64.5=239(元)
有了用于解決每個(gè)小問(wèn)題的公式,我們可以抽象出一個(gè)模板,其中包含兩個(gè)計(jì)算價(jià)格的公式。
按類(lèi)型劃分的項(xiàng)目數(shù)×單價(jià)=每個(gè)項(xiàng)目類(lèi)型的價(jià)格
項(xiàng)目A的價(jià)格+項(xiàng)目B的價(jià)格+項(xiàng)目C的價(jià)格+…=總價(jià)格
這個(gè)公式不僅可以用于甜甜圈價(jià)格的計(jì)算,也同樣適用于紙杯蛋糕、冰淇淋、三明治的價(jià)格計(jì)算,當(dāng)然也適用于甜甜圈數(shù)量更多的情況。在消除了最初問(wèn)題中的復(fù)雜性后,這個(gè)公式現(xiàn)在成了一個(gè)易于使用的工具(泛化)。
然后,我們可以進(jìn)一步擴(kuò)展從這一經(jīng)驗(yàn)中獲得的知識(shí),通過(guò)構(gòu)建算法來(lái)確保每次都能獲得可靠的輸出,以便在其他需要計(jì)算的活動(dòng)中復(fù)用它(算法思維)。
第1步:按類(lèi)型添加項(xiàng)目。
第2步:為每個(gè)項(xiàng)目類(lèi)型設(shè)置單價(jià)。
第3步:將按類(lèi)型劃分的項(xiàng)目數(shù)與其單價(jià)相乘。
第4步:將每種類(lèi)型的總價(jià)格加在一起。
我們來(lái)評(píng)估一下這個(gè)方法。首先,它總是可以正確地完成計(jì)算總價(jià)格的任務(wù)。其次,抽象出來(lái)的模板和算法有很強(qiáng)的復(fù)用性。最后,這種方法可擴(kuò)展性較強(qiáng),即按這種方式來(lái)計(jì)算總價(jià)格的速度要遠(yuǎn)遠(yuǎn)快于逐個(gè)相加的方法,特別是在數(shù)量變得越來(lái)越多的時(shí)候(評(píng)估)。
正如這個(gè)小例子所希望展示的那樣,這個(gè)過(guò)程體現(xiàn)了我們解決問(wèn)題方式的轉(zhuǎn)變。通過(guò)公式化的過(guò)程,我們可以駕馭復(fù)雜性并專(zhuān)注于重要的事情,不會(huì)在復(fù)雜性中迷失解決問(wèn)題的方向。盡管這只是計(jì)算思維的一個(gè)簡(jiǎn)單例子,但很明顯,這個(gè)過(guò)程可以被復(fù)制并用于解決大量數(shù)據(jù)的問(wèn)題,并在充滿(mǎn)數(shù)據(jù)的世界中引導(dǎo)未知的旅程。
- 學(xué)校交通安全與教育活動(dòng)(下)
- 萌芽:全國(guó)高考滿(mǎn)分作文精選
- 旭明說(shuō)語(yǔ)文(三)
- 學(xué)生提高作文能力的方法(上)
- 速算巧算快速入門(mén)
- 中國(guó)通史·少年簡(jiǎn)讀版·第5卷:隋唐五代
- 伴隨小學(xué)生成長(zhǎng)的十大音樂(lè)家(小學(xué)生愛(ài)讀本)
- 曲藝趣味活動(dòng)
- 朱自清專(zhuān)集:荷塘月色(美冠純美閱讀書(shū)系·中國(guó)卷)
- 學(xué)生理科學(xué)習(xí)的方法(下)
- 2019年河南省中考英語(yǔ)題庫(kù)(歷年真題+章節(jié)題庫(kù)+模擬試題)
- 綠山墻的安妮
- 語(yǔ)文新課標(biāo)無(wú)障礙閱讀經(jīng)典文庫(kù):駱駝祥子
- 龍騰英語(yǔ):小學(xué)英語(yǔ)必備100主題會(huì)話(huà)1000單詞.句型完全掌握
- 小學(xué)英語(yǔ)誦讀范文精華