大教堂和市集

大教堂和市集
 
Eric Raymond
HansB翻譯


一. 大教堂和市集


  Linux的影響是非常巨大的。甚至在5年以前,有誰能夠想像一個世界級的操作系統能夠僅僅用細細的Internet連接起來的散佈在全球的幾千個開發人員有以業餘時間來創造呢?

  我當然不會這麼想。在1993年早期我開始注意Linux時,我已經參與Unix和自由軟件開發達十年之久了。我是八十年代中期GNU最早的幾個參與 者之一。我已經在網上發佈了大量的自由軟件,開發和協助開發了幾個至今仍在廣泛使用的程序(Nethack,Emacs VC和GND模式,xlife等等)。我想我知道該怎樣做。


  Linux推翻了許多我認為自己明白的事情。我已經宣揚小工具、快速原型和演進式開發的Unix福音多年了。但是我也相信某些重要的複雜的事情需要更 集中化的,嚴密的方法。我相信多數重要的軟件(操作系統和象Emacs一樣的真正大型的工具)需要向建造大教堂一樣來開發,需要一群於世隔絕的奇才的細心 工作,在成功之前沒有beta版的發布。
Linus Torvalds的開發風格(儘早盡多的發布,委託所有可以委託的事,對所有的改動和融合開放)令人驚奇的降臨了。這裡沒有安靜的、虔誠的大教堂的建造工 作——相反,Linux團體看起來像一個巨大的有各種不同議程和方法的亂哄哄的集市(Linux歸檔站點接受任何人的建議和作品,並聰明的加以管理),一 個一致而穩定的系統就像奇蹟一般從這個集市中產生了。


  這種設計風格確實能工作,並且工作得很好,這個事實確實是一個衝擊。在我的研究過程中,我不僅在單個工程中努力工作,而且試圖理解為什麼Linux世界不僅沒有在一片混亂中分崩離析,反而以大教堂建造者們不可想像的速度變得越來越強大。


  到了1996年中,我想我開始理解了。我有一個極好的測試我的理論的機會,以一個自由軟件計劃的形式,我有意識的是用了市集風格。我這樣做了,並取得了很大的成功。


  在本文的餘下部分,我將講述這個計劃的故事,我用它來明確一些自由軟件高效開發的格言。並不是所有這些都是從Linux世界中學到的,但我們將看到 Linux世界給予了它們一個什麼樣的位置。如果我是正確的,它們將使你理解是什麼使Linux團體成為好軟件的源泉,幫助你變得更加高效。


二. 郵件必須得通過


  1993年以前我在一個小的免費訪問的名為Chester County InterLink的ISP的做技術工作,它位於Pennsylvania的West Chester。(我協助建立了CCIL,並寫了我們獨特的多用戶BBS系統——你可以telnet到locke.ccil.org來檢測一下。今天它在 十九條線上支持三千的用戶)。這個工作使我可以一天二十四小時通過CCIL的56K專線連在網上,實際上,它要求我怎麼做!


  所以,我對Internet email很熟悉。因為複雜的原因,很難在我家裡的機器(snark.thyrsus.com)和CCIL之間用SLIP工作。最後我終於成功了,但我發 現不得不時常telnet到locke來檢查我的郵件,這真是太煩了。我所需要的是我的郵件發送到snark,這樣biff(1)會在它到達時通知我。


  簡單地sendmail的轉送功能是不夠的,因為snark並不是總在網上而且沒有一個靜態地址。我需要一個程序通過我的SLIP連接把我的本地發送的郵件拉過來。我知道這種東西是存在的,它們大多使用一個簡單的協議POP(Post Office Protocol)。而且,locke的BSD/OS操作系統已經自帶了一個POP3服務器。


  我需要一個POP3客戶。所以我到網上去找到了一個。實際上,我發現了三、四個。我用了一會pop-perl,但它卻少一個明顯的特徵:抽取收到的郵件的地址以便正確回覆。


  問題是這樣的:假設locke上一個叫「joe」的人向我發了一封郵件。如果我把它取到snark上準備回覆時,我的郵件程序會很高興地把它發送給一個不存在的snark上的「joe」。手工的在地址上加上「@ccil.org」變成了一個嚴酷的痛苦。


  這顯然應是計算機替我做的事。(實際上,依據RFC1123的5.2.18節,sendmail應該做這件事)。但是沒有一個現存的POP客戶知道怎樣做!於是這就給我們上了第一課:

  1.每個好的軟件工作都開始於搔到了開發者本人的癢處。

  也許這應該是顯而易見的(「需要是發明之母」長久以來就被證明是正確的),但是軟件開發人員常常把他們的精力放在它們既不需要也不喜歡的程序,但在Linux世界中卻不是這樣——這解釋了為什麼從Linux團體中產生的軟件質量都如此之高。


  那麼,我是否立即投入瘋狂的工作中,要編出一個新的POP3客戶與現存的那些競爭呢?才不是哪!我仔細考察了手頭上的POP工具,問自己「那一個最接近我的需要?」因為:
  2.好程序員知道該寫什麼,偉大的程序員知道該重寫(和重用)什麼。


  我並沒有聲稱自己是一個偉大的程序員,可是我試著效仿他們。偉大程序員的一個重要特點是建設性的懶惰。他們知道你是因為成績而不是努力得到獎賞,而且從一個好的實際的解決方案開始總是要比從頭幹起容易。


  例如,Linux並不是從頭開始寫Linux的。相反的它從重用Minix(一個386機型上的類似Unix的微型操作系統)的代碼和思想入手。最後所有的Minix代碼都消失或被徹底的重寫了,但是當它們在的時候它為最終成為Linux的雛形做了鋪墊。


  秉承同樣的精神,我去尋找良好編碼的現成的POP工具,用來作為基礎。


  Unix世界中的代碼共享傳統一直對代碼重用很友好(這正是為什麼GNU計劃不管Unix本身有多麼保守而選取它作為基礎操作系統的原因)。 Linux世界把這個傳統推向技術極限:它有幾個T字節的源代碼可以用。所以在Linux世界中花時間尋找其他幾乎足夠好的東西,會比在別處帶來更好的結 果。


  這也適合我。加上我先前發現的,第二次尋找找到了9個候選者——fetchPOP,PopTart,get-mail,gwpop,pimp,pop-perl,popc,popmail 和 upop)。我首先選定的是「fetchpop」。我加入了頭標重寫功能,並且做了一些被作者加入他的1.9版中的改進。


  但是幾個星期之後,我偶然發現了Carl Harris寫的「popclient」的代碼,然後發現有個問題,雖然fetchpop有一些好的原始思想(比如它的守護進程模式),它只能處理 pop3,而且編碼的水平相當業餘(Seung-Hong是個很聰明但是經驗不足的程序員),Carl的代碼更好一些,相當專業和穩固,但他的程序缺少幾 個重要的相當容易實現的fetchpop的特徵(包括我自己寫的那些)。


  繼續呢還是換一個? 如果換一個的話,作為得到一個更好開發基礎的代價,我就要扔掉我已經有的那些代碼。


  換一個的一個實際的動機是支持多協議,pop3是用的最廣的郵局協議,但並非唯一一個,Fetchpop和其餘幾個沒有實現POP2.RPOP,或者APOP,而且我還有一個為了興趣加入IMAP(Internet Message Access Protocol,最近設計的最強大的郵局協議)的模糊想法。


  但是我有一個更加理論化的原因認為換一下會是一個好主意,這是我在Linux很久以前學到的:

  3.「計劃好拋棄,無論如何,你會的」(Fred Brooks,《神秘的人月》第11章)


  或者換句話說,你常常在第一次實現一個解決方案之後才能理解問題所在,第二次你也許才足夠清楚怎樣做好它,因此如果你想做好,準備好推翻重來至少一次。


  好吧(我告訴自己),對fetchpop的嘗試是我第一次的嘗試,因此我換了一下。


  當我在1996年6月25日把我第一套popclient的補丁程序寄給Carl Harris之後,我發現一段時間以前他已經對popclient基本上失去了興趣,這些代碼有些陳舊,有一些次要的錯誤,我有許多修改要做,我們很快達 成一致,我來接手這個程序。不知不覺的,這個計劃擴大了,再也不是我原先打算的在已有的pop客戶上加幾個次要的補丁而已了,我得維護整個的工程,而且我 腦袋裡湧動著一些念頭要引起一個大的變化。


  在一個鼓勵代碼共享的軟件文化裡,這是一個工程進化的自然道路,我要指出:

  4. 如果你有正確的態度,有趣的問題會找上你的,但是Carl Harris的態度甚至更加重要,他理解:

  5.當你對一個程序失去興趣時,你最後的責任就是把它傳給一個能幹的後繼者。


  甚至沒有商量,Carl和我知道我們有一個共同目標就是找到最好的解決方案,對我們來說唯一的問題是我能否證明我有一雙堅強的手,他優雅而快速的寫出了程序,我希望輪到我時我也能做到。

