天天看點

HTML5崛起之時,Java桌面時代就已經終結了

作者|Steve Hannah

翻譯|核子可樂

編輯|燕珊

2004 年 Google Maps 的面世标志着 Java 桌面時代的終結,也改變了桌面環境下“跨平台”的基本定義。

本文作者以個人視角對 Java 桌面發展曆程做了回顧,内容來自他在上世紀九十年代後期擔任 Java 開發者時的所見所感,主要講述曾經的“殺手級”桌面語言 Java 是為何從 21 世紀開始頹勢盡顯、步入衰落的。值得一提的是,作者如今在做一款開發者友好型 Java 桌面部署工具(jDeploy),其實他還是希望 Java 可以重拾風采,再度變得對桌面開發具有吸引力。

本文是該回顧系列文章中的第二篇,在上期文章中,作者回顧了 Java 制霸桌面的鴻圖如何在 1999 至 2005 的短短幾年間煙消雲散。當初的 Java 可謂志得意滿、憑 Applet 小程式技驚四座,下決心要在網際網路時代下重新定義“桌面”。網際網路的未來在于“跨平台”,而 Java 的血管中湧動的正是“跨平台”的血液,優勢在握!可遺憾的是,事後來看,此跨平台似乎并非彼跨平台。接下來,讓我們繼續跟着作者的腳步去看看,具體在 2004 至 2007 年間,Java 桌面又經曆了什麼。

桌面王朝的最後時光

2002 年左右,我在客服中心為客戶提供計算機與列印機技術支援。我和小夥伴們擠在小小的隔間裡,面對着一款桌面程式。通過這款軟體,我們可以快速查詢客戶和産品資訊,并把通話中的重要資訊記錄進去。

在典型的客服來電中,我們會詢問客戶的産品序列号,再把結果輸入系統。如果他們之前就打過電話,系統就會輸出視窗,裡面包含産品的完整曆史記錄和之前的求助細節。在參考其他同僚留下的事由記錄後,我還能操作界面中的頁籤和功能按鈕,例如幫客戶更換新機。

我不記得這款軟體叫什麼名字了,可能是為公司或者客服中心專門定制的吧。印象裡這應該是 PeopleSoft(仁科公司,2005 年已被甲骨文收購)的産品,但我也不太确定。總之,這款桌面軟體運作在 Windows 2000 系統上,肯定不是 Web 應用程式。它其實挺複雜,裡面包含不少菜單和表單;不過一旦上手,整個使用體驗相當棒——速度快、反應靈敏,幾乎沒有任何延遲。以輸入電話号碼查詢客戶記錄為例,我們隻需要在“電話”字段裡輸入号碼,其餘空白表格就會立刻被客戶資訊填充完整。

據我所知,這款程式肯定不是用 Swing 編寫的。但如今全球各地無數公司都在使用由 Swing 編寫的企業級桌面軟體,它們在使用體驗上跟我當初接觸的這款程式非常相似。換句話說,Swing 已經滿足了我們在 2001、2002 年那會對于桌面業務軟體的全部期望和想象。

在工作半年之後,上邊來了新訓示,要求我們用 Web 應用程式替換掉之前的桌面軟體。據說新系統會讓我們的工作更輕松,但在第一節教育訓練課剛剛過去十分鐘後,我們就意識到這根本就是胡說八道:新系統簡直爛透了!

我不太記得當時使用的是 IE 5.5 還是 IE 6 了,總之就是前 AJAX 時代的 Web 環境。現在在産品字段中輸入序号後,系統會彈出一個視窗,上面寫着“正在加載……請勿關閉此視窗”。幾秒後,視窗自行消失,客戶詳細資訊出現在表單當中。反正每當需要從伺服器擷取内容時,這個倒黴視窗就會跳出來。上司還提醒我們别随便在浏覽器裡點“重新整理”,說是這樣會破壞系統狀态。于是每每出現問題,我就隻能先登出、再重新登入。

