編 程 之 道
Geoffrey James
?
? 第一篇 靜寂的空宇
? 第二篇 古代的大師
? 第三篇 設(shè)計(jì)
? 第四篇 編碼
? 第五篇 維護(hù)
? 第六篇 管理
? 第七篇 公司里的學(xué)問
? 第八篇 硬件和軟件
? 第九篇 尾聲
?
?
第一篇 靜寂的空宇
編程大師如是說:
“當(dāng)你有本事奪走我手中的這塊水晶石時,就是你出師的時侯了。”
1.1
在靜寂的空宇里,一種神奇的物質(zhì)形成并誕生了。它立刻便靜止了,獨(dú)自守侯著,豪無動靜,然而又處于永恒的運(yùn)動之中。它是所有程序的源頭,我不知道它的名字,所以我將稱它為編程之道。
?
如果此道是完美的,那些操作系統(tǒng)就是完美的,如果操作系統(tǒng)是完美的,那么編譯程序就是完美的,如果編譯程序是完美的,那么應(yīng)用程序就是完美的。用戶滿意之至--和諧便應(yīng)運(yùn)而生。
?
編程之道流逝遠(yuǎn)去,又乘著晨風(fēng)而歸。
1.2
此道產(chǎn)生了機(jī)器語言,機(jī)器語言又產(chǎn)生了匯編語言,
匯編語言產(chǎn)生了編譯程序,如今有了上萬種的語言。
每一種語言都有其各自的卑微用途。每一種語言都表達(dá)出軟件的陰和陽。每一種語言都在此道之中有其一席之地。
但是,應(yīng)盡量避免用COBOL語言編寫程序。
1.3
宇宙之初有道,道產(chǎn)生了空間和時間。空間和時間便是程序設(shè)計(jì)之陰陽。
不能領(lǐng)悟此道的編程者總是耗盡他們所要編寫的程序的時間和空間;而領(lǐng)悟了此道的編程者卻總有足夠的時間和空間來達(dá)到他們的目標(biāo)。
除此之外,難道還有其它的情形嗎? 1.4
精明的編程者聽說了此道,并遵循它;平庸的編程者聽說了此道,并尋覓它;愚蠢的編程者聽說了此道,卻嘲笑它。
要不是因?yàn)橛谐靶Γ酪簿筒粡?fù)存在了。
最高的聲音最難被聽見。前進(jìn)也是一種倒退。大器晚成。即使是一個完美的程序也仍然會有隱患。
道深藏不露,難于理解。
top
?
?
?
第二篇 古代的大師
編程大師如是說:
“倘若三天不編程,生活將變得毫無意義。”
2.1
老一輩的程序員是神秘的、深奧的。我們沒法揣摩他們的想法,我們所能做的只是描述一下他們的表象。
? 他們是清醒的,就像一只游過水面的狐貍;
? 他們是警惕的,就像一位戰(zhàn)場上的將軍;
? 他們是友善的,就像一位招待客人的女主人;
? 他們是簡單的,就像未經(jīng)刻鑿的木頭;
? 他們還是難以琢磨的,就像黑暗的洞穴中漆黑的池水。
誰能說出他們心中的秘密?
答案只存在于道中。
2.2
計(jì)算機(jī)科學(xué)巨擘圖靈曾經(jīng)夢到他是一臺機(jī)器。當(dāng)他醒來時,他驚嘆道:
“我不知道--我是夢到了自己是臺機(jī)器的圖靈,還是一臺夢到了自己是圖靈的機(jī)器?”
2.3
一家大電腦公司的一名程序員參加了一次軟件研討會。他回來后向經(jīng)理匯報(bào)說:“為其它公司工作的那些程序員都是些什么的人啊?他們行為拙劣,不顧及自己的儀表。他們的頭發(fā)又長又亂,衣服又皺又舊。他們闖進(jìn)我們的會客組,還在我演講時發(fā)生粗魯?shù)男[。”
?
經(jīng)理說:“我本不應(yīng)該讓你去參加這個會議。那些程序員是生活在物質(zhì)世界之外的。他們認(rèn)為生活是荒唐的,一種意外的巧合。他們來去自如。他們只為他們的程序而活著,無憂無慮地活著。為什么要用社會習(xí)俗來約束他們呢?
?
他們活在此道之中。”
2.4
一個禮堂者問大師:“有位程序員,從不構(gòu)思、編寫文檔或測試他的程序,然而所有知道他的人都認(rèn)為他是世界上最棒的程序員。這是為什么呢?”
大師回答說:“那個人掌握了道。他不需要事先進(jìn)行構(gòu)思,當(dāng)系統(tǒng)崩潰時,他不會因此而悶悶不樂,而是心平氣和地接受整個事實(shí)。他還從編寫程序說明文檔的需要之中超脫了出來,不在意是否有人看他的編碼。他也不需要進(jìn)行測試。他的每個程序都完美無缺。寧靜而優(yōu)雅,程序的用途也顯而易見。
?
的的確確,他已經(jīng)進(jìn)入了道的神奇境界。”
top
?
第三篇 設(shè)計(jì)
編程大師如是說:
“當(dāng)程序被測試時,再修改設(shè)計(jì)方案就太遲了。”
3.1
曾經(jīng)有個人去參加一次電腦展示會,每天當(dāng)他進(jìn)入展館時,都對門衛(wèi)說:
“我是個大盜,我偷盜的本領(lǐng)是出了名的。事先警告你,這次展示會也在劫難逃。”
這番話讓門衛(wèi)坐立不安,因?yàn)槔锩嬗袃r值數(shù)百萬美元的電腦設(shè)備,所以他緊緊地盯住這個人。但這個人只是從一個展攤逛到另一個展攤,嘴里輕輕地哼著小曲。
當(dāng)這個人出門時,門衛(wèi)把他拉到一邊,搜查他的衣服,但一無所獲。
第二天,這個人又來了,并對著門衛(wèi)囂張地嚷著:“昨天我滿載而歸,但今天的收獲會更大。”于是,門衛(wèi)盯他盯得更緊了,但仍一無所獲。
在展示會的最后一天,門衛(wèi)再也抑制不住自己的好奇心了。“大盜先生,”門衛(wèi)說,“我被你搞糊涂了,實(shí)在想不明白。請告訴我,你究竟在偷什么?”
這個人笑了。“我在偷想法。”他說。
3.2
曾經(jīng)有位編程大師,喜歡編寫非結(jié)構(gòu)化的編程。一位初學(xué)者試圖模仿他,也開始編寫非結(jié)構(gòu)化的程序。當(dāng)這位徒弟請師父評價他的進(jìn)展時,師父批評了他的做法。他說:“對一位編程高手適合的,對初學(xué)者來說并不一定適合。在超越結(jié)構(gòu)化之前,你必須先領(lǐng)悟道。”
?
3.3
曾經(jīng)有位程序員被派到IBM的軍機(jī)大臣手下工作。軍機(jī)大臣問程序員:“設(shè)計(jì)一個財(cái)務(wù)軟件包,和設(shè)計(jì)一個操作系統(tǒng),哪一個更容易?”
“操作系統(tǒng)。”程序員回答說。
軍機(jī)大臣立刻發(fā)生一種不信任的驚嘆,“與一個復(fù)雜的操作系統(tǒng),一個財(cái)務(wù)軟件包簡直是小巫見大巫。”他說。
“并非如此,”程序員說,“在設(shè)計(jì)一個財(cái)務(wù)軟件包時,編程人員是作為一個中介者在觀念各異的人們之間起作用的:這個軟件必須如何操作,它的報(bào)表必須是什么形式,它必須如何與稅法一致,等等,一個操作系統(tǒng)則不為其外觀所限制。當(dāng)設(shè)計(jì)一個操作系統(tǒng)時,編程人員只要在機(jī)器與人的思維之間尋找一種最簡單的和諧就可以了。這就是為什么操作系統(tǒng)更容易設(shè)計(jì)。”
?
軍機(jī)大臣點(diǎn)點(diǎn)頭,笑了。“說來也是。但要想檢測和糾正其中的錯誤,哪個更容易呢?”
程序員沒有回答。
3.4
一位經(jīng)理到編程大師那里,交給他一份有關(guān)一個新應(yīng)用程序的需求說明。經(jīng)理問編程大師:“如果我分配五個程序員給你,你需要多久能設(shè)計(jì)好這個系統(tǒng)?”
“那將花費(fèi)一年的時間。”大師立刻回答。
“但我們馬上就需要這個系統(tǒng),甚至要求更快!如果我分配十個程序員給你,你需要多長時間?”
大師皺了皺眉頭,“那樣的話,需要兩年。”
“如果我分配一百個程序員給你怎么樣?”
大師聳了聳肩膀,“那么這項(xiàng)設(shè)計(jì)將永遠(yuǎn)無法完成。”他說??
?
?
?
第四篇 編碼
編程大師如是說:
“一個寫得完美的程序是其自身的天堂,而一個寫得糟糕的程序則是其自身的地獄。”
4.1
一個程序應(yīng)當(dāng)是輕盈的、靈活的,它的子程序就像一串珍珠一樣連接著。它的精神和意圖應(yīng)該貫穿始終。在程序中,內(nèi)容既不應(yīng)太多,也不應(yīng)太少;既不應(yīng)該有不需要的循環(huán)結(jié)構(gòu),也不該有冗余的變量;既不缺乏結(jié)構(gòu)性,又不過分僵化。
?
一個程序,無論多么復(fù)雜,都應(yīng)該以一個整體的方式運(yùn)行。程序應(yīng)以其內(nèi)在的邏輯為指引,而非外在形態(tài)。
如果一個程序不能達(dá)到這些要求,它將處于一種雜亂無章的混淆不清的狀態(tài)。唯一的方法就是重寫這個程序。
4.2
一位初學(xué)者問大師:“我有個程序,時靈時不靈。我一直都遵循著編程的規(guī)則,結(jié)果卻整個兒搞糊涂了。這是什么原因呢?”
大師回答說:“因?yàn)槟銢]有領(lǐng)悟道,所以你迷惑不解。只有傻瓜才會指望從人類身上看到理性的行為,你又能指望一臺人類制造的機(jī)器怎么樣呢?計(jì)算機(jī)模仿的是決定論,只有道才是盡善盡美。
?
編程用的那些條條框框式的規(guī)則僅僅是曇花一現(xiàn),只有道才是永恒的。因此,在你受到道的啟發(fā)之前,你必須沉思于道。”
“但是我怎樣才能知道我已經(jīng)受到了啟發(fā)了呢?”初學(xué)者問。
“當(dāng)你的程序運(yùn)行無誤時。”大師回答說。
4.3
一位大師正在向他的一名初學(xué)編程的弟子解釋道的真諦。“此道體現(xiàn)在所有的軟件當(dāng)中--不管它看上去多么無足輕重。”大師說著。
“此道體現(xiàn)在手掌計(jì)算器中嗎?”初學(xué)者問。
“是的。”
“此道在電子游戲中嗎?”初學(xué)者繼續(xù)問。
“此道甚至也體現(xiàn)在電子游戲之中。”大師說。
“那么此道也體現(xiàn)在個人電腦的DOS系統(tǒng)之中嗎?”
大師咳嗽一聲,并稍稍挪動了一下位置。“今天的課就到這里吧。”他說。
4.4
一位項(xiàng)目經(jīng)理手下的一名程序員正編寫軟件。他的手指在鍵盤上飛舞著,在程序的編譯過程中沒有出現(xiàn)任何錯誤信息。程序運(yùn)行起來就像一陣和風(fēng)。
“太好了!”經(jīng)理高興地大叫了起來,“你的技藝簡直是完美無缺。”
“技藝?”程序員說著便從他的終端機(jī)前轉(zhuǎn)過身來,“我遵循的是道--所有的技藝遠(yuǎn)不能及!當(dāng)我剛開始編程時,我眼前看見的是整個問題亂成一團(tuán)。三年之后,我再也看不見這種一團(tuán)糟的情形了。相反,我用了各種各樣的子程序。但現(xiàn)在,我什么也看不見了。我的整個身心存在于一種無形的虛空里,我的知覺是空蕩蕩的。
?
我的精神隨其本能而動,不無原則計(jì)劃就能自由地工作。總而言之,是我的程序自己寫出了自己。誠然,有時會有一些難題。我看見那些難題向我走來,于是我放慢了速度,默默地注視著他們。然后我更改了一行編碼,那些問題就煙消云散了。然后我完成程序的編譯。我靜靜地坐著,讓工作的歡心情舒暢遍布我的全身。我閉上雙眼,歇息片刻,然后退出系統(tǒng)。”
?
經(jīng)理說,“希望我的所有的程序員都這么聰明!”
第五篇 維護(hù)
編程大師如是說:
“即使一個程序只有三行長,總有一天它也不得不需要維護(hù)。”
5.1
一記扇經(jīng)常開啟的門的絞鏈不需要潤滑油。
一條湍急的河流不會變得污濁。
無論是聲音還是想法都不可能在真空中傳播。
軟件如果不用就會腐朽。
這世界真奇妙。
5.2
一個程序員正在編寫他的程序,經(jīng)理問他還需要多長時間完成。
“明天就可以完成。”程序員立刻回答。
“我想你這是不切實(shí)際,”經(jīng)理說,“實(shí)話實(shí)說,這需要多長時間?”
程序員想了一會兒。“我還想加進(jìn)一些新的特色,這需要花至少兩個星期的時間。”他最后說。
“即使那樣也期望過高,”經(jīng)理堅(jiān)持說,“只要你編完程序時告訴我一聲,我也就滿足了。”
程序員答應(yīng)了。
幾年以后,那位經(jīng)理要退休了。在他去退休午餐會的路上。他發(fā)現(xiàn)那個程 序員趴在他的終端機(jī)前睡著了。整個晚上都在忙于編寫那個程序。
5.3
一次一位初學(xué)編程者被指派編寫一個簡單的財(cái)務(wù)軟件包。這位初學(xué)者大張旗鼓地工作了許多天。但當(dāng)他的師父檢查這套程序時,發(fā)現(xiàn)其中包含有一個屏幕編輯器,一套通用圖表程序,一個人工智能界面,然而卻沒有任何財(cái)務(wù)方面的東西。
?
當(dāng)師父問及此事時,初學(xué)者顯得憤憤不平。“不要這樣沒有耐心嘛,”他說,“我最后加些財(cái)務(wù)的素材進(jìn)去就是了。”
5.4
難道一位好農(nóng)民會漏掉他所種的一株莊稼嗎?
難道一位好老師會放棄哪怕是最差的學(xué)生嗎?
難道一位好父親會允許哪一個孩子挨餓嗎?
難道一位好程序員會不愿維護(hù)他的程序嗎?
top
?
?
?
第六篇 管理
編程大師如是說:
“讓程序員多而經(jīng)理少--然后生產(chǎn)效率就會高。”
6.1
當(dāng)經(jīng)理們沒完沒了地開會時,程序員就寫些游戲玩;當(dāng)財(cái)務(wù)主管們談到季度利潤時,開發(fā)用的預(yù)算馬上就要被削減;當(dāng)資深科學(xué)家們談?wù)撍{(lán)藍(lán)的天空時,馬上就會風(fēng)起云涌。
其實(shí),這并不是編程之道。
當(dāng)經(jīng)理們忠于職守時,游戲程序就會被擱置到一邊;財(cái)務(wù)主管們制訂出長 遠(yuǎn)的計(jì)劃時,和諧秩序?qū)⒑芸旎謴?fù);當(dāng)資深科學(xué)家們著手于眼前的問題時,這些問題不久就會解決。
其實(shí),這才是編程之道。
6.2
為什么程序員沒有效率?
因?yàn)樗麄兊臅r間浪費(fèi)在開會上。
為什么程序員很難管束?
因?yàn)楣芾韺佣喙荛e事。
為什么程序員接二連三地辭職?
因?yàn)樗麄兊臒崆橐押谋M。
在糟糕的管理之下工作,他們不再敬業(yè)。
6.3
一位經(jīng)理即將被解職,但此時他手下的一名程序員發(fā)明了一個新的程序。這個程序流行起來,并且極為暢銷。結(jié)果,經(jīng)理又回到了原來的崗位上。
經(jīng)理試圖要發(fā)給那位程序員一筆資金,但程序員拒絕了。他說:“我寫這個程序,因?yàn)槲艺J(rèn)為這是個很有意思的想法。我并不期望有所回報(bào)。”
經(jīng)理聽到這話,評論說:“這位程序員雖然身居卑位,卻能很好地理解一位雇員應(yīng)盡的職責(zé)。讓我們提拔他到管理顧問的高位上吧!”
然而,接到通知后,那位程序員又一次拒絕了。他說:“我在屬于我的位置上,才能較好地編程。如果我被提升了,除了浪費(fèi)每個人的時間,我將一事無成。現(xiàn)在我可以走了嗎?我還有一個程序要編呢。”
?
6.4
一位經(jīng)理走過來對他的程序員們說:“關(guān)于你們的上班時間:你們要早上九點(diǎn)鐘到,下午五點(diǎn)鐘下班。”聽了這話,所有的程序員都很氣憤,其中有幾位要當(dāng)場辭職。
于是,經(jīng)理只好又說:“好吧,那樣的話,你們可以自己安排上班時間,只要你們能按時完成項(xiàng)目。”程序員們滿意了。以后,他們中午來到辦公室,一起工作到凌晨。
top
?
第七篇 公司里的學(xué)問
編程大師如是說:
“你可以向一位公司總裁演示一個程序,但你無法使他學(xué)會使用電腦。”
7.1
一位初學(xué)者問大師:“在東方(此處喻指美國的東海岸,有許多大公司的總部--譯注),有一個不尋常的樹狀結(jié)構(gòu),人們稱它為‘公司總部’。它的副總裁們和財(cái)務(wù)主管們的數(shù)量之大,使它鼓得不成開關(guān)。它簽發(fā)大師的便函,每份上都寫著”歸去”“來兮”,卻沒有人知道那是什么意思。它的那些分支機(jī)構(gòu)每年都要換新的名字,但都毫無價值。如此一個不正常的實(shí)體怎么能繼續(xù)存在呢?”
?
大師回答說:“你探察這個龐大的鄧因其沒有合理的用途而心神不定。難道你不能從它那無盡的回旋中得到樂趣嗎?你不會享受一下在它所蔽護(hù)的部分里的編程的那種無憂無慮的輕松嗎?你為什么要因?yàn)樗翢o用處而心煩意亂呢?”
?
7.2
在東方,有一條大魚,比其它所有的魚都要大。它變成了一只鳥,它的翅膀就像云朵一個布滿了天空。當(dāng)這只鳥飛過陸地時,它帶來了“公司總部”的消息,像蜻蜓點(diǎn)水一樣把這個消息丟在了那些程序員中間。然后這只鳥駕著風(fēng),背負(fù)藍(lán)天,返回了家園。
?
初學(xué)編程者驚奇地盯著那只鳥,因?yàn)樗緹o法理解;平庸的程序員畏懼那只鳥的到來,因?yàn)樗ε馒B兒帶來的消息;而編程大師卻仍然在他的終端機(jī)前工作,因?yàn)樗恢滥侵圾B來了又去了。
?
7.3
象牙塔里的魔術(shù)師帶來了他最新的發(fā)明,要讓編程大師檢驗(yàn)一下。魔術(shù)師把一只大黑箱子推進(jìn)辦公室,大師靜靜地等侯著。
“這是一臺集成的、分布式的、通用的工作站,”魔術(shù)師開始,“運(yùn)用人類工程學(xué)原理,使用享有專利的操作系統(tǒng)、第六代評議和多重狀態(tài)用戶界面而設(shè)計(jì)完成。建造這臺工作站,花了我?guī)装倜謳啄甑臅r間。這不足以令人驚奇嗎?”
?
大師輕輕地?fù)P了揚(yáng)眉毛。“這的確令人驚奇。”他說。
“公司總部已經(jīng)命令,”魔術(shù)師繼續(xù)說,“每個人都得使用這臺工作站作為操作平臺來設(shè)計(jì)新的程序。你同意嗎?”
“當(dāng)然同意,”大師說,“我馬上就把它運(yùn)到數(shù)據(jù)中心去。”于是魔術(shù)師興高采烈地回到了象牙塔去了。
幾天后,一位初學(xué)者走進(jìn)大師的辦公室問道:“我找不到我的新程序清單了。你知道它會放在哪兒嗎?”
“知道,”大師回答說,“那些清單就堆放在數(shù)據(jù)中心的臺子(platform“可以指操作平臺”,也可以指普通的臺子--譯注)上。”
7.4
編程大師從不懼怕在設(shè)計(jì)不同程序的崗位間調(diào)來調(diào)去;管理層的變動不可能對他有所損害;他不會被解雇,即使項(xiàng)目取消了。這是為什么呢?因?yàn)樗赜谐伞暗馈薄?
top
?
?
?
第八篇 硬件和軟件
編程大師如是說:
“沒有風(fēng),草兒靜止不動;沒有軟件,硬件則無所為用。”
8.1
一位初學(xué)者問大師:“我覺察到有一家電腦公司比其它所有的公司都要大得多。它在中遙遙領(lǐng)先,就如同鶴立雞群一般。它的任意一個部門都可以組成一個完整的企業(yè)。這是為什么呢?”
?
大師回答說:“你怎么問這么愚蠢的問題呢?因?yàn)槟羌夜敬螅运痛舐铩H绻鼉H僅生產(chǎn)硬件,沒人愿買;如果它僅僅生產(chǎn)軟件,沒人愿用;如果它僅僅維護(hù)一下系統(tǒng),人們將把它當(dāng)作是傭人。然而,因?yàn)樗阉羞@些東西都結(jié)合了起來,它便搖身一變,被人們看作是諸神之一。不費(fèi)吹灰之力,它便能取勝。
?
8.2
一天,一位大師從初學(xué)編程者身邊經(jīng)過,他發(fā)現(xiàn)這位初學(xué)者正在全神貫注于掌上電腦游戲。“對不起,”他說,”我可以看一下嗎?”
初學(xué)者立刻緊張起來,把那個玩意兒遞給了大師。“我知道這種設(shè)備提供了三個游戲級別:容易、中等和高難,”大師說,“然而每個這樣的設(shè)備都有另一個級別,在這一級,游戲機(jī)既不想贏人,也不想被人打敗。”
?
“請問,尊敬的大師,”初學(xué)者懇求道,“怎樣才能找到這個奇妙的級別設(shè)置呢?”
大師把那個玩意兒扔到地上,踩到粉碎。突然間,那個初學(xué)者明白了什么。
8.3
曾經(jīng)有一個程序員,擅長在微電腦上編程,“瞧,我在這里過得多好呀,”他對另一位來訪的程序員說,這位程序員是在大型主機(jī)上工作的,“我有自己的操作系統(tǒng)和文件存儲設(shè)備,我不必和其他任何人分享我的資源。這里的軟件自相一致,很容易使用。你為何不辭去現(xiàn)在的工作,加入到我這里來呢?”
?
于是,主機(jī)程序員開始向他的這位朋友描繪他的系統(tǒng):“主機(jī)就像一位陷入沉思的圣人一樣,端坐在數(shù)據(jù)中心。它的磁盤器首尾聲相連,就如同機(jī)器的海洋。這里的軟件既像鉆石一樣能多面反射光芒,又像原始叢林一樣復(fù)雜難測。這里的程序,各具特色,它們像湍急的河流穿過系統(tǒng)。這就是我樂于此處的原因。
?
微電腦程序員聽到這里,陷入了沉默。但這兩位程序員至死都保持著友誼。
8.4
在去硅谷的路上,硬件碰上了軟件。軟件說:“你是陰,我是陽。如果我們攜手同路,我們將聞名于世,并能賺大筆的錢。”于是,這一對陰和陽便一同往前走,想著怎么征服世界。
?
不一會兒,他們遇到了固件(firmware,硬件和軟件結(jié)合在一起的部件,如IC卡--譯注),他衣衫襤褸,手里拄著根帶刺的拐杖,蹣跚地走著。固件對他們說:“道存在于陰、陽之外。它默默無聞,靜如止水。它不追求名譽(yù),所以沒人知道它的存在;它不追求財(cái)富,因其自身完整圓滿。它存在于空間和時間之外。”
?
軟件和硬件,自覺慚愧,掉頭回家去了。