2012年6月4日 星期一

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容易分析,如果你讀了這本書就會知道為什麼,而且也會成為更好的程式師。

沒有留言: