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

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

關(guān)鍵問(wèn)題 解決方案確定查找范圍 用條件判斷確定上、下限范圍用循環(huán)反復(fù)改變查找范圍待查范圍里中間值與待查結(jié)果值進(jìn)行比較確定范圍里的中間值中間值與待查數(shù)據(jù)進(jìn)行比較結(jié)果輸出中間值與待查數(shù)據(jù)相等,查找成功,輸出相應(yīng)位置上限值大于下限值,查找失敗
步驟3:請(qǐng)學(xué)生利用教具,構(gòu)建二分查找算法的沙盤化流程圖。

圖2 學(xué)生探究沙盤化流程圖
案例3:建模流程圖——運(yùn)用遞推算法求解爬樓梯問(wèn)題
在活動(dòng)階段,通過(guò)動(dòng)畫形式幫助同學(xué)們理解爬樓梯問(wèn)題的原理:到達(dá)第n 級(jí)臺(tái)階的方法種數(shù)=到達(dá)第n-1 級(jí)臺(tái)階的方法種數(shù)+到達(dá)第n-2 級(jí)臺(tái)階的方法種數(shù)。如何通過(guò)圖示來(lái)表達(dá)層與層之間的關(guān)系,幫助學(xué)生建構(gòu)算法的模型?教師利用建模圖,幫助學(xué)生理清算法中各變量之間的關(guān)系。如圖3所示。

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

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

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