《黑客与画家》读书笔记


黑客与画家并不单单意味着编程是一门艺术,实际上这本书的作者 Paul Graham 本身也是一个程序员和画家的结合(他原本想成为一名画家,最后迫于生计不得不编程维生)。本书的译者为阮一峰,也是一名非常了不起的牛人。

评分:5分

译者序

黑客的六条“伦理”

  • 使用计算机以及所有有助于了解这个世界本质的事物都不应该受到任何限制,任何事情都应该亲手尝试
  • 所有信息都应该是自由的
  • 不信任权威,提倡去中心化
  • 判断一名黑客的水平应该看他的技术能力
  • 你可以使用计算机创造美和艺术
  • 计算机使生活更美好

全书大概分为三个部分

  • 1-4章:介绍黑客是如何成长的,以及他们看待世界的一些观点
  • 5-9章:解释了黑客如何做出自己的成果,这些成果如何对全世界产生影响
  • 10-15章:黑客的工具(编程语言)和工作方法,这是黑客文化的基础和核心

为什么书呆子不受欢迎

书呆子不受欢迎的真正原因,是他们脑子里想着别的事情(smarter),他们有其他的兴趣,没有多余的经理来使自己更加受欢迎。同时,其他伙伴们也喜欢欺负书呆子,因为这与“受欢迎”的心理有关(这在美国校园环境中很重要),没有什么比一个共同的敌人更能使得人们团结起来了。而且通常情况下,喜欢捉弄书呆子的人都是“焦虑的中间层”

黑客与画家

优美的软件并不总是论文的合适题材,黑客真正想做的是设计优美的软件,考核这种工作是非常困难的,你本人需要有良好的设计感,才能去考核别人的设计是否良好。但是“你觉得你具有良好的设计感和你实际是否具有,不存在相关联系。

别人无法考核你的工作,甚至误解你的工作,都不是最糟糕的事,更大的危险是你自己也会误解自己的工作。我发现自己以为需要记住各种理论实际上是错误的,何可不需要搞懂太多的概念,黑客新想法的最佳来源是其他创作领域。

黑客如何才能做自己喜欢的事情?找一份养家糊口的“day job”,然后业余时间做自己喜欢的事情

黑客也可以从绘画中学习一些经验

  • 画家学习绘画的方法主要是动手去画,黑客学习编程的方法也应该如此(这一点我比较有感触,看书上讲了一堆设计模式,但实际上还是要结合实际才能有更深的体会,但这与那是本好书不矛盾)
  • 我们不应该期待现有一个完美的规格设计,然后再动手编程设计。应该是动态设计的,也就是说一开始搭好框架,然后慢慢修改
  • 优秀的软件应该要要求对美的狂热追求。如果你查看优秀软件的内容时,就会发现那些预料中没有人会看见的部分也是优美的
  • 黑客就像画家,工作起来是有心理周期的,最开始有一个令人兴奋的新周期时,你愿意为之每天工作16个小时,等过完这一阵,你又会觉得无聊。你在工作时,必须把这种因素考虑在内,解决办法是你可以把解决bug放在最后(因为消灭bug对作者来说很简单)
  • 在多人合作时,最好是分工尽量分板块进行,不要太重合了
  • 设计软件时,尽量人性化设计,为了吸引用户,你必须理解用户需要什么,举例来说,几乎所有伟大的绘画作品都是画人的,因为人类总是对自身感兴趣的
  • 源代码应该能做到自己解释自己,SICP中有一句说道“程序是给人看的,附带能在机器上运行”。一种好的编程语言,应该比英语更容易理解软件,同时把代码写得便于阅读,并不意味着要塞进去很多注释。只有在那些不太成熟,容易出错的地方才需要加上注释

不能说的话

不能说的话的特点

  • 不能说出口
  • 它们是正确的

如何寻找不能说的话

一些给别人人贴诸如“失败主义者/制造分裂”的标签的行为是很可怕的

异端邪说

时空差异

