在這篇文章中,我們將要探討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語言的風險評估,並可以保持Team Dev小型化最終從根本上提高生產力。
Java需要一個催化劑。隨著網路爆炸,Applet應用普遍被嵌入在NetScape瀏覽器中,使得C語言開發人員不得不轉向去開始使用Java語言。C++因為和Java文法的類似,可以簡單地進行過渡。Java得以迅速獲得數量龐大的使用者群,並且在同微軟的競爭中逐步提升這樣的過渡。
Java的膨脹要比我們以前所見的任何一次技術浪潮都要迅速,同時也可能比我一生所見的任何技術都要龐大,然而Java的發展藍圖卻一直保持清晰。為了建立新的語言,原有的語言已不適應開發人員的需求,新的語言必須要克服原有語言的缺陷,並最終以某些催化效應迅速聚集起數量龐大的使用者群。