劉曉梅 張鳳鳳 杭州市富陽區職業教育中心
編程語言只是一種在特定情境下讓計算機執行某種操作的實現工具。隨著時代的發展,編程語言不斷涌現,計算機程序員需要具備不斷學習新的編程語言的能力,而這種能力來源于程序員對計算機編程思想(俗稱算法)的理解和掌握,即具備了編程思維。編程思維絕不是對算法的生搬硬套,而是對同一個問題提出多種解決方案,并構建最佳路徑的能力。但在教學過程中,筆者發現中職學生缺少編程思維。面對程序,他們常常死記硬背代碼,而不是理解算法的真正含義,于是題目稍加變動,就會無從下手。隨著知識的增多,背代碼顯然會增加學生的學習負擔,使其產生畏難情緒、抵觸心理。更重要的是,隨著時代發展,編程語言日新月異,沒有形成編程思維的學生是無法完成知識的更新,難以適應計算機技術的飛速發展。
因此,筆者認為對程序語言的教學中,學生編程思維的培養是教學的重中之重。筆者在python 語言的教學過程中,積極思考編程思維培養的關鍵要素,嘗試將CDIO 工程教育理念融入課堂,構建編程思維的培養路徑,創新課堂教學方法,推動學生從學知識到用知識,幫助學生學會思考,善于思考,勇于思考,逐漸建立編程思維。
編程思維是指一種高效解決問題的思維方式。它并不是編寫程序的技巧,而是一種能在頭腦中快速分解問題,并用計算機語言來實現的思維過程。對《python 語言》的學習來說,編程思維主要體現在對排序、窮舉、遞歸等基本算法的理解和運用。具體地,筆者將編程思維能力歸納為思源、思徑、思異、思辨四個能力要素的體現,即理解算法來源,知道算法實現邏輯,會用不同途徑的程序實現算法,能在不同場景下應用算法。
依據編程思維能力要素,筆者在編程思維培養的路徑構建過程中借鑒了CDIO 工程教育模式。CDIO 工程教育模式包含構思(Conceive)、設計(Design)、實現(Implement)和運作(Operate)四個方面的內容。把產品開發的整個過程融合成一個項目,強調項目完成過程中學生的主動參與性,課程體系之間的相關性。CDIO 教育模式符合中職計算機專業python 教學項目教學的基本思想。
基于CDIO 教育模式,以培養學生編程思維能力思源、思徑、思異、思辨四要素為目標,在程序語言的教學過程中立足于對實際應用項目需求的解決,在項目實施過程中,通過知原理、建模型、調代碼、試應用四個教學環節訓練和建構學生編程思維。知原理即激活學生的思維,探究解決問題的本源;建模型即通過邏輯模型縷清解決問題路徑;調代碼即用編程語言實現邏輯模型,分析解決問題的方法,優化實現問題的過程;試應用即能夠在不同使用場景中,快速辨別應用的算法,并整理解決問題的方案。

圖1 編程思維培養的路徑構建
培養編程思維的過程應該遵循學生認識和思維的發展規律,依托學生已有知識體系,逐步構建由抽象思維到程序化思維的轉變,進而形成編程思維。基于CDIO 教學模式的編程思維培養路徑,以活動激活舊知、以建模表述理論、以編碼實現邏輯,以應用完成內化。四個環節一脈相承,緊密相連,即符合學生認知過程,也符合學生思維發展。
學生對于編程的恐懼常是因為不理解算法的原理,對學生來說算法原理晦澀難懂,對教師來說難以表達,學生通常霧里看花,知其一卻不知其二。筆者認為讓學生能夠知原理,是學習編程語言的基礎和關鍵,過程中應基于學生原生認知,從生活中取材,采用游戲、動畫、圖片、軟件、頭腦風暴等多種形式的活動來直觀展示算法的運行過程,幫助學生學習和理解。
案例1:游戲中學算法——二分查找算法之原理分析
環節一:玩游戲
此環節采用游戲活動,讓學生通過玩猜數字游戲體會二分查找算法的原理。游戲玩法如下:兩個同學一組,甲在0-100之間選擇一個數字,請乙猜,每次給出大了或者小了的提示,直至乙猜到數字,用時最短的小組獲勝。
環節二:描述游戲通關法寶
學生游戲過程中,會發現每次猜中給定范圍區域內的中間值,通過中間值確定數字,猜數的次數最少,速度最快。
環節三:引入二分查找算法核心思想
教師在學生描述游戲通關法寶的基礎上,總結二分查找算法的原理:通過查找范圍的中間值與待查數字相比較以確定以一次查找范圍。
教師再將學生游戲過程用賦值動畫的形式展示給學生,此時學生對抽象的賦值動畫一看即懂,為后面的建模做充分準備。
實踐表明,游戲活動使抽象枯燥的原理變得立體易懂,激活了學生的學習熱情,讓學生感受到了沉浸式學習的樂趣。使過去很多教師認為只可意會不可言傳的算法思想變為可玩、可思,大大降低了學生學習的難度。
通過上一環節的活動,學生已經能理解算法的原理,但此時,頭腦中的原理是具體的、非程序化的,無法直接用程序化的語言代碼表達出來,這就需要借助流程圖或建模圖等形式將文字化的原理轉變成為程序化的思維。該環節教師需要引導學生將操作分塊,轉變為流程清晰的流程圖或建模圖,幫助學生建構邏輯思維。
案例2:沙盤流程圖——二分查找算法之流程圖建構
通過上一環節的學習,學生表述出二分查找算法的原理:在一個有序列表中,將表中間位置記錄的值與查找值相比較,如果兩者相等,則查找成功;否則利用中間位置將表分成前、后兩個子表,如果中間位置記錄的值大于查找值,則繼續查找前一子表,否則查找后一子表。重復以上過程,直到找到滿足條件的記錄,即查找成功。當設定的下邊界值大于上邊界值時,則查找不成功。
環節四:沙盤模擬
流程圖可以形象直觀的展示算法實現的操作流程,幫助學生掌握分析問題和解決問題的方法,但是中職學生編程基礎薄弱,直接讓學生在紙上畫出流程圖,難度較大,筆者采用“拼流程圖”的形式,讓學生以貼代畫、以選代答。
步驟1:教師首先需預先給出流程圖所用符號的含義和功能表。引導學生快速記憶。
步驟2:引導學生將二分查找算法的步驟進行細化和拆分,提煉出若干個關鍵問題。

關鍵問題 解決方案確定查找范圍 用條件判斷確定上、下限范圍用循環反復改變查找范圍待查范圍里中間值與待查結果值進行比較確定范圍里的中間值中間值與待查數據進行比較結果輸出中間值與待查數據相等,查找成功,輸出相應位置上限值大于下限值,查找失敗
步驟3:請學生利用教具,構建二分查找算法的沙盤化流程圖。

圖2 學生探究沙盤化流程圖
案例3:建模流程圖——運用遞推算法求解爬樓梯問題
在活動階段,通過動畫形式幫助同學們理解爬樓梯問題的原理:到達第n 級臺階的方法種數=到達第n-1 級臺階的方法種數+到達第n-2 級臺階的方法種數。如何通過圖示來表達層與層之間的關系,幫助學生建構算法的模型?教師利用建模圖,幫助學生理清算法中各變量之間的關系。如圖3所示。

圖3 為爬樓梯問題建模圖
虛線框①、虛線框②、虛線框③、虛線框④清晰地呈現了遞推運算的過程,而且每一個虛線框內的圖形結構完全相同,說明可以設計循環代碼,實現自動重復每個虛線框內的運算過程。
建模環節有效修補了傳統教學中從具體思維直接進入代碼編程環節的思維斷層,流程圖和建模圖可以幫助學生理清算法原理,使頭腦中的經驗思維可視化、流程化,降低了編碼編寫的難度,有效克服中職學生的代碼編寫的畏難心理。
通過構建模型圖,學生已經進一步建立了結構化程序的基本概念,但把思維模型轉換為具體的編碼需要學生具備較扎實的語言知識基礎。筆者在教學過程中,通過程序填空、程序改錯等方法,由淺入深,由易到難引導學生建立語法的概念,逐步完善代碼編寫。程序填空聚焦知識難點,降低操作難度,重建學生自信。
案例4:程序填空識語法重點
根據二分查找算法流程圖,讓學生用該算法來解決實際問題,在有序列表中[2,4,8,13,14,15,18,20]中,查找在鍵盤上輸入的任意數字,返回查找結果。