我们可以自以为是地相信,当代人比古代人更聪明,更高尚,但是,了解的历史越多,就能明白事实并非如此,古人适合我们一样的人,不管他们产生怎样的想法,都是正常人的想法。因此,时长回顾历史或者和当代的其他文化进行比较,如果一种行为只有在我们现在这个社会里当做禁忌,那么很有可能是我们出错了

道貌岸然

流行产生的机制

道德禁忌的最大制造者是那些权力斗争中略占上风的一方,这一方有实力推行禁忌,但同时也需要积极保护自己的利益

大多数的斗争,不管它们实际上争的是什么,都会以思想斗争的形式表现出来。我并不是说斗争从来与思想无关,而是要强调,不管实际上是否有思想斗争,斗争总是会以思想斗争的形式表现出来

虽然流行的思想观点和流行的服饰产生方式不尽相同,但是它们的传播途径非常相似。第一批的接受者总是带有很强的胜负心,他们有自觉的精英意识,想把自己和普通人区别开来。当流行趋势确立以后,第二批接受者就加入进来了,恐惧心在驱使着他们(不是因为想要与众不同,而是因为害怕与众不同)

所以,如果你想要找到“不能说的话”,你可以考虑观察流行产生的方式

为什么要找不能说的话

  • 出于好奇心
  • 我不希望我们自以为是正确的事将来被证明是荒谬可笑的。我希望我能提前知道这些事
  • 这是很好的思维训练方式
  • 优秀作品往往来自于其他人忽视的想法,而罪被忽视的想法就是那些被禁止的思想观点
  • 科学家做事的方式,就是寻找传统观点无法自圆其说的地方,然后试着拆开那里,瞧瞧里面到底出了什么问题,新的理论就是这样产生的

看来存在一个清晰的关联关系,智力越高的人,越愿意去思考那些惊世骇俗的漏洞,这不仅仅因为聪明人很积极地寻找传统的漏洞,还因为传统观念对他们的束缚很小,很容易摆脱。

守口如瓶

一旦发现了“不能说的话”,我的建议就是别说,至少也是挑选合适的场合再说,只打值得打的仗

你应该要明白,自由思考比畅所欲言更重要如果你感到一定要跟那些人说个明白,绝不咽下这口气,结果很可能是你无法自由理性地思考了。我认为更好地方式是在思想和言论之间画一条明确的界限,在心里无所不想,但是不一定要说出来。“搏击俱乐部的第一条原则就是不要提到搏击俱乐部”

不过你最好还是找一些靠得住的朋友,只和他们畅所欲言,无所不谈

防守的技巧

如果你看不惯一些狂热分子,一个比较好的办法是把辩论提升到一个抽象的层次,可以

  • 攻击元标签,而不是原本的标签(这样别人就有机可乘)
  • 隐喻

永远质疑


荷兰人认为自己思想开放,但是这种想法本身却什么也证明不了,有谁认为自己的思想不开放?美国郊区的中产阶级白人家庭普遍家教严格,限制孩子与外接多接触,可那里长大的孩子也认为自己思想开放呢!不管问谁,人们都会说同样的话“我们的心态很开放,愿意接受新思想”但实际上人们脑子里有一根界限,早就认准了什么是对的,什么是错的。在他们看来,所有观点都是可以讨论的,除了那些错误的观点

如果你的数学不好,你自己会知道,因为考试的时候你得不出正确的答案。但是如果你思想很保守,你自己不会知道,而且很有可能会持有相反的想法。请记住,所谓流行,本质上就是自己看不见自己的样子,否则就不会有流行了

想要摆脱你自己的时代的流行,需要一点自觉。你不要让自己成为人群的一份子,而要尽可能地远离人群,观察正在发生的事情,特别主要哪些被压制的思想观点。比如有些软件提供互联网过滤的功能,防止孩子和雇员看到色情的暴力的宣扬仇恨的网站,但是什么才叫色情和暴力?什么叫做宣扬仇恨?

如果一个命题不是错的,却被加上各种标签进行压制和批判,这就很有问题。当你听到有人在用这样的标签,就要问为什么

