本书是硅谷创业之父Paul Graham 的博客文集,主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。书中的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解我们这个时代,迫使读者独立思考。

本书是硅谷创业之父 Paul Graham 的博客文集,主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。书中的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解我们这个时代,迫使读者独立思考。

本书适合所有程序员和互联网创业者,也适合一切对计算机行业感兴趣的读者。

写在前面

最近读完这本书,写得很不错,适合边读边思考,作者从自身经历讨论了很多问题,包括书呆子、政治、财富、创业、编程语言、设计等问题。

另外本人看的是阮一峰翻译的版本,文笔非常流畅,一点都没有翻译的腔调,感觉是直接用母语写出一般。

在此感谢作者 Paul Graham 先生和 译者阮一峰先生。

声明,这本书的每章都是相互独立的,不必要按顺序阅读。

全书大致分为 3 部分

  • 1-4 章解释黑客如何成长以及如何看待世界
  • 5-9 章介绍创业、工作的方法论
  • 10-15 章讨论编程语言的特点和使用方法

正文

1、为什么书呆子不受欢迎

黑客的特点之一便是高智商,在学校一般表现为书呆子形象,不受欢迎,其主要原因是,他们专注于解决自己感兴趣的事情,而不想花心思去取悦别人。但是学校不是社会,这里并不需要解决问题的人,于是书呆子们完全没有用武之地。但是,一旦这些书呆子走入社会,社会需要能够真正解决问题的人,于是书呆子们的价值就体现出来了。

2、黑客与画家

与作曲家、建筑师、作家一样,黑客和画家都是试图创作出优秀作品。他们本质上都不是在做研究,虽然在创作过程中,他们可能会发现一些新技术(那样当然更好)。

从这个基本观点出发,通过借鉴这些创作领域的创作模式,我们可以得出一些重要的启示:

  1. 编程不应该是先将思路完全想好,然后去写代码。思路的完善应该是在代码编写过程中完成的。好的编程语言应是允许动态扩展的语言,编程语言是帮助我们思考的,而 不仅仅是表达已经想好的想法。
  2. 学习编程,应是实践的过程。在敲代码,写程序中去学习。
  3. 保留自己写过的代码,时常翻看。
  4. 大量阅读范例程序,充分利用开源的资源。

作者也提到在大公司中,并不能发挥一个黑客的所有能力,如果你想开发出的优秀软件,那么可以选择创业,但是这样会导致你必须处理许多与开发软件无关的事情,并且赚钱的软件往往不是好玩的软件,所以解决方法是:找一个养家糊口的”白天工作“,然后在其余时间开发优美的软件。

3、不能说的话

先问自己:你是一个随大流的人吗?有没有什么观点不愿说出口?你的观点是别人灌输给你的,还是独立思考得到的?

不管哪个年代,有一件事都是不会改变的,那就是“祸从口出”。

满足“不能说的话”的两个条件 :

  1. 这些话不能说出口
  2. 它们是正确的,或者看起来很可能正确,值得进一步讨论

其中第二条更重要,很显然,你说一句 5+3=53 并不会引起人们的注意,除了嘲笑和鄙视。因为怒触他人的言论是那些可能会有人相信的言论。我猜想,最令人暴跳如雷的言论,就是被认为说出了真相的言论。

明确了什么是“不能说的话”,接着,作者给出了五种找出“不能说的话”的方法:

  1. 判断言论的真伪

  2. 关注“异端邪说”

    历史上的每一个年代,都会给”异端邪说“贴一些标签,目的是在人们开始思考它们是否为真之前就把它们封杀。其实在当代,也有这样的问题。我们应该多加注意那些贴标签的行为。

  3. 将当代观念与不同时期的古代观念 diff 一下,将当代不同地方的观念 diff 一下

  4. 寻找那些一本正经的卫道者,看看他们到底在捍卫着什么。作者用一个例子解释,父母在家里会尽量避免说脏话,只是不想让孩子学到。但是,孩子虽然没从父母那里学会说脏话,但是从他的朋友那里学到了。所以在家里,父母和孩子都不说脏话,而在外面都尽情地说。

  5. 观察禁忌是如何产生的。流行的道德观念往往不是偶然产生的,而是被刻意创造出来的。如果有些观点不能说,可能的原因是某些团体不让我们说。

    我猜想,道德禁忌的最大制造者是那些权力斗争中略占上风的一方。你会发现,这一方有实力推行禁忌,同时又软弱到需要禁忌保护自己的利益。

4、良好的坏习惯

黑客往往是不服从管教的,并以违反常理的思维方式思考、行动。虽然他们的行为常常导致平凡大众的反感,甚至厌恶,进而产生了偏见,但是这种“坏习惯”反而利大于弊,让他们保持了一种常人不具备的敏感,尤其是对于一些貌似无关痛痒,却与所有人息息相关的政治行为。

举例来说,为什么程序员会比其他人更在乎公民自由?表面上来看,政府侵犯公民自由并不会让代码质量下降,而只是逐渐导致一个观点占据上风。而如果一旦极权主义制度形成,那么这种制度就很难废除。黑客对公民自由这一概念比普通人理解的更透彻,更重要的是,他们明白失去知识自由之后未来的样子。所以他们能感知即将到来的暴风雨。

那些占据高位、本能地想要约束黑客、强迫黑客服从的人们,请小心你们的要求,因为你们真有可能成为千古罪人。

5、另一条路

在作者看来,一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。

要让软件变得可靠,关键是你要全神贯注,而不是开发得很慢。

如果你亲眼见到某人第一次使用你的软件,你就会知道软件的哪个地方最打动他。

