2012年6月4日 星期一

windows和unix的文化的本質的區別


看過很多關於Unix/LinuxWindow之爭的文章。即使是我這麼偏愛Unix/Linux的人,都會覺得那些文章中的絕大多數太過偏激,要麼把Windows貶得一無是處,要麼把Windows美化得白璧無瑕。 
  我的工作不是windows程式設計,我也很不喜歡Windows程式設計,可我的日常工作生活仍然離不開Windows。即使像我這樣的程式師,讓我在Linux/Unix下配置一台印表機,或者安裝一個音效卡,也是讓我頭疼的事情。Windows之所以如此流行,決不是偶然,有它內在的深刻原因。Unix/Linux的設計很優美,實現也很優秀,但是為什麼在某些領域(尤其是桌面系統)幹不過WindowsUnix/Linux社區的人對自己的技術水準一向非常自負,為什麼十多年過去了還沒能取Windows而代之?這些問題我回答不了,但我的直覺和唯物辯證法都告訴我,任何一個事物都有對立統一的兩個方面,Windows也有它的優點,Unix/Linux也有它不盡人意的地方。 
  最近看《Joel on Software》專欄,發現這個專欄作者發佈在2003年年底的一篇文,把這個問題講得一清二楚,態度公允,分析深入,值得一讀,對系統設計來說也很有指導意義。為了給自己加深印象,節選其中一部分翻譯,做筆記。 
  UnixWindows從功能上看越來越相似,剩下的不同僅僅是文化差異。舉個例子:我們都要吃東西。大洋彼岸的人們用筷子,吃生魚片就米飯;但我們用手拿著麵包,就著牛肉吃。文化差異並不意味著美國人消化不了生魚片,或者日本人消化不了麥當勞的漢堡;實際上美國很多人吃生魚片,日本也有很多人吃漢堡包。但文化差異確實意味著,一個美國人第一次踏上東京的土地時,總會覺得這地方怪裡怪氣。儘管哲學上講,所有的人本質相同,都會戀愛工作唱歌死亡,美國人和日本人仍然很難適應對方國家的廁所佈局。 
  UnixWindows程式師的文化差異是什麼呢?我們暫且不細說這裡面的細枝末節,最重要的一點差異是:Unix文化重視那些對程式師有用的代碼,Windows文化重視那些對非程式師有用的代碼。這麼說有點簡化,但最大的區別的確就是這一點:我們是為其他程式師設計程式,還是為最終使用者設計程式?此外的任何問題都是對這個問題的注腳。 
  20世紀60年代末,Unix剛剛誕生,Unix社區的核心文化正在形成,當時的電腦沒有最終使用者。那時的電腦,以及電腦的CPU時間,都很昂貴,都僅僅用在很專業的學術領域。學習電腦就意味著學習程式設計,而不是像現在這樣,學習使用應用軟體也是學習電腦的一種方式。作為現代的最終用戶,你可能根本不會程式設計,而仍然能用電腦做許多事情。但上世紀60年代末,尤其對Unix社區來說,用電腦就是程式設計Windows被製作出來的時候,唯一的目標是出售盡可能多的拷貝,以贏得更多利潤。每家的每張桌子上都有一台安裝了Windows的電腦Windows開發小組的理想,這一理想為windows設定了核心價值觀:對最終用戶來說更容易使用,但顯然,絕大多數最終用戶不是程式師。Windows開發過程並沒有把方便其他程式師作為目標。 
  例如,Unix的一個重要原則就是清晰區分策略和機制。該原則源於X系統的設計。(虎注:XUnix系統上的圖形化使用者介面的基礎設施,其設計者明確提出,X實現的是機制,不是策略”——X是一個通用圖形引擎,使用者介面風格的選擇,應該是toolkit以及系統中另外一些級別上的決策。策略和機制都會有演進,但是他們變化的速度不同:策略的變化一般比較快,基本機制的變化則比較慢。圖形化使用者介面的風格經常變動,但是用於顯示使用者介面的基本光柵操作——比如在螢幕上畫點/畫線——則沒有太多變動餘地。)清晰區分策略和機制這一Unix文化中的基本原則導致了Unix上圖形化使用者介面風格的多樣性。Unix世界裡從未就使用者介面工作方式的全部細節達成一致,並且他們認為這沒什麼不對的,Unix文化並且還尊重這種多樣性。但是對一般的最終用戶來說,在兩個應用程式中,應該能用相同的操作(點擊相同的按鈕或者功能表/快速鍵)達到相同的目的,這樣的系統上的應用程式才是易學易用的。也正是由於上述區別,雖然Unix開發者為給Unix做一個漂亮的使用者介面已經努力了二十年,我們還是看到最大的Linux廠商的CEO告訴大家:家庭用戶還是用windows好了 
  Linux沒准永遠都不會成為一個好的桌面作業系統,因為Unix文化所看重的那些東西本身,就妨礙了Linux成為一個面向最終使用者的桌面系統。OS/X就是一個例證:Apple終於創造出了面向最終用戶的Unix,唯一的原因是,Apple的工程師和領導者都堅定地以最終用戶為核心,而完全放棄了Unix文化中最基本的以程式師為核心的理念。他們甚至把Unix的核心目錄改名了——“bin””lib”變成了對一般用戶來說更通俗易懂的”application””library”

