我想說這麼一個故事。在Steve回Apple之前,我和他在NeXT有一次會面。當時去的還有我們公司的首席科學家。開完會出來,我們兩個人在那裡覆盤 剛才的辯論,想找出Steve的漏洞——他肯定不能對嘛。結果沒成功。我倆站在停車場說話,讓他從辦公室瞧見了,又跑過來接著和我們辯。那時候說的是跟 Objective-C程式語言有關的一個技術問題。我也不知道他為什麼對這問題那麼上心。我從來沒見過這種熱情勁頭。(Eric Schmidt)
很多人會因為Steve Jobs和他的團隊推出、推廣的傑出產品而記住他:Apple II、Macintosh、鐳射印表機、NeXT工作站、數字動畫電影、iMac、iPod、iPhone、iPad。在過去的35年間,很多人的生活因為Steve的貢獻而變得更美好。
從1985年到1997年,Steve在他離開Apple的12年裡,參與推廣了不少軟體技術和程式設計正規化,後來成為當前計算行業、程式語言和軟體工 程實踐的基礎要素。可以說,軟體成為今天這個樣子,也有他的一份功勞,雖然很少有人注意到這一點。我們InfoQ的眾人,希望在此回顧他那些比較不為人 知,但同樣影響深遠的貢獻,以此作為我們最後的致敬。
就在Mac剛出來的時候,人們還普遍認為編寫帶有圖形使用者介面和多工功能的軟體(多工在1987年面市),比起在Apple II、TRS-80或者IBM PC 5150的BASIC直譯器上面程式設計,要困難得多。到八十年代中期,Borland已經開始普及Turbo Pascal等帶有強大類庫和靈便編輯器的語言。雖然我們不能確切地肯定Steve Jobs離開Apple之前是否已經著手Mac OS System 5,但最終Mac OS System 5的核心特性完全落入他的構想:多工和HyperCard。後者是一種革命性的軟體建造新方法,採取了“物件導向”和“模型驅動”的開發正規化:[INDENT] HyperCard裡面的程式語言叫做HyperTalk,它是物件導向的。物件置身於訊息傳播的路徑所構成的一個層級結構之中,響應由使用者或者系統本身產生的各種訊息。
HyperCard的基本概念是一“疊”虛擬的“卡片”。卡片上記載著資料,就像真的索引卡片簿一樣。它的佈局引擎概念上近似於現在快速開發 (RAD)環境中所謂的“窗體”[……] 它有一個特殊的“Home”疊(後來網站首頁的雛形)用來啟動各種應用,有一個程式碼倉庫存放各種共享指令碼,還有一個配置各種首選項的設施。
HyperCard不僅僅是一個資料庫系統。每張卡片可以有自己的獨特佈局,好比你在真的索引卡片上面也可以填寫規定以外的資訊。希望在同一疊的所 有卡片上都顯示的元素,可以放進一個特殊的背景層裡面;也可以把背景相同的卡片歸為一組,共享背景層。背景的內容除了圖片(背景最開始的用途就是“背景圖 片”)、物件,還可以包含欄位、按鈕、(靜態)文字、(可編輯的)文字框等等常見的GUI元素。然後每張卡片可以在它的文字欄位、圖片欄位裡面容納各種資料,就像資料庫一樣。
[/INDENT]到了1985年Steve創立NeXT之後,這些概念才算真正羽翼豐滿。被暱稱為“the cube”的第一款NeXT工作站於1989年推出市場。Tim Berners-Lee對此有這樣的評價:[INDENT] NeXT是一臺非凡的機器。NeXT一下子引入了許多(甚至太多)新事物——可替換的光儲存、Objective-C、針對音響和電影的DSP、Mach 核心、PC上的unix、Display Postscript顯示系統、InterfaceBuilder等等。確實它的價格一直很貴,光碟也被證明不可靠。可到最後,拯救Apple的還是 Steve和NeXTSTEP。這說明認準了好東西就應該堅持,誰知道哪天它就成了主流呢。 [/INDENT]他還說道:[INDENT] 在NeXT上面編寫WorldWideWeb客戶端異常簡單。系統本身就帶了Text Object模組,這是 一個可編輯、多字型的編輯器。我只需要子類化出來一個超文字物件,然後加上網際網路相關程式碼就行了。設計軟體選單什麼的完全不費吹灰之力,也就是在 InterfaceBuilder裡面拖放幾下子。應用程式的程式碼框架是自動生成的。這就是平臺的作用:在平臺上面做出來的東西,沒了它不是完全做不了, 但那可就辛苦多了。 [/INDENT]InfoQ的編輯Alex Blewitt在上世紀九十年代初有過一臺NeXTStation,他是這麼說的:[INDENT] NeXTSTEP的 作業系統功能已經十分完善,它能播放視訊、錄製聲音、內嵌物件。相比之下,NeXTSTEP首發的時候,Windows的第3版還沒出來。NeXT的硬體 雖然不怎麼實惠,但都是高標準的。標配乙太網、24位色的顯示器、16位音效卡、內建麥克風和音響(別忘了當時SoundBlaster還沒變成通用 API,才是一種剛剛釋出的產品而已)。它是價超所值沒錯——可偏偏第一版的HTTP就是在NeXT機器上面寫的。 [/INDENT]Steve挑選當時能找到的最好的軟硬體,打造了一臺劃時代的萬能機器,幾乎領先時代十年之多。這臺機器的作業系統NeXTSTEP是當時一些革命性元件的結合體:
- 基於Mach核心的類Unix作業系統,外加來自BSD的原始碼
- Display PostScript顯示系統和視窗引擎
- Objective-C語言及其執行時
- 物件導向(OO)應用層,內含多個“工具套裝(kits)”
- 針對OO層的開發工具(如Interface Builder)
- 第一個動態HTML伺服器(WebObjects)
Mach核心原先是在卡耐基·梅隆大學,為了支援分散式計算和平行計算而發展起來的一個先進的作業系統。雖然Mach保持與Unix相容,但它的目 標之一是繞開Unix“一切都是檔案”的概念,因為這個概念被日漸證明不符合實際。從作為Mach前身的Accent專案開始,程式間通訊(IPC)就極 受重視,最終Mach針對性地提出了我們現在非常熟悉的一套新概念:
- “任務”是“執行緒”執行所需若干系統資源組成的一個物件。
- “執行緒”是單一的執行單元,存在於任務的上下文之中,並且共享任務的資源。
- “埠”是用於任務之間通訊的受保護的訊息佇列;任務擁有各自埠的傳送和接收許可權
- “訊息”是帶型別的資料物件的集合,它們只能被髮送到埠,而不能指定傳送到具體的任務或執行緒。
它和UNIX有一個重要的區別,UNIX下的工具處理檔案,而Mach下的工具處理“任務”。Mach把更大部分的作業系統程式碼移出核心,放入使用者空間,結果形成一個大大縮小了的核心,術語“微核心”隨之興起。Mach的程式——或者叫“任務”——有別於傳統的作業系統,可以由很多的執行緒組成。雖然對於現在系統來說非常普通,但Mach是第一個這樣定義任務和執行緒的系統。 [/INDENT]還有一樣根本區別:[INDENT] 埠概念和對IPC的運用,可能是Mach與傳統核心最根本的區別所在。UNIX下的核心呼叫由所謂的syscall或者trap操作構成。程式通過庫在記憶體中的規定位置放置資料,然後引發一個fault—— fault是一種錯誤。系統一開始啟動的時候就設定好核心作為所有fault的“負責人”,所以當程式引發fault的時候,核心就會接管過來,首先檢查 傳遞給它的資訊,然後執行指令。[……]利用IPC來傳遞訊息有利於執行緒和併發。因為任務由多個執行緒組成,使用IPC機制的程式碼又被放線上程內部,所以 Mach可在訊息處理前後凍結和解凍執行緒。這種設計有利於把系統分佈到多個處理器之上,既可以像大多數Mach訊息那樣直接通過共享記憶體來傳遞,也可以在 必要的時候增加一點程式碼把訊息複製到別的處理器上。傳統核心不好實現這樣的分散式構造,因為系統要保證不同處理器上的不同程式不會寫入同一塊記憶體。 Mach實現起來卻很容易而且概念清晰,因為它把“訪問訊息所在那塊記憶體”的過程,變成了“埠”這個系統基本元素。 Display PostScript(DPS)是一套螢幕顯示系統,由Adobe和NeXT在1987年合作開發,同時它也是Adobe的一個正式產品。顧名思義,DPS利用PostScript(PS) 影像處理模型和語言來生成螢幕上的圖形,不過因應使用者互動的需要做了一定的改動。如今在Apple的OS X作業系統裡面,中央視窗伺服器只把視窗圖形快取為PDF,已經不再執行PostScript程式碼。而在當時,PostScript提供的高階圖形語言給 開發者帶來極大的好處,很容易就能建立出高質量、帶互動能力的文字和圖形顯示,顯示結果還能原樣生成PostScript文件並最終列印出來。對於當時正 為列印應用程式生成的WYSIWYG文件而困擾的人們來說,這是革命性的創造。
iPhone讓Objective-C和NeXTSTEP類庫(帶NS字首的那些)煥發了第二春。在1989年的時候,這可是遠遠超前於時代的一個軟體開發環境,直到兩年之後才開始遇到像樣的競爭對手PowerBuilder。 Objective-C是Brad Cox和Tom Love在上世紀八十年代初期發明的一種反射式、物件導向的程式語言,相當於在C語言上面增加了Smalltalk風格的訊息機制。NeXT開發的 AppKit和Foundation Kit類庫內含豐富功能,比如非常完善的容器類。Interface Builder這個模型驅動、基於MVC的圖形使用者介面設計器則堪稱NeXT開發環境的基石。
Interface Builder最早於1988年作為NeXTSTEP 0.8的一部分出現。它的創造者是Jean-Marie Hullot,一開始是用Lisp開發的。Interface Builder屬於頭一批允許通過滑鼠來排布按鈕、選單、視窗等介面物件的商品化應用程式。Tim Berners-Lee開發WorldWideWeb網路瀏覽器算是Interface Builder早期一個著名的使用例子。[INDENT] Apple Computer公司1996年收購NeXT之後,在其新作業系統Mac OS X中採用了OpenStep環境。其中除了Objective-C,還包括NeXT的Objective-C開發工具Project Builder(後來經過擴充套件,成為現今的Xcode)和介面設計工具Interface Builder。即便是Cocoa API這個當前最重要、開發最活躍的Objective-C環境,仍然大部分建基於OpenStep的介面物件。 ]WebObjects同樣是相當領先時代的創新。這個史上第一的動態HTML應用伺服器由Bruce Ong、Nico Popp、Charles d’Harcourt和Fran?ois Jouaux四個人用Objective-C開發而成。它在資料庫訪問方面非常依賴Enterprise Object Framework。作為對比,同樣做應用伺服器的Kiva公司1995年創立,1997年被Netscape收購;一家名為Weblogic的初創小企業在1997年末向市場上推出Tengah伺服器。
有一些現在常見的瀏覽器特性和快捷鍵組合可以追溯到NeXTSTEP的慣例。HTML 1.0和2.0的基本佈局選項源自NeXT的Text類的特性。Doom遊戲的關卡設計器WAD是在NeXT機器上面開發的。先進的電子表格軟體Lotus Improv是在NeXT機器上開發的。有個叫Altsys Virtuoso的軟體也是在NeXT機器上開發的,它的第2版被移植到Mac OS和Windows,成了Macromedia FreeHand第4版。MCI電信公司的“朋友家庭計劃”用NeXTSTEP開發後臺的支撐軟體。甚至連控制半導體層積這樣的工作,也可以找到NeXTSTEP的身影,比如Riber公司的Accessible軟體(第2.5節)和休斯實驗室的EpiCenter軟體。
到NeXTSTEP開發告一段落的時候,它成功地執行在Motorola 68000系列、Intel x86、Sun SPARC和HP PA-RISC等不同體系的處理器上;以它為基礎的OS X作業系統也在2001年正式釋出。
InfoQ採訪了Jack Greenfield,他曾任Rose的總架構師,現任Microsoft的Principal Architect ,於1989到1994年間就職於NeXT,領導Enterprise Object Framework的開發工作。Enterprise Object Framework是最早的的物件-關係對映工具之一。[INDENT] 當InfoQ讓我簡短總結一下當年在NeXT的經歷,當作對Steve的追思,我就知道這是一件吃力不討好的事情。怎麼可能幾句話就向不曾躬逢其會 的人解釋清楚那個地方、那個時候的神奇之處?但在這樣的時刻面對這樣的請求,哪怕再費勁我也要試試。於是我想了一下,大概像我這樣的工程師大概都希望知道 給Steve幹活是怎麼樣子吧。
每個人都知道他有極深刻的洞察力,但這麼說還不能表達其萬一。當Steve走進房間的時候,一切都會變得不一樣。我記得有一次,我們在談持久化物件 儲存的事情,說來說去都是物件的序列化和訪問機制。然後Steve過來呆了幾分鐘,領著我們遨遊天外,想象用那些工具可以創造出什麼樣的世界。到他嘴裡, 說的就成了圖片、視訊、聲音怎麼聯絡到一起,怎麼搜尋,怎麼合成文件,怎麼跟朋友共享。當他離開房間的時候,我們就好像看完一場電影剛亮燈的時候,你要左 右看一會兒,才想起自己在哪裡,剛才做了些什麼。最後我們的成果是近似於JSON的東西,超前二十年就已經紮根在OpenStep裡頭,到現在它的衍生產 物還在左右著iOS上的使用者體驗,Steve當時描繪的一切都已經成為現實。
毫無疑問,他的遠見極具啟迪力量,但這麼說還不足以形容和他共事的感覺。NeXT的每一個人都天資聰穎,拿出優秀的成果是理所當然的事情。一般的領 導看了會流口水,流眼淚或者兩者一起流的的成果,Steve卻可能不為所動。在Steve身邊,你只能做出前無古人,乃至後無來者的產品。其中的關鍵是他 並不會直接這麼告訴你,但只要沒達到他認為有可能達到的高度,就會被認為一文不值。他有辦法撩動工程師渴望卓越成果的雄心,然後他會一直激勵你,暗示你現 在努力得還不夠,但他對你有信心。當你把東西拿給他看的時候,他說出來的幾個字,或者根本不用說,就讓你知道自己還能做得更好,也必須做得更好。當他喜歡 你拿出來的東西,你會有站立在眾山之巔的感覺,不僅因為他喜歡,還因為你知道自己是實現了自我突破才能站上那個高度。
Steve是獨一無二的人物。我再沒遇過任何環境能跟他在NeXT創造的氛圍相比擬。那裡不只是公司,有點像實驗室,有點像遊樂場,有點像兄弟會 社,有點像戰場,有點像大學圖書館,有點像現代藝術館,有點像探險基地。我後來在很多地方工作過,不少地方也能激發我的熱情和精力,但沒有一個地方能達到 NeXT的高度。
Wired如此總結: Steve Jobs留下的全部遺產還要很長時間才能計算清楚。起初員工們都帶著貶義來談論他的“現實扭曲力場”,指的是他那種憑藉說服力和個人魅力令人信奉歪理的特 殊技能。但到了某個時刻,Steve Jobs腦中的世界觀突然不再是扭曲的,反而成了一種自我實現的預言。Apple公司的新產品一個接一個地破土而出,一個接一個地改變著我們的行為。 Steve Jobs的“力場”變成了真實的世界,而我們都生活在其中。 [不少人對Steve有著負面的看法,但不管怎樣,他是過去35年間一直不屈不撓地給無數工程師提出新挑戰的一個人,這樣的人屈指可數。他激勵著工程師們去實踐那些冒險的創新念頭,取得超越想象的成功。如果沒有Steve,今天的個人計算機和電話會變成什麼樣子?
我們將會記住你。
Think Different。