方其桂
(安徽省教育科學(xué)研究院,安徽 合肥 230061 )
程序設(shè)計(jì)是各類高校計(jì)算機(jī)專業(yè)主要課程,傳統(tǒng)的教學(xué)模式以編程語言的語法教學(xué)為主線,通常是教師先講解編程用到的語句,再通過練習(xí)鞏固所學(xué)的語法規(guī)范。教師講解時學(xué)生難以掌握大量的專業(yè)名詞,等到上機(jī)實(shí)踐時,往往要么無從下手,要么只是將書上程序搬運(yùn)到計(jì)算機(jī)中,遇到實(shí)際問題無法編寫出相應(yīng)程序。
在程序設(shè)計(jì)類課程中開展項(xiàng)目學(xué)習(xí),引導(dǎo)學(xué)生經(jīng)歷發(fā)現(xiàn)問題、分析問題和解決問題,將知識建構(gòu)、技能培養(yǎng)與思維發(fā)展,融入解決問題的過程中。其主要過程分為“項(xiàng)目選題”“項(xiàng)目分析”“項(xiàng)目規(guī)劃”“實(shí)施項(xiàng)目” “項(xiàng)目支持”和“評價總結(jié)”等階段,如圖1 所示。與傳統(tǒng)教學(xué)模式相比,能有效提高學(xué)生分析問題和解決問題的能力。
圖1 程序設(shè)計(jì)項(xiàng)目學(xué)習(xí)流程圖
將項(xiàng)目學(xué)習(xí)模式應(yīng)用于程序設(shè)計(jì)課程教學(xué)中,首先教師要依據(jù)課程目標(biāo)和實(shí)際情況設(shè)計(jì)項(xiàng)目。項(xiàng)目是教學(xué)活動的核心,項(xiàng)目合適與否,對教學(xué)效果將會產(chǎn)生直接的影響。項(xiàng)目必須讓學(xué)生在規(guī)定的教學(xué)時間內(nèi)完成,因此,項(xiàng)目的選題非常重要。項(xiàng)目的選題立足點(diǎn)是教學(xué)目標(biāo),同時要充分考慮學(xué)生的實(shí)際[1]。
程序設(shè)計(jì)教學(xué)目標(biāo)是讓學(xué)生通過學(xué)習(xí),更好地運(yùn)用計(jì)算機(jī)高級語言編寫程序,解決實(shí)際問題,提高思維能力,重點(diǎn)在于培養(yǎng)學(xué)生的計(jì)算思維。目前各類高校程序設(shè)計(jì)語言大多數(shù)有Python、C、Java 等,教師在教學(xué)之前,首先需要將這些編程語言在教學(xué)中的相關(guān)知識點(diǎn)整理成體系,然后對知識進(jìn)行合理切片,融入相應(yīng)的項(xiàng)目中,項(xiàng)目不能過大或過小,使之能在一次課(可能是二節(jié)課連上)中讓學(xué)生達(dá)成教學(xué)目標(biāo),如一般情況下,一次課很難完成“圖書管理系統(tǒng)”之類大項(xiàng)目,但是如果把項(xiàng)目設(shè)定為“兩個數(shù)比較大小”,又很難覆蓋太多知識點(diǎn)。要搞清楚項(xiàng)目對應(yīng)的知識點(diǎn),要讓學(xué)生在項(xiàng)目學(xué)習(xí)后,能掌握這些知識,并能運(yùn)用知識解決簡單問題,提升學(xué)生的計(jì)算思維[2]。
首先要了解學(xué)生的情況,項(xiàng)目要建立在學(xué)生已有知識和能力的基礎(chǔ)之上。因此要了解學(xué)生的興趣愛好、學(xué)習(xí)條件。也就是說,項(xiàng)目要貼近學(xué)生的興趣點(diǎn),符合學(xué)生的能力,讓學(xué)生有能力解決。學(xué)生真實(shí)世界中遇到的問題往往是復(fù)雜的,教師需要緊緊圍繞教學(xué)目標(biāo)進(jìn)行改造,使其變得簡單易行,規(guī)模可控,讓學(xué)生跳一跳能夠夠得著,才能激發(fā)其參與的積極性。另外,項(xiàng)目需要有一定的探究性或啟發(fā)性,否則會造成學(xué)生參與興趣不濃、積極性不高的現(xiàn)象,進(jìn)而導(dǎo)致學(xué)生在規(guī)定時間內(nèi)難以保證項(xiàng)目的完成。例如,教師可以將Python 的turtle 庫設(shè)計(jì)成創(chuàng)意繪圖項(xiàng)目,如在國慶節(jié)時繪制國旗、情人節(jié)時繪制一朵玫瑰花等,很受學(xué)生的歡迎。
項(xiàng)目分析是項(xiàng)目學(xué)習(xí)中的關(guān)鍵環(huán)節(jié),通過分析,發(fā)現(xiàn)問題、找出解決問題的方法,培養(yǎng)學(xué)生的思維能力。教師對項(xiàng)目的背景、目標(biāo)要求、相關(guān)的知識點(diǎn)進(jìn)行詳細(xì)分析,適當(dāng)講授項(xiàng)目中的重點(diǎn)和難點(diǎn),幫助學(xué)生理解項(xiàng)目,知道要做什么,要學(xué)習(xí)知識,練習(xí)的技能,達(dá)到的目標(biāo),以此培養(yǎng)學(xué)生的思維能力。
項(xiàng)目的價值在于它貼近生活實(shí)際,實(shí)際生活的項(xiàng)目都是比較復(fù)雜的,不是簡單的數(shù)學(xué)題,要從真實(shí)的情境中將解決問題條件分析出來,將無關(guān)的因素去除,便于后面構(gòu)建數(shù)學(xué)模型。在分析項(xiàng)目問題時,要明晰項(xiàng)目中可能涉及的知識和項(xiàng)目背景知識,弄清楚程序設(shè)計(jì)課程內(nèi)容中所蘊(yùn)涵的應(yīng)用情境。例如分析“出租車計(jì)收費(fèi)”項(xiàng)目的已知條件時,為了便于理解出租車是如何收費(fèi),可以采用圖示的方法理解題目已知條件。
鼓勵學(xué)生就項(xiàng)目提出各種各樣的問題,因?yàn)樘岢鰡栴}也是一種能力,而且這種能力比解決問題的能力可能更為重要。教師需要通過提問、頭腦風(fēng)暴、分組討論等各種方式,將學(xué)生的思維活動激發(fā),讓學(xué)生盡可能就項(xiàng)目提出各種各樣的問題,即使解決問題的方法很簡單、考慮不夠全面也應(yīng)受到鼓勵。
項(xiàng)目學(xué)習(xí)的最終目標(biāo)是解決問題,在解決問題的過程中提升學(xué)生的信息素養(yǎng),培養(yǎng)學(xué)生利用信息技術(shù)解決問題的能力。解決什么樣的問題,做到什么程度,需要定位,就是要確定學(xué)習(xí)的目標(biāo)。通過師生共同討論,分析出項(xiàng)目最終要解決什么樣的問題,其結(jié)果用什么方式輸出。只有明確起點(diǎn)和終點(diǎn),才有可能找到解決問題的路線和方法。比如分析“走迷宮”項(xiàng)目,要找出走出迷宮的最優(yōu)路徑,首先要知道迷宮結(jié)構(gòu)數(shù)據(jù)是如何存儲,然后根據(jù)不同的存儲形式設(shè)計(jì)不同的算法。另外,通過項(xiàng)目目標(biāo)分析,學(xué)生要知道解決什么問題,在解決這個問題自己需要的知識儲備、解決問題的方法,以及解決問題中可能遇到的問題。而教師要知道在學(xué)生解決問題的過程中給他們能提供什么樣的幫助及學(xué)習(xí)資源等[3]。
在確定好編程的目標(biāo)任務(wù)之后,需要學(xué)習(xí)基礎(chǔ)知識,然后研究編程思路、分析編程算法,制訂出程序編寫的實(shí)施方案。
以前高校的程序設(shè)計(jì)課程以教授編程語言的知識為主,強(qiáng)調(diào)的是知識的學(xué)習(xí),現(xiàn)在則將培養(yǎng)計(jì)算思維作為重中之重。以訓(xùn)練思維為主的項(xiàng)目學(xué)習(xí),也離不開知識的學(xué)習(xí),需要知識作為解決問題的支撐,因此在項(xiàng)目學(xué)習(xí)之前,教師需要教授學(xué)生一些基本知識作為準(zhǔn)備,當(dāng)然,這種教授方式可以是教師講解,作為項(xiàng)目學(xué)習(xí),更主要是教師課前準(zhǔn)備相關(guān)知識的微課,不同學(xué)生根據(jù)需要進(jìn)行自主學(xué)習(xí),隨學(xué)隨用,學(xué)習(xí)效率相對比較高。這些準(zhǔn)備知識主要是相關(guān)命令、語句、函數(shù)等的基本格式、語法和基本使用方法。例如分析“智能胖瘦分析程序”項(xiàng)目時,除了數(shù)學(xué)知識外,還需要用到If 語句、float()浮點(diǎn)數(shù)轉(zhuǎn)換、“/”除運(yùn)算符等相關(guān)知識。這些知識不需要講得太多,它的學(xué)習(xí)主要是通過后面的項(xiàng)目實(shí)施來讓學(xué)生深入領(lǐng)會。
通過討論、觀察、閱讀、實(shí)踐、分析、探究、實(shí)驗(yàn)等各種學(xué)習(xí)活動,找到項(xiàng)目解決的基本思路,也就是要完成這個項(xiàng)目,編寫這個程序需要哪幾步,每一步解決什么問題,用什么方式解決,其解決思路可以讓學(xué)生分步驟寫出,有的復(fù)雜項(xiàng)目為了便于理解、表述,最好用思維導(dǎo)圖工具梳理思路。
編程的核心是算法,是將生活中的實(shí)際問題轉(zhuǎn)變成能用程序解決。規(guī)劃編程算法要做的,也就是要將計(jì)算機(jī)的處理問題過程具體描述出來,讓計(jì)算機(jī)知道做什么和怎么做的具體步驟。通常,為了便于讓人們清晰直觀了解算法,編程時大多數(shù)使用流程圖來描述算法。
對于復(fù)雜項(xiàng)目,教師需要引導(dǎo)各項(xiàng)目小組對項(xiàng)目進(jìn)行分解、細(xì)化,制訂出項(xiàng)目計(jì)劃,包括項(xiàng)目主題、任務(wù)清單、小組成員及分工、時間安排、工作步驟和方法等。項(xiàng)目計(jì)劃是整個教學(xué)過程的重要依據(jù),計(jì)劃制訂是不是合理,直接關(guān)系到項(xiàng)目完成的效果優(yōu)劣。如果項(xiàng)目內(nèi)容較多,也可以考慮將大項(xiàng)目分解為若干的子項(xiàng)目。
復(fù)雜項(xiàng)目一般要分組進(jìn)行,需要將其進(jìn)一步細(xì)化,形成一個初步可行的方案,包括制定任務(wù)分配表及進(jìn)度表等。
項(xiàng)目實(shí)施是項(xiàng)目學(xué)習(xí)的核心環(huán)節(jié),對于程序設(shè)計(jì),需要在本環(huán)節(jié)編寫出程序,然后調(diào)試、優(yōu)化,最終目標(biāo)是讓每個學(xué)生能順利完成項(xiàng)目。此處應(yīng)該注意,每個同學(xué)根據(jù)任務(wù)分配表選擇任務(wù)時,有的同學(xué)負(fù)責(zé)編程、有的同學(xué)負(fù)責(zé)程序測試,有的同學(xué)負(fù)責(zé)制作演示文稿進(jìn)行匯報(bào)等,在各項(xiàng)目的實(shí)施中選擇不同類型的任務(wù),達(dá)到各方面鍛煉的目的。
學(xué)生根據(jù)前面所學(xué)的基礎(chǔ)知識,將算法用程序設(shè)計(jì)語言的不同命令、語句表現(xiàn)出來,集合到一起,就構(gòu)成程序。在這個過程中,教師要擺正自己的位置,以一個參與者的身份,走進(jìn)學(xué)生小組之中,幫助他們解決問題,不能直接演示編寫代碼的過程。特別是在編程學(xué)習(xí)到中后期,由于學(xué)生學(xué)習(xí)的命令越來越多,掌握的算法逐步豐富,因此不同學(xué)生編寫的程序?qū)休^大差異,這個是好現(xiàn)象,教師不需要強(qiáng)迫學(xué)生編寫的程序完全一樣,那樣學(xué)生就變成編程代碼的搬運(yùn)工,只是簡單將紙上的程序錄入編程語言中,完全失去編程的意義。對于較大的項(xiàng)目、較復(fù)雜的程序,最好通過分組教學(xué)來實(shí)施,即組內(nèi)成員經(jīng)過充分研究、討論、探究,形成程序,這樣也能培養(yǎng)學(xué)生團(tuán)隊(duì)協(xié)作、人際溝通等能力。
大多數(shù)情況下,編程不會一蹴而就,一次就能運(yùn)行通過,需要通過調(diào)試找出程序中的語法錯誤、邏輯錯誤,分析錯誤原因并改正。對于大的程序,需要分階段進(jìn)行調(diào)試。這個過程非常符合人們?nèi)粘I钪刑幚韱栴}的方法。所以,合理運(yùn)用程序調(diào)試工具調(diào)試程序可以培養(yǎng)學(xué)生的耐心和發(fā)現(xiàn)問題、分析問題和解決問題的能力。教師可以把編程語言調(diào)試工具的使用制作成微課,供學(xué)生隨時學(xué)習(xí),掌握調(diào)試的基本方法。
用不同語言編寫一個程序能訓(xùn)練學(xué)生思維的廣度,用多種方法解決一個問題可以訓(xùn)練學(xué)生思維的深度。由于一個項(xiàng)目可以由多種算法寫出不同的程序解決,教師要引導(dǎo)學(xué)生掌握算法效率分析的方法,對程序進(jìn)行優(yōu)化,通過不斷優(yōu)化,訓(xùn)練學(xué)生的思維。如“我要站在誰后面”項(xiàng)目要求學(xué)生了解各種排序的方法。教師可給幾種排序的算法基本思想,讓學(xué)生根據(jù)自己對各種排序算法的理解程度,自主選擇算法進(jìn)行研究,并根據(jù)所選算法分組,再通過討論、學(xué)習(xí)相應(yīng)的算法,完成程序的編寫,再分小組匯報(bào),比較各種算法。匯報(bào)的過程是同學(xué)們比較的過程,同學(xué)們接觸不同的排序算法,各抒己見,并與先前自己編寫的程序進(jìn)行對比,很快能發(fā)現(xiàn)可以根據(jù)不同的情況選擇不同的算法,如排序的量較大時,則應(yīng)采用快速排序,它是目前基于比較的內(nèi)部排序中被認(rèn)為是最好的方法。程序設(shè)計(jì)課程的教學(xué)重點(diǎn)是訓(xùn)練學(xué)生的思維,提高學(xué)生解決問題的能力。更重要的是,讓學(xué)生將算法解決的思路和方法,遷移到生活中類似問題的解決之中,有利于培養(yǎng)學(xué)生的發(fā)散性思維能力,還有利于訓(xùn)練學(xué)生思維的嚴(yán)謹(jǐn)性。
項(xiàng)目學(xué)習(xí)主要是由學(xué)生自主探究學(xué)習(xí)完成,在學(xué)習(xí)過程中,需要給其提供足夠的支持,使其能夠順利開展學(xué)習(xí)。
項(xiàng)目學(xué)習(xí)的重要目標(biāo)是要掌握相關(guān)知識與概念,但這些知識與概念只是作為工具在項(xiàng)目中使用,從外表難以看出知識體系,為了彌補(bǔ)這一缺位,教師需要將本項(xiàng)目涉及的知識進(jìn)行歸納、總結(jié)。學(xué)生在前面的完成項(xiàng)目中已經(jīng)對所涉及的知識有了一定的感性認(rèn)識,再學(xué)習(xí)這些知識就水到渠成,容易很多。而且,通過這部分學(xué)習(xí),可以幫助他們形成編程知識體系,掌握學(xué)科的核心概念和原理。例如,教師可以把知識點(diǎn)與項(xiàng)目結(jié)合起來,與學(xué)生一起在完成項(xiàng)目的過程中,用思維導(dǎo)圖工具,繪制課程的知識圖譜,整體上把握知識體系。
由于編程項(xiàng)目對學(xué)生的抽象思維能力要求比較高,而且程序本身也有較高的要求,如程序中符號、縮進(jìn)稍不注意就會出現(xiàn)南轅北轍的計(jì)算結(jié)果,因此,教師需要對程序中的重點(diǎn)語句、容易出現(xiàn)問題的語句進(jìn)行講解,降低編程難度,讓學(xué)生盡快調(diào)試通過程序,讓其收獲成功的喜悅,保持學(xué)習(xí)編程序的興趣。同時,教師要創(chuàng)造條件、營造良好的互幫互助的氛圍,同伴之間的學(xué)習(xí)往往更容易釋疑解惑。
項(xiàng)目學(xué)習(xí)中,學(xué)習(xí)的主體是學(xué)生,不是教師,教師不用不停講解與演示。但學(xué)生畢竟是在學(xué)習(xí)全新的知識與技能,學(xué)生在自主探究過程中肯定會遇到各種各樣的問題,因此教師有必要針對學(xué)生會遇到的主要問題制作相應(yīng)的微課,供學(xué)生在遇到問題時自主學(xué)習(xí)。更為主要的是,自主學(xué)習(xí)不是自由學(xué)習(xí),這種學(xué)習(xí)是按教師預(yù)設(shè)的學(xué)習(xí)方案展開的,因此,教師要提供學(xué)生學(xué)習(xí)方案。項(xiàng)目完成時,教師需要組織學(xué)生對作品進(jìn)行評價,因此要準(zhǔn)備評價量規(guī)和評價表。為了讓學(xué)生方便使用這些資源,最好能借助一定的教學(xué)平臺,將這些資源有組織地存放到教學(xué)平臺上[4]。
在項(xiàng)目學(xué)習(xí)后期,學(xué)生編寫出預(yù)定的程序之后,需要教師對其進(jìn)行評價,總結(jié)項(xiàng)目學(xué)習(xí)過程的得失,同時讓學(xué)生交流分析問題、解決問題的方法。
讓學(xué)生將完成的項(xiàng)目在小組或全班進(jìn)行展示,展示內(nèi)容包括:其編程思路及方案、算法、如何學(xué)習(xí)編程中用到的知識、程序的核心代碼、遇到的困難和問題,交流編程過程的感悟,組織學(xué)生自評和互評。教師對各小組進(jìn)行過程性和總結(jié)性評價。項(xiàng)目學(xué)習(xí)評價不以成績檢測來評價學(xué)生,評價的重點(diǎn)不再是學(xué)到了什么知識,而是應(yīng)用知識解決真實(shí)問題的能力。需要指出的是,雖然項(xiàng)目學(xué)習(xí)最理想的情況是每個學(xué)生(或小組)都能夠提交出最優(yōu)化的程序,但是,如果學(xué)生的程序不是很成功,也不能說明項(xiàng)目學(xué)習(xí)沒有取得好的效果。如果學(xué)生在項(xiàng)目中確實(shí)學(xué)到了知識,掌握了技能,并且能夠知道程序不成功的原因以及改進(jìn)辦法時,可以說他的學(xué)習(xí)是成功的,已經(jīng)達(dá)到了項(xiàng)目學(xué)習(xí)的目標(biāo)。
教學(xué)中,教師應(yīng)組織學(xué)生通過多種數(shù)字化平臺提交作品及相關(guān)文檔(設(shè)計(jì)思想、技術(shù)文檔、交流文稿等),開展項(xiàng)目成果的交流與評價,并選擇典型成果進(jìn)行課堂展示和交流評價。
通過評價,同學(xué)和老師能提出一些建設(shè)性的意見,據(jù)此改進(jìn)、完善程序。
項(xiàng)目總結(jié)的主要任務(wù)是讓學(xué)生總結(jié)項(xiàng)目學(xué)習(xí)中的成功與失敗之處,有助于學(xué)生下一個項(xiàng)目的學(xué)習(xí),并幫助教師提高項(xiàng)目學(xué)習(xí)實(shí)施的質(zhì)量。在評價的基礎(chǔ)上引導(dǎo)學(xué)生完善、改進(jìn)程序,完成知識與能力的迭代,再通過總結(jié),盡可能將項(xiàng)目所學(xué)向外延伸,擴(kuò)展所學(xué)的價值??偨Y(jié)典型算法,尤其是總結(jié)出常見錯誤,避免以后再犯類似錯誤。
項(xiàng)目總結(jié)的主體應(yīng)當(dāng)是學(xué)生,包含個人和小組。教師要鼓勵和引導(dǎo)學(xué)生從自我建構(gòu)知識、掌握技能、學(xué)習(xí)情況(包括學(xué)習(xí)態(tài)度、時間觀念、認(rèn)真程度)等方面對項(xiàng)目進(jìn)行小結(jié)。項(xiàng)目小組也應(yīng)當(dāng)從項(xiàng)目任務(wù)執(zhí)行過程中的分工情況、協(xié)作能力、創(chuàng)新能力、項(xiàng)目完成情況等方面進(jìn)行總結(jié)。
通過對項(xiàng)目活動總結(jié),對項(xiàng)目進(jìn)行完善,同時對項(xiàng)目學(xué)習(xí)過程的得失進(jìn)行總結(jié),為下一個項(xiàng)目學(xué)習(xí)奠定良好基礎(chǔ)。學(xué)生通過一系列目標(biāo)式學(xué)習(xí)活動后,一定要及時引導(dǎo)其對學(xué)習(xí)過程中的成功或失敗經(jīng)驗(yàn)進(jìn)行反思,使之能遷移應(yīng)用到與其相關(guān)的其他問題解決之中。
程序設(shè)計(jì)課程傳統(tǒng)教學(xué)過程是講授編程知識,根據(jù)范例上機(jī)訓(xùn)練,考查的是知識的記憶力。項(xiàng)目學(xué)習(xí)的過程是項(xiàng)目選題、項(xiàng)目分析、項(xiàng)目規(guī)劃、實(shí)施項(xiàng)目、項(xiàng)目支持、項(xiàng)目評價等,訓(xùn)練的是計(jì)算思維,培養(yǎng)的是創(chuàng)新精神和實(shí)踐能力。有趣的項(xiàng)目可以提高學(xué)生的學(xué)習(xí)積極性,靈活的項(xiàng)目可以培養(yǎng)學(xué)生自主學(xué)習(xí)的能力,綜合性的項(xiàng)目可以訓(xùn)練學(xué)生的計(jì)算思維,提高學(xué)生的核心素養(yǎng)[5],實(shí)用性的項(xiàng)目可以培養(yǎng)學(xué)生利用學(xué)習(xí)到的知識與技能解決實(shí)際問題的能力,從而達(dá)到預(yù)期的實(shí)踐教學(xué)效果。因此,項(xiàng)目學(xué)習(xí)非常適合在各類高校程序設(shè)計(jì)教學(xué)中推廣,讓學(xué)生真正成為學(xué)習(xí)的主體。當(dāng)然,要克服我們一直習(xí)慣的教學(xué)模式,前面的路任重道遠(yuǎn)。