# 《黑客与画家》读书笔记

> 最近在看《黑客与画家》这一本书，主要介绍黑客即优秀程序员的爱好和动机，讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题，本文用于记录读书过程中的一些笔记和思考。

- 发布日期: 2018-07-08
- Author: Tw93
- HTML: https://tw93.fun/2018-07-08/hacker.html
- English translation: https://tw93.fun/en/2018-07-08/hacker.md
- 全部文章: https://tw93.fun/posts.md

---

<img src="https://gw.alipayobjects.com/zos/rmsportal/CGfCazNqMVyiXccOVnJY.jpg" width="900"/>

## 起

最近在看《黑客与画家》这一本书，主要介绍黑客即优秀程序员的爱好和动机，讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题，本文用于记录读书过程中的一些笔记和思考。

## 1.为什么书呆子不受欢迎

### 为什么呢?

因为书呆子真的不想让自己受欢迎，他们脑子里面想着别的事情，注意力放在了读书或者观察世界上面，让自己变得更聪明，而不是琢磨打扮社交让自己变成受欢迎。

### 有趣观点

- **任何一种艺术，不管是否重要，如果你想要在该领域出类拔萃，就必须全身心投入。**
- 对于那些高度困难的领域，只有身处其中的人，才能意识到成功需要不间断（虽然未必是自觉的）付出.

### 不是很认同的地方

> 几乎每一个和我讨论过的人都同意，人生的最糟糕时期是在11岁到14岁。”

这里我不是很认同，应该是作者那个时间段受够了被那些受欢迎小孩欺负形成的阴影，同时和他交流的那些人刚好也是那种不收欢迎的“书呆子”

> 至于学校，不过是这个虚假环境中关住牲口的围栏。表面上，学校的使命是教育儿童。事实上，学校的真正目的是把儿童都关在同一个地方，以便大人们白天可以腾出手来把事情做完。

看到这句话，可见作者青春期过得真的有阴影了，也不是很认同，以后自己有儿女了，需要好好引导；

不过在整本书中，大部分观点还是很认同作者的。

## 2.黑客与画家

没有看此书之前，一直很不想自诩自己为码农，感觉像没有思考重复劳动者，更多的是想做一个手艺人，通过代码这个工具来一些有趣的东西，顺便可以赚钱，两全其美。

### 关系

作者说“黑客和画家最相像”，很认同，**黑客与画家的共同之处，在于他们都是创作者。与作曲家、建筑师、作家一样，黑客和画家都是试图创作出优秀的作品。他们本质上都不是在做研究，虽然在创作过程中，他们可能会发现一些新技术。**

黑客真正想做的是设计优美的软件，考核这种工作是非常困难的。你本人需要有良好的设计感，才能去考核别人的设计是否良好。但是，你觉得你有“良好的设计感”，与你实际是否具有，不存在相关关系，甚至可能存在负相关。

接着举了一个大学上机的例子，学校教的是先在先在纸上把程序搞清楚，然后再敲出来，这与作家、画家和建筑师的做法完全一样，他的方式是一股脑不管对错，先把代码堆上去，再慢慢修改，看上去像编程就是在调试。

### 有趣的点

- 大公司为了避免设计上的灾难，选择了减少设计结果的标准差。但是当你排斥差异的时候，你不仅将失败的可能性排除在外，也将获得高利润的可能性排除在外，这也是创业公司可以成功的原因之一
- 黑客解决生计问题的方法是找一份“白天工作”，然后在其余时间开发优美的软件
- **黑客通过实践学习编程，创作者另一个学习的途径是通过范例，可以通过观看优秀的源代码学会编程**
- 对于编程，这实际上意味着你可以把bug留到以后解决。消灭bug对我来说属于轻松的工作，只有在这个时候，编程才变得直接和机械，接近社会大众想象中的编程的样子

### 思考

> 普通黑客与优秀黑客的所有区别之中，会不会“换位思考”可能是最重要的单个因素。

此处的换位思考是指设身处地为用户考虑，如何评定一个人是否具备呢？**就是看他怎样向没有技术背景的人解释技术问题**，越来越觉得，如何向不是很懂某种技术的人将你懂的东西让他也可以很轻易的理解，很考验人的能力。

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

非常赞同这一句话，程序写出来是为了让人看懂它的算法，附带告诉计算机如何执行。”一种好的编程语言应该比英语更容易解释软件。只有在那些不太成熟、容易出现问题的地方，你才应该加上注释，提醒读者注意那里，就好像公路上只有在急转弯处才会出现警示标志一样。