三. 擁有用戶的重要性


  於是我繼承了popclient,同樣重要的是,我繼承了popclient的用戶基礎,用戶是你所擁有的極好的東西,不僅僅是因為他們顯示了你正在滿足需要,你做了正確的事情,如果加以適當的培養,他們可以成為合作開發者。


  Unix傳統另一有力之處是許多用戶都是黑客,因為源優碼是公開的,他們可以成為高效的黑客,這一點在Linux世界中也被推向了令人高興的極致,這 對縮短調試時間是極端重要的,在一點鼓勵之下,你的用戶會診斷問題,提出修訂建議,幫你以遠比你期望快得多的速度的改進代碼。


  6. 把用戶當做協作開發者是快速改進代碼和高效調試的無可爭辯的方式。


  這種效果的力量很容易被低估,實際上,幾乎所有我們自由軟件世界中的人都強烈低估了用戶可以多麼有效地對付系統複雜性,直到Linus讓我們看到了這一點。


  實際上,我認為Linus最聰明最了不起的工作不是創建了Linux內核本身,而是發明了Linux開發模式,當我有一次當著他的面表達這種觀點時, 他微笑了一下,重複了一句他經常說的話:「我基本上是一個懶惰的人,依靠他人的工作來獲取成績。」象狐狸一樣懶惰,或者如Robert Heinlein所說,太懶了而不會失敗。


  回顧起來,在GNU Emacs Lisp庫和Lisp代碼集中可以看到Linux方法的成功,與Emacs的C內核和許多其他FSF的工具相比,Lisp代碼庫的演化是流動性的和用戶驅 動的,思想和原型在達到最終的穩定形式之前往往要重寫三或四次,而且經常利用Internet的鬆散合作。


  實際上,我自己在fetchmail之前最成功的作品要算Emacs VC模式,它是三個其他的人通過電子郵件進行的類似Linux的合作,至今我只見過其中一個人(Richard Stallman),它是SCCS、RCS和後來的CVS的前端,為Emacs提供「one-touch」版本控制操作,它是從一個微型的、粗糙的別人寫好的sccs.el模式開始演化的,VC開發的成功不像Emacs本身,而是因為Emacs Lisp代碼可以很快的通過發佈/測試/改進的過程。


  (FSF的試圖把代碼放入GPL之下的策略有一個未曾預料到的副作用,它讓FSF難以採取市集模式,因為他們認為每個想貢獻二十行以上代碼的人都必須 得到一個授權,以使受到GPL的代碼免受版權法的侵擾,具有BSD和MITX協會的授權的用戶不會有這個問題,因為他們並不試圖保留那些會使人可能受到質 詢的權力)。


四. 早發佈、常發佈


  儘量早儘量頻繁的發布是Linux開發模式的一個重要部分,多數開發人員(包括我)過去都相信這對大型工程來說是個不好的策略,因為早期版本都是些充滿錯誤的版本,而你不想耗光用戶的耐心。

  這種信仰強化了建造大教堂開發方式的必要性,如果目標是讓用戶儘可能少的見到錯誤,那你怎能不會僅僅每六個月發佈一次(或更不經常),而且在發佈之間像一隻狗一樣辛勤「捉蟲」呢? Emacs C內核就是以這種方式開發的,Lisp庫,實際上卻相反,因為有一些有FSF控制之外的Lisp庫,在那裡你可以獨立於Emacs發佈週期地找尋新的和開發代碼版本。


  這其中最重要的是Ohio州的elisp庫,預示了今天的巨大的Linux庫的許多特徵的精神,但是我們很少真正仔細考慮我們在做什麼,或者這個庫的 存在指出了FSF建造教堂式開發模式的什麼問題,1992年我曾經做了一次嚴肅的嘗試,想把Ohio的大量代碼正式合併到Emacs的官方Lisp庫中, 結果我陷入了政治鬥爭中,徹底失敗了。


  但是一年之後,在Linux廣泛應用之後,很清楚,一些不同的更加健康的東西誕生了,Linus的開發模式正好與建造教堂方式相反,Sunsite和tsx-11的庫開始成長,推動了許多發佈。所有這些都是聞所未聞的頻繁的內核系統的發布所推動的。


  Linus以所有實際可能的方式把它的用戶作為協作開發人員。


  7. 早發佈、常發佈、聽取客戶的建議

  Linus的創新並不是這個(這在Unix世界中是一個長期傳統),而是把它擴展到和他所開發的東西的複雜程度相匹配的地步,在早期一天一次發佈對他 來說都不是罕見的!而且因為他培育了他的協作開發者基礎,比其他任何人更努力地充分利用了Internet進行合作,所以這確實能行。


  但是它是怎樣進行的呢?它是我能模仿的嗎?還是這依賴於Linus的獨特天才?


  我不這樣想,我承認Linus是一個極好的黑客(我們有多少人能夠做出一個完整的高質量的操作系統內核?),但是Linux並不是一個令人敬畏的概念 上的飛躍,Linus不是(至少還不曾是)象Richard stallman或James Gosling一樣的創新天才,在我看來,Linus更像一個工程天才,具有避免錯誤和開發失敗的第六感覺,掌握了發現從A點到B點代價最小的路徑的決 竅,確實,Linux的整個設計受益於這個特質,並反映出Linus的本質上保守和簡化設計的方法。


  如果快速的發布和充分利用Internet不是偶然而是Linus的對代價最小的路徑的洞察力的工程天才的內在部分,那麼他極大增強了什麼?他創建了什麼樣的方法?


  問題回答了它自己,Linus保持他的黑客用戶經常受到激勵和獎賞:被行動的自我滿足的希望所激勵,而獎賞則是經常(甚至每天)都看到工作在進步。


  Linus直接瞄準了爭取最多的投入調試和開發的人時,甚至冒代碼不穩定和一旦有非常棘手的錯誤而失去用戶基礎的險,Linus似乎相信下面這個:

  8. 如果有一個足夠大的beta測試人員和協作開發人員的基礎,幾乎所有的問題都可以被快速的找出並被一些人糾正。


  或者更不正式的講:「如果有足夠多的眼睛,所有的錯誤都是淺顯的」(群眾的眼睛是雪亮的),我把這稱為「Linus定律」。


  我最初的表述是每個問題「對某些人是透明的」,Linus反對說,理解和修訂問題的那個人不一定非是甚至往往不是首先發現它的人,「某個人發現了問題」,他說,「另一個理解它,我認為發現它是個更大的挑戰」,但是要點是所有事都趨向於迅速發生。


  我認為這是建造教堂和集市模式的核心區別,在建造教堂模式的編程模式看來,錯誤和編程問題是狡猾的、陰險的、隱藏很深的現象,花費幾個月的仔細檢查, 也不能給你多大確保把它們都挑出來的信心,因此很長的發布週期,和在長期等待之後並沒有得到完美的版本發佈所引起的失望都是不可避免的。


  以市集模式觀點來看,在另一方面,我們認為錯誤是淺顯的現象,或者至少當暴露給上千個熱切的協作開發人員,讓他們來對每個新發佈進行測試的時候,它們 很快變得淺顯了,所以我們經常發佈來獲得更多的更正,作為一個有益的副作用,如果你偶爾做了一個笨拙的修改,也不會損失太多。也許我們本不應該這樣的驚 奇,社會學家在幾年前已經發現一群相同專業的(或相同無知的)觀察者的平均觀點比在其中隨機挑選一個來得更加可靠,他們稱此為「Delhpi效 應」,Linus所顯示的證明在調試一個操作系統時它也適用——Delphi效應甚至可以戰勝操作系統內核一級的複雜度。


  我受Jeff Dutky (dutky @ wam.umd.edu)的啟發指出Linus定律可以重新表述為「調試可以並行」,Jeff觀察到雖然調試工作需要調試人員和對應的開發人員相交流,但 它不需要在調試人員之間進行大量的協調,於是它就沒有陷入開發時遇到的平方複雜度和管理開銷。

  在實際中,由於重複勞動而導致的理論上的喪失效率的現象在Linux世界中並不是一個大問題,「早發佈、常發佈策略」的一個效果就是利用快速的傳播反饋修訂來使重複勞動達到最小。


  Brooks甚至做了一個與Jeff相關的更精確的觀察:「維護一個廣泛使用的程序的成本一般是其開發成本的40%,奇怪的是這個成本受到用戶個數的強烈影響,更多的用戶發現更多的錯誤」(我的強調)。

  更多的用戶發現更多的錯誤是因為更多的用戶提供了更多測試程序的方法,當用戶是協作開發人員時這個效果被放大了,每個找尋錯誤的人都有自己稍微不同的 感覺和分析工具,從不同角度來看待問題。「Delphi效應」似乎因為這個變體工作變得更加精確,在調試的情況下,這個變體同時減小了重複勞動。


  所以加入更多的beta測試人員雖不能從開發人員的P.O.V中減小「最深」的錯誤的複雜度,但是它增加了這樣一種可能性,即某個人的工具和問題正好匹配,而這個錯誤對這個人來說是淺顯的。


  Linus也做了一些改進,如果有一些嚴重的錯誤,Linux內核的版本在編號上做了些處理,讓用戶可以自己選擇是運行上一個「穩定」的版本,還是冒 遇到錯誤的險而得到新特徵,這個戰略還沒被大多數Linux黑客所倣傚,但它應該被倣傚,存在兩個選擇的事實讓二者都很吸引 人。

  
五. 什麼時候玫瑰不是玫瑰?


  在研究了Linus的行為和形成了為什麼它成功的理論之後,我決定在我的工程(顯然沒有那麼複雜和雄心勃勃)裡有意識的測試這個理論。
