[轉] Linux and the Unix Philosophy第二章部分譯文

veldts發表於2012-02-01

本譯文取自浙大BBS飄渺水雲間,原文地址;譯者pegasus的BBS帳號已登出,無法聯絡,本轉載未徵得原譯者同意,僅供學習參考。

【 以下文字轉載自 LinuxApp 討論區 】 【 原文由 pegasus 所發表 】 試著翻譯一個小節,不足之處希望多提建議。如果各位能容忍在下的翻譯風格:)多多鼓勵哦!!!!

第二章 人類的一小步

概述

大約在30年以前,當美國人一邊駕駛著大型汽車,一邊享受著各國的羨慕目光的時候,大眾公司(Volkswagen)卻在美國展開一場廣告戰,主題為“濃縮就是精品”(small is beautiful)。在那個時候,這家德國汽車製造商似乎很不合時宜。大眾甲殼蟲雖然在歐洲風靡一時,但是如果把它放在美國這塊土地上卻得有點滑稽,那簡直是巨人堆裡的侏儒。然而,大眾仍然堅持讓小型車留了下來。

然後沒有預料到的事情發生了:中東石油巨頭們向世界表明,他們完全可以在某些事情上達成協議──而這裡的“某些事”就是指大幅抬高石油價格。通過頑固地保留大量的原油,他們傾斜了供求平衡關係使之有利於供給方。汽油的價格猛漲至一美元每加侖。一時間輸油管隨處可見,因為石油巨頭們手持匕首威脅著世界的命脈。

長期以嗜好大型汽車聞名的美國人,也開始意識到“濃縮”確實是“精品”。他們向汽車製造商定購小型汽車以緩解日漸空虛的錢囊,而大眾公司就成了他們的恩人。昔日“可笑的小車”如今搖身一變成了“別緻的必需品”。

久而久之,人們發現小型汽車比起大型汽車來,擁有一些特殊的優勢。除了耗油量的減少,他們還開始喜歡小車的駕駛方式:更像英國跑車而不是長了輪子的大型油輪。把小車塞進擁擠的車庫裡也是一件輕鬆的事情。它們的簡單使之容易保養維護。

幾乎在美國人開始熱衷小車的同時,一群在新澤西AT&T貝爾實驗室的研究人員也發現,小程式擁有某些優勢。他們發覺小程式像小車一樣,比起大程式來更容易控制,更容易修改,更容易維護。這引導我們進入Unix哲學的第一條宗旨。

2.1 宗旨1:濃縮就是精品

假如你要寫一個程式,一開始就要設計得小巧,而且要保持它得小巧。不管你是在設計一個簡單得過濾程式,還是一個圖形包,或者是一個大型資料庫,你應該努力把這個程式寫到最小。不要忍不住誘惑把它寫得龐大無比,努力使之簡潔。

傳統的程式設計師內心裡面都暗藏編寫“大美國”程式的衝動。當他們開始開發專案時,他們似乎希望花費數星期,數月,甚至數年的時間來編寫一個能夠解決世界上所有問題的程式。這種作法不僅在商業的眼光看來是昂貴的,更重要的是它忽視了現實。

在現實世界裡,假如把一些小巧的解決方法組合起來,沒有幾個問題是不能解決的。我們之所以選擇那些龐大的作法解決問題,是因為我們不完全理解那個問題。

科幻小說家Theodore Sturgeon曾經寫道:“百分之九十的科幻小說是垃圾。但是百分之九十的任何東西都是垃圾。”傳統的軟體也是這樣的情況。任何某個程式中的很大一部分程式碼,都是用來做一些與這個程式的功能毫不相干的事情。

你在懷疑嗎?讓我們來看一個例子。假如你要寫一個程式來複制檔案A到檔案B,下面這些是一個典型複製程式要做的步驟。

1. 要求使用者輸入原始檔名稱
2. 檢查原始檔是否存在
3. 如果原始檔不存在,提醒使用者
4. 要求使用者輸入目的檔名稱
5. 檢查目的檔案是否存在
6. 如果目的檔案已經存在,詢問使用者是否要覆蓋
7. 開啟原始檔
8. 告訴使用者原始檔是否為空。如果必要的話可以退出
9. 開啟目的檔案
10. 把資料從原始檔複製到目的檔案
11. 關閉原始檔
12. 關閉目的檔案

注意:在第10步檔案才被複制。其他的步驟雖然需要,但是與複製檔案毫不相干。要是進一步仔細觀察,你會發現剩餘的步驟除了在複製檔案裡用到,在其他很多工中都會被使用到。它們碰巧在這裡被使用到,但是它們不是真正的任務組成部分。

一個優秀的Unix程式應該提供步驟10的功能,也應該僅僅提供步驟10的功能。更進一步說,一個嚴格遵守Unix哲學的程式應該是,在被呼叫之初已經獲取了合法的原始檔名和目的檔名。它應該只負責複製資料。顯然,假如一個程式所做的只是複製資料,它就真的是一個很小的程式。

這就給我們留下了一個問題:合法的原始檔名和目的檔名從那裡來?答案很簡單:從其它的小程式來。這些其它的程式實現這些功能,諸如獲取檔名,檢查檔案是否存在,還有判斷檔案是否非空。

“等等。”你也許會想。我們是不是在說Unix包含一些只是檢查檔案存在性的程式?是的!標準的Unix發行版本內建了數以百計的小指令和小應用程式,而它們本身做很少的工作。一些指令,比如test指令,只實現看起來很單調的功能,譬如檢查檔案是否可讀等等。如果這樣聽起來不是很重要,你就要意識到test指令是Unix最頻繁用到的指令之一(注1)。

小程式自身並沒有做很多事情。它們通常僅僅只實現一個或者兩個功能。但是把它們結合起來的話,你會感覺到真正的強大。整體功能會大於區域性功能的簡單加合。一些大型的複雜的問題可以迎刃而解。通過簡單地把它們敲到命令列裡面,你就可以編寫新地應用程式。

注1:一些Unix/Linux的shell(命令直譯器),譬如bash,已經把test指令內嵌到shell裡面,這樣做可以不需要呼叫新的程式來執行這個指令,因此也就節省了開銷。這樣做的缺點在於,如果你一直不停地往shell加入指令,由於Unix/Linux產生新程式的方式,最終會導致非shell指令的執行會耗費很大的開銷。所以一種更好的方式是:相信經常用到的命令已經駐留在shell的緩衝區裡。這樣的話就不需要從磁碟讀出這些命令,否則會有極其昂貴的時間開銷。

Translated by Pegasus 23-Feb-2004

相關文章