大教堂与集市

一直以来,我就很奇怪

大众眼中的程序员,一般是呆头呆脑,按逻辑办事,终日沉浸在自己世界,沉默寡言,高智商低情商,为哪种编程语言或框架比另一种要好争论不休

哦,还有最重要的一条:木有妹纸

这也让我很困惑,甚至有段时间我发自内心的不认同这个标签

因为纵观国外的一些大牛,他们除了代码精湛之外,还写 Blog、出书、营销、开公司、拉风投、潜水、登山、旅行…

而且并非浅尝辄止,只能用逆天来形容

这…还是程序员么

看了此书才明白,此人种名曰:黑客(Hacker)

上次看《黑客与画家》时,就很鸡冻

还记得刚学 C 语言时,就和我哥说,不想当一名黑客,也不想搞安全相关的东东

毕竟当时学校那破图书馆里都是《黑客攻防实践》《黑客反汇编》之类的东东

时隔多年,现在是知道了,原来我不想成为的是 骇客(cracker)

对于 骇客,Eric 文中给出了一些建议:

如果你想成为一名黑客,请接着读下去。如果你想成为一名骇客,去读 alt.2600 新闻组(news:alt.2600),如果你发现自己并没有想象中那么聪明,做好准备去蹲上 5 到 10 次监狱吧。这就是我想对骇客说的。

关于这个,我是存有疑问的,以后有时间看下 2000 年之前他们分别是什么版本

Java 也是一个不错的学习编程的语言。它比 Python 要难,但可以产生比 Python 更快的代码,我想它可以作为一个优秀的第二语言

没看Python 的直接来看 Ruby 吧,这是一门让你爽的语言,还有,此书由于出版时间,iOS & Android 尚未出现

最好把这五种语言(Python、Java、C/C++、Perl 和 LISP)都学了。它们不只是最重要的黑客语言,还代表了截然不同的编程方法,每一种都会让你受益匪浅

重复造轮子

创造性头脑是无比珍贵的有限资源,它们不应浪费在重新发明轮子这种事上,尤其是还有这么多迷人的新问题在那里等着的时候

GUI

问题主要出在人机工程学设计和界面心理学上,黑客在这些方面从来就很弱。黑客在为其他黑客设计接口时做得很好,但他们往往不善于为另外 95%人群的思维过程建模

下面是书摘,附录很有意思


2. 大教堂与集市

  1. 好的软件作品,往往源自于开发者的个人需要
  2. 优秀的程序员知道写什么,卓越的程序员知道改写(和重用)什么
  3. “计划好扔掉一个吧,迟早你会这么做的。”(Fred Brooks,《人月神话》第 11 章)
  4. 如果你有正确的态度,有趣的事情自然会找到你。
  5. 当你对一个程序不再感兴趣时,你最后的责任就是把它交给一个可以胜任的接棒者
  6. 把你的用户当成开发合作者对待,如果想让代码质量快速提升并有效排错,这是最省心的途径。
  7. 早发布,常发布,倾听用户的反馈。
  8. 如果有足够多的 beta 测试者和合作开发者,几乎所有问题都会很快显现,然后自然有人会把它解决。
  • Linus 定律道出了大教堂模式和集市模式最关键的区别:在大教堂建筑者看来,bug 是棘手的、难以发现的、隐藏在深处的,要经过几个人数月的全心投入和仔细检查,才能有点信心说已经剔除了所有错误。而发布间隔越长,倘若等待已久的发布版本并不完美,人们的失望就越发不可避免。
  • 对集市模式而言则完全不同,在上千名合作开发者热切钻研每个新发布版本的情况下,你可以假定 bug 是浅显易找的,或者至少可以很快变得浅显易找。所以你会频繁发布以获取更多的修正,其副作用是良性的:即便发布中有些小问题,你也不会损失太多。
  1. 聪明的数据结构配上愚笨的代码,远比反过来要好得多。
  2. 如果你把 beta 测试者当做最珍贵的资源对待,他们就会成为你最珍贵的资源
  3. 仅次于拥有好主意的是,识别来自用户的好主意,有时后者会更好
  4. 通常,那些最有突破性和最有创新力的解决方案来自于你认识到你对问题的基本观念是错的。
  5. “设计上的完美不是没有东西可以再加,而是没有东西可以再减。”
  6. 任何工具都应具备预期内的功能,但一个伟大的工具能给你带来预期外的功能。
  7. 写网关类软件时,尽可能不要干扰数据流,而且绝不要扔掉信息,除非接收方强迫你这么做
  8. 当你的语言还远不是图灵完备(Turing-complete)的时候,语法糖会让你受益良多。
  9. 系统的安全性只取决于它所拥有的秘密。谨防虚假的秘密。
  10. 想要解决一个有趣的问题,先去找一个让你感兴趣的问题。
  11. 如果开发协调者有一个至少像 Internet 这样好的沟通媒介,并且知道如何不靠强制来领导,那么多人合作必然强于单兵作战
  • 如果你在工作过程中感到恐惧和厌恶(即便你以自嘲的形式来表达——比如悬挂呆伯特玩偶),就应该意识到过程已经出了问题。快乐、幽默和玩兴是真正的资产
  • 玩”是创造性活动中最具经济效能的工作模式。

