这本书是硅谷创业之父,Y Combinator创始人Paul Graham的文集。之所以叫这个名字,是因为作者认为黑客(并非负面的那个意思)与画家有着极大的相似性,他们都是在创造,而不是完成某个任务。
未来的人类生活不仅是人与人的互动,而是越来越多的与计算机互动,所以必须理解计算机,其关键就是理解计算机背后的人,即设计计算机的人——程序员,而最伟大的程序员就是黑客。
本书要点
尝试解释计算机世界里发生了什么事,不仅仅是写给成员看的,也适合所有人。作者最大的目的就是,让普通读者理解我们所处的这个计算机时代。
主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。
适合所有程序员和互联网创业者,也适合一切对计算机行业感兴趣的人
精编书摘
为什么书呆子不受欢迎
为什么会被歧视和欺负?所有现在还在学校里读书的人可能会又一次觉得,怎么会有人问出这么蠢的问题。怎么可能会有其他结果呢?当然会有其他结果。一般来说,成年人就不会去欺负书呆子。为什么小孩子会这样做呢?
一部分原因是,青少年在心理上还没有摆脱儿童状态,许多人都会残忍地对待他人。他们折磨书呆子的原因就像拔掉一条蜘蛛腿一样,觉得很好玩。在一个人产生良知之前,折磨就是一种娱乐。
孩子们欺负书呆子的另一个原因是为了让自己感到好受一些。当你踩水的时候,你把水踩下去,你的身体就会被托起来。同样,在任何社会等级制度中,那些对自己没自信的人就会通过虐待他们眼中的下等人来突显自己的身份。我已经意识到,正是因为这个原因,在美国社会中底层白人是对待黑人最残酷的群体。
它就像人生一样,里面无所不包,但又不是事物的真实样子。它只是一个暂时的过程,只要你向前看,你就能超越它,哪怕现在你还是身处其中。
黑客与画家
黑客与画家的共同之处,在于他们都是创造者。
创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。
把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前。
普通黑客和优秀黑客的所有区别中,会不会换位思考可能是最重要的因素。
程序是写出来给人看的,附带能在机器上运行。
不能说的话
很多看似叛逆的异端邪说,早就潜伏在我们的思维深处。如果我们暂时关闭自我省查意识,它们就会第一个显现出来。
优秀作品往往来自于其他人忽视的想法,而最被忽视的想法就是那些被禁止的思想观点。
守口如瓶的真正缺点在于,你从此无法享受讨论带来的好处了。讨论一个观点会产生更多的观点,不讨论就什么观点也没有。
所谓流行(传统观念也是一种流行),本质上就是自己看不见自己的样子。
如果自己就是潮水的一部分,怎么能看见潮流的方向呢?你只能永远保持质疑。问自己,什么话是我不能说的?为什么?
良好的坏习惯
在大众眼里,黑客(hacker)就是入侵计算机的人。在程序员眼里,黑客指的是优秀程序员。
只有深入了解当前技术,黑客才能构想下一代技术。
公民自由真的是国家富强的原因,不是结果吗?是的。一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最有优方案,而不是采纳最有权势的人提出的方案。
另一条路
如果互联网软件能够击败桌面软件,一定是赢在更方便这一优势上。
对于开发者来说,互联网软件与桌面软件最显著的区别就是,前者不是一个单独的代码块。
设计桌面软件就像设计一幢大楼,而设计互联网软件就像设计一座城市。
早一点发现bug就不容易形成复合式bug。在软件中,复合式bug是最难发现的bug,往往也会导致最大的损失。
互联网软件不仅把开发者与他的代码更紧密地联系在一起了,而且把开发者与他的用户也更加紧密联系在一起了
订阅报纸模式正式互联网软件纯天然的收费模式。
桌面软件迫使用户变成系统管理员,互联网软件则是迫使程序员变成系统管理员。
如何创造财富
真正重要的是做出人们需要的东西,而不是加入某个公司。
要致富,需要两样东西:可测量性和可放大性。
成年人在真实世界中的团体,一般来说,都存在某个共同目标。那么领导者通常可以由最善于实现此目标的人承担,而学校里的学生并没有共同目标,但等级关系却不会消失,所以学生们的等级是凭空创造出来的。
关注贫富分化
技术在加大收入差距的同时,缩小了大部分的其他差距。
技术使得生产率的差异加速扩大。
防止垃圾邮件的一种方法
大多数黑客都是好胜心很强的人。
设计者的品味
好设计师简单设计。
好设计永远不是过时的设计。
以永不过时为目标也是一种避开时代风潮的影响的方法。
好设计是解决问题的设计。
好设计是启发性的设计。
好的设计通常是有点趣味性的设计。
好设计是艰苦设计。
好设计是看似容易的设计。
好设计是对称设计。
好设计是模仿大自然的设计。
好设计是一种再设计。
好设计是能够复制的设计。
好设计常常是奇特的设计。
好设计是成批出现的。
好设计常常是大胆的设计。
编程语言解析
编程语言的一个重要特点:一个操作需所需的代码越多,就越难避免bug,也越难发现他们。
高级语言还有一个特点,他使得程序更具有可移植性。
用什么语言并不重要,重要的是对问题是否有正确的理解。代码以外的东西才是关键。
一百年后的编程语言
编程语言就像生物钟一样,存在一个进化的脉络,许许多多分支最终都会成为进化的死胡同。
提高效率的正确做法是将语言的语义与语言的实现相分离。
应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发。
拒绝平庸
对于应用程序来说,应该选择总体最强大、效率也在可接受范围内的编程语言,否则都不是正确的选择。
书呆子的复仇
一般来说,条件越苛刻的项目,强大的编程语言就越能发挥作用。
把软件运行在服务器端就可以没有顾忌地使用最先进的技术。
选择更强大的编程语言会减少所需要的开发人员数量。
衡量语言的编程能力的最简单方法可能就是看代码数量。
格林斯潘第十定律:任何C或Fortran程序复杂到一定程度后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。
梦寐以求的编程语言
简介性的最重要的方面就是使得语言更加抽象。
简洁性是静态类型语言的力所不及之处
一种真正优秀的编程语言应该既整洁又混乱。整洁的意思是设计得很清楚,内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。混乱的意思是它允许黑客以自己的方式使用。
编程时代提供提高代码运行速度的关键是使用好的性能分析器,而不是用其他方法,比如精心选择一种静态类型的编程语言。
人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过来那么久你竟然还在那里。
将软件内部的接口设计成垂直接口而不是水平接口。
设计与研究
最终来说,设计和研究都通向同一个地方,只是前进的路线不同罢了。
低估用户一般来说总是会让设计师出错。
编程语言也是以人为本。
评价一种语言的优劣不能简单地看最后的程序是否表达得漂亮,而要看程序从无到有的那条完成路径是否很漂亮。
为了做出优秀的设计,必须贴近用户,始终寸步不离,永远站在用户的角度调整自己的构想。
原型并不只是模型,不等于将来一定要另起炉灶,完全可以能够在原型的基础上直接做出最后的成品。
先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。