1.世界上的技术是人类发明出来的,但并不是说人家就有义务给你免费分享
2.不要老是抱怨没有高手教你,你应该看到你自己本身的程度提出的问题是不是值得人家花时间,你的时间宝贵人家也是
3.最好的学习地方是论坛上,人家已经发出来的帖子还有整集整集的资料,你没有资格去要求人家重新再告诉你一次,如果让你把一句话重复给几万个人听你也会不愿意的
4.用一个软件入侵成功就叫自己黑客或者红客的人那是弱智,等于有位智者说的第一个吃螃蟹的人是勇者,第二个是弱智
5.学好基础的东西,c语言是每个黑客必须掌握的语言,这个是前辈的教训我们得听,但是学习一门语言光学不够还要自己动手做,不要老是沉溺于a b c i j k n m加来减去,有很多优秀的源代码在论坛的资料库里等着你
6.记住一句话,学技术先学做人!科学技术是一把双刃刀,杀人救人取决于所用之人,如果你想跟全世界为敌,可以,你先自己称称自己的重量
7.尊重你身边的人,红客不是一种高高在上的职位,你没有资格看不起你身边的人,所谓王者也得礼贤下士,更何况比你厉害的人不止一堆
8.前辈的话必须听,人家吃的盐比你吃的饭还要多,但是你也必须要有自己的个性和原则,不能盲目而从,所以我们的经验是:走自己的路,听别人的劝。遇事先冷静5秒钟,再作决定
9.跟第一条相反,有些东西你必须教给后辈的,你就得教。比如如何做好一个红客,如何从零开始,如何守好自己的技术道德,教好后辈不走歧路是一个前辈的责任
10.最后一点,红客是中国的一种文化,无论是以身为红客还是准备踏进红客这个文化大门的你和我,都是有责任让它发扬光大
---什么是黑客?
Jargon File中对“黑客”一词给出了很多个定义,大部分定义都涉及高超的编程技术,强烈的解决问题和克服限制的欲望。如果你想知道如何成为一名黑客,那么好,只有两方面是重要的。(态度和技术)
长久以来,存在一个专家级程序员和网络高手的共享文化社群,其历史可以追溯到几十年前第一台分时共享的小型机和最早的ARPAnet实验时期。 这个文化的参与者们创造了“黑客”这个词。 黑客们建起了Internet。黑客们使Unix操作系统成为今天这个样子。黑客们搭起了Usenet。黑客们让WWW正常运转。如果你是这个文化的一部分,如果你已经为它作了些贡献,而且圈内的其他人也知道你是谁并称你为一个黑客,那么你就是一名黑客。
黑客精神并不仅仅局限于软件黑客文化圈中。有些人同样以黑客态度对待其它事情如电子和音乐---事实上,你可以在任何较高级别的科学和艺术中发现它。软件黑客们识别出这些在其他领域同类并把他们也称作黑客---有人宣称黑客实际上是独立于他们工作领域的。 但在本文中,我们将注意力集中在软件黑客的技术和态度,以及发明了“黑客”一词的哪个共享文化传统之上。
另外还有一群人,他们大声嚷嚷着自己是黑客,实际上他们却不是。他们是一些蓄意破坏计算机和电话系统的人(多数是青春期的少年)。真正的黑客把这些人叫做“骇客”(cracker),并不屑与之为伍。多数真正的黑客认为骇客们是些不负责任的懒家伙,还没什么大本事。专门以破坏别人安全为目的的行为并不能使你成为一名黑客, 正如拿根铁丝能打开汽车并不能使你成为一个汽车工程师。不幸的是,很多记者和作家往往错把“骇客”当成黑客;这种做法激怒真正的黑客。
根本的区别是:黑客们建设,而骇客们破坏。
如果你想成为一名黑客,继续读下去。如果你想做一个骇客,去读 alt.2600 新闻组,并在发现你并不像自己想象的那么聪明的时候去坐5到10次监狱。 关于骇客,我只想说这么多。
---黑客的态度
黑客们解决问题,建设事物,信仰自由和双向的帮助,人人为我, 我为人人。
要想被认为是一名黑客,你的行为必须显示出你已经具备了这种态度。要想做的好象你具备这种态度,你就不得不真的具备这种态度。但是如果你想*培养黑客态度在黑客文化中得到承认,那就大错特错了。因为成为具备这些特质的这种人对你自己非常重要,有助于你学习,并给你提供源源不断的活力。同所有有创造性的艺术一样,成为大师的最有效方法就是模仿大师的精神---不是仅从理智上,更要从感情上进行模仿。
So,如果你想做一名黑客,请重复以下事情直到你相信它们:
1 这世界充满待解决的迷人问题
做一名黑客有很多乐趣,但却是些要费很多气力方能得到的乐趣。 这些努力需要动力。成功的运动员从健壮体魄,挑战自我极限中汲取动力。同样,做黑客,你必须
要有从解决问题,磨练技术,锻炼智力中得到基本的热望。如果你还不是这类人又想做黑客,你就要设法成为这样的人。否则你会发现,你的黑客热情会被其他诱惑无情地吞噬掉---如金钱、性和社会上的虚名。
(同样你必须对你自己的学习能力建立信心---相信尽管你对某问题所知不多,但如果你一点一点地学习、试探,你最终会掌握并解决它。)
2. 一个问题不应该被解决两次
聪明的脑瓜是宝贵的,有限的资源。当这个世界还充满其他有待解决的有趣问题之时,他们不应该被浪费在重新发明轮子这些事情上。 作为一名黑客,你必须相信其他黑客的思考时间是宝贵的---因此共享信息,解决问题并发布结果给其他黑客几乎是一种道义,这样其他人就可以去解决新问题而不是重复地对付旧问题。
(你不必认为你一定要把你的发明创造公布出去,但这样做的黑客是赢得大家尊敬最多的人。卖些钱来给自己养家糊口,买房买车买计算机甚至发大财和黑客价值也是相容的,只要你别忘记你还是个黑客。) 3. 无聊和乏味的工作是罪恶
黑客们应该从来不会被愚蠢的重复性劳动所困扰,因为当这种事情发生时就意味着他们没有在做只有他们才能做的事情---解决新问题。这样的浪费伤害每一个人。因此,无聊和乏味的工作不仅仅是令人不舒服而已,它们是极大的犯罪。 要想做的象个黑客,你必须完全相信这点并尽可能多地将乏味的工作自动化,不仅为你自己,也为了其他人(尤其是其他黑客们)。
(对此有一个明显的例外。黑客们有时也做一些重复性的枯燥工作以进行“脑力休息”,或是为练熟了某个技巧,或是获得一些除此无法获得的经验。但这是他自己的选择---有脑子的人不应该被迫做无聊的活儿。)
4 自由就是好
黑客们是天生的反权威主义者。任何能向你发命令的人会迫使你停止解决令你着迷的问题,同时,按照权威的一般思路,他通常会给出一些极其愚昧的理由。因此,不论何时何地,任何权威,只要他压迫你或其他黑客,就要和他斗到底。
(这并非说任何权力都不必要。儿童需要监护,罪犯也要被看管起来。 如果服从命令得到某种东西比起用其他方式得到它更节约时间,黑客会同意接受某种形式的权威。但这是一个有限的、特意的交易;权力想要的那种个人服从不是你的给予,而是无条件的服从。)
权力喜爱审查和保密。他们不信任自愿的合作和信息共享---他们只喜欢由他们控制的合作。因此,要想做的象个黑客,你得对审查、保密,以及使用武力或欺骗去压迫人们的做法有一种本能的反感和敌意。
5. 态度不能替代能力
要做一名黑客,你必须培养起这些态度。但只具备这些态度并不能使你成为一名黑客,就象这并不能使你成为一个运动健将和摇滚明星一样。成为一名黑客需要花费智力,实践,奉献和辛苦。
因此,你必须学会不相信态度,并尊重各种各样的能力。黑客们不会为那些故意装模做样的人浪费时间,但他们却非常尊重能力---尤其是做黑客的能力,不过任何能力总归是好的。具备很少人才能掌握的技术方面的能力尤其为好,而具备那些涉及脑力、技巧和聚精会神的能力为最好。
如果你尊敬能力,你会享受提高自己能力的乐趣---辛苦的工作和奉献会变成一种高度娱乐而非*役。 要想成为一名黑客,这一点非常重要。
---基本黑客技术
黑客态度是重要的,但技术更加重要。态度无法替代技术,在你被别的黑客称为黑客之前,有一套基本的技术你必须掌握。 这套基本技术随着新技术的出现和老技术的过时也随时间在缓慢改变。例如,过去包括使用机器码编程,而知道最近才包括了HTML语言。但现在明显包括以下技术:
1 学习如何编程
这当然是最基本的黑客技术。如果你还不会任何计算机语言,我建议你从Python开始。它设计清晰,文档齐全,对初学者很合适。尽管是一门很好的初级语言,它不仅仅只是个玩具。它非常强大,灵活,也适合做大型项目。
但是记住,如果你只会一门语言,你将不会达到黑客所要求的技术水平,甚至也不能达到一个普通程序员的水平---你需要学会如何以一个通用的方法思考编程问题,独立于任何语言。要做一名真正的黑客,你需要学会如何在几天内通过一些手册,结合你现在所知,迅速掌握一门新语言。这意味着你应该学会几种不同的语言。
如果要做一些重要的编程,你将不得不学习C语言,Unix的核心语言。其他对黑客而言比较重要的语言包括Perl和LISP。 Perl很实用,值得一学;它被广泛用于活动网页和系统管理,因此即便你从不用Perl写程序,至少也应该能读懂它。 LISP 值得学习是因为当你最终掌握了它你会得到丰富的经验;这些经验使你在以后的日子里成为一个更好的程序员,即使你实际上可能很少使用LISP本身。
当然,实际上你最好四种都会。 (Python, C, Perl, and LISP). 除了是最重要的四种基本语言,它们还代表了四种非常不同的编程方法,每种都会让你受益非浅。这里我无法完整地教会你如何编程---这是个复杂的活儿。但我可以告诉你,书本和课程也不能作到。几乎所有最好的黑客都是自学成材的。真正能起作用的就是去亲自读代码和写代码。
学习如何编程就象学习用自然语言写作一样。最好的做法是读一些大师的名著,试着自己写点东西,再读些,再写点,又读些,又写点....如此往复,直到你达到自己在范文中看到的简洁和力量。
过去找到好的代码去读是困难的,因为很少有大型程序的可用源代码能让新手练手。这种状况已经得到了很大的改善;现在有很多可用的开放源码软件,编程工具和操作系统(全都有黑客写成)。这使我们自然地来到第二个话题...
2 得到一个开放源码的Unix并学会使用、运行它
我假设你已经拥有了一台个人计算机或者有一个可用的( 今天的孩子们真幸福 :-) )。新手们最基本的一步就是得到一份Linux或BSD-Unix,安装在个人计算机上,并运行它。
当然,这世界上除了Unix还有其他操作系统。但它们都是以二进制形式发送的---你无法读到它的源码,更不可能修改它。尝试在DOS或Windows的机器上学习黑客技术,就象是在腿上绑了铁块去学跳舞。
除此之外,Unix还是Internet的操作系统。你可以不知道Unix而学会用Internet,但不懂它你就无法成为一名Internet黑客。因为这个原因,今天的黑客文化在很大程度上是以Unix为中心的。(这点并不总是真的,一些很早的黑客对此很不高兴,但Unix和Internet之间的共生关系已是如此之强,甚至连微软也无可奈何)
So,装一个Unix---我个人喜欢Linux,不过也有其他选择。(你也可以在同一台机器上同时运行DOS,Windows和Linux)学会它。运行它。用它跟Internet对话。读它的代码。试着去修改他。你会得到比微软操作系统上好的多的编程工具(包括C,Lisp, Python, and Perl),你会得到乐趣,并将学到比你想象的更多知识。
关于学习Unix的更多信息,请看 The Loginataka.
要得到Linux,请看: 哪里能得到 Linux.
3 学会如何使用WWW和写HTML
大多黑客文化建造的东西都在你看不见的地方发挥着作用,帮助工厂、办公室和大学正常运转,表面上很难看到它对他人的生活的影响。Web是一个大大的例外。即便政客也同意,这个巨大而耀眼的黑客玩具正在改变整个世界。单是这个原因(还有许多其它的), 你就需要学习如何掌握Web。
这并不是仅仅意味着如何使用浏览器(谁都会),而是要学会如何写HTML,Web的标记语言。如果你不会编程,写HTML会教你一些有助于学习的思考习惯。因此,先建起自己的主页。
但仅仅建一个主页也不能使你成为一名黑客。 Web里充满了各种网页。多数是无意义的,零信息量垃圾。
要想有价值,你的网页必须有内容---必须有趣或对其它黑客有用。这样,我们来到下一个话题....
---黑客文化中的地位
象大部分不涉及金钱的文化一样,黑客王国的运转*声誉维护。你设法解决有趣的问题,但它们到底多有趣,你的解法有多好,是要有那些和你具有同样技术水平的人或比你更牛的人去评判的。
相应地,当你在玩黑客游戏时,你知道,你的分数要*其他黑客对你的技术的评估给出。(这就是为什么只有在其它黑客称你为黑客是,你才算得上是一名黑客)这个事实常会被黑客是一项孤独的工作这一印象所减弱;它也会被另一个黑客文化的禁忌所减弱(此禁忌的效力正在减弱但仍很强大):拒绝承认自我或外部评估是一个人的动力。
特别地,黑客王国被人类学家们称为一种精英文化。在这里你不是凭借你对别人的统治来建立地位和名望,也不是*美貌,或拥有其他人想要的东西,而是*你的奉献。尤其是奉献你的时间,你的才智和你的技术成果。
要获得其他黑客的尊敬,你可以做以下五种事情:
1. 写开放源码的软件
第一个(也是最基本和传统的)是写些被其他黑客认为有趣或有用的程序,并把程序的原代码公布给大家共享。(过去我们称之为“自由软件-free software”,但这却使很多不知free的精确含义的人感到不解。现在我们很多人使用“开放源码-open source”这个词)
黑客王国里最受尊敬的大牛们是那些写了大型的、具有广泛用途的软件,并把它们公布出去,使每人都在使用他的软件的人。
2. 帮助测试并修改开放源码的软件
黑客们也尊敬也那些使用、测试开放源码软件的人。在这个并非完美的世界上,我们不可避免地要花大量软件开发的时间在测试和抓臭虫阶段。 这就是为什么任何开放源码的作者稍加思考后都会告诉你好的beta测试员象红宝石一样珍贵。 (他知道如何清楚描述出错症状,很好地定位错误,能忍受快速发布的软件中的bug,愿意使用一些简单的诊断工具) 甚至他们中的一个能判断出哪个测试阶段是延长的、令人精疲力尽的噩梦,哪个只是一个有益健康的玩意儿。
如果你是个新手,试着找一个赶兴趣的正在开发的程序,作一个好的beta测试员。从帮着测试,到帮着抓臭虫,到最后帮着改程序,你会不断进步。以后你写程序时,会有别人来帮你,你就得到了你当初善举的回报。
3. 公布有用的信息
另一个好事是收集整理网页上有用有趣的信息或文档如FAQ。许多主要FAQ的维护者和其他开放源码的作者一样受到大家的尊敬。
4. 帮助维护基础设施的运转
黑客文化是*自愿者运转的。要使Internet能正常工作,就要有大量枯燥的工作不得不去完成----管理mail list,newsgroup,维护大量文档,开发RFC和其它技术标准等等。做这类事情的人会得到很多人的尊敬,因为每人都知道这些事情是耗时耗力的苦役,不象编码那样好玩。做这些事情需要毅力。
5. 为黑客文化本身服务
最后,你可以为这个文化本身服务(例如象我这样,写一个“如何成为黑客”的初级教程 :-) )(hehe,象我这样把它翻成中文 :-) ) 这并非一定要在你已经在这里呆了很久,精通所有以上4点,获得一定声誉后后才能去做。
黑客文化没有领袖。精确地说,它确实有些文化英雄和部落长者和历史学家和发言人。若你在这圈内呆的够长,你或许成为其中之一。
记住:黑客们不相信他们的部落长者的自夸的炫耀,因此很明显地去追求这种名誉是危险的。你必须具备基本的谦虚和优雅。
---黑客和怪人(Nerd)的联系
同流行的传说相反,做一名黑客并不一定要你是个怪人。然而,很多黑客都是怪人。做一个出世者有助于你集中精力进行更重要的事情,如思考和编程。
因此,很多黑客都愿意接受“怪人”这个标签,更有甚者愿意使用“傻子(geek)”一词并自以为豪---这是宣布他们与主流社会不合作的声明。
如果你能集中足够的精力来做好黑客同时还能有正常的生活,这很好。今天作到这一点比我在1970年代是个新手是要容易的多。今天主流文化对技术怪人要友善的多。甚至有更多的人意识到黑客通常更富爱心,是块很好的做恋人和配偶的材料。 更多信息见 Girl's Guide to Geek Guys.
如果你因为生活上不如意而为做黑客而吸引,那也没什么---至少你不会分神了。或许以后你会找到自己的另一半。
---风格的意义
重申一下,做一名黑客,你必须进入黑客精神之中。当你不在计算机边上时,你仍然有很多事情可做。它们并不能替代真正的编程(没有什么能替代编程),但很多黑客都那么做,并感到它们与黑客精神存在一种本质的关联。
阅读科幻小说。参加科幻小说讨论会。(一个很好的寻找黑客的场合)
研究禅宗,或练功习武。
练就一双精确的耳朵,学会鉴赏特别的音乐。学会玩某种乐器,或唱歌。
提高对双关语的鉴赏。
学会流畅地用母语写作。(令人惊讶的时,我所知道的所有最棒的黑客,都是很不错的作家)
这些事情,你做的越多,你就越适合做黑客。至于为什么偏偏是这些事情,原因并不很清楚,但它们都涉及到了左-右脑的综合技巧,这似乎是关键所在。(黑客们既需要清晰的逻辑思维,有时也需要强烈的跳出逻辑之外的直觉最后,还有一些不要去做的事情。
不要使用愚蠢的,过于哗众取宠的ID
不要自称为网络崩客(punk) ,也不要对那些人浪费时间
不要寄出充满拼写和语法错误的email,或张贴错误百出的文章
做以上的事情,会使大大损害你的声誉。黑客们个个记忆超群---你将需要数年的时间让他们忘记你的愚蠢。
---其它资源
Peter Seebach为那些不知如何同黑客打交道的经理们维护了一个非常精彩的黑客FAQ。
The Loginataka 有许多关于如何正确培养一个Unix黑客的态度的材料。
我也曾写过一篇“黑客文化简史”。
我还写过另一篇文章,“大教堂与集市”,解释了许多Linux和开放源码文化的运做原理。我还在它的续集“开拓智域”一文中有更直接的论述。
---FAQ(常问问题解答)
问:你会教我如何做黑客吗?
自从第一次发布此页,我每周都会得到一些请求,要我“教会他如何做黑客”;遗憾的是,我没有足够的时间和精力来做这个;我自己的编程项目已经占用了我110%的时间。
甚至即便我想教你也不可能,黑客基本上是一项需要你自行修炼的的态度和技术。你会发现即使真正的黑客想帮助你,如果你乞求他们填鸭一样教你的话,你不会赢得他们的尊敬。
首先去学习。显示你在尝试,你能*自己去学习。然后再去向黑客们请教问题。
问:你会帮我“黑”掉一个站点吗?或者教我怎么黑它?
No. 任何在读完FAQ后还问此问题人,都是愚不可及的家伙,即使有时间我也不会理睬。 任何发给我的此类mail都会被忽略或被痛斥。
问:哪里能找到真正的可以与之交流的黑客?
最佳办法是就近参加一个Unix或Linux的用户组,参加他们的会议。
问:我该先学哪种语言?
HTML, 如果你还不会的话.
但它不是一个真正的编程语言。当你准备编程时,我建议你从 Python开始. 会有很多人向你推荐Perl,它比Python还受欢迎,但却难学一些。
C 是非常重要的,但它却是最难学的。不要一开始就尝试学C。
问:开放源码的自由软件不会使程序员饿肚子吗?
这似乎不大可能---到目前,开放源码软件产业创造了而不是消灭了大量工作机会。
如果写一个程序比不写一个程序只是个纯粹经济上的收益的话,无论它是否免费,只要它被完成,程序员都会从中得到回报。而且,无论软件是由多么的free的方法开发的,对更新的软件应用的需求总是会有的。
问:我从何学起?哪里有免费的Unix?
本页的其他地方指向最常用的免费Unix。要做一名黑客,你需要自立自强,以及自我教育的能力。
现在开始吧......
FAQ(常问问题解答)(转) 问:你能教我做黑客吗? 问:那么,我要如何开始? 问:我得什么时候开始学?现在会不会太迟了? 问:要学多久才能学会黑客道? 问:Visual Basic及Delphi是好的入门语言吗? 问:你能帮我“黑”掉一个站点吗?或者教我怎么黑它? 问:我怎么样才能得到别人帐号的密码? 问:我如何入侵/查看/监视别人的Email? 问:我如何才能在IRC聊天室里偷到频道op的特权? 问:我被黑了。你能帮我避免以后再被攻击吗? 问:我的Windows软件出现问题了。你能帮我吗? 问:我在哪里能找到可以与之交流的真正的黑客? 问:你能推荐一些有关黑客的好书吗? 问:成为一名黑客我需要擅长数学吗? 问:我该从那种语言学起? 问:我需要什么样的机器配置? 问:我得因此憎恨和反对Microsoft吗? 问:但开放源代码软件不会使程序员丢饭碗吗? 问:我要如何开始?哪里有免费的Unix? 问:你能教我做黑客吗?
答:自从第一次发布这份文档,我每周都会收到一些请求,(频繁的话一天几封)要我“教会他们做黑客”。遗憾的是,我没有时间和精力来做这个;我自己的黑客项目,及我作为一个开放源代码倡导者的四处奔波已经占用了我110%的时间。
即便我想教你,黑客也依然基本上是一项自行修炼的的态度和技术。当真正的黑客想帮助你的时候,如果你乞求他们一汤匙一汤匙“喂”你的话,你会发现他们不会尊重你。
先去学一些东西。显示你在尝试,你能靠自己去学习。然后再去向你遇到的黑客请教特殊的问题。
如果你发E-mail给一位黑客寻求他的帮助,这是两件首要记住的事情。第一,写出来的文字显得懒且粗心的人通常非常懒于思考且非常马大哈,不能成为好黑客—— 因此注意拼写正确,使用正确的语法及发音,否则你可能会无人理睬。第二,不要试图要求回复到一个ISP帐号,而那个帐号与你的发信地址不同。这样做的人一般是使用盗用帐号,不会有人有兴趣为虎作伥帮助窃贼的。
问:那么,我要如何开始?
答:对你而言最佳的入门方式也许是去参加LUG(Linux用户组)的聚会。你可以找到在 LDP的综合Linux信息页面上找到类似的组织;也许有一个在你家附近的,而且非常有可能与一所大学或学校挂钩。如果你提出要求,LUG成员兴许会给你一套Linux,当然此后会帮你安装并带你入门。
问:我得什么时候开始学?现在会不会太迟了?
答:你有动力学习的时候就是好时候。大多数人看来都是在15-20岁之间开始感兴趣的,但据我所知,在此年龄段之外的例外也是有的。
问:要学多久才能学会黑客道?
答:这取决于你的聪明程度和努力程度。大多数人只要他们专注,就能在18个月到2年之间学会一套令人尊敬的技能。但是,不要以为就此结束了;如果你是一个真正的黑客,你要用你的余生来学习和完善你的技术。
问:Visual Basic及Delphi是好的入门语言吗?
答:不,因为他们不是可移植的。他们不是那些语言的开放源代码实现,所以你被限制在厂商选择支持的那些平台里。接受这样一种垄断局面不是黑客的态度。
Visual Basic特别糟糕。它是Microsoft的私有语言这个事实就足够让它脸面全无,不像其他的Basic,它是一种设计糟糕的语言会教给你坏的编程习惯。
其中一个坏习惯是会依赖于单一厂商的函数库、控件及开发工具。一般而言,任何不能够支持至少Linux或者一种BSD,或其他第三方操作系统的语言,都是一种不适合应付黑客工作的语言。
问:你能帮我“黑”掉一个站点吗?或者教我怎么黑它?
答:No。任何读完这份FAQ后还问这个问题的人,都是无可救药的蠢材,即使有时间指教我也不会理睬。任何发给我的此类E-mail都会被忽略或被痛骂一顿。
问:我怎么样才能得到别人帐号的密码?
答:这是骇客行为。滚得远远的,白痴。
问:我如何入侵/查看/监视别人的Email? 答:这是骇客行为。在我面前消失,混蛋。
问:我如何才能在IRC聊天室里偷到频道op的特权?
答:这是骇客行为。去S吧,冥顽不灵的家伙。
问:我被黑了。你能帮我避免以后再被攻击吗?
答:不行。目前为止,每次问我这个问题的,都是一些运行Microsoft Windows的菜鸟。不可能有效的保护Windows系统免受骇客攻击;太多缺陷的代码和架构使保护Windows的努力有如隔靴搔痒。唯一可靠的预防来自转移到Linux或其他设计得至少足够安全的系统。
问:我的Windows软件出现问题了。你能帮我吗?
答:当然。进入DOS方式,然后键入“format c:”。你遇到的任何问题将会在几分钟之内消失。
问:我在哪里能找到可以与之交流的真正的黑客?
答:最佳办法是在你附近找一个Unix或Linux的用户组,参加他们的聚会。(你可以在Metalab的LDP站点找到一些指向用户组的链接。)
我过去曾说过不能在IRC上找到真正的黑客,但我发觉现在情况有所改变。显然一些真正的黑客的社区像GIMP及Perl,也有IRC频道了。)
问:你能推荐一些有关黑客的好书吗?
答:我维护着一份Linux Reading List HOWTO,也许你会觉得有用。 Loginataka也很有意思。
关于Python的介绍,请访问在Python站点上的 入门资料。
问:成为一名黑客我需要擅长数学吗?
答:不用。黑客道很少使用常规的数学或算术,不过你绝对需要能逻辑性地思考和进行精密的推理。
尤其是你不会用到微积分或电路分析(我们把这些留给电子工程师们 :-))。 一些有限数学(包括布尔代数,集合论,组合数学,图论)的背景知识会有帮助。
问:我该从那种语言学起?
答:HTML——如果你还不懂的话。市面上有一大堆的封面精美,宣传得天花乱坠的 糟糕的 HTML书籍,不幸的是很少有好的。我最喜欢的是 HTML: The Definitive Guide。
但 HTML 不完全是一种编程语言。当你准备开始编程时,我推荐从 Python起步。你会听到一大群人推荐 Perl,并且 Perl 依然比 Python 流行得多,但是难学得多且(以我之见)设计得不是很好。
C 确实重要,但它要比 Python 或 Perl 难多了。不要尝试先学 C。
Windows用户不要满足于 Visual Basic。它会教给你坏习惯,而且它不可以移植,只能在Windows下运行。避免它。
问:我需要什么样的机器配置?
答:过去个人电脑能力相当不够并且内存小,结果给黑客的学习过程设置了人为的障碍。不过一段时间以前开始就不是这样了;任何配置比一台 Intel 486DX50 好的机器都有足够的能力进行开发工作,X,及 Internet 通讯,同时你现在买的最小的磁盘都大得富足了。(依Barret之见,现在要至少Pentium 166MMX才够。)
选择用来学习的机器时重要的一点是注意配件是否是Linux兼容的(或BSD兼容,如果你选择学 BSD)。同刚才提到的一样,大多数现在的机器都是符合的;唯一的值得注意的区域在于 modem和打印机;有些具备为Windows设计的配件的机器不会在Linux下工作。
关于硬件兼容性有一个FAQ;最新版本在 这里。
问:我得因此憎恨和反对Microsoft吗?
答:不,你不必如此。不是因为Microsoft不令人讨厌,而是因为黑客文化早在 Microsoft出现之前就存在了,且将在Microsoft成为历史后依然存在。你耗费在憎恨Microsoft的任何力气不如花在爱你的技术上。写好的代码—— 那会相当有效地打击Microsoft又不会让你得到恶报应。
问:但开放源代码软件不会使程序员丢饭碗吗?
答:看起来不太可能——目前为止,开放源代码软件产业似乎创造了更多的就业机会而不是减少就业机会。如果写一个程序比起不写来是纯经济收益的话,那么在写完后,程序员应该得到报酬不管程序是否是开放源代码。并且,无论写出多么“免费自由”的软件,都存在更多对新的,定制的软件的需求。我有这方面更多的论述,放在开放源代码 网站资料中。
问:我要如何开始?哪里有免费的Unix?
答:在本份文档的某个地方我已经提到过何处可以得到最常用的免费Unix。要做一名黑客,你需要自立自强,以及自学能力。现在开始吧……
Linux菜鸟,擅长重装Windows。 黑客守则
1. 不恶意破坏任何的系统, 这样作只会给你带来麻烦。恶意破坏它人的软件将导致法律责任, 如果你只是使用电脑, 那仅为非法使用。 注意:千万不要破坏别人的文件或数据。
2. 不修改任何系统文件, 如果你是为了要进入系统而修改它, 请在达到目的后将它还原。
3. 不要轻易的将你要 Hack 的站点告诉你不信任的朋友。
4. 不要在 bbs/论坛上谈论关于你 Hack 的任何事情。
5. 在 Post 文章的时候不要使用真名。
6. 入侵期间, 不要随意离开你的电脑。
7. 不要入侵或攻击电信/政府机关的主机。
8. 不在电话中谈论关于你 Hack 的任何事情。
9. 将你的笔记放在安全的地方。
10.读遍所有有关系统安全或系统漏洞的文件 (英文快点学好)!
11.已侵入电脑中的帐号不得删除或修改。
12.不得修改系统文件, 如果为了隐藏自己的侵入而作的修改则不在此限, 但仍须维持原来系统的安全性, 不得因得到系统的控制权而破坏原有的安全性。
13.不将你已破解的帐号分享与你的朋友。
14.不要侵入或破坏政府机关的主机。
黑客精神
1.这世上充满著等着被解决的迷人问题。
2.没有任何人必须一再的解决同一个问题。
3.无聊而单调的工作是有害的。
4.自由才好。
5.态度并非不等效于能力 6.写免费的软件。
7.帮忙test和debug免费的软件。
8.公布有用的资讯。
9.帮忙维持一些简单的工作。
10.为hacker文化而努力。 黑客道简史
作者: 埃里克.雷蒙德 --------------------------------------------------------------------------------
本篇原作者为EricS.Raymond,他是一位大哥级的Hacker,写了很多自由软件
,知名著作有JargonFile等,近年来发表“大教堂与集市”论文为Opensource
software努力,Netscape愿意公开Navigator的原始码,与这篇文章有很大的关系
。
序曲:RealProgrammer
故事一开始,我要介绍的是所谓的RealProgrammer。
他们从不自称是RealProgrammer、Hacker或任何特殊的称号;
`RealProgrammer'这个名词是在1980年代才出现,但早自1945年起,电脑科学便不
断地吸引世界上头脑最顶尖、想像力最丰富的人投入其中。从Eckert&Mauchly发明
ENIAC後,便不断有狂热的programmer投入其中,他们以撰写软件与玩弄各种程式
设计技巧为乐,逐渐形成具有自我意识的一套科技文化。当时这批
RealProgrammers主要来自工程界与物理界,他们戴著厚厚的眼镜,穿聚酯纤维T恤
与纯白袜子,用机器语言、汇编语言、FORTRAN及很多古老的语言写程式。他们是
Hacker时代的先驱者,默默贡献,却鲜为人知。
从二次大战结束後到1970早期,是打卡计算机与所谓"大铁块"的mainframes
流行的年代,由RealProgrammer主宰电脑文化。Hacker传奇故事如有名的Mel(收录
在JargonFile中)、Murphy'sLaw的各种版本、mockGerman`Blinke_nlight'文章都
是流传久远的老掉牙笑话了。
※译者:
JargonFile亦是本文原作者所编写的,里面收录了很多Hacker用语、缩写意义
、传奇故事等等。JargonFile有出版成一本书:TheNewHacker'sDictionary,
MITPRESS出版。也有Online版本:http://www.ccil.org/jargon
※译者:
莫非定律是:当有两条路让你抉择,若其中一条会导致失败,你一定会选到它
。它有很多衍生说法:比如一个程式在demo前测试几千几万次都正确无误,但demo
那一天偏偏就会出bug。
一些RealProgrammer仍在世且十分活跃(本文写在1996年)。超级电脑Cray的设
计者SeymourCray,据说亲手设计Cray全部的硬体与其操作系统,作业系统是他用
机器码硬干出来的,没有出过任何bug或error。RealProgrammer真是超强!
举个比较不那么夸张的例子:StanKellyBootle,TheDevil'sDPDictionary一
书的作者(McGrawHill,1981年初版,ISBN0-07-034022-6)与Hacker传奇专家,当
年在一台ManchesterMarkI开发程式。他现在是电脑杂志的专栏作家,写一些科学
幽默小品,文笔生动有趣投今日hackers所好,所以很受欢迎。其他像
DavidE.Lundstorm,写了许多关於RealProgrammer的小故事,收录在
AfewGoodMenFromUNIVAC这本书,1987年出版,ISBN-0-262-62075-8。
※译:看到这里,大家应该能了解,所谓RealProgrammer指的就是用组合语言
或甚至机器码,把程式用打卡机punch出一片片纸卡片,由主机读卡机输入电脑的
那种石器时代Programmer。
RealProgrammer的时代步入尾声,取而代之的是逐渐盛的
Interactivecomputing,大学成立电算相关科系及电脑网络。它们催生了另一个持
续的工程传统,并最终演化为今天的开放代码黑客文化。
早期的黑客
Hacker时代的滥觞始於1961年MIT出现第一台电脑DECPDP-1。MIT的
TechModelRailroadClub(简称TMRC)的Power andSignalsGroup买了这台机器後,把
它当成最时髦的科技玩具,各种程式工具与电脑术语开始出现,整个环境与文化一
直发展下去至今日。这在StevenLevy的书`Hackers'前段有详细记载
(Anchor/Doubleday公司,1984年出版,
※译:Interactivecomputing并非指Windows、GUI、WYSIWYG等介面,当时有terminal、有shell可以下指令就算是Interactivecomputing了。最先使用Hacker
这个字应该是MIT。1980年代早期学术界人工智慧的权威:MIT的
ArtificialIntelligenceLaboratory,其核心人物皆来自TMRC。从1969年起,正好
是ARPANET建置的第一年,这群人在电脑科学界便不断有重大突破与贡献。
ARPANET是第一个横跨美国的高速网络。由美国国防部所出资兴建,一个实验
性质的数位通讯网络,逐渐成长成联系各大学、国防部承包商及研究机构的大网络
。各地研究人员能以史无前例的速度与弹性交流资讯,超高效率的合作模式导致科
技的突飞猛进。
ARPANET另一项好处是,资讯高速公路使得全世界的hackers能聚在一起,不再
像以前孤立在各地形成一股股的短命文化,网络把他们汇流成一股强大力量。开始
有人感受到Hacker文化的存在,动手整理术语放上网络,在网上发表讽刺文学与讨
论Hacker所应有的道德规范。(JargonFile的第一版出现在1973年,就是一个好例
子),Hacker文化在有接上ARPANET的各大学间快速发展,特别是(但不全是)在信息
相关科系。
一开始,整个Hacker文化的发展以MIT的AILab为中心,但StanfordUniversity
的ArtificialIntelligenceLa_boratory(简称SAIL)与稍後的
CarnegieMellonUniversity(简称CMU)正快速崛起中。三个都是大型的资讯科学研
究中心及人工智慧的权威,聚集著世界各地的精英,不论在技术上或精神层次上,
对Hacker文化都有极高的贡献。
为能了解後来的故事,我们得先看看电脑本身的变化;随著科技的进步,主角
MITAILab也从红极一时到最後淡出舞台。
从MIT那台PDP-1开始,Hacker们主要程式开发平台都是
DigitalEquipmentCorporation的PDP迷你电脑序列。DEC率先发展出商业用途为主
的interactivecomputing及time-sharing操作系统,当时许多的大学都是买DEC的
机器,因为它兼具弹性与速度,还很便宜(相对於较快的大型电脑mainframe)。便
宜的分时系统是Hacker文化能快速成长因素之一,在PDP流行的时代,ARPANET上是
DEC机器的天下,其中最重要的便属PDP-10,PDP-10受到Hacker们的青睐达十五年
;TOPS-10(DEC的操作系统)与MACRO-10(它的组译器),许多怀旧的术语及Hacker传
奇中仍常出现这两个字。
MIT像大家一样用PDP-10,但他们不屑用DEC的操作系统。他们偏要自己写一个
:传说中赫赫有名的ITS。
ITS全名是`IncompatibleTimesharingSystem',取这个怪名果然符合MIT的搞
怪作风--就是要与众不同,他们很臭屁但够本事自己去写一套操作系统。ITS始终
不稳,设计古怪,bug也不少,但仍有许多独到的创见,似乎还是分时系统中开机
时间最久的纪录保持者。
ITS本身是用汇编语言写的,其他部分由LISP写成。LISP在当时是一个威力强
大与极具弹性的程式语言;事实上,二十五年後的今天,它的设计仍优於目前大多
数的程式语言。LISP让ITS的Hacker得以尽情发挥想像力与搞怪能力。LISP是
MITAILab成功的最大功臣,现在它仍是Hacker们的最爱之一。
很多ITS的产物到现在仍活著;EMACS大概是最有名的一个,而ITS的稗官野史
仍为今日的Hacker们所津津乐道,就如同你在JargonFile中所读到的一般。在MIT
红得发紫之际,SAIL与CMU也没闲著。SAIL的中坚份子後来成为PC界或图形使用者
介面研发的要角。CMU的Hacker则开发出第一个实用的大型专家系统与工业用机器
人。
另一个Hacker重镇是XEROXPARC公司的PaloAltoResearchCenter。从1970初期
到1980中期这十几年间,PARC不断出现惊人的突破与发明,不论质或量,软件或硬
体方面。如现今的视窗滑鼠介面,雷射印表机与区域网络;其D系列的机器,催生了能与迷你电脑一较长短的强力个人电脑。不幸这群先知先觉者并不受到公司高层
的赏识;PARC是家专门提供好点子帮别人赚钱的公司成为众所皆知的大笑话。即使
如此,PARC这群人对Hacker文化仍有不可抹灭的贡献。1970年代与PDP-10文化迅速
成长茁壮。Mailinglist的出现使世界各地的人得以组成许多SIG
(Specialinterestgroup),不只在电脑方面,也有社会与娱乐方面的。DARPA对这
些非`正当性'活动睁一只眼闭一只眼,因为靠这些活动会吸引更多的聪明小夥子们
投入电脑领域呢。
有名的非电脑技术相关的ARPANETmailinglist首推科幻小说迷的,时至今日
ARPANET变成Internet,愈来愈多的读者参与讨论。Mailinglist逐渐成为一种公众
讨论的媒介,导致许多商业化上网服务如CompuServe、Genie与Prodigy的成立。
Unix的兴起
此时在新泽西州的郊外,另一股神秘力量积极入侵Hacker社会,终於席卷整个
PDP-10的传统。它诞生在1969年,也就是ARPANET成立的那一年,有个在
AT&TBellLabs的年轻小夥子KenThompson发明了Unix。
Thomspon曾经参与Multics的开发,Multics是源自ITS的操作系统,用来实做
当时一些较新的OS理论,如把操作系统较复杂的内部结构隐藏起来,提供一个介面
,使的programmer能不用深入了解操作系统与硬体设备,也能快速开发程式。
译:那时的programmer写个程式必须彻底了解操作系统内部,或硬体设备。比
方说写有IO的程式,对於硬碟的转速,磁轨与磁头数量等等都要搞的一清二楚才行
。
在发现继续开发Multics是做白工时,BellLabs很快的退出了(後来有一家公司
Honeywell出售Multics,赔的很惨)。KenThompson很喜欢Multics上的作业环境,
於是他在实验室里一台报废的DECPDP-7上胡乱写了一个操作系统,该系统在设计上
有从Multics抄来的也有他自己的构想。他将这个操作系统命名Unix,用来反讽
Multics。
译:其实是KenThompson写了一个游戏`StarTravel'没地方跑,就去找一台的
报废机器PDP-7来玩。他同事Bria_nKernighan嘲笑KenThompson说:「你写的系统
好逊哦,乾脆叫Unics算了。」(Unics发音与太监的英文eunuches一样),後来才
改为Unix。
他的同事DennisRitchie,发明了一个新的程式语言C,於是他与Thompson用C
把原来用汇编语言写的Unix重写一遍。C的设计原则就是好用,自由与弹性,C与
Unix很快地在BellLabs得到欢迎。1971年Thompson与Ritchie争取到一个办公室自
动化系统的专案,Unix开始在BellLabs中流行。不过Thompson与Ritchie的雄心壮
志还不止於此。
那时的传统是,一个操作系统必须完全用汇编语言写成,始能让机器发挥最高
的效能。Thompson与Ritchie,是头几位领悟硬体与编译器的技术,已经进步到作
业系统可以完全用高阶语言如C来写,仍保有不错的效能。五年後,Unix已经成功
地移植到数种机器上。
译:KenThompson与DennisRitchie是唯一两位获得TuringAward(电脑界的诺贝
尔奖)的工程师(其他都是学者)。
这当时是一件不可思议的事!它意味著,如果Unix可以在各种平台上跑的话,
Unix软件就能移植到各种机器上。再也用不著为特定的机器写软件了,能在Unix上
跑最重要,重新发明轮子已经成为过去式了。
除了跨平台的优点外,Unix与C还有许多显著的优势。Unix与C的设计哲学是
KeepItSimple,Stupid'。programmer可以轻易掌握整个C的逻辑结构(不像其他之
前或以後的程式语言)而不用一天到晚翻手册写程式。而Unix提供许多有用的小工
具程式,经过适当的组合(写成Shellscript或Perlscript),可以发挥强大的威
力。
※注:TheCProgrammingLanguage是所有程式语言书最薄的一本,只有两百多页哦。作者是BrianKernighan与DennisRitchie,所以这本C语言的圣经又称`K&R'
。
※注:`KeepItSimple,Stupid'简称KISS,今日Unix已不follow这个原则,几
乎所有Unix都是要灌一堆有的没的utilities,唯一例外是MINIX。
C与Unix的应用范围之广,出乎原设计者之意料,很多领域的研究要用到电脑
时,他们是最佳拍档。尽管缺乏一个正式支援的机构,它们仍在AT&T内部中疯狂的
散播。到了1980年,已蔓延到大学与研究机构,还有数以千计的hacker想把Unix装
在家里的机器上。
当时跑Unix的主力机器是PDP-11、VAX系列的机器。不过由於UNIX的高移植性
,它几乎可安装在所有的电脑机型上。一旦新型机器上的UNIX安装好,把软件的C
原始码抓来重新编译就一切OK了,谁还要用汇编语言来开发软件?有一套专为UNIX
设计的网络---UUCP:一种低速、不稳但很成本低廉的网络。两台UNIX机器用条电
话线连起来,就可以使用互传电子邮件。UUCP是内建在UNIX系统中的,不用另外安
装。於是UNIX站台连成了专属的一套网络,形成其Hacker文化。在1980第一个
USENET站台成立之後,组成了一个特大号的分散式布告栏系统,吸引而来的人数很
快地超过了ARPANET。
少数UNIX站台有连上ARPANET。PDP-10与UNIX的Hacker文化开始交流,不过一
开始不怎么愉快就是了。PDP-10的Hacker们觉得UNIX的拥护者都是些什么也不懂的
新手,比起他们那复杂华丽,令人爱不释手的LISP与ITS,C与UNIX简直原始的令人
好笑。『一群穿兽皮拿石斧的野蛮人』他们咕哝著。
在这当时,又有另一股新潮流风行起来。第一部PC出现在1975年;苹果电脑在
1977年成立,以飞快的速度成长。微电脑的潜力,立刻吸引了另一批年轻的
Hackers。他们最爱的程式语言是BASIC,由於它过於简陋,PDP-10的死忠派与UNIX
迷们根本不屑用它,更看不起使用它的人。
译:这群Hacker中有一位大家一定认识,他的名字叫BillGates,最初就是他
在8080上发展BASICcompiler的。
古老时代的终结
1980年同时有三个Hacker文化在发展,尽管彼此偶有接触与交流,但还是各玩
各的。ARPANET/PDP-10文化,玩的是LISP、MACRO、TOPS-10与ITS。UNIX与C的拥护
者用电话线把他们的PDP-11与VAX机器串起来玩。还有另一群散乱无秩序的微电脑
迷,致力於将电脑科技平民化。
三者中ITS文化(也就是以MITAILAB为中心的Hacker文化)可说在此时达到全
盛时期,但乌云逐渐笼罩这个实验室。ITS赖以维生的PDP-10逐渐过时,开始有人
离开实验室去外面开公司,将人工智慧的科技商业化。MITAILab的高手挡不住新公
司的高薪挖角而纷纷出走,SAIL与CMU也遭遇到同样的问题。
译:这个情况在GNU宣言中有详细的描述,请参阅:(特别感谢由AKA chuhaibo
翻成中文)http://www.aka.citf.net/Magazine/Gnu/manifesto.html
致命一击终於来临,1983年DEC宣布:为了要集中在PDP-11与VAX生产线,将停
止生产PDP-10;ITS没搞头了,因为它无法移植到其他机器上,或说根本没人办的
到。而BerkeleyUniveristy修改过的UNIX在新型的VAX跑得很顺,是ITS理想的取代
品。有远见的人都看得出,在快速成长的微电脑科技下,Unix一统江湖是迟早的事
。
差不多在此时StevenLevy完成``Hackers''这本书,主要的资料来源是
RichardM.Stallman(RMS)的故事,他是MITAILab领袖人物,坚决反对实验室的研
究成果商业化。
Stallman接著创办了FreeSoftwareFoundation,全力投入写出高品质的自由软
件。Levy以哀悼的笔调描述他是thelasttruehacker',还好事实证明Levy完全错了
。
译:RichardM.Stallman的相关事迹请参
考:http://www.aka.citf.net/Magazine/Gnu/cover.htmStallman的宏大计划可说是80年代早期Hacker文化的缩影--在1982年他开始建
构一个与UNIX相容但全新的操作系统,以C来写并完全免费。整个ITS的精神与传统
,经由RMS的努力,被整合在一个新的,UNIX与VAX机器上的Hacker文化。微电脑与
区域网络的科技,开始对Hacker文化产生影响。Motorola68000CPU加Ethernet是个
有力的组合,也有几家公司相继成立生产第一代的工作站。1982年,一群Berkeley
出来的UNIXHacker成立了SunMicrosystems,他们的算盘打的是:把UNIX架在以
68000为CPU的机器,物美价廉又符合多数应用程式的要求。他们的高瞻远嘱为整个
工业界树立了新的里程碑。虽然对个人而言,工作站仍太昂贵,不过在公司与学校
眼中,工作站真是比迷你电脑便宜太多了。在这些机构里,工作站(几乎是一人一
台)很快地取代了老旧庞大的VAX等timesharing机器。译:Sun一开始生产的工作
站CPU是用Motorola68000系列,到1989才推出自行研发的以SPARC系列为CPU的
SPARCstation。
私有Unix时代
1984年AT&T解散了,UNIX正式成为一个商品。当时的Hacker文化分成两大类,
一类集中在Internet与USENET上(主要是跑UNIX的迷你电脑或工作站连上网络),
以及另一类PC迷,他们绝大多数没有连上Internet。
※译:台湾在1992年左右连上Internet前,玩家们主要以电话拨接BBS交换资
讯,但是有区域性的限制,发展性也大不如USENET。Sun与其他厂商制造的工作站
为Hacker们开启了另一个美丽新世界。工作站诉求的是高效能的绘图与网络,1980
年代Hacker们致力为工作站撰写软件,不断挑战及突破以求将这些功能发挥到百分
之一百零一。Berkeley发展出一套内建支援ARPANETprotocols的UNIX,让UNIX能轻
松连上网络,Internet也成长的更加迅速。
除了Berkeley让UNIX网络功能大幅提升外,尝试为工作站开发一套图形界面也
不少。最有名的要算MIT开发的Xwindow了。Xwindow成功的关键在完全公开原始码
,展现出Hacker一贯作风,并散播到Internet上。X成功的干掉其他商业化的图形
界面的例子,对数年後UNIX的发展有著深远的启发与影响。少数ITS死忠派仍在顽
抗著,到1990年最後一台ITS也永远关机长眠了;那些死忠派在穷途末路下只有悻
悻地投向UNIX的怀抱。
UNIX们此时也分裂为BerkeleyUNIX与AT&T两大阵营,也许你看过一些当时的海
报,上面画著一台钛翼战机全速飞离一个爆炸中、上面印著AT&T的商标的死星。
BerkeleyUNIX的拥护者自喻为冷酷无情的公司帝国的反抗军。就销售量来说,
AT&TUNIX始终赶不上BSD/Sun,但它赢了标准制订的战争。到1990年,AT&T与BSD版
本已难明显区分,因为彼此都有采用对方的新发明。随著90年代的来到,工作站的
地位逐渐受到新型廉价的高档PC的威胁,他们主要是用Intel80386系列CPU。第一
次Hacker能买一台威力等同於十年前的迷你电脑的机器,上面跑著一个完整的UNIX
,且能轻易的连上网络。沈浸在MS-DOS世界的井底蛙对这些巨变仍一无所知,从早
期只有少数人对微电脑有兴趣,到此时玩DOS与Mac的人数已超过所谓的"网络民族"
的文化,但他们始终没成什么气候或搞出什么飞机,虽然聊有佳作光芒乍现,却没
有稳定发展出统一的文化传统,术语字典,传奇故事与神话般的历史。它们没有真
正的网络,只能聚在小型的BBS站或一些失败的网络如FIDONET。提供上网服务的公
司如CompuServe或Genie生意日益兴隆,事实显示non-UNIX的操作系统因为并没有
内附如compiler等程式发展工具,很少有source在网络上流传,也因此无法形成合
作开发软件的风气。Hacker文化的主力,是散布在Internet各地,几乎可说是玩
UNIX的文化。他们玩电脑才不在乎什么售後服务之类,他们要的是更好的工具、更多的上网时间、还有一台便宜32-bitPC。
机器有了,可以上网了,但软件去哪找?商业的UNIX贵的要命,一套要好几千
大洋($)。90年代早期,开始有公司将AT&T与BSDUNIX移植到PC上出售。成功与否不
论,价格并没有降下来,更要紧的是没有附原始码,你根本不能也不准修改它,以
符合自己的需要或拿去分享给别人。传统的商业软件并没有给Hacker们真正想要的
。
即使是FreeSoftwareFoundation(FSF)也没有写出Hacker想要的操作系统,RMS
承诺的GNU操作系统--HURD说了好久了,到1996年都没看到影子(虽然1990年开始,
FSF的软件已经可以在所有的UNIX平台执行)。
早期的免费Unix
在这空窗期中,1992年一位芬兰HelsinkiUniversity的学生--LinusTorvalds
开始在一台386PC上发展一个自由软件的UNIXkernel,使用FSF的程式开发工具。
他很快的写好简单的版本,丢到网络上分享给大家,吸引了非常多的Hacker来
帮忙一起发展Linux,一个功能完整的UNIX,完全免费且附上全部的原始码。Linux
最大的特色,不是功能上的先进而是全新的软件开发模式。直到Linux的成功前,
人人都认为像操作系统这么复杂的软件,非得要靠一个开发团队密切合作,互相协
调与分工才有可能写的出来。商业软件公司与80年代的FreeSoftwareFoundation所
采用都是这种发展模式。
Linux则迥异於前者。一开始它就是一大群Hacker在网络上一起涂涂抹抹出来
的。没有严格品质控制与高层决策发展方针,靠的是每周发表新版供大家下载测试
,测试者再把bug与patch贴到网络上改进下一版。一种全新的物竞天择、去芜存菁
的快速发展模式。令大夥傻眼的是,东修西改出来的Linux,跑的顺极了。
1993年底,Linux发展趋於成熟稳定,能与商业的UNIX一分高下,渐渐有商业
应用软件移植到Linux上。不过小型UNIX厂商也因为Linux的出现而关门大吉-因为
再没有人要买他们的东西。幸存者都是靠提供BSD为基础的UNIX的完整原始码,有
Hacker加入发展才能继续生存。
Hacker文化,一次次被人预测即将毁灭,却在商业软件充斥的世界中,披荆斩
棘,筚路蓝缕,开创出另一番自己的天地。
网络大爆炸时代
Linux能快速成长的来自令一个事实:Internet大受欢迎,90年代早期ISP如雨
後春笋般的冒出来,World-WideWeb的出现,使得Internet成长的速度,快到有令
人窒息的感觉。
BSD专案在1994正式宣布结束,Hacker们用的主要是免费的UNIX(Linux与一些
4.4BSD的衍生版本)。而LinuxCD-ROM销路非常好(好到像卖煎饼般)。近几年来
Hacker们主要活跃在Linux与Internet发展上。WorldWideWeb让Internet成为世界
最大的传输媒体,很多80年代与90年代早期的Hacker们现在都在经营ISP。
Internet的盛行,Hacker文化受到重视并发挥其政治影响力。94、95年美国政
府打算把一些较安全、难解的编码学加以监控,不容许外流与使用。这个称为
Clipperproposal的专案引起了Hacker们的群起反对与强烈抗议而半途夭折。96年
Hacker又发起了另一项抗议运动对付那取名不当的"CommunicationsDecencyAct",
誓言维护Internet上的言论自由。
电脑与Internet在21世纪将是大家不可或缺的生活用品,现代孩子在使用
Internet科技迟早会接触到Hacker文化。它的故事传奇与哲学,将吸引更多人投入
。未来对Hacker们是充满光明的。说明: 本文的作者Eric Raymond是Open Source Software领域的领袖,这方面许多 新的思想正是从他那儿产生的,同时他也是UNIX上最流行的Email软件Fetchmail 的作者。 Eric的主页地址在:http://www.tuxedo.org/~esr/
一. 大教堂和市集
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和我都不),而仅仅是因为商业世界在进化的军备竞赛中不能战胜自由软件社团,因为后者可以把更大更好的开发资源放在解决问题上。 |