陳凱 上海市位育中學
在頭腦中想象有兩頭大象正緩慢而又莊嚴地走過,這似乎并不是什么特別困難的事情,然后,集中注意力,把內心的目光聚焦在大象的腿上,假設將大象邁出任意一側的腿的動作視作1步,并幻想這樣的場景,當一頭大象邁出3步的時候,另一頭大象恰好邁出4步,雖然步數不同,但它們經過的距離是一致的。
要精準地構想出上述場景,的確是有較大困難的,很多人甚至很難想象一頭大象具體行走時腿的動作變化。相信隨便觀看一段大象行走的視頻,都遠勝于下面的文字解釋,但這里還是盡量解釋一下:大象先邁出某一側后腿,當這一側后腿看上去即將要踩到同一側的前腿時—當然這并不會發生,前腿往前邁出,相隔很短的時間,這一側后腿才著地,也就是說,在某一時刻,大象一側的兩條腿是騰空的,接著,這一側前腿著地,以上稱為1步,然后,就是換另一側腿按同樣動作前進。雖然花費了不少文字來描述,但總是不可能由這些文字精準地還原出大象行走的過程,語言文字的抽象難以完整地反映整個客觀事實,只是提供了一些關鍵性特征的描述。
這里有一道簡單的數學題:設有兩只大象A和B,A大象邁出3步的距離與另一只B大象邁出4步的距離均為t,且走過t距離路程所消耗的時間也是一致的,問A大象邁出第n步時,B大象邁出了多少步?考慮A大象每一步的距離是t/3,n步的距離就是n*t/3,B大象每一步的距離是t/4,則可以看出B大象邁的步數是(n*t/3)/(t/4),公式可以進一步簡化為n*(4/3),計算結果自然有可能存在小數,只要取整即可。在做數學題時,不用去考慮大象本身,也不用考慮大象行走的具體過程,這種提取出事物中數量關系并建立數學語言的表征的方法,顯然就是一種數學上的抽象。這里的問題是,假設某人編寫了一段程序,由用戶輸入變量值n,程序自動計算后得出并打印結果,這個過程中有沒有體現出計算思維的抽象?
關于數學抽象,《普通高中數學課程標準(2017年版2020年修訂)》指出:“數學是研究數量關系和空間形式的一門科學。數學源于對現實世界的抽象,基于抽象結構,通過符號運算、形式推理、模型構建等,理解和表達現實世界中事物的本質、關系和規律……數學抽象是指通過對數量關系與空間形式的抽象……獲得數學概念和規則,提出數學命題和模型,形成數學方法與思想,認識數學結構與體系。”[1]我們可以從中很清晰地看出數學學科中抽象的對象、抽象的目標以及作為抽象結果的表征符號。除了數學,其他學科的方法中也涉及抽象,雖然說不同學科中“抽象”的含義本身是相同的,但抽象的對象和目標是不同的。以物理學科為例,關于物理學科的抽象,是“從物理學視角對客觀事物的本質屬性、內在規律及相互關系的認識方式,是基于經驗事實建構物理模型的抽象概括過程”[2],“理想化模型來源于實際的事物,是將實際事物的某些物理性質或物理性質的變化在一定條件下理想化而得到的抽象”[3]。可以看出,雖然說數學和物理的抽象都面向現實世界,但數學關心的是數量關系和空間形式,數學模型可以超越現實、獨立于真實的物理現實而存在(不妨想象一個物理現實與當前世界完全不同的異世界的數學定律是否和當前世界一致)。大衛·呂埃勒(David Ruelle)說:“數學自身構成一個有意義的、自然的結構。”[4]戈丁(LarsGarding)說:“為了理解周圍的世界,人們總是把自己的觀察及思想組織成概念的體系,我們把這些概念體系稱為模型,數學模型在邏輯上是首尾一貫的……數學的對象顯然是抽象的觀念,邏輯是最后判斷正誤的標準。”[5]而物理學關心的是對自然界的最合理描述,也就是尼爾斯·玻爾(Niels Bohr)所說的“我們能對自然說些什么”。
關于數學或物理學的抽象,對于抽象的對象、目標以及作為抽象結果的表征符號,各家觀點還是比較清晰和一致的。那么,計算思維的抽象到底有怎樣的獨特性?周以真教授倡導的培養計算思維的課程的一項目標是“像計算機科學家那樣思考”,她認為“計算思維是利用計算機科學的基本概念,進行的問題解決、系統設計、人類行為理解等一系列涵蓋計算機科學之廣度的思維活動……像計算機科學家一樣思考不僅僅意味著能夠為計算機編程,它需要在多個抽象層次上進行思考”。[6]董榮勝認為“計算思維的重點在于計算機科學中的不同抽象層次的‘自動有效進行’”。[7]這些說法提示了抽象具有層次性,同時也存在讓人困惑的地方,如數學問題的解決也往往需要在多個或不同的抽象層次上進行思考,所以說僅僅看“在多個抽象層次上進行思考”這一點,未必體現計算思維的特點。這里需要弄清楚的問題是,所謂的抽象層次到底是什么層次,抽象層次間的關系又可能是怎樣的。
盧西亞諾·弗洛里迪(Luciano Floridi)給出過一個簡單卻值得深思的例子:“你詢問一輛二手車的價格,得到的回復是5000,那么你是否能知道車的價格呢?”在不同語境下,是否能成功判斷價格的情況有所不同,原因是數字后沒有單位,在某些特定的語境下,數字的單位作為不必要的細節被舍棄掉了。而在更復雜的情況下,就需要在數字后加上單位,比如英鎊,于是抽象的層次就發生了變化。[8]盧西亞諾·弗洛里迪認為,數字加上單位后到達了“正確的抽象層次”(筆者認為不加單位也不能視為錯誤的抽象層次,而是一種更加抽象的抽象),這個層次錨定了一個基于規則的、易于執行和控制的情境。這個例子的啟發是,當談論計算思維的抽象是什么的時候,需要問其錨定的是什么樣的情境。
回到先前的問題,問當A大象邁出第n步時,B大象邁出了多少步?假設直接將原始的數學公式轉換為Python程序代碼來解決大象漫步的步數問題,程序因變量t未被賦值而無法運行,如圖1所示。

