席捲全球Java界的《Java Puzzlers》作者-Google首席Java架構師
Joshua Bloch與Google專任工程師兼Java講師Neal Gafter,應邀來臺擔任Java 2006的講師。iThome邀請多位Java專家與兩位Google大師對談。在輕鬆的氣氛中,Joshua與Neal針對Java的發展與 Google的技術應用等議題,以幽默詼諧的方式提出他們的看法。
PC組成高度容錯的分散式架構
王建興:當我們知道可與兩位來自Google的Java大師座談時,心中浮現的自然是Google舉世聞名的分散式架構,Java向來有效能上的爭議,但Google為何會採用Java?又如何應用Java?
Neal:Google打造的許多應用程式都是大型的分散式系統,我們不會將應用程式放到一臺大型的單一主機上。我們喜歡使用現成的PC,來建構我們的系統,而不是大型而且可靠度佳的昂貴主機。單一PC隨時可能發生錯誤,我們試著用軟體的方式建立容錯的機制。
基本上,我們沒使用J2EE,這其中有許多原因,包括Google在J2EE之前就已經有了自己的分散式架構,甚至還是使用 Java 語言建構出來的。所以Google有自己的RPC(Remote Procedure Call)系統,而且廣泛地使用,它可以在不同語言之間達到良好的溝通,不論伺服器、用戶端、Java、Python 或C++,而且運作地很平順。
我們應用Interface Definition Language編譯程式,成為可以跨Java、Python及C++三種語言的系統。所以當我們設計一個分散式系統時,其中一件事就是看哪種通訊協定可 以適合這些語言來開發,另外就是我們怎麼處理容錯、備份、如何確保我們不會遺失任何使用者的資料、如何恢復某臺當掉的機器。Google有特別的解決方式 處理這方面的問題,我們有個通用的解決方法。
Joshua:沒錯,如Neal所言,失敗不是少見的情況,而是很常見的。當你要建立一個像Google這樣規模的搜尋服務,你可以想像會有多少問題,但是我們就是要持續的讓服務運作下去,盡量讓系統可以自動修復,不要造成延遲。
王文彬:Google的應用好像都是自製的,是否曾使用其他公司的產品?
Joshua:會的,我們會拿現成的來用,多數工具是我們自製的,不過如果有別人已開發好的軟體,剛好是我們需要的,而且價格不錯,我們會買下它,Google Web Toolkit(GWT)就是很好的例子。
Neal:我們就常用一些開放源碼的產品,用哪些可能不方便講,不過我們用很多Linux工具,有時候我們會用些其他人開發好的工具,其實Google沒有規定一定什麼都要自己開發,當你要把程式交給開放源碼社群時,你會傾向社群支持你的東西,但你不會要他們付錢給你。
彬:這就是JBoss要做的。
Java與C++人才的比重逐漸改變
王建興:我們聽早上的主題演講,你們說Google應用Java在中介層(Middle-Tier),例如GMail、Calendar。我們很有興趣知道什麼樣的應用適合使用Java?
Neal:沒錯,在中介層的開發,Java是很好的選擇。Google 有很多基礎的設施,Web Servlet 引擎,讓你很簡單就能以Java撰寫與部署中介層的程式。
Joshua:而且有許多現成的函式庫,不需要用到bit-level,就可以整合原有底層的C++程式,這可以廣泛地移植到用戶端的程式,像是一些AJAX程式。
Neal:這還是要看各個開發團隊決定用什麼,如果是要開發一些以Web為主的程式,可能就不考慮Java而選擇C++,有可能因為他們對C++很熟,所以,即使他們開發的東西和我做的很像,但他們還是決定選擇C++。
王建興:你們認為Java能提供更好的可攜性嗎?
Joshua:絕對是的。而且Java可以提供較好的效能表現。
Neal:一般來說,以Google使用Java的方式下,可攜性沒那麼重要。因為我們將Java應用程式部署在特定版本的Linux。
不過,可攜性的優點,是當我們移至下一個版本的Java,或下一個版本的Linux時,我們不想鎖在某個特定版本的Java、架構或作業系統,所以可攜性很重要。
Joshua:但我們不會要求寫程式時,要同時兼顧在任何平臺上都可以執行,這有點與寫程式的態度有關,你是要寫給自己用的,或是寫給全世界用的。
王建興:我想你們會採用 Java 有一個很重要的理由是想要降低開發的心力和時間。
Joshua:絕對如此。還有另一個理由,學生在學校裡學的都是Java,而且喜歡Java,他們甚至不懂C++,所以比找C++人才容易。
Neal:而且Java除錯容易多了。
王文彬:現在Google的C++與Java工程師的比例為何?各占一半嗎?
Joshua:我不太確定。可以肯定的是Google正在徵求更多的Java工程師。
Neal:應該不到這個比例,使用C++的應該多一點,可能是 6:4 左右。不過,使用Java的人正在成長中,5年前Google大概沒什麼人使用Java,所以我們可以預見,Java在Google裏越來越重要。
王建興:即使Java對開發企業應用程式是夠快的,可是你們怎麼兼顧延展性(Scalability)?
Joshua: Google解決Java的延展性,就像解決其他這類延展性問題。像是複製、大型分散式系統,或者用更多機器來解決這些問題。
王建興:所以你們會用分散式架構來解決?
Joshua:對。
葉秉哲:請問Google分散式基礎架構早在Google搜尋引擎剛草創的時代就已經存在了嗎?
Neal:許多Google的叢集和分散式基礎架構,的確可追溯到Google兩位創始者在史丹福大學研究所,以三五臺機器研究時代。不過早期的基礎架構都已被重新設計過,所以現在已經很難看到雜亂的程式碼了。單以搜尋引擎核心本身而言,大概就被改寫過三次。
Joshua:不過,當然,某些核心的演算法,例如PageRank仍然存在。
沒有修改JVM,調校是從程式著手
王建興:在你們早上的演講中,提到有許多在Java社群有所貢獻的人,現在都在Google,我們看到有很多人都熟悉JVM,我們猜你們有基於效率的考量修改JVM。我們有猜對嗎?
Joshua、Neal:猜錯了。
Joshua:你們可能會這麼想,但就我所知沒有。我們使用現成的JVM,不是我們為自己人說話,但昇陽的JVM效能一直在精進,我們把原來跑在 JRE 1.4的程式放在Tiger上,發現,哇!效能這麼好。再放在Mustang,哇!效能更快,我們就不用花什麼功夫特別去調整我們的程式了。
Neal:我們的確是和昇陽保持聯繫,所以當我們遇到了特定的問題時,我們就會讓他們知道,這樣的VM對我們不夠用。
Joshua:而且我們提供解決方案。
王建興:所以最佳化是在應用程式的層級進行?
Joshua:是的,開發精簡而有效率的程式,Java是很好的工具。Java程式既短且清楚,而且提供夠多的函式庫,可以根據需求置換。要寫出一樣的C++程式,就得花上更多的力氣。
Neal:你可以找到許多用在Java的效能衡量與調校的工具,那可以很容易找出問題在哪。
王建興:程式效能的瓶頸。
Neal:是呀,我總是很驚訝瓶頸怎麼會在這兒,所以總是真的找到了才相信。
王建興:效能瓶頸所在,總是令人驚訝不已。
Joshua:沒有真的證明前,總是猜錯瓶頸究竟在哪裏。
開放原始碼,對Java的幫助有限
朱仲傑:我們知道這幾年Java將會開放原始碼,你們們覺得這會對提升Java的效能,或找出Java的效能瓶頸有幫助嗎?
Joshua:Neal和我並不同意這個觀點,基本上我們有研究許可(Research License)已經可以閱讀原始碼,調校或找出問題都很簡單,我不是要說這麼做沒用,而是我們不需要因為原始碼不夠開放而這麼做,從1995年到現在, 已有很多進步,可以寫很高效能的Java程式。
Neal:Java SE今年年底就要釋出原始碼,你可能會覺得屆時開放源碼社群協助Java SE,找出Java SE的問題。不過,其實他們現在就已經可以這麼做了,Java SE已有公開的原始碼,你可以在上面加些警告,也可以告訴昇陽哪裏有問題。但是實際上,很少人這麼做,所以我不覺得完全開放源碼之後,會吸引大家貢獻些什 麼,因為現在就可以了。
Joshua:不過學術單位在Java開放以後,就可以更自由的使用與修改Java了。
Neal:有些事是開放Java源碼以後可以做的。像是Java語法的實驗,現在我雖然可以改Java的東西,做些實驗性質的應用,加些新的功能,但因為我不是昇陽的員工,不被允許提供給別人試用。
Joshua:我要提出相反的看法,7年前Philip Wadler、Martin Odersky這兩個人,在Java上加了很多功能,然後取名叫「Pizza」,現在的Generic功能很多都是根源於Pizza的。
Neal:但如果他們在Java開放原始碼之後再做,就不需要自己重寫一個Java SE了!
Joshua:我要說的是,這類在Java之上的再開發,7、8年前就有。
Google力求提供在地化的服務
馮彥文:我很好奇Google的軟體,有沒有還未自動化的?需要人工處理的?
Neal:有,像在地化,因地區不同的翻譯之類。
Joshua:也是有些工具可以幫忙。
Neal:其實也有系統幫助不在Google工作的人,協助我們做在地化。
Joshua:基本上Google會盡量能自動化就自動化,Yahoo就不那麼自動化,Yahoo是有歷史原因的,因為從一開始的設計就是由人工登錄網址;而Google從一開始的索引就是讓網路自己搜尋,但也沒辦法做到樣樣自動化。
Neal:還是有些服務像登廣告,得由人工檢查填寫資料的是否正確,及是否侵犯他人的商標。
Joshua:不過我再強調,我們都盡量自動化,不能做到的,才用人工補強。例如Google News,就不是用人工挑選資料,是電腦篩選的。
Neal:Google設計服務時,還是以自動化為原則,這樣的服務才不會被限制住。如果有服務是我們無法靠自動化來解決的,可能我們就做錯了方向。
馮彥文:所以像 Google廣告,如果我想申請的是中文、日文,這些不同語言的廣告,你們需要不同地區的人協助嗎?
Neal:我想我們在全球不同國家,都有分公司照顧各種語言的用戶,我們的服務在全球都有,還是需要有人知道當地的語言、文化、法律的特色,才能服務當地的人。
葉秉哲:所以我們才能看到Google Map在日本是日文,在希臘是希臘文。
Neal:沒錯。
Joshua:Google了解這個世界只有一小部分人的母語是英文,我們也了解,在這個一直成長的網路世界人口中,大部分的人說著其他語言,Google想要為這部分的人服務。
衝擊可以激盪出更多興奮的點子
錢世豐:Google在全球有那麼多員工,分散在不同的地方,如何合作完成工作?
Joshua:我們公司使用電子郵件和即時傳訊系統溝通。有人說到Google Talk嗎?
昨晚我抵達台北的時候,寫電子郵件給老婆,一打開即時通訊,就有Google的人傳訊過來問我「Hey,你現在在哪裏?我有個技術問題想問你,有個API 裏有個名字,我不認為那是個好名字,你覺得呢?」基本上,Google是個全球性的公司,合作的方法就是要有全球化的想法。
Neal:Google盡可能的維持小型團隊,而且讓小型團隊在同地點工作,理想的團隊規模可能是5個人,4個或5個,也許多到8個。大過這個數字,溝通就複雜多了。
Joshua:舉例像匹茲堡分公司,匹茲堡的團隊可能有些人會在某個計畫上分擔工作,和位於山景城(Mountain View)總部的員工合作。Google是從史丹福的研究生開始的,逐漸聚集許多工程師加入,這些工程師聚在一起就會有些東西蹦出來。
王文彬:你們現在有多少員工?一萬人?
Neal:還沒,大約7000~8000人。
王文彬:那現在一定也多了許多人是從事業務工作,從一個管理者的角度來看,如何和業務這類不同性質的人合作?
Joshua:這對公司而言的確是有點挑戰。可能有時候需要順從別人的意見,但Google還是盡量保有某些原則。當然還是有混亂衝擊(Chaos)的時候,優秀的科技公司,總是會有些「衝擊」,因為衝擊可以激盪出更多令人興奮的點子。
王文彬:我總很好奇,你們有很多東西都是自製的,那新進同仁要如何學習這些東西呢?學習方式為何?
Joshua:這是非常棒的問題,來到Google就像剛移民時,都要上一些課,像剛上大學會有新生訓練一樣,Google有兩個禮拜的新生訓練,教導Google現有的產品。例如我們是開發Java程式的,就會教導一些寫Java的方式。
Neal:新進員工會有指定的mentor(學長)帶他,如果有什麼問題,可以問學長,實作上的問題,所有辦公室都是可以分享的資源, Google人都很樂意幫忙。尤其新進來的工程師會有個「Starter Project」,會指導你怎麼做某些特別的事,讓你習慣程式管理機制,例如如何檢查程式、程式撰寫的原則、有問題該找誰等。
Neal:一般來說,Google不會把5、6個新員工放在一起,由他們自己做事,新員工都會安插在一些原有的團隊裡面。
Joshua:其實老員工都還會輪調到不同分公司,彼此交換經驗,像我這趟臺灣行結束後,我會馬上去賓州的匹茲堡分公司輪調一個星期。
Google的80/20工作法則
錢世豐:Google的員工可以利用20%的工作時間做任何想做的事,是真的嗎?
Neal:真的!我當初的20%時間是做一個行事曆的應用,後來發展成為今日的Google Calendar。它現在變成我的80%,而目前來臺灣就是用我的20%時間。
Joshua:很多年來,我的20%是更新《Effective Java》。
AJAX仍在演進,是未來的趨勢
朱仲傑:我們知道AJAX是從Google Map點燃的,而AJAX現在正火紅,Java Script有個大問題是相容性,有些語法只能在IE或Firefox上使用。Gmail可以在很多瀏覽器上使用,但Google Calendar就只能在IE和Firefox上用。
Neal:不,它現在可以在Mac OS上使用了。
使用AJAX撰寫應用程式,會比用Java用戶端技術撰寫應用程式花上更多力氣。真的,因為可攜性不會是免費奉送的。另一方面,並不是很多人的機器都裝有 Java,但每個人都有瀏覽器,Firefox到處都有,而IE更佔有90%,只要有Windows就有IE。實務上來說,當你能夠在這兩個瀏覽器上執 行,對大多數人來說,就具備了可攜性。
Joshua:我看AJAX是比以前的HTML更豐富,但還是沒有比傳統的Windows、Mac OS或Unix上的應用程式豐富。不過另方面,AJAX一直在改進,比以往更容易移植、更容易維護,這些背後技術的演進,讓使用者能自然地使用,不會感覺 到技術端有什麼不同,這些都是好事。我有時候對AJAX做不到一些功能而感到挫折,但另一方面以一些商業的角度來看,選AJAX還是正確的決定。
Neal:AJAX的應用還是無法像一般例如Java開發的程式來得豐富,其中部分原因是技術太新,所以不那麼普及,沒有那麼多函式庫可以讓開發 變得簡單,而且AJAX還是有效能上的問題,Java Script還是一個直譯式的語言,如果未來有更豐富複雜的以AJAX 開發的應用程式,我們還是需要有更好的Java Script解譯方法。我還是會很高興看到越來越多用戶端在使用Java。
Joshua:會的,大約60%的電腦出廠時就裝好Java 5的JRE(Java Runtime Environment)。
丁彬:Google以併購的方式取得GWT,Google還有其他的AJAX 工具集的計畫嗎?
Neal:Google很多專案採用AJAX技術,不過如果你的問題,是Google有沒有其他的AJAX Toolkit產品,就我所知是沒有。
Joshua:就我所知,也是沒有。就算有,我也不被允許談論這些計畫。
葉秉哲:所以你們會用嗎?(指GWT)
Neal:我們現在沒有,因Google Calendar在AJAX誕生之前就開始開發了,但如果開發時就有這些工具,我想我會採用。至於我現在是否會將Google Calendar轉由AJAX工具開發,這聽起來就有點費功夫了,可能不太值得。
葉秉哲:如果有新的應用,你們可能就會採用?
Neal:如果有新的計畫是以AJAX為目標,我想會採用的,因為有現成的可以利用。
Joshua:如果有時間我也會想用,不過有點困難。
葉秉哲:當Google在使用腳本語言時,為什麼會選擇Python,而不是Perl 之類的語言?
Joshua:當我們任職於Google時,Google已經採用Python,所以我並不知道最初的原因。在Google內部也有人使用 Perl,不過只是用於個人的20%時間,屬於實驗性質,用來展示及說服個人的想法;當此計畫成長到有其他人加入時,還是得轉移到Google最常用的語 言平臺上。
Google OS?只是揶揄微軟
朱仲傑:現在你們用的Java是哪一個版本?
Joshua:我很驕傲的說,現在我們已經用到Tiger,我是2004年7月4日加入Google,大約從2005年3月起,全公司就轉換到Tiger,這是在Tiger發表後沒多久的事。
Neal:我們已經完成JDK 1.6的測試,只要等JDK 1.6公佈後,我們也可以很快地轉換過去。
錢世豐:請問你們有自己的作業系統嗎?
Joshua:沒有,我們用Linux,我們在一些大規模的系統用Linux,但我們沒有自己的作業系統。
Neal:但我在自己的筆記型電腦上做了一個「Google OS」的螢幕保護程式,當我去演講開會的時候,大家都會看到我用「Google OS」。
王文彬:這是行銷?
Neal:是我們在揶揄微軟。
C#與Java各擅勝場
王建興:.NET是Java的主要競爭對手,現在也有開放源碼的.NET Framework可執行於Linux,它叫做Mono,你對Mono的看法?
Neal:嗯,它還不完整,是吧。有很多開放源碼的Java實作,也都不完整。很多Java的實作,都只有60%~70%的API支援,就算是90%都不夠好。那意謂著我可能會呼叫到一個不能起作用的方法。要支援全部才算有用。
Joshua:像我在Java的委員會,我還是覺得即使是.NET公開的API也不會很實際,Java有完整公開的計畫,主要就是要把所有函式庫都公開。
丁彬:那C#呢?C#的目的之一,就是要從Java社群挖走一些人,你們覺得呢?
Neal:我認為C#的確有一些好的想法。他們有自由選擇不需要保留向下相容性,舉例來說,當他們在語言中決定增加Generics語法時,他們 建立了另一套全新的Collections API,身為程式設計員或是軟體廠商,必須在原本的和新的介面中,選擇一套來使用。以語言設計的角度來說,這樣做可能比Java設計者的選擇來得好,C# 有這樣的自由可以讓設計者更大幅地改良語言的設計。
Joshua:我這樣說好了,「模仿」絕對是高度的讚美,何況是像C#如此公開的模仿。我不全然認為C#挖走了Java 的開發者。當你的目標是在Windows 上開發時,為了某些明顯的因素,使用C#或C++會面臨較少的整合性問題。
Neal:在Java的Generics中,有Wildcard的語法,我認為這是一個極為重要的部分,它讓程式設計人員更有威力、可以更靈活的 表達設計理念。C#中就沒有這項功能,這也可能和當時的程式語言社群中對於 Wildcard 的需求討論還沒這麼熱烈有關,但我認為對C#來說,要增加這項功能已經太晚了。
Joshua:每一種程式語言都有它的優點和缺點,我或許有點偏頗,不過我的確很喜歡Java中這些新的功能。C# 中有太多過去Pascal及C++的影子。
王建興:以一個架構師的角度,可以區別一下Java和.NET的核心的不同嗎?
Joshua:我對.NET的核心沒有那麼熟,他們出現得比Java晚,所以可以針對Java的缺點改進,但如果你有看《Java Puzzlers》,你會發現還是有很多Puzzlers也同樣在C#出現。
朱仲傑:《Java Puzzlers》、《Effective Java》的第二版何時會問市呢?
Joshua:我在今年舊金山的JavaOne大會,於數千人面前保證,在下一屆JavaOne之前,會推出《Effective Java 2nd edition》,我會繼續努力朝著明年出版的目標努力。至於《Java Puzzlers》的第二版,希望不會再有那麼多難題了。因為越多難題與陷阱其實代表這個語言的缺點越多,只要我們不要再加入更多不好的語言特性在 Java中,就不會有太多新的難題。
Java太肥了嗎?
王文彬:我對Java的未來方向有點好奇,Java已經很成熟,若我們再持續加入新功能,會不會讓語言太過龐大而失焦?
Joshua:會的,每個語言都有生命週期,有些語言持續增加新功能,導致該語言後來很難寫、很醜、難以使用,很多語言後來變成這樣,而我會盡力讓 Java不變成這樣。我相信現在的Java已經是一個相當完整的語言,雖然還是有很多好的功能可以加入,但將這些東西一股腦全部加進來絕對是錯的。
Neal:我覺得在JDK 5就加入了太多功能。
王文彬:是的,像annotation 就是。
Joshua:但是使用者喜歡耶!我是annotation技術團隊的負責人,雖然這不是我心目中最想要的功能,但是我相信它對一般的Java工程師幫助很大。
Neal:有兩個我覺得後悔的功能:Static Import 和 Varargs。
Joshua:其實Static Import我覺得並沒有太傷害Java語言本身,因為根本就很少用。Varargs在特定的時候,確實會造成無法預期的結果。
錢世豐:你們最喜歡哪些Java新功能?
Joshua:我覺得enum這個小功能很重要,但當初沒有規劃好enum的比較,現在的規格允許我們可以比較兩個enum是否相等,但是卻不能 使用像是大於、小於來比較兩個enum。另外像switch不能使用在String 上,很多人需要這個功能,沒理由Java無法做到。我覺得像這樣的小功能,是我很希望未來的Java再加入。
Neal:我自己認為有個功能是現在Java缺乏的:closures。
Web 2.0的定義始終是分歧的
朱仲傑:你們怎麼看Web 2.0呢?會覺得是泡沫嗎?
Joshua:我覺得這只是大家為現在的網路現象取個名字,就像從寫HTML開始,後來有Java Script,現在有公開的API,就可以做一些Mashups(混搭程式),我覺得一些Mashups很棒,像房屋網站Zillow.com就整合 Google Map,這些東西都很棒,不過這比較像是行銷人員把這種現象取了個Web 2.0的名詞。
Neal:我不知道大家怎麼看待Web 2.0的意義,我認為這是把網路應用服務集合的意思,其中有些想法也是行之有年,像Amazon上可以寫書評。不過我想Web 2.0會是現在和未來一些網路服務的趨勢。
Joshua:那如果說Web 2.0是平臺呢?當我們說 Web 2.0是一些以網路服務為基礎的平臺,像Amazon、Google、eBay有提供 API,這樣一些網路服務就可以利用其他網站現有的平臺提供更多應用。
錢世豐:我覺得直到有租屋網站和Google Map整合後,大家才開始注意Web 2.0的現象。
Neal:我覺得大家對Web 2.0的定義都不大相同,幾年後如果Web 2.0成功了,這個詞就還會存在;如果沒有成功,就不會再叫Web 2.0了。
錢世豐:有些人說GMail與Google Map是 Web 2.0 的開始。
Joshua:Google Map無疑的是屬於Web 2.0服務,你看Zillow.com就是整合Google Map的應用。整理⊙李延華
Joshua Bloch與Google專任工程師兼Java講師Neal Gafter,應邀來臺擔任Java 2006的講師。iThome邀請多位Java專家與兩位Google大師對談。在輕鬆的氣氛中,Joshua與Neal針對Java的發展與 Google的技術應用等議題,以幽默詼諧的方式提出他們的看法。
PC組成高度容錯的分散式架構
王建興:當我們知道可與兩位來自Google的Java大師座談時,心中浮現的自然是Google舉世聞名的分散式架構,Java向來有效能上的爭議,但Google為何會採用Java?又如何應用Java?
Neal:Google打造的許多應用程式都是大型的分散式系統,我們不會將應用程式放到一臺大型的單一主機上。我們喜歡使用現成的PC,來建構我們的系統,而不是大型而且可靠度佳的昂貴主機。單一PC隨時可能發生錯誤,我們試著用軟體的方式建立容錯的機制。
基本上,我們沒使用J2EE,這其中有許多原因,包括Google在J2EE之前就已經有了自己的分散式架構,甚至還是使用 Java 語言建構出來的。所以Google有自己的RPC(Remote Procedure Call)系統,而且廣泛地使用,它可以在不同語言之間達到良好的溝通,不論伺服器、用戶端、Java、Python 或C++,而且運作地很平順。
我們應用Interface Definition Language編譯程式,成為可以跨Java、Python及C++三種語言的系統。所以當我們設計一個分散式系統時,其中一件事就是看哪種通訊協定可 以適合這些語言來開發,另外就是我們怎麼處理容錯、備份、如何確保我們不會遺失任何使用者的資料、如何恢復某臺當掉的機器。Google有特別的解決方式 處理這方面的問題,我們有個通用的解決方法。
Joshua:沒錯,如Neal所言,失敗不是少見的情況,而是很常見的。當你要建立一個像Google這樣規模的搜尋服務,你可以想像會有多少問題,但是我們就是要持續的讓服務運作下去,盡量讓系統可以自動修復,不要造成延遲。
王文彬:Google的應用好像都是自製的,是否曾使用其他公司的產品?
Joshua:會的,我們會拿現成的來用,多數工具是我們自製的,不過如果有別人已開發好的軟體,剛好是我們需要的,而且價格不錯,我們會買下它,Google Web Toolkit(GWT)就是很好的例子。
Neal:我們就常用一些開放源碼的產品,用哪些可能不方便講,不過我們用很多Linux工具,有時候我們會用些其他人開發好的工具,其實Google沒有規定一定什麼都要自己開發,當你要把程式交給開放源碼社群時,你會傾向社群支持你的東西,但你不會要他們付錢給你。
彬:這就是JBoss要做的。
Java與C++人才的比重逐漸改變
王建興:我們聽早上的主題演講,你們說Google應用Java在中介層(Middle-Tier),例如GMail、Calendar。我們很有興趣知道什麼樣的應用適合使用Java?
Neal:沒錯,在中介層的開發,Java是很好的選擇。Google 有很多基礎的設施,Web Servlet 引擎,讓你很簡單就能以Java撰寫與部署中介層的程式。
Joshua:而且有許多現成的函式庫,不需要用到bit-level,就可以整合原有底層的C++程式,這可以廣泛地移植到用戶端的程式,像是一些AJAX程式。
Neal:這還是要看各個開發團隊決定用什麼,如果是要開發一些以Web為主的程式,可能就不考慮Java而選擇C++,有可能因為他們對C++很熟,所以,即使他們開發的東西和我做的很像,但他們還是決定選擇C++。
王建興:你們認為Java能提供更好的可攜性嗎?
Joshua:絕對是的。而且Java可以提供較好的效能表現。
Neal:一般來說,以Google使用Java的方式下,可攜性沒那麼重要。因為我們將Java應用程式部署在特定版本的Linux。
不過,可攜性的優點,是當我們移至下一個版本的Java,或下一個版本的Linux時,我們不想鎖在某個特定版本的Java、架構或作業系統,所以可攜性很重要。
Joshua:但我們不會要求寫程式時,要同時兼顧在任何平臺上都可以執行,這有點與寫程式的態度有關,你是要寫給自己用的,或是寫給全世界用的。
王建興:我想你們會採用 Java 有一個很重要的理由是想要降低開發的心力和時間。
Joshua:絕對如此。還有另一個理由,學生在學校裡學的都是Java,而且喜歡Java,他們甚至不懂C++,所以比找C++人才容易。
Neal:而且Java除錯容易多了。
王文彬:現在Google的C++與Java工程師的比例為何?各占一半嗎?
Joshua:我不太確定。可以肯定的是Google正在徵求更多的Java工程師。
Neal:應該不到這個比例,使用C++的應該多一點,可能是 6:4 左右。不過,使用Java的人正在成長中,5年前Google大概沒什麼人使用Java,所以我們可以預見,Java在Google裏越來越重要。
王建興:即使Java對開發企業應用程式是夠快的,可是你們怎麼兼顧延展性(Scalability)?
Joshua: Google解決Java的延展性,就像解決其他這類延展性問題。像是複製、大型分散式系統,或者用更多機器來解決這些問題。
王建興:所以你們會用分散式架構來解決?
Joshua:對。
葉秉哲:請問Google分散式基礎架構早在Google搜尋引擎剛草創的時代就已經存在了嗎?
Neal:許多Google的叢集和分散式基礎架構,的確可追溯到Google兩位創始者在史丹福大學研究所,以三五臺機器研究時代。不過早期的基礎架構都已被重新設計過,所以現在已經很難看到雜亂的程式碼了。單以搜尋引擎核心本身而言,大概就被改寫過三次。
Joshua:不過,當然,某些核心的演算法,例如PageRank仍然存在。
沒有修改JVM,調校是從程式著手
王建興:在你們早上的演講中,提到有許多在Java社群有所貢獻的人,現在都在Google,我們看到有很多人都熟悉JVM,我們猜你們有基於效率的考量修改JVM。我們有猜對嗎?
Joshua、Neal:猜錯了。
Joshua:你們可能會這麼想,但就我所知沒有。我們使用現成的JVM,不是我們為自己人說話,但昇陽的JVM效能一直在精進,我們把原來跑在 JRE 1.4的程式放在Tiger上,發現,哇!效能這麼好。再放在Mustang,哇!效能更快,我們就不用花什麼功夫特別去調整我們的程式了。
Neal:我們的確是和昇陽保持聯繫,所以當我們遇到了特定的問題時,我們就會讓他們知道,這樣的VM對我們不夠用。
Joshua:而且我們提供解決方案。
王建興:所以最佳化是在應用程式的層級進行?
Joshua:是的,開發精簡而有效率的程式,Java是很好的工具。Java程式既短且清楚,而且提供夠多的函式庫,可以根據需求置換。要寫出一樣的C++程式,就得花上更多的力氣。
Neal:你可以找到許多用在Java的效能衡量與調校的工具,那可以很容易找出問題在哪。
王建興:程式效能的瓶頸。
Neal:是呀,我總是很驚訝瓶頸怎麼會在這兒,所以總是真的找到了才相信。
王建興:效能瓶頸所在,總是令人驚訝不已。
Joshua:沒有真的證明前,總是猜錯瓶頸究竟在哪裏。
開放原始碼,對Java的幫助有限
朱仲傑:我們知道這幾年Java將會開放原始碼,你們們覺得這會對提升Java的效能,或找出Java的效能瓶頸有幫助嗎?
Joshua:Neal和我並不同意這個觀點,基本上我們有研究許可(Research License)已經可以閱讀原始碼,調校或找出問題都很簡單,我不是要說這麼做沒用,而是我們不需要因為原始碼不夠開放而這麼做,從1995年到現在, 已有很多進步,可以寫很高效能的Java程式。
Neal:Java SE今年年底就要釋出原始碼,你可能會覺得屆時開放源碼社群協助Java SE,找出Java SE的問題。不過,其實他們現在就已經可以這麼做了,Java SE已有公開的原始碼,你可以在上面加些警告,也可以告訴昇陽哪裏有問題。但是實際上,很少人這麼做,所以我不覺得完全開放源碼之後,會吸引大家貢獻些什 麼,因為現在就可以了。
Joshua:不過學術單位在Java開放以後,就可以更自由的使用與修改Java了。
Neal:有些事是開放Java源碼以後可以做的。像是Java語法的實驗,現在我雖然可以改Java的東西,做些實驗性質的應用,加些新的功能,但因為我不是昇陽的員工,不被允許提供給別人試用。
Joshua:我要提出相反的看法,7年前Philip Wadler、Martin Odersky這兩個人,在Java上加了很多功能,然後取名叫「Pizza」,現在的Generic功能很多都是根源於Pizza的。
Neal:但如果他們在Java開放原始碼之後再做,就不需要自己重寫一個Java SE了!
Joshua:我要說的是,這類在Java之上的再開發,7、8年前就有。
Google力求提供在地化的服務
馮彥文:我很好奇Google的軟體,有沒有還未自動化的?需要人工處理的?
Neal:有,像在地化,因地區不同的翻譯之類。
Joshua:也是有些工具可以幫忙。
Neal:其實也有系統幫助不在Google工作的人,協助我們做在地化。
Joshua:基本上Google會盡量能自動化就自動化,Yahoo就不那麼自動化,Yahoo是有歷史原因的,因為從一開始的設計就是由人工登錄網址;而Google從一開始的索引就是讓網路自己搜尋,但也沒辦法做到樣樣自動化。
Neal:還是有些服務像登廣告,得由人工檢查填寫資料的是否正確,及是否侵犯他人的商標。
Joshua:不過我再強調,我們都盡量自動化,不能做到的,才用人工補強。例如Google News,就不是用人工挑選資料,是電腦篩選的。
Neal:Google設計服務時,還是以自動化為原則,這樣的服務才不會被限制住。如果有服務是我們無法靠自動化來解決的,可能我們就做錯了方向。
馮彥文:所以像 Google廣告,如果我想申請的是中文、日文,這些不同語言的廣告,你們需要不同地區的人協助嗎?
Neal:我想我們在全球不同國家,都有分公司照顧各種語言的用戶,我們的服務在全球都有,還是需要有人知道當地的語言、文化、法律的特色,才能服務當地的人。
葉秉哲:所以我們才能看到Google Map在日本是日文,在希臘是希臘文。
Neal:沒錯。
Joshua:Google了解這個世界只有一小部分人的母語是英文,我們也了解,在這個一直成長的網路世界人口中,大部分的人說著其他語言,Google想要為這部分的人服務。
衝擊可以激盪出更多興奮的點子
錢世豐:Google在全球有那麼多員工,分散在不同的地方,如何合作完成工作?
Joshua:我們公司使用電子郵件和即時傳訊系統溝通。有人說到Google Talk嗎?
昨晚我抵達台北的時候,寫電子郵件給老婆,一打開即時通訊,就有Google的人傳訊過來問我「Hey,你現在在哪裏?我有個技術問題想問你,有個API 裏有個名字,我不認為那是個好名字,你覺得呢?」基本上,Google是個全球性的公司,合作的方法就是要有全球化的想法。
Neal:Google盡可能的維持小型團隊,而且讓小型團隊在同地點工作,理想的團隊規模可能是5個人,4個或5個,也許多到8個。大過這個數字,溝通就複雜多了。
Joshua:舉例像匹茲堡分公司,匹茲堡的團隊可能有些人會在某個計畫上分擔工作,和位於山景城(Mountain View)總部的員工合作。Google是從史丹福的研究生開始的,逐漸聚集許多工程師加入,這些工程師聚在一起就會有些東西蹦出來。
王文彬:你們現在有多少員工?一萬人?
Neal:還沒,大約7000~8000人。
王文彬:那現在一定也多了許多人是從事業務工作,從一個管理者的角度來看,如何和業務這類不同性質的人合作?
Joshua:這對公司而言的確是有點挑戰。可能有時候需要順從別人的意見,但Google還是盡量保有某些原則。當然還是有混亂衝擊(Chaos)的時候,優秀的科技公司,總是會有些「衝擊」,因為衝擊可以激盪出更多令人興奮的點子。
王文彬:我總很好奇,你們有很多東西都是自製的,那新進同仁要如何學習這些東西呢?學習方式為何?
Joshua:這是非常棒的問題,來到Google就像剛移民時,都要上一些課,像剛上大學會有新生訓練一樣,Google有兩個禮拜的新生訓練,教導Google現有的產品。例如我們是開發Java程式的,就會教導一些寫Java的方式。
Neal:新進員工會有指定的mentor(學長)帶他,如果有什麼問題,可以問學長,實作上的問題,所有辦公室都是可以分享的資源, Google人都很樂意幫忙。尤其新進來的工程師會有個「Starter Project」,會指導你怎麼做某些特別的事,讓你習慣程式管理機制,例如如何檢查程式、程式撰寫的原則、有問題該找誰等。
Neal:一般來說,Google不會把5、6個新員工放在一起,由他們自己做事,新員工都會安插在一些原有的團隊裡面。
Joshua:其實老員工都還會輪調到不同分公司,彼此交換經驗,像我這趟臺灣行結束後,我會馬上去賓州的匹茲堡分公司輪調一個星期。
Google的80/20工作法則
錢世豐:Google的員工可以利用20%的工作時間做任何想做的事,是真的嗎?
Neal:真的!我當初的20%時間是做一個行事曆的應用,後來發展成為今日的Google Calendar。它現在變成我的80%,而目前來臺灣就是用我的20%時間。
Joshua:很多年來,我的20%是更新《Effective Java》。
AJAX仍在演進,是未來的趨勢
朱仲傑:我們知道AJAX是從Google Map點燃的,而AJAX現在正火紅,Java Script有個大問題是相容性,有些語法只能在IE或Firefox上使用。Gmail可以在很多瀏覽器上使用,但Google Calendar就只能在IE和Firefox上用。
Neal:不,它現在可以在Mac OS上使用了。
使用AJAX撰寫應用程式,會比用Java用戶端技術撰寫應用程式花上更多力氣。真的,因為可攜性不會是免費奉送的。另一方面,並不是很多人的機器都裝有 Java,但每個人都有瀏覽器,Firefox到處都有,而IE更佔有90%,只要有Windows就有IE。實務上來說,當你能夠在這兩個瀏覽器上執 行,對大多數人來說,就具備了可攜性。
Joshua:我看AJAX是比以前的HTML更豐富,但還是沒有比傳統的Windows、Mac OS或Unix上的應用程式豐富。不過另方面,AJAX一直在改進,比以往更容易移植、更容易維護,這些背後技術的演進,讓使用者能自然地使用,不會感覺 到技術端有什麼不同,這些都是好事。我有時候對AJAX做不到一些功能而感到挫折,但另一方面以一些商業的角度來看,選AJAX還是正確的決定。
Neal:AJAX的應用還是無法像一般例如Java開發的程式來得豐富,其中部分原因是技術太新,所以不那麼普及,沒有那麼多函式庫可以讓開發 變得簡單,而且AJAX還是有效能上的問題,Java Script還是一個直譯式的語言,如果未來有更豐富複雜的以AJAX 開發的應用程式,我們還是需要有更好的Java Script解譯方法。我還是會很高興看到越來越多用戶端在使用Java。
Joshua:會的,大約60%的電腦出廠時就裝好Java 5的JRE(Java Runtime Environment)。
丁彬:Google以併購的方式取得GWT,Google還有其他的AJAX 工具集的計畫嗎?
Neal:Google很多專案採用AJAX技術,不過如果你的問題,是Google有沒有其他的AJAX Toolkit產品,就我所知是沒有。
Joshua:就我所知,也是沒有。就算有,我也不被允許談論這些計畫。
葉秉哲:所以你們會用嗎?(指GWT)
Neal:我們現在沒有,因Google Calendar在AJAX誕生之前就開始開發了,但如果開發時就有這些工具,我想我會採用。至於我現在是否會將Google Calendar轉由AJAX工具開發,這聽起來就有點費功夫了,可能不太值得。
葉秉哲:如果有新的應用,你們可能就會採用?
Neal:如果有新的計畫是以AJAX為目標,我想會採用的,因為有現成的可以利用。
Joshua:如果有時間我也會想用,不過有點困難。
葉秉哲:當Google在使用腳本語言時,為什麼會選擇Python,而不是Perl 之類的語言?
Joshua:當我們任職於Google時,Google已經採用Python,所以我並不知道最初的原因。在Google內部也有人使用 Perl,不過只是用於個人的20%時間,屬於實驗性質,用來展示及說服個人的想法;當此計畫成長到有其他人加入時,還是得轉移到Google最常用的語 言平臺上。
Google OS?只是揶揄微軟
朱仲傑:現在你們用的Java是哪一個版本?
Joshua:我很驕傲的說,現在我們已經用到Tiger,我是2004年7月4日加入Google,大約從2005年3月起,全公司就轉換到Tiger,這是在Tiger發表後沒多久的事。
Neal:我們已經完成JDK 1.6的測試,只要等JDK 1.6公佈後,我們也可以很快地轉換過去。
錢世豐:請問你們有自己的作業系統嗎?
Joshua:沒有,我們用Linux,我們在一些大規模的系統用Linux,但我們沒有自己的作業系統。
Neal:但我在自己的筆記型電腦上做了一個「Google OS」的螢幕保護程式,當我去演講開會的時候,大家都會看到我用「Google OS」。
王文彬:這是行銷?
Neal:是我們在揶揄微軟。
C#與Java各擅勝場
王建興:.NET是Java的主要競爭對手,現在也有開放源碼的.NET Framework可執行於Linux,它叫做Mono,你對Mono的看法?
Neal:嗯,它還不完整,是吧。有很多開放源碼的Java實作,也都不完整。很多Java的實作,都只有60%~70%的API支援,就算是90%都不夠好。那意謂著我可能會呼叫到一個不能起作用的方法。要支援全部才算有用。
Joshua:像我在Java的委員會,我還是覺得即使是.NET公開的API也不會很實際,Java有完整公開的計畫,主要就是要把所有函式庫都公開。
丁彬:那C#呢?C#的目的之一,就是要從Java社群挖走一些人,你們覺得呢?
Neal:我認為C#的確有一些好的想法。他們有自由選擇不需要保留向下相容性,舉例來說,當他們在語言中決定增加Generics語法時,他們 建立了另一套全新的Collections API,身為程式設計員或是軟體廠商,必須在原本的和新的介面中,選擇一套來使用。以語言設計的角度來說,這樣做可能比Java設計者的選擇來得好,C# 有這樣的自由可以讓設計者更大幅地改良語言的設計。
Joshua:我這樣說好了,「模仿」絕對是高度的讚美,何況是像C#如此公開的模仿。我不全然認為C#挖走了Java 的開發者。當你的目標是在Windows 上開發時,為了某些明顯的因素,使用C#或C++會面臨較少的整合性問題。
Neal:在Java的Generics中,有Wildcard的語法,我認為這是一個極為重要的部分,它讓程式設計人員更有威力、可以更靈活的 表達設計理念。C#中就沒有這項功能,這也可能和當時的程式語言社群中對於 Wildcard 的需求討論還沒這麼熱烈有關,但我認為對C#來說,要增加這項功能已經太晚了。
Joshua:每一種程式語言都有它的優點和缺點,我或許有點偏頗,不過我的確很喜歡Java中這些新的功能。C# 中有太多過去Pascal及C++的影子。
王建興:以一個架構師的角度,可以區別一下Java和.NET的核心的不同嗎?
Joshua:我對.NET的核心沒有那麼熟,他們出現得比Java晚,所以可以針對Java的缺點改進,但如果你有看《Java Puzzlers》,你會發現還是有很多Puzzlers也同樣在C#出現。
朱仲傑:《Java Puzzlers》、《Effective Java》的第二版何時會問市呢?
Joshua:我在今年舊金山的JavaOne大會,於數千人面前保證,在下一屆JavaOne之前,會推出《Effective Java 2nd edition》,我會繼續努力朝著明年出版的目標努力。至於《Java Puzzlers》的第二版,希望不會再有那麼多難題了。因為越多難題與陷阱其實代表這個語言的缺點越多,只要我們不要再加入更多不好的語言特性在 Java中,就不會有太多新的難題。
Java太肥了嗎?
王文彬:我對Java的未來方向有點好奇,Java已經很成熟,若我們再持續加入新功能,會不會讓語言太過龐大而失焦?
Joshua:會的,每個語言都有生命週期,有些語言持續增加新功能,導致該語言後來很難寫、很醜、難以使用,很多語言後來變成這樣,而我會盡力讓 Java不變成這樣。我相信現在的Java已經是一個相當完整的語言,雖然還是有很多好的功能可以加入,但將這些東西一股腦全部加進來絕對是錯的。
Neal:我覺得在JDK 5就加入了太多功能。
王文彬:是的,像annotation 就是。
Joshua:但是使用者喜歡耶!我是annotation技術團隊的負責人,雖然這不是我心目中最想要的功能,但是我相信它對一般的Java工程師幫助很大。
Neal:有兩個我覺得後悔的功能:Static Import 和 Varargs。
Joshua:其實Static Import我覺得並沒有太傷害Java語言本身,因為根本就很少用。Varargs在特定的時候,確實會造成無法預期的結果。
錢世豐:你們最喜歡哪些Java新功能?
Joshua:我覺得enum這個小功能很重要,但當初沒有規劃好enum的比較,現在的規格允許我們可以比較兩個enum是否相等,但是卻不能 使用像是大於、小於來比較兩個enum。另外像switch不能使用在String 上,很多人需要這個功能,沒理由Java無法做到。我覺得像這樣的小功能,是我很希望未來的Java再加入。
Neal:我自己認為有個功能是現在Java缺乏的:closures。
Web 2.0的定義始終是分歧的
朱仲傑:你們怎麼看Web 2.0呢?會覺得是泡沫嗎?
Joshua:我覺得這只是大家為現在的網路現象取個名字,就像從寫HTML開始,後來有Java Script,現在有公開的API,就可以做一些Mashups(混搭程式),我覺得一些Mashups很棒,像房屋網站Zillow.com就整合 Google Map,這些東西都很棒,不過這比較像是行銷人員把這種現象取了個Web 2.0的名詞。
Neal:我不知道大家怎麼看待Web 2.0的意義,我認為這是把網路應用服務集合的意思,其中有些想法也是行之有年,像Amazon上可以寫書評。不過我想Web 2.0會是現在和未來一些網路服務的趨勢。
Joshua:那如果說Web 2.0是平臺呢?當我們說 Web 2.0是一些以網路服務為基礎的平臺,像Amazon、Google、eBay有提供 API,這樣一些網路服務就可以利用其他網站現有的平臺提供更多應用。
錢世豐:我覺得直到有租屋網站和Google Map整合後,大家才開始注意Web 2.0的現象。
Neal:我覺得大家對Web 2.0的定義都不大相同,幾年後如果Web 2.0成功了,這個詞就還會存在;如果沒有成功,就不會再叫Web 2.0了。
錢世豐:有些人說GMail與Google Map是 Web 2.0 的開始。
Joshua:Google Map無疑的是屬於Web 2.0服務,你看Zillow.com就是整合Google Map的應用。整理⊙李延華