《高效程式設計師的45個習慣》作者:掌握多種語言是我的財富

ituring發表於2014-12-24

  Venkat Subramaniam 博士是Agile Developer公司創始人,Jolt圖書大獎獲獎作者,現在休斯敦大學計算機系兼職任教。作為敏捷開發方面的權威人士,他培訓並指導了美國、加拿大、印度和歐洲多國的上千名軟體開發人員,並多次在各種大會上發表演講。Venkat是一位多產的技術作家,他著有《Groovy程式設計》《Scala程式設計:Java虛擬機器多核程式設計實戰》,以及Jolt大獎獲獎圖書《高效程式設計師的45個習慣:敏捷開發修煉之道》

  問:在《高效程式設計師的45個習慣》中,你告訴了我們很多絕妙的技巧。你是從哪裡得到這些想法的?

  大多數是通過對於軟體專案觀察和批判思考得來的。長年以來,通過在商業軟體專案上的工作經驗,我們觀察到了哪些做法是有效的,而哪些做法並不管用。我們真心誠意地想要分享所學到的知識,這就是這本書的寫作動機。書中的想法來源自個人經歷、觀察、思考,以及討論核心問題及其解決方案。當我們回想這些專案的時候,通過我們倆人(Andy Hunt與Venkat Subramaniam)的個人經歷,以及諮詢物件的意見,一些最為基礎的實踐浮現了出來。我們意識到這些實踐可以幫助到在軟體開發道路上追求精益求精的人。

  問:Java的特性越來越像Scala和Groovy,考慮到Java在效能方面的優勢,Scala和Groovy的地位是否會有所動搖?這三種語言在未來會是什麼樣?

  Java正在向函數語言程式設計看齊;這種思想在很多語言中都已經存在很久了,比如 LISP,Erlang,以及Haskell。對於這門被很多人稱為“世界上最受歡迎”的語言來說,這是正確的方向。但是我並不認為這對於任何其他語言是一種威脅。以前,和Java相比有些語言可以多做n件事。現在,我們仍然可以多做或用不同方式來完成n-1件事。

  如果真要發生的話,Java的進化只會讓其他這些JVM語言變得更強大。Java對於lambdas,streams以及invokedynamic的支援提升了這個生態系統,使其更加支援函數語言程式設計風格。JVM的其他語言可以從中獲益。那些因為程式設計風格而不願意接觸Scala或Groovy的程式設計師很快就會在Java中喜歡上這種風格。隨著Java在正確的道路上不斷前進,差距就變小了。這對於其他語言來說是好事,對於JVM程式設計師來說是好上加好。

  問:Groovy之父James Strachan曾經說過Scala會取代Java,你同意這種說法嗎?相對於Scala而言,Groovy有什麼獨特的優勢嗎?

  如果真要發生的話,那最好的時機就是在幾年以後。但是看起來語言的應用應該會是分散的。當Java還在充當排頭兵的時候,應該還有其他幾種語言也應用在生產環境中。很難相信會有某種語言完全取代Java,在5年內肯定不會發生。但是十年後呢?真希望我有這種預測能力。

  語言吸引著我。Scala很好玩,Groovy也很有趣。Groovy的真正魅力在於它的超程式設計能力以及輕易和Java整合的能力。Groovy在大多數地方保留了Java的語義,並增加了流暢性。但是Groovy的制勝法寶是利用執行時間和編譯時間的超程式設計進化程式,這也讓Gradle和Grails這樣的工具有了用武之地。

  問:什麼樣的專案最適合應用Groovy?

  幾乎所有需要Java的專案都可以用Groovy。幾年前,大部分人對Groovy還有效能方面的憂慮,但是隨著靜態編譯的出現,這種憂慮已經很大程度消失了。

  Groovy對於各種各樣的專案都適用,從小程式到企業級應用。

  對於還不太熟悉Groovy的人來說,可以選擇從Spock開始,這是一個用Groovy超程式設計寫的很不錯的自動測試工具。一旦我們習慣了Groovy,就可以繼續用Groovy完成自動化任務了,比如傳送大部分郵件,執行背景任務,處理XML檔案、字串以及檔案處理等等。

  任何可以在Java裡面做的事,我們都可以用更少的程式碼在Groovy更流暢地完成。接下來我們可以去建立web應用,在這裡,我們還可以利用Groovy的超程式設計用程式碼合成行為,而不需要為不同型別的物件寫多餘的程式碼。

  我自己已經為很多大公司採用Groovy和Grails進行過諮詢和培訓,他們都在生產力上有所提升,也能更輕鬆地開發和部署了。

  問:Groovy已經可以在Android上使用了,有人預測一旦程式設計師們嘗試過Groovy,就會拋棄Java。Groovy在Android上執行地如何?它會是革命性的嗎?

  我已經用Groovy和其他JVM語言完成了很多工作,在裝置上說,我大多數時候都在為iPhone開發。我在Android上的經驗仍然有限,所以無法更好地回答這個問題。

  問:Scala是一種能力很強的語言,但是很多開發者也說它是宇宙中最難的語言。有很多對這門語言感興趣的程式設計師,對於他們你有什麼建議嗎?

  我經常開玩笑說Scala就像一座城市,你應該知道哪個部分是可以拜訪的,而哪個部分是應該避開的。話雖如此,如果我們只熟悉一門語言,那麼學習一門完全不同的新語言通常都是很困難的。

  我們不需要學會關於Scala的一切或者學習Scala的所有部分才能有效地使用它。如果發現Scala的某些領域比其他部分更難學,那麼我們可以從那些不太嚇人的地方開始。從語法上說,Scala可以用很多不同的方法來完成同一件事。我們可以從最熟悉的地方開始,然後逐漸熟悉整個語言,我們可以探索用不同的方式來完成相同的動作。如果語法變得讓人迷惑,我們可以後退,給變數更有表現力的名字,避免一開始看起來就很神祕的運算子。

  要想學習這門語言有很多可用的資源。比起讀書,花時間寫程式碼更加重要。只有寫更多程式碼,我們才能更好地掌握語言。所以,把恐懼放到一邊,讓實踐和激情指引我們吧。

  問:你覺得讓團隊所有成員都接受一套語言和工具有必要嗎?為什麼?

  有兩類團隊。一類是特定人在特定領域工作,其中某一個開發者會對特定部分的程式碼負責。另外還有一種團隊,他們集體對程式碼負責,任何願意和有能力修改程式碼的人都可以這麼做。我是集體負責制和合作開發的倡導者。這樣做可以降低很多方面的風險,比如降低單點失敗的可能性。

  在團隊中存在大多數人無法理解的程式碼已經是一個很大的風險了。我們不想再加上大多數成員無法理解的語言和工具。另外,對於實踐集體負責制的團隊,擁有整個團隊都能維護的語言以及共同的開發環境,是合作工作方式能夠成功的唯一方法。

  問:通過scriptEngine,Java呼叫Groovy的程式碼的方式效能比較差,Groovy和Java配合有什麼更好的方式?

  Groovy身上的一大好處就是用來編譯的-j選項。通過這個選項,Groovy的編譯器groovyc會讓Java編譯器來編譯.java檔案,讓groovyc編譯器來編譯.groovy檔案。一旦這些檔案由不同編譯器編譯,其最終結果就都是位元組碼。一旦我們把程式碼都編譯成位元組程式碼,不同語言寫出的程式碼就沒什麼實際上的區別了。只要在類路徑中還有必要的jar檔案就沒問題。所以其實沒什麼必要利用scriptEngine把Java程式碼調入到Groovy程式碼中。

  問:對於你來說學習新語言和新工具意味著什麼?最大的獎賞是什麼?

  我可以毫無壓力地用十幾種語言程式設計。學習前幾門語言確實很難,後面的那些就容易多了。其背後的原因我認為在於一點一滴積累式的學習。我們並不善於一口氣學習很多新概念。我們漸進式學習,每次知識的體量都很小。

  我堅定地相信學習一門新語言的難度和我們所熟悉掌握的語言數量成反比例。如果僅僅熟知一門語言,那麼要學習和第一門語言截然不同的第二種語言就會花很多時間。另一方面,如果我們花時間研究不同的正規化和呈現方式,思維就會迅速比對新語言中的特性。有可能我們可以在熟悉的特性中找到類似的。但是如果我們只知道一種正規化或呈現方式,那麼這個可能性就很低,所以學習起來就很費勁。

  十幾年前,我用Basic和C程式設計。然後我又用C++, Java,以及C#程式設計。Ruby對我來說是一個很大的改變,學習起來有些困難。我用Ruby程式設計了幾年之後,再學習Groovy就變得很簡單。隨後我又開始對Erlang感興趣。這也是一次大改變。但是在我用Erlang程式設計的幾年之後,學習Scala變得非常容易,因為它們的角色模型、功能型別等方面都很相似。

  在我看來學習語言和工具的收穫是很大的:

  首先,這讓我擁有一個很大的客戶基礎。最近我幫助了一家大公司適應了關鍵性敏捷技術實踐,比如測試驅動開發以及有效模仿。作為一家國際化的大公司,他們擁有不同語言寫成的應用。我需要在不同地點使用8種不同語言幫助他們。我無法想象如果不會這些語言,我將如何指導這家公司。

  另外,由於接觸了各種不同的語言,對於我來說學習新語言的時間成本已經變得很低。

  我在教授軟體設計和程式語言課程的時候,我給學生百分百的自由來挑選自己想學的語言。對於我來說解釋概念是很容易的,比如設計模式,我可以用他們熟知的語言舉例子。作為一位訓練者,我在這方面也受益匪淺,掌握多種程式語言的感覺就想像用不同的自然語言進行交流一樣。

相關文章