越來越“簡單”的Java
鄭曄
Java,20 歲了。從我寫下第一行 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 個人主頁頁: http://dreamhead.blogbus.com/