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