较早知道Eric S.Raymond 的《如何成为一名Hacker》,今天偶然间知到原来这是他的五部曲之一。便找来了他的五部全集,分别是:《Hacker 文简史》、《教堂与市集》、《如何成为一名Hacker》、《开拓智域》、《魔法大锅炉》,中文版下载地址:http://vdisk.weibo.com/s/aDNfaTygLV2d9/1421292976
以下为前两部曲的阅读笔记 :
一、Hacker 文化简史
二战后到1970早期的Real Programmer 指的就是用组合语言或甚至机器码,把程序用打卡机punch 出一片片纸卡片,由主机读卡机输入电脑的那种石器时代Programmer。
一开始,整个Hacker文化的发展以MIT的AI Lab为中心,但Stanford University 的Artificial Intelligence Laboratory(简称SAIL)与稍后的Carnegie-Mellon University(简称CMU)正快速崛起中。
1969年,也就是ARPANET成立的那一年,有个在AT&T Bell Labs的年轻小伙子Ken Thompson 发明了Unix。Ken Thompson 写了个游戏“Start Travel”没地方跑,就去找一台报废机器PDP-7 来玩。他同事Brian Kernighan 嘲笑Ken Thompson说:“你写的系统好逊哦,干脆就叫Unics算了。”(Unics发音与太监的英文eunuches 一样),后来才改为Unix。
那时的Programmer 写个程序必须彻底了解操作系统内部,或硬体设备。比方说写个IO的程序,对于硬盘的转速、磁轨与碰头数量等等都要搞的一清二楚才行。
Ken Thompson 的同事Dennis Ritchie 发明了一个新的程序语言C,于是他与Thompson 用C把原来用汇编写的Unix重写一遍。C的设计原则就是好用,自由与弹性。C与Unix很快地在Bell Labs 得到欢迎。
那时的传统是,一个操作系统必须完全用汇编语言写成,才能让机器发挥最高的效能。Thompson 与 Ritchie 是头几位领悟硬体与编译器的技术,已经进步到作业系统可以完全用高阶语言如C来写,仍保持有不错的效能。五年后,Unix已经成功地移植到数种机器上。
除了跨平台的优点外,Unix与C还有许多显著的优势。Unix与C的设计哲学是“Keep It Simple,Stupid!”,简称KISS。
1980年同时有三个Hacker 文化在发展,尽管彼此偶有接触与交流,但还是各玩各的。ARPANET/PDP-10 文化,玩的是LISP、MACRO、TOPS-10与ITS。而UNIX与C的拥护者用电话线把他们的PDP-11 与VAX机器串起来玩。还有另一群散乱无秩序的微电脑迷,致力于将电脑科技平民化。
1984年AT&T解散了,UNIX正式成为一个商品。当时的Hacker 文化分成两大类,一类集中在Internet与USENET 上(主要是跑UNIX的迷你电脑或工作站连上网络),以及另一类PC迷,他们绝大多数没有连上Internet。
到1990年最后一台ITS 永远关机长眠,那些死忠派在穷途末路下只有悻悻地投向UNIX的怀抱。UNIX 此时也分裂为 Berkeley UNIX 与AT&T 两大阵营。Berkeley UNIX 的拥护者自喻为冷酷无情的公司帝国的反抗军。按销售来说,AT&T UNIX 始终赶不上BSD/Sun,但AT&T UNIX 赢得了标准制订的战争。
1992年一位芬兰Helsinki University 的学生——Linus Toralds 开始在一台386 PC上发展一个自由软件的UNIX Kernel,使用FSF的程序开发工具。他很快地写好简单的版本,丢到网络上分享给大家,吸引了非常多的Hacker 来帮忙一起发展Linux。一个功能完整的UNIX,完全免费且附上全部的原代码。Linux 最大的特色,不是功能上的先进而是全新的软件开发模式。
1993年底,Linux 发展趋于成熟稳定,能与商业的UNIX一分高下,渐渐有商业应用软件移植到Linux上。
Linux 能快速成长来自另一个事实:Internet 大受欢迎,90年年代早期ISP 如雨后春笋般的冒出来。World Wide Web 的出现,使得Internet成长的速度,快到令人窒息的感觉。
二、大教堂与市集
Linus Torvalds 的开发风格令人惊奇地降临了。这里没有安静的、虔诚的大教学的建造工作——相反,Linux 团体看起来像一个巨大的有各种不同议程和方法的乱哄哄的集市(Linux 归档站点接受任何人的建议和作品,并聪明的加以管理),一个一致而稳定的系统就像奇迹一般从这个集市中产生了。
这种设计风格确实能工作,并且工作得很好,这个事实确实是一个冲击。
1. 每个好的软件工作都开始于搔以了开发者本人的痒处。这解释了为什么从Linux 团队中产生的软件质量都如此之高。
2. 好程序员知道该写什么,伟大的程序员知道该重写什么。
伟大程序员的一个重要特点是建设性地懒惰。他们知道你是因为成绩而不是努力得到奖赏,而且从一个好的实际的解决方案开始总是要比从头干起容易。Linux并不是从头开始写Linux,相反的它从征用Minix的代码和思想入手。最后所有的Minix 代码都消失或被彻底的重写了。但是当它们在的时候它为最终成为Linux 的锥形做了铺垫。
3. 计划好抛弃,无论如何,你会的。(《人月神话》第11章)
或者换句话说,你常常在第一次实现一个解决方案之后才能理解问题所在,第二次你也许才足够清楚怎样做好它,因此如果你想做好,准备好推翻重来至少一次。
4. 如果你有正确的态度,有趣的问题会找上你的。但是Carl Harris 的态度甚至更加重要(下面的第5条):
5. 当你对一个程序失去兴趣时,你最后的责任就是把它传给一个能干的后继者。
6. 把用户当做协作开发者是快速改进代码和高效调试的无可争辩的方式。
这种效果的力量很容易被低估,实际上,几乎所有我们自由软件世界中的人都强烈低估了用户可以多么有效地对付系统复杂性,直到Linus让我们看到了这一点。
回顾起来,在GNU Emacs Lisp 库和Lisp代码集中可以看到Linux 方法的成功,与Emacs 的C 内核和其他FSF的工具相比,Lisp 代码库的演化是流动性的和用户驱动的。思想和原型在达到最终的稳定形式之前往往要重写三或四次,而且经常利用Internet的松散合作。
而FSF试图把代码放入 GPL之下的策略有一个未曾预料到的副作用,它让FSF难以采取市集模式,因为他们认为每个想贡献二十行以上代码的人都必须得到一个授权,以使受到GPL的代码免受版权法的侵扰,具有BSD和MITX协会的授权的用户不会有这个问题,因为他们并不试图保留那些会使人可能受到质询的权力。
7. 早发布、常发布!听取客户的建议。
Linus 不是(至少还不曾是)像Ritchard Stallman 或 James Gosling 一样的创新天才,在我看来,Linus 更像是一个工程天才,具有避免错误和开发失败的第六感,掌握了发现从A点到B点代价最小的路径决窍。确实,Linux 的整个设计受益于这个特质,并反映出Linus 的本质上保守和简化设计的方法。
Linus 保持他的黑客用户经常受到激励和奖赏:被行动的自我满足的希望所激励,而奖赏则是经常(甚至每天)都看到工作在进步。
8. 如果有一个足够大的bate 测试人员协作开发人员的基础,几乎所有的问题都可被快速地找出并被一些人纠正。
或者更不正式的讲:“如果有足够多的眼睛,所有的错误都是浅显的”,我把这称为“Linus 定律”。
我认为建造教堂和集市模式的核心区别,在建造教堂模式的编程模式看来,错误和编程问题是狡猾的、阴险的、隐藏很深的现象,花费几个月的仔细检查,也不能给你多大确保把它们都挑出来的信心。因此,很长的发布周期,和在长期等待之后并没有得到完全的版本发布和引起的失望都是不可避免的。
以市集模式观点来看,在另一方面,我们认为错误是浅显的现象,或者至少当暴露给上千个热切的协作开发人员,让他们来对每个新发布进行测试的时候,它们很快变得浅显了,所以我们经常发布来获得更多的更正,作为一个有益的副作用,如果你偶尔做了一个笨拙的修改,也不会损失太多。
9. 聪明的数据结构和笨拙的代码要比相反的搭配工作的更好。
让我看你的“代码”,把你的“数据结构”隐藏起来,我还是会迷惑;让我看你的“数据结构”,那我就不需要你的“代码”了,它是显而易见的。
10. 如果你像对待最宝贵的资源一样对待你的beta 测试员,他们就会成为你最宝贵的资源。
11. 想出好主意是好事,从你的用户那里发现好主意也是好事,有时候后者更好。
12. 最重要和最有创新的解决方案常常来自于你认识到你对问题的概念是错误的。
13. 最好的设计不是再也没有什么东西可添加了,而是再也没有什么东西可以去掉。
14. 任何工具都应该能以预想的方式使用,但是一个伟大的工具提供你没料到的功能。
15. 在写任何各类的网关型程序时,多费点力,尽量少干扰数据流,永远不要抛弃信息,除非接收方强迫这么做。
16. 如果你的语言一点也不像是图灵完备的,严格的语法会有好处。
17. 一个安全的系统只能和它的秘密一样安全,当心伪安全。
集市风格的必要的先决条件
不能以一个市集模式从头开发一个软件,我们可以以市集模式,测试、调试和改进。以市集模式从头开始,一个项目将是非常困难的。Linus 没这样做,我也没有。
当你开始创建社团时,你需要演示的是一个诺言,你的程序不需要工作的很好,它可以很粗糙、很笨拙、不完整和缺少文档,它但不能忽略的东西是要吸引哪些人,卷入一个整洁的项目。
18. 要解决一个有趣的问题,请从发现你感兴趣的问题开始。
19. 如果开发协调人员至少和Internet 一样好的媒介,而且知道怎样不通过强迫来领导,许多头脑将不可避免地比一个好。