前兩年,我所在的學校在全校開始將VB作為大學生的基礎教學語言,將VB作為大學生的基礎教學語言,可能由于課程基礎教研室對VB比較熱衷,而認為C語言或C++的一些語法較難。效果如何呢?沒有人去做過調查和分析,但從我接觸的班級來說,效果都非常的差,很多基本概念都不知道,就別提編寫程序了,更不用提用VB編寫什么算法了。今天在網上看到這篇文章,感覺與我的想法較為一致,轉到這里,與所有能看到這篇文章的人共同反思。
CSDN首頁推薦了一篇文章,說兩位退休的美國大學教授上書反對將Java作為編程教學語言,對此我表示高度認同。對于Java,我并不反感,而且相信它在工業應用中的地位不可取代,但是,我一直反對將Java作為主要的編程教學語言,因為教學語言承擔著與生產語言不同的任務,它必須能夠幫助學生奠定堅實的技術基礎,塑造核心技術能力。在這方面,Java不能夠勝任。
1990年代中期以前,美國的計算機編程入門教育以Pascal為主。我的一位美國程序員朋友至今還懷念他與Pascal為伴的高中年代。到了1990年代中后期,由于ANSI C語言“糾正”了早期C語言的一些不適合編程教學的問題,因此成為很多美國高中和大學編程入門課的教學語言。1998年,美國指導編程教學的一個協會推薦將C++作為入門教學語言,在當時引起很大的反響,認為是編程教育方面的一個重要進步。但遺憾的是,C++非常復雜,而當時C++語言的教育體系又非常不成熟,因此很多地方的教學方法不得當,把學生迅速拖入無邊無際的語言細節當中,引起了學生痛苦的抱怨。大約經過兩三年不成功的實踐之后,在本世紀初,美國計算機教育界普遍接受Java作為編程入門語言。此后在很短的時間里,Java迅速成為美國高中和大學里的首選編程教學語言,老師教得輕松,學生學得甜蜜,所以這個局面一直持續到現在。
而在中國,BASIC語言及其變體一直到1990年代中期都還是“算法語言”課程的主要教學內容,充分折射出當時中國計算機教學與工業應用之間的脫節。只是到了1990年代后期,C語言才確立了在中國工科計算機編程入門教育中的主流地位。到現在為止,大部分工科學生都“必修”“C程序設計語言”這門課程。不過事實上,根據我的了解,這門課程的總體教學質量相當糟糕,大部分學生可以說是滿懷希望而來,兩手空空而去。在這種情況下,中國高校計算機編程入門教育已經開始悄悄向Java過渡了。據我所知,有一些名校已經開始將Java設為編程入門課程,并且認為這是與國際接軌進步標志。
在我的朋友圈子里,大多數真正的一線開發者和技術領導者,對于將Java作為入門教學語言的“發展方向”都持質疑態度。他們中很多人目前主要的工作都集中在Java上,因此這種態度并非來自所謂語言宗教情緒,而是來自他們招聘和實際工作中的感受。他們發現,只學習Java、C#、VB等“現代”編程語言的學生,精于拿來主義,長于整合和快速開發,思維活躍,生產效率高,讓他們來做直截了當的、有章可循的、非研究性和非創新性的工作比較合適,但是基礎不扎實,對計算機系統的理解薄弱,處理細節和矛盾的能力不足,一旦他們熟悉的套路用不上,則缺少自主分析問題、解決問題的知識、能力和經驗。
今天看到兩位教授的“上書”,才知道原來他們也有同感。只不過這兩位教授說的更直白,直接反對將Java作為入門編程語言,而是冒天下之大不韙,公然號召開歷史倒車,要求退回到C、C++、Lisp和Ada去。
我是支持兩位教授的。我認為,Java、C#、VB和其它虛擬機之上的語言都不適合作為專業程序員的入門教學語言。在中國還非常缺乏具有創新和獨立解決問題的高水平程序員的局面下,我們應該認真做好的事情是努力提高C/C++的教學質量,而不是圖快活轉向Java。
教學語言的選擇是至關重要的事情。作為大多數學生第一種需要認真學習理解的編程語言,教學語言將會成為他們中間很多人的“編程母語”,深深地烙印在學生的思維方式中。這個編程母語要幫助學生破除計算機和軟件的神秘感,建立對于程序的基本認識和對計算機模型的最初理解。在后續專業基礎課和專業課程的學習中,這門編程語言應該作為主要工具貫穿始終,幫助學生認識計算機系統,掌握算法與數據結構技能,熟悉操作系統概念,理解編譯原理知識,理解軟件抽象及軟件設計的基本思想,完成一定量的課程及課外項目實踐,建立正確的軟件開發實踐習慣。不但如此,這種教學語言必須是工業界的主流語言,否則學生學非所用,學習動力無法保證。
按照這個標準來衡量,Java適合于作為主要的編程教學語言嗎?我不這么認為。首先,我承認Java在教學上有一些優勢,比如其開發環境和工具支持非常成熟,有助于培養學生正確的編程習慣;Java是當今第一工業主流語言,標準類庫非常全面,可以迅速地開發具有實際用途的程序,有助于激發和保持學生的興趣;而在數據結構、算法、編譯原理的教學方面,Java也毫不落于下風,在軟件抽象設計(面向對象)方面,Java還有著明顯的優勢;特別是在并行編程的教學方面,Java 1.5 concurrency包提供的優勢是壓倒性的。盡管有如上這些優勢,但Java作為教學語言存在著一個致命的缺陷,即它是一個虛擬機語言,這一點就足以把它從教學語言的名單上去掉。作為一個虛擬機語言,Java對開發者隔絕了下層的真實系統,從而構造了一個近乎完美的環境,在這個環境里,世界上只有一種機器,一個操作系統,內存是無限的,所有的機器都具有相同的字節順序和一致的類型約定,為了設計的優美而犧牲速度永遠是正義行為,從反射到運行時自動加載,從完備的容器類到統一字符編碼,一大堆漂亮的功能都可以不費吹灰之力唾手而得。要是這個世界上每臺計算機都是一個Java機器,每項編程任務都可以在這樣一個近乎完美的環境中開發,那毫無以為,Java是最合適的編程教學語言。但是事實上呢?這樣一個完美的環境是Java力量的源泉,但這卻不是真實的世界。在真實世界里,我們可能面對非常原始的環境,苛刻的運行時限制,復雜多變的系統環境,令人窒息的細節魔鬼,要對付這些東西,需要開發者具有在應對復雜性,自己構造環境,在諸多限制條件下尋找解決方案的能力。而這種能力,被無數人無數次地證明是軟件開發、特別是軟件創新的核心能力。把Java作為教學語言,恰恰會導致這種核心能力的缺失。除此之外,如果耐心觀察的話,不難發現,幾乎在任何軟件領域里的創新性成果都首先是由C/C++語言實現的,原因很簡單,Java是站在C/C++基礎之上的,只有C/C++先把大路趟開,Java才能夠順勢而上。
相反,盡管C/C++語言作為教學語言有很多的不足,比如不同環境下開發模式差異大,細節繁多,開發效率低,容易犯錯,測試和調試困難,學習者難以保持動力,等等,但是這些問題都可以解決。而C/C++的關鍵優點,是能夠讓學習者在真實的計算機抽象上、在大量的細節和矛盾中學會思考,學會解決問題,學會了解真實的系統,知輕重,明生死,從而建立核心能力。掌握了C/C++語言,再去學習和理解Java、C#、Python、Ruby和其它語言,就比較容易達到更高的境界。反之,如果習慣了舒舒服服躺在完美世界里當闊少,那就很難有勇氣面對真實的世界。當然,很多開發者認為,現在更重要的能力是理解業務、整合現有資源的能力,而不是處理底層細節的技術。這種說法放在個人身上沒有問題,但是不能成為整個編程教育的指導思想。我們需要各個層面上的人才,精通業務和設計的架構師固然很重要,但能夠在底層作出創新成果的編程高手實際上更為稀缺和珍貴,很多時候也能夠創造更大的價值。而且,更重要的是,一個精通系統知識的開發者在往上走的時候不會遇到大的障礙,而一個只知道拼裝組合的“高級設計師”,往往連往下看的勇氣都沒有。
Java的另外一個問題,是其所倡導的繁瑣設計風格,一個對象套一個對象,一個對象疊一個對象,概念之間彼此橫七豎八地互相依賴,人為制造出一大堆貌似精美、實則累贅的所謂設計。這個問題我已經批評過多次,并且相信這股歪風一定會最終被人們拋棄,Java最終會歸于質樸。但是在這一天到來之前,Java對于初學者來說,很可能蒙住他們的雙眼,使他們看不到軟件設計中最可貴的簡單性和優美的統一,體會不到數據和程序的統一。在這一點上,C表現的非常好,而C++如果教學得體,可以做的更好。
當然,這并不是為現在的C/C++教學辯護。恰恰相反,從我了解的情況來看,目前普通高校的C/C++教學質量非常令人擔憂。學生學不會,而且越學越沒有興趣,老師則感到教起來很棘手,迫于現實情況往往選擇敷衍了事。反而是教Java,無論如何學生還能學到一點東西,對就業也有直接的幫助。至于學生的核心能力確實,發展后勁不足等問題,就讓他們在現實工作中自己解決吧。坦率地說,這種想法也很有道理。不過,從教學角度來說,我認為老師們還是應該積極考慮如何提高C/C++的教學質量。畢竟學生階段是十分寶貴的,基礎不在這個時期夯實,將來想彌補,就算不是完全不可能,也將付出十倍的代價。本著對學生職業生涯的負責態度,還是應該幫助學生達到這個階段應該達到的目標。在兩位教授的公開信里,也充分表達出這個意思。
我贊成的編程教育過程,應當是以C/C++(基本上是C)為主線,貫穿起算法、數據結構、系統原理、編譯和數據處理、軟件設計和組件技術等關鍵知識領域,讓學生能夠從根本上理解現代軟件系統的原理和構造,并通過有效的練習建立正確的軟件設計觀念和良好的工程實踐習慣。在這個基礎上,無論將來是深入學習C++,還是進入Java的繁榮世界,或者擁抱Python、Ruby,甚至于走向Web開發,都會心領神會,勢如破竹。
新聞熱點
疑難解答