但我首先做的事是熟悉和簡化Popclient。 Carl Harris的實現非常好,但是有一種對許多C程序來說沒有必要的複雜性。他把代碼當作核心而把數據結構當作對代碼的支持,結果是代碼非常漂亮但是數據結 構設計得很特別,相當醜陋(至少對以這個老LISP黑客的標準來看),然而除了提高代碼和數據結構設計之外,重寫它還有一個目的,就是要把它演化為我徹底 理解的東西,對修改你不理解的程序中的錯誤負責可不是一件有趣的事。


  第一個月我只是在領會Carl's的基本設計的含義,我所做的第一個重大修改是加入了IMAP支持,我把協議機重新組織為一個通用驅動程序和三個方法 表(對應POP2、POP3和IMAP),這個前面的修改指出一個需要程序員(特別是象C這種沒有自然的動態類型支持的語言)記在腦中的一般原理:


  9. 聰明的數據結構和笨拙的代碼要比相反的搭配工作的更好


  Fred Brooks也在他第11章中講道:「讓我看你的[代碼],把你的[數據結構]隱藏起來,我還是會迷惑;讓我看看你的[數據結構],那我就不需要你的[代碼]了,它是顯而易見的」。


  實際上,他說的是「流程圖」和「表」,但是在三十年的術語/文化演進之後,事情還是一樣的。


  此時(1996年9月初,在從零開始六個月後),我開始想接下來修改名字——畢竟,它已不僅僅是一個POP客戶,但我猶豫了,因為還沒有什麼新的漂亮設計呢,我的popclient版本需要有自己的特色。


  當fetehmail學會怎樣把取到的郵件轉送到SMTP端口時,事情就完全改變了,但是首先:上面我說過我決定使用這個工程來測試我關於Linus Torualds所做的行為的理論,(你可能會問)我怎樣做到這點呢? 以下面的方式:
    1. 我儘早儘量頻繁的發布(幾乎從未少於每十天發佈一次;在密集開發的時候是每天一次)。
    2. 我把每一個和我討論fetchmail的人加入一個beta表中。
    3. 每當我發佈我都向beta表中的人發出通告,鼓勵人們參與。
    4. 我聽取beta測試員的意見,向他們詢問設計決策,對他們寄來的補丁和反饋表示感謝。

  這些簡單的手段立即收到的回報,在工程的開始,我收到了一些錯誤報告,其質量足以使開發者因此被殺掉,而且經常還附有補丁、我得到了理智的批評,有趣的郵件,和聰明的特徵建議,這導致了:


  10. 如果你像對待最寶貴的資源一樣對待你的beta測試員,他們就會成為你最寶貴的資源。


六. popclient變成了Fetchmail


  這個工程的真正轉折點是Harry Hochleiser寄給我他寫的代碼草稿,他把郵件轉發到客戶端機器的SMTP端口,我立即意識到這個特徵的可靠實現將淘汰所有其他的遞送模式。


  幾個星期以來我一直在修改而不是改進fetchmail,因為我覺得界面設計雖然有用但是太笨拙瑣碎了,到處充滿了太多的粗陋的細小選項。


  當我思考SMTP轉發時我發現popclient試圖做的事太多了,它被設計成既是一個郵件傳輸代理(MTA)也是一個本地遞送代理(MDA)。使用 SMTP轉發,它就可以從MDA的事務中解脫出來而成為一個純MTA,而像sendmail一樣把郵件交給本地遞送程序來處理。


  既然端口25在所有支撐TCP/IP的平台上早已被預留,為什麼還要為一個郵件傳輸代理的配置或為一個郵箱設置加鎖的附加功能而操心呢?尤其是當這意味著抽取的郵件就像一個正常的發送者發出的SMTP郵件一樣,而這就是我們需要的。


  這裡有幾個教益:第一,SMTP轉發的想法是我有意識地模擬Linus的方法以來的最大的單個回報,一個用戶告訴我這個非同尋常的想法——我所需做的只是理解它的含義。


  11. 想出好主意是好事,從你的用戶那裡發現好主意也是好事,有時候後者更好。


  很有趣的是,你很快將發現,如果你完全承認你從其他人那裡得到多少教益的話,整個世界將會認為所有的發明都是你做出的,而你會對你的天才變得謙虛。我 們可以看到這在Linus身上體現得多明顯!(當我在1997年8月的Perl會議上發表這個論文時,Larry Wall坐在前排,當我講到上面的觀點時,他激動的叫了出來:「對了!說對了!哥們!」所有的聽眾都哄堂大笑起來,因為他們知道同樣的事情也發生在 Perl的發明者身上)。


  於是在同樣精神指導下工程進行了幾個星期,我開始不光從我的用戶那兒也從聽說我的系統的人那兒得到類似的讚揚,我把一些這種郵件收藏起來,我將在我開始懷疑自己的生命是否有價值時重新讀讀這些信。:)


  但是有兩個更基本的,非政治性的對所有設計都有普遍意義的教益。


  12. 最重要和最有創新的解決方案常常來自於你認識到你對問題的概念是錯誤的。

  一個衡量fetchmail成功的有趣方式是工程的beta測試人員表(fegtchmail的朋友們)的長度,在創立它的時候已經有249個成員了,而且每個星期增加兩到三個。


  實際上,當我在1997年5月校訂它時,這張表開始因為一個有趣的原因而縮短了,有幾個人請求我把他們從表中去掉,因為fetchmail已經工作的如此之好,他們不需要看到這些郵件了!也許這是一個成熟的市集風格工程的生命週期的一部分。

  我以前一直在解決錯誤的問題,把popclient當作MTA和具有許多本地遞送模式的MDA的結合物,Fetchmail的設計需要從頭考慮為一個純的MTA,做為一個普通Internet郵件路徑的一部分。


  當你在開發中碰了壁時(當你發現自己很難想通下一步時),那通常不是要問自己是否找到正確答案,而是要問是否問了正確問題,也許需要重新構造問題。


  於是,我重新構造了我的問題,很清楚,要做的正確的事是(1)把SMTP轉發支持放在通用驅動程序中,(2)把它做為缺省模式,(3)最終分離所有其他的遞送模式,尤其是遞送到文件和標準輸出的選項。


  我在第三步上猶豫了一下,擔心會讓popdiant的長期用戶對新的遞送方法感到煩心,在理論上,他們可以立即轉而轉發文件或者他們的非sendmail等價物來得到同樣的效果,在實際中這種轉換可能會很麻煩。
但是當我這麼做之後,證明好處是巨大的,驅動程序代碼的冗餘的部分消失了,配置完全變得簡單了——不用屈從於系統MDA和用戶的郵箱,也不用為下層OS是否支持文件鎖定而擔心了。


  而且,丟失郵件的唯一漏洞也被堵死了,如果你選擇了遞送到一個文件而磁盤已滿,你的郵件就會丟失,這在SMTP轉發中不會發生,因為SMTP偵聽器不會返回OK的,除非郵件可以遞送成功或至少被緩衝留待以後遞送。


  還有,性能也改善了(雖然在單次執行中你不會注意到),這個修改的另一個不可忽視的好處是手冊變得大大簡單了。


  後來,為了允許處理一些罕見的情況,包括動態SLIP,我必須回到讓用戶定義本地MDA遞送上來,但是我發現了一個更加簡單的方法。


  所有這些給了我們什麼啟發呢?如果可以不損失效率,就要毫不猶豫拋棄陳舊的特性,Antonine de Saint-Exupery(在他成為經典兒童書籍作家之前是一個飛行員和飛機設計師)曾說過:


  13. 「最好的設計不是再也沒有什麼東西可以添加了,而是再也沒有什麼東西可以去掉。」


  當你的代碼變得更好和更簡單時,這就是你知道它是正確的時候了,而且在這個過程中,fetehmail的設計具有了自己的特點,而區別於其前身popclient。


  現在是改名的時候了,這個新的設計看起來比老popclient更像一個sendmail的複製品,它們都是MTA,但是Senmail是推然後遞送,而新的popclient是拉然後遞送。於是,在兩個月之後,我把它重新命名為fetehmail。


七. Fetchmail成長起來


  現在我有了一個簡潔和富有創意的設計,工作得很好的代碼,因為我每天都用它,和一直在增長的beta表,它讓我漸漸明白我已經不是在從事只能對少數其他人有用的工作中,我寫了一個所有有一個Unix郵箱和SLIP/PPP郵件連接的人都真正需要的程序。


  通過SMTP轉發功能,它成為一個潛在的「目錄殺手」,遠遠領先於它的競爭者,這個程序如此能幹以至於其他的程序不但被放棄簡直被忘記了。


  我知道你不可以真得瞄準或計劃出這樣的結果,你只能努力去設計這些強大的思想,以後這些結果就好像是不可避免的、自然的、注定了的,得到這種思想的唯一辦法是獲取許多思想,或者用工程化的思考其他人的好主意而超過原來想到它的人的設想。


  Andrew Tanenbanm原來設想建造一個適合386的簡單的Unix用做教學,Linus Torvalels把Andrew的可能想到的Minix可以做什麼的概念推進了一步,成長為一個極好的東西,同樣的(雖然規模較小),我接受了Card Harris和Harry Hochheiser的想法,把它們變得更強大,我們都不是人們所浪漫幻想的天才的創始人,但是大多數科學和工程和軟件開發不是被天才的創始人完成的,這和流傳的神話恰恰相反。


  結果總是執著的原因——實際上,它是每個黑客為之生存的成功!而且它們意味著我必須把自己的標準定高一點,為了把fetchmail變得和我所能設想 的那樣好,我必須不僅為我自己的需要寫代碼,而且也要包括對在我生活圍主頁外的人們的需求的支持,而且同時也要保證程序的簡單和健壯。


  在實現它之後我首先寫的最重要的特徵是支持多投——從集中一組用戶的郵件的郵箱中取出郵件,然後把它路由到每個人手中。


  我之所以加上多投功能部分是因為有些用戶一直在鬧著要它,更是因為我想它可以從單投的代碼中揭露出錯誤來,讓我完全一般地處理尋址,而且這被證明了。 正確解釋RFC822花了我相當長的時間,不僅因為它的每個單獨部分都很難,而且因為它有一大堆相互依賴的苛刻的細節。


  但是多投尋址也成為一個極好的設計決策,由此我知道:


  14. 任何工具都應該能以預想的方式使用,但是一個偉大的工具提供你沒料到的功能。


  Fetchmant多投功能的一個沒有料到的用途是在SLIP/PPP的客戶端提供郵件列表、別名擴展。這意味著一個使用個人機器的人不必持續訪問 ISP的別名文件就能通過一個ISP帳戶管理一個郵件列表。我的beta測試員提出的另一個重要的改變是支持8位MIME操作,這很容易做,因為我已經仔 細的保證了8位代碼的清晰,不僅因為我預見到了這個特性的需求,而且因為我忠實於另一準則:


  15. 當寫任何種類的網關型程序時,多費點力,儘量少干擾數據流,永遠不要拋棄信息,除非接收方強迫這麼作!


  如果我不遵從這個準則,那麼8位MIME支持將會變得困難和笨拙,現在我所需要做的,是只讀一下RFC 1652,在產生信頭的邏輯加上一點而已。


  一些歐洲用戶要求我加上一個選項來限制每次會話取得消息數(這樣他們就可以從昂貴的電話網中控制花費了),我很長一段時間拒絕這樣做,而且我仍然對它不很高興,但是如果你是為了世界而寫代碼,你必須聽取顧客的意見——這並不隨他們不付給你錢而改變。


