歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux文化 >> 《編程之道》(轉載) 全文

《編程之道》(轉載) 全文

日期:2017/2/27 12:16:22   编辑:Linux文化

聲明:
本文內容來自《編程之道》一書, 小趙只負責錄入. 所有版權歸該書的出版社。本文由原來的三冊書組成:《編程之道》 《編程之禅》《計算機時代的寓言》

目錄

前言
第一篇 靜寂的空宇
第二篇 古代的大師
第三篇 設計
第四篇 編碼
第五篇 維護
第六篇 管理
第七篇 公司裡的學問
第八篇 硬件和軟件
第九篇 尾聲

第一篇 靜寂的空宇

編程大師如是說:

“當你有本事奪走我手中的這塊水晶石時,就是你出師的時侯了。”

1.1

在靜寂的空宇裡,一種神奇的物質形成並誕生了。它立刻便靜止了,獨自守侯著,豪無動靜,然而又處於永恆的運動之中。它是所有程序的源頭,我不知道它的名字,所以我將稱它為編程之道。

如果此道是完美的,那些操作系統就是完美的,如果操作系統是完美的,那麼編譯程序就是完美的,如果編譯程序是完美的,那麼應用程序就是完美的。用戶滿意之至--和諧便應運而生。

編程之道流逝遠去,又乘著晨風而歸。

1.2

此道產生了機器語言,機器語言又產生了匯編語言,

匯編語言產生了編譯程序,如今有了上萬種的語言。

每一種語言都有其各自的卑微用途。每一種語言都表達出軟件的陰和陽。每一種語言都在此道之中有其一席之地。

但是,應盡量避免用COBOL語言編寫程序。

1.3

宇宙之初有道,道產生了空間和時間。空間和時間便是程序設計之陰陽。

不能領悟此道的編程者總是耗盡他們所要編寫的程序的時間和空間;而領悟了此道的編程者卻總有足夠的時間和空間來達到他們的目標。

除此之外,難道還有其它的情形嗎?

1.4

精明的編程者聽說了此道,並遵循它;平庸的編程者聽說了此道,並尋覓它;愚蠢的編程者聽說了此道,卻嘲笑它。

要不是因為有嘲笑,道也就不復存在了。

最高的聲音最難被聽見。前進也是一種倒退。大器晚成。即使是一個完美的程序也仍然會有隱患。

道深藏不露,難於理解。

第二篇 古代的大師

編程大師如是說:

“倘若三天不編程,生活將變得毫無意義。”

2.1

老一輩的程序員是神秘的、深奧的。我們沒法揣摩他們的想法,我們所能做的只是描述一下他們的表象。

他們是清醒的,就像一只游過水面的狐狸;他們是警惕的,就像一位戰場上的將軍;他們是友善的,就像一位招待客人的女主人;他們是簡單的,就像未經刻鑿的木頭;他們還是難以琢磨的,就像黑暗的洞穴中漆黑的池水。

誰能說出他們心中的秘密?

答案只存在於道中。

2.2

計算機科學巨擘圖靈曾經夢到他是一台機器。當他醒來時,他驚歎道:

“我不知道--我是夢到了自己是台機器的圖靈,還是一台夢到了自己是圖靈的機器?”

2.3

一家大電腦公司的一名程序員參加了一次軟件研討會。他回來後向經理匯報說:“為其它公司工作的那些程序員都是些什麼的人啊?他們行為拙劣,不顧及自己的儀表。他們的頭發又長又亂,衣服又皺又舊。他們闖進我們的會客組,還在我演講時發生粗魯的喧鬧。”

經理說:“我本不應該讓你去參加這個會議。那些程序員是生活在物質世界之外的。他們認為生活是荒唐的,一種意外的巧合。他們來去自如。他們只為他們的程序而活著,無憂無慮地活著。為什麼要用社會習俗來約束他們呢?

他們活在此道之中。”

2.4

一個禮堂者問大師:“有位程序員,從不構思、編寫文檔或測試他的程序,然而所有知道他的人都認為他是世界上最棒的程序員。這是為什麼呢?”