如果你想要清晰地思考,就必须远离人群,但走得越远,你的处境就会越艰难,受到的阻力也会越大

如果自己就是潮水的一部分,怎么能看见潮流的方向呢

良好的坏习惯

总体来看黑客是不服从管教的,但是不服从管教正是黑客之所以成为优秀程序员的原因之一

公民的自由是一个国家富强的原因,而不是结果

专制国家会变成腐败国家,腐败国家会变成贫穷国家,贫穷国家会变成弱小国家

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

另一条路

B/S架构的优点:

  • 数据和软件本身都不必保存在终端设备上了,只需要一个浏览器你就能完成你想要的
  • bug会被发现地更快
  • 适合团队开发
  • 避免了发布新版本的噩梦(对于桌面软件来说,你必须积累很久的bug然后一起发布,接着就是新的bug,但对于web应用来说,大部分的变化都是细微和渐进的,引入bug的机会比较小)
  • 因为用户的数据都在你的手上,你能很好地再现大部分的bug
  • 解决新代码的bug要比解决历史遗留代码的bug容易,因为你更新的频率高,如果一个地方可能会出bug,你是会在脑子里有印象的
  • 不容易形成复合式bug
  • 客服和程序员之间交流的通道缩短了
  • 一旦写完就能看到效果,这对开发人员来说是很大的激励

关于盗版

web软件很难有盗版,但是这也是一个问题。一定数量的盗版对软件公司是有好处的,不管你的软件定价是多少,有些用户永远都不会购买。如果这样的用户使用盗版,你并不会有任何损失,事实上你反而赚到了,因为你的软件多了一个用户,市场影响力大了一分

只要有可能,商业性公司就会采取一种“价格歧视”的定价方法,这实际上就是针对不同的客户采取不同的报价,商业软件的定价非常适合这种方法,因为它的成本几乎等于0.盗版实际上也是一种价格歧视,

通过ISP分销互联网软件,就好比让自动售货机出售寿司

如果你想把钱藏在更安全的地方,你是选择放在家里的床垫下还是在银行里?

现在创业公司有更多的理由选择互联网软件创业,因为开发桌面软件越来越乏味了

“帕金森定律:因为你必须做到,所以你能做到”

互联网应用迫使程序员变成系统管理员

如何做出用户喜欢的产品

  • 你自己愿意使用
  • 迅速做出1.0版,并不断加以改进(听取用户的建议)
  • 低端的用户希望简化操作和清晰易懂,高级用户希望增加新功能,做到这一点的方法是正确设置默认值,而不是限制用户的选择

如何创造财富

作者认为最好的办法就是自己创业,或者加入创业公司

通过创造有价值的东西致富,这种方法的优势不仅仅在于它是合法的,还在于他更简单,你只需要做出别人需要的东西就可以了

金钱不等于财富,财富是我们需要的东西。

金钱是专业化的副产品。交换媒介的优点是,它使交易可以进行下去。缺点是,它模糊了交易的实质,人们觉得做生意就是为了赚钱,不是,本质上人们还是为了更方便地获取自己想要的东西,

人们对财富总额总是有一种错误的固有观点,认为其总量是不变的。实际上,社会会的财富一直在增长和毁灭(总体为增长)

小团队=可量测性(大公司就不一样,很难评估你真正的工作效率)

回顾历史,大多数因为创造财富而发财的人都是通过开发新技术而实现的。

对于创业公司来说,很重要的一点就是如何跟大公司做周旋。假如你是一个身手敏捷的小男孩,身后一条身材壮硕的大狗在追你,你跑到楼梯口,这时应该上楼还是下楼,我觉得应该上楼,因为上楼的话,你会很累,但大狗会更累。在实际操作中,这就意味着我们应该总是选择比较难的功能,不是因为这个功能能带来更多的收入,而是因为它比较难

对个人来说,付出和回报存在一个随机的放大因子

关注贫富分化

