蔣曉南
(蘇州托普信息職業(yè)技術(shù)學(xué)院,江蘇 昆山 215311)
教學(xué)目標(biāo)是一個(gè)很值得討論和研究的問題。 作為一名高職高專院校的教師筆者一直很疑惑,究竟高職高專院校培養(yǎng)人才的目標(biāo)是什么? 通常得到的答案是,培養(yǎng)高素質(zhì)的應(yīng)用型人才。 如果這是真的,那么整個(gè)教學(xué)體系的設(shè)計(jì)就存在著嚴(yán)重問題。
包括Java在內(nèi)的許多程序設(shè)計(jì)類課程,多以考證作為教學(xué)的最終目標(biāo)。 不可否認(rèn)這是非常務(wù)實(shí)的做法,因?yàn)樵趯?duì)高職高專院校的評(píng)價(jià)體系中,這是重要的指標(biāo)。 然而,以考證為目標(biāo)的教學(xué),真的可以讓更多學(xué)生通過程序設(shè)計(jì)類的考試嗎? 考過了又代表什么呢? 就可以勝任程序員的工作嗎? 一位著名互聯(lián)網(wǎng)公司的程序員曾經(jīng)說過,100 張證書也不及1 個(gè)Demo。
計(jì)算機(jī)程序設(shè)計(jì)類的競(jìng)賽考試,普遍以數(shù)據(jù)結(jié)構(gòu)與算法的知識(shí)作為考核重點(diǎn)。 不可否認(rèn),數(shù)據(jù)結(jié)構(gòu)與算法是程序設(shè)計(jì)的核心,然而是否所有應(yīng)用型人才都必須掌握這種核心呢? 或者說是否要在剛接觸程序設(shè)計(jì)不久就掌握這種核心呢? 不精通算法就不能成為程序員嗎?
事實(shí)上,程序員分為兩大類,Class Creator(基礎(chǔ)類設(shè)計(jì)師)和Client Programmer(客戶程序員)。前者的確需要更好地掌握各種數(shù)據(jù)結(jié)構(gòu)與算法的知識(shí)才能設(shè)計(jì)出效率更高的方法(函數(shù)),而后者在絕大多數(shù)情況下只需要調(diào)用前者設(shè)計(jì)出來方法(函數(shù))解決實(shí)際問題就可以了,沒必要深究方法(函數(shù))的具體設(shè)計(jì)過程。 高職高專院校的宗旨是培養(yǎng)應(yīng)用型人才,應(yīng)該以后者作為培養(yǎng)的目標(biāo)。 實(shí)際上,生活中所接觸到的大量程序員,基本都屬于后者。
高職院校的宗旨是培養(yǎng)應(yīng)用型人才,但多數(shù)高職高專教材與本科教材沒有本質(zhì)的差別,只是在內(nèi)容上進(jìn)行部分刪減,完全沒有針對(duì)性。 當(dāng)然在提倡項(xiàng)目式教學(xué)的時(shí)代,也有不少教材在內(nèi)容上做出了比較大的調(diào)整,加入了一些大型應(yīng)用案例,拆散后分布在各個(gè)章節(jié)加以介紹。 個(gè)人認(rèn)為,這樣做太過急功近利。
一個(gè)嬰兒不能一出生就大魚大肉的喂食,即使撕成小塊他也無法消化。 一個(gè)程序設(shè)計(jì)的初學(xué)者就好比一個(gè)嬰兒, 應(yīng)該先以一些容易消化的食物進(jìn)行喂養(yǎng),再慢慢加入一些高營(yíng)養(yǎng)卻難消化的食物。
教學(xué)內(nèi)容往往與前面提到的兩點(diǎn)密切相關(guān),傳統(tǒng)的程序設(shè)計(jì)類課程一般會(huì)安排大量課時(shí)講解基本語法, 以及利用基本語法知識(shí)進(jìn)行大量算法習(xí)題訓(xùn)練,超過半學(xué)期的課程都停留在main 方法(函數(shù))的編寫和命令行的輸入輸出。
必須承認(rèn),這樣的教學(xué)內(nèi)容安排可以很扎實(shí)地打下編程基礎(chǔ),也可以在一定程度上提高學(xué)生的邏輯思維能力,與各類程序設(shè)計(jì)考試、競(jìng)賽都非常合拍。 但這種教學(xué)內(nèi)容安排只適合于邏輯思維能力較強(qiáng),擁有較高學(xué)習(xí)主動(dòng)性的學(xué)生,而對(duì)于絕大多數(shù)高職高專的學(xué)生來說,無疑是致命的打擊。 抱著好奇心而來的學(xué)生,往往很快感到乏味,不少有上進(jìn)心的學(xué)生也會(huì)因?yàn)閷?duì)自己的邏輯思維能力缺乏信心而最終選擇放棄。 而且,這樣的教學(xué)內(nèi)容安排,忽略了Java是一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,學(xué)生學(xué)完整學(xué)期的課程仍然只擁有面向過程的程序設(shè)計(jì)思維,即使是通過了計(jì)算機(jī)二級(jí)考試或是其他程序設(shè)計(jì)類考證的優(yōu)秀學(xué)生,也根本無法完成簡(jiǎn)單應(yīng)用程序的開發(fā)。
個(gè)人認(rèn)為,即使以考證作為終極目標(biāo),也不該過早地將算法內(nèi)容強(qiáng)加給學(xué)生。 算法屬于基礎(chǔ)研究的領(lǐng)域,應(yīng)該把它作為學(xué)習(xí)和提高的目標(biāo),而不應(yīng)該作為學(xué)習(xí)的起點(diǎn),因?yàn)檫@違反人類基本的學(xué)習(xí)習(xí)慣。 人總是先學(xué)會(huì)吃飯,再學(xué)會(huì)做飯,最后才學(xué)會(huì)種地。 當(dāng)然你可以說,不學(xué)會(huì)種地,哪來的飯吃? 但如果你教一個(gè)剛出生的嬰兒,先學(xué)種地,再學(xué)做飯,最后才吃上飯,他一定會(huì)餓死。 今天,很多人都不會(huì)種地,然而一樣生活得很好。 當(dāng)然你還可以說,如果不懂種地,你就不知道什么是真正有機(jī)和健康的食物。 筆者承認(rèn),然而這并不妨礙一個(gè)有動(dòng)力的人繼續(xù)學(xué)習(xí)和提高。
前文中討論了Java教學(xué)中存在的各種問題,下面針對(duì)這些問題提出筆者的改革方案。
拋開傳統(tǒng)桎梏,培養(yǎng)新時(shí)代應(yīng)用型人才。 完成一學(xué)期的Java程序設(shè)計(jì)教學(xué),應(yīng)該能夠讓學(xué)生完成簡(jiǎn)單應(yīng)用程序的設(shè)計(jì),至少能在現(xiàn)有程序的基礎(chǔ)上加以改造和創(chuàng)新,不需要高端,不需要新穎,只要能夠親自動(dòng)手完成設(shè)計(jì)即可。
在這種教學(xué)目標(biāo)的驅(qū)使下,學(xué)生能夠更多地體會(huì)到軟件設(shè)計(jì)帶來的成就感,從而迸發(fā)出更強(qiáng)烈的學(xué)習(xí)熱情。 俗話說“師傅領(lǐng)進(jìn)門,修行在個(gè)人”,靠的便是這份熱情,有了熱情,教師就可以引導(dǎo)學(xué)生自主地進(jìn)行更深層次的學(xué)習(xí),從而完善提高自己。
項(xiàng)目式教學(xué)是目前較為推崇的教學(xué)模式,它和高職高專院校的人才培養(yǎng)目標(biāo)也很吻合。 然而,如果只玩弄名詞,不尊重實(shí)際教學(xué)過程,很快就會(huì)將這種教學(xué)模式埋進(jìn)歷史垃圾堆。
有些教材為了吸引眼球,直接將一些大型的甚至是企業(yè)級(jí)的案例原封不動(dòng)的搬到教材,拆散后放到各個(gè)章節(jié)講解,且不說學(xué)生無法接受,就是教師看著都吃力。 而且,這種級(jí)別的案例往往需要完整學(xué)完才能看到系統(tǒng)運(yùn)行的效果,如果學(xué)期不夠長(zhǎng),根本學(xué)不完,即使能夠?qū)W完,也會(huì)因?yàn)榉答佒芷谔L(zhǎng),而使學(xué)生喪失興趣和信心。 如果不慎選擇了這些教材,將使教學(xué)成為一個(gè)個(gè)爛尾工程。
所以在教材選用方面,個(gè)人鐘情于一些以小型案例為主的教材。 這些案例通??梢栽?~4 學(xué)時(shí)內(nèi)講完,同時(shí)還留有改進(jìn)和升級(jí)的空間。 這樣的案例放在教學(xué)中,不僅能讓學(xué)生感受到及時(shí)的反饋,還能留給學(xué)生發(fā)揮創(chuàng)意的余地。 這樣,經(jīng)過幾個(gè)案例的講解,學(xué)生就會(huì)對(duì)軟件設(shè)計(jì)開發(fā)產(chǎn)生基本的認(rèn)知,從而產(chǎn)生濃厚的興趣。
個(gè)人認(rèn)為,如果在開設(shè)Java課程之前已經(jīng)開設(shè)過C 語言課程, 那完全可以略過語法基礎(chǔ)部分的講解。如果沒有開設(shè)過,也不應(yīng)該花太長(zhǎng)時(shí)間講解語法基礎(chǔ)和程序結(jié)構(gòu),更沒有必要在算法里打轉(zhuǎn),只要夠用就可以引入一些簡(jiǎn)單的案例進(jìn)行講解,伴隨著案例難度的提升再慢慢引入其他必要的基礎(chǔ)知識(shí)。 就好像一個(gè)嬰兒,沒必要等他把刀、叉、勺、筷子等所有餐具都使用熟練后才教他吃飯,只要會(huì)用勺就可以把飯先吃起來,等遇到了瓶頸再教他使用其他餐具。 否則,沒等到他把刀、叉、勺、筷子都練熟就先餓死了,即使幸存下來也會(huì)驚奇地發(fā)現(xiàn)自己連咀嚼和吞咽都不會(huì)。
以上是針對(duì)Java教學(xué)內(nèi)容設(shè)計(jì)的概要論述,下面給出具體的教學(xué)內(nèi)容設(shè)計(jì)方案。
第一階段:語法及編程基礎(chǔ)
如果沒有開設(shè)過C 語言課程,那么必要的基礎(chǔ)知識(shí)應(yīng)該包括:(1)實(shí)驗(yàn)環(huán)境的搭建:主要講解實(shí)驗(yàn)環(huán)境的安裝、使用以及第一個(gè)Java程序“Hello World”的編寫;(2)標(biāo)識(shí)符與關(guān)鍵字,數(shù)據(jù)類型與常量、變量,運(yùn)算符與表達(dá)式:關(guān)鍵字、數(shù)據(jù)類型和運(yùn)算符可以有選擇性地講解,沒必要一開始全部交給學(xué)生;(3)語句與程序控制結(jié)構(gòu): 程序控制可以主要講解if…else、for 和while,并且不要在此陡然增加程序難度,盡量避免多重循環(huán)嵌套的復(fù)雜例題講解,會(huì)用即可;(4)方法(函數(shù)):此處應(yīng)該重點(diǎn)講解,因?yàn)樗敲嫦驅(qū)ο蟮幕A(chǔ)。當(dāng)然,應(yīng)該側(cè)重方法定義、方法調(diào)用、入口參數(shù)、返回類型等相關(guān)知識(shí)點(diǎn)的講解, 至于方法內(nèi)在功能設(shè)計(jì)、形參實(shí)參和遞歸調(diào)用等問題也可暫緩介紹;(5) 數(shù)組和字符串: 簡(jiǎn)單介紹數(shù)組和字符串的定義和應(yīng)用即可,不必在此升級(jí)問題難度。 盡量避免數(shù)組排序、二維數(shù)組遍歷等較為復(fù)雜的例題講解。 在講解字符串時(shí),也可順便引入Java的API 文檔,有選擇性地介紹一些字符串常用方法。
如此一來,不出24 學(xué)時(shí)便可結(jié)束第一階學(xué)習(xí)。 如果開設(shè)過C 語言課程,那只需要講解上述(1),省略上述(2)(3),上述(4)(5)也可以根據(jù)學(xué)生掌握的具體情況,進(jìn)行重點(diǎn)的強(qiáng)調(diào)和補(bǔ)充,不出12 學(xué)時(shí)便可結(jié)束第一階段學(xué)習(xí)。
第二階段:面向?qū)ο笏枷肱c基礎(chǔ)
筆者認(rèn)為, 應(yīng)該以圖形用戶界面作為起點(diǎn)開始真正的Java旅程。 原因有以下幾點(diǎn):(1)雖然桌面應(yīng)用程序并非Java最常見的應(yīng)用領(lǐng)域,然而在Windows 環(huán)境下成長(zhǎng)起來的中國(guó)人對(duì)于圖形界面卻非常熟悉和親切,這樣有助于提高學(xué)生的學(xué)習(xí)興趣;(2)圖形界面可以非常直觀地體驗(yàn)到人機(jī)交互, 在講解案例時(shí)可以緊緊抓住課堂上的注意力, 在改造和完善案例的實(shí)踐中也可以調(diào)動(dòng)起學(xué)生的積極性;(3)圖形界面擁有很好的擴(kuò)展性和延伸性, 可以順利擴(kuò)展延伸到其他知識(shí)內(nèi)容中,可以讓學(xué)生在不知不覺中涉獵和鞏固更多知識(shí)點(diǎn)。
在起步階段可以使用一些常見的圖形組件, 如:窗口、菜單、按鈕、文本框等搭建一些經(jīng)典窗口界面,并直接引入類、對(duì)象和包的概念;接著可以繼續(xù)引入類的實(shí)例化、成員方法的調(diào)用、構(gòu)造方法的作用以及類的設(shè)計(jì)原則。
為鞏固知識(shí)可以讓學(xué)生自主設(shè)計(jì)各種界面進(jìn)行練習(xí)。 需要注意的是,在起步階段不應(yīng)該使用IDE 工具直接手繪界面,否則無法引入相關(guān)知識(shí),也無法鍛煉學(xué)生程序設(shè)計(jì)能力。
如果平穩(wěn)起步,接下來就可以將教學(xué)內(nèi)容進(jìn)行逐步地?cái)U(kuò)展與延伸。
首先, 可以利用更復(fù)雜的界面設(shè)計(jì)案例引入繼承、多態(tài)的知識(shí)點(diǎn),還可以回頭針對(duì)第一階段的內(nèi)容進(jìn)行加深鞏固。
其次, 可以講解圖形界面中事件處理的問題,并順利引入抽象類、接口、內(nèi)部類及匿名類的相關(guān)知識(shí)點(diǎn)。 當(dāng)然,在此不必深挖概念和特性,了解會(huì)用即可。
最后,可以利用如“計(jì)算器”這樣的完整小案例對(duì)第二階段的知識(shí)點(diǎn)進(jìn)行復(fù)習(xí)與總結(jié),并在實(shí)踐環(huán)節(jié)中加以引導(dǎo),充分調(diào)動(dòng)學(xué)生的好奇心與積極性。
第三階段:案例牽引
利用案例牽引著學(xué)生涉獵Java其他模塊的相關(guān)知識(shí),雖然只能淺嘗,但是也可以開闊眼界、增加興趣。
首先,可以利用類似“記事本”這樣的文件操作案例,引入JavaIO 系統(tǒng)和異常處理的相關(guān)知識(shí)。
其次,可以利用類似“畫圖”這樣的圖形繪制案例,引入Java圖形繪制以及圖像處理的相關(guān)知識(shí)。
最后,可以利用類似“計(jì)時(shí)器”這樣的案例,引入Java多線程的相關(guān)知識(shí)。
通常到了這個(gè)階段,學(xué)時(shí)已用大半,可根據(jù)學(xué)生接受情況進(jìn)行靈活調(diào)整。 如果學(xué)時(shí)充足,可以再利用“網(wǎng)上聊天”案例引入網(wǎng)絡(luò)編程的相關(guān)知識(shí),或者利用“貪吃蛇”這樣的桌面小游戲進(jìn)一步提高學(xué)生的學(xué)習(xí)興趣。但如果學(xué)時(shí)不足,也可將第三階段的部分案例去除。
至于數(shù)據(jù)庫編程部分, 往往都和大系統(tǒng)開發(fā)相關(guān),案例通常較大,不太適合直接引入Java基礎(chǔ)教學(xué),所留學(xué)時(shí)也必定不足以進(jìn)行詳細(xì)的案例分析和講解。如果要講,可以只講一些基本的技術(shù)手段,其他內(nèi)容可以留待Java后續(xù)課程開展。
經(jīng)過多年教學(xué)實(shí)踐,發(fā)現(xiàn)改革后教學(xué)效果有了明顯改善,主要體現(xiàn)在以下幾個(gè)方面:(1)課堂提問率比原來提高了20%;(2)不少學(xué)生在作業(yè)完成后,為了精益求精,多次改版并重新提交;(3)少數(shù)學(xué)生課后主動(dòng)上網(wǎng)尋找案例研究,并在線尋求本人解答;(4)筆者曾被多次詢問,何時(shí)開設(shè)Java后續(xù)課程。
當(dāng)然,在多年教學(xué)實(shí)踐中,也發(fā)現(xiàn)了一些問題,主要體現(xiàn)在以下幾個(gè)方面:(1)當(dāng)案例難度提升時(shí),學(xué)生開始感到吃力,熱情也開始慢慢下降。 說明案例的選擇還需進(jìn)一步優(yōu)化;(2)在Java后續(xù)課程如“JavaWeb開發(fā)”中,突然運(yùn)用多項(xiàng)技術(shù)進(jìn)行綜合開發(fā),讓學(xué)生感到極為不適應(yīng)。 說明課程銜接做得還不夠好;(3)面對(duì)一心只想考證或者升學(xué)的學(xué)生,未能起到更多輔助作用。