< 黑客与画家 > 读书笔记
Table of Contents

< Hackers and Painters -- Big ideas from the Computer Age >

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

Paul Graham,Lisp专家,互联网应用程序Viaweb开发人之一。创建的Viaweb公司后被雅虎收购,改名为YahOO!Store。2005年创办Y Combinator,开创了天使投资新模式,被《福布斯》杂志喻为“撼动硅谷的人”。目前为止其公司扶持的创业公司已有250余家,成功的超过80%。Graham是当之无愧的“硅谷创业之父”。


序言

Paul Graham 的创业公式:

  1. 搭建原型
  2. 上线运营(先别管 bug)
  3. 收集反馈
  4. 调整产品
  5. 成长壮大

所有东西都在变成软件,印刷机诞生以来,人类写过多少字,未来就有多少家软件公司。 -- Paul Graham

什么是黑客?

黑客价值观/黑客伦理(出自 < Hackers: Heroes of the Computer Revolution >)

  1. 使用计算机以及所有有助于了解这个世界本质的事物都不应受到任何限制 任何事情都应该亲手尝试
  2. 信息应该全部免费
  3. 不信任权威,提倡去中心化
  4. 判断一名黑客的水平应该看他的技术能力,而不是看他的学历、年龄或地位等其他标准
  5. 你可以用计算机创造美和艺术
  6. 计算机使生活更美好

ch1 为什么书呆子不受欢迎

文艺复兴时期的代表人物阿尔伯蒂有一句名言:“任何一种艺术,不管是否重要,如果你想在该领域出类拔萃,就必须全身心投入。”

书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。他们的注意力都放在读书或者观察世界上面,而不是放在穿衣打扮、开晚会上。

孩子们欺负书呆子的一个原因是为了让自己感到好受一点。好比一个政客,他想让选民忘记糟糕的国内局势,方法就是为国家找出一个敌人,哪怕敌人并不真的存在。

为什么离开学校后,真实的世界能够友好地对待书呆子呢?并非在于真实的世界由成年人组成,而在于它的庞大规模使得你做每件事都能产生真正意义上的效果。(小孩子才看对错,大人只看利益)


ch2 黑客与画家

黑客与画家的共同之处,在于他们都是创造者。他们本质上都不是在做研究,虽然在创作过程中,可能会发现一些新技术。

计算机科学,根本不像科学。大杂烩,由于历史原因很多不相干的东西被强行拼凑在一起。

黑客想要设计优美的软件。

把整个程序想清楚的时间点,应该在编写代码的同时,而不是编写软件之前。

编程语言是帮你思考程序的,而不是帮你表达你已经想好的程序。(好程序都是改出来的)

业余时间写了什么软件?如果你不爱一件事,你不可能把它做得真正优秀,要是你很热爱编程,你就不可避免地会开发自己的项目。

优秀的黑客懂得“换位思考”。判断一个人有没有“换位思考”能力,看他怎么向没有技术背景的人解释技术问题。

程序写出来是给人看的,附带能在机器上运行。

在达芬奇的年代,绘画不是一件很酷的事情,达芬奇用自己的工作推动绘画成为一种伟大的表达方式。今天,编程到底能够有多酷,取决于我们能够用这种新媒介做出怎样的工作。


ch3 不能说的话

所谓“时尚”,本质上就是看不见自己的样子。

不要轻易随波逐流。连想都不敢想,就马上放弃自己的观点,那才会真的出问题。

寻找传统观点无法自圆其说的地方,瞧瞧出了什么问题,新的理论就是这样产生的。

与笨蛋辩论,你也会变成笨蛋。自由思考比畅所欲言更重要。

“守口如瓶,笑脸相迎。”

想要清晰的思考,请远离人群。如果自己就是潮水的一部分,怎么能看见潮流的方向?永远保持怀疑。


ch4 良好的坏习惯

黑客,无论“黑(hack)”是贬义词、褒义词,一个共同点是“不符合常规”。

“满足智力上的好奇心”是黑客的动机之一。

不服从管教,其实是黑客之所以能成为优秀程序员的原因之一。

