洪勛


在人工智能、大數據等新技術迅猛發展的背景下,中小學信息技術課程改革不斷推進,計算思維已成為信息技術學科核心素養之核心。在信息技術學科中,數據、算法、信息系統與信息社會這4個學科大概念所對應的課程內容其側重點有所不同。其中,算法與程序設計課程教學是目前培養計算思維最主要的手段;抽象能力作為計算思維的本質之一,是加強計算思維培養的關鍵;程序流程圖作為描述數據流程的工具,助力學生梳理程序設計思路,讓思維過程可視化,在抽象能力培養過程中起到了重要作用。
● 計算思維與抽象能力的辯證關系
計算思維的本質可概括為抽象和自動化。筆者認為計算思維中的抽象需要用特定嚴格的符號去描述、表示并使其形式化,進而達到機械化執行即自動化的目的。自動化是抽象的目的,而抽象則是自動化的前提和基礎。
抽象是指在對實際復雜問題求解過程中,通過獲取關鍵特征、化簡、降低復雜度等方式,構造出計算機能夠處理的簡單模型。例如,可以將超市里琳瑯滿目的商品抽象成只含有商品編號、生產日期、保質期、單價、折扣信息等若干符號化的屬性對象,將每件商品的計價過程抽象成根據商品的單價和折扣進行自動化累加的過程。
從以上的諸多定義和特點可以發現,抽象作為計算思維中的一個維度,是計算思維不可或缺的環節。抽象能力對于塑造事務模型、重構事務處理流程起著關鍵的作用,培養學生的抽象能力和意識,是發展學生計算思維的重要體現,也是提高學生核心素養的關鍵能力之一。
● 探“尋”:程序設計之思維“盲區”
算法與程序設計教學需要從真實情境出發,通過引導學生經歷發現問題→分析問題→抽象出核心問題→設計算法→編寫程序→運行調試→問題解決等計算機解決問題的一般步驟來培養計算思維能力,并從計算機的基本工作原理出發,將具體的步驟抽象為一般的程序。因此,在程序設計學習過程中抽象能力的剛性要求會讓學生陷入“盲區”,從而成為直接制約計算思維培養的重要因素。
盲區1:語法技能中的算法“模糊化”
很多教師過分注重對一成不變的程序語法結構和規則的機械式程序技能講解,而忽略了對程序邏輯結構以及算法思想的深層次挖掘,學生學習僅限于掌握語法結構。由于抽象思維能力培養不夠,學生很難將復雜問題進行分解建模,無法形成明確的算法思維。例如,在教學“Python枚舉算法”時,列舉“百錢買百雞”“雞兔同籠”等問題只是為了讓學生掌握表達式、常用函數、循環語句等的基本語法和運行規則。在這些問題解決過程中由于學生受抽象能力限制,算法思維比較模糊,計算思維素養不能得到有效滲透。
盲區2:結果追求中的思維“碎片化”
在算法與程序設計教學過程中,多數情況只是讓學生模仿教師給出的參考范例,卻沒有根據整體思維進行問題拆解,并分析每一個子模塊的功能。例如,在“Python的模塊”教學中,學生在處理《猜數字》游戲案例過程中,針對“random”模塊調用、用戶輸入、程序循壞、判斷是否正確等環節,只是獨立、機械式地書寫各個模塊,最后進行簡單的順序調整,并未進行整體考慮與設計,不能形成一條清晰的程序設計解決問題的思維過程。
盲區3:語言轉換中的支架“空白化”
在程序設計教學中,學生思維沒有有效利用可視化工具做支撐,他們在面對一些較復雜的情境問題時,由自然語言直接過渡到程序語言普遍存在較大困難。例如,在《循環結構——for循環》一課中,筆者嘗試以植物大戰僵尸游戲為課堂情境,要求學生輸出植物10次攻擊的隨機攻擊值,并判斷10次攻擊的攻擊總和能否阻擋該橄欖球僵尸(生命值為500)。但在引導學生將實際情景抽象成數學模型時,筆者只用了大量的自然語言簡單描述,未直觀呈現思維加工全過程,導致教學事倍功半,收效甚微。
● 巧借“支架”之燈,點亮“思維”之路
在程序設計教學中,程序是結果,而算法設計才是靈魂。流程圖是有效的可視化工具之一,從問題情境中抽取的對象、指令、模式等通過流程框、輸入輸出框等加以表征,然后使用順序、選擇、循環等結構建構它們之間的關系,實現對同類型問題的抽象與提煉。通過可視化流程圖的繪制、解讀、修改等環節,建立自然語言與程序語句之間的橋梁,將學生隱性的思維過程清晰地呈現出來,幫助學生分析問題、抽象核心問題,建構解決問題的模型,從而能夠順利地設計算法和編寫程序,實現問題的解決,讓思維在編程中可見。
1.抽象問題圖形化,思維聚合 “關聯”性
在程序設計抽象環節,需要分析并找到問題的關鍵。在真實情境問題分析之后,幫助學生將復雜的問題進行分解、簡化,即將現有的問題關聯學生原有的認知結構,找到解決問題的關鍵點,明確解決問題的核心。
例如,在Python中的for循環遍歷應用教學中,采用《讀心術》游戲作為問題情境,依次出示4張卡片,對方只需根據自己的真實生肖情況回答“在”或者“不在”卡片上,就能準確預判出對方生肖。
該問題屬于模擬類游戲,對“抽象”的要求非常高。學生要用程序實現這個讀心游戲,就必須弄清楚該游戲系統中的卡片(抽象出要素)、這些卡片之間有怎樣的關系(要素之間的關系)等問題,通過程序性的思維聚合,與學生已積累的知識和技能(二進制)建立相關認知關聯,明確該問題的核心問題,用可視化方式抽象出模型,形成流程化的問題解決的邏輯序列。
2.抽象語言圖形化,思維理解“簡約”性
隨著學生認知能力的不斷發展,圖形化的方式更加符合學生的認知偏好。因此,學生在問題的分析和解決過程中,將抽象語言圖形化,會使問題的解決更加簡練和準確。程序流程圖在排除多義性和廣義性的同時,能簡潔、濃縮邏輯思維的推理步驟,準確而清晰地表達解決問題的思維,從而實現以簡約的思維理解獲得最佳效果的目標。
例如,在《循環結構——for循環》一課的案例中,一個僵尸穿過院子到達戴夫家會受到植物10次攻擊,攻擊力隨機生成,試問僵尸能否攻入?筆者這樣引導學生建立初步模型:設置一個變量sum記錄10次攻擊的總和;用for循環語句表述10次攻擊,循環變量代表攻擊次數;思考sum的計算應該在循環體內部還是外部進行?判斷僵尸是否死亡又應該在循環體的內部還是外部執行?思考sum的初始值0應該在循環體的內部還是外部賦予?如下頁圖1所示。
問題進一步復雜:每天晚上有12個僵尸試圖進攻戴夫的家,試問是否會攻克?筆者在上一個案例所展示流程圖的基礎上,逐個設問,讓學生逐步完善流程圖:每個僵尸執行流程圖中哪些環節?在哪里判斷僵尸總數超過12?死亡僵尸數在哪里累加?Death的初始值在哪里賦值?從而完成了如圖2所示的流程圖。
3.抽象過程圖形化,思維呈現“動態”性
程序流程圖在運行時體現的是動態可視化,在程序不斷運行過程中,流程圖可以非常清晰地用圖的形式將各種變量值及其邏輯關系呈現給學生。通過抽象過程的動態呈現,學生可以很清楚地了解當前指令的執行狀態,讓計算思維更深入。
例如,在《while循環應用實例》的教學中,筆者采用“五猴分桃”案例,結合學生的學情,大多數會采用一般性解法,即采用變量a作為最后的桃子數,x作為原始的桃子數,通過問題分析得到邏輯表達式:a=((((((x-1)*4/5-1)*4/5)-1)
*4/5-1)*4/5-1)*4/5。對x進行遍歷,同時a也隨著動態變化。若a為整數,則x,a為所求。
然而對于計算機的解決思路,則采用自頂向下的分治策略。
主問題過程思路:①變量x=1;②循環,如果x不能被5個猴子分掉,則執行③;③x=x+1,轉②;④輸出x;⑤結束。
子問題過程思路(x個桃子能否被5個猴子分掉):①循環(5次),每次執行x=x-1,如果x能被5整除,則執行x=x/5*4,否則轉②;②程序結束,返回“假”;③程序成功(5次循環成功結束),返回“真”。
很顯然,基于這樣的文字描述,很難直觀感受整個問題解決的思維過程。而通過流程圖支架則更便于整個過程動態化呈現出來(如圖3)。
在程序動態運行時,可視化思維培養方式非常重要。多重循環又是課程的難點,流程圖使兩重循環的抽象過程完全圖形化,每一個設問都可以作為一個獨立的思維框架添加到流程圖的相應位置。在用流程圖抽象實際問題、構建數學模型時,課堂效果顯著提升,教學目標容易達成,學生在思考程序的動態運行過程時不容易出錯,一舉突破了循環作用的范圍、變量的初始化等重難點。
4.抽象思路圖形化,思維形成“直觀”性
算法與程序設計課程注重培養學生利用計算機解決實際問題的能力,程序流程圖的構建,意味著學生已經從實際問題中提取了有效信息,將問題抽象成了特定符號,建立了一般化的數學模型,找到了解決問題的方法。程序流程圖能夠幫助他們梳理思路,明確解決方案,減少復雜問題所帶來的盲目性,也為后續實現方案的具體程序設計提供指導。
例如,在“Python程序結構while循環”教學模塊中,筆者以繪制多彩的精美圖形為教學情境案例,根據繪制目標,抽象分析案例中背景色、線條的顏色、粗細等要素,形成繪制思路(包含循環體內的思路步驟)。
通過引導學生針對圖形案例直觀分析,形成解決思路。
任務1思路:定義海龜模塊,設置線條屬性及背景;
任務2思路:循環體分別為四種顏色的線條繪制:①i%4==0,繪制紫色;②i%4==1,繪制黃色;③i%4==2,繪制紅色;④i%4==3,繪制藍色。(如圖4)
當程序代碼調試出現錯誤時,又可借助直觀的流程圖來修改代碼編寫中的錯誤,避免了學生漫無目的地做嘗試。
● 行動實踐:人人卷入,“圖”育素養
基于《循環結構——for循環》一課的教學內容,筆者給出例題1的標準代碼,要求學生編寫應用型例題2和提高練習的程序。將流程圖融入到課堂中,讓學生圍繞真實情境進行抽象、建模,引導學生用流程圖對抽象內容進行設計、實現、驗證和遷移,以此來探究流程圖對程序設計學習的影響。
例題1:一個僵尸穿過院子到達戴夫家會受到植物10次攻擊,攻擊力隨機生成,試問僵尸能否攻入?例題2:問題進一步復雜,每天晚上有12個僵尸試圖進攻戴夫的家,試問是否會攻克?提高練習:一周有7天,每天都有12個僵尸來襲,每個僵尸會受到10次植物的攻擊,試問戴夫的后院一周有幾天會被僵尸攻克?
1.橫向對比,區分抽象能力
筆者在兩個平行班分別采用不同的方式教學實踐,A班采用正常流程圖進行授課,B班采用自然語言簡單描述作為鋪墊。通過采集學生用編程解決問題的過程,得出結論:受限于代碼調試能力,兩個班級能編寫代碼并調試完成例題2的學生并不多;但是統計前兩項“邏輯正確”的人數,用流程圖教學的A班有30人,遠遠超過用自然語言教學的B班。A班中甚至還有5位學生在完成了例題2之后,繼續修改例2的流程圖,并利用該流程圖完成了提高練習,可見流程圖對于提升學生的抽象能力、提高解決問題的速度都大有裨益。
2.縱向對比,重現抽象能力
鑒于B班的教學效果不佳,筆者在B語言描述的鋪墊基礎上,也采用了流程圖對學生進行抽象能力訓練。通過評價量規,發現學生在問題解決和思維遷移上都有了很大的提升。課后要求學生填寫調查問卷并統計了結果,得出學生在理解程序邏輯結構過程中,抽象能力、建模能力都得到了充分體現。由此可知,程序流程圖對學生進一步理解for循環語句作用顯著。
通過教學實踐,課堂體驗解決實際問題的方法和思維,進一步驗證了基于可視化程序流程圖的計算思維培養教學方式的有效性,學生計算思維能力得到發展,解決問題能力有所增強。
● 實踐總結
筆者通過實踐明確,借助流程圖的可視化方式能有效地加強學生對程序設計解決問題的思維理解,在提升學生抽象思維能力的同時展現了問題解決過程中主題元素之間的邏輯關系和演繹過程。學生在真實情境下復雜的程序設計變得有跡可循,程序思維可見。
在中學的算法與程序設計課程體系中,教師對知識點的傳授、程序語法的講解相對比較到位,但容易忽略對學生求解問題能力的培養,而這恰好是提升學生核心素養的關鍵點之一。程序設計課程不應該為了編程而編程,而應該重視將實際問題概括、抽象成特定符號,建立一般化的數學模型,再利用計算機具備的強大運算、存儲能力找到解決辦法的能力。在這個過程中,程序流程圖確實能夠起到事半功倍的效果,引導學生以計算思維的視角認識和思考日新月異的信息社會,并做出更加信息化的判斷,有效提升計算思維水平,提升學生的信息技術核心素養。