無名師的Unix心傳

一、無名師與萬行碼
無名師曾對來訪的程序員說:“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之道盡管艱難,但超越一切,我願拋去一切誘餌和虛像。”
“那麼,”無名師問,“你爲何想盡辦法讓軟件幫你做事?”
“我是個建築工”,最終用戶答道,“這座城裏的很多房屋都出自我手。”
無名師轉向新門徒。“家貓也能欺負老虎”,無名師說,“但是貓叫永遠比不過虎吼。”

聽到此,新門徒眼中一亮。



評論解讀Ⅰ

解禪無名師

   1.無名師與萬行碼描述了程序設計的經濟原則:寧可花機器一分,不花程序員一秒。也就是說,儘量使用機器完成更多地層次的工作。這條原則直接引出了生成原則:避免手工hack,儘量編寫程序去生成程序。

 

    2.無名師與腳本狂則描述了一條黑客準則,就像W.Richard.Stevens一樣,作爲世界上最優秀的黑客之一,生前不曾著文攻死後卻讓全世界的頂尖黑客擊們專門著文懷念,技術應該僅僅是一種技術,而不應成爲一種手段。

    3.無名師的雙路論則講述了程序設計的透明性原則和健壯原則。透明行原則要求設計要可見,以便審查和調試。而健壯原則則力求程序的健壯,而做到這一點的方法就是理解程序的邏輯,而做到讓程序的內部邏輯易於理解,方法就是堅持透明性原則——二者其實絲毫不矛盾。

    4.無名師與 方法論描述的是程序設計的優化原則:雕琢之前要現有原型,跑之前先學會走。用Domald Knuth的話說就是過早優化是萬惡之源。這也是Unix世界的一條非常明確的傳統:先製作原型,再精細雕琢,優化之前先確保能用。“極限編程”宗師 Kent Beck則從另一種不同的文化將這一點表述爲:先求運行,再求正確,最後求快。

 

    5.無名師的GUI這一則確實比較難以理解,不過我認爲這一則要求我們要分清事物的表象和本質。在這則故事中,“月光”、“佛”、“窗”、“大石”指的是圖形化的東西,但是無名師緘默的時候程序員根本不可得知無名師的意思,也就是說,圖形界面也有無法表達的東西。而當程序員從垃圾堆爬出時,那條狗卻對着他便溺,或許是說,如果分不清事物的表象和本質的話,那麼只會和那條狗一樣被表象所迷惑。表象可能無法表達事物的正確信息,只有把握本質,才能真正的認知。

 

    6. 無名師與Unix狂,在原文其實已經有答案了——“這些尊者之智,”無名師說,“就是了解自身之愚。”

 

    7.無名師的Unix傳統論則是說,真正的掌握不是對工具的掌握,也不是是對思想的掌握。因爲工具是變化的,思想也不是永恆不變的,只有擺脫工具和各種思想的束縛,做到真正的 “空”,不斷吸納優良的設計思想纔是至上的設計。

 

    8.無名師與最終用戶則表述了和第五則大致的思想:事物的本質纔是決定事物的最終要因素,無論表象上怎樣掩飾,都無法遮掩事物的本質對周圍環境的影響。


評論解讀Ⅱ

我是圍繞着順序來理解的,如下:

第一段:

1 無名師與萬行碼

2 無名師與腳本狂

1講的是一行shell可能由多個命令組成,每個命令由多行代碼組成

2 講的是一件事情可能由很多shell腳本組成,典型的就是由黑客和管理員使用,而最後的那個黑客會不會轉成管理員呢? 


第二階段:

無名師的雙路論

2. 無名師與方法論

1 雙路論,是爲了陳述unix致簡的哲學,但不能過度,所以要留有空隙。

2 方法論比雙路應該多很多。 這個感覺應該是稱託前面的。


第三階段: 

無名師的GUI

2. 無名師與最終用戶

在unix編程藝術的開頭,大致意思是這樣的,一種系統追求最終的視覺體現,一種系統追求7*24小時無故障運行. 這裏的1就像第一種系統的客戶,2就像第二種系統的客戶一樣。所求不同。而Linux無疑是追求效率,性能的。 而Windows是追求方便易用的,而Mac只爲了視覺效果而生,當然,他不效率,也不方便用。


第四階段:

無名師的Unix傳統論

2. 無名師與Unix狂

1也許只是稍微提升下unix的境界,2則是發揚了kiss法則,提升到相當之高的境界,瞭解自身之愚。而現實生活裏能達到2的人,無論在哪個領域裏,都是很強大的人。能說出一件事物的所有的不足和優點,你說這種人可怕不? 如果一個人分析自己,也能達到這樣的水準。 應該會成爲相當有能力的人吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章