大師回答說:“那個人掌握了道。他不需要事先進行構思,當系統崩潰時,他不會因此而悶悶不樂,而是心平氣和地接受整個事實。他還從編寫程序說明文檔的需要之中超脫了出來,不在意是否有人看他的編碼。他也不需要進行測試。他的每個程序都完美無缺。寧靜而優雅,程序的用途也顯而易見。

的的確確,他已經進入了道的神奇境界。”

第三篇 設計

編程大師如是說:

“當程序被測試時,再修改設計方案就太遲了。”

3.1

曾經有個人去參加一次電腦展示會,每天當他進入展館時,都對門衛說:

“我是個大盜,我偷盜的本領是出了名的。事先警告你,這次展示會也在劫難逃。”

這番話讓門衛坐立不安,因為裡面有價值數百萬美元的電腦設備,所以他緊緊地盯住這個人。但這個人只是從一個展攤逛到另一個展攤,嘴裡輕輕地哼著小曲。

當這個人出門時,門衛把他拉到一邊,搜查他的衣服,但一無所獲。

第二天,這個人又來了,並對著門衛囂張地嚷著:“昨天我滿載而歸,但今天的收獲會更大。”於是,門衛盯他盯得更緊了,但仍一無所獲。

在展示會的最後一天,門衛再也抑制不住自己的好奇心了。“大盜先生,”門衛說,“我被你搞糊塗了,實在想不明白。請告訴我,你究竟在偷什麼?”

這個人笑了。“我在偷想法。”他說。

3.2

曾經有位編程大師,喜歡編寫非結構化的編程。一位初學者試圖模仿他,也開始編寫非結構化的程序。當這位徒弟請師父評價他的進展時,師父批評了他的做法。他說:“對一位編程高手適合的,對初學者來說並不一定適合。在超越結構化之前,你必須先領悟道。”

3.3

曾經有位程序員被派到IBM的軍機大臣手下工作。軍機大臣問程序員:“設計一個財務軟件包,和設計一個操作系統,哪一個更容易?”

“操作系統。”程序員回答說。

軍機大臣立刻發生一種不信任的驚歎,“與一個復雜的操作系統,一個財務軟件包簡直是小巫見大巫。”他說。

“並非如此,”程序員說,“在設計一個財務軟件包時,編程人員是作為一個中介者在觀念各異的人們之間起作用的:這個軟件必須如何操作,它的報表必須是什麼形式,它必須如何與稅法一致,等等,一個操作系統則不為其外觀所限制。當設計一個操作系統時,編程人員只要在機器與人的思維之間尋找一種最簡單的和諧就可以了。這就是為什麼操作系統更容易設計。”

軍機大臣點點頭,笑了。“說來也是。但要想檢測和糾正其中的錯誤,哪個更容易呢?”

程序員沒有回答。

3.4

一位經理到編程大師那裡,交給他一份有關一個新應用程序的需求說明。經理問編程大師:“如果我分配五個程序員給你,你需要多久能設計好這個系統?”

“那將花費一年的時間。”大師立刻回答。

“但我們馬上就需要這個系統,甚至要求更快!如果我分配十個程序員給你,你需要多長時間?”

大師皺了皺眉頭,“那樣的話,需要兩年。”

“如果我分配一百個程序員給你怎麼樣?”

大師聳了聳肩膀,“那麼這項設計將永遠無法完成。”他說

第四篇 編碼

編程大師如是說:

“一個寫得完美的程序是其自身的天堂,而一個寫得糟糕的程序則是其自身的地獄。”

4.1

一個程序應當是輕盈的、靈活的,它的子程序就像一串珍珠一樣連接著。它的精神和意圖應該貫穿始終。在程序中,內容既不應太多,也不應太少;既不應該有不需要的循環結構,也不該有冗余的變量;既不缺乏結構性,又不過分僵化。

一個程序,無論多麼復雜,都應該以一個整體的方式運行。程序應以其內在的邏輯為指引,而非外在形態。

如果一個程序不能達到這些要求,它將處於一種雜亂無章的混淆不清的狀態。唯一的方法就是重寫這個程序。

4.2

