王榮良 華東師范大學(xué)
算法是大學(xué)計(jì)算機(jī)專業(yè)的核心課程。算法學(xué)習(xí)的主要內(nèi)容有算法策略(如窮舉、貪心、分治、回溯)、算法實(shí)例(如查找、排序、遍歷、哈希以及基于隊(duì)列、堆棧、二叉樹、圖等數(shù)據(jù)結(jié)構(gòu)的具體算法)、關(guān)于算法復(fù)雜性的分析。
《普通高中信息技術(shù)課程標(biāo)準(zhǔn)(2017年版)》指出,一個(gè)具備計(jì)算思維的學(xué)生,必須具備三方面的特征:①在信息活動(dòng)中能夠采用計(jì)算機(jī)可以處理的方式界定問題、抽象特征、建立結(jié)構(gòu)模型、合理組織數(shù)據(jù);②通過判斷、分析與綜合各種信息資源,運(yùn)用合理的算法形成解決問題的方案;③總結(jié)利用計(jì)算機(jī)解決問題的過程與方法,并遷移到與之相關(guān)的其他問題解決中。據(jù)此可知,掌握算法是計(jì)算思維的三大必備要求之一。
小學(xué)五年級(jí)課標(biāo)算法模塊關(guān)于計(jì)算思維的要求是:通過生活中的實(shí)例,了解算法的特征與效率;能用自然語言、流程圖等方式描述算法;知道解決同一問題可能會(huì)有多種方法,認(rèn)識(shí)到采用不同方法解決同一問題時(shí)可能存在時(shí)間效率上的差別。例如,可以采用“煎蛋算法”作為小學(xué)生計(jì)算思維培養(yǎng)的學(xué)習(xí)材料:A同學(xué)每天早上要煎三個(gè)雞蛋作為早餐,每煎一個(gè)雞蛋需要2分鐘,鍋里最多可同時(shí)煎兩個(gè)雞蛋,請(qǐng)問煎蛋最少需要用時(shí)幾分鐘?可選擇的答案分別是:A、2分鐘;B、3分鐘;C、4分鐘;D、6分鐘。
如何才能最大限度地實(shí)施計(jì)算思維的培養(yǎng)?下面,筆者回歸計(jì)算思維的本源,考察計(jì)算思維對(duì)應(yīng)的計(jì)算機(jī)學(xué)科以及計(jì)算思維是如何支持解決該學(xué)科的根本問題的。
計(jì)算機(jī)學(xué)科是研究計(jì)算機(jī)的設(shè)計(jì)、制造和利用計(jì)算機(jī)進(jìn)行信息獲取、表示、存儲(chǔ)、處理、控制等理論、原則、方法和技術(shù)的學(xué)科。計(jì)算機(jī)學(xué)科的根本問題是關(guān)于可計(jì)算問題的研究,或者說是解決計(jì)算機(jī)進(jìn)行問題求解的可行性,即什么能被有效的自動(dòng)化。可計(jì)算問題通??梢杂靡环N抽象的形式系統(tǒng)即計(jì)算模型來刻畫。這里的計(jì)算模型并不是指在靜態(tài)或動(dòng)態(tài)數(shù)學(xué)描述基礎(chǔ)上所建立的求解某一個(gè)問題計(jì)算方法的數(shù)學(xué)模型,如圓面積或者BMI指數(shù)之類的計(jì)算公式,而是具有狀態(tài)轉(zhuǎn)換特征,能夠?qū)λ刑幚韺?duì)象的數(shù)據(jù)或信息進(jìn)行表示、加工、變換、接收、輸出的數(shù)學(xué)機(jī)器。
在計(jì)算機(jī)學(xué)科,存在這樣一條定律:一個(gè)問題,當(dāng)它的描述及其求解方法或求解過程可以用構(gòu)造性數(shù)學(xué)描述,而且該問題所涉及的論域?yàn)橛懈F的,或?yàn)闊o窮但存在有窮表示時(shí),那么這個(gè)問題一定能用計(jì)算機(jī)求解;反之,凡是能用計(jì)算機(jī)求解的問題,也一定能對(duì)該問題的求解過程數(shù)學(xué)化,而且這種數(shù)學(xué)化是構(gòu)造性的。因此,一個(gè)問題在判明為可計(jì)算的性質(zhì)后,從具體解決這個(gè)問題考慮,必須按照可構(gòu)造的特點(diǎn)與要求,給出實(shí)際解決該問題的具體操作,同時(shí)還必須確保開銷成本是能夠承受的。
所以,計(jì)算機(jī)學(xué)科的根本問題可以用兩個(gè)關(guān)鍵詞來表述——“可計(jì)算”和“構(gòu)造”,即在計(jì)算機(jī)科學(xué)理論的基礎(chǔ)上判定問題是否可計(jì)算,并且可以運(yùn)用由其學(xué)科理論所支持的技術(shù)來構(gòu)造可計(jì)算。計(jì)算思維作為計(jì)算機(jī)學(xué)科思維,在支持人們通過構(gòu)造計(jì)算模型以及構(gòu)造具體的操作步驟判定可計(jì)算從而實(shí)現(xiàn)自動(dòng)化的工作中,具有重要的作用。
分析“煎蛋算法”教學(xué)案例,可以發(fā)現(xiàn),盡管經(jīng)歷了問題分析,也提出了煎蛋的操作步驟,但學(xué)生的關(guān)注重點(diǎn)在于完成煎蛋最短時(shí)間是3分鐘還是4分鐘,其煎蛋步驟的設(shè)計(jì)是為最短3分鐘服務(wù)的,可以說這只是一個(gè)數(shù)學(xué)問題。只有當(dāng)學(xué)生的關(guān)注點(diǎn)集中在算法步驟的有效構(gòu)造上,才能夠一步一步地完成全部的煎蛋工作,其煎蛋步驟的構(gòu)造是為自動(dòng)化服務(wù)的,這就凸顯了“可計(jì)算”和“構(gòu)造”。
設(shè)想一下,如果是一項(xiàng)為機(jī)器人編制煎蛋程序的教學(xué)工作,要求用程序控制機(jī)器人完成煎3個(gè)雞蛋的任務(wù),并且還可以通過程序優(yōu)化環(huán)節(jié)實(shí)現(xiàn)在最短的3分鐘時(shí)間內(nèi)完成煎蛋任務(wù),那么必然要求引導(dǎo)學(xué)生思考算法,并在機(jī)器人或計(jì)算機(jī)上構(gòu)造算法操作步驟,從而實(shí)現(xiàn)煎蛋的自動(dòng)化。由這個(gè)案例可見,用程序描述算法與用自然語言或流程圖描述算法有不一樣的效果,編程教學(xué)在計(jì)算思維培養(yǎng)中有獨(dú)特的優(yōu)勢(shì),其特點(diǎn)在于構(gòu)造工作是在計(jì)算機(jī)環(huán)境下實(shí)現(xiàn)的,明確需要運(yùn)用計(jì)算機(jī)學(xué)科思維方法,其過程對(duì)于學(xué)生而言也是具體的、可體驗(yàn)的。
計(jì)算源于數(shù)學(xué),對(duì)可計(jì)算的樸素理解,就是能用一張紙和一支筆做有限次運(yùn)算就可以完成的計(jì)算。隨著數(shù)學(xué)中許多計(jì)算問題得到解決以及不可計(jì)算問題的不斷積累,許多科學(xué)家認(rèn)識(shí)到發(fā)展計(jì)算模型,研究最一般問題可計(jì)算的重要性。20世紀(jì)30年代是計(jì)算模型研究取得突破性進(jìn)展的時(shí)期,哥德爾、丘奇、圖靈等科學(xué)家提出了一批計(jì)算模型。其中,以圖靈機(jī)的特點(diǎn)和性質(zhì)更接近普通人計(jì)算的思想方法,從而被現(xiàn)代計(jì)算機(jī)系統(tǒng)的開發(fā)者所采納。
如果說計(jì)算模型是采用形式系統(tǒng)的方法對(duì)計(jì)算這一概念的刻畫,那么,算法就是對(duì)計(jì)算過程步驟或狀態(tài)的一種刻畫,是計(jì)算方法的一種能行性實(shí)現(xiàn)??捎?jì)算理論證明,凡是能用算法解決的問題,也一定能用這些計(jì)算模型解決,反之,這些計(jì)算模型解決不了的問題,任何算法也解決不了。
所謂程序,是一種事先編制好的、具有特定功能的指令序列。程序編制依據(jù)的是預(yù)先設(shè)計(jì)的算法,這些算法可以是已經(jīng)存儲(chǔ)于程序編制者大腦之中的,也可以是已經(jīng)用流程圖或其他形式準(zhǔn)確描述的。在計(jì)算機(jī)學(xué)科中,一般而言,對(duì)于任何一個(gè)問題,如果有了解決該問題的算法,就可以編制相應(yīng)的程序。程序是可計(jì)算問題的最終落實(shí)。
計(jì)算模型、算法、程序構(gòu)成了有關(guān)可計(jì)算問題從抽象到具象的線索。計(jì)算思維作為計(jì)算機(jī)學(xué)科思維,支持研究者對(duì)計(jì)算模型、算法、程序的研究與應(yīng)用。同時(shí),開展計(jì)算模型、算法、程序的研究與應(yīng)用也是計(jì)算思維培養(yǎng)的有效途徑。
分析計(jì)算模型、算法、程序這一線索可以發(fā)現(xiàn),對(duì)計(jì)算模型的認(rèn)識(shí)與理解,以及對(duì)抽象的算法認(rèn)識(shí)與理解,需要有比較強(qiáng)的認(rèn)知能力和數(shù)學(xué)基礎(chǔ)。因此,針對(duì)計(jì)算機(jī)學(xué)科的初學(xué)者,尤其是中小學(xué)生,簡單化的算法和操作性強(qiáng)的程序是計(jì)算機(jī)學(xué)科入門級(jí)的學(xué)習(xí)內(nèi)容,也是普及計(jì)算思維的途徑。
分析“煎蛋算法”教學(xué)案例,可以發(fā)現(xiàn),該案例表面上是算法問題,但因?yàn)槟繕?biāo)問題是求最少時(shí)間,所以該問題就轉(zhuǎn)化為一個(gè)數(shù)學(xué)問題,或者是用數(shù)學(xué)方法解決運(yùn)籌學(xué)方面的問題,其實(shí)施過程中可能需要用到算法工具,但教學(xué)的重點(diǎn)已不是算法思想。這是生活化的算法在教學(xué)中經(jīng)常面臨的問題。盡管算法教學(xué)應(yīng)該強(qiáng)調(diào)每一個(gè)的操作步驟,但如果沒有經(jīng)歷過程序?qū)崿F(xiàn),仍然缺少體驗(yàn)自動(dòng)化這一計(jì)算思維的重要環(huán)節(jié)。
對(duì)此,有教師認(rèn)為,在開展算法教學(xué)時(shí)應(yīng)該采用自然語言、流程圖描述算法,這樣在算法教學(xué)中就可以不受編程語言的干擾,只要最后采用程序驗(yàn)證學(xué)生設(shè)計(jì)的算法,就能達(dá)到教學(xué)目標(biāo)。其實(shí)這已經(jīng)陷入了悖論,因?yàn)樽罱K由學(xué)生實(shí)施用程序驗(yàn)證算法,學(xué)生還是需要學(xué)習(xí)具體的編程語言用來表達(dá)算法。如果為了不學(xué)習(xí)編程語言而將驗(yàn)證工作全部由教師代勞,那么學(xué)生就無法感受真實(shí)的驗(yàn)證。
計(jì)算模型、算法、程序這一線索從抽象到具象反映了采用計(jì)算機(jī)求解問題的邏輯路徑。計(jì)算思維的培養(yǎng),依據(jù)認(rèn)知規(guī)律,應(yīng)該是從具象到抽象理解這一邏輯路徑,最終在大腦中形成計(jì)算模型。一個(gè)具備計(jì)算思維的人,能夠在大腦中運(yùn)用建立的計(jì)算模型運(yùn)行程序或算法或操作序列,即先行于計(jì)算機(jī)在大腦中運(yùn)行,并且能夠?qū)⒄_的執(zhí)行步驟與要求準(zhǔn)確表達(dá)與構(gòu)造,從而實(shí)現(xiàn)用計(jì)算機(jī)求解問題。
從簡單到復(fù)雜、從具象到抽象是學(xué)習(xí)的一般規(guī)律。隨著年齡的增長、認(rèn)知水平的提高、計(jì)算機(jī)學(xué)科教學(xué)的不斷深入,學(xué)生對(duì)計(jì)算模型的理解也會(huì)越來越全面。初學(xué)者掌握了編程工具,在大腦中建立的計(jì)算模型會(huì)是一個(gè)能夠運(yùn)行程序的相對(duì)具象的思維模型。
由Robert Sedgewick等編寫的《算法》一書指出,采用Java編程語言來學(xué)習(xí)算法的原因是:①程序是對(duì)算法精確、優(yōu)雅和完全的描述;②可以通過運(yùn)行程序來學(xué)習(xí)算法的各種性質(zhì);③可以在應(yīng)用程序中直接使用這些算法。相比用自然語言描述算法,這些是重要而巨大的優(yōu)勢(shì)。
考察高校計(jì)算機(jī)專業(yè)教學(xué)對(duì)中小學(xué)開展計(jì)算機(jī)學(xué)科教育有一定的啟示。大部分高校計(jì)算機(jī)專業(yè)都在大學(xué)一年級(jí)開設(shè)程序設(shè)計(jì)基礎(chǔ)課程,其目的為:①能夠使專業(yè)初入門者直觀感受計(jì)算機(jī)自動(dòng)化的工作原理,為理解抽象的計(jì)算機(jī)學(xué)科思想方法做心理建設(shè);②掌握一種學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)、編譯原理等計(jì)算機(jī)學(xué)科后續(xù)課程的學(xué)習(xí)工具,因?yàn)檫@些課程的學(xué)習(xí)內(nèi)容都涉及編程。
在后續(xù)課程中,涉及的算法有可能會(huì)用偽代碼甚至直接用自然語言描述,而不使用具體的編程語言。但由于學(xué)生已經(jīng)有了編程基礎(chǔ),他們?cè)趯W(xué)習(xí)這些算法的時(shí)候,可以用自己大腦中建立的計(jì)算模型運(yùn)行這些算法。“在大腦中運(yùn)行”正是計(jì)算思維的關(guān)鍵素養(yǎng)。與此同時(shí),上述課程一般都會(huì)將編程實(shí)現(xiàn)作為作業(yè)要求學(xué)生在課后完成。
采用特定的編程語言學(xué)習(xí)算法,存在的明顯缺陷是將算法思想從具體編程語言實(shí)際細(xì)節(jié)中分離變得困難。Robert Sedgewick教授在《算法》一書中采取的策略是使用Java的一個(gè)子集,而這個(gè)語句子集只使用了大多數(shù)現(xiàn)代編程語言都能充分描述算法所必需的語法。
在基礎(chǔ)教育開展編程教學(xué)的實(shí)踐中,已經(jīng)出現(xiàn)了不少解決此類問題的策略與方法,其中,圖形化、積木式編程平臺(tái)可以在一定程度上避免學(xué)生對(duì)編程語句細(xì)節(jié)的機(jī)械記憶與過多關(guān)注。并且,編程積木塊功能的學(xué)習(xí),本身就是在形象化地學(xué)習(xí)程序執(zhí)行流程,即算法的分支、循環(huán)結(jié)構(gòu)。在這樣的編程平臺(tái)上,用形象的積木塊拼接來表達(dá)學(xué)生可以理解的生活事件的執(zhí)行流程,并且可以直接運(yùn)行,其具體、直觀的特點(diǎn),符合低齡學(xué)生的學(xué)習(xí)要求。
受早期編程教育的影響,仍有一些教師將編程教學(xué)與程序員培訓(xùn)等同,從而排斥編程教學(xué)的作用。開展編程教學(xué)不是程序員培訓(xùn),也不單是為了方便理解算法,重要的是體會(huì)實(shí)現(xiàn)程序運(yùn)行的過程原理,讓學(xué)生在面對(duì)問題解決時(shí),厘清思路、方法與手段,并規(guī)劃好步驟,一步一步地完成任務(wù)本身,以此形成一種類似于計(jì)算機(jī)程序工作中的流程,形成一種思維方式,從而提高學(xué)生在解決問題過程中的思維邏輯性。
第一,算法教學(xué)與計(jì)算思維的關(guān)系問題。目前學(xué)界對(duì)計(jì)算思維的定義仍然存在爭議,而在中小學(xué)計(jì)算思維教育實(shí)踐中,是否應(yīng)該把算法學(xué)習(xí)的全部內(nèi)容都?xì)w類為計(jì)算思維培養(yǎng),甚至把計(jì)算思維教育等同于計(jì)算機(jī)學(xué)科知識(shí)學(xué)習(xí),是一個(gè)值得探討的問題。隨著算法教學(xué)中大量生活算法的引入,其算法策略與方法都是來源于生活常識(shí)或數(shù)學(xué)等其他學(xué)科。正如同隨著教育數(shù)字化轉(zhuǎn)型,數(shù)字化學(xué)習(xí)的普及,學(xué)生數(shù)字化學(xué)習(xí)能力培養(yǎng)渠道也普及化一樣,計(jì)算思維概念外延的不斷擴(kuò)大,隨之而來的是眾多學(xué)科都成為計(jì)算思維培養(yǎng)的陣地。不否認(rèn)其他學(xué)科的學(xué)習(xí)以及學(xué)生年齡增長、認(rèn)知水平提高對(duì)計(jì)算思維的養(yǎng)成有貢獻(xiàn),但計(jì)算思維培養(yǎng)的主渠道是什么,應(yīng)該發(fā)揮怎樣的作用非常值得思考。
第二,在算法教學(xué)中使用流程圖表征算法的問題。流程圖是一種思維可視化的工具,長期以來廣泛應(yīng)用于中小學(xué)的算法教學(xué)。正因?yàn)槭且环N思維表達(dá)工具,學(xué)生應(yīng)該能夠運(yùn)用流程圖在短時(shí)間內(nèi)有效表達(dá)思想。但在教學(xué)實(shí)踐中,流程圖繪制規(guī)范的要求明顯增加了學(xué)生思維表達(dá)的負(fù)荷,限制了學(xué)生思維的發(fā)展。另外,有些算法,或者面向?qū)ο蟪绦?,用常?guī)的程序流程圖表示并不合適。從一些教師調(diào)研的結(jié)果來看,確實(shí)有不少學(xué)生是將待解決的問題在大腦中直接形成用程序表征的算法,并且可以“在大腦中運(yùn)行”。重新定義流程圖在算法教學(xué)中的地位以及探究其使用策略,以促進(jìn)學(xué)生思維發(fā)展也是值得思考的。
第三,如何讓中小學(xué)生喜歡算法學(xué)習(xí)的問題。義教數(shù)學(xué)課標(biāo)把“對(duì)數(shù)學(xué)具有好奇心和求知欲,了解數(shù)學(xué)的價(jià)值,欣賞數(shù)學(xué)美,提高學(xué)習(xí)數(shù)學(xué)的興趣”列為課程總目標(biāo)值得借鑒。學(xué)生的內(nèi)在驅(qū)動(dòng)力是發(fā)掘?qū)W生潛力、實(shí)現(xiàn)學(xué)生自我價(jià)值的必要因素。只有當(dāng)學(xué)生具有內(nèi)在驅(qū)動(dòng)力時(shí),學(xué)習(xí)才是高效和高質(zhì)量的。因此,為學(xué)生創(chuàng)造積極的學(xué)習(xí)體驗(yàn),鼓勵(lì)學(xué)生保持好奇心,通過創(chuàng)造表達(dá)自己是激發(fā)學(xué)生內(nèi)在驅(qū)動(dòng)力的重要途徑。
正如Robert Sedgewick教授所說,程序是對(duì)算法精確、優(yōu)雅和完全的描述。如果受硬件裝備或其他因素制約,學(xué)生無法上機(jī)編程操作,那么開展紙上談兵式的算法教學(xué),則是一種無奈的選擇。計(jì)算思維教育最基礎(chǔ)的目標(biāo),是讓學(xué)生體驗(yàn)、理解、實(shí)際應(yīng)用、遷移這樣的觀點(diǎn):在大腦中建立計(jì)算模型,在大腦中先行設(shè)計(jì)算法并運(yùn)行正確,然后明確告訴計(jì)算機(jī)每一個(gè)操作步驟,使計(jì)算機(jī)能夠機(jī)械地自動(dòng)化執(zhí)行。