《Joel談軟體》一書的翻譯,我好久沒提了。
合同規定今年1月交稿。假定我沒有違約的話,此書現在應該上市了。可是,實際上......就算到下個月,我恐怕都翻譯不完。......我也不想多解釋了,反正這本書現在是我最大的煩惱,只能爭取今年夏天上市了。
下面的文章是該書的第21篇。
=========================
關於戰略問題的通訊之六
作者:Joel Spolsky
譯者:阮一峰
原文網址:http://www.joelonsoftware.com/items/2007/09/18.html
發表日期 2007年9月18日,星期二
IBM公司最近釋出了一套開源Office軟體,叫做IBM Lotus Symphony,看上去大概是根據StarOffice[1]修改的。但是,我懷疑起這個名字的真正目的,可能是想清除人們對最早那套Lotus Symphony[2]的記憶。那套軟體在釋出之前,被吹得天花亂墜,簡直就像耶穌要復活一樣,但是在釋出之後一敗塗地。它就是軟體業中的Gigli[3]。
上個世紀80年代後期,Lotus公司努力地想找到下一步的方向,升級他們的旗艦產品----電子表格和作圖軟體Lotus 1-2-3。他們很自然地就想到了兩條路。第一條路是往軟體中加入更多的功能,比如文書處理功能。這就是Symphony這個產品的由來。第二條看上去很顯然的路,是做一個3D電子表格軟體。這就是後來Lotus 1-2-3的3.0版本。
這兩條路一開始就遇到了一個大麻煩:在古老的DOS環境中,記憶體佔用不得超過640K。那個時候,IBM已經開始少量出售配備80286晶片的個人電腦,這種新的晶片能夠提供更多的記憶體。但是,Lotus公司覺得,為這種售價高達10000美元的電腦開發專用軟體,市場不會很大。所以,他們一個位元組、一個位元組地壓縮,花了18個月,才將Lotus 1-2-3的新版本塞進了640K的記憶體中。但是,最終在白白浪費了許多時間之後,他們不得不放棄了3D功能,因為沒有足夠的記憶體可以塞進去。Symphony的遭遇也差不多,許多功能都被砍得乾乾淨淨。
這兩條路都走錯了。當Lotus 1-2-3的3.0版本上市的時候,每個人家中都已經有了一臺80386晶片的電腦,配備了2MB或者4MB的記憶體。至於Symphony,它的電子表格功能很弱,文書處理功能也很弱,所有其他功能都很弱。
"夠了,老同志,"你們會說。"誰如今還關心那些老掉牙的、只能在字元模式下執行的軟體?"
請暫且忍耐我一分鐘,因為歷史正在以三種不同的方式重演。那麼,最聰明的應對策略,就是壓寶在同樣的結局上面。
低速CPU和小容量記憶體的環境
從最早的時候一直到大概1999年,程式設計師都極其關注軟體的效率問題。在這段時期中,記憶體空間總是不夠大,CPU主頻也不夠高。
到了20世紀90年代後期,一些像微軟和蘋果這樣的公司,開始注意到摩爾定律[4](其實它們只比別的公司早了一點點)。它們認識到,不必太在意軟體的效率問題和記憶體佔用......只要把很酷的功能做出來,然後等著硬體升級就可以了。微軟公司首次釋出Excel的Windows版本的時候,80386電腦還非常貴,實際上沒什麼人買得起,但是微軟公司很有耐心。只過了幾年,80386SX[5]出來了,相容機的價格下降到1500美元,你只要買一臺,就能執行Excel。
由於記憶體的價格直線下降,CPU的速度每年都在翻番,所以作為一個程式設計師,你就面臨選擇。你可以花6個月用匯編語言,重寫程式的內迴圈(inner loop)。你也可以休假6個月,找一支搖滾樂隊當鼓手。不管是哪一種選擇,6個月後你的程式都會執行得更快。實際情況是沒有程式設計師真的喜歡用匯編語言程式設計。
所以,我們都不怎麼關心軟體的效率或最佳化問題。
不過有一個例外,那就是在瀏覽器的Ajax應用程式中使用的JavaScript語言。因為這是當前幾乎所有的軟體開發工作的方向,所以這是一個重大的問題。
眼下的許多Ajax應用程式,有一百萬行甚至更多的客戶端程式碼。現在的瓶頸已經從記憶體和CPU,轉移到了頻寬和編譯時間。你真的必須想盡辦法進行最佳化,才能使複雜的Ajax程式有良好的表現。
但是,歷史正在重演。頻寬正在變得越來越便宜,即使這樣,還是有人在考慮如何對Javascript進行預編譯(precompile)。
有一些程式設計師將大量的精力投入最佳化工作,要將程式變得更緊湊和更快速。某一天,他們醒來後將發現,這種努力或多或少是白忙一場。如果你喜歡用經濟學家的口吻誇誇其談,那麼你最低限度可以說,這種努力"不會帶來長期的競爭優勢"。
那些不關心效率、不關心程式是否臃腫、一個勁往軟體中塞住高階功能的程式設計師,在長期中,將擁有更好的產品。
跨平臺的程式語言
C語言的原始設計目標,就是為了讓編寫跨平臺的應用程式變得更容易。它很好地實現了這個目標,但是並不是真的100%跨平臺。所以,後來又出現了Java,它的通用性甚至要超過C語言。歷史大概就是這樣啦。
眼下,在跨平臺這出連續劇中,正出現又一個高潮,那就是----沒錯,你猜對了----客戶端Javascript的相容性問題,尤其是瀏覽器DOM(文件物件模型)的相容性問題。編寫一個網路應用程式,讓它在所有不同種類的瀏覽器上都能執行,這簡直是一場可怕的噩夢。你根本找不到其他方法,只能精疲力竭地在Firefox、IE 6、IE 7、Safari和Opera上一一測試,猜猜發生了什麼事?我沒有時間在Opera上測試,所以只好不管Opera了。這意味著,新興的網際網路瀏覽器根本不會獲得立足的機會。
未來會怎樣?當然,你可以在心裡企盼或祈求,微軟公司和Firefox能夠製作出更具備相容性的產品。 祝你好運。不過,你還有另外一個選擇,就是使用p-code虛擬機器[6]或者Java虛擬機器模型,你在底層系統之上建立一個小小的沙箱(sandbox),再將軟體的執行建立在沙箱之上。這樣做的不利之處,就是沙箱有很多缺陷,它們非常慢而且錯誤百出,這就是為什麼Java applet[7]都死光光的原因。建立一個沙箱,你就等於走上了一條不歸路,你能得到的執行速度只有底層系統的1/10,你也無法利用任何一個只有某個底層系統支援、而其他底層系統都不支援的特性。(直到今天,我都在翹首期待,有人能向我展示可以在智慧手機上使用的Java applet。它能利用手機的所有功能,比如拍照、讀取地址本、傳送短訊息、與全球衛星定位系統GPS互動等等。)
沙箱在過去行不通,在將來也不會行得通。
那麼,未來會怎樣?獲勝的一方所採取的策略,正是貝爾實驗室在1978年做出的決定,那裡的科學家決定開發一種跨平臺的、高效的程式語言,這就是後來的C語言。這種語言可以將程式編譯成不同平臺、不同系統可以理解的"本地"碼(各種不同的Javascript和DOM就是本地碼)。至於怎麼編譯,那是編譯器作者需要解決的問題,與你無關。程式碼編譯後的執行效果,與"本地的"Javascript直接執行完全一樣,能夠以一種統一的方式獲取DOM模型的全部潛力,能夠自動地和跨平臺地,與IE和Firefox的核心程式碼融合在一起。對的,它還完美地支援CSS,能夠以一種令人驚駭、但是事實證明是正確的方法,讓你玩轉CSS,所以你永遠都不必為CSS的不相容問題發愁。再也不會這樣了,永遠不會了。哦,等這一天到來的時候,該是多麼美好啊。
完善的互動性和使用者介面標準
IBM 360大型機(mainframe)使用一種叫做CICS[8]的使用者介面,你今天在飛機場還能看到這個系統,你只要在辦理登機手續的櫃檯上彎下身子就能看到。這種介面是80字元寬、24字元高的綠色螢幕,只有字元模式,沒有圖形介面,這是肯定的。主機傳送一個表單給"客戶端"(一臺IBM 3270智慧顯示終端)。這個"客戶端"是智慧的,它知道如何將表單呈現給你,允許你將資料輸入表單,在這個過程中,根本不與主機通訊。這就是IBM大型機如此強大、遠遠超過Unix系統的原因之一,因為CPU根本不需要處理你的行編輯,這種任務由智慧終端承擔了。(如果你做不到為每個人都配置一臺智慧終端,那麼你就去買一臺System/1小型機,充當主機和啞終端[9]之間的中介,為你承擔表單編輯的任務。)
不管怎樣,只要你填完了表單,按下"傳送"鍵,你輸入的所有資料就被送回伺服器端處理。然後,伺服器端又給你發來一個新的表單。整個過程週而復始。
一切都很棒。但是,如果你想在這種環境下,使用文書處理軟體,你該怎麼辦?(你真的無法如願。在大型機上從來都沒有過一個像樣的文書處理軟體。)
這就是歷史上的第一階段。它與網際網路時代的HTML階段正好對應。HTML語言就是帶有字型變化的CICS。
等到歷史進入第二階段,所有人都在寫字桌上配備了PC。於是,突然之間,也不管程式設計師本人願不願意,他就是具有了在任意時間、任意場合,隨意操弄螢幕上任意角落的任意文字的能力。實際上,你可以獲取使用者打字時的每一次擊鍵,因此你就能做出一個很好很快的應用程式,不必等到使用者按下"傳送"鍵,CPU就能提前介入,做出相應的處理。比如說,你可以開發一個文書處理軟體,一旦當前行快要寫滿了,軟體就會自動換行,將結尾的最後一個詞移到下一行的行首。一切都在瞬間完成。哦,我的老天,你能做到這一點?
第二階段也有自己的問題,那就是缺乏一個明確的使用者介面標準......程式設計師具備了空前強大的決定權,幾乎可以隨意按照自己的偏好來製作軟體,因此每個人都用不同的方式寫軟體,這就給使用者帶來了困擾,如果你會用X軟體,這並不代表你就會使用Y軟體。WordPerfect[10]和Lotus 1-2-3有截然不同的選單設計、截然不同的鍵盤介面和截然不同的指令結構。在程式之間複製資料,根本沒有可能。
這也正是我們今天在Ajax開發中面對的局面。當然,不可否認,Ajax應用程式的易用性比第一代DOS應用程式,有了很大的提高。因為從那時開始,我們已經學到了不少經驗。但是Ajax應用程式沒有規範的標準,如果想要協同工作,非常麻煩。你完全沒有辦法,將物件從一個Ajax應用程式中,剪下和貼上到另一箇中。舉例來說,我就不太確定,你怎樣才能將Gmail中的圖片傳到Flickr中。拜託,老兄,剪下和貼上在25年前就發明出來了。
在歷史上的第三個階段中,出現了配備Macintosh作業系統和Windows作業系統的PC。一個統一的、標準的使用者介面誕生了,包括多視窗和剪貼簿這樣的標準功能,這使得在多個程式間進行協同工作成為可能。這種嶄新的GUI(圖形使用者介面),帶給我們易用性和實用性的飛躍,導致了個人電腦爆炸式增長。
因此,如果歷史會重演,我們就可以期待總有一天,Ajax程式的使用者介面會出現某種程度的統一,它的誕生方式就如同Windows的誕生方式一樣。總有人會寫出一個具備壓倒性優勢的SDK(軟體開發工具包),其他人就可以用它來開發功能強大的Ajax應用程式。不同的程式設計師使用同樣的使用者介面元件,使得開發出來的程式可以協同工作。那種贏得最多程式設計師認可的SDK,就具備了壟斷性的競爭優勢,堪稱可於微軟用Windows API獲得的競爭優勢媲美。
如果你是一個網際網路開發者,你不想用別人都在用的主流SDK,那麼越來越明顯地,你將發現沒有使用者使用你的程式。原因其實你知道的很清楚,那就是你的程式不支援剪下和貼上,無法進行地址本同步,也做不到其他所有在2010年流行的新奇的互動功能。
比如,請想像一下,假定你是Google公司的負責人,你為自家有Gmail這樣的產品,感到沾沾自喜。但是沒過多久,某家你從來沒有聽到過的公司,----很可能是一家桀驁不馴的初創公司,背後有Y Combinator[11]的資助----開發出了一種NewSDK,銷售狀況好得難以置信。這種NewSDK使用一種效能優異的跨平臺程式語言,可以直接編譯生成Javascript,而且更出色的是,它還配備了一個大型Ajax庫,能夠執行所有種類的智慧性的互動功能。不僅僅是剪下和貼上,還有一些很酷的聚合(mashup)功能,就像同步和單點身份管理(single-point identity management)。有了單點身份管理,使用者就不必將自己正在幹什麼告訴Facebook和Twitter了,只需要在網上任意一個支援這個功能的地方,輸入就可以了。你對這一套NewSDK嗤之以鼻,因為它的大小居然高達驚人的232MB!......232MB啊!......編譯生成的Javascript,單單載入一個頁面就需要76秒。所以你認定,自家的應用程式Gmail不會流失任何使用者。
但是就是從那時起,就當你在Google總部裡、坐在Google式座椅上、細細品味Google味咖啡、感到洋洋得意、沾沾自喜、高枕無憂、躊躇滿志的同時,新版本的瀏覽器釋出了,支援快取編譯後的Javascript。於是,突然之間,NewSDK的載入速度變得真的很快。Paul Graham又及時地向這家初創公司補充了6000包泡麵,讓他們餓的時候有東西吃。這樣一來,這家公司又可以繼續運營三年,將產品不斷完善。
你手下的程式設計師,不管是張三還是李四,都有相同的看法,那就是Gmail太龐大了,無法移植到那個呆呆的NewSDK上面去。如果那樣的話,我們就必須改變每一行的程式碼。這接近於完全重寫整個程式,太可怕了。整個系統模型會一團混亂,充滿了巢狀。NewSDK使用的跨平臺程式語言用到的括號,多得連Google也無法承受。幾乎每一個函式的最後一行,都是一個包含連續3296個右括號的字串。你因此不得不去買一個特殊的編輯器,才能數清到底有多少個右括號。
後面的事情是,NewSDK的工程師又釋出了一個相當不錯的文字處理軟體,以及一個相當不錯的電子郵件應用程式,還有一個殺手級的Facebook/Twitter式的事件發表器,能夠將網上與你有關的所有事情都進行同步。人們開始使用他們的產品。
就在你不知不覺之間,所有人都開始編寫基於NewSDK的應用程式。這些程式的表現真的很好,一轉眼,產業界點名只想用基於NEWSDK的應用程式。所有老式的純Ajax應用程式看上去都變得很寒酸,它們做不到剪下和貼上,不能夠聚合和同步,互相之間無法很好地協同工作。Gmail就這樣成了遺蹟,好比Email程式中的WordPerfect。未來的某一天,你對孩子們說,曾幾何時當你得到2GB的空間儲存Email時,你是多麼激動。孩子們全都嘲笑你,他們的指甲油都不止2GB。
你是不是覺得這個故事太荒誕不經了?那你就將"Google Gmail"替換成"Lotus 1-2-3"。NewSDK將是微軟公司Windows傳奇的重現。整個過程完全是Lotus公司如何丟失電子表格市場的重演。在網際網路上,這種事情將再發生一次,因為現在所有影響市場的因素和背後的動力,同當年完全一樣。我們唯一不知道的就是,它到底發生在何時、何地、何人身上,但是它一定會發生。
註釋:
[1] StarOffice是Sun公司釋出的一套Office軟體,它的原始碼在2000年7月開源,成為了後來的OpenOffice的基礎。
[2] Lotus Symphony是Lotus公司在1984年釋出的一套Office軟體,在DOS環境下執行。1995年,IBM公司以35億美元的價格,併購了Lotus公司。
[3] Gigli是一部2003年上映的美國電影,主演中包括Ben Affleck、Jennifer Lopez、Al Pacino等大明星。由於Ben Affleck和Jennifer Lopez在拍攝過程中爆出緋聞,這部電影在上映之前被大肆宣傳,但是上映之後,口碑極差,被認為是有史以來最濫的電影之一。
[4] 摩爾定律(Moore's Law)是指大約每隔18個月,晶片的電晶體容量比先前增加一倍,同時效能也提升一倍,而價格下降一半。這個定律描述了硬體的發展趨勢,由Intel公司的共同創始人Gordon E. Moore在1965年提出。
[5] 80386SX是80386晶片的一個低價版,後者在1986年上市,前者在1988年上市。
[6] P-code是軟體編譯過程中產生的一種中間程式碼,不同於最終的機器碼,可以使得程式語言不依賴於特定的平臺或硬體。
[7] Java applet是用Java語言編寫的、鑲嵌在網頁的小應用程式。它需要計算機安裝了Java虛擬機器以後才能執行。
[8] CICS是Client Information Control System(使用者資訊控制系統)的縮寫。
[9] 啞終端(dumb terminal)就是連線主機而不做任何計算處理的終端機。
[10] WordPerfect是Coral公司擁有的文書處理軟體,在20世紀80年代末和90年代初流行一時,是事實上的文書處理軟體標準。後來,被微軟公司的Word取代。
[11] Y Combinator是一家創業投資公司,專門為創業者提供種子資金。該公司由Paul Gramham等人在2005年創立。
(完)