Java萬歲!令Java永葆活力的十二項核心因素
譯文一旦那些被臨時追捧的熱門詞匯已經(jīng)不再能激起我們的興趣,那么它們往往會快速湮沒在炒作的地平線之外,甚至徹底從我們的頭腦中消失。以Cobol為 例,這一時代的遺物就像是過了保質(zhì)期的魚蝦,被追求時尚的技術(shù)專家們抨擊為:無用、腐朽、過時而且不再適合實際需求的產(chǎn)物。與之同理,Java很可能成為 下一種繼續(xù)留存在企業(yè)環(huán)境當(dāng)中、但卻被人們所遺忘的編程語言。
遙想當(dāng)年,我們還需要購買實體書來學(xué)習(xí)專業(yè)知識。在那個時候,Java已經(jīng)像是人到中年、不復(fù)年輕時妖嬈身姿的過氣明星,根本無法再在雜志封面上占 據(jù)一席之地。自Java誕生至今的二十年中,應(yīng)用程序開發(fā)領(lǐng)域一直迎來送往著一款又一款語言新秀,其中包括Node.js、Objective-C、 Dart、Go以及如此種種。“Java?那不是Web 1.0時代的產(chǎn)物嗎?”
但只要對Dice.com網(wǎng)站上的招聘信息進(jìn)行一番快速搜索,無情的事實就會給抱有上述觀念的家伙來上一記響亮的耳光。在這里,我們發(fā)現(xiàn)與iOS相 關(guān)的就業(yè)崗位約有2500個,而Java帶來的職位則多達(dá)17000個。值得強調(diào)的是,Dice.com網(wǎng)站列出的數(shù)字僅僅是現(xiàn)實中的一小部分。事實上, 相對于某些在開發(fā)者領(lǐng)域內(nèi)被宣揚為不可阻擋的最新發(fā)展方向的編程語言,Java所能提供的工作崗位數(shù)量可達(dá)到其七倍左右。
也許這是因為Java能夠給普通開發(fā)人員帶來比將營收總額的30%上繳給蘋果、然后雙手合十靜待用戶在熱門應(yīng)用排行榜上付費購買我們的應(yīng)用成果更理 想的營收實現(xiàn)方式。實際情況是,Java一直都致力于解決一些比幫助憤怒的小鳥擊敗那幫豬頭天敵更為重要的具體問題。Java是多種平臺的構(gòu)建基礎(chǔ),其設(shè) 計目的在于交付一種順暢的方式、保證軟件能夠高效運行在多種芯片架構(gòu)之上。而這樣的既定思路無疑已經(jīng)幫助無數(shù)服務(wù)器程序員、客戶端程序員以及嵌入式程序員 解決了大量技術(shù)難題。
為了防止時間的大浪洗刷掉我們腦海中留下的Java為計算業(yè)界作出的眾多卓越貢獻(xiàn)及其當(dāng)前地位,今天的文章將列舉12項明確理由,證明Java不僅將長久存在、還能夠在熱潮褪去之后繼續(xù)保持積極而繁榮的發(fā)展態(tài)勢。
換句話來說:不要誤以來Java的興盛屬于什么卷土重來,它一直在這里、扮演著編程世界的主宰角色。
Java繼續(xù)扮演證實角色的核心理由一:面對政治斗爭(或者說骯臟的政治斗爭)時的出色彈性
技術(shù)領(lǐng)域從來沒有給Java提供一條平坦的發(fā)展道路,因為其競爭對手?jǐn)?shù)量眾多且裝備精良。無論如何,新型編程語言總在不斷涌現(xiàn)。很多朋友在受到反對派的言論影響、且缺乏對其成功理由的正確認(rèn)識時,都會驚訝于Java為什么在如此嚴(yán)峻的逆境當(dāng)中仍能堅強生存并不斷普及。
微軟公司曾經(jīng)是Java的頭號天敵,因為這位軟件巨頭僅僅是將其視為MS-DOS時代之后最值得繼承的技術(shù)成果。微軟方面從Java誕生之初就開始 全力以赴打壓其發(fā)展。Java從來就沒能在桌面系統(tǒng)當(dāng)中獲得應(yīng)有的引導(dǎo)與推動,這一方面是因為Yava虛擬機(jī)系統(tǒng)的啟動耗時確實有點太長。盡管存在小小的 延時,但Java應(yīng)用程序確實能夠在Windows平臺上正常運行且發(fā)揮既定功效。
而出于某些莫名其妙的理由,Steve Jobs也從來沒對Java抱有過任何好感,即使是在Mac被除Adobe之外的所有廠商排除出支持范疇時亦沒有絲毫動搖。Java兼容性顯然能夠給 Mac帶來大量應(yīng)用方案,但蘋果公司一直將其當(dāng)成決策敲定之后才被想起的對象。(沒錯,iOS智能手機(jī)的使用感受確實比Android要更出色一些,因此 也許Jobs老爺?shù)倪x擇確實明智。)
Java陣營內(nèi)部的爭議之聲同樣不絕于耳。IBM公司熱愛這款語言,但卻對其生母Sun百般挑釁。藍(lán)色巨人決定將其偉大的IDE方案命名為 “Eclipse(即月蝕)”,但這種明顯在指桑罵槐的作法當(dāng)然受到了Sun公司方面的抗議——唉,這幫純技術(shù)出身的家伙當(dāng)然不能理解早已玩轉(zhuǎn)商圈的 IBM的想法啦。
盡管經(jīng)歷了這一切阻礙,Java自身的締造者們也犯下過諸多失誤,但這款編程語言仍然表現(xiàn)出迅猛的發(fā)展勢頭,并在服務(wù)器以及桌面系統(tǒng)的可行空間之內(nèi) 找到了自己的根據(jù)地。任何一項技術(shù)方案都需要面對由政治斗爭所引發(fā)的各種拖累,但從Java的發(fā)展歷程來看,它的抗?fàn)師o疑更有力也更持久,這也證明了 Java足以成為開發(fā)人員賴以生存的可靠技能保障。
Java繼續(xù)扮演證實角色的核心理由二: 線程的魔法
Java虛擬機(jī)的一大突出優(yōu)勢在于,它一直有能力以輕松易行的方式處理多線程。JVM專門針對大型多計算核心設(shè)備進(jìn)行了優(yōu)化,且能夠在毫無阻礙的狀 態(tài)下頻繁處理數(shù)百個線程。這種靈活性正是Java吸引到大量其它編程語言為其開發(fā)跨越型編譯器及模擬器的主要理由,因為只有這樣這些語言才能夠切實運行在 JVM之上。
這種強大的能力同樣吸引到了眾多高流量網(wǎng)站的灼熱目光。他們利用Java編寫出的代碼不僅能夠運行在自己的臺式設(shè)備之上,還可以充分利用由服務(wù)器提供的多計算核心處理能力。
Ruby屬于Java所面對的現(xiàn)代競爭對手之一,它的主要優(yōu)勢在于其簡潔而與英語非常接近的語法設(shè)置。然而當(dāng)Ruby擁護(hù)者們需要將代碼性能提升到 新高度時,他們不得不選擇JRuby——一套專門用于在Java當(dāng)中進(jìn)行Ruby模擬,從而在高負(fù)載情況下利用多線程實現(xiàn)性能水平保障的版本。Sun公司 的工程技術(shù)人員們在這些細(xì)節(jié)方面給出了理想的解決方案。
Java繼續(xù)扮演證實角色的核心理由三: Java適合作為開發(fā)人員接觸的第一款編程語言
無論是宗教、軍隊還是國家,要想擁有持續(xù)穩(wěn)定的發(fā)展態(tài)勢,它們都必須擁有忠誠的青年群體作為依托。Java屬于高級計算機(jī)科學(xué)領(lǐng)域的通用語,這意味 著它往往成為學(xué)生們接觸到的第一款編程語言。這樣的情況既有好的一面、亦有帶來負(fù)面影響。不過當(dāng)年輕人們?nèi)蘸箝_始學(xué)習(xí)新語言時,他們總會不自覺地將其優(yōu)勢 與短板同Java進(jìn)行對比。即使他們最終轉(zhuǎn)投其它陣營——事實上確實有很多開發(fā)人員放棄了Java——他們的腦海深處仍為Java保留著不可撼動的空間, 這畢竟是他們在探索計算機(jī)科學(xué)這片廣闊天地時所邁出的第一步。
作為教授計算機(jī)科學(xué)的工具,Java擁有著諸多獨特的優(yōu)勢。一部分程序員不愿為數(shù)據(jù)指定類型,因而會將Java稱為“五花大綁”式編程方案。這聽起 來似乎有些偏執(zhí),但由此培養(yǎng)出的良好習(xí)慣非常適合初學(xué)者了解計算機(jī)內(nèi)部到底發(fā)生了些什么。在拼寫數(shù)據(jù)類型的過程中,他們會思考自己為什么要這樣做。接下 來,編譯器會揪出他們的錯誤,指明哪些變量的次序存在問題。
一部分最時髦的編程語言已經(jīng)徹底放棄了對大括號的使用,因為這些符號的存在會讓代碼維護(hù)工作變得非常復(fù)雜。這一結(jié)論也許確實無誤,但對于新手程序員來說、這些大括號的存在能夠幫助他們確切掌握嵌套關(guān)系。層層疊疊的括號能夠幫助這些菜鳥以抽絲剝繭的方式看懂整個嵌套體系。
也有一部分技術(shù)人員更傾向于自行打造編程語言,而且在大多數(shù)情況下他們拿出的衍生語言會拋棄大部分 Java所采取的束縛與規(guī)則、從而降低其使用難度。他們的思路絕對是好的,但其中的理解誤區(qū)在于,更簡單、更直白的語法往往會在日后的實際使用中帶來更多 難題甚至是危險。有些人認(rèn)為“五花大綁”式的規(guī)則方案令人窒息,但Java確實能讓我們在起步之初培養(yǎng)起良好的開發(fā)習(xí)慣。在經(jīng)受過良好的培訓(xùn)之后,新人們 能夠在面對極端狀況時表現(xiàn)得更加輕松從容。
Java繼續(xù)扮演證實角色的核心理由四:(足夠出色的)跨平臺兼容性
Java并不是第一款希望實現(xiàn)簡單跨平臺兼容性的語言,但它卻是其中人氣最高的選項。這并不是說Java的兼容效果堪稱完美——如果存在庫缺失或者 不兼容版本,那么代碼仍將陷入崩潰。大家無法將自己的最新JRE 1.7代碼在經(jīng)過編譯之后,同時運行在擁有數(shù)GB內(nèi)存的臺式機(jī)以及資源有限的Java ME手機(jī)上。Java的兼容性還沒那么理想。
不過當(dāng)初的Sun與如今的甲骨文公司在大多數(shù)情況下都帶來了令人滿意的跨平臺兼容效果。如果兼容性無法正常起效,我們往往會發(fā)現(xiàn)這是由某些完全可以 接受的理由所導(dǎo)致。如果大家使用了正確的Java版本并確保設(shè)備擁有足夠的內(nèi)存,那么其兼容性肯定能得到正常發(fā)揮。Java開發(fā)人員能夠利用自己的桌面系 統(tǒng)工具來創(chuàng)建代碼并將其移動到目的地處——無論是一臺手機(jī)還是一臺服務(wù)器上。如果該編譯器當(dāng)中包含有正常的庫并通過了版本驗證,那么代碼將如我們的預(yù)期般 順利運行。這樣的能力簡直稱得上無價之寶。
#p#
Java繼續(xù)扮演證實角色的核心理由五:在小型芯片上不斷獲得成功
Java也許已經(jīng)不可能順利登陸大型臺式設(shè)備,但其卻在移動領(lǐng)域找到了適合自己發(fā)展的溫暖環(huán)境——而這也恰好是近年來發(fā)展最為迅猛的市場區(qū)劃。Android平臺從上到下皆以Java作為構(gòu)建基礎(chǔ),而且這款來自谷歌的移動系統(tǒng)也已經(jīng)在市場份額方面輕松超越了蘋果iOS。
不過別會錯了意,Java在移動領(lǐng)域的優(yōu)勢可不是在現(xiàn)代智能手機(jī)出現(xiàn)后才確立的。該語言及其虛擬機(jī)的精簡版本Java ME在想當(dāng)初的所謂功能機(jī)上就已經(jīng)得到了廣泛普及,這些與智能手機(jī)非常接近的移動設(shè)備當(dāng)初可是擁有著成百上千萬臺的銷售量。
當(dāng)我們將上個時代與這個時代的狀況加以匯總,就會發(fā)現(xiàn)Java的優(yōu)勢已經(jīng)不能用明顯來形容了——簡直是壓倒性的。
Java繼續(xù)扮演證實角色的核心理由六: 藍(lán)光
Java曾一度被命名為“Oak”,且其設(shè)計目標(biāo)在于運行在Sun公司希望統(tǒng)治的機(jī)頂盒平臺之上。雖然其歷史使命沒能像Sun方面的預(yù)期那樣順利實 現(xiàn),但Java卻仍然在用戶的起居室當(dāng)中找到了更理想的運行載體。藍(lán)光標(biāo)準(zhǔn)正是以Java為核心建立而成,而任何希望將向藍(lán)光光盤中添加額外內(nèi)容的朋友都 必須使用Javac編譯器版本。
藍(lán)光光盤的適用范圍遠(yuǎn)不僅僅是充當(dāng)原始視頻資源的載體。我們可以利用純Java代碼編寫額外功能并對現(xiàn)有交互工具進(jìn)行修改及強化。藍(lán)光光盤內(nèi)容屬于壓縮視頻與壓縮Java字節(jié)碼的混合體。大家可以利用這套藍(lán)光標(biāo)準(zhǔn)實現(xiàn)不少既定目標(biāo)。
Java繼續(xù)扮演證實角色的核心理由七:括號機(jī)制仍有存在必要
Ruby、Python或者CoffeeScript等流行語言的擁護(hù)者們往往會對Java(以及C語言)強迫程序員一次又一次按下括號按鍵的方式 不屑一顧。小括號、中括號以及大括號都是這些人的咒罵對象。(我本人也不喜歡這種設(shè)定,而且很懷念Lisp的某些版本允許我們始終以中括號結(jié)尾的機(jī)制。)
不過改變標(biāo)點符號的使用規(guī)則并不能夠真正消除復(fù)雜性。換言之,這只不過是將復(fù)雜性隱藏或者掩蓋了起來。使用空格作為標(biāo)簽僅僅是以看不到的方式將這些 關(guān)系從我們的直覺中剔除了出去。如果單純只是一條用于觸發(fā)單行代碼的if語句還沒什么,但如果涉及多層嵌套關(guān)系時、這種模糊的表達(dá)就會讓人很難理解。當(dāng)我 編寫Python代碼時,我時常發(fā)現(xiàn)自己需要不斷復(fù)核自己的敘述思路。也就是說,單純讓代碼看起來像普通英文并不意味著其真就跟英語句子一樣易于理解。
Java繼續(xù)扮演證實角色的核心理由八: Groovy
如果Java程序員希望擁有一套具備動態(tài)類型的簡潔便利語法規(guī)則,那么他們也完全不必轉(zhuǎn)而使用某種新奇的語言。他們可以使用Groovy,一套能夠 生成Java字節(jié)碼的完備預(yù)處理方案。這種編程語言與Java全面集成,因此我們可以在向Groovy代碼行中直接添加指向Java庫的調(diào)用。它就像是一 套用于編寫Java代碼的速記機(jī)制,便捷而有效。
這種出色的靈活性讓程序員及工程師們以自己的方式解決難題。當(dāng)Groovy的運行速度無法滿足需求時——這種情況通常是由于使用了動態(tài)方法調(diào)用——程序員也仍然可以利用Java對其中那些導(dǎo)致時耗變長的部分進(jìn)行重新編寫。
#p#
Java繼續(xù)扮演證實角色的核心理由No. 9: JVM
JVM的構(gòu)建目的與優(yōu)化方針主要指向由Javac編譯器所生成的靜態(tài)范圍,但在此基礎(chǔ)之上、開發(fā)人員意識到JVM也能夠同時運行其它語言的編碼成 果。由于編譯器能夠生成合法的Java字節(jié)碼,因此JVM并不在乎所導(dǎo)入的代碼到底屬于哪種編程語言。Haskell、Scala以及Clojure的開 發(fā)人員都能夠構(gòu)建自己的編譯器并借此投身于Java陣營之下——而且JVM中存在的顯著共生問題數(shù)量非常有限。
由此帶來的吸引力可謂顯而易見。Sun/甲骨文公司的工作是創(chuàng)建出了一套跨平臺環(huán)境,并讓每個人從中受益。Sun/甲骨文公司的工程師們緩和了不同語言之間的差異并消除了人們對于兼容性的擔(dān)憂,這樣每個人都能以自己熟悉的方式將代碼運行在JVM之上。
微軟公司在創(chuàng)建C#語言時也借用了這一思路(并加以進(jìn)一步擴(kuò)展),同時以自己的方式構(gòu)建起面向大部分主流語言的編譯器方案,這樣一來C#虛擬機(jī)將能 夠順利將它們納入自身。C#程序員表示,他們能夠以多種不同語言進(jìn)行代碼編寫——同時不必?fù)?dān)心它們無法運行在Windows設(shè)備之上年虛擬機(jī)系統(tǒng)當(dāng)中。干 得漂亮!
Java繼續(xù)扮演證實角色的核心理由十: NoSQL革命在很大程度上得益于Java
很久以前,數(shù)據(jù)庫本身就是一套不可思議的黑匣子,它能夠存儲信息并快速高效地對查詢請求作出應(yīng)答。在此之后,NoSQL革命開始席卷而來,程序員們 意識到自己能夠編寫屬于自己的數(shù)據(jù)庫方案、并根據(jù)需求對其中的代碼進(jìn)行調(diào)整。而大部分廣受好評的NoSQL工具都是由Java編寫而成的。 Cassandra、Lucene、ElasticSearch、HBase以及Neo4J則是人們最常提及的幾類NoSQL選項。接下來,acid- state等方案開始陸續(xù)出爐,其由Haskell所編寫但能夠運行在JVM環(huán)境當(dāng)中。
這些工具通常屬于開源方案,而且能夠順利實現(xiàn)整合。一部分開發(fā)人員會運行它們以處理獨立任務(wù),但也有一些會將其代碼編譯至自己的庫等堆棧當(dāng)中。在其 它情況下,Java往往作為數(shù)據(jù)庫層中的通用語言,從而確保Java開發(fā)人員能夠在這里以較為輕松的方式完成代碼編寫任務(wù)。Java開發(fā)者不用太擔(dān)心由字 符編碼或者線路終端所帶來的小故障。換句話來說,Java開發(fā)人員可以享受到NoSQL革命所帶來的現(xiàn)實成果。
Java繼續(xù)扮演證實角色的核心理由十一:《我的世界》讓千禧一代找到心靈的寄托
布魯克林的時尚人士可能會嘲笑Java,但Java程序員群體卻擁有著年輕一代的廣泛支持。而且盡管Ruby等時髦語言一直在不遺余力地拉攏自己的 支持者,但仍有很多年輕人投入到Java的懷抱當(dāng)中。為什么會這樣?四個字:《我的世界》。這款游戲由Java編寫而成。如果孩子們希望對《我的世界》進(jìn) 行擴(kuò)展,那么他們需要學(xué)習(xí)Java開發(fā)技術(shù)來構(gòu)建相關(guān)插件。這就確保了下一代程序員們能夠繼續(xù)以Java作為其入門起點。
Java繼續(xù)扮演證實角色的核心理由十二: 開源
Sun公司一直扮演著開源領(lǐng)域的領(lǐng)導(dǎo)者角色,但其對于是否徹底放開對Java的控制卻一直顯得比較猶豫。但這并沒有妨礙Java程序員們以寬松的開 源許可為基礎(chǔ)發(fā)布大量出色的庫與項目。作為Apache項目之一,Java在許可之下不斷帶來可觀的代碼成果,但同時又不要求使用者付出任何回報。
Sun公司最終于2007年將大部分Java源代碼以GPL許可進(jìn)行了發(fā)布; 自此開始,該公司及其新任持有方甲骨文就一直在努力將開源作為該語言的理想歸宿。當(dāng)然了,公眾由于甲骨文將谷歌拖入訴訟糾紛的作法而對其進(jìn)行了一番口誅筆 伐,不過Java在很大程度上仍然應(yīng)被視為一套自由開放的平臺。
反對者比比皆是,但Java仍然奮勇前行
Java當(dāng)然也有著自己的一些問題,而Java的反對者們也始終存在并在各類網(wǎng)絡(luò)評論欄中對其大加抨擊。Java的垃圾收集機(jī)制會影響到代碼的運行 穩(wěn)定性,而輸入校正系統(tǒng)效果不理想、無法真正消除代碼錄入錯誤。注釋系統(tǒng)太過復(fù)雜。目前新功能的推出節(jié)奏明顯比過去慢得多。強制要求程序員使用括號令人頭 大如斗。這份抱怨清單很長,而且大部分內(nèi)容確實有幾分道理。
然而就目前來看,還沒有哪位競爭對手能夠真正在深度與廣度方面壓倒Java。盡管前面提到的這些問題看似容易解決,但解決問題的過程往往同時也會帶 來新的問題。目前與Java之間差距最小的對手可能要數(shù)JavaScript,其憑借著快如閃電的Node.js在服務(wù)器上找到了理想的施展空間。不過這 樣的設(shè)計思路完全可以在Java上重新實現(xiàn),而程序員們單純依靠Java也能夠獲得同樣出色的代碼運行速度。
綜上所述,我們不能忽視Java自身所具備的眾多優(yōu)勢。作為平臺,它能夠承載一切開發(fā)成果且以開放姿態(tài)接受修改。大家可以將Java庫中的大部分內(nèi) 容替代為自主開發(fā)的代碼,從而實現(xiàn)各類差異性功能。Java語言屬于開源項目且具備卓越的靈活性。無論該語言及其平臺存在著怎樣的局限,其解決過程都相對 比較輕松。這意味著Java程序員們可以繼續(xù)擁有最理想的生產(chǎn)效率。換句話來說,雖然Java的相關(guān)書籍已經(jīng)無法再占據(jù)暢銷書名單、其更新頻率也無法與誕 生早期相提并論,但Java仍將繼續(xù)生存并展現(xiàn)出旺盛的生命力。
原文標(biāo)題:Java forever! 12 keys to Java's enduring dominance