說明:這篇文章是專門針對大學低年級學生(和其他軟件開發初學者)寫的,如果你己經是研究生或本科高年級學生,請將這篇文章轉發給你的師弟或師妹,希望這篇文章能夠幫助他們少走彎路,順利地邁入軟件開發的大門;如果您是一位有經驗的軟件開發者,或者是關注計算機教育的同行,也敬請提出寶貴意見。
最近,台灣知名技術專家蔡學镛先生寫了一本《編程ING》,宣稱“人人都能學會程序設計”。作為一名IT教育工作者,這本書引發了我的興趣,翻看之後,共鳴之處不少,結合國內計算機教育的現狀,產生了頗多感觸,於是就有了這篇小文。
一、為什麼學生視編程為畏途?
先當學生後當老師,不知不覺之中我在大學裡己“混”了十多年,我發現,進入計算機專業就讀的學生,最初至少有一大半對真實的軟件開發根本不了解,是 “一張白紙”,不幸的是,學了四年之後,許多張“白紙”又變成了許多罐“漿糊”,帶著對軟件開發可能是畏懼也可能是無所謂但絕對不是喜歡的感觸離開校園。
編程真的那麼沒勁?那麼難和枯燥?
我寫了將近二十年的代碼,雖然不靠編程吃飯,但也似乎勉強可算是個老程序員,我對編程的看法可總結為兩句:何以解憂,唯有編程!我經常在想一個問題:編程其實是很有趣很好玩很實用並很有成就感的一件事,為什麼會有這麼多的學生視編程為畏途?而我們的計算機教育,為什麼在打掉學生對編程的興趣方面 “如此成功”?
蔡學镛先生在《編程ING》給出了一張圖:
圖 1 正向興趣循環是學習的關鍵
我認為這張圖道出了問題的關鍵——學習過程中的“正向”興趣循環是否成功地建立。
強烈的興趣與不斷獲得的成就感是整個學習過程的“引擎”,它為學生完成整個學習任務提供源源不斷的強大動力。有無數的事實支持這個觀點。
傳統的教學觀點認為,本科的主要教育目標之一是為學生在本專業領域未來的發展“打下扎實的理論與實踐基礎”,所以從一開始就要“嚴格要求”,“科學訓練”。
這個觀點不能說錯,但我認為,我們的計算機教育,尤其是針對初學者的教育,首要的任務是引發興趣。沒有興趣,一切免談。
我所了解的事實是:計算機專業的學生有不少視編程為畏途。其原因在於我們的現有計算機教學方式從一開始就給了這些學生“痛苦”的編程體驗,不幸的是,這種體驗在後期枯燥的專業課學習中不斷得到強化,學生最終對編程敬而遠之或畏之如虎。
事實上,教育學研究早己指出,成功的高效的教學應該是這樣的:循序漸進,由淺入深,步步為營,興趣導向。
教師的職責,不是將知識“灌入”學生的大腦,首要的任務是引發學生的興趣,鼓勵他們去探索未知的領域,主動地學習和吸收知識,培養技能,積累經驗。在這個學習過程中,教師要成為一名優秀的導航員,給學生繪出航線,鼓勵他們出海遠航,解決他們在航行中所遇到的困難,並幫助學生建立學習的“正向”興趣循環。
對編程的“第一印象”很重要啊!由此,引發了一個很有趣的問題——應該選擇哪一門語言作為學生的第一門編程語言?
二、你學的第一門編程語言是什麼?
在國內的大學中,當前大多數選用C作為學生的第一門編程語言。這其實並沒有太大的問題,C的重要性無須我多說。其實問題的關鍵不在於選擇C教學,而在於以哪種方式去教。
很不幸,國內許多C語言的教材都將主要的精力放在對C語法細節的介紹上,課程考核方式又很古板——很多院校采用閉卷考試,出一堆的選擇題和填空題。典型的題目是將一段代碼砍掉一兩句,讓學生“填空”。有哪位高手是通過做這些“填空題”學會編程的?上機也流於形式,讓學生反復折騰幾個“黑底白字”的 “玩具般的”小程序,學了一個學期,學生連一個有點用的程序都寫不出來……
這種僵化的教學方式,足以毀掉多數學生對編程的興趣。
我個人認為,C不應該成為針對大多數學生所講授的第一門編程語言,我們的教學體系,應該給學生提供更多的選擇。
針對初學者所講授的第一門編程語言,應該具有以下的特點:
(1)必須是“有趣”的,能誘導人去“動手”和“思考”。
(2)需要對初學者屏蔽不必要的底層技術細節,以免分散他們的注意力。
(3)這種語言必須足夠簡單,但同時又具備足夠的能力編寫出實用的程序,從而讓學生能比較容易地獲得成就感,感悟到軟件開發的魅力。
(4)這種語言必須能充分地體現現代軟件開發的基本思想和技術成果,為學生進一步深入學習打下基礎
(5)花在這門編程語言上的時間和精力是有回報的,掌握了它,就掌握了一個強大的工具,可以在今後的學習中使用這個工具進行實踐和創造。
另外,這門編程語言的學習,應該有助於初學者正確理解與體會到以下的編程思想:
(1)分而治之:將大問題切分為小問題。
(2)組件化與模塊化:以搭積木的方式“構建”出軟件系統。
(3)算法思想:針對實際問題建立數學模型,設計計算機算法,最終編程解決問題。
同時,這門編程語言的學習,應能有效地培養出以下的編程基本功:
(1)調試代碼的能力。
(2)撰寫可讀性強、擴充性好、易於復用的優質代碼的能力,培養良好的編程習慣。
(3)查找技術資源與閱讀技術文檔的能力。
也許一門編程語言的學習無法達到上述的所有要求,但組合幾種不同的編程語言就差不多了。下面,我介紹幾種適合於初學者入門的編程語言。
三、適合於入門的腳本編程語言
為了教初學者學會編程,蔡學镛先生的《編程ING》選擇了REBOL編程語言,這個語言確實比較簡單,而且蔡先生的書圖文並貌,用它來訓練編程的基本技能很合適,但REBOL這門語言似乎過於小眾化了一些,而且書中缺乏有力的能引發初學者興趣的應用實例。
依據我的經驗,如果初學者能動手寫出幾個有用的實例,他喜歡上編程的可能性會大大增加。
以下是我粗略歸納的很容易引發學生成就感的幾個技術領域:
1.圖形圖像與動畫、多媒體
2.游戲
3.網絡應用
4.擁有可視化界面的桌面應用程序
5.能跑在手機上的應用程序
就我個人看法,第一門語言比較適合采用腳本式的編程語言。
Python:認識編程是怎麼回事,訓練基本編程技能
國外有許多人非常推崇Python(http://www.python.org),認為它是最適合初學者學習的一門編程語言。
Python是一種動態編程語言,語法簡潔易學,本身是開源的,Python程序可以運行於幾乎所有主流的操作系統之上。
對於初學者而言,使用Python可以學習基本的編程知識(比如學會編寫分支、循環語句),體會動態編程語言的特點,並理解類和對象等面向對象編程的基本知識。
但針對國內的實際情況,使用Python存在著一些問題:
(1)官方提供了一個交互式的開發環境IDLE,易於使用,但要開發擁有可視化界面的程序比較麻煩,其他廠商的開發環境也不太成熟穩定。
(2)缺少合適的中文教材,與其他語言相比,在國內應用也並不算廣。 個人觀點:使用Python對初學者進行基本編程技能的訓練還是比較合適的,但在使用它入門之後,還必須學習其他的編程語言。
MATLAB和Scilab:訓練算法的設計與編程實現能力
學習、應用和設計各種算法,培養為各種問題建立數學模型的能力,這對於軟件開發而言非常重要,我國己在高中數學教學中引入了算法,並將其納入了高考的考試內容,這是件好事。
當前高中新課標數學課本中,使用的是由法國國家信息自動化研究院(INRIA)開發的Scilab(http://www.scilab.org/),這個軟件與大學裡流行的MATLAB高度類似,是學習算法的好工具。
比較遺憾的是,Scilab也缺少足夠的中文資料,並且由於高考數學僅考察簡單的算法流程圖,占分很少,因此大多數的高中都不會對這塊投入太大力氣,學生的算法思想和數學建模能力無法得到比較充分的訓練,這個任務只能留到大學來完成了。
使用Scilab或MATLAB作為第一門編程語言是完全可以的,與Python類似,Scilab或MATLAB編程采用交互式的運行方式(圖 2),編程語法也很簡易,通過它同樣能培養出基本的編程技能,特別是它們強大的數學圖形功能,對學生吸引力很強,Scilab或MATLAB編程對他們數學能力與算法設計應用能力的訓練無以倫比,這種能力會為學生未來在學術研究領域的發展提供強勁動力。
圖 2 Scilab交互式編程環境
Office+VBA:用VBA代碼控制Office,讓各種工作自動化
幾乎所有大學都開設有《計算機基礎》這門課程,其中大多都會講授微軟Office軟件包的使用。但當前這門課程教學方式是存在問題的,比如我看到過一些考試試題,考核學生是否記住了Word的某些操作快捷鍵,這完全是本末倒置!其實,將本課程教學內容略作改革,完全可以用於培養學生的編程技能,其中的關鍵在於加強或新增以下幾個內容:
(1)使用Excel進行數據分析,講授Excel中功能強大的各種函數用法及數據的可視化呈現,這不僅實用,而且能有效地培養學生處理與理解數據的能力,而程序本質上不就是完成信息加工處理的工作嗎?
(2)使用Access存儲與檢索數據,這能讓學生掌握數據庫使用的基礎知識,形成對數據庫技術的感性認識。
(3)Visual BasicFor Application(VBA)編程:VBA是一種腳本式的編程語言,在Office軟件包中具有“控制一切”的能力,使用它進行編程的最大好處時能讓學生體會到——原來很多操作均可以一鍵“自動化”,並且在實現這種“自動化”的過程中擁有成就感。
Processing編程語言:體會圖形與動畫的魅力
國內可能有很多人不知道Processing這個編程語言(http://www.processing.org/),其實它己有10多年的歷史,由美國CaseyReas教授與 Ben Fry所設計,可用於構造豐富多彩的交互式應用軟件。
與其它編程語言相比,Processing最強悍之處在於它的圖形圖像及動畫編程功能。而在整個計算機技術領域中,這一塊無疑是最吸引人的技術領域之一。
雖說磨刀不誤砍柴功,但有不少編程語言在能夠真正“砍柴(即動手開發真正有用的程序)”之前,需要太長的時間“磨刀(學習語法,掌握開發工具、閱讀 API文檔等等)”,而Processing就不存在這個問題,它的編程語法與Java一致,但比Java簡潔得多,另外,與復雜的IDE如 Eclipse、Visual Studio之類相比,Processing的編程環境非常簡單,這有助於學習者將主要精力用於創作上,並鼓勵他們大膽地進行開發實踐。
圖 3 Processing編程環境
Processing提供了一批直觀、簡潔而功能強大的圖形圖像函數,學習者僅需花少量時間學習就能立即投入到創作之中,而它所提供的大量可運行實例,能有效地激發學習者的想象力。
Processing具有很強的可擴展性(現在已經有一百多個庫可用了),特別地,Processing內置了對於Android的支持,Processing程序能夠跑在Android手機上,這大大地增加了它的吸引力。
也許不少國內高校目前還無法開設Processing課程,但事實上大學生們是完全可以自學的,Processing網站上有足夠的學習資源和示例,唯一比較遺憾的是這些資源都是英文的。
Small Basic:適合“零編程基礎”人的編程語言
在中國,有不少人是通過Basic語言邁入編程的大門的,特別是微軟在上個世紀所推出的Visual Basic,更被視為Windows桌面編程最佳入門語言,只可惜這個優勢在其後繼版本Visual Basic.NET中己經不復存在,從功能上說,現在的Visual Basic.NET與C#基本一致,付出的代價是Visual Basic.NET語言本身的復雜程度也變得與C#是同一級別的了,而後者的使用者要比前者多得多,與其學Visual Basic.NET,不如直接學C#。
這裡,我想介紹的是微軟所推出的另一種Basic編程語言——SmallBasic(http://www.smallbasic.com/)。
微軟公司在其軟件用戶友好性方面一直做得非常出色,Small Basic沿襲了這個特色,其開發環境的易用性超過前面介紹的所有編程語言,並提供智能的編程幫助(圖4)。
圖 4 Small Basic的智能編程環境
Small Basic提供了兩個強大的“窗口”對象——TextWindow(用於輸出文本)和GraphicsWindow(用於繪圖),特別有趣的,它從歷史悠久的Logo語言中得到借鑒,提供了一個小烏龜(Turtle)對象,通過簡單的指令就可以命令這只小烏龜(Turtle)在屏幕上“爬”出各種圖案來,確實有趣好玩。
我個人看法,Small Basic是一個非常好的針對“零基礎”人的入門編程語言,特別適合於年紀較小的學習者(比如初高中學生),也可供非計算機專業(比如文科專業)的大學生編程快速入門。
HTML 5 + JavaScript:互聯網時代的主流編程語言
各種腳本編程語言中,我想介紹的最後一種是JavaScript。
JavaScript早就是Web客戶端事實上的主流編程語言,它的運行環境是浏覽器,當前所有的計算機和絕大部份智能手機都至少安裝有一種浏覽器,JavaScript程序“到處都可以運行”。
JavaScript程序的編寫極為簡單,就算使用Windows記事本,寫上幾段也不算太麻煩。
JavaScript早期存在的問題主要是各浏覽器廠商自行其是,標准不統一,而且缺少必要的調試工具,但這些問題現在己大大緩解。以開發工具來說,主流的IDE紛紛加入對JavaScript程序開發與調試的支持,比如Visual Studio 2010/2012就做得很出色,另外,隨著我們進入移動互聯網的時代,HTML 5是唯一能被各廠商接受的標准,與此對應,JavaScript也正在走向標准化。
與Python等語言類似,JavaScript也可歸入動態腳本語言的范疇,語法簡單,同樣支持面向對象的編程方式,但JavaScript的使用遠比Python等語言廣,諸如jQuery之類的各種JavaScript庫如雨後春筍般地出現,其功能無所不包,甚至在服務端JavaScript 也大展身手,比如一個事件驅動的服務端JavaScript運行環境——Node.js(http://nodejs.org/)就相當引人注目。
JavaScript在HTML 5規范中擁有核心的地位,可以用JavaScript完成很多的工作:
1.基於canvas可編程繪制二維的圖形,使用SVG通過DOM可構造交互式的應用
2.HTML 5的audio和video元素可以播放音頻和視頻,所以可以用JavaScript開發多媒體應用
3.Geolocation、Communication和WebSocket API支持編寫地理感知的互聯網應用程序
4.……
為了搶戰先機,各大浏覽器廠商都在不斷地完善自己的產品,爭取能支持更多的HTML 5特性,而且智能手機的兩大主流操作系統iOS和Android都可以運行使用JavaScript編寫的Web應用。微軟也在緊跟這個潮流,在其最新的 Windows 8中,可以使用JavaScript編寫Metro風格的Windows 8 應用。
由此看來,JavaScript可謂是風光無限。
我強力推薦在高校中推廣JavaScript課程,其實國內高校在這方面也已經有一定基礎了,比如許多高校都開設有《網頁設計基礎》這門課程,只需更新一下課程的教學內容,加入HTML 5和JavaScript的內容,並改革教學方式(比如千萬不要再采用閉卷考試的方式要學生去背各種HTML標記的含義……),就能讓學生跟上時代的步伐,而且我相信JavaScript一定會比C更能吸引學生,激發他們對軟件開發的興趣。
四、以編譯型的語言作為入門級編程語言
雖然我更趨向於使用腳本語言完成初學者的編程啟蒙任務,但我們同樣可以使用編譯型的編程語言完成這一任務。
C就不用我多說了,相信有很多牛人是從C出來的。
另兩門非常重要的編譯型語言是Java和C#,我的看法是即使不把它們當成計算機專業的第一門編程語言,至少也應該在計算機專業一、二年級安排這兩個編程語言的選修課程。
下面先說說Java。
Java:“人多勢眾”的主流面向對象編程語言
據說全世界的軟件開發人員中,Java程序員的總人數名列前茅。人多說明市場需求量大,Java技術應用廣。
采用Java作為第一門編程語言,比較適合於計算機專業的學生,能讓他們一開始就能受到面向對象編程風格與思想的熏陶,之後他們可以再倒過來去學 C。而不是象現在這樣,先學C再學Java,談到C再順便說說C++,現在許多院校開設有C++課程,其實這些年來C++應用的領域被不斷地壓縮,而且 C++語法過於復雜,開發效率低,除了部分有需求有興趣的學生,不適合多數學生學習。
Java入門主要分為兩個階段:一是Java語法與OOP思想的領悟,二是JDK中各個Java類及相關技術(比如多線程、序列化等)的學習。
Java是Android的主要開發語言,因此學生在入門之後,可以進一步地開發基於Android的手機應用,引導學生進入移動互聯的時代,具有很強的實用性,這點往往能觸發學生學習Java的強勁動力。
Java天生與“開源”兩字聯系在一起,掌握Java之後,學生可以邁入開源的世界,探索各種豐富的開源應用和技術的奇思妙想,這對於開拓學生的視野非常有好處,並且能直接地幫助其就業。
其實很多院校都開設了Java課程,我的建議不過就是將其提到大學一年級就講授,並立即跟上J2EE和Android的後繼課程。
C#:面向對象編程語言的集大成者
作為面向對象編程語言家族的後來者,C#有足夠的機緣從前輩中汲取經驗,這使得C#成為一個面向對象編程語言的集大成者。
與Java類似,C#比較適合作為計算機專業的入門級編程語言。C#開發通常使用微軟自己研發的Visual Studio,與其他IDE相比,我認為Visual Studio是非常優秀的集成開發環境,即使是免費的版本,也擁有高度的智能性和良好的使用體驗。
筆者曾經做過試驗,直接帶領計算機專業一年級學生在沒有學C的前提下學習C#,也開設過全校的通識選修課,針對非計算機專業的學生講授C#編程語言與.NET編程技術,都得到了良好的反饋。
以下是我總結出來的C#編程中幾個很能引發學生興趣的內容:
Windows Forms:可讓學生迅速地開發出可視化的桌面應用程序,極具成就感。
GDI+:通過簡單的循環、遞歸的編程技巧,能夠繪出漂亮的圖案,並且可以移植到Web上,很吸引學生。
ADO.NET:掌握它學生就可以開發簡單的數據庫應用程序,真正地寫出一些有用的程序。
Socket編程:讓學生輕易地實現兩台計算機互相交換信息,這個過程充滿探索的樂趣。
以上幾板斧下來,實踐證明,能成功地引發很多學生對編程的興趣,甚至“引誘”了不少學生決定跨專業報考計算機專業的研究生。
與Java相比,C#的問題是與微軟公司綁得太緊,容易把學生局限於微軟所構建的生態系統之中,影響其視野的開闊性。
就我個人觀點,計算機專業的學生應該在大一,最晚推遲到大二,就掌握一門主流的通用型編程語言和開發工具(Java和C#是我當前推薦的兩種編程語言),並且在今後的專業學習中,使用它們把在後繼計算機專業課中學到的理論知識應用於實踐。這樣一來,編程語言的學習就給計算機專業理論課的學習以強勁的推動,而學生的開發能力也將隨著開發實踐的深入而不斷增強,為其日後邁入業界或進入學術領域鋪路。
五、結束語:與時俱進的計算機教學
計算機是進步最快的技術領域之一,這就要求我們的計算機教學應該與時俱進並不斷地調整。筆者從《計算機學會通訊》2012年第6期的一篇文章了解到,美國加州大學伯克利分校己經開設了這樣的課程:教學生使用Ruby On Rails之類的工具進行敏捷開發並在Amazon web Services上部署。
“雲計算”來了!
“雲計算”時代的來臨,會對計算機教學的方式產生巨大的影響,筆者設想了一下,如果由教育部牽頭,由國家投資支持組建一個“教育與科研雲”,打造一個國家級的教育公共平台,不走商業化的路,堅持讓所有的在校學生和教師都能免費使用,努力推動各種的教學資源上移到雲端,讓更多的課程能用上雲平台所提供的豐富資源與強大計算能力,這將是一項利國利民的教育基礎設施建設,從長遠來說,對人的教育投資,是收益最大的投資。已經成為世界第二大經濟體的中國,難道還拿不出這筆錢和資源進行這個旨在為整個民族贏得未來的長線投資?
21世紀是人類信息技術突飛猛進並全面滲透到人類社會各領域的時代,在這樣一個日益信息化的時代裡,
作者:金旭亮
文章來源:bitfan(數字世界一凡人)的專欄