越來越“簡單”的Java

csdn發表於2015-05-20

  Java,20歲了。從我寫下第一行Java程式碼,迄今已有十餘年了,眼見Java——這個當年剛剛找到自己成長方向的懵懂少年,成長為如今當之無愧的業界王者。它已擁有世界上最龐大的開發者社群,以及無可匹敵的生態系統。這也意味著,選用Java做任何應用,都有著強有力的業界支撐,而無需擔心自己孤獨前行。

越來越“簡單”的Java

鄭曄

  崩坍的“標準”

  我剛成為Java程式設計師時,還是一個蠻荒年代,什麼東西都鼓勵自己動手豐衣足食,雖然開源的苗頭已有星火,但大多數企業的態度是,非我族類,其心必異。我依然記得自己的第一個正式Java程式是實現一個SMTP伺服器。

  我從SocketAPI一路寫了上來,先是實現了粗略的SMTP協議,然後,再實現我們的應用協議。雖然這種做法對於個人從下到上理解知識體系是有好處的,但每個人都從頭造輪子,對於工程開發而言,只是在浪費時間。

  那也是Java企業級開發大行其道的年代。背靠著Sun這棵大樹生長起來,這幾乎也意味著最初的Java就是Sun銷售伺服器的附贈品。而有能力為這些伺服器買單的幾乎都是些不差錢的大企業。Sun也瞅準了這些金主,大力地推動著“複雜”的企業級標準,著名的J2EE。在那個年代,寫Java程式不寫EJB,不談幾句分散式事務,你都不好意思說自己是做Java程式的。幾乎主流的聲音都在大談企業開發的複雜度,不斷擴充著想象的邊界,似乎每個Java程式設計師面對的都是世界上最複雜的問題。即便應用只是一個簡單的管理系統,或是僅僅做訊息轉發,我們需要的也一定是一個價格昂貴的應用伺服器,編寫只有部署到上面才能執行的EJB,因為這是官方推薦的做法,只有這麼做才正宗,只有這麼幹,才叫企業級。

  有一次出差在外,臨近下班,我發現了程式的一個Bug。實際上,我們的程式就是一個按照官方推薦做法編寫的EJB,只有部署到應用伺服器才能執行。我的除錯方案就是加上一些列印語句,然後部署到應用伺服器上,看輸出的結果,再加上另外一些語句,再部署,如此往復。那時我們用的是Sun的應用伺服器,只有用它的釋出工具將應用打包,然後把幾百兆的程式上傳到伺服器上,每一次上傳都要至少十幾分鍾。最終,我定位到了問題,只修改了一行程式碼,問題解決,但時間已經晚上九點多,三個多小時的時間多半都在等待部署中浪費。

  我不認為我所喜歡的軟體開發應該是無意義的消耗,一定是哪裡出了錯。周邊的人給不了我答案,我只有到網上搜尋,於是,我知道了敏捷、知道了開源、知道了軟體設計,也知道了世界上有一堆Java程式設計師對官方說法的不滿。那段時間,我瘋狂補習著各種各樣的軟體開發知識,我越發覺得“簡單”開發才應該是軟體開發的本來面目。

  那段時間恰逢軟體開發理念變革的年代,SpringFramework、Hibernate等如今還在影響Java程式設計師的框架剛剛發軔,企業級開發“WithoutEJB”理念初出茅廬。倍受J2EE開發模式折磨的程式設計師大量地討論著各種方法的優劣。那時,我也開始帶隊做專案,於是,我便笨拙地踐行著這些新理念。我用的第一個SpringFramework的版本是0.8,我開始用設計去隔離資料庫訪問,嘗試把EJB踢出我的專案,努力在本地完成所有的開發測試,儘量少用應用伺服器。如今想來,還真要感謝我當年的專案經理,那麼信任我,讓我放手摺騰。

  幸運的是,沒過多長時間,大多數Java程式設計師跟上了先行者的步伐,於是,我們看到更多的人擁抱開源理念,探索敏捷,SSH(Spring、Struts和Hibernate)成了業界的主流。所謂官方標準已經失去了公信力,加之像JBoss、Tomcat這樣的開源伺服器的興起,那些靠賣應用伺服器當年大賺的廠商開始凋零,擁有WebLogic的BEA早早投靠了Oracle,IBM的WebSphere已成明日黃花,最可惜的是最官方的Sun,生了Java,卻掙不到Java的錢,現在也成了Oracle的一部分。

  “簡單”的前行

  一段大戲塵埃落定,歷史車輪卻不曾停下。今天的Java之所以是今天的模樣,因為更多的新思潮仍在不斷衝擊。

  隨著網際網路的興起,Web開發成了業界開發的主流。原本Java程式設計師的日子是相當不錯的,開發標準的逐漸建立,各種開發框架也日漸完善,各種工具也逐漸豐富。但這時候,一個Rails的框架橫空出世,所有人都見識瞭如何在十五分鐘內編寫一個Blog。而十五分鐘都不夠Java程式設計師寫好XML配置檔案。新思潮的到來,讓Java程式設計師開始重新認識Java開發。我們確實已經從J2EE的笨重走了出來。但有了新的對比目標,Java開發依然是前路漫漫。Java程式設計師們繼續不斷努力探索,研究如何用好Java5帶給我們的語法轉變,研究怎樣用Java實現一些動態語言的效果,研究提升Java程式的表達性。今天,我們有了更多的選擇,甚至在很多方面已經徹底與XML說再見了。選擇一個程式庫,功能的實現只是其中一部分原因,而表達性也成了重要的參考因素。

  當開發Web的人越來越多,有人突然站出來說,你們做得不對,這個人就是HTTP協議的設計者之一RoyFielding。後來的事,我們都知道了,RESTful架構開始興起。與之相隨的是,當年那個叫Ajax的技術被越來越多的人實現網頁的動態效果。人們發現,Ajax和RESTful服務簡直是天作之合。後臺提供服務,前臺提供展現,一個新興職業隨之興起,它叫前端程式設計師。對那些Java程式設計師來說,這也是美事一樁,我們再也不必用Freemarker、Velocity或是JSP編寫那些四不像的HTML了,大家都可以集中精力做好自己最擅長的事情了。這種結合的另外一個妙處是,開發人員越來越多地使用JSON作為前後端通訊協議的承載,而被拋在歷史故紙堆的方式叫做WebService,又是一個大公司推進的以XML做基礎的東西。要知道傳送Ajax請求的基礎物件可是叫做“XMLHttpRequest”,影響之大可見一斑。

  多核的興起讓程式設計師們紛紛探索起怎麼編寫並行程式碼,研究來研究去,大家發現許多好的程式設計理念都來自一個叫函數語言程式設計的程式設計正規化。這個曾被務實的程式設計師束之高閣的東西又被人重拾起來。越研究,就越覺得函數語言程式設計是個好東西,可惜Java沒有提供函數語言程式設計的原生支援。於是,人們一邊喊著在Java語言裡新增支援,一邊自己動手模擬函數語言程式設計,借鑑函數語言程式設計理念。這兩件事後來都有了結果,我們今天有了Java8的Lambda,對於使用之前版本的Java的人來說,Guava也可以讓人部分享受函數語言程式設計的樂趣。雖然不是完整的函數語言程式設計支援,但對於大多數習慣使用傳統Java的人來說,這些支援已經可以讓Java比從前優雅一些了。

  當年採訪C++之父BjarneStroustrup,如何看待Java的簡潔,他的回答是,時間不夠長。大師之見果然長遠。與我初涉Java時相比,今天的Java可以說已經有了天翻地覆的變化,而且,我相信,這樣的變化還將繼續下去,Java8的威力尚未完全發揮,Java9已經在路上了。令人欣慰的是,這種變化是讓開發越來越簡單,Java程式設計師的生活越來越輕鬆。

  作者簡介:鄭曄十多年工作經驗的程式設計師,Duke選擇獎獲獎作品Moco的創始人,前ThoughtWorks首席諮詢師,創業大潮新鮮人,目前投身於智慧硬體領域,致力於簡化智慧硬體的開發方式。他多次在各種媒體上發表文章,在各種技術大會上做過演講,分享自己對於軟體開發的理解,特別願意吸收新的知識,也願意與人暢聊軟體開發。

  微博:@dreamhead

相關文章