3. 开垦心智层

  • 在礼物文化中,社会地位并不取决于你控制了什么,而是你给予了什么
  1. 如果它不能像我所预期的那样工作,那就不是好的——不管它多么聪明和有原创性。
  2. 在心智层的拓展性工作要比在某功能域内(对现有作品)的重复性工作好。
  3. 能进入主要发行版的作品比不能进入的好。在所有主要发行版中都包含的作品最令人尊敬。
  4. “使用”是最真实的赞美,类别杀手比同类竞争者好。
  5. 相比那些只挑有趣和简单工作的人,长期致力于艰苦和乏味工作(如调试、写文档)的人更令人钦佩。
  6. 重要的功能扩展比低层次的修补好。

4. 魔法锅

  1. 可靠性/稳定性/可扩展性非常重要。
  2. 除了独立的同行评审,没有其他便捷易行的方法验证设计和实现的正确性。
  3. 该软件对客户的业务非常关键。
  4. 该软件创建或运转一个公共计算或通信基础架构。
  5. 关键方法(或能实现同等功能的方法)属于公共知识

5. 黑客的反击

  • 理论和语言的缺乏在两个方面对我们不利:一是我们不能系统性地思考如何改进我们的方法,二是我们难以向别人解释和推销我们的方法

附录 A:如何成为一名黑客

黑客搞建设,骇客搞破坏

黑客的态度

  1. 这个世界充满了迷人的问题等待人们去解决。
  2. 不要解决一个问题两次。
  3. 无聊和乏味是有害的
  4. 自由是好事
  5. 态度不能代替能力。

黑客的基本技能

  1. 学习编程
  • 想要获得将知识转化为技能的思维模式,只能通过实践和跟随大师。做法就是读代码和写代码
  1. 找一个开源 UNIX,学习使用和运行它。
  2. 学习如何使用 WWW 和写 HTML。

地位之于黑客文化

  1. 写开源软件。
  2. 协助测试和调试开源软件
  3. 发布有用的信息。
  4. 帮助做一些基础工作。
  5. 服务黑客文化自身。

格调问题

  • 学习很好地使用你的母语写作。尽管有一种陈旧的看法认为程序员写作不行,但很多黑客(包括我所知道的那些最优秀的黑客们)写得一手好文章,而且其数量多得让人吃惊。

  • 阅读科幻小说,参加科幻小说集会(这是认识黑客和潜在黑客的好方法)。

  • 研习禅修,并且/或者学习武术。(心智训练似乎在很多重要方面都是类似的。)

  • 培养起对音乐的鉴赏力。学会欣赏一些独特类型的音乐。学习很好地演奏乐器,或者学习如何唱歌。

  • 培养出你对双关语和俏皮话的欣赏能力。

    但这些事与左右脑技能的结合有关,这可能是问题的关键所在(黑客不仅需要有很强的逻辑推理能力,而且要能够很快从问题的具体逻辑中跳脱出来)

不要

  • 不要使用愚蠢、浮夸的用户名或昵称。
  • 不要卷入 Usenet(或其他任何地方)的网络骂战。
  • 不要自称为“电脑朋克”,也不要浪费时间交往那些自称电脑朋克的人。
  • 不要让你的贴子或 email 充满错误的拼写和糟糕的语法。

最后:
“只有其他黑客认为你是黑客时,你才是黑客”
所表达出来的价值观,类似于中世纪欧洲骑士时代精英团体所宣称的理想(通常总是无法实现),这些社会精英有足够的财力超脱于所处的稀缺经济。像人们期望的那样,一个有抱负的骑士为正义而战,他追求荣誉而非获取钱财,他站在弱势和受压迫者一边,不断寻求机会挑战自己英勇才能的极限。也正因如此,他会认为自己(并被别人认为)是人中翘楚——前提是他的能力和品行已获得其他骑士的承认和正式认可。在亚瑟王传奇(Arthurian tales)和武功歌(chansons de geste)所颂扬的骑士精神中,我们看到了理想主义、对自我的不断挑战和对地位的追求,这与当今激励黑客的要素是类似的。