楊金英
編程教育是發(fā)展新時(shí)代競(jìng)爭(zhēng)力最重要的舉措之一,編程教育除了一直在大學(xué)、職業(yè)學(xué)校發(fā)展,在中小學(xué)也從未缺席,但如何培養(yǎng)學(xué)生的編程思維與創(chuàng)新能力,如何讓編程成為一種文化,是需要我們加強(qiáng)探討的問題。本期解碼,讓我們從梳理編程教育可能存在的文化脈絡(luò)的視角,發(fā)現(xiàn)編程教育的深層內(nèi)涵與文化形成。
以信息奧賽為代表的編程競(jìng)賽多年以來培養(yǎng)了一大批計(jì)算思維突出、編程興趣濃厚的優(yōu)秀學(xué)生,許多人已成長(zhǎng)為IT界的領(lǐng)軍人物?;仡櫠嗄甑男畔W賽發(fā)展,不少教師積累了許多針對(duì)計(jì)算思維訓(xùn)練的方法,沉淀了獨(dú)特的編程教育文化,為中小學(xué)編程教育的推廣積累了經(jīng)驗(yàn)。在中小學(xué)推廣編程教育,入門教學(xué)尤其值得深入研究??偨Y(jié)已有編程教育經(jīng)驗(yàn),可以為編程教育推廣提供借鑒與參考。
● 信息奧賽中編程學(xué)習(xí)的三個(gè)階段
信息奧賽編程主要涉及算法與數(shù)據(jù)結(jié)構(gòu),重點(diǎn)考查在有限時(shí)間內(nèi)解決實(shí)際問題的編程能力,屬于對(duì)計(jì)算思維要求較高的編程比賽。其學(xué)習(xí)過程可分為三個(gè)階段,即計(jì)算機(jī)基礎(chǔ)知識(shí)和編程語言學(xué)習(xí)的初級(jí)階段、算法與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)的中級(jí)階段、高級(jí)算法與數(shù)據(jù)結(jié)構(gòu)的高級(jí)階段。學(xué)生通過算法與數(shù)據(jù)結(jié)構(gòu)的深入學(xué)習(xí)與研究,在有限的時(shí)間與空間要求下,不斷創(chuàng)新思路,優(yōu)化算法,提高編程解決現(xiàn)實(shí)問題的能力,對(duì)計(jì)算思維的能力要求隨學(xué)習(xí)難度的提高而逐步提高。隨著學(xué)習(xí)階段的推進(jìn),不同學(xué)生會(huì)表現(xiàn)出較大差異,出現(xiàn)不斷分化或中途退出的現(xiàn)象。那么,良好的計(jì)算思維有哪些特征?如何發(fā)現(xiàn)學(xué)生的計(jì)算思維潛質(zhì)?在教學(xué)中又如何引導(dǎo)和培養(yǎng)呢?
● 什么是微觀察
在實(shí)踐中,微觀察通常有兩種理解:一是觀察細(xì)致入微,一些事件的微小細(xì)節(jié)都能被觀察得清清楚楚;二是從細(xì)小事件的觀察角度來看大事件。本文所說的微觀察是借鑒第一種理解,然后將其運(yùn)用在編程教學(xué)中,即通過觀察學(xué)生在編程學(xué)習(xí)過程中的一些細(xì)微表現(xiàn),恰當(dāng)分析并判斷學(xué)生的思維特征的方法。對(duì)教師來說,在教育教學(xué)中注重對(duì)學(xué)生的行為、習(xí)慣、思維、能力等進(jìn)行細(xì)微觀察,發(fā)現(xiàn)不同學(xué)生的差別與特點(diǎn),能幫助教師尋找更好的教育切入點(diǎn),尋求更恰當(dāng)?shù)慕逃龝r(shí)機(jī),從而提高教育效率,增強(qiáng)教育效果。
● “微觀察”學(xué)生思考過程,助推思維形成
在實(shí)踐中,如何理解計(jì)算思維及其具體特征,如何分析學(xué)生的思維特征并發(fā)現(xiàn)計(jì)算思維的發(fā)展?jié)撡|(zhì),如何有效引導(dǎo)并培養(yǎng)學(xué)生的計(jì)算思維能力,都是基礎(chǔ)編程教學(xué)需要重視的問題。通過一些具體問題的解決思路,可以顯性觀察學(xué)生的思維過程,初步分析學(xué)生的思維特點(diǎn),進(jìn)而理解計(jì)算思維特征,發(fā)現(xiàn)學(xué)生的計(jì)算思維潛質(zhì),以便在教學(xué)中更好地引導(dǎo)和培養(yǎng)。
1.思維的邏輯性
編程的本質(zhì)是利用計(jì)算機(jī)程序解決現(xiàn)實(shí)問題。因而,如何將現(xiàn)實(shí)問題轉(zhuǎn)為化程序需要的數(shù)據(jù)模型,如何分析數(shù)據(jù)并歸納出數(shù)據(jù)間的相互關(guān)系,如何尋找恰當(dāng)?shù)乃惴ㄌ幚斫o定的數(shù)據(jù),尋求合理的解決方法,都需要有良好的思維邏輯性,需要有條理清晰的計(jì)算思維。
例:已知a、b、c、d、e、f、g七個(gè)人中,a會(huì)講英語,b會(huì)講英語和漢語,c會(huì)講英語、意大利語和俄語,d會(huì)講漢語和日語,e會(huì)講意大利語和德語,f會(huì)講俄語、日語和法語,g會(huì)講德語和法語。能否將他們的座位安排在圓桌旁,使得每個(gè)人都能與他身邊的人交談?如果可以,請(qǐng)以“a b”開頭寫出你的安排方案:? ? ? ? ? 。
微觀察:例中算法是搜索,如果增加人數(shù),增加相互制約的條件,則對(duì)思維的邏輯性要求明顯提高,解決該題需要在思考中條理清晰,才得出正確的結(jié)果。觀察學(xué)生對(duì)這類題目的思考過程,分析學(xué)生的歸納與分析能力,幫助學(xué)生發(fā)現(xiàn)其思維的邏輯性潛質(zhì),從而在教學(xué)中加強(qiáng)問題分析的引導(dǎo),以不斷提升其思維的邏輯性。
2.思維的縝密性
編程是把現(xiàn)實(shí)問題交給程序解決,編程時(shí)忽略的微小問題很可能導(dǎo)致結(jié)果顛覆,甚至在未來開發(fā)中帶來重大的信息安全事故。因而編寫程序必須考慮各種細(xì)節(jié),避免留下BUG(漏洞)。
例:觀察圖形——○●○●●○●●●●○●●●●
●●●●○……前200個(gè)珠子中有多少個(gè)黑色的?(請(qǐng)寫出你的分析思路)
微觀察:例中珠子的排列規(guī)律明顯,但在具體計(jì)算時(shí),正向思路是黑珠求和,逆向思路是總數(shù)減白珠,而正向思路和逆向思路的思維特征表現(xiàn)并不相同,計(jì)算難度也不同。最容易出錯(cuò)的點(diǎn)是很多學(xué)生容易漏掉第一個(gè)白珠。漏掉白珠的問題,在思維特征表現(xiàn)上都屬于縝密性不夠。教師如果觀察到學(xué)生存在思維縝密性問題,就要在教學(xué)中引導(dǎo)學(xué)生注重細(xì)節(jié),有意識(shí)地加強(qiáng)思維縝密性訓(xùn)練,從而不斷改善思維的品質(zhì)。
3.思維的靈活性
編程是把人的解決方法用程序語言教給計(jì)算機(jī)。盡管現(xiàn)實(shí)問題復(fù)雜多變,但計(jì)算機(jī)仍可運(yùn)用程序中的算法思路解決問題、計(jì)算數(shù)據(jù)。好的算法可以提高問題解決的效率,減少時(shí)間和空間的占用,優(yōu)化相應(yīng)的結(jié)果答案。因而,尋找高效、恰當(dāng)?shù)乃惴?,是程序員最重要的工作,好的算法才能有好的程序。靈活的思考方式、創(chuàng)新的思維能力是優(yōu)秀程序員的必備思維品質(zhì),定勢(shì)思維則是發(fā)展的制約因素。
例:猴王準(zhǔn)備了一堆桃子。周一時(shí)猴王把一半數(shù)量的桃子拿出來分給大家,有只調(diào)皮的小猴子吃完后嫌不過癮,趁大家不注意偷偷多吃了一個(gè)桃子;周二時(shí)猴王又把剩余的桃子數(shù)拿出一半分給大家,小猴子一看第一天沒有發(fā)現(xiàn),就再次偷吃了一個(gè),以后每天如此……可是到了星期六早上,猴王一看只剩一個(gè)桃子在面前,根本沒法分了,很是尷尬。問最初共有多少個(gè)桃子?(寫步驟)
微觀察:學(xué)生大多用解方程的第一種做法(如圖1),這是易想難解的順推法;少數(shù)學(xué)生會(huì)用簡(jiǎn)便的倒推法(如圖2)。對(duì)比容易發(fā)現(xiàn):有定勢(shì)思維的順推和逆向思維的倒推兩種方法,且兩種方法優(yōu)劣明顯。正推的5層迭代方程很難解出正確結(jié)果,而倒推雖也有5層,但從最后一天的已知倒推第一天的未知?jiǎng)t很容易算出答案。注意到定勢(shì)思維的劣勢(shì)問題,教師就可以在教學(xué)中通過一些程序引導(dǎo)和訓(xùn)練學(xué)生主動(dòng)變換思路,多角度、多方法進(jìn)行思考,通過持續(xù)的思維訓(xùn)練逐步改變定勢(shì)思維習(xí)慣,從而增強(qiáng)其思維的靈活性。
4.思維韌性與耐久性
信息系統(tǒng)是大量程序的集成,復(fù)雜問題需要復(fù)雜的程序,很多問題解決過程需要一系列步驟,這些程序的編寫與思考都需要思維的韌性與耐久性。好的程序員需要較好的思維韌性和耐久性。
例:某個(gè)車站呈狹長(zhǎng)形,寬度只能容下一臺(tái)車,并且只有一個(gè)出入口。已知某時(shí)刻該車站狀態(tài)為空,從這一時(shí)刻開始的出入記錄為:進(jìn),出,進(jìn),進(jìn),進(jìn),出,出,進(jìn),進(jìn),進(jìn),出,出。假設(shè)車輛入站的順序?yàn)?,2,3,……,則車輛出站的順序?yàn)椋? ?)。
微觀察:本題思路簡(jiǎn)單,本質(zhì)是純粹的過程模擬。但進(jìn)出站記錄越多,學(xué)生答題時(shí)越容易出錯(cuò)。分析其思維特點(diǎn),其實(shí)是思維過程中缺乏耐久性,難以較長(zhǎng)時(shí)間保持有條理的思考。
同樣,如果有學(xué)生能用順推方法解決上面的“猴子吃桃”問題,則要注意,同是定勢(shì)思維,但其思維特征又有新表現(xiàn),即思維的韌性和耐久性不錯(cuò),能夠在多層數(shù)據(jù)推算時(shí)長(zhǎng)時(shí)間保持條理性,在遇到復(fù)雜問題時(shí)能持久思考,耐心解決。
因此,不要一概否定定勢(shì)思維,對(duì)思維韌性好的學(xué)生要多加鼓勵(lì),引導(dǎo)其變換角度思考問題,學(xué)習(xí)靈活分析問題,通過編程學(xué)習(xí)的持續(xù)訓(xùn)練,提升其思維的靈活性,從而在思維耐久性的補(bǔ)充下快速提升編程能力和計(jì)算思維能力。
● “微觀察”學(xué)生程序設(shè)計(jì)思路,發(fā)現(xiàn)思維創(chuàng)新力
程序編寫具有自身的特殊性,同一問題往往有多種解決算法,有時(shí)相同算法也有不同寫法。分析學(xué)生的程序不但可以發(fā)現(xiàn)學(xué)生的思維特征和創(chuàng)新能力,將好的算法和寫法推廣引導(dǎo),還能有效培養(yǎng)學(xué)生的發(fā)散思維,提升學(xué)生的思維創(chuàng)新能力。例如,循環(huán)結(jié)構(gòu)理解是編程入門的第一個(gè)理解難點(diǎn),雖然此時(shí)的程序簡(jiǎn)單,但也常常呈現(xiàn)出不同的程序思路,表現(xiàn)出不同學(xué)生的思維創(chuàng)新差異。
例:求s=1-1/2+1/3-1/4……100的值,C++語言的三種不同程序?qū)懛ㄈ鐖D3所示。
微觀察:對(duì)比三個(gè)程序,其主要區(qū)別是:①第6行for循環(huán)終值與變化規(guī)律不同;②循環(huán)體具體寫法不同。其中,程序1是常規(guī)思路,根據(jù)式中數(shù)的特點(diǎn),在for配合if語句來完成;程序2相當(dāng)于對(duì)原式進(jìn)行了整理;程序3則對(duì)程序2的兩式進(jìn)行了合并計(jì)算,即奇偶關(guān)系直接將兩和相減。顯然,后兩個(gè)程序表現(xiàn)出了更靈活的思維能力,與算法和數(shù)據(jù)結(jié)構(gòu)所需思維特征更匹配,是編程學(xué)習(xí)的優(yōu)秀潛質(zhì),也是編程教學(xué)需要培養(yǎng)的重要能力。編程學(xué)習(xí)鼓勵(lì)一題多解,鼓勵(lì)創(chuàng)新算法。經(jīng)常利用創(chuàng)新思路寫程序的學(xué)生,其思維創(chuàng)新性更好,新穎的程序思路常常為其他學(xué)生提供啟發(fā)和引導(dǎo)。
綜上所述,注重編程教學(xué)中的微觀察、微分析有助于教師分析學(xué)生的思維特點(diǎn),發(fā)現(xiàn)學(xué)習(xí)中的阻滯和困難,進(jìn)而發(fā)現(xiàn)學(xué)生的計(jì)算思維潛質(zhì),尋找更好的方法引導(dǎo)和培養(yǎng)學(xué)生的計(jì)算思維能力,提升編程學(xué)習(xí)的興趣和效率,引導(dǎo)學(xué)生快速進(jìn)入編程學(xué)習(xí)的大門。