我不太了解公司為什麼要用這款“傻了吧唧”的 Web 應用程式替代之前的桌面軟體。可能是出于成本考慮吧,畢竟跟桌面軟體相比,Web 應用程式的開發和維護成本都更低。或者是軟體供應商強行施壓,比如“Web 才是未來,每個人都必須接受!”但,真有這麼強勢的乙方嗎?

無論如何,這裡透露出一個重要的資訊:Web 應用程式還沒等發展完善,就已經開始蠶食桌面軟體的生存空間。唯一的問題就是 Web 應用需要多久才能追平桌面軟體的使用體驗。而事實證明,用不了多久。

恐怖谷效應

再回到 Java 這邊。熱情的支援者們正不斷擴大 Java 帝國的桌面版圖,對 WORA(一次編寫、随處運作)的熱情也引導他們最終邁向跨平台小程式與“本機”應用程式之間的秘密山谷。那時候的 Java IDE 主要面向三大建構目标:

1. 小程式

2. Java Web 開發

3. 可執行 Jar 檔案

是的,沒有直接開發本機應用程式的選項。雖然有第三方工具可以把 Jar 檔案轉換為本機應用程式,但這類工具相當複雜而且操作流程極為繁瑣。隻有對自己最“狠”的人才能堅持用得下去。而 Java 之是以有勇氣忽視這一點,靠的就是對未來的判斷——本機桌面應用程式終于被淘汰。其實這個預言是正确的,隻是在時間上有所偏差。

從 2022 年的角度回顧,Java 身上其實有很多顯而易見的問題。應用程式可以作為 Web 部署、也可以按本機部署,但這兩種形式都沒有一丁點“原生”感。Web 部署的小程式運作在自己的“沙箱”内并被內建到網頁當中,整個運作過程又慢又遲鈍。

HTML5 的崛起

雖然 Java 總想在 Web 和桌面之間建起一道橋梁,但它自身卻被 Web 所裹挾。到 2002 年,很多企業開始把原本的桌面軟體功能遷移到 Web 端。這些 Web 應用程式的建構、維護和部署成本确實比桌面軟體低得多,代價就是在使用者體驗上做出妥協。

大約也是在這個時候,Java 開始推崇“富網際網路應用”的概念,希望把好 Web 應用跟差 Web 應用區分開來。但到 2004 年 Google Maps 正式亮相時,Java 的小把戲徹底宣告破産。Google Maps 以令人震驚的效果為富 Web 應用程式樹立了标杆,而人家用的是 HTML5。

我最近又看了一次 Bill Atkinson 第一次向蘋果愛好者們展示 MacPaint 的舊視訊。在他第一次通過滑鼠用畫筆工具繪出圖案時,現場一片“哇哦”和掌聲。這就叫開創性。我第一次看到 Google Maps 也是類似的感覺,地圖可以無縫縮放、萬向平移,壓根看不出來任何拼接的痕迹。這裡使用的全新技術被稱為 AJAX(異步 JavaScript 與 XML),這也是人們第一次能夠在 Web 應用程式中向伺服器背景無縫送出請求。現在這一切當然被視為理所當然,可 2004 年那會,開發者需要絞盡腦汁才能把那些讓人想吐的架構或者彈窗隐藏起來,確定不用重新整理整個頁面就能從伺服器處加載新資料。

身為 Web 開發者,我當然對其中的無窮可能性心生向往。但從桌面開發的角度看,這場曆史性的變革似乎沒有給桌面、特别是 Java 帶來任何影響。

在 HTML5 之前,“跨平台”的意思是“跨 Windows、Mac 和 Linux”,是以跨的範圍還是在桌面範疇之内。當時我并沒意識到,但現在來看 HTML5 的亮相代表着新平台時代的降臨——它将成為用戶端應用程式的客觀标準;更重要的是,Java 支援不了這個平台。突然之間,WORA 理念就出現空白了——Swing 應用程式适用于一切平台,除了最重要的那個:網絡浏覽器。

Java 開發者紛紛“外逃”

那 Java 桌面開發者們都跑哪去了?方向主要有三:

1. 伺服器

2. 浏覽器(HTML5)

3. 桌面應用

如果大家對自己的基本定位首先是“Java 開發者”、其次是“用戶端開發者”,那最終應該會選擇 Java 在當下仍然占據主動的平台——伺服器。如果你對面向使用者開發(用戶端)更感興趣,而且主要看中 Java 的跨平台價值主張,那接下來的目标很可能是 HTML5 (Javascript/HTML/CSS)開發。如果你是鐵杆“保皇黨”(比如說我),那就繼續堅守 Java 桌面開發,同時滿腹狐疑地看着自己這個圈子越來越小。

GWT:讓 Java 走進浏覽器

2000 年初,JavaScript 開發工具尚處于起步階段。大多數 Web 開發者隻能使用文本編輯器來編寫.js 檔案。簡單的驗證腳本和互動設計倒是沒問題,但這種粗糙的方法肯定不能擴充并支援大型企業應用程式項目。另外,當時的 JavaScript 語言還不具備開發者在重構等重要操作時所需要的功能,例如靜态類型。

相比之下,Java 已經擁有一套全面的開發工具,能夠輕松擴充至任何規模的項目。到 2004 年,領先且成熟的 Java IDE 已經成為開發環境中的标杆,其中的靜态類型更是大大簡化了大型項目的維護難度。到這時,唯一的遺憾就是 Java 應用程式無法在網絡浏覽器中運作(隻有小程式可以)。

為了解決這個難題,Google 打造出 GWT(Google Web Toolkit)。這是一套 Java 到 JavaScript 的編譯器加運作時庫,允許開發者借助 Java 那一整套領先的開發工具編寫應用程式,再把成果部署成 JavaScript 應用的形式在浏覽器内原生運作。這套運作時庫包含諸多核心 Java API(例如 java.lang、java.util 等)的實作,確定業務邏輯能夠在 GWT 應用程式與伺服器應用程式間順暢共享。

在使用者界面方面,GWT 也提供自己的功能部件,其實質就是以 Java 的形式将各部件與浏覽器中的本機 HTML 部件相綁定。雖然我們還是沒法直接使用 Swing 代碼、大部分第三方庫也不在支援之列,但我們至少可以用到自己最熟悉的 Java 開發環境和核心 API。

是以這不能算是讓 Java 真正走進了浏覽器——标準 JavaSE 庫仍然大部分不受支援,線程等核心功能也無法起效。但至少對多數用例來說,這已經夠了。

Google 用 GWT 開發出很多流行一時的 HTML5 應用程式,其中最著名的就是 Gmail,這個項目還催生出一個規模不大、但卻相當活躍的開源社群。雖然影響力已經今非昔比,但這個社群直到現在也仍然存在。與此同時,JavaScript 工具的逐漸改進也在擠占 GWT 的生存空間,過去十年來誕生的一系列更為現代的解決方案也允許我們在浏覽器中更“無腦”地使用 Java。

伺服器上的淘金熱

HTML5 的出現颠覆了 Java 制霸桌面的野心,但這裡也有好消息。由于不必分神于桌面端,Java 在伺服器端迎來了全面發展。Java 做好了戰鬥準備、努力滿足開發者對後端服務的種種新需求——畢竟沒有後端,再好的 Web 應用也出不來。

Java 在伺服器端的受歡迎程度在接下來幾年中持續增長,也吸引到整個生态系統的高度關注。第三方庫不斷湧現,而 2005 年 Maven 的誕生也讓第三方庫的使用不再複雜繁瑣。無需額外下載下傳、不必尋找依賴項,直接把片段粘貼到 pom 檔案中,它就能自動下載下傳一切相應依賴項。

Java 的開發工具也在不斷改進,這在很大程度上要歸功于 Java 在伺服器端的優勢地位。這些改進也對桌面開發者産生了積極影響,讓我們用上了跟伺服器端相同的 IDE、編譯器、虛拟機和庫。然而,代表 Java 世界“最後的堅持”的這幫桌面開發者眼界還是沒能打開,仍在圍着 UI 庫的改進和部署打轉。

