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