譯註:本文來自straight_talking_java@yahoogroups.com討論群組,已經是一 年多前的文章。Alan Williamson是Java Developers Journal的編輯,下文來自 他在IBM的一個訊息來源。SWT和Swing的論爭我見過不少,Netbeans和Eclipse的 也同樣多。譯者翻譯此文並不是要激起什麼爭執,也不是支援哪一方(雖然我的 確是站在SWT一邊的),更不是要攻擊Amy。我最重要的理由是,這是一篇有趣的 文章。裡面有內幕、線人、公司政治、壟斷巨頭、美女、商界風雲……足夠拍一 齣電影。有趣,這就夠了。不過此文反映了IBM對Swing的看法和SWT的由來,還 是有一點營養的。
要想弄清楚為什麼一切都被弄得如此混亂,要從幾年前只存在AWT的時候說起 。SUN當時已經建立了一套基本的可移植控制項類,這些類映射到不同作業系統上 的原生視窗組件(native widget),顯然下一步應該繼續增強這套模型,除了 初始的CUA 92組件(文字、按鈕等等),再繼續加上表格、樹、記事本、滑塊等 等……當時的AWT還滿是漏洞,遠不能稱為可靠,還需要SUN的coder們去修補。 SUN的developer們如Graham和Otto總是習慣於公開把他們的bug歸咎為作業系統 的差異,比如“Windows和OS/2的焦點次序不同”或者“在……之間Ctrl-X的行 為不一樣”,以及其他蒼白的託辭,好讓批評的火力從SUN太早釋出代碼這個問 題的真相上移開。然後Amy Fowler來到了SUN。不是我大男子主義,Amy是個聰明 的美女,大多數獃頭獃腦只懂技術的開發人員都要被她捏在手裡。Amy來自一家 Smalltalk公司,叫做Objectshare,在那裡她負責搞UI類庫。
跟Java相比Smalltalk的曆史有些悲慘,曾幾何時有3家龐大的Smalltalk公司 ——IBM、Parc-Place和Digitalk。在90年代初期3家公司的市場份額大致相等, 生活是美好的。Parc-Place採用仿視窗組件(emulated widgets)的設計(即 Swing的設計),IBM和Digitalk則採用原生視窗組件(native widgets)。後來 IBM壓倒了另外兩家,因此他們打算合并成一家,假設叫做Parc-Place Digitalk 。隨後當他們試圖將他們的產品融合到一個叫做Jigsaw的計劃中時爆發了一場大 戰,計劃由於政治原因失敗了(開發人員實際上已經能讓它運轉起來),就因為 原生和仿造兩派的死戰。
Amy贏得了精神上的勝利,不過在IBM我們贏得了他們所有的生意,因為這兩家公司在一整年裡除了吵架什麼都沒做。當塵埃落定之後PPD(Parc-Place Digitalk當時已改名為Objectshare,跟Windscale改名為Sellafield的原因相同 ——讓人們淡忘之前發生的災難)的股票價格從60美元掉到了低於1美元1股。他 們因為偽報收入被NASDAQ摘牌,從此消失。此時SUN正走上與PPD類似的技術方向 ,於是PDD的技術人員都把他們的簡曆投到了SUN。Amy被僱傭了,她承諾通過輕 量級方案解決所有視窗組件的問題,因此說服SUN管理層讓她當了GUI開發部門的 頭頭。她是拿著“這裡原來的人都搞砸了,我是來解決的”的鑰匙進來的。隨後 Amy僱傭了所有她過去在Parc-Place的舊朋友,讓他們來開發Swing。
顯然Swing應該做的是僅僅成為一個繪製架構,給那些希望建立地圖軟體或者 繪圖軟體的人們使用,無論如何,應該圍繞AWT類庫來建造它,按鈕之類的東西 仍然交給AWT來管。SUN的人比如Philip和Mark已經讓AWT能夠處理表格、樹和記 事本(notebook,?),所以Swing的方嚮應該說很明顯了。但那些毀了PDD的人 不幹,他們非要把一切都弄成輕量級的。由於SUN管理層的無知,再加上Amy無情 的政治手段,造成了我們今天所見的混亂局面。Amy還使SUN相信Swing是作為 Mozilla項目的一部分與Netscape聯合開發的,事實上這隻是她的宣傳伎倆。
在IBM,我們從第一天起就憎惡Swing。龐大、滿是錯誤,而且難看至極。原 先我們的工具如VisualAge for Java都是用Smalltalk(用的是原生視窗組件) 寫的,所以當我們將這些工具向Java程式碼程式庫遷移時,我們需要一套視窗組件。 IBM這邊的開發人員都是原來搞Smalltalk的那一批人,我們對管理層要求用 Swing來構建WebSphere Studio工具都非常不情願。Swing是個可怕的充滿缺陷的 怪獸。
在WebSphere Studio最初的預覽中,當與Microsoft Visual Studio作對比演 示的時候,我們所有的客戶都討厭它,就因為它的外觀,而不管它的功能有多強 。大多數消費者都不會買一輛讓人覺得難看的車,哪怕這車有一台出色的引擎。 因此我們開始了一個項目,是把我們的Smalltalk原生視窗組件移植到Java上去 。這個項目是加拿大的Object Technology International小組做的。這個項目 獲得了成功,被運用在在我們發布的VisualAge Micro Edition產品中,VisualAge Micro Edition後來成為J2ME開發方面一個非常成功的IDE。但是OTI 的人發現,Swing在讀取Windows事件方面有極嚴重的缺陷,我們甚至無法進行 SWT(S開始是Simple的縮寫,不過後來變成了Standard的縮寫)和Swing間的互 操作。他們在讀事件隊列的時候用了一種可能留下記憶體漏洞的方式,所以我們不 得不採用我們自己的查詢Windows事件隊列的迴圈,以糾正這個錯誤。
我們試了一次又一次讓SUN修複這個錯誤,但Amy就是聽不進去,所以我們才 決定SWT和AWT/Swing不能共存。我們甚至在SWT中定義了自己的Point和 Rectangle類——整個工具包對AWT或Swing都沒有任何依賴。我們把這個工具包 放到了Eclipse中,這是一個工具平台,它的總體設計目標就是要戰勝Micrsoft 和Visual Studio。Eclipse是開源的,所以任何人都可以在上面構建自己的東西 ,我們已經有像TogetherSoft和Rational這樣的公司移植到了上面。我們的競爭 者是Microsoft,所以我們所有努力和注意力都是從正面針對Microsoft。
不管怎麼說SUN對此非常不滿。他們的Netbeans跟Eclipse做的是相同的事, 因此他們向IBM高層抱怨。他們認為SWT是要將你綁到Windows上,這純粹是胡說 ,因為SWT能通過GTK在Mac/Linux上運行,以及一大堆嵌入式平台。他們拒絕讓 Eclipse獲得Java認證,因為裡面有原生代碼,所以Eclipse產品必須很小心地使 用單詞“Java”這個SUN的商標。Eclipse甚至不能把自己稱為一個Java IDE,SUN已經威脅過要採取法律行動來制止IBM在任何時候把Eclipse稱作一個Java IDE。結果之一就是IBM在Eclipse上建立的GUI設計工具,允許你構建Swing/AWT GUI,卻不讓你往裡面拖放SWT視窗控制項。
將SWT從Eclipse中分離出來是完全可能的,只需要把DLL摳出來放到路徑中, 並使用視窗組件工具包來給你的銀行或者保險或者其他什麼應用程式開發GUI。 再次說明,我們無法更進一步,因為SUN把我們的雙手綁上了。雖然作為Eclipse 開放源碼協議的一部分,CPL允許我們提供這樣的解決方案,但SUN已經很清楚地 表明他們不希望我們這樣做。對於使用者社區來說,無論IBM和SUN的最終動機是什 麼,我發現有一點總是很有趣:喜愛Swing的人總會說“一旦你花上幾年時間去 掌握它,你就能正確地使用它”,這基本上是他們在試圖證明和維護他們辛苦得 來的用途有限的專門技術;而SWT的擁護者們說的是“哇,這真快,這跟原生的 一樣,還可以用XP皮膚……它還又輕又小”。有一句話是我喜歡的,我們的一個 使用者說,Swing就像Java決定不通過作業系統來實現原生的IO,而是通過磁頭馬 達API自己來讀磁碟的扇區。Swing基本上就是這樣的,它拿著個底層的“paint (Graphics)”方法,自己來繪製所有的視窗組件。