《高效程序員的45個習慣》作者:掌握多種語言是我的財富

jopen 9年前發布 | 18K 次閱讀 程序員

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

 《高效程序員的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 種不同語言幫助他們。我無法想象如果不會這些語言,我將如何指導這家公司。

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

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

                <span id="shareA4" class="fl">                         </span>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!