免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JAVA語言學(xué)校的危險性

我覺得翻譯難度很大,整整兩個工作日,每天8小時以上,才譯出了5000字。除了Joel大量使用俚語,另一個原因是原文涉及“編程原理”,好多東西我根本不懂。希望懂的朋友幫我看看,譯文有沒有錯誤,包括我寫的注解。

====================
JAVA語言學(xué)校的危險性
作者:Joel Spolsky
譯者:阮一峰
原文: http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html
發(fā)表日期 2005年12月29日,星期四


如今的孩子變懶了。
多吃一點苦,又會怎么樣呢?

我一定是變老了,才會這樣喋喋不休地抱怨和感嘆“如今的孩子”。為什么他們不再愿意、或者說不再能夠做艱苦的工作呢。
當(dāng)我還是孩子的時候,學(xué)習(xí)編程需要用到穿孔卡片(punched cards)。那時可沒有任何類似“退格”鍵(Backspace key)這樣的現(xiàn)代化功能,如果你出錯了,就沒有辦法更正,只好扔掉出錯的卡片,從頭再來。

回想1991年,我開始面試程序員的時候。我一般會出一些編程題,允許用任何編程語言解題。在99%的情況下,面試者選擇C語言。

如今,面試者一般會選擇Java語言。

說到這里,不要誤會我的意思。Java語言本身作為一種開發(fā)工具,并沒有什么錯。、

等一等,我要做個更正。我只是在本篇特定的文章中,不會提到Java語言作為一種開發(fā)工具,有什么不好的地方。事實上,它有許許多多不好的地方,不過這些只有另找時間來談了。

我在這篇文章中,真正想要說的是,總的來看,Java不是一種非常難的編程語言,無法用來區(qū)分優(yōu)秀程序員和普通程序員。它可能很適合用來完成工作,但是這個不是今天的主題。我甚至想說,Java語言不夠難,其實是它的特色,不能算缺點。但是不管怎樣,它就是有這個問題。

如果我聽上去像是妄下論斷,那么我想說一點我自己的微不足道的經(jīng)歷。大學(xué)計算機系的課程里,傳統(tǒng)上有兩個知識點,許多人從來都沒有真正搞懂過的,那就是指針(pointers)和遞歸(recursion)。

你進大學(xué)后,一開始總要上一門“數(shù)據(jù)結(jié)構(gòu)”課(data structure),然后會有線性鏈表(linkedlist)、哈希表(hashtable),以及其他諸如此類的課程。這些課會大量使用“指針”。它們經(jīng)常起到一種優(yōu)勝劣汰的作用。因為這些課程非常難,那些學(xué)不會的人,就表明他們的能力不足以達到計算機科學(xué)學(xué)士學(xué)位的要求,只能選擇放棄這個專業(yè)。這是一件好事,因為如果你連指針很覺得很難,那么等學(xué)到后面,要你證明不動點定理(fixed point theory)的時候,你該怎么辦呢?

有些孩子讀高中的時候,就能用BASIC語言在AppleII型個人電腦上,寫出漂亮的乒乓球游戲。等他們進了大學(xué),都會去選修計算機科學(xué)101課程,那門課講的就是數(shù)據(jù)結(jié)構(gòu)。當(dāng)他們接觸到指針那些玩意以后,就一下子完全傻眼了,后面的事情你都可以想像,他們就去改學(xué)政治學(xué),因為看上去法學(xué)院是一個更好的出路[1]。關(guān)于計算機系的淘汰率,我見過各式各樣的數(shù)字,通常在40%到70%之間。校方一般會覺得,學(xué)生拿不到學(xué)位很可惜,我則視其為必要的篩選,淘汰那些沒有興趣編程或者沒有能力編程的人。

對于許多計算機系的青年學(xué)生來說,另一門有難度的課程是有關(guān)函數(shù)式編程(functionalprogramming)的課程,其中就包括遞歸程序設(shè)計(recursiveprogramming)。MIT將這些課程的標(biāo)準(zhǔn)提得很高,還專門設(shè)立了一門必修課(課程代號6.001[2]),它的教材(Structureand Interpretation of Computer Programs,作者為HaroldAbelson和GeraldJaySussmanAbelson,MIT出版社1996年版)被幾十所、甚至幾百所著名高校的計算系機采用,充當(dāng)事實上的計算機科學(xué)導(dǎo)論課程。(你能在網(wǎng)上找到這本教材的舊版本,應(yīng)該讀一下。)