遇到問題時,我的習慣是上 Google 搜一搜,看看有沒有其他人遇到或者已經解決過相同的問題。但在 Swing 開發上,我發現最新的搜尋結果也基本是 2005 年左右的内容了,之後基本再無新增。在找不到答案時,我偶爾會寫一篇問題分析博文。而在兩年後再次遇到類似問題時,我在 Google 上找到的就是自己兩年前那篇博文……說真的,現在還有喘氣的 Swing 開發者嗎?感覺真的說不好。

重新定義“桌面應用”

從各個方面來看,Web 的興起讓“桌面應用”的概念清晰了起來。Java 最初的跨平台用戶端開發願景并沒有把瘦用戶端(主要與遠端伺服器互動)跟本機完整桌面應用程式區分開來。這不僅提高了了解難度,更讓安全模型的設計有些無所适從。Java 了解中的“平台”就是計算機本身,是以會使用笨拙的沙箱來限制可能引發安全威脅的 API 通路,例如通路檔案系統。這是 Java 一切安全漏洞的根源,也是導緻 Java 被逐出浏覽器世界的原因。

這種基于“沙箱”的開發體驗相當糟糕,因為我們很容易意外“越界”并觸發安全異常。最終結果是,幾乎所有用戶端都會請求對系統進行“可信”通路,這樣也就完全繞過了沙箱的限制。

相比之下,HTML5 在 Web 和桌面之間設立了明确的邊界。Web 應用程式預設無權通路用戶端計算機,而浏覽器才是那個“平台”,這就讓用戶端應用程式的安全保障變得更輕松、更易行。

經過此番變革,“桌面”的範疇變得更小,以往很多被視為“桌面應用程式”的軟體現在被劃入“用戶端應用程式”類别。具體來講,如果應用程式隻負責在使用者與伺服器互動時提供 UI,那它就屬于用戶端應用程式。“桌面”這個概念現在指的就是那些以某種方式與本機裝置相內建的應用程式,包括通路檔案系統(開發工具、檔案轉換工具等)、調用浏覽器中不存在的某些平台本機 API、以及執行算力密集型任務的軟體。

這倒不是說“用戶端”應用程式跟“桌面”應用程式間就毫無交集——當然有,這兩者都涉及 GUI,而且不少現代桌面應用程式也都需要接入伺服器。是以無論是桌面還是用戶端應用程式,都能享受到 GUI 工具包改進、媒體(音頻 / 視訊)及網絡等技術層面的改進成果。

Java 桌面的新征程

2004 年,我曾在 Mac 和 Windows 上都開發出一些商用級别的 Java 桌面應用程式。HTML5 對這類應用程式基本沒有任何直接影響。結合自身需求,Swing 還是完全夠用,我用來建構本機捆綁包的各種桌面部署工具也都能正常起效。

但很遺憾,科技行業就是個不進則退的世界。在接下來的幾年中,Web 平台一路突飛猛進、而 Swing 卻始終停滞不前。到 2007 年,Swing 已經到了不變革、就消亡的危難關頭。它需要響應 HTML5 這波曆史性潮流,而最終答案就是 JavaFX。這是一種新奇的 Java UI 工具包,能夠把 Java 帶入 GPU 加速、場景圖、3D 圖形、Web 視圖的現代新世界,同時支援 MP3 和 MP4 等現代音視訊編解碼器。

在下一篇文章中,我們将回顧 JavaFX 的火爆人氣、深遠影響,以及 2011 年 Mac 應用商店出現前 Java 領域的其他發展趨勢。别小瞧 Mac 應用商店,它的出現堪稱對 Java for Mac 桌面開發生态的“斬首行動”。

(感興趣的朋友可以多留言,InfoQ 将根據大家的需求繼續翻譯系列文章,以飨讀者)

https://jdeploy.substack.com/p/the-decline-and-fall-of-java-on-the-970

繼續閱讀