用 Clojure 改善 Java 項目是種什麼樣的體驗?

關於軟件開發,特別是服務端軟件開發的技術棧的探索,幾乎貫穿了我整個職業生涯。幾年前我就想寫這樣一個專題,但是開了個頭就又很快擱筆。反覆思考,感覺自己仍然太過淺薄。近幾年隨着技術領域的整體進步,和自己的學習積累,感覺現在是個比較合適的時機,建立一個圍繞 Java 體系的工程技術棧,將它整理成文字,與大家分享。

一方面,Java8 之後,語言的進步,使它在生產力上與舊版本已有很大提高。雖然 Java 與新時代的編程語言相比,仍顯得比較笨拙,但是做爲一個技術體系的基礎,已經足夠可用。另一方面,基於 JVM 環境的編程語言的發展,使得 JVM 可以成爲一個通用的運行時環境,在其上利用若干互補的編程語言構建工程。

JVM 平臺上最著名的新貴莫過於 Scala,特別是 Spark 的興起爲 Scala 爭取了很多愛好者。但是就我親身體驗而言,Scala 也有一些問題:

  • 首先是 Scala 本身是一門複雜語言,要用好這門語言,需要大量的領域知識。當然將其作爲一個“更好的 Java ”來用,未嘗不是一件好事,這也是我向普通用戶推薦的用法。要發揮 Scala 的全部優勢,需要一個優秀的團隊,成員有對代碼風格和質量的追求和共識,願意爲駕馭工具,提高生產力,付出精力;

  • 其次 Scala 的構建工具 sbt 實在不能說令人滿意;

  • 另外就是,Scala 實在跟 Java “太像”了,它是一個自成一體的複雜體系,如果用 Scala,很難劃清一個邊界,找到其它語言的切入點。這倒不能說是 Scala 的缺點,更準確的說,其它技術需要 Scala 的多,Scala需要其它技術的少。

**我嘗試了 Java+Clojure 的體系,發現是一個非常好的組合。**Java 是靜態編譯型語言,Clojure 是動態類型,雖然它本質上仍然是編譯型的,但是可以在 Repl 中方便的交互,也可以以腳本形式運行。兩者可以在工程上建立非常清晰的功能邊界,各司其職。

Clojure 的構建工具 Leiningen 是 Maven 的高級封裝,可以充分利用 Clojure 的語法和 Maven 的資源。Clojure 的語言風格和內置庫,都強調了與 Java 的互通,而 S 表達式內在的數據抽象能力,以及大量依賴 Clojure 語法的功能支持,可以將 Java 項目變得更敏捷和乾淨。在 Java 項目中引入 Clojure ,可以有效地提高生產力。

或許 Java 語言層面的笨拙,本身也促進了其工具庫和框架的蓬勃發展,現代 Java 生態中,負責組建項目架構的 Spring / Guice,提供並行 / 併發抽象的 Java Concurrent 和 Akka、Clojure.core.async 、提供數據庫訪問的 Hibernate 等,都是很好的作品。在具體的項目中,找到一個互補的工具集很有意義。

一個複雜工程,往往不是單一架構和技術棧能夠覆蓋的,技術組合能夠互補就很重要了。例如異步框架中 Vert.x 曾經是我期待很高的一環,它爲多種語言提供了 SDK ,包括 Java、Scala、Node.js 等。但是實踐中這個東西完全無法讓人滿意,在高性能壓力下,出現大量無法管理的錯誤。更重要的是它非常的排外,一旦在項目中使用 Vert.x,就要整個在編程風格上遵循它的需要,大量的回調並沒有節省開發人員的思考時間,相反還要削足適履,不斷思考自己的代碼邏輯是否會阻塞框架。而它的異步安全,依賴全局的單一 Vertical 對象,在原生支持多核並行的 JVM 環境下,強制開發人員依賴 GIL,是一個非常愚蠢的退步。

相反,我在嘗試 Akka 的過程中,體驗非常好,Akka 不會強制用戶在一個單一的 Materializer 下運行邏輯,跨節點擴展非常容易,而進程內的 Actor 運行負擔也非常小,接入 Akka 的過程很友善,並不會污染 Actor 之外的代碼風格,在 Spring MVC 中使用 Akka 也不會有任何問題,我還嘗試在 Google Cloud 的 App Engine 實例(war環境)中用 Akka 管理爬蟲邏輯,整個過程沒有任何問題。這也印證了前面所說的“其它 JVM 技術需要 Scala ”的場景。感謝 Akka 提供了完整的 Java DSL,雖然它只能用在 JVM 項目中,但是對於服務端開發並不是很大問題。我編寫了很多在 Clojure / Java 中使用 Akka 的代碼,組合使用了各種各樣的框架和庫,都沒有遇到風格上的衝突。更多幹貨,我將在今年舉辦的 QCon 全球軟件開發大會廣州站上,爲大家詳述。

作者簡介:

劉鑫,從事軟件開發工作近 20 年。曾在火幣網的錢包組和撮合引擎組擔任技術專家。是 Python 中文社區的早期成員,維護了 2.x 時代的 Python Tutorial 中文版翻譯。近年的關注點在 Java + Clojure 的技術組合,以及研發團隊的工程化管理等方面。

5 月 25-28 日,QCon 全球軟件開發大會廣州站將邀請劉鑫老師作爲「編程語言」專題的講師,現場分享實戰經驗。還有來自 BAT、京東、滴滴、網易等實踐專家,圍繞微服務、大前端、人工智能、高可用高性能架構、DevOps…帶來 TOP 70+最佳實戰案例分享。最後附上 8 折報名福利,立減 1360 元,諮詢可致電魚丸:13269078023(微信同號)。更多詳情可戳:http://t.cn/EIl5B0h

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章