這些課程難得驚人。在第一堂課,你就要學(xué)完Scheme語言[3]的幾乎所有內(nèi)容,你還會遇到一個不動點函數(shù)(fixed-pointfunction),它的自變量本身就是另一個函數(shù)。我讀的這門導(dǎo)論課,是賓夕法尼亞大學(xué)的CSE121課程,真是讀得苦不堪言。我注意到很多學(xué)生,也許是大部分的學(xué)生,都無法完成這門課。課程的內(nèi)容實在太難了。我給教授寫了一封長長的聲淚俱下的Email,控訴這門課不是給人學(xué)的。賓夕法尼亞大學(xué)里一定有人聽到了我的呼聲(或者聽到了其他抱怨者的呼聲),因為如今這門課講授的計算機語言是Java。

我現(xiàn)在覺得,他們還不如沒有聽見呢。

這就是爭議所在。許多年來,像當(dāng)年的我一樣懶惰的計算機系本科生不停地抱怨,再加上計算機業(yè)界也在抱怨畢業(yè)生不夠用,這一切終于造成了重大惡果。過去十年中,大量本來堪稱完美的好學(xué)校,都百分之百轉(zhuǎn)向了Java語言的懷抱。這真是好得沒話說了,那些用“grep”命令[4]過濾簡歷的企業(yè)招聘主管,大概會很喜歡這樣。最妙不可言的是,Java語言中沒有什么太難的地方,不會真的淘汰什么人,你搞不懂指針或者遞歸也沒關(guān)系。所以,計算系的淘汰率就降低了,學(xué)生人數(shù)上升了,經(jīng)費預(yù)算變大了,可謂皆大歡喜。

學(xué)習(xí)Java語言的孩子是幸運的,因為當(dāng)他們用到以指針為基礎(chǔ)的哈希表時,他們永遠(yuǎn)也不會遇到古怪的“段錯誤”[5](segfault)。他們永遠(yuǎn)不會因為無法將數(shù)據(jù)塞進有限的內(nèi)存空間,而急得發(fā)瘋。他們也永遠(yuǎn)不用苦苦思索,為什么在一個純函數(shù)的程序中,一個變量的值一會保持不變,一會又變個不停!多么自相矛盾?。?

他們不需要怎么動腦筋,就可以在專業(yè)上得到4.0的績點。

我是不是有點太苛刻了?就像電視里的“四個約克郡男人”[6](Four Yorkshiremen)那樣,成了老古板?就在這里吹噓我是多么刻苦,完成了所有那些高難度的課程?