有的时候你会想,任何人之间创造财富能力的差别真的有这么巨大吗?理解这一点的核心就在你是否愿意用一百个平庸的人交换那一个关键的人。也许CEO和运动员的技能和决心只比普通人高出10倍,但是人与人之间就是存在着重大区别

技术的发展是否加剧了贫富差距,首先,技术肯定加剧了有技术者和无技术者之间的生产效率差异,毕竟这就是技术进步的目的。这是不是一个社会问题?好像没有那么严重,技术在加大收入差距的同事,缩小了大部分的其他差异

无论在物质上,还是在社会地位上,技术好像都缩小了富人和穷人之间的差距

你经常可以听到有人批评某种政策会加剧贫富分化,隐藏的意思是,贫富分化的加剧一定是坏事。我不觉得这可以被看做为一个公理。

我想提出一种相反的观点,现代社会收入差距是一种健康的信号,技术使得生产率的差异加速扩大,如果这种扩大没有反应在收入上面,只要三种可能:1)技术革新停顿了2)那些创造大部分财富的的人停止工作了3)创造财富的人没有获得报酬。如果你想让社会保持繁荣,同时收入差距不哭到,那么只剩下3)这个选项。如果得不到报酬,人们是否还愿意创造财富,除非工作能提供乐趣。但即使是最先进的高科技公司,也会有至少90%的工作没有乐趣

从历史的角度看,只要你压制收入差距的扩大,最终结果一定是整体变得更加贫穷。你应该要避免绝对贫穷而不是相对贫穷 :)不妨去过一下9世纪的贵族生活

防止垃圾邮件的一种方法

设计者的品味

好设计是简单的设计

好设计是解决主要问题的设计

好设计是启发性的设计

好设计通常情况下是有点趣味性的设计

对称

模仿大自然

编程语言解析

高级语言的优点:

  • 程序更简短(相较于汇编)
  • 程序具有可移植性

开源的优点:

  • 修改bug
  • 所有聪明人都可以参加

“用什么语言都不重要,重要的是你对问题是否有正确的理解,代码以外的东西才是关键”。这当然是一派胡言,fortranperl就是两种完全不一样的语言

事实是,语言之间确实存在差别,但是很难确定哪一种语言是最好的

并不是语言的抽象层次越高越好,也有可能完全走错了方向,另外使用低层次语言的原因就是效率问题

一百年后的编程语言

我认为,编程语言就像生物物种一样,存在一个进化的脉络,许许多多分支都会成为进化的死胡同

效率地下的软件并不等于很烂的软件,一种让程序员做无用功的语言才能称得上真的烂。

拒绝平庸

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

作者认为,上述的说法不太靠谱,因为既然你觉得它很好用,那为什么不拿它来开发商业产品呢,而且作者确实这么做了。

书呆子的复仇

一些经历奇迹般地具备了两种很常见但很难结合在一起的特点:1)对技术一无所知2)对技术有强烈的个人观点

Lisp语言的特点

  • 条件结构(if else then )
  • 函数可以作为变量
  • 递归
  • 变量的动态类型
  • 垃圾回收机制
  • 程序由表达式组成
  • 符号类型
  • 代码使用符号和常量组成的树形表示法
  • 无论什么时候,代码都是可用的

Lisp的最大优势就在竞争激烈的条件下开发哪些解决困难问题的复杂程序

梦寐以求的编程语言

没人愿意在程序的头部加上一大堆的声明语句(java)

设计与研究

优秀的建筑师不会先设计,然后强迫用户接受,而是先研究最终用户的需求,然后做出用户需要的设计

读书感悟

重新读本书的时候,一边看一边将重要的段落摘抄下来,说来惭愧,二刷的时候竟然有一种一刷的感觉,之前看的时候实在过于鲁莽,囫囵吞枣。说实话,全篇读下来,真正关于编程的干货大概只有四成,剩下的全是作者对于生活细节的洞见和思考,思想深邃程度不逊于我原来所看的一些专业书籍,真是一个妙人儿,居然能在不止一个领域做到卓越,非常了不起。其中,作者有关质疑的部分也是极为有趣,非常值得回味。