在前文中提到,Java有時被評為是「C++ --」,是因為它雖然和C/C++同源,但是削除了許多C++中原先具有、威力強大的語言功能。這些從C++中削減、或沒有帶過來Java的部份,背後多半都有一個共通的特性,就是它們容易造成程式設計者犯錯。我們可以說,Java在語言層次上盡量避免程式設計者犯錯,是Java試著提高開發生產力的一個重要方向。

魔幻語言與簡約語言
著名技術作者孟岩,在他一篇名為《Ruby 1.9不會殺死Python》的文章中,試著把程式語言分為兩類,一類他稱之為「魔幻語言」,而相對的另一類,則稱之為「簡約語言」。

在這篇文章裡,他說:「『魔幻語言』擁有豐富的特性,聰明的技巧和意想不到的奇效,永遠有發掘不完的奇技淫巧,總能找到讓人匪夷所思的yet another way」。他認為這一類語言的代表,包括像是C++、Perl、JavaScript和Ruby。而「『簡約語言』崇尚清晰直接,夠用就行,要求從代碼容易理解,寧可笨一點、累一點、多寫一點代碼,反對出人意料的技巧,反對故弄玄虛」,C、PHP、Python和Lua便是這一派語言的代表。

這是一個很有趣的分類方式,事實上,這也陳述出程式語言在設計時的兩種本質性差異。從Java寧可削減那些威力強大的語言特色及功能,也要盡量避免犯錯的特性來看,就不難明白Java事實上是比較偏簡約語言那一派的。如果你有一些C++的設計經驗,當你試著去看Java程式碼時,有時你會想,倘若是C++的話,肯定會有更簡潔的寫法。甚至你會覺得,Java的寫法看起來笨多了!

不過,如果你觀察Java的開發團隊,在施行相同程式撰寫標準及命名慣例的情況下,團隊成員很容易寫出十分類似的程式碼,有些時候,你甚至分不清楚某一段程式碼究竟是誰寫的了。

這當然是簡約語言的一個特色,正如孟岩所說的「清晰直接」,想達成同一個目的,沒有太多的可能性,撰寫方法多半接近。相反的,若是魔幻語言一派的程式語言,想達成同一個目的,可能就有數不盡的方法,不同個性、背景的程式設計者,就有可能寫出截然不同的程式碼。而且,高手所寫下的程式碼往往可以達到匪夷所思的境界,讓讀者讀了都忍不住讚嘆其中的巧妙。但也因此,這樣的程式碼往往個人風格過於強烈,而且,有時候衍生出過於取巧的寫法,也會影響到程式碼的可讀性。

為什麼核心程式庫要標準化?
不過,在繼續比較「魔幻語言」以及「簡約語言」之前,讓我們回頭先看看生產力的問題。

Java除了試著削除一些容易造成程式設計者犯錯的語言功能及特色,來提升生產力之外,內建的標準核心程式庫也是另一個得以大幅提升生產力的關鍵因素。Java標準的核心程式庫涵蓋了廣泛的應用範圍,從字串、I/O處理、網路連線、XML處理、容器、多執行緒、資料庫、……等等,都有標準的程式庫,可供程式設計者運用。

而且,Java核心程式庫的存在,其實有兩個很重大的意義。

首先,這些程式庫都是官方所提供的,所以,程式設計者毋需自行重新開發,也毋需仰賴第三方來開發。一方面可以省力,二方面這些程式庫都是在標準的規範之下,因此有著很高的流通性,所有的Java程式設計者,幾乎都立足在相同的標準程式庫之上進行開發。

第二個重大的意義是,這些程式庫也的確都是經過厲害的設計者加持,多半設計得不差(當然若做比較,也是有好有壞),也都具備了不錯的重複使用性,這使得程式設計者利用它們,能夠加速解決特定應用裡的問題。

相較而言,C++就缺乏了上述的條件。許多早期的程式設計者都開發了自有的專屬程式庫,就是因為C++缺乏了標準化的程式庫。這使得各個開發者或開發團隊都必須自行開發。這麼一來,既花費力氣、又缺乏流通性,不同的團隊使用的程式庫都盡不相同。再來,各自開發的程式庫,在設計上不見得都能有很好的品質,也會影響到程式庫日後重複運用的能力。

這其實是一個頗為嚴重的問題,所以後來有了所謂的STL的問世,但STL所能解決的問題,又不像Java程式庫那樣的廣泛、多樣化,而且應用在不同平臺、編譯器上,還有一些林林總總的小問題。缺乏解決各式應用問題的標準程式庫,是C++應用在開發時,有時候會缺乏生產力的原因之一。

能坐擁豐富的第三方程式庫,也是提升生產力不可或缺的條件
在前文中提到,會影響生產力的因素包括了程式語言、程式庫、應用程式框架、你所做的設計、你所採用的開發工具、甚至開發方法及流程,也都深深影響開發時的生產力。

除了語言之外,程式庫和應用程式框架可以說是影響極其深遠。像Java的核心程式庫設計得不錯,而且夠標準化,甚至到了Android平臺上,一樣沿用了許多的Java核心程式庫。這同時也讓Java程式設計者要到Android平臺上開發,省去了重新適應另一套全新的程式庫的時間和力氣。

除了官方的標準程式庫之外,大量第三方所開發的程式庫,都讓Java的程式設計者從中得到豐富的生產力。像The Apache Jakarta Project下的一些程式庫,瞄準了各式的應用,在官方的標準程式庫之外,滿足了更進階、更廣泛的應用需求。這些程式庫當中,有些甚至被視為是「準官方」的程式庫,因為,採用這些程式庫的Java程式設計者實在太多了。

不論是官方或準官方的程式庫,都成了眾多Java程式設計者得以立足的巨人肩膀,讓Java程式設計者在生產力上,得以獲得強大的奧援。因為開發應用程式時所需的共通需求,有許多都可以透過運用這些程式庫來滿足,程式設計者更能夠將心力及開發時間,專注在自身的應用開發之上。

我們可以說,或許是因為Java先天語言體質的關係,以及來自於開放原始碼社群的蓬勃力量,營造出一個正向回饋的環境,使得這些為Java設計的程式庫的確能為Java程式設計者的開發生產力,起了正面的作用,提升了不少Java程式設計者的開發生產力。

影響開發生產力的因素,並不只是程式語言本身
這正是程式庫或應用程式框架,在軟體開發生產力上不可被忽視或低估的原因。從C++到Java,除了語言中做了一些變革試著提升生產力之外,無疑的,官方所制定的標準程式庫,以及後續基於這個基礎而陸續開花結果、大量來自於開放原始碼社群的優質程式庫,更是成了供給Java程式設計者高生產力養份的重要來源。

當我們談論某語言的開發生產力時,有時候我們把程式語言本身的因素,還有該語言下的程式庫或應用程式框架的因素,混在一起討論了。有些語言本身在生產力上的優勢並不多,但是憑藉著後天優秀的程式庫,也能彌補因為語言不足所產生的生產力落差。

在BCB(Borland C++ Builder,是一套程式開發工具)盛行的年代,同樣都是以C++語言為基礎,但是,由於搭配Borland所打造出來的程式庫及應用程式框架,同樣能提供給程式設計者優異的生產力,而這正是好的程式庫及應用程式框架之所以重要的原因。

 

專欄作者


熱門新聞

Advertisement