我再告訴你一件事。1900年的時候,拉丁語和希臘語都是大學(xué)里的必修課,原因不是因為它們有什么特別的作用,而是因為它們有點被看成是受過高等教育的人士的標(biāo)志。在某種程度上,我的觀點同拉丁語支持者的觀點沒有不同(下面的四點理由都是如此):“(拉丁語)訓(xùn)練你的思維,鍛煉你的記憶。分析拉丁語的句法結(jié)構(gòu),是思考能力的最佳練習(xí),是真正對智力的挑戰(zhàn),能夠很好地培養(yǎng)邏輯能力。”以上出自ScottBarker之口(http://www.promotelatin.org/whylatin.htm)。但是,今天我找不到一所大學(xué),還把拉丁語作為必修課。指針和遞歸不正像計算機科學(xué)中的拉丁語和希臘語嗎?

說到這里,我坦率地承認(rèn),當(dāng)今的軟件代碼中90%都不需要使用指針。事實上,如果在正式產(chǎn)品中使用指針,這將是十分危險的。好的,這一點沒有異議。與此同時,函數(shù)式編程在實際開發(fā)中用到的也不多。這一點我也同意。

但是,對于某些最激動人心的編程任務(wù)來說,指針仍然是非常重要的。比如說,如果不用指針,你根本沒辦法開發(fā)Linux的內(nèi)核。如果你不是真正地理解了指針,你連一行Linux的代碼也看不懂,說實話,任何操作系統(tǒng)的代碼你都看不懂。

如果你不懂函數(shù)式編程,你就無法創(chuàng)造出MapReduce[7],正是這種算法使得Google的可擴展性(scalable)達到如此巨大的規(guī)模。單詞“Map”(映射)和“Reduce”(化簡)分別來自Lisp語言和函數(shù)式編程?;叵肫饋?,在類似6.001這樣的編程課程中,都有提到純粹的函數(shù)式編程沒有副作用,因此可以直接用于并行計算(parallelizable)。任何人只要還記得這些內(nèi)容,那么MapRuduce對他來說就是顯而易見的。發(fā)明MapReduce的公司是Google,而不是微軟,這個簡單的事實說出了原因,為什么微軟至今還在追趕,還在試圖提供最基本的搜索服務(wù),而Google已經(jīng)轉(zhuǎn)向了下一個階段,開發(fā)世界上最大的并行式超級計算機——Skynet[8]的H次方的H次方的H次方的H次方的H次方的H次方。我覺得,微軟并沒有完全明白,在這一波競爭中它落后多遠(yuǎn)。

除了上面那些直接就能想到的重要性,指針和遞歸的真正價值,在于那種你在學(xué)習(xí)它們的過程中,所得到的思維深度,以及你因為害怕在這些課程中被淘汰,所產(chǎn)生的心理抗壓能力,它們都是在建造大型系統(tǒng)的過程中必不可少的。指針和遞歸要求一定水平的推理能力、抽象思考能力,以及最重要的,在若干個不同的抽象層次上,同時審視同一個問題的能力。因此,是否真正理解指針和遞歸,與是否是一個優(yōu)秀程序員直接相關(guān)。

如果計算機系的課程都與Java語言有關(guān),那么對于那些在智力上無法應(yīng)付復(fù)雜概念的學(xué)生,就沒有東西可以真的淘汰他們。作為一個雇主,我發(fā)現(xiàn)那些100%Java教學(xué)的計算機系,已經(jīng)培養(yǎng)出了相當(dāng)一大批畢業(yè)生,這些學(xué)生只能勉強完成難度日益降低的課程作業(yè),只會用Java語言編寫簡單的記賬程序,如果你讓他們編寫一個更難的東西,他們就束手無策了。他們的智力不足以成為程序員。這些學(xué)生永遠(yuǎn)也通不過MIT的6.001課程,或者耶魯大學(xué)的CS323課程。坦率地說,為什么在一個雇主的心目中,MIT或者耶魯大學(xué)計算機系的學(xué)位的份量,要重于杜克大學(xué),這就是原因之一。因為杜克大學(xué)最近已經(jīng)全部轉(zhuǎn)為用Java語言教學(xué)。賓夕法尼亞大學(xué)的情況也很類似,當(dāng)初CSE121課程中的Scheme語言和ML語言,幾乎將我和我的同學(xué)折磨至死,如今已經(jīng)全部被Java語言替代。我的意思不是說,我不想雇傭來自杜克大學(xué)或者賓夕法尼亞大學(xué)的聰明學(xué)生,我真的愿意雇傭他們,只是對于我來說,確定他們是否真的聰明,如今變得難多了。以前,我能夠分辨出誰是聰明學(xué)生,因為他們可以在一分鐘內(nèi)看懂一個遞歸算法,或者可以迅速在計算機上實現(xiàn)一個線性鏈表操作函數(shù),所用的時間同黑板上寫一遍差不多。但是對于Java語言學(xué)校的畢業(yè)生,看著他們面對上述問題苦苦思索、做不出來的樣子,我分辨不出這到底是因為學(xué)校里沒教,還是因為他們不具備編寫優(yōu)秀軟件作品的素質(zhì)。PaulGraham將這一類程序員稱為“Blub程序員”[9](www.paulgraham.com/avg.html)。

Java語言學(xué)校無法淘汰那些永遠(yuǎn)也成不了優(yōu)秀程序員的學(xué)生,這已經(jīng)是很糟糕的事情了。但是,學(xué)??梢詿o可厚非地辯解,這不是校方的錯。整個軟件行業(yè),或者說至少是其中那些使用grep命令過濾簡歷的招聘經(jīng)理,確實是在一直叫嚷,要求學(xué)校使用Java語言教學(xué)。

但是,即使如此,Java語言學(xué)校的教學(xué)也還是失敗的,因為學(xué)校沒有成功訓(xùn)練好學(xué)生的頭腦,沒有使他們變得足夠熟練、敏捷、靈活,能夠做出高質(zhì)量的軟件設(shè)計(我不是指面向?qū)ο笫降?#8220;設(shè)計”,那種編程只不過是要求你花上無數(shù)個小時,重寫你的代碼,使它們能夠滿足面向?qū)ο缶幊痰牡燃壷评^承式結(jié)構(gòu),或者說要求你思考到底對象之間是“has-a”從屬關(guān)系,還是“is-a”繼承關(guān)系,這種“偽問題”將你搞得煩躁不安)。你需要的是那種能夠在多個抽象層次上,同時思考問題的訓(xùn)練。這種思考能力正是設(shè)計出優(yōu)秀軟件架構(gòu)所必需的。

你也許想知道,在教學(xué)中,面向?qū)ο缶幊蹋╫bject-orientedprogramming,縮寫OOP)是否是指針和遞歸的優(yōu)質(zhì)替代品,是不是也能起到淘汰作用。簡單的回答是:“不”。我在這里不討論OOP的優(yōu)點,我只指出OOP不夠難,無法淘汰平庸的程序員。大多數(shù)時候,OOP教學(xué)的主要內(nèi)容就是記住一堆專有名詞,比如“封裝”(encapsulation)和“繼承”(inheritance)”,然后再做一堆多選題小測驗,考你是不是明白“多態(tài)”(polymorphism)和“重載”(overloading)的區(qū)別。這同歷史課上,要求你記住重要的日期和人名,難度差不多。OOP不構(gòu)成對智力的太大挑戰(zhàn),嚇不跑一年級新生。據(jù)說,如果你沒學(xué)好OOP,你的程序依然可以運行,只是維護起來有點難。但是如果你沒學(xué)好指針,你的程序就會輸出一行段錯誤信息,而且你對什么地方出錯了毫無想法,然后你只好停下來,深吸一口氣,真正開始努力在兩個不同的抽象層次上,同時思考你的程序是如何運行的。