八. 從Fetchmail得來的另一些教益


  在他們回到一般的軟件工程問題以前,還有幾個從fetchmail得到的教益需要思考。


  rc文件語法包括可選的「noise」關鍵字,它被掃瞄器完全忽略了,當你把它們全抽取出的時候,關鍵字/值對更具可讀性。


  當我注意到rc文件的聲明在多大程度上開始像一個微型命令語言時,這是一個Late-night的體驗(這也是我為什麼把popclient原來的「server」關鍵字改成了「poll」)。


  對我來說似乎把這個微型命令語言變得更像英語可能會使它更容易使用。現在,雖然我對經過Emacs和HTML及許多數據庫引擎所證實的「把它做成一個語言」的設計方式確信不疑,但是我並不是一個通常的「類英語」語法的狂熱擁護者。


  傳統程序員容易控制語法使它儘量精確和緊湊,完全沒有冗餘,這是計算機資源還很昂貴時遺留下的一種文化傳統,所以掃瞄策略需要儘可能的廉價和簡單,而具有50%冗餘度的英語,看來好像是一個非常不合適的模型。


  這並不是我不用類英語語法的原因,我提到這一點是為了推翻它,在更廉價的時鐘週期與核心的時代,簡潔並沒有走到盡頭,今天對一個語言來說,對人更方便比對機器更廉價來的更加重要。


  然而,有幾個原因提醒我們小心一點,一個是掃瞄策略的複雜度開銷——你並不想把它變成一個巨大的錯誤來源和讓用戶困惑,另一個是試圖使語言表面上的類似可以和傳統語言一樣令人困惑(你可以在許多4GL和商業數據庫查詢語言上看到這一點)。


  Fetchmail的控制語法避免了這些問題,因為語言的領域是極其有限的。它一點也不像一個一般性的語言,它很簡單地描述的東西並不複雜,所以很少可能在英語的一個小子集與實際的控制語言之間發生混淆,我想這有一個更廣泛的教益:


  16. 如果你的語言一點也不像是圖靈完備的,嚴格的語法會有好處。


  另一個教益是關於安全的,一些fetchmail用戶要求我修改軟件把口令加密存貯在rc文件裡,這樣覷探者就不能看到它們了。


  我沒有這樣做,因為這實際上起不到任何保護作用,任何有權讀取你的rc文件的人都可以以你的名義運行fetchmail——如果他們要破你的口令,它們可以從fetchmail的代碼中找到製作解碼器的方法。


  所以fetchmail口令的加密都會給那些不慎重思考的人一種安全的錯覺,這裡一般性的準則是:


  17. 一個安全系統只能和它的秘密一樣安全,當心偽安全。


九. 集市風格的必要的先決條件


  本文的早期評審人員和測試人員堅持提出成功的市集模式開發的先決條件,包括工程領導人的資格問題和在把項目公開和開始建造一個協作開發人員的社團的時候代碼的狀態。


  相當清楚,不能以一個市集模式從頭開發一個軟件,我們可以以市集模式、測試、調試和改進,但是以市集模式從頭開始一個項目將是非常困難的,Linus沒有這樣做,我也沒有,初期的開發人員的社團應該有一此可以運行和測試的東西來玩。


  當你開始創建社團時,你需要演示的是一個諾言,你的程序不需要工作的很好,它可以很粗糙、很笨拙、不完整和缺少文檔、它不能忽略的東西是要吸引哪些人捲入一個整潔的項目。


  Linux和fetchmail都是以一個吸引人的基本設計進入公共領域的,許多和我一樣在思考市集模式的人已經正確的認為這是非常關鍵的,然後得出了一個結論,工程領導者的高度的設計直覺和聰穎是必不可少的。


  但是Linus是從Unix得到他的設計的,我最初是從先前的popmail得到啟發的(雖然相對Linux而言,它最後改變巨大),所以市集風格的領導人/協調人需要有出眾的設計才能,或者他可以利用別人的設計才能?


  我認為能夠提出卓越的原始設計思想對協調人來說不是最關鍵的,但是對他/她來說絕對關鍵的是要能把從他人那裡得到的好的設計重新組織起來。


  Linux和fetchmail項目都顯示了這些證據,Linus(如同前面所說)並不是驚人的原始設計者,但他顯示了發現好的設計並把它集成到 Linux內核中的強大決竅。還有我也描述了怎樣從別人那裡得到了fetchmail中最強大的設計思想(SMTP轉發)。


  本文的早期讀者稱讚我,說因為我做了許多關於原始設計的事,所以傾向於低估原始設計在市集項目中的價值,也許有些是對的吧,但是設計(而不是編碼或調試)本來就是我最強的能力。


  變得聰明和軟件設計的原始創作的問題是它會變成一個習慣,當需要保持事物健壯和簡潔的時候,你卻開始把事情變得漂亮但卻複雜。我曾經犯過錯誤,使得一些項目因我而崩潰了,但我努力不讓它發生在fetchmail身上。


  所以我相信fetchmail項目的成功部分是因為我抑制自己不要變得太聰明,這說明(至少)對市集模式而言原始設計並不是本質的,請考察一下Linux假設Linus Torvalds在開發時試圖徹底革新操作系統設計,它還會像今天我們所擁有的內核那樣穩定和成功嗎?


  當然基本的設計和編碼技巧還是必需的,但我希望每個嚴肅考慮發起一個市集計劃的人都已至少具備這些能力,自由軟件社團的內部市場對人們有某些微妙的壓力,讓他們不要發起自由不能搞定的開發,目前為止,這工作得仍然相當好。


  對市集項目來說,我認為還有另一種通常與軟件開發無關的技能和設計能力同樣重要——或者更加重要,市集項目的協調人或領導人必須有良好的人際和交流能力。


  這是很顯然的,為了建造一個開發社團,你需要吸引人,你所做的東西要讓他們感到有趣,而且要保持他們對他們正在做的工作感到有趣,而且要保持他們對他們正在做的工作感到高興,技術方面對達成這些目標有一定幫助,但這遠遠不是全部,你的個人素質也有關係。


  並不是說Linus是一個好小夥子,讓人們喜愛並樂於幫助他,也並不是說我是個積極外向的,喜歡扎堆兒工作,有出眾的幽默感的人,對市集模式的工作而言,至少有一點吸引人的技巧是非常有幫助的。