不少人以为写出很体现技术的代码是高水平、高能力的体验，其实不然，用简单的代码解决复杂的问题，同时实习生都能够轻易看懂的代码才是好代码。

## 3.不能说的话

作者比较谨慎，认为无论什么年代，“祸从口出”是一直存在的，告诫读者一定要小心自己说的话。自以为无害的言论会给你惹来大麻烦。

### 你是一个随大流的人吗？

假如在大庭广众下，你有没有观点什么观点不愿说出口？如果没有，应该好好想一想了，有一可能**你的观点就是从别人那里听来的，别人告诉你什么，你就相信了什么，你把别人灌输的观点当作了自己的观点。**

为了防止他人复制，古代制作地图的工匠会故意在地图上画错一个小地方。如果你的地图与他的地图一样，就说明不太可能是你自己独立制作的。

我们的思想几乎肯定也是一张有错误的地图。如果你也犯下与别人一样的错误，那么这个错误不太可能完全来自于你自己

### 找出“不能说的话”的方法

- **判断言论的真伪**：当话不能说出口，同时他们是正确的或者可能正确，值得进一步讨论
- **关注“异端邪说”**：有些想法，纯粹因为非常特别，而不能说出口的那种，极富争议的言论称为“异端邪说“”
- **回顾过去**。我们可以去找那些过去被认为理所当然，如今却被认为不可思议的事情
- **寻找那些一本正经的卫道者，看看他们到底在捍卫着什么。**
- **观察禁忌是如何产生的**

### 为什么要这样做?

- 纯粹的好奇心，与小孩子翻石头是出于同样的原因，要亲眼看一下，然后自己做决定
- 不喜欢犯错，希望自己能够知道是哪些事情，这样可以使我不会上当
- 很好的脑力训练。想要做出优秀作品，你需要一个什么问题都能思考的大脑

### 发现后怎么办

- 别说，至少也要挑选合适的场合再说，只打那些值得打的仗。
- 在思想和言论之间划一条明确的界线。在心里无所不想，但是不一定要说出来
- 守口如瓶，笑脸相迎，虽无法享受讨论带来的好处，但可找一些信得过的知己，只与他们畅所欲言

### 有趣的点

- 凡是不认同社会之处，你连想都不敢想，马上就放弃自己的观点，那才会真正出问题。
- **优秀作品往往来自于其他人忽视的想法，而最被忽视的想法就是那些被禁止的思想观点。**
- 智力越高的人，越愿意去思考那些惊世骇俗的思想观点。这不仅仅因为聪明人本身很积极地寻找传统观念的漏洞，还因为传统观念对他们的束缚力很小，很容易摆脱

### 思考

> 训练自己去想那些不能想的事情，你获得的好处会超过所得到的想法本身。

但是一般都是喜欢先做自己喜欢的事情，对于不想做的事情能拖就拖着，殊不知一直在原地思维圈子，跳不出去，毫无无创新。

> 如果你想要清晰地思考，就必须远离人群。但是走得越远，你的处境就会越困难，受到的阻力也会越大，因为你没有迎合社会习俗，而是一步步地与它背道而驰。

也就是做自己，follow your heart，不要随波逐流。

## 4.良好的坏习惯

对于程序员来说，“黑客”这个词的字面意思主要就是“精通”，也就是他可以随心所欲地支配计算机。“黑”（hack）也有一种意思是赞美，如果你解决问题的方式非常聪明高超，将整个系统操纵在股掌之间，这也叫做你很“hack”。

之后作者讲了一个想学习开锁的例子，原因并不是想着去破解做坏事，而是为了满足好奇心，或者磨练自己的智力。

这里所说的良好的坏习惯，我理解应该是一种对新事物保持好奇心，爱自由，不爱管束的心态。

### 有趣的点

- 只有深入了解当前的技术，黑客才能构想下一代技术。
- 在计算机工业的历史上，新技术往往是由外部人员开发的，而且所占的比例可能要高于内部人员。
- 对于适当的不服从管教，保持宽容不会有太大的坏处，反而很有利于美国的国家优势，它使得美国不仅能吸引聪明人，还能吸引那些很自负的人。

## 5.另一条路

作者当时创业时候，本来打算写一个传统的桌面软件，但是想到可以让软件在服务器上运行，浏览器作为操作界面。我们试着重写，让所有操作都通过网络完成。

