李 暾,劉萬偉,毛曉光
(國防科技大學 計算機學院,湖南 長沙 410073)
試圖在36或48學時將計算機專業4年的知識,傳授給非計算機專業的學生,是目前大學計算機基礎課程面臨的主要挑戰與問題。這些知識涵蓋了計算機工作原理(從三極管到云計算)、如何使用計算機(常用計算機軟件的使用),以及計算機專業面臨的問題(數據結構、算法效率等)。歸納而言,課程內容面面俱到,以背誦知識和工具操作為主,使得該課程難以滿足各專業和大學新生的要求。作為一門通識課程,大學計算機基礎課程正在經歷從傳統計算機基礎知識傳授向計算思維能力培養轉型,國內外高校教師對這類課程進行了很多有益的嘗試[1-6]。
為適應新工科以及計算機教指委[7]對本課程的要求,在仔細分析各專業對計算機技術的需求后,我們認為,大學計算機基礎課程教學應更加關注如何發揮計算的能力解決問題,而不應過多強調太專業的計算機科學知識。具體而言,即培養學生利用計算思維創造工具解決其專業學習中的問題。
針對目前存在的問題,亟須將課程內容轉換到以計算思維培養為核心上來。這種轉換面臨著如下幾個問題:首先,教學內容如何安排,即以什么為主線來組織內容,而不是泛泛地介紹計算思維的概念、計算思維是什么不是什么。其次,實踐體系如何構建,使學生能在實踐中潛移默化地形成計算思維能力。最后,如何在各類約束下開展教學內容的改革,這些約束主要來自于學生,例如,大一新生幾乎沒有計算思維的背景知識,也幾乎沒有其所在專業的專業知識。
為此,首先要分析挖掘計算思維的核心能力,然后圍繞核心能力的培養組織教學內容和實訓體系。具體而言:①在計算思維核心能力方面,內容組織上應是運用計算思維解決具有一定難度的問題,并能將這種技能遷移到學生未來專業的學習與問題求解中;②在計算思維的實踐上,選擇一門易于入門,且能快速掌握的程序設計語言進行實踐;③在實訓體系設計上,遵循的原則是實訓案例需基于學生知識背景結構設計,實訓案例問題的解決不需要太復雜的計算機科學專業知識。
對計算思維的教學,不要糾纏于計算思維是什么、不是什么等概念上的辨析,而是以能力培養為中心,將知識點轉換為核心能力。我們認為,計算思維核心能力主要包括邏輯思維、算法思維、分解、泛化與模式歸納、建模、抽象和評估,下面逐一進行簡單介紹。
邏輯思維(Logical Thinking)和算法思維(Algorithmic Thinking)都是計算思維的核心概念,處于非常重要的地位。從高層次看,算法構建于邏輯之上,邏輯給出了推理的規則,而算法將規則集成起來,基于規則推理的結論執行某些動作(序列)。對本門課程而言,邏輯主要涉及命題邏輯(命題及邏輯聯結詞)、自然語言表達的命題的符號化,以及將邏輯表達式轉化為某種程序設計語言表達式的方法。我們認為,在本階段對算法的要求應集中于算法是動作序列,這些動作序列帶有一些特定的性質(輸入、輸出、明確性、有限性和有效性)。
由于計算思維通常用于解決大型復雜問題,而由于人每次能處理的問題規模有限,對大型復雜問題,分解是必需的。更進一步,分解是一種系統化的方法,遵循分解的原理和步驟,幾乎總能將問題持續簡化,直至找到解決方法。
求解的問題多了,會發現有些問題之間具有相似性,相似性會導致問題的解中有些元素是重復出現的,或解中有些元素是類似的。仔細考察這些相似性,找出解決方案中的相似性,歸納出普適解決方案,這就是計算思維核心能力中的模式歸納。模式歸納有一些通用的規則,通過觀察解決方案中重復出現的名詞(對應著操作對象)、動詞(對應著操作)、形容詞和具體數值(對應著可被替換的性質)等,可對解決方案進行改進,歸納出循環、子過程和規則。
抽象對問題求解有非常大的作用,它聚焦于求解問題相關的細節,而避免無用細節的干擾。抽象包含兩個方面的含義:第一個方面指的是舍棄事物的非本質特征,僅保留與問題相關的本質特征;第二個方面指的是從眾多的具體實例中抽取出共同的、本質性的特征。這是兩種不同的操作。
對抽象出來的結果,建模是用另一種方式對其進行描述,包括其靜態的屬性和動態的行為,利用邏輯思維和算法思維,可以在建模的基礎上構建出計算的解。針對大一新生的知識背景,選用ER圖作為靜態建模的工具,以有限狀態機作為動態建模的工具。前者在引入實體的方法后,就與面向對象設計方法無縫銜接,而后者可以描述大部分計算思維問題求解產物的行為特性,具有普遍意義。
最后一個核心能力是評估,即在得到問題的解后,進一步考察解,以確保解是正確的、高效的、優雅的、可用的。這個核心能力重點培養學生在各種指標之間平衡的思維方式,即要想在解決方案中兼顧各種指標,很難做到每個指標都是最優的,需要進行權衡,在各指標間進行折中。
在上述計算思維核心能力的指導下,形成培養計算思維的教學內容[8-9]和實訓體系[1-2]。實訓的設計原則包括:①基于學生知識結構構建案例,案例來源于有現成公式的數學和物理問題,以及本門課程學習的計算機基礎知識點。選擇后者的出發點是將計算機科學中的問題為案例進行研究和求解,體驗初步的計算思維解決專業學習問題,并希望學生能將這種方法遷移到今后各自的專業學習中,解決專業領域的問題。②案例的求解不需要太復雜的計算機科學專業知識,即不涉及復雜算法和復雜數據結構。這是為了減輕學生利用計算思維求解問題所需的背景知識,能盡快開始實踐,解決中學課程涉及的以及日常生活中遇到的具有一定難度的問題。③一定要讓每個案例都涉及若干個計算思維核心能力的培養。解決任何一個問題都不只涉及一種計算思維核心能力,而是多種核心能力共同作用的結果。這是為了在有限時間內最大化實訓效能,使學生體驗更多的核心能力組合模式。
我們選用的實訓語言是Python,具體的實訓體系如表1所示。實訓體系分為8個模塊,每個模塊包含3~5個實訓,每個實訓包含4~5個實訓習題,每個實訓涵蓋若干個計算思維核心能力。采用層層遞進、逐漸提高難度的方式組織實訓與編制實訓習題,使得學生在實訓過程中盡早建立信心。