十. 自由軟件的社會學語境


 下述如實:最好的開發是從作者解決每天工作中的個人問題開始的,因為它對一大類用戶來說是一個典型問題,所以它就推廣開來了,這把我們帶回到準則1,也許是用一個更有用的方式來描述:


  18. 要解決一個有趣的問題,請從發現讓你感興趣的問題開始。


  這是Carl Harris和原先的popclient的情形,也是我和fetchmail的情形,但這已在很長一段時間被大家知曉了,Linux和fetchmail 的歷史要求我們注意的有趣之處是下一個階段——軟件在一個龐大的活躍的用戶和協作開發人員的社團中的進化。


  在《神秘的人月》一書中,Fred Brooks觀察到程序員的工作時間是不可替代的:在一個誤了工期的軟件項目中增加開發人員只會讓它拖得更久,他聲稱項目的複雜度和通訊開銷以開發人員的 平方增長,而工作成績只是以線性增長,這個說法被稱為「Brooks定律」,被普遍當作真理,但如果Brooks定律就是全部,那Linux就不可能成 功。


  幾年之後,Gerald Weinbeng的經典之作「The Psychology Of Computer Progromming」為我們更正了Brooks的看法,在他的「忘我(egoless)的編程」中,Weinberg觀察到在開發人員不頑固保守自己的代碼,鼓勵其他人尋找錯誤和發展潛力的地方,軟件的改進的速度會比其他地方有戲劇性的提高。


  Weinberg的用詞可阻止了他的分析得到應有的接受,人們對把Internet黑客稱為「忘我」的想法微笑,但是我想今天他的想法比以往任何時候都要引人注目。


  Unix的歷史已經為我們準備好了我們正在從Linux學到的(和我在更小規模上模仿Linus的方法所驗證的)東西,這就是,雖然編碼仍是一個人幹 的活,真正偉大的工作來自於利用整個社團的注意和腦力,在一個封閉的項目中只利用他自己的腦力的人會落在知道怎樣創建一個開放的、進化的,成百上千的人在 其中查找錯誤和進行修改的環境的開發人員之後。


  但是Unix的傳統中有幾個因素阻止把這種方法推到極致。一個是各種授權的法律約束、商業機密和商業利益,另一個(事後來看)是Internet還不夠好。


  在Internet變得便宜之前,有一些在地理上緊密的社團,它們的文化鼓勵Weingberg的「忘我」編程,一個開發人員很容易吸引許多熟練的人和協作開發人員,貝爾實驗室,MIT A1實驗室,UC Berkeley,都成為傳統的、今天仍然是革新的源泉。


  Linux是第一個有意識的成功的利用整個世界做為它的頭腦庫的項目,我不認為Linux的孕育和萬維網的誕生相一致是一個巧合,而且Linux在 1993-1994的一段ISP工業大發展和對Internet的興趣爆炸式增長的時期中成長起來,Linus是第一個學會怎樣利用Internet的新 規的人。


  廉價的Internet對Linux模式的演化來說是一個必要條件,但它並不充分,另一個關鍵因素是領導風格的開發和一套協作的氛圍使開發人員可以吸引協作開發人員和最大限度地利用媒體。


  但是這種領導風格與氛圍到底是什麼呢?它不能建立在權力關係之上——甚至如果它們可以,高壓的領導權力不能產生我們所看到的結果,Weinberg引用了19世紀俄國的無政府主義者Kropotkin的「Memoris of a Revolutionist」來證明這個觀點:


  「我從小生活在一個農奴主的家庭中,我有一個活躍的生活,像我們時代的所有年輕人一樣,我深信命令、強制、責罵、懲罰等等的必要性。但是當我(在早 期)必須管理一個企業,和(自由)人打交道時,當每一個錯誤都會產生嚴重後果時,我開始接受以命令和紀律為準則來行動和以普通理解為準則來行動的區別。前 者在軍事閱兵中工作的很好,但是它在現實生活中一文不值,目標達成只是靠許多願望的聚合的簡單後果。」「許多聚合在一起的願望的直接後果」精確地指出了象 Linux的項目所需要的東西。「命令的準則」在Internet這種無政府主義的天堂中一群自願者之中是沒有市場的,為了更有效的操作和競爭,想領導協 作項目的黑客們必須學會怎樣以Kropotkins含糊指出的「理解的準則」模式來恢復和激活社團的力量,他們必須學會使用Linus定律。


  前面我引用「Delhpi效應」來作為Linus定律的一個可能的解釋,但是來自生物學和經常學的自適應系統的更強大的分析也提出了自己的解 釋,Linus世界的行為更像一個自由市場或生態系統,由一大群自私的個體組成,它們試圖取得(自己)最大的實效,在這個過程中產生了比任何一種中央計劃 都細緻和高效的自發的改進的結果,所以,這裡就是尋找「理解的準則」的地方。


  Linux黑客取得的最大化的「實際利益」不是經典的經濟利益,而是無形的他們的自我滿足和在其他黑客中的聲望,(有人會說他們的動機是「利他的」, 但這忽略了這樣的事實:利他主義本身是利他主義者的一種自我滿足的形式),自願的文化以這種方式工作的實際上並非不尋常,我已參與一個科幻迷團體很長時間 了,它不像黑客團體一樣,顯式地識別出「egoboo」(一個人在其他愛好者之中的聲望的增長)作為自願者活動背後的基礎驅動力)。


  Linus成功地把自己置於項目的守門人的位置,在項目中開發大部分是別人做的,他只是在項目中培養興趣直到它可以自己發展下去,這為我們展示了對 Kropokin的「共同理解原則」的敏銳把握,對Linux這種類似經濟學的觀點讓我們看到這種理解是怎樣應用的。


  我們可以把Linus的方法視為創建一個高效的關於「egoboo」(而不是錢)的市場,來把自私的黑客個體儘可能緊密的聯繫起來,達成只能通過高度 協作才能得到的困難的結果,在fetchmail項目中我展示了(在較小規模上)這種模式可以複製,得到良好的結果,也許我比他更有意識一點、更加系統一 點。


  許多人(尤其是哪些由於政治原因不信任自由市場的人)會盼望自我導向的自我主義者的文化破碎、報廢、秘密和敵對,但這種盼望很明顯地被Linux的文 檔的多樣性、質量和深度打破了,程序員討厭寫文檔似乎已是聖訓,但Linux的黑客們怎麼產生了這麼多?顯然Linux的egoboo自由市場比有大量資 金的商業軟件產品的文檔部在產生有品德的、他人導向的行為方面工作的更好。


  Fetchmail和Linux內核項目都表明,通過恰當的表彰許多其他黑客,一個強大的開發者/協調者可以用Internet得到許多協同開發人員而不是讓項目分崩離析為一片混亂,所以關於Brooks定律我得到了下面的想法:


  19. 如果開發協調人員有至少和Internet一樣好的媒介,而且知道怎樣不通過強迫來領導,許多頭腦將不可避免地比一個好。


  我認為自由軟件的將來將屬於那些知道怎樣玩Linus的遊戲的人,把大教堂拋之腦後擁抱市集的人,這並不是說個人的觀點與才氣不再重要,而是,我認為自由軟件的前沿將屬於從個人觀點和才氣出發的人,然後通過共同興趣自願社團的高效建造來擴展。


  可能不只是自由軟件的將來,在解決問題方面,沒有任何商業性開發者可以與Linux社團的頭腦庫相匹敵,很少有人能負擔起僱傭200多個為fetchmail出過力的人!


  也許最終自由軟件文化將勝利,不是因為協作在道德上是正確的或軟件「囤積居奇」在道德上是錯的(假設你相信後者,Linus和我都不),而僅僅是因為商業世界在進化的軍備競賽中不能戰勝自由軟件社團,因為後者可以把更大更好的開發資源放在解決問題上。

**** 網友寫給作者的感想: ****

你好,Eric:
我剛讀了你的大教堂/市集的文章,因為你的主頁指出你還要繼續關於這個問題的思考,我提供一些個人的觀察。
首先介紹一些背景:當1990年出現BSD Net/2的時候,Brad Grantham和我把它移植到了MacⅡ平台上,它在幾個月之後以Mac BSD發佈(當然是以市集風格),後來成為Net BSD/Mac。
我作為一個市集協調人學到了一些東西:


1. 人們很快地自願提供幫助,但是常常很慢,我們收到上百封信說:「我很想幫助,請告訴我需要什麼?」 這些人沒提供什麼幫助,不管他們有多麼積極,真正有幫助的人那些給我們的第一封信便說:「嘿,我修改了這個,這兒有一個補丁。」最後我們忽略了所有第一種 類型的郵件(只是把他們引向工作列表),培養與第二種人的關係,這種情況所有協調人都應知道,來克服看到這麼多「志願者」時的盲目高興。
(注意:他們的動機是好的,他們只是沒有認識到他們正在志願做什麼)。


2. 你已經提到了這一點,但我認為它是極端重要的:甚至在你宣佈產品以前你必須有一個可工作的系統:例如,我們一直等到有了一個可引導的內核和一個單用戶根 shell之後才把它貼到Usenet,曾有過(據我所知)四個不同的Mac Linux項目,每一個都在Linux新聞組中有一大批擁護者,都創建了郵件列表,每個人都很熱情,寫了FAQ,還有許多諸如MacOS的圖標應是什麼樣 的討論。所有這些項目沒有發佈一行代碼或者一個內核、我挑選了MkLinux(Apple開發的)作為一個可工作的Mac版Linux(在一個項目 中,MacLinux假設運轉在68K Mac上,而郵件列表中所有的討論都是關於怎樣把它移植到Power Mac上。68K版本甚至不能遠程工作!),這些項目吸引了上述的第一種「幫助者」,熱情高漲但是實際上卻沒做什麼事,殺掉一個項目最快的方法是在你什麼 都還沒有之前就宣佈它,我已經見的太多了,尤其是在
Linux世界裡。

我知道這兩點看起來相當悲觀,但我知道當我們想到「啊,我們做了這麼多事了,肯定搞定了不少問題了吧!」的時候,我們太容易失去理智。而那實際上只不過是一些善良的動機罷了(誰說過:「不要把動機和行動混淆在一起?」 本·弗蘭克林?)協調人需要解散所有那些諸如圖標應該是什麼樣的、FAQ用HTML格式還是SGML模式的熱情討論,而把注意力放在取得產品的一個可工作的版本,一旦得到了,人們就真正開始幫助了。

(從正面來看,MacBSD極大地得益於從它的開發風格,我們得到了代碼、設備驅動程序、錢和一些捐贈和借到的測試和開發的硬件設備)。
我期望看到對我上述觀點的任何評論和你關於這個主題寫的任何東西。


Lawrrance

如何成為駭客

這文章是Eric Raymond先生的著作, 由Ken LEE翻譯成中文

如何成為駭客

   

為何有這文章?

  身為Jargon File的作者, 我常收到熱心的網絡新秀的電子郵件, 問及"如何可以成為駭客?" 奇怪地, 在互聯網上像沒有文件或FAQ介紹這個重要問題, 所以, 我寫了這篇文章.

  若你只是離線地閱讀本文, 你可到這裡閱讀本文的最新中文版本.

 

