如何成为一名黑客<上>
Eric Steven Raymond
Copyright ? 2001 Eric S. Raymond <esr@thyrsus.com>
Wang Dingwei <wangdingwei82@gmail.com> 基于 Barret 的翻译更正而成。转载请注明出处。
目录
作为Jargon File(译注:黑客行话大全)的编辑和几份其他类似性质知名文章的作者,我经常收到充满热情的网络新手的电子邮件询问:“我如何才能成为一名出色的 Hacker?”早在 1996 年,我注意到网上似乎没有任何的 FAQ 或者 Web 形式的文档提到及这个至关重要的问题,因此我写了这份文档。现在,很多 Hacker 都认为这是一篇权威性文档,那我也姑且这么认为吧。不过,我不认为我是这个话题的绝对权威;如果你不喜欢这篇文档,你也可以自己写一份。
如果你读到的是这份文档的离线拷贝,你可以在http://catb.org/~esr/faqs/hacker-howto.html读到最新版本。
注意:文档的结尾有一份FAQ(常见问题解答)。如果你想通过邮件询问我关于这份文档的问题,请先读这份 FAQ 看看能否找到答案——一遍不行就读两遍。
目前这份文档有很多翻译版本:阿拉伯语、白俄罗斯语、丹麦语、荷兰语、爱沙尼亚语、德语、希腊语、意大利语、希伯来语、挪威语、葡萄牙语(巴西)、罗马尼亚语、西班牙语、土耳其语、瑞典语。注意由于这份文档时有修正,所以以上翻译版本可能有不同程度的过时。
装饰本文的“五点九宫格”图像被称作“glider”,在一种叫做Life的数学模型中,这个简单的样本有一些异乎寻常的属性,多年以来 Hacker 们都为此着迷。我认为这个图像是一个很好的黑客徽标:它显得抽象而且神秘,而且像是一扇大门,通向一个截然不同的有其内在逻辑的世界。你可以阅读更多关于Glider 徽标的内容。
Jargon File讲了一堆关于“hacker”这个词的定义,大部分是关于“技术高超”、“热衷解决问题”、以及“超越极限”的内容。但如果你只想知道如何成为一名黑客的话,真正重要的只有两条。
这可以追溯到几十年前,那时候第一代分时微型计算机才刚刚诞生, 而 ARPAnet 的实验也才刚展开。那时的编程专家和组网高手建立了一个具有共享性质的文化社群, “hacker” 这个名词就是其中的成员创造的。黑客们建立了互联网,黑客们让 Unix 操作系统演化到现在的模样,黑客们经营着 Usenet,黑客们让万维网运转起来。如果你是这个文化的一部分,如果你对这种文化有所贡献,而且这个社群的其它成员也认识你并称你为 hacker,那么你就是一名黑客。
黑客的思维方式并不仅仅局限在软件黑客的文化圈内。也有人用黑客态度对待其它事情,如电子和音乐方面——其实你可以在任何最高级别的科学和艺术活动中发现它的身影。软件黑客对这些领域的践行者尊重有加,并把他们也称作黑客——有人宣称黑客天性是绝对独立于他们工作的特定领域的。但在这份文档中,我们将集中书写在软件黑客的技术和态度,以及发明了“黑客”一词的、以共享为特征的文化传统。
有另外一群人大声嚷嚷着自己是黑客,但他们根本不是。他们主要由青少年男性构成,是一些蓄意破坏计算机和电话系统的人。真正的黑客把这些人叫做“骇客”(cracker),并不屑与之为伍。黑客们通常认为他们是一群懒散、没有责任心、而且不是很聪明的人?;嵬ü冉酉叻⒍挡⒉灰馕蹲拍闶且桓銎倒こ淌ΑR谎牡览?,会破坏安全也不意味着你是一名黑客,不幸的是,很多记者和作家往往错把“骇客”当成黑客;这种做法一直使真正的黑客感到恼火。
根本的区别是:黑客搞建设,骇客搞破坏。
如果你想成为一名黑客,请接着读下去。如果你想做一个骇客,就去读alt.2600新闻组吧,顺便准备好去蹲个五到十年的监狱,而且最终你会意识到你并不像自己想象的那么聪明。
关于骇客,我能说的只有这些。
黑客们解决问题,建设事物,同时他们信仰自由和无私的双向帮助。要想作为一名黑客被社群认同,你需要体现出自己已经具备了这种态度。而要体现出这种态度,你就得真正相信和赞同这种态度。
但是,如果你认为培养黑客态度只是进入黑客文化圈的敲门砖,那就大错特错了。这种态度将有助于有助于你的学习,并且能为你提供源源不断的动力,所以它对你而言是至关重要的。和所有创造性的艺术一样,成为大师的最有效方法,就是模仿大师的精神——智力上的模仿还不够,还要从感情上进行模仿。
或者正如下面这首现代的禅诗讲的:
修行之道:关注大师的言行,跟随大师的举动,和大师一并修行,领会大师的意境,成为真正的大师。
所以,如果你想成为一名黑客,反复读下面的事情直至你相信它们为止:
1. 这个世界充满了令人着迷的问题等着我们解决。
做一名黑客会有很多乐趣,但是这些乐趣需要付出很多努力才能获得。这些努力需要动力。成功的运动员在表演和超越自我极限的时候获得身体上的愉悦,并把这种愉悦作为自己的动力。同样,为了成为一名黑客,你要从解决问题、磨练技术,以及锻炼智力中得到基本的享受。
如果你不是天性如此,而你又想成为一名黑客,你就要设法成为这样的人。否则你会发现,你的黑客热情会被其他分心的事物吞噬掉——如金钱、性、以及社交圈的认同。
(你必须建立对于自己学习能力的信念——就算你掌握的知识不足以解决当前的问题,如果你从问题的一小部分下手并从中学习,你将学到足够的知识用来解决下一部分——以此类推,直到整个问题都被你解决为止。)
2. 一个问题不应该被解决两次。
有创新能力的大脑是一种宝贵的有限资源。当世界还充满非常多有待解决的有趣的新问题时,它们不应该被浪费在重新发明轮子的事情上。
作为一名黑客,你必须相信其他黑客的思考时间是宝贵的——因此共享信息、解决问题、并发布结果给其他黑客几乎是一种道义,这样其他人就可以去解决新问题,而不用在旧问题上面浪费精力了。
(这并不是在说你有义务把自己所有的作品都免费发布出来,但这样做的黑客能获得大家最大的尊敬。使用黑客技能养家糊口甚至发财致富都没关系,只要你别忘记自己作为一个黑客的责任,不背离黑客群体即可。)
3. 无聊和乏味的工作是罪恶。
黑客(以及所有创造力的人们)都不应该被愚蠢的重复性劳动所困扰。重复性劳动浪费了他们解决新问题的时间,而解决新问题正是黑客最大的价值所在。这种浪费会伤害到每一个人。无聊和乏味的工作不仅仅是令人不舒服而已,而且本身就是一种罪恶。
作为一个黑客,你必须坚信这点并尽可能多地将乏味的工作自动化,这不仅是为了你自己,也是为了其他人(尤其是其他黑客们)。
(对此有一个明显的例外。黑客有时为了休息大脑、学习技能、或者别的特别的原因,也会做一些在他人看来是重复性或枯燥的事情。但这是自愿的——只要是有思维能力的人,就不应该被迫做无聊的活儿。)
4. 崇尚自由。
黑客们是天生的反权威主义者。任何能向你发号施令的人都可以让你停止解决令你着迷的问题,同时,按照权威主义者的一般思路,他通?;岣鲆恍┘擞廾恋睦碛伞R虼?,不论何处,任何权威主义的做法,只要它影响到了你和其他的黑客,你就要和它斗到底。
(这并非向所有权威挑战。儿童需要监护,罪犯要被看管起来。如果服从命令得到某种东西比起用其他方式得到它更节约时间,黑客可以同意接受某种形式的权威。但这是一个有限度的,斟酌过的的交易;那种权威主义者想要的个人服从是不在考虑范围内的。)
权威主义者喜欢审查和保密。他们不信任自愿的合作和信息的共享——他们只喜欢由他们控制的所谓“合作”。因此,作为一个黑客,你应该对审查、保密,以及使用武力或欺骗去压迫有行为能力的人们的做法有一种本能的敌意。同时你要有为此信念付出的意愿。
5. 态度不能替代能力。
作为一名黑客,你必须培养起这些态度。但只具备这些态度并不能使你成为一名黑客,也不能使你成为一个运动健将和摇滚明星。成为一名黑客需要智力、实践、奉献精神、以及辛苦的工作。
因此,你必须学着忽略态度问题,并尊重各种各样的能力。黑客们不会为那些装模做样的人浪费时间,但他们却非常尊重能力——尤其是从事黑客工作的能力(虽然有能力总归是好事)。如果能具备少有人能掌握的技能就更好了,当然如果你具备一些急需的技能,而这些技能又需要敏锐的思维、高超的技巧、和专注的精神,那就是再好不过了。
如果你尊重能力,你就会享受到提高自己能力的乐趣——辛苦的工作和奉献将不会是一件苦差事,而是一种紧张的娱乐,这是成为黑客至关重要重要的一点。
黑客态度重要,但技术更加重要。态度无法替代技术,在你被别的黑客称为黑客之前,你必须掌握一些基本的技术作为你随身携带的工具。
随着新技术的出现和老技术的过时,这个工具包的内容也在不断改变。比如以前机器语言编程也被列在里边,而 HTML 是直到最近才包括进去的。不过现在可以清楚地告诉你包含以下内容:
1. 学习如何编程。
这一条无须多说,当然是最基本的黑客技能。如果你还不会任何编程语言,我建议你从 Python 开始学起。它设计清晰,文档齐全,而且对初学者比较友好。虽然它很适合作为一种入门语言,但它不仅仅只是个玩具;它非常强大、灵活,也适合做大型项目。我在一篇更详细的Evaluation of Python(译注:Python 试用体验)中有更详细的论述。Python 网站有很好的入门教程。
我曾经推荐过将 Java 作为初学的语言,但这则批评改变了我的想法(在里边搜索”The Pitfalls of Java as a First Programming Language” 就知道我的意思了)。作为一名黑客,你不能像人们挖苦的一样,“像水管工人一样装电脑”,你必须知道各个部件的工作原理。现在我觉得可能还是学过 C 和 Lisp 后再学 Java 比较好。
有一个大体的规律,就是如果你过于偏重使用一种语言,这种语言一方面会成为你得心应手的工具,另一方面也会阻碍你的学习。有这个问题的不只是编程语言,类似 RubyOnRails、CakePHP、以及 Django 的 web 应用框架也有这个问题,它们只会让你肤浅地懂得一些东西,当你碰到难以解决的问题或者需要调试时,你就可能不知所措了。
如果你想进入正式的编程领域,你将不得不学习 C 语言,它是 Unix 的核心语言。C++ 与 C 非常其他类似;如果你了解其中一种,学习另一种应该不难。但这两种都不适合编程入门者学习。而且事实上,你越避免用C编程,你的工作效率会越高。
C 语言效率极高,而且占用很少的系统资源。不幸的是,C 的高效是通过你手动做很多底层的管理(如内存管理)来达到的。底层代码都很复杂,而且极易出现 bug,你要花很多的时间调试。而现今的计算机速度如此之快,花时间调试程序通常是得不偿失——比较明智的做法是使用一种运行较慢、效率较低,但能大幅节省你的开发时间的语言。因此,还是选择 Python 吧。
其他对黑客而言比较重要的语言包括Perl和LISP。从实用的角度来说,Perl 是值得一学的;它被广泛用于动态网页和系统管理中,因此,即便你从不用Perl 写程序,至少也应该学会读懂 Perl。许多人使用 Perl 的理由和 我建议你使用 Python 的理由一样,都是为了避免用 C 完成那些不需要 C 高效率的工作。你会需要理解那些工作的代码的。
LISP 值得学习的理由不同——最终掌握了它时你会得到丰富的启迪和经验。虽然你实际上很少会用到 LISP,但这些经验会使你在以后的日子里成为一个更好的程序员。
当然,实际上你最好五种都会(Python,Java,C/C++,Perl 和 LISP)。除了是最重要的黑客语言外,它们还代表了截然不同的编程思路和方法,每种都会让你受益非浅。(你可以通过修改 Emacs 编辑器的模式)
单单学习编程语言并不会让你达到黑客的程度,甚至连程序员的程度都难企及——你需要脱离某种编程语言的素服,学习通过编程解决问题的思路。要成为一个真正的黑客,你需要达到几天就能学会一门编程语言的水平,你可以将文档里的信息和你已经掌握的知识结合起来,很快就学会一门编程语言。这意味着你需要先学会机种思路截然不同的语言才行。
编程是一个复杂的技能,我无法给你完整的指南来教会你如何编程,不过我可以告诉你,书本和课程也无法教会你如何编程——很多黑客,或者也许几乎所有的黑客,都是靠自学的。你从书本上学到语言的特点——只是一些皮毛,但要使书面知识成为自身技能,你只能通过实践和虚心向他人学习。因此你要做的就是 (a) 读代码,(b) 写代码。
Peter Novig 是 Google 公司的顶尖黑客之一,而且是最受欢迎的 AI 课本的一名作者。他写了一篇好文章名叫Teach Yourself Programming in Ten Years(译注:十年教会自己编程),其中的“recipe for programming success”(译注:编程的成功之道)尤其值得一读。
学习编程就象学习自然语言写作一样。最好的做法是读一些大师的名著,试着自己写点东西,再读些,再写点,再读些,再写点……如此往复,直到你的文章具备范文的力量和感觉为止。
以前要找适合阅读的好代码并不容易,因为几乎没有大型程序的源代码能让新手练手。这种状况已经戏剧性地发生变化;开源软件、编程工具、和操作系统(全都由黑客写成)现在已经随处可见。让我们在下一个话题中继续讨论……
2. 学习使用开源的 Unix 系统。
我将假设你已经有一台个人计算机供自己使用了(你可以体会一下这意味着多少东西。早些时候,计算机是如此的昂贵,没有人能买得起。而黑客文化就是在那样的环境下演化来的)。新手们能够朝学习黑客技能迈出的最基本的一步,就是找一版 Linux 或 BSD-Unix,安装在个人电脑上,并且把它跑起来。
没错,这世界上除了Unix还有其他操作系统。但它们都是以二进制形式发布的——你无法读到它的源代码,也不可能修改它。尝试在运行 DOS、Windows、或 MacOS 的机器上学习黑客技术,就象是穿着骑士铠甲学跳舞。
除此之外,Unix 还是 Internet 的操作系统。你可以学会上网却不知道 Unix,但你不了解 Unix 就无法成为一名 Internet 黑客。因此,今天的黑客文化在很大程度上是以 Unix 为核心的。(这点并不总是真的,一些很早的黑客对此一直很不满,但 Unix 和 Internet 之间的联系已是如此之强,就连 Microsoft 这样强力的公司也对此也无可奈何。)
所以, 安装一套 Unix 吧——我个人偏爱 Linux,但还有其他种类共你选择(是的,你可以在同一电脑上同时安装 Linux 和 DOS/Windows)。学习它,运行它,鼓捣它。用它上 Internet。阅读它的源代码。修改它的源代码。你会用到很多优秀的编程工具(包括 C, LISP,Python 及 Perl),这些工具在 Windows 下是做梦都没法得到的。你会觉得乐趣无穷。当你有一天成为大师再回顾初学的日子,你会觉得那时学到的东西可真多。
如果你想了解更多关于学习 Unix 的信息,读一下The Loginataka(译注:ESR 的另一著作,可以称为黑客大藏经)吧。也许你还想看看The Art of Unix Programming(译注:Unix 编程艺术,经典著作)。
你可以访问Linux Online!网站,这个网站可以帮你起步。你可以从那里下载到Linux,或者更好的办法是找一个本地的 Linux 用户组,让他们帮你安装 Linux。
在这份 HOWTO 文档发布后的前十年里,关于 Linux 我写的是,从新人的观点来看,所有的Linux 发行版都差不多,但在 2006-2007 之间,我们终于有了一个最佳选择:Ubuntu。我们可以说各种Linux 发行版各有千秋,但 Ubuntu 是新人最容易上手的一个发行版。
你可以在 www.bsd.org 找到 BSD Unix 的求助及其他资源。
Linux 有一种被称为Live CD的发行方式,这种发行版会从CD 运行起来,而且不会动到你硬盘里的东西,Live CD 是尝试 Linux 的一个不错的方法。由于光驱读写本来就比较慢,Live CD 的速度一般也会比较慢,不过 Live CD 总归是一个能尝试各种可能性而又不过激的方法。
我有写一篇关于Unix 和 Internet 基础的入门文章。
对于新手,我以前不鼓励你自己独立安装Linux 或者 BSD,现在这些系统的安装工具已经足够好了,就算对新手来说,独立安装操作系统也不是不可能的事。无论如何,我还是推荐你联系本地的 Linux 用户组,向他们寻求帮助,这会进程更加顺利。
3. 学会使用万维网以及编写 HTML。
黑客文化建造的大多东西都在你看不见的地方发挥着作用。浙西东西可以帮助工厂、办公室、以及大学正常运转起来,但从表面上很难看到它们对非黑客的普通人的生活的影响。而 Web 是一个大大的例外。就连政客也同意,这个庞大耀眼的黑客玩具正在改变整个世界。就算只是因为这个(还有许多其它的原因),Web 也值得你一学。
这并不是仅仅意味着如何使用浏览器(谁都会),而是要学会如何写 HTML,也就是 Web 的标记语言。如果你不会编程,写HTML会教你一些有助于学习的思考习惯。因此,先完成一个主页。(网上有很多不错的资源,比如这个 HTML 入门教程。)
但仅仅拥有一个主页不能使你成为一名黑客。 Web里充满了各种网页。大多数是毫无意义的、毫无信息量的垃圾——界面时髦的垃圾,不过还是垃圾(更多相关信息访问The HTML Hell Page)。
要想有价值,你的网页必须有内容——它必须有趣或对其它黑客有帮助。这是下一个话题所涉及的……
4. 学习英语,如果你的水平不够用的话。
作为一个以英语为母语的美国人,我以前很不情愿提到这点,免得被当做一种文化上的帝国主义。但相当多以其他语言为母语的人一直劝我指出这一点,那就是:英语是黑客文化和 Internet 的工作语言,只有懂英语,你才能在黑客社区顺利做事。
大概1991年的时候,我就了解到许多黑客在技术讨论中使用英语,甚至有时他们来自同一种母语也在用英文讨论。在现阶段,英语有着比其他语言丰富得多的技术词汇,因此是一个对于工作来说相当好的工具?;诶嗨频脑?,英文技术书籍的翻译通常都不怎么令人满意。(如果有翻译的话)。
Linus Torvalds 是芬兰人,但他的代码注解是用英语写的(很明显他从没想过其他的可能性)。他流利的英语。是他能够管理全球范围的 Linux 开发人员社区的重要因素。 这是一个值得学习的例子。
就算你的母语是英语,这也无法保证你的语言技能足够达到黑客的标准。如果你的写作文字不通、语法混乱、错字连篇,包括我在内的大部分的黑客都会忽略你的存在。虽然写作马虎不一定意味着思考也马虎,但我们发现两者的关联性还是挺强的——马虎的头脑对我们来说毫无价值,如果你写作能力不够,就好好学习写作吧。
本文下篇:如何成为一名黑客《下》