一位初學者問大師:“我有個程序,時靈時不靈。我一直都遵循著編程的規則,結果卻整個兒搞糊塗了。這是什麼原因呢?”

大師回答說:“因為你沒有領悟道,所以你迷惑不解。只有傻瓜才會指望從人類身上看到理性的行為,你又能指望一台人類制造的機器怎麼樣呢?計算機模仿的是決定論,只有道才是盡善盡美。

編程用的那些條條框框式的規則僅僅是昙花一現,只有道才是永恆的。因此,在你受到道的啟發之前,你必須沉思於道。”

“但是我怎樣才能知道我已經受到了啟發了呢?”初學者問。

“當你的程序運行無誤時。”大師回答說。

4.3

一位大師正在向他的一名初學編程的弟子解釋道的真谛。“此道體現在所有的軟件當中--不管它看上去多麼無足輕重。”大師說著。

“此道體現在手掌計算器中嗎?”初學者問。

“是的。”

“此道在電子游戲中嗎?”初學者繼續問。

“此道甚至也體現在電子游戲之中。”大師說。

“那麼此道也體現在個人電腦的DOS系統之中嗎?”

大師咳嗽一聲,並稍稍挪動了一下位置。“今天的課就到這裡吧。”他說。

4.4

一位項目經理手下的一名程序員正編寫軟件。他的手指在鍵盤上飛舞著,在程序的編譯過程中沒有出現任何錯誤信息。程序運行起來就像一陣和風。

“太好了!”經理高興地大叫了起來,“你的技藝簡直是完美無缺。”

“技藝?”程序員說著便從他的終端機前轉過身來,“我遵循的是道--所有的技藝遠不能及!當我剛開始編程時,我眼前看見的是整個問題亂成一團。三年之後,我再也看不見這種一團糟的情形了。相反,我用了各種各樣的子程序。但現在,我什麼也看不見了。我的整個身心存在於一種無形的虛空裡,我的知覺是空蕩蕩的。

我的精神隨其本能而動,不無原則計劃就能自由地工作。總而言之,是我的程序自己寫出了自己。誠然,有時會有一些難題。我看見那些難題向我走來,於是我放慢了速度,默默地注視著他們。然後我更改了一行編碼,那些問題就煙消雲散了。然後我完成程序的編譯。我靜靜地坐著,讓工作的歡心情舒暢遍布我的全身。我閉上雙眼,歇息片刻,然後退出系統。”

經理說,“希望我的所有的程序員都這麼聰明!”

第五篇 維護

編程大師如是說:

“即使一個程序只有三行長,總有一天它也不得不需要維護。”

5.1

一記扇經常開啟的門的絞鏈不需要潤滑油。

一條湍急的河流不會變得污濁。

無論是聲音還是想法都不可能在真空中傳播。

軟件如果不用就會腐朽。

這世界真奇妙。

5.2

一個程序員正在編寫他的程序,經理問他還需要多長時間完成。

“明天就可以完成。”程序員立刻回答。

“我想你這是不切實際,”經理說,“實話實說,這需要多長時間?”

程序員想了一會兒。“我還想加進一些新的特色,這需要花至少兩個星期的時間。”他最後說。

“即使那樣也期望過高,”經理堅持說,“只要你編完程序時告訴我一聲,我也就滿足了。”

程序員答應了。

幾年以後,那位經理要退休了。在他去退休午餐會的路上。他發現那個程 序員趴在他的終端機前睡著了。整個晚上都在忙於編寫那個程序。

5.3

一次一位初學編程者被指派編寫一個簡單的財務軟件包。這位初學者大張旗鼓地工作了許多天。但當他的師父檢查這套程序時,發現其中包含有一個屏幕編輯器,一套通用圖表程序,一個人工智能界面,然而卻沒有任何財務方面的東西。

當師父問及此事時,初學者顯得憤憤不平。“不要這樣沒有耐心嘛,”他說,“我最後加些財務的素材進去就是了。”

5.4

難道一位好農民會漏掉他所種的一株莊稼嗎?

難道一位好老師會放棄哪怕是最差的學生嗎?

難道一位好父親會允許哪一個孩子挨餓嗎?

難道一位好程序員會不願維護他的程序嗎?