互联网做起来很辛苦,还有许多特别大的压力,但是它们的唯一作用,就是使得创业公司成功的机会变大。

管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。

另外,如果你不打算自己动手开发和设计,那就不要创业。

6、如何创造财富

金钱不等于财富,创造有价值的东西就是创造财富。你最好先搞清楚什么是财富。财富与金钱并不是同义词。财富存在的时间与人类历史一样长久,甚至更长久,事实上蚂蚁也拥有财富。金钱是一种历史相对较短的发明。

要致富,你需要两样东西:可测量性和可放大性。

如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。

创业公司通过发明新技术盈利,所以具备可放大性。

如果你开发出来的技术是竞争对手难于复制的,那就够了,你不需要依靠其他防御手段了。

不应该收购的危险信号,排在榜首的信号中有一个就是公司由技术顽童掌控,只想解决有趣的技术问题,不考虑用户的需要。你开办创业公司不是单纯地为了解决问题,而是为了解决那些用户关心的问题。

政府禁止个人积累财富实际上就是命令人民减慢工作的速度。

只要懂得藏富于民,国家就会变得强大。

7、关注贫富分化

进入社会以后,你不能总是靠父母养活,如果你需要什么东西,要么你自己做出来,要么做其他东西与需要的人交换金钱,再用金钱去买你想要的东西

技术肯定加剧了有技术者与无技术者之间的生产效率差异

技术在加大收入差距的同时,缩小了大部分的其他差距

8、防止垃圾邮件的一个方法

这一节对于现在这个年代的意义不是很大,作者认为过滤垃圾邮件是可以做到的,基于内容的过滤器将发挥作用。 但是在他那个年代,意义很大的。

要对单个词语进行贝叶斯判断,就能很好地过滤大部分垃圾邮件。后面通过统计学的方法做了一个过滤器,其实有点像现在的机器学习了。

9、设计者的品味

他想要的学生不仅应该技术过硬,还应当能够使用技术做出优美的产品

你需要的是咬牙向前冲刺的痛苦,而不是脚被钉子扎破的痛苦。解决难题的痛苦对设计师有好处,但是对付挑剔的客户的痛苦或者对付质量低劣的建材的痛苦就是另外一回事了

在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果

10、编程语言解析

程序员的时间比计算机的时间昂贵得多。

长期使用某种语言,就会慢慢按照这种语言的思维模式进行思考。

静态类型语言与动态类型语言没有绝对的好坏之分,每个人都可以有自己的选择。

11、一百年后的编程语言

语言只是一种书写法,程序则是一种严格符合规则的描述,以书面形式记录计算机如何解决你的问题。
随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。
浪费分成好的浪费和坏的浪费,感兴趣的就是好的浪费,即用更多的钱得到更简单的设计。
对速度的追求是人类内心根深蒂固的欲望,设计编程语言的时候,应该有意识地问问自己,什么时候可以放弃一些性能,换来一点点便利性的提高。
将语言的语义与语言的实现分离。
写文章,就是为了试着搞清楚某件事情,对于软件而言也是如此。
效率低下的软件并不等于很烂的软件,一种让程序员做无用功的语言才真正称得上很烂,浪费程序员的时间而不是浪费机器的时间才是真正的无效率。
面向对象编程,使得可以对代码进行可持续性开发。
性能分析器有助于指导程序开发,现在许多人仍然相信程序运行速度提升的关键在于开发出能够生成更快速代码的编译器。

  • 一百年后的编程语言在理论上今天就能设计出来。
  • 如果今天真的能设计出这样一种语言,很可能现在适合编程,并且能够产生更好的结果。

12、拒绝平庸

这一节作者在推广 Lisp 语言,Lisp 很值得学习,你掌握它以后,会感到它给你带来的极大启发,这会大大提高你的编程水平,使你成为一个更好的程序员,尽管在实际工作中极少会用到 Lisp。

13、书呆子的复仇

在某些情况下,一些语言就是比另一些语言更出色。
认为所有语言都一样的看法的缺点是自欺欺人,但优点是可以使许多事情变得很简单。
编程语言现在的发展不过刚刚赶上 1958 年 Lisp 语言的水平。

为什么 Lisp 很特别,因为 Lisp 刚诞生的时候包含的 9 种思想:

  1. 条件结构(即 if-else 结构)
  2. 函数也是一种数据结构
  3. 递归
  4. 变量的动态类型
  5. 垃圾回收机制
  6. 程序由表达式组成
  7. 符号类型
  8. 代码使用符号和常量组成的树形表示法
  9. 无论什么时候,整个语言都是可用的(Lisp 不真正区分读取期、编译期、运行期)

14.梦寐以求的编程语言

这种语言干净简练,具有最高层次的抽象和互动性,而且很容易装备,可以只用很少的代码就解决常见的问题。不管是什么程序,你真正要写的代码几乎都与你自己的特定设置有关,其他具有普遍性的问题都有现成的函数库可以调用。

这种语言有大量优秀的范例可供学习,而且非常符合直觉,你只需花几分钟阅读范例就能领会应该如何使用此种语言。

这种语言以层的方式构建。较高的抽象层透明地构建在较低的抽象层之上。如果需要的话,你可以直接使用较低的抽象层。

这种语言的所有细节对使用者都是透明的。它提供的抽象能力只是为了方便你的开发,而不是为了强迫你按照它的方式行事。

15、设计与研究

让用户满意并不等于迎合用户的一切要求,用户不了解所有可能的选择,也经常弄错自己真正想要的东西。
编程语言也应该是以人为本。
贴近用户的设计思想被归纳为“弱即是强”模式。
任何时候,代码都必须能够运行。