在這篇文章中,我們將要探討Java與Ruby語言遷移時風險預測方面的問題。
通常來說,“使用Ruby具有風險”是一種普遍的看法,這存在一定的原因。因為使用新的語言天生是有風險的。隨著Ruby on Rails逐步進入到主流的開發領域中,這樣的風險將會隨時間逐漸降低,因為有逐步增長的開發者群、組件(或稱作gems和plug-ins)相關的書籍、以及業務合作伙伴與你溝通交流。但同時你也可以聽到主流的觀點指出“使用Java是安全的”。對於這種的觀點,我持有強烈的反對意見。隨著語言的膨脹,這樣的風險通常也會增長。為了便於理解在目前在這些觀點上正發生什麼變化,投入點精力去研究Java最初的應用情況是值得的。
新技術采用概況
許多分析家擁有技術應用所需的描述模型。其中最為流行的模型是定義在Ruby的Web開發框架Iowa中,用來描述農產品的應用,稍後在一本由Geoffrey A. Moore寫作的名為《跨越鴻溝》(Crossing the Chasm)的書中,被用來描述技術內容。在書中,Moore分析了技術應用周期中存在著的五個截然不同的群體:
技術專家。這個群體傾向於采用新的技術。任何一種有前途的技術都會引起這個群體的注意。
先行采納者。不管這項技術是否在主流技術中取得成功,這個群體都將會采用新的技術來提升競爭優勢。
實用主義者。一旦新的技術進入主流應用,或是有足夠陡峭的增長曲線來保證技術將得到廣泛采用,那麼實用主義者就會積極采用新的技術。
保守派。只有新技術成為必須的時候,他們才會考慮采用新的技術。
懷疑論者。這個群體可能很晚才會采用新的技術,或者也可能永遠只使用某一特定技術。
Moore指出,技術應用的關鍵之處在於團隊中是否存在實用主義者。因為實用主義者需要新技術大規模的應用,這個中間群體希望看到其他務實派在團隊做出承諾之前就使用新的技術。這是一個類似於《第二十二條軍規》書中所描述的現象,因為務實派們都會相互依賴的存在。出於這樣的原因,在先行采納者排列在技術專家之後和務實派之前,你會經常在市場接受度曲線中看到一種下降的趨勢。Moore將這種下降稱之為鴻溝傾向,並且這種想法應出於圍繞任何新技術的風險討論的中心。
Moore解決方法是,把重點放在跨越鴻溝的過程中。通常來說,你很難通過一個巨大的飛躍跨過鴻溝。你需要有一個目標明確的細分市場。Java技術首先通過Applet程序進入網絡客戶端,之後轉向服務端的計算、移動終端、以及其他類似於移動計算以及企業架構的應用,最終為網絡帶來強大沖擊。
在《超越Java》一書中,我認為存在於程序設計語言之間的鴻溝特別嚴重。我們大多數人都認識到在Lisp語言上投入精力將大幅提高生產率,但是同時也會導致更難找到合適的程序開發人員、教學資源、類庫以及組件等。同時我們還將不得不付出更多的花費來進行一些必要的整合工作。出於這個原因,大眾市場只會以大約每十年的時間周期更換主流的編程語言。在服務端編程語言方面,可以清晰看到這種趨勢的存在。COBOL和Fortran語言出現於1954年到1961年之間。C語言則誕生在上世紀70年代初期,C++是出現在上世紀80年代中期,Java語言則出現在1996年。我應當把C#語言算做整合高效的Java語言克隆版本,雖然這樣的說法可能會引發一些爭辯。許多其他的語言在此階段中誕生,但是上述語言仍舊沒有一個能夠占據統治地位。伴隨的風險是阻礙新編程語言被廣泛采用的最重要原因。
Java的風險概況
使用Java語言曾經需要克服很大的風險。當時,大多數服務端的編程都在使用C++語言。C++是一門高效的操作系統語言,非常適用於應用程序開發。C語言家族在這方面的表現相當出色,因為客戶機/服務器端編程以及用戶界面開發需要程序性能與適應性良好地結合在一起,在當時其他的編程語言都無法符合這樣的要求。為了克服伴隨采用新編程語言而來的風險,Java需要以下的三個條件均成立:
C++開發者不得不經歷一番辛苦的學習過程。指針的存在(由於缺少編譯時的安全性)導致各種各樣難以消除的缺陷。內存管理使得內存洩漏成為家常便飯。C++對於大多數程序開發者來說,顯得過於復雜。這些問題增加了針對於C++語言的風險評估。
Java需要解決一些C++語言無法處理的工作。Java語言所具有簡潔、靈活的特性以及眾多C++所不包括的類庫支持。這些要素減少了針對於Java語言的風險評估,並可以保持開發團隊小型化最終從根本上提高生產力。
Java需要一個催化劑。隨著網絡爆炸,Applet應用普遍被嵌入在NetScape浏覽器中,使得C語言開發者不得不轉向去開始使用Java語言。C++因為和Java語法的類似,可以簡單地進行過渡。Java得以迅速獲得數量龐大的用戶群,並且在同微軟的競爭中逐步提升這樣的過渡。
Java的膨脹要比我們以前所見的任何一次技術浪潮都要迅速,同時也可能比我一生所見的任何技術都要龐大,然而Java的發展藍圖卻一直保持清晰。為了建立新的語言,原有的語言已不適應開發者的需求,新的語言必須要克服原有語言的缺陷,並最終以某些催化效應迅速聚集起數量龐大的用戶群。
Java作為Internet應用語言在客戶端迅速得到立足。借助於靈巧的Applet應用程序,由於Java提供了對於應用開發者極有幫助的特性,使得Java快速轉移到服務器端開發,這些特性包含有:
內存管理
干淨的繼承模型
更好的面向對象功能
便攜性
Internet類庫
安全
……以及其他許多特性。在我看來,Java一直以來都是最為成功的編程語言。隨著Java不斷的改進,使用Java語言變得越來越安全,並最終在Internet應用中統領著服務端開發的市場。商業投資,開發者社區,各種教育培訓,開放源代碼的框架,以及各種各樣的信息發布都使得使用Java開發的風險降低。上述幾點清晰地解釋了Java取得成功的原因。
一旦新的程序開發語言跨越鴻溝,開發語言相關的風險則會隨著市場占有率的提升顯著減少。
Java則擁有一個令人贊歎的成功過程。但是程序設計語言沒有仍舊停留在不確定的技術發展水平之上。所有成功語言都會產生技術膨脹,因為它們必須去適應使用者不斷變化的需求。成功的編程語言無法像其他的語言一樣快速的適應變化,他們必須保持一定程度上的向後兼容,來滿足逐步增長的用戶基本需求。隨著技術滯後與語言膨脹的產生,另一種形式的風險預測逐步形成。為了新的風險預測,由於風險與程序開發者高效完成工作的能力相關,使得風險與市場占有率的降低有必然的聯系。
到目前為止,我已經開始關注於新生技術的市場風險。在Java誕生十周年之際,另一種形式的風險評估成為必須。就像《人月神話》、《死亡之旅》和《人件》等許多有影響力的書籍中鼓吹的那些風險一樣:
低下的生產力將導致更龐大的團隊規模和更長的時間周期
風險隨著項目的規模而增加
風險隨著團隊規模的擴張而增加
質量風險,以Bug的數量來衡量,隨著代碼行數的增加而增長
成本的增長導致風險的增加
綜合成本隨著復雜性的提高而增加
隨著程序設計語言或者編程范例的使用有了積累,相對於技術發展水平,語言將會與生產力相關聯。項目團隊需要增加規模,開發者需要編寫更多的代碼來解決相同的問題。所有這些因素本身就會增加風險。所有的因素將會導致必然的結論。
由於市場主宰地位的終止,相對於技術發展水平來說,生產力風險與開發語言相關性將會增加。
在Java語言的范疇中,這些情況是否以及如何發生是一個將會引起激烈爭論的話題。當然,Java仍然是解決整個一系列企業問題的最佳語言,比方說非常大型的項目,或是比如雙相提交或核心對象關系映射等具備特定需求的問題。針對於Java的商業投資從來沒有這麼強過,並且Java社區一直是保持持續高漲。但是根基中的缺陷逐漸開始顯現出來。
Java的企業級JavaBean框架,WS-*風格的網絡服務,以及JavaEE的復雜性和寬松度已受到越來越多的批評。James Duncan Davidson,servlet的創始人之一,曾表示Java不再像從前那樣方便易用。目前很難給一個普通的Java開發者,講明白如何解決最一般的編程問題:比如有後台數據庫支撐的網絡應用。出現的相關證據是,已經出現了很多使用其他語言的開發框架,最為出名的就是Ruby on Rails,在處理小規模問題時具備極高的生產力。資深Java開發者James Duncan Davidson,Mike Clark,Justin Gehtland,Stuart Halloway以及其他許多開發者都證明,在關鍵的小型項目中使用了Rails之後,獲得了非常高的生產效率:具備後台數據庫支撐的綠色網絡應用。當然,我的個人經驗也是可以輕松地使用Ruby on Rails構造、部署並維護這樣的應用。
這些報告將會引起廣泛的爭論,就像是早期關於Java生產力的那些報告一樣。還記得,在Java開發廣泛普及之前,Java首次出現在各式的小型應用中。開發人員的生產力是驅動Java早先增長期的重要標准。請謹記Moore關於新技術出現的理論。跨越鴻溝最好的方式不是通過一次大的跳躍,而是每次只前進一個小的階段。
我堅信復雜性和松散的開發效率是使得Java目前正在經歷風險的原因。
Ruby與生俱來的風險
比起其他新生的開發語言來,Ruby並沒有什麼特別之處。缺少商業投資,有限的開發資源,還缺少開發經驗,這都為新生的程序設計語言帶來了風險。下面是一些我遭遇到的較大的風險。
人才的缺乏。很難找到熟練的Ruby開發人員。根據Java的發展情況來看,這樣的現狀將會很快有所改觀,但是就目前來說,如果你計劃在很短的時間內組織一個人數較多的Ruby開發團隊,其困難程度遠比組建相同的Java團隊要大得多。
缺少經驗。許多LAMP相關的語言已經建立了記錄跟蹤機制。Google使用Python;許多主流的.COM公司使用Perl或C語言。目前仍沒有使用Ruby打造的旗艦級應用,來展示Ruby語言強健的可拓展性,或是復雜的企業級集成。我們只是不知道Ruby是否可以解決某些特定類型的問題。
部署和配置策略。Ruby on Rails已經出現將近一年的時間,所以在部署和配置方面的經驗還不如競爭語言那樣豐富。
缺少類庫支持。Ruby遠不如Java語言擁有這麼多豐富的類庫支持。
缺少商業投資。你需要花費很大的力氣才能找到Ruby的咨詢、培訓或承包的機會,並且這些大多數還並不存在。
還有其他許多類似的風險。然而,你可以有效地降低使用Ruby語言的風險,比如采取績效掛鉤的風險預測。雖然開發和部署大型Ruby應用的相關知識積累仍然十分有限,但是你可以在適當的著眼點不斷學習新的知識。對於PHP、Perl和Python等LAMP相關語言,業界有著非常豐富的知識積累。在應用部署機制、Web服務器以及非共享可拓展策略等方面都是一致的。
在考慮參與開發的人手時,不要低估你通過對員工進行內部培訓來建立高效團隊的能力。對於使用Spring、Eclipse、Hibernate和WebWork進行Java開發的新手,我的訓練計劃常常是為Ruby on Rails開發者指定培訓計劃的五倍。如果你開始使用具有類似於Ruby特性的開發語言,比方說Perl,Python或Smalltalk,它們可以幫助你很好地起步。如果你打算從零開始培養一個程序員的話,培養一個使用Ruby的開發者,遠比培訓Java開發者使用最新的一大堆各種框架要合算的多。
想一想那些眾多的函數類庫,有多少是你真正需要的?如果你需要分布式處理,雙相提交,那麼就使用Java編程。如果您需要與Microsoft Office的宏完美地整合,那麼就使用.NET。但如果你想編寫操作系統整合腳本,或編寫基於數據庫的綠色Web應用,那麼Ruby則正是你所需要的。並且你可以經常編寫要用到但手邊沒有的任何程序。我曾協助一家公司工作,他們在兩個星期內編寫了自己的數據庫驅動程序,但仍然比完成項目其他工作所用的時間要多。我還認識一個使用Ruby在四小時內修補現有代碼,為程序拓展Oracle支持的開發者。Thoughtworks在很短的開發周期內就發布了RBatis,即Ruby版本的實體關系映射工具iBATIS。
所以當你站在全局考慮時,會感覺到使用Ruby的風險往往被誇大了,尤其是在Java並沒有帶給你一切所需資源的時候。自己真正去嘗試使用Ruby語言,是把這些風險納入控制范圍之內的最好方法。使用Rails開發一些實際的應用,並站在實踐的角度上發言。而不要盲目迷信別人的說法。
神話 vs 事實
Rails是銀彈。
人們曾經在Rails項目上失敗過,並且還將會有更多失敗的教訓。如果你在沒有具備必須技能的情況下使用它,你也將可能面臨失敗的命運。
與之類似的說明是,如果Java語言不是導致失敗的問題根源,那麼Ruby將同樣不會是你的答案。大多數軟件開發問題的出現是與特定技術無關的。如果你正在遭受打擊,Ruby on Rails的采用只能加快你遭受打擊的速度。
選擇Ruby頗具風險,因為你無法預測到錯誤。
采用任何新的語言,最主要的風險是你將預測到錯誤,並且錯誤停滯在使用的類庫之中。這的確是一項相當重大的風險,但是這個問題決不僅局限於Ruby語言之中。在Java語言裡,你需要就主要類庫的使用做出決定,其中任何一個都可能帶給你復雜臃腫的代碼。你是否會為聲明事物選擇Spring或EJB 3等技術?Java的持久層架構是不是一個正確的選擇,或者Hibernate就是最終的解決方案?關於Web MVC分層的正確選擇是什麼,是逐步衰落的Struts框架,還是其他更易用的框架?
在Ruby語言之中,選擇Web開發框架則相對簡單許多。你將很可能與Rails一起工作。語言動態的特性同樣各層之間的結構更為簡化,通過特定的約定來使得開發配置比Java實現更為明晰。
為Java項目招募人手總是更為容易。
Java擁有數量龐大的開發者群體,但是開發社區之間有著巨大的分歧。如果你想使用一個綜合的Java工具集,你的選擇是十分有限的。即使你選擇了像Spring這樣的流行框架,你的團隊必須還要學會使用針對給定項目所需的各種類庫。在這種情況下,Java的核心力量,過多的函數類庫,將會給項目帶來副作用。相反,大部分的Ruby開發者都知道Rails框架。此外,你通常需要更多的Java開發者去處理類似的任務。有時,招募Java的開發人員要容易得多。但有時,情況也並不是這樣。
Rails無法拓展。
Ruby on Rails其實有很好的延展性。它的緩存模型非常強大,並且非共享的架構在LAMP社區中多次被證明是非常有效的。實際上,我們知道Ruby on Rails完全可以適應較大型應用的要求。我們不知道Ruby on Rails是否可以承受大規模的應用部署。沒有固有的架構使我相信這是一條死胡同。對於典型的應用,總之錯誤的潛伏期是存在於數據庫端。
Rails的整合選項十分有限。
Rails對於基於ReST的Web服務有著良好的支持。Ruby同樣通過JRuby項目提供對於JVM的支持,以及提供對於微軟的CLR運行時的支持。同時Ruby也提供了良好的消息傳輸支持。最後,為項目選擇最好的工具將會幫助你始終處於良好的狀態。優秀的開發團隊可以在Java和Ruby項目上同時獲得成功。
總結:你可以承擔什麼樣的角色?
如果你正在考慮使用Ruby,那麼在你身邊將會有很多有用的信息。與其他同時在有效使用Java和Ruby的開發者交流。閱讀關於開發框架的資料。查找從Java到Ruby的遷移資料。如果你並不想放棄Java,只是想尋找輕量級的開發體驗,那麼去了解一下那些可以為你帶來更多相關體驗的項目,比如說RIFE、JMatter或Wicket項目。如果你認為Ruby可能是一個好的選擇,那麼要留心以下的建議:
為項目選擇合適的工具。Ruby on Rails並不是銀彈,ROR是一個針對以數據庫為後台的高度精簡的Web應用開發環境。與新的數據庫模式配合較好,或者你可以通過變更來適應Rails的各種固有優點。
細心計劃開發團隊的熱身階段。你不需要在Monster.com站點投放廣告並在三日之內為項目招募齊全開發人員。但你可能需要考慮培訓你部分或全部的開發者,並且招募幾個頂尖的Rails開發者,或是請求某些項目咨詢來幫助你把項目啟動。
了解你使用傳統方式的結合點。通常,項目中最頭疼的部分是定義與外部系統的交互。你最初證明概念的工作需要與某些接觸點交互,至少是要明確你在何處對項目感覺到滿意。
如果你還是不確定,那麼做一個先行者,或是遵從保守派的觀點。緩解風險最佳的方法總是優秀的判斷能力。
關於作者
Bruce Tate居住在德克薩斯州的奧斯丁,是一位山地自行車和橡皮艇愛好者,同時也是兩個孩子的父親。Bruce已經撰寫了9本編程方面的書籍,其中包含兩本Ruby的書籍以及五本Java相關的書籍。Bruce還是RapidRed公司的創始人,公司專注於包含Ruby和Rails在內的輕量級開發技術,並提供開發、資訊和培訓等業務。Bruce是一位世界范圍內廣受稱贊的優秀演說家、程序員、培訓師以及技術顧問。