一、無名師與萬行碼
無名師曾對來訪的程式員說:“Unix傳統上認為,一行shell指令碼勝過萬行C程式。”
這個程式員自以為對C極其精通,說:“這不可能。UNIX核心正是用C實現的。”
無名師回道:“確是如此。不過,UNIX傳統上認為,一行shell指令碼勝過萬行C程式。“
程式員頗為沮喪:”但是在C中我們可領會到尊者Ritchie的智慧。我們與作業系統和機器合而為一,可以擷取無與倫比的效能。”
無名師回道:“誠如你言。不過,Unix傳統上認為,一行shell指令碼勝過萬行C程式。”
程式員冷笑著想憤然離去。無名師向學生Nubi頷首示意,Nubi在黑板上寫下一行shell指令碼,問道:“尊敬的程式員,看看這行管道,用純C實現,是不是要一萬行C代碼?”
程式員沉吟念誦。最終他承認如此。
“你需要多長時間來實現和調試那個C程式?”Nubi問道。
“很長”,來訪的程式員承認。“但傻子才會幹這個而不去完成更有價值的任務。”
“那麼誰更瞭解Unix傳統?”無名師問道。“是寫一萬行代碼的,還是看到任務的無謂而不去編碼的?”
聽到此,程式員眼中一亮。
二、無名師與指令碼狂
無名師和學生吃早飯時,從駭客大陸來了個陌生訪客。
“Ihear y00 are very l33t,”他說。“Pl33z teach m3 all y00 know”。(我聽說你很牛,請把你會的都教給我。)
無名師的學生面面相覷,都沒聽懂這類粗鄙言語。無名師微笑道:“你想弄懂Unix?”
“I want to b3 a wizard hax0r”,陌生人回答,“and 0wn ever3one's b0xen。”(我想當個頂尖駭客,能掌握所有人的機器。)
“我不教這個”,無名師答道。
陌生人很激動。“D00d, y00 r nothing but a p0ser。”,他說。“If y00 n00 anything, y00 wud t33ch m3。”(哥們兒,敢情你沒真本事啊,你要知道點兒東西就教給我了。)
“有條路,”無名師說,“可以將你帶入真知。”他在紙上寫了個IP地址。“黑掉這台機器,這對你來說應該不費什麼力氣,它的管理員不稱職。回來後告訴我你發現了什麼。“
陌生人鞠了一躬就離開了。無名師把他的早飯吃完。
幾天過去了,幾個月過去了。沒人再想起陌生人。
數年過去了,駭客大陸來的陌生人回來了。
”你混蛋!“他說,”我黑掉了那台機器,你說的沒錯,太容易了。但是我被FBI抓起來扔進監獄了。“
”好“,無名師說,”你可以繼續下一課了。“他在另一張紙上寫了個IP地址交給陌生人。
”你瘋了?“陌生人喊道。”經過這事,我再也不黑別人的機器了。”
無名師臉現微笑。“這裡就是”,他說,“真知的開始。”
聽到此,陌生人眼中一亮。
三、無名師的雙路論
無名師如是教導學生:
“達摩教義有條準線,這在尊者McIlroy的符咒“做一件事並做好”中得到體現。它強調軟體應當具有簡單一致的行為,這符合Unix慣例,人和其它程式便都很容易想象其心理模型。
“但達摩教義還有另一條準線,體現在尊者Thompson的符咒“有懷疑,用窮舉”中,很多經文都教導我們現在得到的90%,比等不來的100%更有價值。它強調實現的健壯性和簡單性。
“現在告訴我:什麼程式符合Unix傳統?“
想了一會兒後,Nubi沉思道:
“老師,這些教義有衝突。”
“簡單的實現往往對邊緣情況有欠考慮,比如資源耗竭、無法關閉競爭視窗以及在未完成事務中逾時等等。”
“發生邊緣情況時,軟體行為往往不規律、難以猜測。這當然不是Unix傳統。“
無名師頷首同意。
“另一方面,大家都知道精巧的程式很脆弱。更進一步說,每個對邊緣情況的修正往往牽扯到程式的核心演算法,還牽扯處理其它邊緣情況的代碼。”
“於是,對邊緣情況防患於未然、確保描述的簡單性,反而會使得代碼過分複雜、bug成堆、根本無法發售。這當然不是Unix傳統。”
無名師頷首同意。
“那麼,什麼是正確的達摩道?”Nubi問道。
無名師說:
“當鷹飛翔時,它忘記爪子與地面相觸?當虎捕食時,它忘記騰空的一刻?VAX只重三斤!”
聽到此,Nubi眼中一亮。
四、無名師與方法論
無名師和學生Nubi在聖地行走,無名師習慣在晚間為城市和鄉村的Unix新門徒佈道。
一次,聆聽者中混入了一名方法論者。
“最佳化程式時不對熱點進行反覆衡量,就像漁夫把網撒入空湖中。”無名師說。
“那麼,”方法論者說,“管理資源時不持續地衡量你的產能,不也像漁夫將網撒入空湖中嗎?”
“我一次碰到一個漁夫時,他正將網撒入船下的湖中,”無名師說,“他摸了好一會兒船底,像在尋找他的船。”
“但是,”方法論者說,“如果他把網撒入湖中,為什麼還要找船呢?”
“因為他不會遊泳。”無名師答道。
聽到此,方法論者眼中一亮。
五、無名師的GUI論
一晚,無名師和Nubi參加一個程式員的探討會。有個程式員問Nubi和他的老師來自哪看看學校。當得知他們是Unix大道的追隨者時,程式員頗為不屑。
“Unix命令列工具太粗糙太落後”,他譏諷道。“現代的、設計得當的作業系統可以在圖形化使用者介面中做任何事情。”
無名師一言不發,只是指著月亮。旁邊的一條狗對著他的手狂吠。
“我不明白。”程式員說。
無名師依然緘默,指著一幅佛祖像,然後又指著一扇窗。
“你想說什嗎?”程式員問。
無名師指著程式員的頭,接著指著一塊大石。
“請把話說清楚!”程式員要求道。
無名師深深蹙眉,輕拍程式員的鼻子兩下,把他扔到旁邊的垃圾箱中。
程式員試圖從垃圾堆掙紮出來之時,那條狗跑過來在他身上便溺。
此時,程式員眼中一亮。
六、無名師與Unix班
一個Unix狂熱者聽說無名師掌握Unix大道真知,便跑來求教。無名師對他說:
“當尊者Thompson發明Unix時,他並不理解它。隨後他理解了,受益了,不再發明了。“
“當尊者McIlroy發明管道時,他只知道它將傳遞軟體,並不知道它能傳遞思想。”
“當尊者Ritchie發明C時,他將程式員放到緩衝溢出、堆損壞和爛指標bug的地獄中懲罰。”
“說實話,這些尊者又瞎又蠢!”
狂熱者對無名師的用詞極為憤怒。
“這些智者”,他抗議道,“給了我們Unix的大道。我們嘲笑他們,就是混淆是非,比轉世為牲畜和MCSE還不如。”
“你的代碼全無汙點和缺陷?”無名師問。
“不,”狂熱者承認,“沒人不犯獵。”
“這些尊者之智,”無名師說,“就是瞭解自身之愚。”
聽到此,狂熱者眼中一亮。
七、無名師的Unix傳統論
一學生對無名師說:“我們聽說SCO公司把握著純正的Unix。”
無名師頷首。
學生繼續說,“我們還聽說OpenGroup公司也把握著純正的Unix。”
無名師頷首。
“這怎麼可能?”學生問。
無名師答道:
“SCO確實把握著Unix源碼,但是Unix的源碼不是Unix。OpenGroup確實把握著Unix的名稱,但Unix的名稱不是Unix。”
“那麼,什麼是Unix傳統?”學生問。
無名師答道:
“非源碼。非名稱。非思想。非實物。恒變。不變。”
“Unix傳統是簡單和空。正是簡單,正是空,才使得它更強勝颶風。”
“以自然法則前行,在程式員手中,吸納各種優良設計。與之競爭的軟體最終必與之想像;空,空,真空,虛無,萬歲!”
聽到此,學生眼中一亮。
無名師與終端使用者
無名師又一次佈道時,一個終端使用者聽說了他的智慧,跑來求教。
他對無名師三鞠躬。“我欲學習Unix大道,”他說,“但是弄不懂命令列。”
一個旁觀的新門徒開始嘲諷終端使用者,說他腦子一鍋粥,說只有經訓練者、有智慧者才配使用Unix。
無名師撫手不語,命這個嘲笑終端使用者的新門徒前坐,坐到終端使用者身邊。
“告訴我,”他對新門徒說,“你寫過什麼代碼,有過什麼突出設計。”
新門徒囁嚅了兩句,然後沉默了。
無名師轉向終端使用者。“告訴我”,他問,“為何你要尋求大道?”
“我用的軟體並不能令我滿意”,終端使用者答,“既不穩定,也不美觀。聽說Unix之道儘管艱難,但超越一切,我願拋去一切誘餌和虛像。”
“那麼,”無名師問,“你為何想盡辦法讓軟體幫你做事?”
“我是個建築工”,終端使用者答道,“這座城裡的很多房屋都出自我手。”
無名師轉向新門徒。“家貓也能欺負老虎”,無名師說,“但是貓叫永遠比不過虎吼。”
聽到此,新門徒眼中一亮。