楊晨霞+涂風(fēng)濤


摘 要:“對(duì)象優(yōu)先法”在歷屆SIGCSE(計(jì)算機(jī)科學(xué)教育)會(huì)議上一直受到鼓吹,而提倡“基礎(chǔ)優(yōu)先法”的呼聲卻很微弱。但近年來(lái)隨著“對(duì)象優(yōu)先法”在高職院校Java語(yǔ)言教學(xué)過(guò)程中遇到挫折,這一切才得以扭轉(zhuǎn)。文章主要探討在高職Java語(yǔ)言課程教學(xué)改革中采用“基礎(chǔ)優(yōu)先”的方法,并且以問(wèn)題驅(qū)動(dòng)的方式教授程序設(shè)計(jì)的概念和技術(shù)。通過(guò)實(shí)踐檢驗(yàn),該教學(xué)方式提高了學(xué)生的面向?qū)ο缶幊棠芰Α?/p>
關(guān)鍵詞:基礎(chǔ)優(yōu)先法;問(wèn)題驅(qū)動(dòng);教學(xué)改革
作者簡(jiǎn)介:楊晨霞(1978-),女,江西瑞金人,南昌師范高等專(zhuān)科學(xué)校講師,研究方向?yàn)橛?jì)算機(jī)應(yīng)用;涂風(fēng)濤(1976-),男,江西南昌人,南昌師范高等專(zhuān)科學(xué)校講師,研究方向?yàn)榫W(wǎng)絡(luò)安全。
基金項(xiàng)目:江西省高等學(xué)校教學(xué)改革研究課題“基于CDIO理念的創(chuàng)新型高技能人才培養(yǎng)模式的研究與實(shí)踐——以高職院校軟件專(zhuān)業(yè)為例”(編號(hào):JXJG-14-41-5),主持人:涂風(fēng)濤。
中圖分類(lèi)號(hào):G712 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1001-7518(2017)05-0071-03
隨著全球軟件服務(wù)外包和國(guó)內(nèi)第三產(chǎn)業(yè)的快速發(fā)展,我國(guó)的軟件行業(yè)成長(zhǎng)迅猛,產(chǎn)業(yè)對(duì)人才需求旺盛。高職軟件專(zhuān)業(yè)迎來(lái)發(fā)展機(jī)遇。Java是一種被廣泛使用的面向?qū)ο蟪绦蛘Z(yǔ)言(Object-Oriented Programming Language),有許多研究機(jī)構(gòu)和公司采用Java來(lái)發(fā)展各種用于科學(xué)計(jì)算和商業(yè)的大型應(yīng)用軟件。因此,很多高職院校都把《Java語(yǔ)言程序設(shè)計(jì)》作為程序設(shè)計(jì)的第一門(mén)課程,使得學(xué)生可以站在計(jì)算機(jī)應(yīng)用的前沿,并與計(jì)算機(jī)其它課程的學(xué)習(xí)相輔相成。由于Java在動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)和安卓操作系統(tǒng)上的廣泛應(yīng)用,隨著Internet的發(fā)展和終端智能手機(jī)的大量普及,每年我國(guó)有大量的IT企業(yè)需要招聘Java軟件開(kāi)發(fā)人員,但高職院校培養(yǎng)的計(jì)算機(jī)軟件專(zhuān)業(yè)學(xué)生的程序開(kāi)發(fā)能力與企業(yè)的要求存在很大的差距,因此進(jìn)行Java語(yǔ)言課程的教學(xué)改革勢(shì)在必行。
一、教學(xué)改革
(一)傳統(tǒng)的教學(xué)策略——對(duì)象優(yōu)先教學(xué)法
對(duì)象優(yōu)先教學(xué)法從一開(kāi)始就強(qiáng)調(diào)面向?qū)ο蟮木幊毯驮O(shè)計(jì)原則,這種教學(xué)法直接從對(duì)象和繼承開(kāi)始,然后才介紹程序設(shè)計(jì)的結(jié)構(gòu)[1]。即在面向?qū)ο笤O(shè)計(jì)的環(huán)境中學(xué)習(xí)所有內(nèi)容,包括學(xué)習(xí)程序設(shè)計(jì)的結(jié)構(gòu)。它的優(yōu)點(diǎn)是學(xué)習(xí)者能夠在學(xué)習(xí)初段建立起面向?qū)ο笤O(shè)計(jì)概念,有利于后續(xù)的相關(guān)專(zhuān)業(yè)課程的學(xué)習(xí)。但它的缺點(diǎn)是提高了程序設(shè)計(jì)課程的入門(mén)難度,不僅要求學(xué)習(xí)者要掌握數(shù)據(jù)類(lèi)型、變量、引用等基本概念,還需理解面向?qū)ο蟪绦蛟O(shè)計(jì)中的類(lèi)的抽象和封裝、繼承和多態(tài)等抽象概念。就像大部分學(xué)生說(shuō)的,對(duì)象優(yōu)先教學(xué)法對(duì)我們來(lái)說(shuō)是一種極大的挑戰(zhàn),需要在學(xué)習(xí)的開(kāi)始就要掌握許多面向?qū)ο笏枷搿⒏拍钆c編程技能。但從整個(gè)教學(xué)反饋來(lái)看,一部分學(xué)生從開(kāi)始充滿興趣,到感覺(jué)自己已經(jīng)很努力了,編程能力卻沒(méi)有提高,從而產(chǎn)生畏難情緒,如果一旦沒(méi)有跟上老師的教學(xué)進(jìn)度,甚至?xí)艞墶?/p>
(二)基礎(chǔ)優(yōu)先教學(xué)法
基礎(chǔ)優(yōu)先教學(xué)法是指在學(xué)習(xí)對(duì)象和類(lèi)之前,首先介紹基本程序設(shè)計(jì)的概念和技術(shù)。在整個(gè)教學(xué)改革中采用了基礎(chǔ)優(yōu)先的方法,并且以問(wèn)題驅(qū)動(dòng)的方式教授程序設(shè)計(jì)的概念和技術(shù)。首先是學(xué)習(xí)程序設(shè)計(jì)的基礎(chǔ)知識(shí),其次學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)的相關(guān)概念和內(nèi)容,最后再使用面向?qū)ο笤O(shè)計(jì)方法構(gòu)建具有異常處理功能和某些高級(jí)特性的圖形用戶程序(GUI)及applet。因此,對(duì)課程的教學(xué)內(nèi)容進(jìn)行重新規(guī)劃(見(jiàn)圖1)。
實(shí)踐證明,對(duì)于初學(xué)編程的學(xué)生來(lái)說(shuō),首先學(xué)習(xí)語(yǔ)言基礎(chǔ)邏輯、循環(huán)和數(shù)組這樣的基本編程技術(shù),并逐步精通是非常重要的。如果學(xué)生不能很好地完成過(guò)程化程序代碼的編寫(xiě),也將無(wú)法學(xué)好面向?qū)ο蟪绦蛟O(shè)計(jì),學(xué)生扎實(shí)地掌握數(shù)據(jù)類(lèi)型、控制語(yǔ)句、數(shù)組和方法會(huì)為學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)打下牢固基礎(chǔ)[2]。
在以基礎(chǔ)優(yōu)先策略教學(xué)時(shí),首先使用過(guò)程化方案來(lái)解決某個(gè)問(wèn)題,然后再演示如何使用面向?qū)ο笤O(shè)計(jì)方法來(lái)進(jìn)行改進(jìn)[3],從而使學(xué)生更好地理解面向?qū)ο蟪绦蛟O(shè)計(jì)思想,使他們從中學(xué)到如何更高效地使用面向?qū)ο蟪绦蛟O(shè)計(jì)方法。例如在介紹第一部分“程序設(shè)計(jì)基礎(chǔ)”中的“基本數(shù)據(jù)類(lèi)型和基本操作”時(shí),我們?cè)O(shè)計(jì)了一個(gè)“計(jì)算圓面積”的簡(jiǎn)單程序。該程序讀入圓的半徑并顯示其面積。程序?qū)⒂米兞看鎯?chǔ)圓的半徑和面積,使用表達(dá)式來(lái)計(jì)算面積。教學(xué)目的是讓學(xué)生掌握編寫(xiě)程序需要設(shè)計(jì)算法和數(shù)據(jù)結(jié)構(gòu),并要把算法(algorithm)轉(zhuǎn)換為程序代碼。通過(guò)問(wèn)題我們讓學(xué)生知道算法其實(shí)就是描述如何執(zhí)行一系列操作來(lái)解決一個(gè)實(shí)際問(wèn)題,它指定操作的執(zhí)行順序。算法可以幫助程序設(shè)計(jì)者在用程序設(shè)計(jì)語(yǔ)言編寫(xiě)程序之前進(jìn)行規(guī)劃。由此,學(xué)生可以很快地寫(xiě)出該程序的算法描述:①讀入半徑;②利用公式計(jì)算圓面積:面積=半徑×半徑×π;③顯示面積,并完成相應(yīng)代碼的編寫(xiě)。
在講解第二部分“面向?qū)ο蟪绦蛟O(shè)計(jì)”中的“對(duì)象和類(lèi)”時(shí),教師使用統(tǒng)一建模語(yǔ)言(Unified Modeling Language, UML)描述了一個(gè)與前例功能相似的Circle類(lèi)和建立的對(duì)象,圖2為使用UML圖形符號(hào)表示的類(lèi)和對(duì)象。
根據(jù)兩個(gè)問(wèn)題的對(duì)比,讓學(xué)生明白像Java等面向?qū)ο笳Z(yǔ)言不僅仍然具有面向過(guò)程語(yǔ)言的特點(diǎn)(程序=數(shù)據(jù)結(jié)構(gòu)+算法),而且它還通過(guò)類(lèi)的抽象和封裝、繼承以及多態(tài)增加了程序的模塊性、清晰性、重用性和靈活性等有益特性。由于在面向過(guò)程程序設(shè)計(jì)中,數(shù)據(jù)和操作是分離的,所以需要把數(shù)據(jù)傳遞到方法中。而在面向?qū)ο蟪绦蛟O(shè)計(jì)中,卻把數(shù)據(jù)和對(duì)于它們的操作放進(jìn)一個(gè)叫做對(duì)象(object)的實(shí)體里,這種設(shè)計(jì)避免了許多在面向過(guò)程程序設(shè)計(jì)中遇到的問(wèn)題。在對(duì)象的世界里,所有對(duì)象都與屬性和活動(dòng)聯(lián)系在一起,因此面向?qū)ο蟪绦蛟O(shè)計(jì)是一種更貼切真實(shí)世界的模型組織程序[4]。因?yàn)槭褂脤?duì)象可以增強(qiáng)程序的可重用性,方便軟件的開(kāi)發(fā)與維護(hù),所以學(xué)生今后很自然都會(huì)以對(duì)象的觀點(diǎn)來(lái)考慮Java程序設(shè)計(jì),并把Java程序看成是相互合作的對(duì)象所構(gòu)成的集合。通過(guò)Circle這個(gè)案例,就把面向?qū)ο蟪绦蛟O(shè)計(jì)是軟件方法的發(fā)展必然這個(gè)問(wèn)題向?qū)W生們非常形象地解釋清楚了。
在學(xué)習(xí)“異常處理”時(shí),我們把第二部分的Circle類(lèi)的setRadius方法的參數(shù)newRadius設(shè)置為負(fù)數(shù),這樣在運(yùn)行時(shí)會(huì)引起異常(exception),并導(dǎo)致程序非正常終止。通過(guò)實(shí)驗(yàn)我們告訴學(xué)生,作為一名合格的Java程序員,必需利用Java提供的異常處理功能去捕獲和處理那些在程序運(yùn)行時(shí)產(chǎn)生的異常,讓程序更加強(qiáng)壯和穩(wěn)定。所以要求學(xué)生對(duì)Circle類(lèi)的setRadius方法進(jìn)行改寫(xiě),讓該方法拋出一個(gè)illegalArgumentException異常,告知用戶不能把半徑設(shè)置成負(fù)數(shù)。通過(guò)該問(wèn)題的解決,讓學(xué)生掌握如何使用這些抽象類(lèi)和接口,并按照它們的規(guī)范標(biāo)準(zhǔn)來(lái)設(shè)計(jì)應(yīng)用程序。
在整個(gè)教學(xué)過(guò)程中,我們要讓學(xué)生明白,程序設(shè)計(jì)的關(guān)鍵是解決問(wèn)題,語(yǔ)法、類(lèi)和對(duì)象只是其中一部分,而循環(huán)、數(shù)組和方法是解決問(wèn)題的基本技術(shù)。從基本程序設(shè)計(jì)技術(shù)到面向?qū)ο蟪绦蛟O(shè)計(jì)存在著多種抽象層次,類(lèi)只是其中一種抽象層次,在軟件項(xiàng)目的設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中應(yīng)用抽象的概念是軟件開(kāi)發(fā)的關(guān)鍵[5]。因此,學(xué)生在解決問(wèn)題時(shí)能夠使用多種層次的抽象進(jìn)行分析成為我們最重要的教學(xué)目標(biāo)。所以,我們?cè)O(shè)計(jì)的教學(xué)案例和任務(wù)都是以解決問(wèn)題為中心,這些例子很好地培養(yǎng)了學(xué)生們開(kāi)發(fā)可重用類(lèi)和方法,以及利用它們構(gòu)建實(shí)用程序的思想[6]。
程序設(shè)計(jì)課程不同于其他課程,學(xué)生要從例子中學(xué)習(xí)、從實(shí)踐中學(xué)習(xí)、從錯(cuò)誤中學(xué)習(xí),這需要花費(fèi)大量的時(shí)間編寫(xiě)程序、調(diào)試程序并修改錯(cuò)誤[7]。對(duì)于剛接觸程序設(shè)計(jì)的學(xué)生來(lái)說(shuō),學(xué)習(xí)程序設(shè)計(jì)的基本目的就是培養(yǎng)描述問(wèn)題的程序化解決方案的關(guān)鍵技能,并通過(guò)條件語(yǔ)句、循環(huán)和方法將方案轉(zhuǎn)變成程序[8]。在教學(xué)過(guò)程中,學(xué)生如果掌握了循環(huán)、數(shù)組和方法等編寫(xiě)程序的基本技能,就能順利地進(jìn)入到面向?qū)ο蟪绦蛟O(shè)計(jì)的學(xué)習(xí)中,學(xué)習(xí)使用類(lèi)的封裝、繼承和多態(tài)來(lái)開(kāi)發(fā)面向?qū)ο蟮某绦颉W(xué)生如果理解了面向?qū)ο蟪绦蛟O(shè)計(jì)思想,學(xué)習(xí)Java編程就變成了學(xué)習(xí)Java的API,而讓學(xué)生模仿例子并進(jìn)行練習(xí)是學(xué)習(xí)Java API的最好辦法。
實(shí)踐證明,學(xué)習(xí)基本邏輯以及循環(huán)和逐步求精這樣的基本程序設(shè)計(jì)技術(shù),對(duì)于學(xué)生非常重要。像循環(huán)、方法和數(shù)組這樣的基本概念和技術(shù)都是程序設(shè)計(jì)的基礎(chǔ),它們?yōu)閷W(xué)生進(jìn)一步學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)、GUI、數(shù)據(jù)庫(kù)和Web程序設(shè)計(jì)做好了充分準(zhǔn)備。
(三)問(wèn)題驅(qū)動(dòng)
問(wèn)題驅(qū)動(dòng)意味著教師把教學(xué)的重點(diǎn)放在問(wèn)題的解決而不是語(yǔ)法上。通過(guò)使用一些有趣的問(wèn)題使得程序設(shè)計(jì)的介紹也變得更加有趣。為了支持以問(wèn)題驅(qū)動(dòng)的方式來(lái)講授程序設(shè)計(jì),教師設(shè)計(jì)了大量不同難度的問(wèn)題來(lái)激發(fā)學(xué)生的興趣。這些問(wèn)題涉及了很多應(yīng)用領(lǐng)域,包括數(shù)學(xué)、科學(xué)、商業(yè)、金融、游戲、動(dòng)畫(huà)以及多媒體等。例如,在講解多線程時(shí),設(shè)計(jì)了一個(gè)儲(chǔ)蓄程序,假設(shè)在程序中創(chuàng)建并啟動(dòng)100個(gè)線程,每個(gè)線程都是往同一個(gè)賬戶中存入一筆固定的金額。當(dāng)所有的線程都完成時(shí),卻看到帳戶顯示的余額不正確,而且還發(fā)現(xiàn)余額的結(jié)果并不是可以預(yù)測(cè)的。這個(gè)問(wèn)題向?qū)W生演示了當(dāng)所有線程同時(shí)訪問(wèn)同一個(gè)數(shù)據(jù)源時(shí),就會(huì)出現(xiàn)數(shù)據(jù)破壞的情況。其實(shí)這是多線程程序中的一個(gè)普遍問(wèn)題,稱為競(jìng)爭(zhēng)狀態(tài)(race condition)。經(jīng)過(guò)學(xué)生們的一番討論,我們得出要避免競(jìng)爭(zhēng)狀態(tài),就是應(yīng)該防止多個(gè)線程同時(shí)進(jìn)入程序的某一特定部分,這個(gè)部分我們稱之為臨界區(qū)(critical region)。從而引入新課“線程同步”的概念。通過(guò)問(wèn)題的解決,讓學(xué)生掌握為了避免線程破壞共享資源,可以使用同步的方法或塊,并幫助他們更好地理解一些抽象難懂的概念,像“同步方法在執(zhí)行前需要獲得一個(gè)鎖。當(dāng)同步方法是實(shí)例方法時(shí),鎖是在調(diào)用方法的對(duì)象上;當(dāng)同步方法是靜態(tài)方法時(shí),鎖是在方法所在的類(lèi)上。”等內(nèi)容。
二、教改效果
通過(guò)Java語(yǔ)言課程的教學(xué)改革與實(shí)踐,學(xué)生的基礎(chǔ)知識(shí)和編程解決問(wèn)題的操作能力得到了提高,學(xué)習(xí)的主動(dòng)性和積極性改善明顯。學(xué)生能夠運(yùn)用面向?qū)ο蟪绦蛟O(shè)計(jì)的思想來(lái)分析問(wèn)題,并將其進(jìn)行抽象,輔以代碼方式完成。通過(guò)教學(xué)改革,取得的主要教學(xué)成果有:
(一)提高了學(xué)生的計(jì)算思維能力
大學(xué)應(yīng)以培養(yǎng)學(xué)生的計(jì)算思維為核心,使計(jì)算思維如同實(shí)證思維、邏輯思維一樣,成為每個(gè)學(xué)生應(yīng)具備的基本科學(xué)思維能力[9]。通過(guò)教學(xué)改革,提高了學(xué)生對(duì)實(shí)際問(wèn)題進(jìn)行概念抽象、問(wèn)題求解和程式化描述的能力[10],這也是進(jìn)行教學(xué)改革的一項(xiàng)重要內(nèi)容,其中的關(guān)鍵就是計(jì)算思維能力的培養(yǎng)。
(二)提高了學(xué)生的動(dòng)手實(shí)踐能力
學(xué)習(xí)程序設(shè)計(jì)的竅門(mén)就是實(shí)踐、實(shí)踐、再實(shí)踐,這充分說(shuō)明Java語(yǔ)言程序設(shè)計(jì)是一門(mén)實(shí)踐性很強(qiáng)的課程。通過(guò)布置由簡(jiǎn)到繁的任務(wù),使學(xué)生建立起上機(jī)操作的勇氣和信心,并讓他們獲得了解決問(wèn)題后的成功感,培養(yǎng)了他們的動(dòng)手能力和操作意識(shí),提高了他們解決實(shí)際問(wèn)題的能力。
(三)提高了學(xué)生的創(chuàng)新能力
在教學(xué)過(guò)程中采用了問(wèn)題驅(qū)動(dòng)方式,學(xué)生的主觀能動(dòng)性被充分地調(diào)動(dòng)起來(lái),學(xué)生更加積極地參與教學(xué)活動(dòng),這也激發(fā)了學(xué)生的創(chuàng)新能力,學(xué)生制作的部分軟件作品在省內(nèi)比賽中獲獎(jiǎng),并且得到了相關(guān)企業(yè)的好評(píng)。
參考文獻(xiàn):
[1]王秀平.試論計(jì)算機(jī)科學(xué)入門(mén)課程中的對(duì)象優(yōu)先教學(xué)法[J].現(xiàn)代計(jì)算機(jī),2008(2):50-51.
[2][4]葉乃文,王丹.Java語(yǔ)言程序設(shè)計(jì)教程[M].北京:機(jī)械工業(yè)出版社,2010.
[3][5][6]梁勇.Java語(yǔ)言程序設(shè)計(jì)[M].北京:機(jī)械工業(yè)出版社,2008.
[7]陳昊.Java語(yǔ)言實(shí)驗(yàn)教學(xué)改革探討[J].計(jì)算機(jī)教育,2009(10):148-150.
[8]劉松青.構(gòu)建“Java面向?qū)ο蟪绦蛟O(shè)計(jì)”實(shí)踐教學(xué)體系[J].計(jì)算機(jī)教育,2009(2):8-10.
[9]李廉.計(jì)算思維——概念與挑戰(zhàn)[J].中國(guó)大學(xué)教學(xué),2012(1):7-12.
[10]王衛(wèi)生.基于CDIO教學(xué)模式的《Java程序設(shè)計(jì)》課程開(kāi)發(fā)實(shí)踐[J].軟件工程師,2010(12):60-63.
責(zé)任編輯 時(shí)紅兵