他将事情看得很透彻，想到对于用户来说其实很多东西不需要关注，对于乱七八糟、经常变动的东西，都放在服务器端，由精通此道的专业人员维护，不需要用户自己当“系统管理员”。这种方式更容易、更便宜、更机动、更可靠，通常也比桌面软件更强大。

### 用户的胜利

95年的思路，death before inconvenience（太麻烦、不如死）

互联网的操作应该是不受地域限制，在任何地方都可以使用，其实也即网页比安装在计算机上面的桌面软件更方便使用。

你的电脑”这个概念正慢慢成为过去时，取而代之的是“你的数据”。你应该可以从任何电脑上获取你的数据。或者更准确地说，在任何终端设备上获取你的数据，终端设备不一定是电脑。

互联网的软件对于用户的好处有：无需安装、发布迅速、平滑升级、bug修复迅速、可以同时多人使用，数据更加安全等到优点。

### 有趣的点

- 对于**互联网软件，没人规定只能使用某些语言开发**，因为所有的硬件都控制在你手里，你想要用什么语言，就能用什么语言。不同的语言适合不同的任务，你应该根据不同场合，挑选最合适的工具，尤其是在竞争者存在的情况下，“可以这样做”就变成了“必须这样做”，因为如果你不利用语言的优势，那就会听任对手超过你。
- “随着软件规模的增大，开发成本指数式上升。这可能是因为修正旧bug的原因。如果bug都能被快速发现，成本的上升形态就能基本保持线性。”
- 只要有可能，商业性公司就会采用一种叫做“价格歧视”（price discrimination）的定价方法，也就是针对不同的客户给出不同的报价，使得利润最大化
- 管理企业其实很简单，只要记住两点就可以了：**做出用户喜欢的产品，保证开支小于收入**。

### 思考

> 应该让用户像订报纸那样按照使用时间长短订购软件的使用权。

想起有些mac、iphone 上面软件的订阅方式，之前一直不理解，其实这样是对应开发者/用户来说都是好的，开发者这边可以持续的升级，为用户带来更好的体验。

对于软件开发者来说，这样是一种理想的收入来源，每个季度有一个持续的现金流，同时可以更好的管理购买软件的人（不付钱，后面就用不了了....）

对于购买者来讲，我喜欢，下次我就可以不订阅了，也是比较方便的。

> 许多农场用电篱笆防止奶牛逃跑，但是不少电篱笆其实并没有通电。不过奶牛们已经吃过苦头，显然学会了不去碰电篱笆，这时不通电也能起到效果。“奶牛们，行动吧！”他写道，“趁着统治者打鼾时，夺回你们的自由！”

也就是说，为什么不尝试一下呢？作者讲到创业，但大部分黑客会有两件事让他们望而却步，不敢真正开始采取行动。一件是不懂得管理企业，另一件是害怕竞争。可是实际上，这两件事都是没有通电的电篱笆。 其实可以试试的。

## 6.如何创造财富

**作者认为最好的办法就是创业，或者是加入创业公司。**

### 为什么呢？

创业其实是一个压缩过程，你的所有工作年限被压缩成了短短几年，在高科技领域，回报尤其丰厚，工作效率越高，额外报酬就越高。

其次创业工作时候上班时候是在公司时间的2倍，加上全神贯注，产出提高3倍，将中间管理层出去，效率再提升2倍，同时不需要完成强行上级指派的任务，尽可能根据自己愿望，发挥聪明才智，效率再提升3倍，也就是工作效率是在公司的36倍，也即之前是8万美元一年，现在可以成为300万美元一年了。（当然前提是黑客.....）

### 运气的成分

任何公司的成功历程中，运气都是一个很大的随机因素。那些你在报纸上读到的成功人士固然很聪明，很努力，但是他们的运气也不坏。

这里举了一个比尔盖茨的例子，IBM 和 微软关于DOS操作系统的授权协议，是IBM 犯下的一个错误，IBM尽全力帮助微软控制了个人电脑的标准。从那时起，微软只要不停地做出产品就可以了，它从来不用做出有商业风险的决策。微软只要抱着授权协议不放，快速地复制新产品就行了。

致富的方式有很多种（投机、婚姻、继承、偷窃、敲诈、诈骗、垄断、行贿、游说、造假、开矿等），当时上述大概都是不劳而获或者不合法的那种，这里主要讲的是**通过创造有价值的东西在市场上得到回报，从而致富**，这种既合法还简单。