圖1
顯然,變量t的值是多少,絲毫也不影響計算結果,但既然表達式中有t,計算機就會追問t到底是什么。為了解決這個問題,有兩個辦法,比較常見的是在列出表達式時就將t約掉,但這樣其實就是人工地進行了公式的變換。另一個不太常見的辦法是,隨便給t賦一個值(只要不是零),程序就能正常運行了,如圖2所示。這個例子其實顯現出計算機科學中的一種抽象所對應的情境是如何使自動化過程能行。

圖2
所以,從大象漫步問題的提出到數學公式的列出,這個過程主要體現數學上的抽象,而編寫成可執行的程序語言,是對數學抽象層次上的又一次抽象。然而問題是,由于高級語言與日常及數學語言過于接近,所以當數學的表征符號和計算機的表征符號具有相當程度的相似性時,反而難以顯著地體現出計算思維抽象的特點。來看這樣的表述:“計算思維就是將所研究的問題抽象表示為形式化、程序化和機械化的對象,成為可以用于機器做批處理的對象,這種抽象也就是計算思維的精髓。”[9]將數學表達式轉化為程序語言表達式,雖說的確也算是將問題抽象成為可以用于機器做批處理的對象,但這個過程中所做的主要是數學表征符號向程序語言表征符號的變換,那個機械化的對象本身是在場的,除此以外,我們在許多情況下還需要考慮那個機械化對象本身并不在場且等待著將要被構建成為具有實施批處理能力的機械(或虛擬的機械)的狀況。這里試著舉一個更容易理解的例子,借助枚舉算法編寫程序解決一個可以用枚舉法來解決的問題,與綜合運用循環結構、分支結構、變量等構建出一個枚舉算法的程序來解決一個可以用枚舉法來解決的問題,這兩者抽象的對象和目標是不同的。
有很多來自基礎教育階段的一線教師對計算思維中抽象作用的看法是相似的(這里暫且將筆者的看法排除在外),如認為“學生根據老師的引導,把問題模型抽象成算法描述,然后形成程序達到自動化”[10]“把具體問題進行抽象,轉換成計算機能夠識別的符號或對象”。[11]值得一提的是,許憬對數學解題過程中的抽象與運用計算機解題過程中的抽象的區別做了比較詳細的分析,關于計算機解題過程中的抽象,認為“在解決問題過程中,我們需要從事物的描述中梳理和抽象出可以控制執行的若干條規則,并且將這些規則轉換成計算機可以理解的表達形式”。[12]不過與此形成對照的,是根據文獻資料,來自一些大學教師關于計算思維中抽象的作用的討論,往往集中在對計算機硬件或軟件系統的構建上,如“抽象思維的本質是運用分析、判斷、推理、比較等方式抽取事物本質或共性的思維。對計算機系統資源的抽象,使用戶不必了解下層實現細節……”[13]“計算機系統的運行過程,將動態電子事件組合,用程序設計語言文本化表示,常見的各種形式化程序設計語言都是類似的抽象工具……”[14]“形式化表達有不同的層次……從外向內,從人向計算機,每一層次的形式化表達都可以向內層轉換,每一層向內層的轉換都需要經歷抽象和形式化”。[15]可見,即便都提及計算思維的抽象,錨定的情境往往是不同的,情境之一是將現實問題抽象成以計算機系統可實現的方法,在現有的抽象層次上解決自動化問題,更關心的是計算機系統的能行的問題。情境之二是某個可執行計算的環境本身是需要等待被構建,計算系統本身是其他層次的軟硬件系統抽象的結果,抽象層次本身的架構需要經歷抽象和形式化的過程,其更關心的是如何使系統能行的問題。例如,一段含有乘法和除法的表達式可以是數學表達式在計算機程序語言環境中抽象的結果,同時,這個語言環境也是更底層更復雜的機器指令抽象的結果。筆者注意到,2010年7月在西安交通大學舉辦的首屆“九校聯盟(C9)計算機基礎課程研討會”發文提出,“計算機科學基礎理論研究實際上是基于抽象級環境(如圖靈機)的問題求解,計算機硬件體系的設計與研究則是一種指令級的問題求解,程序設計是基于語言級的問題求解活動,系統軟件設計與應用軟件設計則是一種系統級的問題求解……計算思維的本質特征是基于不同層次計算環境的問題求解……是基于計算模型(環境)和約束的問題求解”。[16]這其實就闡述了抽象具有多樣性,某些問題的解決涉及抽象級環境本身架構的問題。這對基礎教育階段的計算思維培養的教學設計給出了一條值得關注的線索,不同層次抽象的共同情境是基于計算模型(環境)和約束的問題求解。
到目前為止,基礎教育階段的教學案例的資料在提及計算思維的抽象時,所引用的案例絕大部分都屬于在現有的抽象層次上解決自動化問題,對抽象級環境本身架構的問題的討論是相當有限的。為了讓教學設計更能體現出計算思維方面的抽象能力的培養,可以從有意設定約束條件,改造抽象級環境入手,之所以是改造而不是直接利用某些知名的抽象級環境如圖靈機,是為了便于學生能夠借助已有的知識和能力實現相對平滑的遷移。仍然以大象漫步問題為例,給出一個不甚成熟的改造,規定學生在使用程序語言表達式時,不能運用乘法和除法運算,在這樣受到限制的環境中,思考如何解決計算大象步數的問題。
解決的方法有很多種,如可以用加法和減法來模擬乘法和除法,如圖3代碼所示,或者直接用計數的辦法對兩頭大象的步伐進行模擬,上頁圖4所示的代碼給出了模擬大象步伐計數的計算方法,當然,也可以很方便地擴展代碼使之成為可以任意設定大象步數的更一般性的解法,前者是對數學運算過程進行模擬,后者是對大象步伐行為本身進行模擬。兩種方法都體現出形式化表達向內層轉化的特點,被轉化的結果可以進一步被封裝成為抽象的模塊,供高一層次的系統調用。

圖3

圖4
在現實情況中,基礎教育階段的學生很可能對計算機軟硬件系統底層原理的認識不夠深入,且較難領會諸多抽象的計算模型的運行原理,在這樣的情況下,不僅可以要讓學生體驗特定抽象層次上的自動化的實現,還可以試著讓學生體驗在計算模型(環境)受約束的情境下,抽象層次本身架構的實現需要經歷的抽象和形式化的過程,這可能是一個值得深入探索的方向。