Unix和Windows程式師的文化差異+Mac


到目前為止,WindowsUnix在功能上的相似之處比不同的要多。他們都支援同樣的主流程式作法(由命令列到圖型介面到web伺服器);他們所依循的系統資源基本是完全一樣的,比如幾乎完全相同的檔案系統、記憶體、sockets,還有行程和執行緒等等。兩套作業系統的核心服務,還有開發者能寫的應用程式類型也沒多大的差別。
剩下的就是文化差異。沒錯,我們全都要吃東西,不過海那邊的人是用木筷子吃生魚片加米飯,而我們在這裡則是用手拿著麵包夾大塊碎牛肉在吃。文化差異並不表示美國人的胃不能消化壽司,或是說日本人不能消化大麥克漢堡;也不表示吃壽司的美國人或吃漢堡的日本人很少;文化差異指的是美國人第一次去東京下飛機時所面對,「這地方真奇怪又該死」那種無法承受的感覺。至於什麼「我們其實都是一樣的,我們都有愛,也都會工作歡唱及死亡,將會克服美國人和日本人永遠無法真正對對方的廁所安排感到自在。」這種空話根本連想都不會想。
UnixWindows程式師的文化差異是什麼呢?細微的地方很多,不過有一項最明顯:Unix文化重視對其他程式師有用的程式,而Windows文化重視對非程式師有用的程式。
這當然是主要的簡化說法,不過事實上確還是個很重大的差異:我們寫程式究竟是為程式師還是為了一般使用者?除了這個問題之外其他的都只是詮釋。
時常大發議論的Eric S. Raymond剛寫了一本有關Unix程式設計的巨作The Art of UNIX Programming,極其深入地探索他自己的文化。你可以去買這本書的紙本來看。如果你覺得Raymond的想法太過激進(anti-idiotarian)而不想付錢給他,還可以在線上免費閱讀,保證作者的心血絕對不會收到一分錢。
讓我們來看個小例子。Unix的程式文化格外重視可由命令列呼叫的程式,這種程式可以用參數控制各種動作,其輸出可以擷取成一般機器可讀的純文字格弋。這種程式之所以會被重視式,是因為可以讓其他程式師輕易地整合進別的程式或較大的軟體系統中。舉個很小的例子,Unix文化中有一個Raymond稱之為「沈默是金」的核心價值,是說當程式成功地完成你所交付的事時應該不要有任何輸出。不管是在命令列輸入300個字元的命令建立檔案系統,還是建立並安裝了一套複雜的軟體,或是把載人火箭送到月球,全部都一樣。只要成功執行就不要有任何輸出。使用者看到下一個命令列提示就會推論一切正常。
由於你是為其他程式師寫程式,所以這才會是Unix文化的重要價值。就如同Raymond所說的:「喋喋不休的程式不太能和其他程式好好合作。」 相較之下在Windows文化中是為張阿姨而寫程式的,而張阿姨搞不清楚程式是因為執行成功而沒有任何輸出,還是因為出錯了所以無法顯示任何訊息,或是因為誤解你的要求而沒有輸出。
同樣的狀況,Unix文化欣賞保持文字介面的程式。他們不是很喜歡圖型介面,不過在純文字介面程式上漂亮地塗一層GUI口紅可以例外,另外他們也不喜歡二位元檔案格式。因為文字介面比較好用程式控制,而圖型介面除非提供其他機制(如內建腳本語言),否則幾乎不可能用程式控制。我們在這裡又再次看到,Unix文化重視有助於其他程式師的程式,而這一點很少會是Windows程式設計的目標。
這並不是說所有的Unix程式都只是為了程式師而設計的。這樣說太偏頗了。不過這個文化重視對程式師有用的東西,而這可以解釋很多很多的事情。
假設你找了一個Unix程式師和一個Windows程式師來,要他們分別寫同一隻針對一般使用者的應用程式。Unix程式師會先建立一個由命令列或文字介面驅動的核心,通常事後才寫一個圖型介面來呼叫核心。這樣子應用程式的主要功能都可以讓其他程式師使用,他們可以用命令列呼叫程式並把結果以文字方式讀入。而Windows程式師會傾向先由圖型介面開始,通常事後才加上腳本語言讓圖型介面的操作自動化。對一個99.999%使用者完全不寫程式(也不打算學寫)的文化來說,這是很正常的。
Windows程式師中有個主要針對其他程式師寫程式的重要團隊,就是微軟內部的Windows團隊本身。他們做事的方法通常是建立一個可以由C語言呼叫的API,在API裡實作出功能,然後再撰寫圖型介面程式來呼叫API。所有用Windows使用介面能做的事,全都可以用任何合理的程式語言呼叫某個程式介面做到。舉例來說,微軟的Internet Explorer本身只不過是一個89 KB的小程式,裡麵包裝了數十個可供程式老手免費使用,功能強大又有彈性的的元件。問題是程式師無法接觸到這些元件的原始碼,所以只能完全依照微軟內元件開發者所預見並允許的方式使用,而這種作法並不是每次都行得通。有些問題因為缺乏API原始碼,以致於難以甚至無法追查,這時通常就怪罪到呼叫API的人身上。Unix具有公開原始碼的文化價值,使它成為更容易開發的環境。每個Windows平臺的開發者都會告訴你,某一次花了四天去查一個問題,原因只是他們認為LocalSize傳回的記憶體大小應該和原先呼叫LocalAlloc時用的值一樣,或是其他有程式庫原始碼就能在十分鐘內搞定的問題。Raymond創作了一個有趣的故事,說明這個曾經用過無原始碼程式庫都會同意的道理。
所以你看到這些宗教性的論點了。因為可以進入程式庫除錯所以Unix比較好。因為張阿姨可以看到提示確認她的電子郵件真的送出去了,所以Windows比較好。事實上沒有誰比誰更好,他們只是擁有的價值不同:Unix的核心價值是製作有助於其他程式師的東西,而Windows則把製作有助於張阿姨的事視作核心價值。
讓我們來看看另一個文化差異。Raymond說「典型的Unix檔會寫得簡潔而完整這種風格假設讀者夠積極,可以推導未寫出的推論,並且有自信信任這些推導。小心的閱讀每一個字,因為一件事很少會講兩遍。」天啊,我認為他其實是在教年輕的程式師寫出更不人性的man說明文件。
這對一般使用者而言是絕對行不通的。雖然Raymond可能說這是「過於簡化的屈就」,不過Windows文化瞭解一般使用者不讀檔,即使不得不看也是愈少愈好,因此你必須不斷重複的解釋事實上在良好的Windows說明檔中,必須每個主題都能讓一般讀者直接看懂,不必先看懂其他任何的說明主題。
怎麼會出現不同的核心價值呢?這是Raymond的書另一個出色之處:他深入Unix的歷史和演進,讓新程式師熟悉回溯至1969年起累積的歷史。在Unix被創造出來及其文化價值成形的時候,一般使用者並不存在。電腦很貴CPU時間也很貴,學電腦就等於是學寫程式。無怪會蘊釀出重視有助於其他程式師的文化。相較之下Windows的創造只有一個目標:儘量賣更多套以獲得更多利潤,成億上兆套的賣。「每個家庭每個桌上都有一台電腦」就是創造Windows的明確目標,並且設定了它的議題也決定它的核心價值。讓非程式師容易使用,是進駐每個桌面和家庭的唯一方法。因此使用性自然淩駕其他東西而成為文化的基準。對這樣的文化而言,程式師是極其次要的對象。
文化的裂縫是如此的明確,所以Unix從未真正的進入桌面。張阿姨不會真的去用Unix。不斷有人努力幫Unix製作漂亮的外殼,希望讓張阿姨能用Unix,不過全都失敗了。因此這些程式師都深陷在Unix文化中。舉例來說,Unix有一個源自於X設計者的價值:策略與機制分離。這種想法直接導致使用介面的分裂;桌面使用介面運作的細節並沒有大家一致同意的做法,由於這些設計者的文化重視這種差異,所以他們就認為這種作法可以用。不過對張阿姨來說,在不同程式裡剪貼得用不同的使用介面,絕對是行不通的。所以這就是現在的狀況,Unix開發者20年前開始嘗試在系統表面塗上一層漂亮的使用介面,結果到今天最大Linux廠商的執行長還告訴大家,家庭用戶應該直接用Windows就可以了。我曾經聽過有經濟學家宣稱,說矽穀永遠不可能在其他地方(比如說法國好了)重現,因為法國文化對於失敗的懲罰太重,以致企業家不願意冒險。或許Linux也有相同的狀況:Linux可能永遠都不會成為桌面的作業系統,因為它重視一些會阻礙這件事的價值。OS X就是一個證明:蘋果終於創造了給張阿姨用的Unix,不過原因並不光是因為蘋果的工程師和經理堅持針對一般使用者的文化(我獨斷地稱之為「Windows文化」,雖然這從歷史來看是源於蘋果),他們還拒絕了Unix文化中以程式師為中心的基本思想。甚至把核心目錄的名字改掉了(多麼違反傳統!),用常見的英文單字”applications””library”代替”bin””lib”
Raymond真的嘗試比較Unix與其他作業系統並突顯之間的差異,不過這卻也是這本好書中最弱的部份,因為他真的不知道自己在講什麼。當他談論Windows時常會顯露他對Windows程式設計的知識多是由報紙讀來,並非來自真正的Windows程式設計經驗。這沒什麼關係:他並不是Windows程式師,而這一點我們可以體諒。不過他身為對一個文化有深厚瞭解的典型,知道該文化所重視的價值,卻沒有注意該文化中針對一般人部份(殺老太太跟當機:一定是不好的),與針對程式師部份(吃生魚片和命令列參數:因對象而不同)的差異。
有太多的單文化程式師,他們就像從未離開過家鄉的典型美國小孩,說不出來文化價值和人類核心價值間的差異。我遇過太多嘲笑Windows程式設計的Unix程式師,他們認為Windows野蠻又愚蠢。Raymond經常落入未考慮原由就輕視其他文化的陷阱。在Windows程式師中很少會發現這種頑固份子,因為Windows程式師大體上都是以解決方案為準而非意識型態的。至少Windows程式師會承認他們文化的缺陷,然後很實務地說:「看,如果你想把文書處理程式賣給很多人,就得能在他們的機器上執行。如果得用邪惡的registry代替優雅的~/.rc檔儲存設定才能辦到,就這樣做吧。」現在Unix世界充滿自以為是的文化優越擁護者和slashdot的灌水教派(karma-whoring sectarianism),而Windows世界比較實務(我畢竟得在這裡討生活嘛)。這種現狀源於Unix文化感覺自己被圍攻,無法突破伺服器和愛好者小眾市場進入主流桌面市場。這種弱勢的傲慢正是The Art of UNIX Programming最大的缺點,不過倒也並不是如此嚴重,整體而言這本書充滿了非常有趣的洞見,內容泛及各種程式設計主題,以致我願意閉住呼吸忍受偶而出現的意識型態高論,因為在其他部份可以學到太多一般性的觀念了。事實上我會把這查書推薦給任何平臺任何文化和任何目標的開發者,因為裡面有大多價值是普世通用的。Raymond指出CSV格式不如/etc/passwd格式時,他嘗試由Unix而非Windows觀點去評價,不過你知道嗎?他是對的。/etc/passwd CSV容易分析,如果你讀了這本書就會知道為什麼,而且也會成為更好的程式師。