第六篇 管理

編程大師如是說:

“讓程序員多而經理少--然後生產效率就會高。”

6.1

當經理們沒完沒了地開會時,程序員就寫些游戲玩;當財務主管們談到季度利潤時,開發用的預算馬上就要被削減;當資深科學家們談論藍藍的天空時,馬上就會風起雲湧。

其實,這並不是編程之道。

當經理們忠於職守時,游戲程序就會被擱置到一邊;財務主管們制訂出長 遠的計劃時,和諧秩序將很快恢復;當資深科學家們著手於眼前的問題時,這些問題不久就會解決。

其實,這才是編程之道。

6.2

為什麼程序員沒有效率?

因為他們的時間浪費在開會上。

為什麼程序員很難管束?

因為管理層多管閒事。

為什麼程序員接二連三地辭職?

因為他們的熱情已耗盡。

在糟糕的管理之下工作,他們不再敬業。

6.3

一位經理即將被解職,但此時他手下的一名程序員發明了一個新的程序。這個程序流行起來,並且極為暢銷。結果,經理又回到了原來的崗位上。

經理試圖要發給那位程序員一筆資金,但程序員拒絕了。他說:“我寫這個程序,因為我認為這是個很有意思的想法。我並不期望有所回報。”

經理聽到這話,評論說:“這位程序員雖然身居卑位,卻能很好地理解一位雇員應盡的職責。讓我們提拔他到管理顧問的高位上吧!”

然而,接到通知後,那位程序員又一次拒絕了。他說:“我在屬於我的位置上,才能較好地編程。如果我被提升了,除了浪費每個人的時間,我將一事無成。現在我可以走了嗎?我還有一個程序要編呢。”

6.4

一位經理走過來對他的程序員們說:“關於你們的上班時間:你們要早上九點鐘到,下午五點鐘下班。”聽了這話,所有的程序員都很氣憤,其中有幾位要當場辭職。

於是,經理只好又說:“好吧,那樣的話,你們可以自己安排上班時間,只要你們能按時完成項目。”程序員們滿意了。以後,他們中午來到辦公室,一起工作到凌晨。

第七篇 公司裡的學問

編程大師如是說:

“你可以向一位公司總裁演示一個程序,但你無法使他學會使用電腦。”

7.1

一位初學者問大師:“在東方(此處喻指美國的東海岸,有許多大公司的總部--譯注),有一個不尋常的樹狀結構,人們稱它為‘公司總部’。它的副總裁們和財務主管們的數量之大,使它鼓得不成開關。它簽發大師的便函,每份上都寫著”歸去”“來兮”,卻沒有人知道那是什麼意思。它的那些分支機構每年都要換新的名字,但都毫無價值。如此一個不正常的實體怎麼能繼續存在呢?”

大師回答說:“你探察這個龐大的鄧因其沒有合理的用途而心神不定。難道你不能從它那無盡的回旋中得到樂趣嗎?你不會享受一下在它所蔽護的部分裡的編程的那種無憂無慮的輕松嗎?你為什麼要因為它毫無用處而心煩意亂呢?”

7.2

在東方,有一條大魚,比其它所有的魚都要大。它變成了一只鳥,它的翅膀就像雲朵一個布滿了天空。當這只鳥飛過陸地時,它帶來了“公司總部”的消息,像蜻蜓點水一樣把這個消息丟在了那些程序員中間。然後這只鳥駕著風,背負藍天,返回了家園。

初學編程者驚奇地盯著那只鳥,因為他根本無法理解;平庸的程序員畏懼那只鳥的到來,因為他害怕鳥兒帶來的消息;而編程大師卻仍然在他的終端機前工作,因為他不知道那只鳥來了又去了。

7.3

象牙塔裡的魔術師帶來了他最新的發明,要讓編程大師檢驗一下。魔術師把一只大黑箱子推進辦公室,大師靜靜地等侯著。

“這是一台集成的、分布式的、通用的工作站,”魔術師開始,“運用人類工程學原理,使用享有專利的操作系統、第六代評議和多重狀態用戶界面而設計完成。建造這台工作站,花了我幾百名助手幾年的時間。這不足以令人驚奇嗎?”