什麼是駭客

  在Jargon File裡有數個'駭客'的定義, 主要形容"技術專才"或"有志解決問題及超越極限之人士".其實要成為駭客, 只有兩個要點

    最初駭客是形容一班最初使用早期微電腦及ARPAnet實驗的專業程式員及網絡專才. 他們崇尚共享主義,他們建立互聯網,他們建立及發展成現今的Unix作業系統.他們管理Usenet討論組. 亦是他們令互聯網運作.因此, 若你有上述的特性及參與同類的社群,亦有對以上種種作出貢獻,同時社群的人知你是誰又稱你為駭客, 你便是駭客.

然而,駭客的理念並非只局限於這"軟件"的社群. 有很多人應用駭客的態度於其他事物,如電子或音樂上-- 實際上,駭客的理念存在於任何科學及文學. 由於了解駭客的理念及精神,軟件社群的駭客亦會稱後者為駭客. 有些人亦認為駭客的理念是獨立於駭客所從事的媒體. 然而, 我們將在這篇文章專注討論軟件駭客的技巧, 態度及傳統.

  另外, 有一群人亦稱自已為"駭客", 他們(多數是年青人)用電腦侵入其他電腦的系統作出破壞.駭客們稱這群人為"破壞者(Cracker)", 亦不認同他們為駭客. 多數 駭客會認為破壞者是懶惰, 不負責任, 不傑出的人. 有能力侵入保安系統並不能使你成為駭客, 正如可以用鐵線來偷車並不能使你成為工程司一樣. 不幸的是很多作家及報導員均稱這群人為"駭客".

  CRACKER 與 HACKER的主要分別是前者破壞, 後者建立.

  若你想成為駭客, 請看下去, 若你只想成為CRACKER, 請到alt.2600討論小組, 準備作出系統破壞. 我相信你不會感到自己是想像中的聰穎. 我對CRACKER便說到這裡為止.

 

駭客的態度

  駭客解決問題, 建立事物, 相信自由及共享主義. 要成為駭客及被接受為駭客, 你的行為須"表現"出上述的態度. 要"表現"上述的態度, 你須"真正相信"上述的態度是正確

相信上述的態度並非只認為要被接受為駭客, 而是要使能學習及保持成為駭客的自發性. 正如其他的創作藝術一樣. 學習必須同時著重理念與態度.

  所以, 要成為駭客, 仔細了解下列各點, 直至你相信為止:  

1. 世界是有大量有趣的問題是等待解決的

  成為駭客是一件滿有趣的事情, 但背後同時要付出努力. 努力卻須要自發性. 成功的運動家有強烈的慾望去使自己發揮至極限, 正如駭客必須有慾望去解決問題, 不斷加強技術及 運用智慧.

  若你並非此類人, 要成為駭客你便需要作出改變. 否則你的駭客生涯及能量只會被性慾, 金錢及社會的既定價值觀所消耗, 一點一滴地消耗.

  (你亦需有強烈信念, 相信縱使你暫停不能解決整個問題, 只是你能解決其中一部份, 及能從中學習, 你會可以解決另外的一部份 --- 直至解決整個問題)

 

2. 沒有人應該有需要解決同樣問題兩次

  你的智慧是一個很有價值, 但同時很"有限"的資源. 請不要將這有價值的資源用來"重新發明車輪". 因為有很多其他尚未解決的問題是等待著你的.

  要成為駭客, 你必須相信其他駭客的思想時間非常寶貴, 所以你有道德上的責任去分享資訊, 解決問題及將其解決方法分享, 使其他駭客不須再花時間解決同樣問題, 而可以用時間解決的難題.

  (你不須相信你必須將所有你的創作分享, 縱使願意如此做的駭客是最從人專重的.售賣足夠的創作以購買食物, 支付租金及使用電腦的費用並不違反駭客的價值觀. 運用你的駭客技能養活家庭, 甚至致富亦可以, 只要你做這些事時不要忘記你是一名駭客)

 

3. 拒絕沉悶及乏味的事情

  正如一般的創作者, 駭客不應做沉悶及乏味, 愚蠢及反反覆覆的事情. 因為這表示他們不是做著只有他們才可以做的事 -- 解決新問題. 這樣實在太浪費了. 因此, 沉悶及乏味的事情對駭客而言不僅只是不良, 而是邪惡的.

    要成為駭客, 你必須相信此觀念以令你將所有沉悶及乏味的事情儘量自動化, 不止為自己而是為其他人(其他駭客).

  (但有時為了鍛鍊, 或獲得某種技術及經驗, 駭客亦要做那些重複又乏味的事情, 但這是個人選擇, 沒有一個善於思想的人應被逼做沉悶的事)

   

4. 自由

  駭客天生反霸權主義. 若有人可以向你下達命令, 他便足以停止你 -- 停止你去解決一些你認為有意義的問題. 極權主義的人, 由於思想特殊, 會給你一個 極愚蠢的理由去停止你解決這些有意義的問題. 為了不令你和其他駭客窒息, 必須打擊霸權主義.

  (這並不是向所有權力挑戰, 正如小孩需要成人指導, 罪犯須被壓抑. 駭客可同意接受某些權力. 但只是有限及有意識地同意接受. 那種極權主義的人所要求的 絕非駭客所能認同)

  極權主義者很喜歡"禁制"及"保密", 他們不相信自由合作及資訊交流 -- 他們由 接受可以由他們操控的"合作"形式. 因此, 駭客必須對抗不合理的禁制, 保密及以暴力或欺瞞壓逼人民的手段.

 

5. 信念不能替代能力

  作為駭客, 你必須發展上述的態度及擁有其信念, 但有信念不能使你成為駭客, 正如有信念不能使你成為出色的 運動家或搖滾樂手一樣. 要成為駭客, 你須付出智慧, 鍛煉及勤奮.

  因此, 駭客須要相信能力. 任何方面的能力都是好的, 一些只有少數人可領略的才能"更好", 而"最好"是一些需 要高度智慧, 技巧及高度集中力的才能.

    若你尊敬才能,亦渴望得到 - - 你所付出的努力將成為樂趣而非沉悶的事情, 這亦是駭客必須擁有的.

 

基本駭客技能

  駭客態度固然重要,但駭客技能更重要.態度絕不能替代才能, 因此, 你必須學習一些基本知識才會被稱為駭客.

  由於科技不斷演進,這些基本知識會不斷改變.(例如,以前須要機械碼才能編寫電腦程式,但近來人們卻愛用HTML.) 在現在,你需要下列知識:

 

1‧學如何寫電腦程式

  這,當然是最基本的駭客技能.如果你不懂任何電腦程式語言,我便建議你學Python. 這是一個清楚地設計的,有清析記錄語法的,適合初學者的電腦程式語言.雖然它可能是你的第一種學習的電腦程式語言, 但它 絕非一件玩具.它是非常強力,有彈性而又適用於大型項目的電腦程式語言.

  但緊記,若你只懂一種電腦程式語言,你不能成為電腦程式員,更遑論成為駭客 - - 你需要了解程式編寫方法, 而且不受任何一種電腦程式語言限制. 因此, 你要學習如何只參看使用者指引, 將其中內容與你所學關聯, 便能於數天內學懂一種新的電腦程式語言. 即是你要學習多種不同的電腦程式語言.

  如果你對電腦程式要求嚴格, 你必須學習unix的核心語言-- C (雖然 C 並不應是你第一種學習的電腦程式語言). 其他駭客需要學習的包括PerlLISP. 由於實用性, Perl是值得學的,Perl是廣泛地用於Active Web Pages及系統管理上的, 因此就算你不會用Perl來編寫程式你亦需學習如何閱讀及了解Perl. 至於學習LISP能 給你一個意想不到的寶貴經驗, 有助你於日後的日子裡寫便好的電腦程式, 縱使你可能不會時常用LISP來編寫程式.

  因此, 你最好完成以上四種電腦程式語言的學習(Python, C, Perl 及 LISP). 除了是最重要的駭客語言, 它們亦代表不同的程式編寫方法. 每種語言都從不同方向 使你獲得寶貴經驗.

    我不可能在此教導你如何編寫電腦程式, 因為這是一門複雜的技能. 我只可對你說的就是 -- 書本與課程並不有效 (很多,甚或是大多數的駭客 都是自學的). 最有效學習電腦程式是(一)閱讀程式碼 (二)編寫程式碼

  學習編寫電腦程式就如學習普通語言一樣, 最佳方法是閱讀一些別人的大作, 然後寫一些程式, 再閱讀多些, 再寫多些 ... 直至你發展出你獨有的一套編寫電腦程式方法.

  尋找好的程式用以閱讀和學習是非常困難的, 以往是很缺乏一些比較大型的程式供初學的駭客練習. 但現在情 況已經有所改變;開放程式碼的軟件, 電腦程式編寫工具, 及作業系統(都是由駭客創造)現時是很容易便可以取 得. 正好帶領我們到下一個題目 ...

 