圖4 根據流程圖進行程序填空
案例5:大家來找茬探究運行過程
環節一:布置任務
學生構建了爬樓梯問題的建模圖之后,筆者設計了“大家來找茬”競賽環節,找出并修改程序中錯誤,使程序能夠正常運行,并實現特定功能。
運用遞推算法求解爬樓梯問題。假設一段樓梯共有6 級臺階,小明一步最多能上2 級臺階,那么小明走完這段樓梯一共有多少種方法?
環節二:修改代碼
學生采用小組學習法,調試修改代碼,并展示講解代碼修改的方法。教師根據學生答題情況給予指導。
程序思維的形成需要學生大量地閱讀他人編寫的優秀代碼,但對初學編程的學生而言,閱讀代碼的難度較高,學生常望而卻步,而“大家來找茬”的形式非常適合中職學生的學情,既能降低代碼閱讀難度,引領學生形式閱讀代碼的習慣。錯誤點的設置緊緊圍繞學生的易錯點,疑難點,通過代碼訂正,有效幫助學生加深理解和記憶,同時,培養學生自主調試程序的能力。
知識的遷移是編程思維形成的重要體現。讓學生能夠本身觸類旁通、由此及彼,構建出學科的知識鏈、問題鏈和方法鏈。筆者在教學中注重分析知識與知識之間的內在聯系,培養學生舉一反三的能力,并對接程序設計崗位需求,從實際應用出發,引入真實的案例,讓學生嘗試運用所學知識解決實際問題。
案例6:最值與排序
求最大值問題:在跳水比賽中,有5 個評委評分,通過程序求出5 個評委中的最高分,并將最高分放到最前面。
學生在學習最值算法后,可以用單層循環實現在列表中找到最大值,并存到列表中第一個位置。
教師引問:如何求其余4 個評委中的最高分,并將其放到前數第二個位置?此時學生可以模仿最值算法將第二大的值放到列表中第二個位置。
教師追問:以此依推,每次求出其余評委中的最高分,并將其放到相應的位置?觀察程序之間的關系?能否將程序進行整合?
學生在完成教師提出的問題過程中,很容易發現程序的核心程序都是相同的,由于每次求最值的位置不同,所以循環控制變量不同。可以利用循環嵌套來整合程序,進而得出排序程序。
最值算法是選擇排序算法的一次運行結果,此時由此及彼的講解選擇排序算法,學生更容易理解。循序漸進的完成代碼編寫,挖掘算法之間的內在聯系,更有效地幫助學生形成知識體系,提高程序表達能力,實現知識遷移。
案例7:在python 中實現網站的用戶登錄界面功能
1.項目需求:運行登錄界面程序,通過鍵盤上輸入正確的用戶名和密碼,會顯示“歡迎登錄”提示;用戶名輸入錯誤,則會提示“用戶名不存在,請重新輸入”,如果用戶名錯誤輸入次數超過3 次,則程序結束;密碼輸入錯誤,會提示“密碼輸入錯誤,請重新輸入”,如果輸入錯誤密碼次數超過3 次,則程序結束。
2.關鍵問題及解決方法分析:

學生在教師的引領下分解項目開發過程中需要解決的關鍵問題及解決方法。雖然學生已經基本掌握了二分查找算法原理和程序編寫,但并不能靈活地應用到實際需求中,因此,筆者在教學過程中,注重對學生問題分解和尋找問題方法的能力培養。
3.分層實現
學生分別完成三個層次的任務,分別為“利用二分查找法在二維列表中查找用戶名”“在二維列表中查找用戶名對應的密碼”“控制用戶名和密碼的查找次數”。三個任務均完成后即完成項目功能。
三個任務對應項目完成的三個階段,逐層深入。同學們可以根據自己的能力選擇完成任務,完成任務后,由各組派代表展示相應代碼,并講解代碼編寫方法和相關知識,力爭每一個都學生都能在課堂上根據自己的能力學到盡量多的知識。
編程思維培養是教師創新教學方式的切入點。計算機程序教學絕對不是單純的知識點講解,而是一種邏輯思維的構建和創新思維的培養。這需要教師首先要具有創新的教學理念,積極地運用數字化的教學資源、信息化教學手段、生活化的教學活動使抽象的原理、隱性的運行過程直觀呈現。
編程思維培養是學生職業道路發展的奠基石。筆者通過編程思維培養路徑的探索和嘗試,激發了學生python 程序語言學習興趣,不再談編程而色變,學生通過參與活動,逐步構建編程思維,并涌現出一批python 程序設計的愛好者。在“2021年中等職業學校師生職業能力大賽”的“python 程序設計”項目中,所任教的學生中有4 人在市級競賽中獲獎,5 人在區級競賽中獲獎,為他們的專業發展建立良好的開端。
同時,編程思維的培養不是一蹴而就的,需要教師堅持以學生為主體,找準學生思維的卡點,精準施教,同時通過豐富的教學活動和有效的激勵機制建設,讓學生能夠保持學習的熱度。筆者將在教學實踐中繼續探索教學資源整合和開發,更好地服務于學生進行編程思維的訓練。