順便說一句,我有充分理由在這里說,那些使用grep命令過濾簡歷的招聘經(jīng)理真是荒謬可笑。我從來沒有見過哪個能用Scheme語言、Haskell語言和C語言中的指針編程的人,竟然不能在二天里面學(xué)會Java語言,并且寫出的Java程序,質(zhì)量竟然不能勝過那些有5年Java編程經(jīng)驗的人士。不過,人力資源部里那些平庸的懶漢,是無法指望他們聽進去這些話的。
再說,計算機系承擔(dān)的發(fā)揚光大計算機科學(xué)的使命該怎么辦呢?計算機系畢竟不是職業(yè)學(xué)校啊!訓(xùn)練學(xué)生如何在這個行業(yè)里工作,不應(yīng)該是計算機系的任務(wù)。這應(yīng)該是社區(qū)高校和政府就業(yè)培訓(xùn)計劃的任務(wù),那些地方會教給你工作技能。計算機系給予學(xué)生的,理應(yīng)是他們?nèi)蘸笊钏枰幕A(chǔ)知識,而不是為學(xué)生第一周上班做準(zhǔn)備。對不對?

還有,計算機科學(xué)是由證明(遞歸)、算法(遞歸)、語言(λ演算[10])、操作系統(tǒng)(指針)、編譯器(λ演算)所組成的。所以,這就是說那些不教C語言、不教Scheme語言、只教Java語言的學(xué)校,實際上根本不是在教授計算機科學(xué)。雖然對于真實世界來說,有些概念可能毫無用處,比如函數(shù)的科里化(functioncurrying)[11],但是這些知識顯然是進入計算機科學(xué)研究生院的前提。我不明白,計算機系課程設(shè)置委員會中的教授為什么會同意,將課程的難度下降到如此低的地步,以至于他們既無法培養(yǎng)出合格的程序員,甚至也無法培養(yǎng)出合格的能夠得到哲學(xué)博士PhD學(xué)位[12]、進而能夠申請教職、與他們競爭工作崗位的研究生。噢,且慢,我說錯了。也許我明白原因了。

實際上,如果你回顧和研究學(xué)術(shù)界在“Java大遷移”(Great Java Shift)中的爭論,你會注意到,最大的議題是Java語言是否還不夠簡單,不適合作為一種教學(xué)語言。

我的老天啊,我心里說,他們還在設(shè)法讓課程變得更簡單。為什么不用匙子,干脆把所有東西一勺勺都喂到學(xué)生嘴里呢?讓我們再請助教幫他們接管考試,這樣一來就沒有學(xué)生會改學(xué)“美國研究”[13](Americanstudies)了。如果課程被精心設(shè)計,使得所有內(nèi)容都比原有內(nèi)容更容易,那么怎么可能期望任何人從這個地方學(xué)到任何東西呢?看上去似乎有一個工作小組(Javataskforce)正在開展工作,創(chuàng)造出一個簡化的Java的子集,以便在課堂上教學(xué)[14]。這些人的目標(biāo)是生成一個簡化的文檔,小心地不讓學(xué)生纖弱的思想,接觸到任何EJB/J2EE的臟東西[15]。這樣一來,學(xué)生的小腦袋就不會因為遇到有點難度的課程,而感到煩惱了,除非那門課里只要求做一些空前簡單的計算機習(xí)題。