2‧取得一份開放程式碼的unix作業系統, 然後學習它.

  我假設你擁有/或者可以使用一台個人電腦(現今的小孩隨時都可以很容易地得到 :-)). 成為駭客的第一步 是在你的電腦上安裝一套LINUX或BSD-Unix的作業系統, 及使用它.

  當然, 世界上除了UNIX外還有很多其他作業系統, 但它們都是以二進制形式分發的 - - 你不但不能閱讀 那些程式碼, 你亦不能改動它們. 在DOS,WINDOWS或MAC 或等作業系統上從事駭客活動, 便像穿著盔甲 學跳舞一樣.

  另外, UNIX是互聯網上的作業系統、 雖然你可以不懂UNIX但仍能使用互聯網, 但若你不懂UNIX, 你不能在 互聯網上從事駭客活動. 因此, 現今駭客們大多是精於及偏愛UNIX的. (以前的駭客可能不同意, 但互聯網 及UNIX的相互關係已令其他 -- 包括微軟的作業系統難於取代.

  所以, 請安裝一套UNIX -- 我個人喜愛LINUX但其實有其他種類的(你可以同時安裝LINUX及DOS/WINDOWS在 同一電腦上). 學習它, 使用它, 把玩它. 用它來上互聯網. 閱讀及改動它的程式碼. 它比微軟等的作業 系統提供更好的程式工具(包括C, LISP, Python及Perl). 你會得到趣味及學到比你想像更多更佳的知識.

要知多點關於學習UNIX的資料請到Loginataka

  要得到LINUX, 請到

  要知多點關於BSD UNIX 的資料及協助請到www.bsd.org.

  (註:若你是初學者,我不建議你獨自安裝LINUX或BSD. 若你欲安裝LINUX,到一些LINUX的使用者團體尋 求協助; 或到Linux Internet Support Co-operative (LISC)IRC 頻道看看.)    

3. 學習如何用互聯網及用HTML來寫網頁

  大部份駭客所做的事情, 如在工廠及辦公室或大學裡的工作, 是不會對非駭客做成影響的. 但互聯網卻是一個例外, 就算政治家都承認互聯網是一個足以影響世界的東西.亦由於這原因(及其他種種原因)你要學如何在互聯網上工作.

  這不是說你要學如何使用瀏覽器(人人都懂使用..), 我是說你首先要學用HTML來寫網頁. 若你根本不懂寫程式,用HTML來寫網頁可幫助你得到一些程式編寫的基本概念.

  可是寫網頁仍不足夠, 在互聯網上有很多網頁, 但大部份是沒有方向, 明顯地沒有內涵的網頁. (你大可到The HTML Hell Page看看)

  所以, 你的網頁一定要有內容—必須是有趣的及/或有用的(對其他駭客), 這便是我在下一個題目要說的..

 

駭客社群的身份

  像大部份非謀利的社群, 駭客以名譽為重. 你會嘗試解決有趣的問題, 但問題是否有趣及你的解決方法是否有效, 卻只有其他具有技能的駭客們可以去品評.

  因此, 要玩駭客這個遊戲, 你要以其他駭客對你的觀感作為自己的評價. (正如我說你不是駭客,除非其他駭客亦稱你為駭客).不過這事實卻有時被人誤解, 因為他們多以為駭客是孤獨地工作的人.

  人類學家稱駭客為貢獻社群. 駭客得到地位及名譽並非來自強於他人的權力, 亦非由於外表美麗, 或有異於常人的能力,而是源於施與.清晰地說,是將你的時間, 創意及創意的結果貢獻他人.

  基本上, 你可以貢獻5方面的東西以獲得其他駭客的尊重:

 

1. 編寫公開程式碼的軟件

  首先(最傳統及基本的方法), 是編寫一些其他駭客認為有趣又有用的程式, 而且將程式碼公開.

  (人們以前會稱此類程式為”免費軟件”, 但由於太多人將”免費軟件”的意義誤解. 現時大部份人稱此類程式為公開程式碼的軟件)   駭客界最受人尊重的聖者是一些編寫大型, 功能強勁而又很有用的公開程式碼軟件, 供其他人使用.

 

2. 幫助他人測試及除錯公開程式碼的軟件

  在這不完美的世界, 人們無法避免花很長的時間用於測試及為軟件除錯. 因此, 很多公開程式碼軟件的作者都會高度評價那些好的程式測試員 (可以清楚表達程式錯誤表徵,程式錯誤位置,能接受軟件在開發期間的暫時性錯誤及繼續測試). 一個好的程式測試員可以使如惡夢的測試及除錯工作變為一件值得經歷的小煩惱.

  若你是初學者, 你可以找一些正在開發階段而你又感興趣的程式來做測試及除錯. 當你懂得測試及除錯, 你自然會學習更改程式.這樣,你不單可以學習, 亦可以與其他專家建立良好的關係,而他們亦很可能會於未來給予你幫助.

 

3. 發行有用的資訊

  另外一點是你可以收集及挑選有用的資訊並製成網頁或FAQ(常問問題), 以供諸同好.

  技術性FAQ的經營者往往很多人的專重, 如同編寫公開程式碼的軟件的專家一樣.

 

4. 幫助系統運作

  駭客社群(特別是互聯網的發展者)是由自願者組成的. 當中有大量必須但平淡的工作須要有人去處理 -- 例如管理電子郵件,監察討論小組,經營大型程式的儲存網站,及發展技術性標準等.

  做以上工作的人得到很多人的專重, 因為人人都知道此種工作是很花費時間但又不如編寫程式般有趣.此等工作須要使命感.

 

5. 為駭客社群服務

  最後,你可以為駭客社群服務及傳揚(例如你可以寫一篇如何成為駭客的文章 :-)). 通常你不會做這些工作,直至你已做了以上四種的工作的其中一樣.

  駭客社群沒有一個既定的領導者, 但卻有為人尊重的英雄及長老級人物等發言人. 當你在此有一段時間的經驗,你可能會成為其中的英雄或長老.但記著,駭客社群對傲慢的自我中心者並不認同, 所以不要成為如斯的領導人物.你不應追求成為領導人物, 你應了解自己的方向及以謙虛的心來看自己的地位及身份.

 

駭客與怪客的關係

  與傳說不同,駭客並不一定是怪客, 但有很多駭客卻實在是怪客. 通常社會不甚認同的怪客會有更多時間習中思考及從事駭客活動.

  因此,很多駭客都以怪客為名, 並以此表示自己獨立於社會一般的觀念. 你可看這裡得到更多此等討論.

  若你可以集中精神從事駭客活動, 做得又好而又可以維持生命, 實在是很難得的事. 比起70年代來說現在做駭客是比較容易的了.人們亦開始了解駭客其實是高質素的人才.

  但若你是由於太苦悶而做駭客的話, 我亦歡迎你, 最少你可以比較專心地從事駭客活動, 可能有一天你會得到人生的樂趣.

 

其他事項

  我想再說一次,若你要成為駭客,你必需要有駭客的理念. 就算你不是在電腦前面你亦可以做以下與此理念有關的事情.當然,沒有事情可以取代駭客的電腦活動.

     
  • 閱讀科技故事,參與科技會議(在場內很可能遇到其他駭客)
  • 學習禪及工夫武術 (理念與駭客的理念在很多方面相近)
  • 發展分析音樂的聽覺.學習欣賞特定的音樂,學習以一種或以上的學器, 學習唱歌.
  • 學習欣賞文字及雙關語
  • 學好你本土的語言(有很多駭客都是有能的作家)
多做以上的行為,你更容易成為駭客, 可能因為上述的行為是會將左腦及右腦的混合使用 (駭客需要以理性分析事情及於一瞬間以邏輯以外的思考來處理有關工作)

  最後,一些你應做的事情

  • 不要用愚蠢,浮誇的User ID或假名
  • 不要捲入Usenet及其他討論的罵戰
  • 不要自稱為’電腦流氓’,亦不要與此類人交往
  • 不要發放有大量錯字或錯文法的電子郵件及電子討論
  若你做出上述的事情, 你將會得到很壞的名譽, 駭客有很好的記性, 你最期的所作所為會令你將要經過多年才可以被其他駭客接受.

  用假名的問題值得我們深思. 將身份隱藏是小孩子的做法,另是Cracker, warez d00dz 及其他低等生物的特徵. 駭客不會做這些事; 他們對自己的創作及行為表示驕傲,因此愛用名. 因此, 若你現在用假名, 請你立即放棄. 在駭客社群裡只會將用假名的人視為失敗者.

 

其他的資源

  Peter Seebach維護著一個很好的駭客 FAQ供不懂處理駭客的人士閱覽. 若上述超連結沒有反應你可到Excite 搜尋器來尋找

  Loginataka有一些關於Unix駭客的訓練和應有態度的資料

  本人亦寫了一個 有關駭客社群的簡短歷史的網頁

  我亦寫了一篇文章, 名為 The Cathedral and the Bazaar, 以解釋有關Linux及開放式程式碼等的文化. 我亦在續篇Homesteading the Noosphere一文中再將此題目直接地說明

 

常問問題

問: 你會否教授我如何成為駭客 ?

自從寫了這個網頁, 我每星期(有時每天有數次)收到上述的要求, 可惜的是我並沒有時間及精力去教人如何成為駭客. 我自己所從事的駭客活動已用了我 110%的時間.

  就算我有時間, 駭客本身是一種態度及技巧你要自我學習. 你會發現真駭客們很願意提供協助, 但若你只是不斷地像嬰兒般要求餵養, 他們不會尊重你

  所以, 你應先學一些基本知識. 表現出你是正在嘗試, 及你有能力自學. 接著才與駭客們討論特殊的難題.

 

我要如何開始?

  最好先到LUG(Linux 用家小組)討論. 你可以在LDP General Linux Information Page找到此類小組; 很多時你可以找到一個接近你的小組, 多數是大學提供的. LUG的成員可能會提供一套Linux給你, 及教你如何安裝及開始.

 

你會否教我如何破解系統, 或教我破解術?

  我不會. 任何已閱讀此FAQ而仍問此問題的人實在是太愚蠢及不能教導(就算我有時間教導) 任何此類電子郵件會被忽略或以粗暴語氣回答

 