只有深入了解当前技术,才能下一代技术。专利、版权法阻碍了深入了解当前技术,因此遭到黑客们反对。

公民自由并不仅仅是社会制度的装饰品,或者一种很古老的传统。公民自由使得国家富强。如果将人均国民生产总值与公民自由的关系画成图,你会发现它们是很清楚的正相关关系。公民自由真的是国家富强的原因,而不是结果吗?我认为是的。在我看来,一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。专制国家会变成腐败国家,腐败国家会变成贫穷国家,贫穷国家会变成弱小国家。

个人想法:西方很多人把“自由”的权利看得很重,和一些出国读书的同学交流,大多数人思想里也认为“自由”最重要。


ch5 另一条路

我们对别人说软件运行在服务器上,几乎没人懂这是什么意思。(联想到阿里云)

如何发现下一个潮流?可以从身边的种种不便入手。比如桌面电脑应用程序的弊端。

“你的电脑”这个概念正慢慢成为过去,取而代之的是“你的”数据。

警惕“伪信号”(artifact), 不能因为xxx是这样开发的,就认为所有软件都应该这样开发

软件发布方式的改变:传统桌面软件,发布版本很“重”;互联网软件,大部分变化是细微和渐进的。

软件的 bug,尽早发现 bug,减少复合式 bug。

可以考虑 将最核心的部分用“函数式编程”实现,减少副作用 。纯函数式编程由于不包含“状态”,易于调试。

Viaweb 的开发人员总是同客服人员保持密切联系。客户支持实际上就是质量监控,也是某种程度上的市场营销。

逆向人月神话:人数越少,软件开发效率越高。(适合精英化团队)

珍惜用户,用户是最好的测试员。

软件开发不是静态的,而是一个持续不断地动态过程。

对于软件公司来说,重要的是拥有持续的现金流。

为什么互联网软件比桌面软件卖得好? 如果某样东西易于购买,你就会多买一些;自从有了网购,我买的新书比什么时候都多

除了微软自己,没有人能让微软遭受严重挫折。(2019年的今天,微软的互联网转型算是成功了)

不要害怕尝试新事物,不要畏惧创业。

许多农场用电篱笆防止奶牛逃跑,但是不少电篱笆其实没有通电。

不敢开始创业的阻力:

如何做出用户喜欢的产品


ch6 如何创造财富

发财的最好办法:自己创业,或者加入创业公司(startup)。

思考下面的问题:

如果你想赚 100 万美元,你需要承受相当于 100 万美元的痛苦。

创业 压缩 了你的工作。你不再是低强度地工作四十年,而是以高强度工作几年。

你的工资是多少,那么你每年至少需要为公司创造不低于工资的价值,但你的实际工作时间可能是规定工作时间的两倍。-> 思考什么是效率。

小公司,自由,“不受干扰”。

关于运气。任何公司和人的成功,都有运气的成分。微软,DOS 操作系统授权协议的受益者。

金钱 != 财富。财富存在的时间同人类历史一样长。金钱只是一种存在时间相对较短的发明。

物物交换的弊端 -- 如果你本人制作小提琴,而附近的农民都对它不感兴趣,你怎么来交换食品?

金钱是一种交换中介,它必须数量稀少,便于携带。

交换媒介的优点是大大提高了商品交换的效率;缺点是,它 模糊了交易的本质 。做生意是为了挣钱,但挣钱是为了什么?为了得到自己想要的东西。这里进一步引申,创造财富 -> 做出人们真正想要的东西。

财富的总量是不变的吗?不是。人类历史上的财富一直在不停地增长和毁灭(总体上是净增长的)。

手工艺人。程序员本质上是手艺人。优秀软件本身就是一件有价值的东西。程序员真正面对产品,一行一行代码地把软件写出来。为什么大部分优秀程序员都是自由主义者?他们真正为产品负责,向下沉沦或向上奋进都取决于自己,不把原因推给外界。

公司:许多人聚集在一起创造财富的地方。

公司的一切行为的目的都是为了盈利,从而生存下去。公司的产品必须满足人们的某种需要。

思考工作的本质:“你需要去做一些人们需要的东西。”即使不加入公司,你也能做到。公司只不过是一群人聚集在一起共同作出某种人们需要的东西。真正重要的是做出人们需要的某种东西,而不是加入某个公司。

