程式者的胡言亂語
JavaTwo 2006的另一收穫:看Google怎麼用Java
今年Java Two 2006同樣又是風雲濟會,Java社群的朋友們多半都出席參加了。比較特別的一件事就是iThome邀請了此次大會來自Google的來賓Google首席Java架構師Joshua Bloch與Google專任工程師兼Java講師Neal Gafter,在第一天的中午舉辦了一次座談,而我也有幸剛好能夠參加見證其風采,同時藉機提問了一些心中的疑問。
這一次的座談內容,iThome已經刊出「技術對談-看 Google 怎麼用 Java」一文。除此之此,william學長的Blog上也記錄了他的感想。
我自己也乘機記錄一些自己的想法。
在這一次難得的座談過程中,大家所提問的問題,無非集中在幾個方向:(1)Google的分散式架構(2)一般而言,許多人都對Java的效能有所質疑,但像Google這樣提供如此大規模服務的公司,卻採用了Java,原因還有結果都引起大家的好奇心。(3)他們對於火熱的AJAX(本次的Java Two最熱門的講題)看法如何?(4)Java有些眾所皆知的對手,例如.NET或C#,他們的看法又是如何?(5)Google對於非自產軟體的使用情況,包括open source或另行採購的。
由於我之前讀過《翻動世界的Google》這本書,對於Google所發展的分散式架構已經有初步概念上的了解。Google的approach很有可能像是建立一個P2P網路。時至今日,Google的這個分散式系統中,已經有數十萬部的機器。這些機器都不是昂費而且可靠度佳的大型電腦,相反的都是一些便宜的Linux PC。但正如Joshua所言,建立一個這麼大的系統,錯誤不僅會發生,而且還時常發生。而解決這個問題的方式,便是從軟體層面著手,事實上,也就是利用這個分散式架構的特性來處理。我想,這個架構像是一個plug-and-play的系統,隨時可以輕易的加入新的PC,擴展整個系統的能力。而且,即使一部或多部PC不能運作,整體系統的能力也不會退化太多。如果想提供全球性的服務,取得足夠的頻寬以及計算能力,都無法單靠過於集中式的系統來完成,而最終的關鍵仍會是建構出一個有效率的分散式架構。Google雖然以搜尋服務著稱,但支撐搜尋服務的背後大功臣,還是這少有敵手的分散式架構。在這個分散式的架構中,通過設計好的通訊協定來處理不同程式語言的整合與界接,因為在Google中使用了C++、Java以及Python三種語言,而這三種語言都必須被放到整個架構中運行。和預期的相同,他們並不採用J2EE,他們有自己的等同元件。
在他們早上的keynote中就已經提到,他們將Java應用在「中階」的應用程式,而這所謂的「中階」即是Web-based的應用程式,例如Gmail或Calendar。但令人好奇的是,即使這類的應用程式對效率的需求相較而言較低,但Google提供的服務量可是大的驚人?Java是如何撐起這片天空的?而他們的答案也簡單的很-就是所有應用程式共通使用的分散式架構。這一個架構為大型分散式服務所需要的種種機制提供了共通且可重覆的解決方案。有趣的事,他們有自己的Web Servlet Engine,我想那是符合Java Servlet API標準的一個servlet engine,但卻是建構在他們的分散式架構上,因為它扮演了應用程式與基礎設施之間的橋接,使得對應用程式而言,感覺不到底層有什麼不同,而卻又能善用到底層所提供的高率且大型的機制。
當效率的問題,可以透過共通的架構解決一大半後,更可以將問題朝向正面的動機,為什麼採用Java呢?降低開發的心力與時間是無庸置疑的,Neal特別強調,除錯更簡單,而Joshua提到另一個管理上的重點-Java的人力更容易招募。Java具備的另一個優點,對Google並不太成立,那就是可攜性。因為他們的應用程式執行的環境很固定,而不會有太多異質的環境,因此可攜性派不上用場。但他們卻提供另一個有趣觀點是,Java的可攜性使得他們保持與整個Java社群良好的連接,使得他們在Google中開發的有用玩意兒,得以回饋予社群。此外,他們還是會遇上環境變更的情況,例如新版本的Linux或新版本的Java,可攜性使得他們不會鎖死在特定的系統。
Google中應用Java的情況如何呢?我想從C++與Java程式員的比例可見端倪。我問過很多人這個問題,大家猜的都不對。令人意外的是,C++比Java程式員的比例大致上是60:40。這代表Java族群在Google中的勢力龐大,五年前甚至沒有什麼人在使用Java,但使用Java的人口卻日益成長,愈來愈重要。台灣的企業或軟體公司對Java有諸多質疑,尤其是效能。但Google做為一個可堪為效能表率的公司,應用Java的情況卻是令人驚訝的廣泛,我想這實在值得做為借鏡。
講到效能,他們對於效能的看法呢?在他們早上的keynote演講中列出了許多目前在Google但過去對於Java技術十分有貢獻,甚至有許多十分熟悉JVM技術的人們,我不禁猜想,他們應該有特別修改或調校JVM吧?答案也是相當令人意外,沒有。他們使用現成的JDK,因為Tiger上跑Java就很快了,在Mustang上更快。所以他們何必將心力放在JVM的調整呢?現在這可不是他們的本業了。那麼,最佳化是怎麼進行的呢?在應用程式層級來做最佳化。而且Joshua提到一個值得許多人思考的論點,高效的程式語言寫出來的程式既短且清楚。為什麼這樣的程式語言執行效率會好呢?更進一步想,讓開發者寫的部份少了,而且單純了,其餘的心力就被轉移到程式庫上頭,而程式庫時常都是專家進行過最佳化的。倘若每個程式庫都能夠由專家開發設計,並且提供足夠的程式庫,那麼寫出來的程式自然容易具備高效能。他們認為,要用C++寫出這樣的程式,得花上更多的力氣。
Google中的人才濟濟,不過他們不僅採用open source的軟體,甚至購買third-party的軟體。這突顯了,輪子不一定要都自己做,如果可以的話,將心力放在更重要的地方會更好,軟體產業也應當要有好的分工,並不是自己做得到,自己就得去做。適時的取捨,才能加快產品開發的腳步。
關於.NET,我的問題沒有問的很好,由於我知道他們採用Linux,所以直接切入了Mono,但Neal回應的很好,Mono並不完整,他們不能倚靠一個不完整的實作。那C#呢?他們認為C#對Java的模仿驗證Java了的優秀,雖然也不能否認C#加入了不少好的功能,但Java在迎頭趕上的過程中,也提供了不錯的補強。就我自己個人的經驗,應用C#的時機,恐怕還是如他們所言,「當開發目標是在 Windows 上時,為了某些明顯的因素,使用C#或是C++會面臨較少的整合性問題。」例如要使用DirectX這類十分原生的API時。否則C#與Java如此相像,不如使用Java,幾個語言上的差異,不太構成本質上的競爭落差。
至於AJAX這個主題,由於我對AJAX並不了解,所以也就不記錄些什麼了。但在這個主題中,Neal被問到可攜性的問題,朱仲傑提到Calendar(正是Neal參與開發的專案)只能在IE和Firefox上執行(不過Neal補充,現在也可以在Mac上執行了),Neal給了一個很實務的答案:「Firebox到處都有,而IE更佔有90%,只要有Windows就有IE。實務上來說,當你能夠在這兩個瀏覽器上執行,對大多數人來說,就具備了可攜性。」是啊,無論如何總是無法做到百分之百,你不能預期沒有人使用遠古時期的瀏覽器呢。做為全球性服務的提供者,總是得在這件事情上做出取捨,你得衡量是不是值得為某個比例的人來提高設計上的複雜度同時付出更多的心力。
對於他們在JavaTwo 2006的幾個場次,我認為都是專業級的。他們不僅在技術上有深厚的功力,同時對演講(或該說表演,他們甚至換上專門的表演服裝)內容的呈現,都有專業的安排。他們這演講,是以類似相聲的形式進行,每個例子本身,都隱含了值得深入思考的主題,但穿插了增加戲劇效果的橋段-這些橋段都是精心設計的。
至於與他們對談,兩人十分輕切又誠懇的互動,不時摻雜笑點,實在是不錯的經驗。有時,覺得他們脫口而出的一兩句話,都覺得帶有點些許哲學的味道,好比Neal提到AJAX的可攜性時提到「可攜性不會是免費奉送的」。是啊,你總是要為可攜性付出代價。愈高的可攜性愈高的代價。又好比Joshua說的,「我必須說Google裡有某種程度的混沌,但我相信好的公司都有某種程度的混沌,因為混沌才能產生新的想法。」我也覺得,公司制度化是好事,但你不能企圖把公司弄得極度制度化,因為那就僵化了,時常會抑制創新想法的產生,而公司需要創新的想法,來提供公司變得更好的契機(有如遺傳演算法中的突變機制一般)。
總結來說,Joshua及Neal在許多面向上都展現了世界級的水平,令人敬服。
Posted at 03:25下午 八月 30, 2006 by Chien-Hsing Wang in Java |
星期三 八月 30, 2006