### 金钱不等于财富

创造有价值的东西就是创造财富，之前自己也一直认为有钱就是有财富，其实不是，我们需要的东西就是财富，食品、服装、住房、汽车、生活用品、外出旅行等都是财富。即使你没有钱，你也能拥有财富。、

比如说你身处南极洲内陆，再多的钱对你也是无用的，因为没有东西可买，你真正需要的是财富。

那为什么大家都把挣钱挂在嘴边呢？部分原因是，金钱是财富的一种简便的表达方式：金钱有点像流动的财富，两者往往可以互相转化，但不是财富，而只是我们用来转移财富所有权的东西。

### 手工艺人

最可能明白财富能被创造出来的人就是那些善于制作东西的人，也就是手工艺人。他们做出来的东西直接放在商店里卖，但是，随着工业化时代的来临，手工艺人越来越少。**目前还存在的最大的手工艺人群体就是程序员。**

### 工作是什么

工作就是在一个组织中，与许多人共同合作，做出某种人们需要的东西。

### 更努力地工作

大公司会使得每个员工的贡献平均化，这是一个问题。我觉得，大公司最大的困扰就是无法准确测量每个员工的贡献。

但是，现实是你在工作上投入的精力越多，就越能产生规模效应。在某些行业，那些真正拼命工作的员工能够创造出比普通员工多十倍甚至百倍的财富。

此处也指明了大公司的一个弊端，你的工作无法被量化，贡献难以被测量，导致很多想更努力地工作，但是与其他许多人的工作混杂在一起，这样就产生了问题，公司里其他人会拖累你。

### 可测量性和可放大性

致富，你需要两样东西：**可测量性和可放大性**。你的职位产生的业绩，应该是可测量的，否则你做得再多，也不会得到更多的报酬。此外，你还必须有可放大性，也就是说你做出的决定能够产生巨大的效应。

但是，如果你想同时具备可测量性和可放大性，不一定非当上CEO或电影明星不可。你只需要成为某个攻克难题的小团体的一部分就可以了

小团体=可测量性、高科技=可放大性

一个非常能干而且在乎回报的人，通常在同类人组成的小团队中会有更出色的表现，自己也会感到更满意。

同时多数因为创造财富而发财的人都是通过开发新技术而实现的。

### 创业的潜规则

- 很多事情由不得你，真正创业以后，你的竞争对手决定了你到底要有多辛苦，而他们做出的决定都是一样的：你能吃多少苦，我们就能吃多少苦。
- 创业的付出与回报虽然总体上是成比例的，但是在个体上是不成比例的。

### 有趣的点

- 创业公司其实就是解决了某个技术难题的小公司。
- 如果你想赚100万美元，就不得不忍受相当于100万美元的痛苦。
- **创造人们需要的东西，也就是创造财富。**
- 大学生活很有趣，可是已经过去了，上班的日子为什么会差别这么大？不要搞糊涂了，你现在已经从顾客变成了仆人。

### 思考

> 什么是技术？技术就是某种手段，就是我们做事的方式。如果你发现了一种做事的新方式，它的经济价值就取决于有多少人使用这种新方式。

很有道理的一句话，很多时候，做技术人会有一个误区，自己觉得很厉害，但是东西根本没有人去使用，这其实也是不好的，它的价值取决于有多人在使用，同时可解决问题。

> 假定你是一个手脚敏捷的小男孩，身后有一条壮硕的大狗正在追你。你跑到楼梯口，这时应该上楼还是下楼？我觉得应该上楼。如果下楼的话，大狗可能跑得跟你一样快。上楼的话，大狗的庞大身躯就将成为劣势。不错，跑上楼你会比较吃力，但是大狗会感到更吃力。

在生活工作中也应该这样，应该**故意去选择那些很困难的技术问题**，不是因为这个功能能带来更多的收入，而是因为它比较难，也即**进入壁垒（bairiers to entry）**。其实做技术也应该这样，这样才有意思。

总的来说，这也是很好的处事原则。如果你有两个选择，就选较难的那个。如果你要选择是坐在家里看电视，还是外出跑步，那就出去跑步吧。这个方法有效的原因可能是遇到两个一难一易的选择时，往往出于懒惰的缘故，你会选择较易的那个选项。在意识深处，**你其实知道不懒惰的做法会带来更好的结果，这个方法只是迫使你接受这一点。**

## 7.关注贫富分化

当人们非常想把某件事做好的时候，有些人会做得比其他人好得多。

我们说一些工作报酬过高，另一些工作报酬过低，我们的真实想法到底是什么？在自由竞争的市场经济中，价格由买家的需求决定。如果人们喜欢棒球甚于喜欢诗歌，那么棒球运动员的收入就是要比诗人的收入高。如果说某种工作的报酬过低，那就相当于说人们的需求不正确。当然，人们确实会需求不正确的东西。

### 有趣的点

- 一个人的工作具有多少价值不是由政府决定的，而是由市场决定的。
- 技术对生产效率的提高不是线性的，而可能是多项式形态（polynomial）的。
- 技术无法使其变得更便宜的唯一东西，就是品牌。

## 8.防止垃圾邮件的一种方法

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

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

## 9.设计者的品味

这里讨论的是“如何做出优美的产品”，优秀设计的原则是许多学科的共同原则，一再反复地出现。

### 众多学科对美的理解

- 好设计是简单的设计
- 好设计是永不过时的设计。
- 好设计是解决主要问题的设计。
- 好设计是启发性的设计。
- 好设计通常是有点趣味性的设计。
- 好设计是艰苦的设计。
- 好设计是看似容易的设计。
- 好设计是对称的设计。
- 好设计是模仿大自然的设计。
- 好设计是一种再设计。
- 好设计是能够复制的设计。
- 好设计常常是奇特的设计。
- 好设计是成批出现的。
- 好设计常常是大胆的设计。

### 有趣的点

- 哥白尼不认同托勒密的体系，一个极其重要的原因是，他觉得托勒密提出的偏心等距点（equant）毫无美感……
- 优秀作品的秘块就是：非常严格的品味，再加上实现这种品味的能力。

## 10.编程语言解析

计算机和其他机器一样，有一张操作命令清单，命令的总和就是计算机的机器语言（machine language）。

### 机器语言

计算机刚发明的时候，所有程序就是一条条机器语言的命令。没过多久，程序就改成使用汇编语言了，它要比机器语言写起来稍微方便一点。命令清单还是一样的，就是每个命令换了一个更人性化的名字。
两者共同特点是：只能让大多数计算机做一些很简单的事情。

### 高级语言

简便方式书写的程序所使用的语言就叫做高级语言，让你能够使用更强大的命令开发程序。
除了可以将代码写得更加简短，还有一个优点，就是可移植性。

实现高级语言可以用**编译器**或者**解释器**，区别是前者先将整个程序全部翻译成机器语言，然后再运行。后者是实时地将代码解释为相应的机器语言，然后一行行运行。

编译器处理的高级语言代码又叫做源码。它经过翻译以后产生的机器码就叫做目标码。

### 有趣的点

- 一个操作所需的代码越多，就越难避免bug，也越难发现它们。
- **如果你长期使用某种语言，你就会慢慢按照这种语言的思维模式进行思考。**所以，后来当你遇到其他任何一种有重大差异的语言，即使那种语言本身并没有任何不对的地方，你也会觉得它极其难用。缺乏经验的程序员对于各种语言优缺点的判断经常被这种心态误导。

#### 思考

>车顶上绑着飞机发动机的小车也许真能开，只要你不尝试拐弯，可能就不会出问题

这里讲的后面出现的新的“头重脚轻”的编程语言，它们的内核设计得并非很好，但是却有着无数强大的函数库，可以用来解决特定的问题。可以想象一辆本身性能很差的小汽车，车顶却绑着一个飞机发动机。

有一些很琐碎、很普遍的问题，程序员本来要花大量时间来解决，但是有了这些函数库以后，解决起来就变得很容易，所以这些库本身可能比核心的语言还要重要。

也就更好解释了黑客们为什么不喜欢用C这种语言了。

## 11.百年后的编程语言

编程语言就像生物物种一样，存在一个进化的脉络，许许多多分支最终都会成为进化的死胡同。
也即不同分支的语言会发生聚合，因为语言的设计者们总是有意识地借鉴其他语言的设计思想。

作者认为，那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净，它的生命力就越顽强。

### 有趣的点

- 一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快，这会变得越来越明显。
- 一百年后的编程语言在理论上今天就能设计出来；如果今天真能设计出这样一种语言，很可能现在就适合编程，并且能够产生更好的结果。

## 12.拒绝平庸

