[轉] Linux and the Unix Philosophy第二章部分譯文
本譯文取自浙大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
相關文章
- Basic LINUX/UNIX Commands(轉)Linux
- 實用Unix/Linux 命令(轉)Linux
- 文字識別——檢測部分 CTPN論文翻譯
- [下載]PHP 5.1.2 for Unix/Linux(轉)PHPLinux
- linux與unix時間戳互轉Linux時間戳
- 轉 《五蠹》參考譯文
- 轉:Linux、AIX UNIX、SCO UNIX下檢視硬體配置小結LinuxAI
- The Pragmatic Programmer 翻譯(前言章節部分) (轉)
- Linux核心的組成部分(轉)Linux
- Unix/BSD/Linux的口令機制初探(轉)Linux
- objc系列譯文(9.2):玩轉字串OBJ字串
- 什麼是Linux,Linux與UNIX的關係(轉)Linux
- 《Linux/Unix 設計思想》的翻譯細節討論Linux
- RFC1952的部分翻譯及原文 (轉)
- Unix(Linux) C程式設計問題精粹 (轉)LinuxC程式程式設計
- Unix(Linux) C程式設計問題精粹(轉)LinuxC程式程式設計
- Unix(Linux)C程式設計問題精粹(轉)LinuxC程式程式設計
- Java unix時間戳 移除秒毫秒部分Java時間戳
- 【轉載】周易大象傳原文及譯文
- Windows 到 Linux 之旅:第 1 部分. Linux 思想(轉)WindowsLinux
- oracle 中將unix/linux時間戳進行轉換(轉)OracleLinux時間戳
- UNIX環境高階程式設計習題——第二章程式設計
- Linux/Unix下pid檔案作用淺析(轉)Linux
- DOS/Windows和Linux/Unix間檔案格式轉換WindowsLinux
- 理解linux/unix作業系統守護程式(轉)Linux作業系統
- Linux病毒和UNIX病毒需要特別重視(轉)Linux
- Linux/Unix環境下的make命令詳解(轉)Linux
- 談兵:Linux/Unix作業系統入侵思路(轉)Linux作業系統
- Unix/Linux系統下輕量級Shell工具(轉)Linux
- 從 Unix 到 Linux 這一段歷史(轉)Linux
- Windows 到 Linux 之旅:第 5 部分. Linux 日誌(轉)WindowsLinux
- Linux核心源程式的部分特點(轉)Linux
- Unix作業系統的部分重要網站作業系統網站
- [譯] React 的今天和明天(圖文版) —— 第二部分React
- 常用UNIX命令(轉)
- UNIX簡介(轉)
- Unix, Linux 和MacOSLinuxMac
- LINUX UNIX建立組Linux