2010年8月24日

技術對談-看Google怎麼用Java

席捲全球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》。



Google專任工程師Neal Gafter(左)與Google首席Java架構師Joshua Bloch(右),兩人利用Google的20%自由工作時間寫出《Java Puzzlers》暢銷書。攝影/賴基能

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首席架構師,著有《Effective Java》、《Java Puzzlers》“當你要建立一個像Google這樣規模的搜尋服務,你可以想像會有多少問題,但是我們就是要持續的讓服務運作下去,盡量讓系統可以自動修復,不要造成延遲。”



Neal Gafter
Google專任工程師兼Java講師,著有《Java Puzzlers》“使用AJAX撰寫應用程式,會比用Java用戶端技術撰寫應用程式花上更多力氣,因為可攜性不會是免費奉送的。”

2010年8月19日

記錄:人月神話

曾經接過急迫且大型的網站建置專案,但是進行上卻還算順利,這是由於系統工程師十分有經驗,在分工、次序與掌控上,都做了很好的安排。
但在最近的一個朋友的經驗中,卻是遇到網站的機制改版,在時程與資源運用上卻不斷延遲,還好是內部機制,不用對客戶交代,否則所蒙受的將不是只有金錢上的損失。
我們知道時程延遲,但原因在哪裡?為何會發生?
人月神話的第二章,應該是這本書的精華,也是書名的由來,看完這個章節,發現作者道出很多軟體專案上的管理關鍵。而軟體專案是不可以完全套用傳統產業的專案管理方式。
第一個關鍵 樂觀
首先作者提出了一件常常發生的事情,這也是一個朋友身上發生的故事:『程式設計師都是樂觀的傢伙。』而且我發現越年輕越樂觀,但是無可避免的這是個年輕的產業,很少會遇到很有經驗的程式設計人員,這些年輕人,即使告訴他這樣是會有問題的,他也不改其樂觀。
所以『他們所做的第一個錯誤假設是一切都會進行的很順利』可是沒有想到一個bug,就可以花上一天時間也無法解決。然後,就延遲了後面本來假設可以順利進行的部分。
第二個關鍵 人月
人月,是我們預估和排定時程用的,但是作者提出一個前提:『使用人月必須要在人力與工時可以互換的狀況下。而且要當工作可以切割、投入工作的人不用溝通,人力與工時才能互換。』就是說要可以互換,才能使一個人做30天,與30個人做一天的結果一樣,不然單純用人月去估算時程,一定會有誤差。
為什麼呢?首先軟體專案有其連續性,作者舉了個例子,蠻傳神的,他說,生小孩就是要九個月,你叫多少個媽來生都是一樣。第二點是因為即使工作可切割,但是需要溝通,越多人投入就需要多的溝通與教育的時間,所以一個人做30天的工作不可能用30個人做一天就完成。
所以,Brooks定論說,在一個時程已經落後的軟體專案中增加人手,只會讓它更加落後。
因此,要讓一個專案順利進行,首先要有良好的時程規劃,考慮所有的因素,而且,程式人員要有勇氣不要妥協,堅持自己預估的時程。就像是廚師一樣,即使外面的客人在等著上菜,一隻雞要烤多久就要烤多久,不能因為妥協就用大火烤焦了。
外科手術團隊
這個篇章看完突然想到研究所的專案管理課程,三個學分,卻是我們一個學期的研究重心,四個實際運作的專案,大家分組進行,教授不斷的製造專案危機,像是公司被併購、人員流失、專案形式改變、客戶不斷施以壓力等等,但最後大家還是順利的結案。
這是個難以忘懷的經驗,組員們的默契在起初的確造成危機,但是,由於大家的素質還算整齊,很快就可以建立溝通的語言。加上大家熟悉協同科技概念與網路溝通,可以做到分時分地作業,也使得專案進行有效率。
但當我看完這篇外科手術團隊後,我發現其實還有個成功的關鍵在其中,就是同學們各有專長,所以,分工很容易,又因為有選出leader作為掌控者,所以,不會亂。大家不會做重複的事情。每個人按照時程交差,就可以順利完成。
作者認為一個外科手術中,有操刀的大夫,有護士、有麻醉師等等,各司其職。而不是像屠夫團隊,每個人都得拿刀。一個團隊中只有一個人操刀,其他人扮演支援的角色。這樣整件事情就會出自一個腦袋不會亂,也不需要不斷的溝通協調。
這兩個篇章是我比較有感覺的,寫出來跟大家分享。
最後,作者還有一個人月的概念我覺得很重要,這會影響到組織的公平性:一個好手,花一天可以做完,但同樣一件事,庸才卻需要三四天以上,甚至加班趕工,也許還領加班費。如果照這樣去計算人月,一定會差之千里。