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