必须要有人对公司负责,一个表现糟糕的 CEO 是不能说自己尽力了的。公司表现不好就是他的表现不好。

可测量性可放大性 对创造财富至关重要。你的职位产生的业绩应该是可测量的。你做出的决定应该能够产生巨大的效应。

可测量性,如何度量每个人的工作。古罗马战舰,一千个划船手,每个人的工作都被平均化了,每个人看不到自己努力的价值。创业公司,聚集最有价值的划船手(小而精的团队)。

可放大性,最典型的就是高科技。什么是技术,技术就是某种手段,就是我们做事的方式。技术是钓鱼的鱼竿,而不是鱼。如果你解决了一个热门的技术难题,别人都会用你的解决方案,这就是可放大性。

考虑建立“壁垒”(barrier to entry),如果大公司要复制你的模式怎么办?

开公司不光要解决问题,而是要解决用户真正关心的问题。创造人们需要的东西,就是创造财富。你必须知道人们需要什么。

财富和权力。过去,快速获得财富的方法只有继承、婚姻、征服、没收。法律和工业化改变了财富积累的方式。

法律保障了人们拥有财富的权利;工业化,极大解放生产力。

只有在极大利益的激励下,你才会去挑战那些困难的问题。

工业革命的起因,财富激励是很重要的一方面,历史上欧洲之所以强大,很大一方面可能就是欧洲人接受了一个观点:允许赚到大钱的人保住自己的财富。


ch7 关注贫富分化

赚钱也是一种专门的技能。

社会的偏见:如果某人善于赚钱,舆论就会指出来这是有问题的,大众的“仇富心理”。原因:

有没有可能,收入差距扩大是一种好的信号?(先不要关注对错,想想背后的逻辑)

每个人的技能不同,导致收入不同,这才是贫富差距的主要原因。

一些工作薪酬高,一些工作薪酬低,为什么?在自由竞争的市场经济中,价格由买家的需求决定。

如果你觉得由于人们的需求不正确,导致某些工作的报酬过低而且不公平,那么这个世界一定会让你感到非常遗憾, 人们就是喜欢看电视真人秀,而不是莎士比亚的作品,人们就是喜欢吃玉米热狗,而不是水煮蔬菜,这是不是很不公平啊 ?要是你觉得不公平的话,那就同把蓝颜色说成最漂亮的颜色、把方的说成圆的那样蛮不讲理。

很多人对财富的产生有偏见,认为富人的钱是从穷人手中“偷窃”来的。

苹果公司的两个创始人乔布斯和沃兹尼亚克没有使其他人变得更贫穷就赚到了钱。他们创造出来的东西使得人们的物质生活更富有。

技术的杠杆效应:技术必然会加剧有技术者和无技术者之间的生产效率差异,这就是技术进步的目的。

技术的发展加大了贫富差距,难道我们就不应该发展技术了吗?肯定不行,技术在加大收入差距的同时,缩小了大部分的其他差距。

作者的与主流相悖的观点:现代社会的收入差距扩大是一种健康的信号。如果技术发展了,收入差距却没有扩大,那么可能性为:

反过来看,如果创造财富的人没有获得应有的报酬,谁还愿意创造财富?

总的来说,应该避免的是绝对贫穷,而不是相对贫穷。作者会选择个人相对贫穷,但整体上更为富裕的社会。

(另一个问题,什么是贫穷?)


ch8 防止垃圾邮件的一种方法

贝叶斯过滤器。基于统计的方法,传统程序员往往首先想到基于规则的方法。

统计学方法的一大优点是,你不需要一封封去看垃圾邮件。


ch9 设计者的品味

美感是第一道关卡。丑陋的数学在世界上无法生存。 -- G.H. 哈代

不仅要技术过硬,还应当能够使用技术做出优美的产品。

好的设计是简单的设计。

当你被迫把东西做的很简单时,你就被迫直接面对真正的问题。

如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不是来自风潮的影响。

好的设计是启发性的设计。

好的设计是有趣味性的设计。

