準備踏入IT編程的學子們,大家第一門編程語言選誰? Are You Ready? Go!

Are You Ready? Go!

——第一門編程語言選誰?node

金旭亮python

 

說明:程序員

        這篇文章是專門針對大學低年級學生(和其餘軟件開發初學者)寫的,若是你己經是研究生或本科高年級學生,請將這篇文章轉發給你的師弟或師妹,但願這篇文章可以幫助他們少走彎路,順利地邁入軟件開發的大門;若是您是一位有經驗的軟件開發者,或者是關注計算機教育的同行,也敬請提出寶貴意見。web

         發表見解請在本貼評論,或者在個人新浪微博「北理工教師金旭亮(http://weibo.com/jinxuliang)」上相互溝通。算法

        本文僅表明我的見解,權做拋磚引玉之用。數據庫

                                 金旭亮寫於新學期開學之際:2012年9月3日編程

===================================================================================================canvas

 

最近,臺灣知名技術專家蔡學鏞先生寫了一本《編程ING》,宣稱「人人都能學會程序設計」。做爲一名IT教育工做者,這本書引起了個人興趣,翻看以後,共鳴之處很多,結合國內計算機教育的現狀,產生了頗多感觸,因而就有了這篇小文。小程序

1、爲何學生視編程爲畏途?

先當學生後當老師,不知不覺之中我在大學裏己「混」了十多年,我發現,進入計算機專業就讀的學生,最初至少有一大半對真實的軟件開發根本不瞭解,是「一張白紙」,不幸的是,學了四年以後,許多張「白紙」又變成了許多罐「漿糊」,帶着對軟件開發多是畏懼也多是無所謂但絕對不是喜歡的感觸離開校園。瀏覽器

編程真的那麼沒勁?那麼難和枯燥?

我寫了將近二十年的代碼,雖然不靠編程吃飯,但也彷佛勉強可算是個老程序員,我對編程的見解可總結爲兩句:何以解憂,惟有編程!我常常在想一個問題:編程實際上是頗有趣很好玩很實用並頗有成就感的一件事,爲何會有這麼多的學生視編程爲畏途?而咱們的計算機教育,爲何在打掉學生對編程的興趣方面「如此成功」?

蔡學鏞先生在《編程ING》給出了一張圖:

 

 

 

圖 1 正向興趣循環是學習的關鍵

 

我認爲這張圖道出了問題的關鍵——學習過程當中的「正向」興趣循環是否成功地創建。

強烈的興趣與不斷得到的成就感是整個學習過程的「引擎」,它爲學生完成整個學習任務提供源源不斷的強大動力。有無數的事實支持這個觀點。

傳統的教學觀點認爲,本科的主要教育目標之一是爲學生在本專業領域將來的發展「打下紮實的理論與實踐基礎」,因此從一開始就要「嚴格要求」,「科學訓練」。

這個觀點不能說錯,但我認爲,咱們的計算機教育,尤爲是針對初學者的教育,首要的任務是引起興趣。沒有興趣,一切免談。

我所瞭解的事實是:計算機專業的學生有很多視編程爲畏途。其緣由在於咱們的現有計算機教學方式從一開始就給了這些學生「痛苦」的編程體驗,不幸的是,這種體驗在後期枯燥的專業課學習中不斷獲得強化,學生最終對編程敬而遠之或畏之如虎。

事實上,教育學研究早己指出,成功的高效的教學應該是這樣的:按部就班,由淺入深,步步爲營,興趣導向。

教師的職責,不是將知識「灌入」學生的大腦,首要的任務是引起學生的興趣,鼓勵他們去探索未知的領域,主動地學習和吸取知識,培養技能,積累經驗。在這個學習過程當中,教師要成爲一名優秀的導航員,給學生繪出航線,鼓勵他們出海遠航,解決他們在航行中所遇到的困難,並幫助學生創建學習的「正向」興趣循環。

對編程的「第一印象」很重要啊!由此,引起了一個頗有趣的問題——應該選擇哪一門語言做爲學生的第一門編程語言?

2、你學的第一門編程語言是什麼?

在國內的大學中,當前大多數選用C做爲學生的第一門編程語言。這其實並無太大的問題,C的重要性無須我多說。其實問題的關鍵不在於選擇C教學,而在於以哪一種方式去教。

很不幸,國內許多C語言的教材都將主要的精力放在對C語法細節的介紹上,課程考覈方式又很古板——不少院校採用閉卷考試,出一堆的選擇題和填空題。典型的題目是將一段代碼砍掉一兩句,讓學生「填空」。有哪位高手是經過作這些「填空題」學會編程的?上機也流於形式,讓學生反覆折騰幾個「黑底白字」的「玩具般的」小程序,學了一個學期,學生連一個有點用的程序都寫不出來……

這種僵化的教學方式,足以毀掉多數學生對編程的興趣。

 我我的認爲,C不該該成爲針對大多數學生所講授的第一門編程語言,咱們的教學體系,應該給學生提供更多的選擇。

針對初學者所講授的第一門編程語言,應該具備如下的特色:

(1)必須是「有趣」的,能誘導人去「動手」和「思考」。

(2)須要對初學者屏蔽沒必要要的底層技術細節,以避免分散他們的注意力。

(3)這種語言必須足夠簡單,但同時又具有足夠的能力編寫出實用的程序,從而讓學生能比較容易地得到成就感,感悟到軟件開發的魅力。

(4)這種語言必須能充分地體現現代軟件開發的基本思想和技術成果,爲學生進一步深刻學習打下基礎

(5)花在這門編程語言上的時間和精力是有回報的,掌握了它,就掌握了一個強大的工具,能夠在從此的學習中使用這個工具進行實踐和創造。

另外,這門編程語言的學習,應該有助於初學者正確理解與體會到如下的編程思想:

(1)分而治之:將大問題切分爲小問題。

(2)組件化與模塊化:以搭積木的方式「構建」出軟件系統。

(3)算法思想:針對實際問題創建數學模型,設計計算機算法,最終編程解決問題。

同時,這門編程語言的學習,應能有效地培養出如下的編程基本功:

(1)調試代碼的能力。

(2)撰寫可讀性強、擴充性好、易於複用的優質代碼的能力,培養良好的編程習慣。

(3)查找技術資源與閱讀技術文檔的能力。

         也許一門編程語言的學習沒法達到上述的全部要求,但組合幾種不一樣的編程語言就差很少了。下面,我介紹幾種適合於初學者入門的編程語言。

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完成不少的工做:

  •  基於canvas可編程繪製二維的圖形,使用SVG經過DOM可構造交互式的應用
  •  HTML 5的audio和video元素能夠播放音頻和視頻,因此能夠用JavaScript開發多媒體應用
  •  Geolocation、Communication和WebSocket  API支持編寫地理感知的互聯網應用程序
  •  ……

爲了搶戰先機,各大瀏覽器廠商都在不斷地完善本身的產品,爭取能支持更多的HTML 5特性,並且智能手機的兩大主流操做系統iOS和Android均可以運行使用JavaScript編寫的Web應用。微軟也在緊跟這個潮流,在其最新的Windows 8中,可使用JavaScript編寫Metro風格的Windows 8 應用。

由此看來,JavaScript可謂是風光無限。

我強力推薦在高校中推廣JavaScript課程,其實國內高校在這方面也已經有必定基礎了,好比許多高校都開設有《網頁設計基礎》這門課程,只需更新一下課程的教學內容,加入HTML 5和JavaScript的內容,並改革教學方式(好比千萬不要再採用閉卷考試的方式要學生去背各類HTML標記的含義……),就能讓學生跟上時代的步伐,並且我相信JavaScript必定會比C更能吸引學生,激發他們對軟件開發的興趣。

4、以編譯型的語言做爲入門級編程語言

雖然我更趨向於使用腳本語言完成初學者的編程啓蒙任務,但咱們一樣可使用編譯型的編程語言完成這一任務。

C就不用我多說了,相信有不少牛人是從C出來的。

另兩門很是重要的編譯型語言是Java和C#,個人見解是即便不把它們當成計算機專業的第一門編程語言,至少也應該在計算機專業1、二年級安排這兩個編程語言的選修課程。

下面先說說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#編程中幾個很能引起學生興趣的內容:

  1. Windows Forms:可以讓學生迅速地開發出可視化的桌面應用程序,極具成就感。
  2. GDI+:經過簡單的循環、遞歸的編程技巧,可以繪出漂亮的圖案,而且能夠移植到Web上,很吸引學生。
  3. ADO.NET:掌握它學生就能夠開發簡單的數據庫應用程序,真正地寫出一些有用的程序。
  4. Socket編程:讓學生輕易地實現兩臺計算機互相交換信息,這個過程充滿探索的樂趣。

以上幾板斧下來,實踐證實,能成功地引起不少學生對編程的興趣,甚至「引誘」了很多學生決定跨專業報考計算機專業的研究生。

與Java相比,C#的問題是與微軟公司綁得太緊,容易把學生侷限於微軟所構建的生態系統之中,影響其視野的開闊性。

         就我我的觀點,計算機專業的學生應該在大一,最晚推遲到大二,就掌握一門主流的通用型編程語言和開發工具(Java和C#是我當前推薦的兩種編程語言),而且在從此的專業學習中,使用它們把在後繼計算機專業課中學到的理論知識應用於實踐。這樣一來,編程語言的學習就給計算機專業理論課的學習以強勁的推進,而學生的開發能力也將隨着開發實踐的深刻而不斷加強,爲其往後邁入業界或進入學術領域鋪路。

5、結束語:與時俱進的計算機教學

計算機是進步最快的技術領域之一,這就要求咱們的計算機教學應該與時俱進並不斷地調整。筆者從《計算機學會通信》2012年第6期的一篇文章瞭解到,美國加州大學伯克利分校己經開設了這樣的課程:教學生使用Ruby On Rails之類的工具進行敏捷開發並在Amazon web Services上部署。

「雲計算」來了!

 「雲計算」時代的來臨,會對計算機教學的方式產生巨大的影響,筆者設想了一下,若是由教育部牽頭,由國家投資支持組建一個「教育與科研雲」,打造一個國家級的教育公共平臺,不走商業化的路,堅持讓全部的在校學生和教師都能無償使用,努力推進各類的教學資源上移到雲端,讓更多的課程能用上雲平臺所提供的豐富資源與強大計算能力,這將是一項利國利民的教育基礎設施建設,從長遠來講,對人的教育投資,是收益最大的投資。已經成爲世界第二大經濟體的中國,難道還拿不出這筆錢和資源進行這個旨在爲整個民族贏得將來的長線投資?

21世紀是人類信息技術日新月異並全面滲透到人類社會各領域的時代,在這樣一個日益信息化的時代裏,

Are you ready?  Let’s Go!

相關文章
相關標籤/搜索