韓延明
(西南財經大學 計算機與人工智能學院,四川 成都 610074)
Java程序設計課程不但是計算機相關專業(yè)的專業(yè)基礎課,還是許多經管類專業(yè)的一門熱門選修課。計算機相關專業(yè)開設Java程序設計課程的目的是使學生能建立面向對象編程的計算思維,實現(xiàn)以Java為核心的應用程序開發(fā)。經管類專業(yè)開設Java程序設計課程的主要目的是滿足信息化素養(yǎng)培養(yǎng)需求,使學生經過學習與訓練,具備用程序語言編寫具有一定實用價值的數(shù)據處理、文件操作等實用程序的能力[1]。針對這些素養(yǎng)和能力要求,Java程序設計課程教學模式必須進行變革,教師須改變傳統(tǒng)的教育理念,在課程教學與實踐中注重提升學生學習興趣,培養(yǎng)學生的各項能力。
國內多所高校針對程序設計課程教學模式進行相應改革,并取得了一系列成果。石文兵等[2]在教學過程中構建、實施了一種高級語言程序設計的智能化教學框架,促進了課程教學質量的全面提升。李飛等[3]針對非計算機專業(yè)學生的特點,給出一種基于教學內容特點的混合式教學體系,提高了學生的學習積極性和興趣,進而提高學生的學習效率。張文慧[4]在非計算機專業(yè)C語言程序設計教學中,為提高學生學習興趣,培養(yǎng)學生用計算機解決實際問題的能力,進行混合式教學改革。羅迅等[5]圍繞程序設計基礎能力培養(yǎng)目標,調整開課計劃,豐富教學內容,增加實踐環(huán)節(jié),加強了在線教學平臺的使用。通過這種改革,有效提高了學生代碼的數(shù)量與質量。李勝嵐等[6]改進了Java課程授課形式和考核方式,致力于培養(yǎng)應用型人才。然而,無論是智能化教學框架或是混合式教學改革,都是在增強線上教學環(huán)節(jié)上做文章,隨著線上授課的增加,教師和學生在課堂上面對面交流隨之減少,教師和學生都無法充分體驗和感受大學課堂的真正意義。馮向萍[7]將斯坦福大學編程類課程教學模式應用于Java課程教學中,激發(fā)學生學習興趣,鍛煉學生編程技能。但是,計算機專業(yè)的教學模式并不完全適合經管類專業(yè)的學生。黃天羽等[8]在Python課程教學中提出“以圖形牽引興趣,開展Python案例教學”的教學觀點,圖形化的案例有助于學生保持較高的學習熱情,取得良好的教學效果。Python語言的生態(tài)資源豐富,Python程序設計教材可提供豐富的圖形案例吸引學生的學習興趣,但Java程序設計教材上可吸引學生興趣的案例較少,有必要引入第三方庫充實教學案例,讓課堂更有趣。
本文就西南財經大學經管類專業(yè)Java語言程序設計教學中存在的問題進行分析并嘗試改進教學模式,探索和嘗試在Java程序設計教學中引入第三方庫,以更好地激發(fā)學生的學習興趣并提高其學習效率。
程序設計及應用是西南財經大學經管類專業(yè)一年級學生的通識基礎課,有Visual Basic、Python、C++和Java四門語言供學生選修,四門語言的教學實施方案有公共的部分,包括高級程序設計語言的基本元素、程序的基本結構、數(shù)組和文件操作,其他內容為各門語言的特色部分。
Java語言涉及的知識點和概念較多,再加上學時有限,學習難度相對較大,學生面對抽象的概念和復雜的語法規(guī)則,往往不知所措,產生畏難情緒,這時需要進行科學有效的引導,讓學生盡快度過編程語言的難關,體驗到學習帶來的成就感。教學中的兩條主線是理論和實踐。在理論教學中要選取恰當?shù)陌咐ㄟ^對案例的講解分析,讓學生分層次地理解相關理論知識。實踐主要是讓學生獨立或在教師指導下完成與理論內容緊密聯(lián)系的上機任務,鞏固所學知識,提高動手能力,加深對理論的理解。
在Java教學實踐過程中,存在以下問題:
(1)教學時間短、知識點過多、教學進度過快、缺乏學習樂趣、考試成為教學重點,導致部分學生對Java語言產生畏難情緒,實踐能力得不到充分培養(yǎng)。2019年之前,學校執(zhí)行每學年三學期制,春季學期和秋季學期的教學時間只有16周,每周3課時,如果湊巧趕上公共假期,總教學時數(shù)往往只有13~14周。最初制定教學大綱時對知識點又貪多求全,教學中教師授課的進度一直比較快,未充分考慮學生的接受能力,學生在學習中沒有享受到學習的快樂,反而對Java語言產生了一定畏難情緒。再加上部分學生未能深入理解程序設計課程的教學目標,學習的主要目標是拿到滿意的成績,對教師設計的案例和布置的任務興趣不濃,考試成了教學的指揮棒,教師不得不把大部分精力用于講解教綱要求的考核內容,放松了對學生實踐能力的培養(yǎng)和訓練。
(2)部分學生缺乏主動性,對開放任務不知所措,不愿意主動獲取知識,只關注教學大綱范圍內的內容。部分學生學習比較被動,教師講什么,就跟著做什么,如果教師布置了開放性的任務,不指定具體做什么、如何做,學生往往不知所措。還有部分學生不愿主動獲取知識,如果教學內容不在教學大綱范圍,學生就沒有太多興趣去學習了解。
(3)課程時間短,教學案例過時,學生缺乏實踐機會,導致對Java語言實用價值產生疑問。由于課時相對較少,等學生儲備了足夠的知識和技能時已臨近期末,學生要忙于期末備考,沒有時間精力認真完成后期布置的實踐任務。此外,課程選用的教學案例多年未變:在屏幕上打印HelloWorld、輸出九九乘法表、求解一元二次方程等,這些案例多數(shù)基于字符界面,與現(xiàn)有電子產品的圖形化界面差距巨大,學生完成相關任務時,經常會質疑“Java語言是否有實用價值”,面對這樣的疑問,“Java能編寫跨平臺應用程序”之類的回答顯得蒼白無力。
在日常教學中,課程組采用多種教學手段:為加強課堂互動,部分內容采用翻轉課堂教學模式;為培養(yǎng)學生理論聯(lián)系實際的能力,在課堂講授中采用案例教學;為激發(fā)學生學習積極性,在上機實驗中采用任務驅動式教學。
綜上所述,Java程序設計課程教學中出現(xiàn)的這些問題與學生的學習興趣和熱情密切相關,問題的關鍵是找到合適的案例和任務激發(fā)學生的興趣。案例和任務要既能體現(xiàn)知識點,又能提升學生的學習興趣,如果選取能夠激發(fā)學生學習興趣的案例和實例作為課堂講授的示例和學生的上機任務,可以吸引學生主動參與到教學過程中。筆者在國內率先嘗試在經管類專業(yè)的程序設計課程教學實踐中引入Java第三方庫,用豐富的教學案例激發(fā)學生學習的興趣。
Java語言入門稍難,想成為熟練的程序員需要較長時間的訓練。對于非計算機專業(yè)學生而言,Python語言語法簡潔,入門很快,但就軟件本身的結構而言,Java更靈活、更精確,Python的優(yōu)勢在于豐富的第三方庫,但Python第三方庫的安裝配置略顯復雜。其實,Java也有很多第三方庫,作為近10年的首選編程語言,Java的優(yōu)勢更明顯。學習編程,不一定非要從無到有,從0開始構造所有代碼,好比建造樓房,早就不需要一磚一瓦修建了,很多模塊化的預制件可以在建筑工地之外做好。約書亞·布洛赫(Joshua Bloch)在《Effective Java》中說過:“重新發(fā)明輪子沒有意義!我們寧愿使用久經考驗的庫,也不要時不時編寫我們自己的例程[9]?!苯浌茴悓I(yè)的Java程序設計課程沒有必要貪多求全,建立起基本的面向對象程序設計概念后,任課教師可以針對學生的專業(yè)特點選擇合適的教學內容,對非必須掌握的內容,沒有必要讓學生從無到有構建完整的程序,教師可以事先搭好程序框架,引入第三方庫,讓學生自行添加“關鍵代碼”,降低Java程序設計課程的入門難度,讓學生更有興趣和成就感。
Java語言從1995年正式發(fā)布至今已有27年,經過多年發(fā)展,Java語言的生態(tài)環(huán)境非常健全,幾乎可以完成任何場景下的軟件開發(fā)任務。Java語言的生態(tài)體系非常龐大,除Oracle公司提供的JDK環(huán)境外,Apache、Google、Spring等公司(或組織)提供了非常成熟的第三方庫,Java開發(fā)者可以利用這些優(yōu)秀的第三方庫解決各種通用問題,提高開發(fā)效率。
Java語言的第三方庫可以分為Java核心擴展、Web框架、數(shù)據庫、JSON、圖表和Office文檔處理等幾類[10]。常用的Java第三方庫在各種應用程序中被廣泛使用,計算機專業(yè)的學生需要熟悉Web框架、數(shù)據庫(持久層)等系統(tǒng)開發(fā)第三方庫,經管類專業(yè)的學生側重于數(shù)據處理和數(shù)據分析,在教學中可以將Java核心擴展、圖表和Office文檔處理這幾個第三方庫作為教學案例的補充內容。
除常見的第三方庫外,斯坦福大學和JTF工作組在Java教學中也開發(fā)了用于程序設計教學的卡雷爾庫和JTF ACM庫。
20世紀70年代,斯坦福大學研究生Rich Pattis設計了一個簡單的Java編程環(huán)境,在這個環(huán)境里,程序員可以給一個名字叫卡雷爾(Karel)的機器人發(fā)送消息,卡雷爾根據消息作出回應??ɡ谞枺↘arel)是捷克劇作家,他的作品Rossum's Universal Robots為英語世界帶來了Robot(機器人)這個單詞[11]。
卡雷爾機器人只能在一個矩形世界里活動,圖1所示是一個簡單的矩形世界,左下角就是卡雷爾機器人,卡雷爾右邊的菱形是蜂鳴器(Beeper),卡雷爾可以接受前進(move())、左轉(turnLeft())、放下蜂鳴器(putBeeper())和拾起蜂鳴器(pickBeeper())這幾個命令,通過調用這4個命令讓卡雷爾在它的世界里行走、放下或拾起蜂鳴器,學生可以據此設計實現(xiàn)一些簡單又有趣的游戲。
Fig.1 Karel’s simple world圖1 卡雷爾的簡單世界
卡雷爾機器人是一個典型的對象,它能接受的命令就是對象的方法,借助于卡雷爾機器人對象,學生可以輕松地掌握如何調用方法,與游戲相似的界面和場景激發(fā)了學生的學習興趣,學生在娛樂中接受了面向對象編程思想的培養(yǎng)和訓練。
卡雷爾機器人的矩形世界的大小、障礙物等可以自行定義。圖2所示是卡雷爾的跨欄世界,如果只用move()、turnLeft()兩個方法實現(xiàn)跨欄程序,需要80多行語句才能實現(xiàn),而利用循環(huán)語句和自定義方法,只需要20多行代碼就能實現(xiàn)完整的功能。通過編寫跨欄程序,學生可以充分理解3種程序結構和自定義方法對相關功能的封裝的必要性。此外,卡雷爾的世界可以有很多變化,每個學生都可以自行定義自己的卡雷爾世界。案例1對學生的要求是自定義卡雷爾世界并使用控制語句控制move()、turn-Left()等方法設計游戲,大部分學生都能獨立完成任務,對Java程序設計有了全新的認識。
Fig.2 Karel’s hurdles world圖2 卡雷爾的跨欄世界
2.4.1 JTF ACM庫
Java的JTF ACM庫是ACM Java工作組(the ACM Java Task Force)從計算入門教育的角度對Java語言相關語法、API和工具進行簡化,是為Java語言初學者開發(fā)的穩(wěn)定的教學資源。通過使用ACM庫,讓初學Java語言的學生免于記憶復雜的Java語法規(guī)則,使得Java學習變得容易上手,而不至于因這些復雜規(guī)則而讓初學Java編程的學生不知所措。
Java語言作為能夠跨平臺使用的計算機語言,在所有編程語言中長期名列前茅,但是Java的語法規(guī)則相比Python等語言又比較復雜,這種復雜性可能成為學生在嘗試理解語言結構時的重大障礙。
Brian Kernighan和Dennis Ritchie在他們的經典教材《The C Programming Language》的第一章指出:學習一種新的編程語言的唯一方法是用它編寫程序,對于所有語言的初學者而言,編寫的第一個程序幾乎都是相同的,即:
請打印出下列內容
hello,world
本課程選用的Java教材的第一個程序也正是這樣的HelloWorld程序。在控制臺上打印一條消息,在20世紀90年代初可能是一個適合的例子,但如今的學生已經習慣了在具有精美的交互式圖形界面的電子設備上運行各式各樣的程序,他們很難理解,都進入21世紀了,為什么教材的大部分內容都是基于字符界面的控制臺程序。
當然,像Java這樣現(xiàn)代化的面向對象語言,應該可以做得更好。JTF ACM包提供了強大的圖形界面接口,讓Java初學者可以用簡單的語法,快速編寫基于圖形界面的程序,告別單調的字符界面,讓學生對Java程序設計這門課程的學習產生濃厚的學習興趣和強烈的學習欲望。要在項目中使用JTF ACM庫,與使用其他第三方庫的方法類似,在項目的類路徑中包含JTF ACM庫的JAR包即可使用。
JTF ACM庫包括:acm.program(簡單的面向對象程序模型)、acm.io(對稱處理傳統(tǒng)控制臺I/O和對話I/O的輸入輸出模型)、acm.graphics(圖形對象的擴充庫)、acm.gui(支持圖形用戶界面開發(fā)的一些新類)等,這些包里包含若干繼承自JDK的基礎類庫。[12]
2.4.2 案例2:代替?zhèn)鹘y(tǒng)Hello World程序的JTF ACM庫入門實例
JTF ACM包里的類封裝了復雜性,調用方法非常簡便,本文以HelloWorld程序為例介紹JTF ACM包的使用,如下列3個程序片段和圖3—圖5所示運行結果。
Fig.3 Running result of HelloConsole.java圖3 HelloConsole.java運行結果
Fig.4 Running result of HelloDialog.java圖4 HelloDialog.java運行結果
Fig.5 Running result of HelloGraphics.java圖5 HelloGraphics.java運行結果
類HelloConsole、HelloDialog和HelloGraphics分別繼承了ConsoleProgram、DialogProgram和GraphicsProgram這3個類,均源自ACM包里定義的Program類。HelloConsole和HelloDialog的實現(xiàn)代碼完全相同,區(qū)別在于繼承的父類不同。HelloGraphics的實現(xiàn)也比傳統(tǒng)的Java Swing簡潔,初學者只需要知道如何用類的構造方法創(chuàng)建新對象實例和調用setFont和setColor等方法,就能很方便地改變文字的坐標、字號、字體和顏色。案例2要求學生驗證3個程序,并選擇自己喜歡的界面風格,學生對HelloGraphics更感興趣,興致勃勃地變換文字的位置,修改文字的字體、大小并改變其顏色。通過編寫驗證案例2程序,學生發(fā)現(xiàn)Java坐標系和數(shù)學課上坐標系的不同:原點在左上角。Console-Program和GraphicsProgram這兩個類的引入,使得Java程序設計課堂能夠遠離字符界面,在豐富多彩的圖形用戶界面下展示各種應用。
2.4.3 案例3:繪圖與動畫效果
acm.graphics包提供了豐富的繪圖工具,與Java Graphics類的實現(xiàn)方式不同,acm.graphics包直接提供用于繪圖和各種圖形類:GLine(畫線段)、GRect(畫矩形)、GPolygon(畫多邊形)、GImage(處理圖像)等,這些類均繼承自JObject類,除繪制圖形和設置顏色的方法外,還有move()(移動)和pause()(延時)這兩個方法配合實現(xiàn)動畫效果。在教學過程中,學生掌握類的實例化知識后,就可以利用這些類創(chuàng)建圖形對象,繪制豐富的圖形。
美麗校園案例程序使用GRect類和GOval類繪制了矩形和圓,如圖6所示。程序主要代碼片段如下:
Fig.6 Running result of beautiful campus case program圖6 美麗校園案例程序執(zhí)行結果
run方法中,前4條語句繪制了一個矩形框:
(1)使用GRect構造方法生成新的GRect實例,其中RECT_X、RECT_Y、RECT_WIDTH、RECT_HEIGHT為控制矩形的常量:(RECT_X,RECT_Y)為矩形坐標,RECT_WIDTH、RECT_HEIGHT為矩形的長和寬。
(2)setColor和setFilled方法給矩形對象發(fā)送消息,與案例2類似,setColor消息可以改變矩形顏色,setFilled決定矩形的填充方式。
(3)add方法將矩形添加到圖形窗口對象。
與前4條語句類似,后5條語句繪制了一個圓。
move方法可以調整圖形圖像的位置,pause方法可以讓程序暫停指定毫秒的時間,調用pause方法對于實現(xiàn)動畫是必不可少的步驟,計算機運行得如此迅速,如果不減緩移動速度,肉眼無法看到移動效果。將以下包含move()和pause()方法的代碼加入美麗校園程序的run方法內,可實現(xiàn)圓向右下方移動50像素的動畫效果,如圖7所示。
Fig.7 Animation effect of beautiful campus case program圖7 美麗校園案例程序動畫效果
案例3的示例程序對學生的吸引力非常明顯,案例3的任務是自己動手繪制圖形(或調用GImage類操控圖像)、設計運動軌跡和控制動畫對象,該案例極大地激發(fā)了學生的興趣和創(chuàng)造力,絕大多數(shù)學生自行設計了背景和運動對象,重新規(guī)劃了運動軌跡。案例3的示例鞏固了程序控制語句和類與對象的相關知識,并介紹了計算機動畫的基本原理,吸引學生進一步地深入學習相關知識,提升編程能力。
2.4.4 案例4:隨機數(shù)案例
RandomGenerator類實現(xiàn)了一個簡單的隨機數(shù)生成器,該生成器允許客戶端生成偽隨機整數(shù):雙精度浮點數(shù)、布爾型和顏色。RandomGenerator類來自acm.util包,繼承自java.util.Random。隨機數(shù)案例程序使用GRect類繪制矩形,利用RandomGenerator類生成隨機顏色,利用pause方法實現(xiàn)時延,程序在窗口中間放置一個正方形并每秒隨機改變一種顏色,運行結果如圖8所示,程序繪制矩形的代碼和案例3類似,主要區(qū)別是顏色利用RandomGenerator類的nextColor方法設置。
Fig.8 Running result of random number case program圖8 隨機數(shù)案例程序執(zhí)行結果
經管類專業(yè)分析研究的前提是要有數(shù)據,做模擬或者測試時總會用到大量的隨機數(shù)據。JDK提供的Math.random()方法和Random類可以生成隨機數(shù),但對向量與矩陣運算稍顯吃力。apache-commons-math3是Java的一種科學計算類庫,提供了很多類和方法用于向量與矩陣運算,其中也有RandomGenerator類用于隨機數(shù)的生成。案例4的擴展任務是閱讀apache-commons-math3的相關文檔,結合自身專業(yè)特點,探討隨機向量和矩陣的生成及計算,為以后經管類專業(yè)的分析研究做相關技術儲備。
對于任何學科而言,合適的案例總能給學生帶來必要幫助。引入第三方庫,豐富教學案例的目的是吸引學生的興趣,同時也是傳統(tǒng)案例教學法的拓展。直觀的圖形、生動的動畫,第三方案例對Java語言能力進行了充分展示,使學生重新認識了Java語言,對程序設計課程也有了新的理解,更重要的是興趣提升,越來越多的學生樂于動手編程,學習更具有主動性,部分學生對計算機專業(yè)產生了濃厚興趣。西南財經大學2022年轉專業(yè)相關數(shù)據顯示,全校有18位學生申請轉到計算機科學與技術專業(yè)。
在教學實踐中,案例不是教學設計的全部,引入第三方庫的案例教學,不僅僅是教學內容的重構,也為教學設計帶來了更多的靈活性。信息技術更新迭代提速,程序設計課程在滿足基本教學目標的前提下,引入新的第三方庫案例能夠讓課程教學內容與時俱進,不僅僅局限于語言本身,而是在課程中展示完整的計算生態(tài)。
在經管類專業(yè)Java程序設計課程教學中,引入第三方庫案例的Java程序設計課程教學效果良好。學校近兩年課程教學中期評價表數(shù)據顯示,86.7%的學生認為案例或作業(yè)等對學習效果提升很好。兩年前程序設計及應用(Java)課程的開課班數(shù)僅剩3個,而2022年春季學期開課班數(shù)達到6個。期末考核暫時仍采用傳統(tǒng)的閉卷考試,根據試卷分析表可知,多數(shù)學生能夠理解并掌握面向對象的基本概念,各教學班的平均分數(shù)為81.2,也較2021年的79.3有所提升,也證明了這種教學方法的有效性。