文章里的視頻看不了,但是下面有采訪的翻譯,還不錯。如下:
這里是位于QCon(InfoQ和JAOO組織的技術大會)的Floyd Marinescu和Guillaume Laforge。Guillaume,可以向我們做一個簡短的自我介紹嗎?
我叫Guillaume Laforge,Groovy團隊的項目經理,同時也是JSR 241規范的領導者,JSR 241規范制定了Groovy編程語言的標準。在我的職業生涯里,我是OCTO科技公司的軟件架構師,OCTO科技是一家專注于軟件架構和敏捷方法學的咨詢公司,這也是我為什么樂意參加由InfoQ組織的QCon會議的原因。
Guillaume,是你拯救了Groovy。
是的,幾年前Groovy項目一直停滯不前,毫無進展,我們需要有所措施。自從前任項目經理離開 Groovy去參與其它項目,我便接手了項目的領導。我嘗試吸引新的開發人員加入,以為項目和社區注入新的活力。我認為努力的結果是相當好的,因為在過去的一個月和過去的一年里,Groovy和Grails都發生了很多變化,而且在未來的時間里你可以看到更多的驚喜。
為什么對于Java來說Groovy是重要的?為什么你為Groovy項目投入了如此多的私人時間?
當初,在我加入Groovy項目之前的兩個月里,我一直在編寫一個應用程序,用戶通過它可以在界面中定制一些窗口小部件(widgets)。最初你只能通過Java來創建它們,并且使用時必須重新部署應用程序而不能在運行中動態地完成創建。這的確讓我非常厭煩,我想“如果Java中能提供腳本以支持動態創建就好了”。這時Groovy出現了,我看著它想道:“哦,這太有趣了,我要把它整合到我的Java應用程序中去”。我將業務邏輯、窗口小部件和一些配置項暴露(externalize)至Groovy程序中,然后通過XML傳回Java程序,并使用一些編程約束來配置應用程序或者做得更多。如果你在暴露業務邏輯,就可以進一步借助Groovy可塑的語法和動態特性創建自有的領域特定語言。
你認為Groovy最適合用在Java項目的那些地方?
我想到一個案例,美國有一家很大的保險公司,財富雜志評出的世界500強之一,曾經構建了一個非常龐大的保險應用軟件來處理健康保險以及其它保險的風險,其中用了大約45000行Groovy程序編寫所有的業務邏輯——所有執行動作的規則以及如何計算某個產品或者保險單的風險。公司里的業務專家們甚至也親手參與編寫了一些規則。能將業務邏輯從Java開發組編寫的代碼中提取出來是相當有意義的,這使得開發人員和業務專家可以一起協作。這相當有趣,也是一個很好的用例,它說明了你應該如何在Java中使用Groovy。我認為我們會看到越來越多類似的在Java 應用程序中使用腳本語言或者動態語言的例子。
Groovy在Java還有沒有其它好的用處?
你可以將Groovy用在很多領域,例如你可以用它做腳本任務(scripting tasks),就像在Linux上使用其它腳本語言那樣。有趣的是,你不僅可以像使用其它腳本語言那樣使用Groovy,而且可以使用所有能得到的 Java庫。假如你有一些處理特定業務的Java庫,現在想在Groovy中重用它們來解析一些文件或者來自遺留系統的東西,這可以輕松做到。你甚至還可以用Groovy構建一些小型應用的原型。
三個主要的用例是腳本任務,集成Groovy到Java應用程序中來外部化我前面提到的東西,還有編寫完整的(full blown)應用。我想到了另外一個例子:法國司法行政部在構建應用的時候用到了Groovy。這個應用包含一個UML模型——其中存放著法官、法庭和其它各種各樣的領域對象,都是通過UML設計得到的——提取為XML格式的XMI模型。通過使用Groovy模板和Groovy膠水(glue)程序,他們創建出了應用程序所需的所有內容,如JSP頁面、應用程序的流程(從哪個頁面跳轉到哪個頁面,從這個線程動作中輸出結果到哪個視圖)。最終的應用中沒有一行 Groovy代碼,但是他們借助Groovy加快了開發速度。
從哪些方面能夠明顯地看出Groovy正在被Java社區所采用?
Groovy得到了很好的使用,因為我們已經有了許多令人感興趣的Groovy商業用例。尤其當我們發布了1.0版本之后,我們得到了更多的使用者,訂閱我們郵件列表的用戶大概是以往的兩倍多,越來越多的下載量還有越來越多的人跑來咨詢問題。你可以看出這其中有很多新用戶,因為他們的問題差不多都是“我該怎么做(各種各樣的事情)?”。可以看到自從我們發布了1.0版本,我們取得了成功。而且如果你仔細觀察blog網絡社區(blogosphere),就會看到每天都有很多關于Groovy和Grails的文章,這有點兒瘋狂,不過確實發展顯著。甚至在類似于“你更喜歡哪種腳本語言?”的調查中,Groovy也通常都名列榜首。我為成功的來臨感到愉悅滿足。
為什么Java社區開始關注腳本語言了?
這非常有趣,因為腳本語言已經存在很長一段時間了,事實上那些語言過去一直是作為獨立的普通語言來使用的,并沒有和Java結合起來。現在有了很大的不同,因為在JVM上有很多可用的語言,所以你可以混合和協調不同的語言,分離不同的程序元素,使用更有表達力的方式定義規則。當然我們也可以看到,腳本語言倍受關注與Ruby和Ruby on Rails的成功有著重要關系。我不能確切地告訴你為什么腳本語言開始受到關注,但是我認為JVM之上的腳本語言的出現,還有圍繞在Ruby和其它明星腳本語言周圍的討論都起到了作用。
說到了Ruby,現在看來當Java開發人員想編寫腳本的時候,似乎有兩個流行的平臺可供選擇。那應該如何在Groovy和JRuby之間做出選擇呢?
對這個問題,我得出一個規律。如果你會使用 Java,那就選擇Groovy,因為它的語法與Java相似,而且還可以和Java平臺以及Java庫無縫集成。Groovy有著和Java相同的面向對象模型、相同的庫,還有相同的正則表達式。如果你選擇JRuby以便繼續停留在JVM上,那選擇JRuby之前最好你已經熟悉了Ruby。例如如果有些人精通Ruby,那他們可能直接會選擇JRuby。但是如果他們想與Java緊密集成,那么最好選擇Groovy,因為它與Java有完全相同的對象模型,這兩個不同的語言,不同的范式之間不存在阻抗不匹配(impedance mismatch)。所以我的原則就是:如果你了解Ruby,那么使用JRuby;如果你更喜歡類Java的語言,那就選擇Groovy。
你注意到Groovy使得DSL編程在Java中變得流行了嗎?
是的,我注意到了。因為Groovy所有的動態特性使得編寫類似“3.euros”、“48.dollars”或者“3.days.ago”的表達式變得很容易。你能夠編寫表達力非常強的東西;你能創建對專業領域、業務概念等進行建模的迷你語言(mini-languages)。雖然已經有了“IF”、“FOR”和“WHILE”循環等控制結構,只要你愿意,你還能創建屬于自己的控制結構,Groovy在這方面非常靈活。我認為,那些試圖將Ruby嵌入到應用程序業務規則中的人們,更趨向于用一種更簡單的語言來對專業領域進行建模,業務人員和開發人員共同分享包含了業務描述的隱喻,使協作更加容易。了解如何使用動態語言為建模和領域定義特定語言是相當讓人感興趣的。
動態語言的哪些特性使得它們比Java更適合定義DSL?
Java屬于靜態類型語言,使用Java你需要編譯器——在Groovy中也有一個編譯器——確實是這樣的,當你編譯Java代碼的時候,所有的東西都被編譯器硬連接(hard-wired)起來。所以你不可能輕易地攔截方法調用、屬性訪問或者重寫(overwrite )類似操作一樣的東西。這非常不靈活,即使你可以編寫一些連續接口(fluent interfaces)來使得Java代碼更易讀,你通常還會有一些樣板代碼(boilerplate technical code)[譯注:樣板代碼指的是在程序中重復出現的極其類似的代碼塊,這部分代碼往往與業務無關,而且又必不可少,不如異常處理、日志記錄、應用環境相關的數據傳遞和持久化等等。這些代碼往往編寫費勁而且可讀性差難以維護(例如異常處理代碼塊)。]影響可讀性,并且通常不會有業務人員站在你后面:“嗨,這個規則不應是這樣的,而應該是那樣”。然而從另一方面,使用動態語言,你可以捕獲方法加入方法攔截,給已存在的JDK類或者數值加入新的方法,就像我前面提到的例子那樣“3.dollars”就得到了一些錢。在Java中不可能這樣做——3僅僅是簡單類型,你不能在上面做文章來創建有用的東西。所以最終通過動態語言的元編程工具(這是Java中所沒有的),你完全可以發揮想象創建一個帶有新約束的語言。正因為它的強大功能,Java才會禁止這么做。
Groovy社區當今所面臨的最重要的問題是什么?
我認為目前影響Groovy普及的最大問題是缺少工具支持,尤其是IDE支持,因為Java開發者往往習慣于使用快捷鍵ctrl-space帶來的代碼自動完成(code completion)功能,而不必去查找JavaDoc或者APIs的相關文檔。2007年我們工作中很重要一個方面就是提供工具支持,而且我們已經擁有了一個較大的團隊從事Eclipse插件開發,在接下來的幾周或幾個月里,就可以使用具有Groovy代碼自動完成功能的Eclipse插件,使得 Eclipse中編寫Groovy代碼變得更加容易。
JetBrains的工作人員想在IntelliJ IDE中添加對Groovy的支持,他們為此已經跟我取得了聯系。正如大家所知,他們非常擅長為語言提供杰出的支持,比如JavaScript和 Ruby,我也確信他們能夠為Groovy提供很多令人驚奇的功能,比如代碼自動完成,甚至重構。有了IDE的強力支持,你可以混合和協調地使用Java 和Groovy而且包括重構功能。這確實是今年我們不得不關注的工作,并且已經有了顯著的進展,在年底之前我們應該會得到一些優良的工具支持。總之這絕對是我們需要繼續努力的主要方面。
你特別喜歡哪兩本計算機書籍?
《程序員修煉之道(Pragmatic Programmer)》是我特別喜歡的書籍之一——它確實是我喜歡閱讀的著作之一。實際上我還想到了另外兩本,一本是《Groovy實戰》,我是該書的合著者之一,自然對其有一點兒偏向,不過它的確是一本好書。如果你在尋找一本關于Groovy的參考書,想了解語言的所有內部工作方式、類庫以及編程工具,它就是一本非常棒的書。如果非要提及第三本,那就是由Graeme Rocher撰寫的討論Web框架Grails的《Grails權威指南》。