大師輕輕地揚了揚眉毛。“這的確令人驚奇。”他說。

“公司總部已經命令,”魔術師繼續說,“每個人都得使用這台工作站作為操作平台來設計新的程序。你同意嗎?”

“當然同意,”大師說,“我馬上就把它運到數據中心去。”於是魔術師興高采烈地回到了象牙塔去了。

幾天後,一位初學者走進大師的辦公室問道:“我找不到我的新程序清單了。你知道它會放在哪兒嗎?”

“知道,”大師回答說,“那些清單就堆放在數據中心的台子(platform“可以指操作平台”,也可以指普通的台子--譯注)上。”

7.4

編程大師從不懼怕在設計不同程序的崗位間調來調去;管理層的變動不可能對他有所損害;他不會被解雇,即使項目取消了。這是為什麼呢?因為他胸有成“道”。

第八篇 硬件和軟件

編程大師如是說:

“沒有風,草兒靜止不動;沒有軟件,硬件則無所為用。”

8.1

一位初學者問大師:“我覺察到有一家電腦公司比其它所有的公司都要大得多。它在中遙遙領先,就如同鶴立雞群一般。它的任意一個部門都可以組成一個完整的企業。這是為什麼呢?”

大師回答說:“你怎麼問這麼愚蠢的問題呢?因為那家公司大,所以它就大嘛。如果它僅僅生產硬件,沒人願買;如果它僅僅生產軟件,沒人願用;如果它僅僅維護一下系統,人們將把它當作是傭人。然而,因為它把所有這些東西都結合了起來,它便搖身一變,被人們看作是諸神之一。不費吹灰之力,它便能取勝。

8.2

一天,一位大師從初學編程者身邊經過,他發現這位初學者正在全神貫注於掌上電腦游戲。“對不起,”他說,”我可以看一下嗎?”

初學者立刻緊張起來,把那個玩意兒遞給了大師。“我知道這種設備提供了三個游戲級別:容易、中等和高難,”大師說,“然而每個這樣的設備都有另一個級別,在這一級,游戲機既不想贏人,也不想被人打敗。”

“請問,尊敬的大師,”初學者懇求道,“怎樣才能找到這個奇妙的級別設置呢?”

大師把那個玩意兒扔到地上,踩到粉碎。突然間,那個初學者明白了什麼。

8.3

曾經有一個程序員,擅長在微電腦上編程,“瞧,我在這裡過得多好呀,”他對另一位來訪的程序員說,這位程序員是在大型主機上工作的,“我有自己的操作系統和文件存儲設備,我不必和其他任何人分享我的資源。這裡的軟件自相一致,很容易使用。你為何不辭去現在的工作,加入到我這裡來呢?”

於是,主機程序員開始向他的這位朋友描繪他的系統:“主機就像一位陷入沉思的聖人一樣,端坐在數據中心。它的磁盤器首尾聲相連,就如同機器的海洋。這裡的軟件既像鑽石一樣能多面反射光芒,又像原始叢林一樣復雜難測。這裡的程序,各具特色,它們像湍急的河流穿過系統。這就是我樂於此處的原因。

微電腦程序員聽到這裡,陷入了沉默。但這兩位程序員至死都保持著友誼。

8.4

在去硅谷的路上,硬件碰上了軟件。軟件說:“你是陰,我是陽。如果我們攜手同路,我們將聞名於世,並能賺大筆的錢。”於是,這一對陰和陽便一同往前走,想著怎麼征服世界。

不一會兒,他們遇到了固件(firmware,硬件和軟件結合在一起的部件,如IC卡--譯注),他衣衫褴褛,手裡拄著根帶刺的拐杖,蹒跚地走著。固件對他們說:“道存在於陰、陽之外。它默默無聞,靜如止水。它不追求名譽,所以沒人知道它的存在;它不追求財富,因其自身完整圓滿。它存在於空間和時間之外。”

軟件和硬件,自覺慚愧,掉頭回家去了。

第九章 尾聲

編程大師如是說:

“現在該是你出師的時侯了。”


Copyright © Linux教程網 All Rights Reserved