我的系統剛被破解. 你會否幫我防範再被破解 ?

  不會. 每次我收到這類要求的, 都是用視窗作業系統的. 基本上是不可能有效地防止視窗作業系統被破解; 因為這作業系統有太多的程式及結構缺點, 就像要用篩子來將船划動一樣.只有轉用Linux等有真正安全的作業系統方可解決這個問題.

 

在那兒可以與真駭客通訊?

  最好是找一個你本區的Unix或Linux的討論小組, 並參與討論(你可以在 LDP的網頁找到超連結)

  我曾說在IRC(網上即時討論小組)不能找到真駭客, 但我發覺現在情況有所改變. (現時有些真駭客亦在GIMP及Perl等的網上即時討論小組出現.)

 

你可否介紹一些有關駭客的有用書籍?

  你可到本人維護的 Linux Reading List HOWTO看看, Loginataka亦有相關的資料.  

我應先學那種程式語言?

  若你不懂HTML, 你應先學它. 在坊間有很多不好的HTML書, 好的HTML書卻很少. 我本人最喜歡 HTML: The Definitive Guide.

  但HTML並不是完全的程式語言. 當你有心理準備開始學寫程式, 我提議你學Python.可能已有很多人提議你學Perl, 而事實上Perl是比Python更多人用. 但對初學者來說, Perl比較難學. 而且(我認為)Perl的設計比不上Python.在網上有很多Python的資訊供初學者.

  C語言是非常重要, 但比Python及Perl更難學. 不要以它為起點.

  對於視窗作業系統的用家, 請你們不要只學Visual Basic. 它會使你得到壞的編寫程式習慣, 亦並不能於不同的作業系統平台使用. 儘量不要用它.

 

問: 但編寫開放式程式的人會否不能賺錢過活?

  看來不會 – 直至現在, 開放式程式工業是在創造就業機會而非減少就業機會. 若成功編寫一個程式是經濟正收益,程式編寫員, 無論是開放式或非開放式的, 亦可得到薪金. 另外, 無論有多少的開放式程式, 亦有更多需求新的及度身訂做的應用程式.我在Open Source網頁有更詳盡的解說.

問: 我應如何開始, 我在那裡可以很到免費的Linux ?

  在這網頁的其他地方已有超連結帶你到可以得到免費Unix的地方. 要成為駭客, 你需要有主動性, 自發性及自學能力. 現在開始吧….

將多個LiveCD linux放到(非安裝)到隨身碟

我採用最簡單的方法,把隨身碟只做一個vfat格式(fat16或fat32)的分割不過安全性有些餘慮,可能隨身碟在當儲存介面的時候會不小心刪除檔案。不過好處是最大利用隨身碟空間(分割也是會佔用幾百KB的空間XD),還有撰寫menu.lst單一化。

menu.list參考格式。
注意:開機代號一律使用(hd0,*)開頭。*為不同的分割磁區,若只有一個磁區則為(hd0,0)

單一磁區
default  5
timeout 10
splashimage=/boot/grub/gnu-tux-usb.xpm.gz

## End Default Options ##

title ttylinux
kernel /boot/ttylinux/isolinux/bzImage load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=8192 ro root=/dev/ram0
initrd /boot/ttylinux/isolinux/filesys

title Damn Small Linux 4.2.5
kernel (hd0,4)/dsl-4.2.5/boot/isolinux/linux24 ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 noprompt nomce noapic quiet knoppix_dir=/dsl-4.2.5/KNOPPIX BOOT_IMAGE=knoppix
initrd (hd0,4)/dsl-4.2.5/boot/isolinux/minirt24.gz

title slax 6.0.7
kernel (hd0,4)/slax-6.0.7/boot/vmlinuz ramdisk_size=6666 root=/dev/ram0 rw autoexec=xconf;telinit~4 from=/slax-6.0.7/ changes=/slax-6.0.7/slax
initrd (hd0,4)/slax-6.0.7/boot/initrd.gz

title slax 6.0.7 lightening fast (loads slowly; need 1G or more RAM)
kernel (hd0,4)/slax-6.0.7/boot/vmlinuz ramdisk_size=6666 root=/dev/ram0 rw autoexec=xconf;telinit~4 from=/slax-6.0.7/ changes=/slax-6.0.7/slax copy2ram
initrd (hd0,4)/slax-6.0.7/boot/initrd.gz

title slax 6.0.7 forgetful (recover to clean state at each boot)
kernel (hd0,4)/slax-6.0.7/boot/vmlinuz ramdisk_size=6666 root=/dev/ram0 rw autoexec=xconf;telinit~4 from=/slax-6.0.7/
initrd (hd0,4)/slax-6.0.7/boot/initrd.gz

title otg linux (Taiwan education edition)
kernel (hd0,4)/isolinux/vmlinuzlive boot=casper splash noquiet ip=frommedia break=nobreak persistent noprompt
initrd (hd0,4)/isolinux/initrdlive.img

多重詞區
default  0
timeout 10
splashimage=/boot/grub/gnu-tux-usb.xpm.gz

## End Default Options ##

title ttylinux
kernel /boot/ttylinux/isolinux/bzImage load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=8192 ro root=/dev/ram0
initrd /boot/ttylinux/isolinux/filesys

title Damn Small Linux 4.2.5
kernel (hd0,4)/boot/isolinux/linux24 ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 nomce noapic quiet BOOT_IMAGE=knoppix
initrd (hd0,4)/boot/isolinux/minirt24.gz

title slax 6.0.7
kernel (hd0,5)/boot/vmlinuz ramdisk_size=6666 root=/dev/ram0 rw autoexec=xconf;telinit~4 changes=/slax/
initrd (hd0,5)/boot/initrd.gz

title otg linux (Taiwan education edition)
kernel (hd0,6)/isolinux/vmlinuzlive boot=casper splash noquiet ip=frommedia break=nobreak noprompt
initrd (hd0,6)/isolinux/initrdlive.img

# title Edubuntu
# kernel (hd0,7)/casper/vmlinuz file=/cdrom/preseed/edubuntu.seed boot=casper quiet splash --
# initrd (hd0,7)/casper/initrd.gz

開始將各種LiveCD解壓縮放入隨身碟:
由於使用單一分割磁區,因此將各個不同的linux版本分別放到不同的資料夾
以我自己做的(DSL, Puppy, Slax)為例子
DSL:放在/dls/
Slax:放在/myslax/
Puppy:放在/puppy/


title DSL
kernel (hd0,0)/dsl/boot/isolinux/linux24 ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 nomce noprompt quiet knoppix_dir=/dsl/knoppix BOOT_IMAGE=knoppix
initrd (hd0,0)/dsl/boot/isolinux/minirt24.gz


title Slax6.0.7
kernel (hd0,0)/myslax/boot/vmlinuz from=/myslax/ ramdisk_size=6666 root=/dev/ram0 rw autoexec=xconf;telinit~4 changes=/myslax/slax/
initrd (hd0,0)/myslax/boot/initrd.gz


title Puppy Linux
kernel (hd0,0)/puppy/vmlinuz pmedia=/dev/sda1
initrd (hd0,0)/puppy/initrd.gz

PS:各版本的boot資料夾中參考isolinux.cfg 然後轉成 menu.lst格式,kernel後面的參數不懂就上網問問。有些版本要指定資料夾才能順利開機,如
Slax:...from=/myslax/...changes=/myslax/slax/

DSL:...knoppix_dir=/dsl/knoppix...

Puppy: ...pmedia=/dev/sda1

Ubuntu系列(參考) :
注意a.)映像檔裡面的./disk資料夾一定要複製出來
b.)映像檔裡面所有的檔案一定要複製在隨身碟的根目錄,不可以放在自訂的資料夾。不
然會不能進入系統
menu.lst這樣寫:
##########################
title ubuntu810
root (hd0,0)
kernel /casper/vmlinuz file=/preseed/ubuntu.seed boot=casper all_generic_ide floppy=off irgpoll quiet splash --
initrd /casper/initrd.gz
###########################
ps: all_generic_ide floppy=off irgpoll不一定要加,如果開機有進入busybox再加進來,我的測試是不加也可以開機


參考網頁:
Slax
Ubuntu正體中文

讓隨身碟可以開機~grub安裝

sudo fdisk -l 查詢隨身碟代號(假設在/dev/sdb)
ls /media 查詢隨身碟掛載後的代號(ubuntu都掛載於/media/...下,其他版不一定)
假設掛在/media/disk/
1. mkdir -p /media/disk/boot/grub
2. cp /usr/lib/grub/i386-pc/* /media/disk/boot/grub/
3. gedit(or其他文字編輯器) /media/disk/boot/grub/menu.lst

查詢隨身碟在grub的代號
4. echo yes > /media/disk/my-usb
5. sudo grub --no-floppy

在grub命令列下(grub>)
6. find /my-usb 應該會顯示出/media/disk這個(掛載的)磁區在grub下對應的代號
假設代號為(hd1,0)

~ps:若隨身碟有多個磁區,可以重複4.產生一個檔案到/media/*(其他位置),通常(hd1,0)的"0"會變

法一:(在grub命令列下安裝)

7. root (hd1,0) 取得root權限
8. setup(hd1) 將grub安裝在隨身碟的MBR
9. quit 退出grub


法二:(跳出grub再安裝)

7. sudo grub-install --root-directory=/media/disk '(hd0)'

qemu -usb /deb/sdb測試是否安裝成
(沒有qemu就只能重開機或其他支援usb開機的虛擬機)

參考網頁:
如何使隨身碟能開機的方法
動手學 grub