好的设计并非一定有趣,但很难相像无趣的设计是好的设计。

好的设计是艰苦的设计。

好的设计是看似容易的设计。

在大多数领域,看起来容易的事情,背后都需要大量的练习。

好的设计是对称的设计。

对称的危险在于它可以用来取代思考,在大量使用重复的时候这种危险性更大。

好的设计是模仿大自然的设计。

大自然在长期演化的过程中已经解决了很多设计问题。

好设计是一种再设计。

很少有人一次就把事情做对。先做出原型,再不断改进。

好设计是能够复制的设计。

好设计常常是奇特的设计。

好设计是成批出现的。

推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更加重要。

好设计常常是大胆的设计。

发现丑陋的东西比想象出一个优美的东西更容易。

只有对这个领域非常熟悉,你才可能发现哪些地方可以动手改进。

ch10 编程语言解析

所有机器都有一张操作清单,让你可以控制它。

优先使用高级语言,程序员的时间比计算机的时间宝贵得多。

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

编程语言的文艺复兴,好事。

ch11 一百年后的编程语言

一种语言的内核设计越小,越干净,它的生命力就越强。

随着技术发展,每一代人都在做上一代人觉得很浪费的事情。

对执行效率的追求永无止境,人们总希望程序跑得越快越好。

目标长远,要把车开直,不需要将车身对其路沿和分隔线,而是要瞄准远处的某个点。

ch12 拒绝平庸

Viaweb 使用 Lisp 开发,why ?

真正非常严肃地把黑客作为人生目标的人,应该考虑学习 Lisp。

Lisp 值得学习,它会给你在编程方面带来极大的启发,虽然你在实际工作中很少会用到它。

拉丁语无助于你找工作,但它可以训练你的思维,帮助你更好地运用母语进行写作。

为什么 Lisp 没有得到广泛应用?软件行业,不仅仅是编程。

编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。

编程语言的编程能力有差异。

到了一定年龄之后,程序员很少主动更换自己的编程语言,他们往往认为自己使用的语言已经足够好了。

Lisp 的宏是独一无二的。

合气道(Aikido),日本武术,“以柔克刚”、“借劲打力”。

创业公司的合气道,不要轻易动摇,技术的变化很快,但是编程语言不一样,编程思想不一样。人类天性的变化速度大大慢于计算机硬件变化的速度,编程语言的发展速度通常比 CPU 的发展落后二十年。

ch13 书呆子的复仇

软件业有一场永不停息的战斗,书生气的开发者与官僚主义的经理之间总是发生冲突。

约翰麦卡锡提出了 Lisp 语言。起初只是作为一种理论演算,试图用更简单的方式定义图灵机。麦卡锡的学生史蒂夫拉塞尔把 Lisp 解释器做了出来。

Lisp 对现代编程语言的影响十分广。Ruby 可以看成一种 Lisp 方言。

Lisp 的宏非常强大,它可以让你创造一种新语言。

使用不常用的技术可能有风险,但也不要轻易随大流。

“业界最佳实践”可能只会让你变得平庸。

ch14 梦寐以求的编程语言

黑客欣赏的一个特点就是简洁。黑客都是懒人,痛恨冗余的事情。

简洁性最重要的方面就是要使得语言更抽象。

对黑客来说,还有一点在选择编程语言时更重要,那就是这种语言必须能够帮助自己做到想做的事情。

好的编程语言要经得住时间的考验。

拥抱“再设计”,好的文章来自不断修改,好的代码也是。为了写出优秀软件,你必须同时具备两种互相冲突的信念:对自己的能力信心万丈,对自己的能力保持怀疑。

ch15 设计与研究

设计与研究的区别看来就在于,前者追求好,后者追求新。

让用户满意不代表满足用户的一切需求。如果你觉得自己是在为傻瓜设计产品,那么很可能设计不出优秀的作品。

为了做出优秀的设计,你必须贴近用户,始终寸步不离,永远站在用户的角度调整自己的构想。

“弱即是强”(Worse is Better)。更少的功能反而是更好的选择,小而精的软件可能比大而复杂的软件更容易流行。

先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气。“画作永远没有完工的一天,你只是不再画下去而已。”