表 1 計算思維實訓體系
以“馮諾伊曼體系結構建模與模擬”實訓為例,該實訓以課程中計算機工作原理為案例,通過構建給定指令集的馮諾伊曼計算機模擬器,一方面可使學生深入理解所學知識,另一方面可開展計算思維核心能力的實踐訓練。針對給定的指令集,構建其模擬器涉及的計算思維核心能力訓練如表 2所示。
在該實訓下,安排了3個實訓習題,第一個是以面向過程的實現具有10條簡單算術運算指令的計算機的模擬器,第二個是將該機器以面向對象編程技術再次實現,第三個是一個有16條算術、邏輯、跳轉指令的計算機的模擬器實現。

表 2 計算思維核心能力在馮諾伊曼體系結構模擬器實訓中的體現

表 3 計算思維核心能力反思表
將實訓與課程內容相結合,具體應用時,先讓學生利用各種解題方法完成實訓作業,這些方法可能不是計算思維核心能力相關的方法。此后,要求學生對完成的實訓進行回顧,對照計算思維核心能力進行反思,對完成的實訓習題進行重構和改進。我們發現,計算思維核心能力概念性的講授,在學生沒有切身體會時,收效甚微。而實踐后再對照反思,效果明顯。表3列出了一些反思內容,請注意這些內容不是一成不變的,會隨著學生的進步有所深化。
本實訓體系部署近兩年以來,支撐了本校兩個年級2 000余學生的大學計算機基礎課程實訓,以及40余所高校3批次70余名老師的導教活動;已有3萬余人次使用,用戶來自國內外幾十所院校和科研院所,被十余所國內高校相關課程的實踐所采納。
針對大學計算機基礎在計算思維培養方面面臨的問題,我們提出了通過計算思維核心能力培養為主的教學內容與實訓體系教改,著重介紹了實訓體系建設、應用方法及應用效果。實訓體系的建設是一個持續改進的過程,未來,針對用戶的反饋,將在增加實訓案例的基礎上,不斷改進現有實訓,使得實訓的組合更加靈活、評測更合理。