哈哈，这一节，作者在推广 lisp 语言，想起之前看的SICP来了，有点高深，还需要再看一遍才能搞懂，他说真正非常严肃地把黑客作为人生目标的人，应该考虑学习Lisp：

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

### 有趣的点

- Lisp语言的好处不在于它有一些狂热爱好者才明白的优点，而只在于它是目前最强大的编程语言。它没有得到广泛使用的原因就是因为编程语言不仅仅是技术，也是一种习惯性思维，非常难于改变。当然，上面两句话都需要进一步解释。
- 合气道（Aikido）是一种日本的武术，主要特点是“以柔克刚”、“借劲使力”、“不主动攻击

## 13.书呆子的复仇

产品经理和程序员之间的“冲突问题”，一个是对技术一无所知；一个是对技术有强烈的个人观点。

讲着讲着，又说到了Lisp，为什么很特别呢？Lisp语言诞生的时候就包含了9种新思想。其中一些我们今天已经习以为常，另一些则刚刚在其他高级语言中出现，至今还有2种是Lisp独有的。

### 为什么Lisp语言很特别

- 条件结构（即if-then-else结构）
- 函数也是一种数据类型。在Lisp语言中，函数与整数或字符串一样，也属于数据类型的一种。它有自己的字面表示形式（literal representation），能够存储在变量中，也能当作参数传递。一种数据类型应该有的功能，它都有。
- 递归。Lisp是第一种支持递归函数的高级语言
- 变量的动态类型。在Lisp语言中，所有变量实际上都是指针，所指向的值有类型之分，而变量本身没有。复制变量就相当于复制指针，而不是复制它们指向的数据。
- 垃圾回收机制。
- 程序由表达式组成。Lisp程序是一些表达式树的集合，每个表达式都返回一个值。这与Fortran和大多数后来的语言都截然不同，它们的程序由表达式和语句组成。
- 符号类型。符号实际上是一种指针，指向存储在散列表中的字符串。所以，比较两个符号是否相等，只要看它们的指针是否一样就行了，不用逐个字符地比较。
- 代码使用符号和常量组成的树形表示法。
- 无论什么时候，整个语言都是可用的。Lisp并不真正区分读取期、编译期和运行期

### 有趣的点

- 任何C或Fortran程序复杂到一定程度之后，都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。

## 14.梦寐以求的编程语言

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

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

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

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

### 简洁

- 简洁性最重要的方面就是要使得语言更抽象。为了达到这一点，首先你设计的必须是高级语言，然后把它设计得越抽象越好。
- 不要觉得为用户着想就是让他们使用像英语一样又长又啰嗦的语法。
- 单个的语法单位也应该很简短。

### 可编程性（Hackability）

- 选择编程语言的时候，还有一个因素比简洁更重要，那就是这种语言必须能够帮助自己做到想做的事。

### 一次性程序

- 所谓一次性程序，就是指为了完成某些很简单的临时性任务而在很短时间内写出来的程序。
- 它必须很容易装备。一次性程序是你只想在一小时内写出来的程序，所以它不应该耗费很多时间安装和配置，最好已经安装在你的电脑上了。它必须是想用就用的。

### 函数库

- 函数库就是别人帮你写好的程序
- 优秀函数库的重要性将超过语言本身

### 效率

- 编程时提高代码运行速度的关键是使用好的性能分析器

### 时间

- 一种编程语言要想变得流行，最后一关就是要经受住时间的考验。没人想用一种会被淘汰的语言编程

### 再设计

- 只要能让“再设计”周而复始地进行下去，就都是可取的。

## 15.设计与研究

设计与研究的区别看来就在于，前者追求“好”（good），后者追求“新”（new）。优秀的设计不一定很“新”，但必须是“好”的；

### 有趣的点

- 为了做出优秀的设计，你必须贴近用户，始终寸步不离，永远站在用户的角度调整自己的构想。
- 先做出原型，再逐步加工做出成品，这种方式有利于鼓舞士气，因为它使得你随时都可以看到工作的成效。
- 任何时候，**代码都必须能够运行**。如果你正在写的代码一个小时之后就可以看到运行结果，这好比让你看到不远处就是唾手可得的奖励，你因此会受到激励和鼓舞。

## 结束

这本书看了好几个星期，终于看完整理出来了，很像大学时候做笔记那种感觉，同时也解决了我不少困惑，很推荐程序员有时间去阅读一下!