計算機系如此積極地降低課程難度,有一個理由可以得到最多的贊同,那就是節(jié)省出更多的時間,教授真正的屬于計算機科學(xué)的概念。但是,前提是不能花費整整兩節(jié)課,向?qū)W生講解諸如Java語言中int和Integer有何區(qū)別[16]。好的,如果真是這樣,課程6.001就是你的完美選擇。你可以先講Scheme語言,這種教學(xué)語言簡單到聰明學(xué)生大約只用10分鐘,就能全部學(xué)會。然后,你將這個學(xué)期剩下的時間,都用來講解不動點。

唉。

說了半天,我還是在說要學(xué)1和0。

(你學(xué)到了1?真幸運?。∥覀兡菚r所有人學(xué)到的都是0。)

================
注解:
[1] 在美國,法學(xué)院的入學(xué)者都必須具有本科學(xué)位。通常來說,主修政治學(xué)的學(xué)生升入法學(xué)院的機會最大。
[2] 在麻省理工學(xué)院,計算機系的課程代碼都是以6開頭的,6.001表明這是計算機系的最基礎(chǔ)課程。
[3] Scheme語言是LISP語言的一個變種,誕生于1975年的MIT,以其對函數(shù)式編程的支持而聞名。這種語言在商業(yè)領(lǐng)域的應(yīng)用很少,但是在計算機教育領(lǐng)域內(nèi)有著廣泛影響。
[4] grep是Unix/Linux環(huán)境中用于搜索或者過濾內(nèi)容的命令。這里指的是,某些招聘人員僅僅根據(jù)一些關(guān)鍵詞來過濾簡歷,比如本文中的Java。
[5] 段錯誤(segfault)是segmentation fault的縮寫,指的是軟件中的一類特定的錯誤,通常發(fā)生在程序試圖讀取不允許讀取的內(nèi)存地址、或者以非法方式讀取內(nèi)存的時候。
[6] 《四個約克郡男人》(Four Yorkshiremen),是英國電視系列喜劇At Last the 1948 Show中的一部,與上個世紀(jì)70年代問世。內(nèi)容是四個約克郡男人競相吹噓,各自的童年是多么困苦,由于內(nèi)容太夸張,所以顯得非??尚?。
[7] MapReduce是一種由Google引入使用的軟件框架,用于支持計算機集群環(huán)境下,海量數(shù)據(jù)(PB級別)的并行計算。
[8] Skynet是美國系列電影《終結(jié)者》(Terminator)中一個控制一切、與人類為敵的超級計算機系統(tǒng)的名稱,通常將其看作虛構(gòu)的人工智能的代表。
[9] Blub程序員(Blub programmers)指的是那些企圖用一種語言,解決所有問題的程序員。Blub是Paul Graham假設(shè)的一種高級編程語言。
[10] λ演算(lambda calculus)是一套用于研究函數(shù)定義、函數(shù)應(yīng)用和遞歸的形式系統(tǒng),在遞歸理論和函數(shù)式編程中有著廣泛的應(yīng)用。
[11] 函數(shù)的科里化(function currying)指的是一種多元函數(shù)的消元技巧,將其變?yōu)橐幌盗兄挥幸辉逆準(zhǔn)胶瘮?shù)。它最早是由美國數(shù)學(xué)家哈斯格爾·科里(Haskell Curry)提出的,因此而得名。
[12] 在美國,所有基礎(chǔ)理論的學(xué)科,一律授予的都是哲學(xué)博士學(xué)位(Doctor of Philosophy),計算機科學(xué)系亦是如此。
[13] 美國研究(American studies)是對美國社會的經(jīng)濟、歷史、文化等各個方面進行研究的一門學(xué)科。這里指的是,計算機系學(xué)生不會因為課程太難被淘汰,所以就不用改學(xué)相對容易的“美國研究”。
[14] 參見http://www.sigcse.org/topics/javataskforce/java-task-force.pdf。
[15]J2EE是Java2平臺企業(yè)版(Java 2Platform,EnterpriseEdition),指的是一整套企業(yè)級開發(fā)架構(gòu)。EJB(EnterpriseJavaBean)屬于J2EE的一部分,是一個基于組件的企業(yè)級開發(fā)規(guī)范。它們通常被認(rèn)為是Java中相對較難的部分。
[16] 在Java語言中,int是一種數(shù)據(jù)類型,表示整數(shù),而Integer是一個適用于面向?qū)ο缶幊痰念?,表示整?shù)對象。兩者的涵義和性質(zhì)都不一樣。
(完)

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
學(xué)校只教Java的危險性
為什么說C語言是計算機領(lǐng)域的常青樹?
作為計算機專業(yè)的,最該學(xué)的三門課程
南京大學(xué)李樾副教授:淺談國內(nèi)高校編程語言教育
「計算機基礎(chǔ)」你不知道的編程語言的演變
大學(xué)為什么要學(xué)c語言?
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服