## 开源软件开发导论 - 资料

### 黑客文化和黑客的介绍
我们提到了黑客（hacker）文化兴起： 黑客的精神是：分享所有信息，鼓励探索，不喜欢权威和秘密，理性分析。Playful cleverness。

先来说说Ken Thompson，他被叫做Unix之父，从Unix 操作系统诞生的过程中，我们既能看见许多开发项目常见的弊病，同时也能看到，很多后来看起来伟大的创新，它的起步其实是很卑微弱小的，但是持续的热情、持续改进和由此获得的洞察力，能解决很多别人看起来巨大的问题。

在讲Ken的故事之前呢，我想先来问你一个问题：如果你是一个不错的程序员，也写过一些不错的程序，现在上级给你一个任务，让你带领团队开发一个操作系统，要求是这样的，第一希望它是业界领先的，第二希望它的预计生命周期在五十年以上，第三预期有上亿的各种设备会使用这个操作系统，第四还希望你顺便设计出一个计算机语言，适用范围甚至比这个操作系统还要广。

面对这样一个任务，你会怎么办？ 

很多人会说：我会先收集需求，考察目前的各种先进操作系统，然后好好组织专家，进行多轮讨论，逐步细化设计，等等。

哦对了，因为我还要同时设计出一个计算机语言来，所以还需要同时组织另外的一批专家，进行另外的一套调研、讨论和设计......

麻省理工学院，在上个世纪六十年代，就接下了类似这样的的工作，他们当时已经有一个早期的操作系统，但现在要做一个更好的。他们把这个系统叫做 Multics ，也就是Multiplexed Information and Computing Service的简称，翻译过来就是多路复用信息和计算服务。  

但是Multics 这个项目，最后陷入了一个典型的“第二版本综合征”。

什么意思呢？就是你开发软件，做了第一版，大家用了一下觉得，哎，挺有新意的啊，不错！但同时，又觉得还有很多可以改进的地方。 

你的团队受到了鼓舞，觉得应该在第二版里面，把在第一版没有实现的各种设计都做到完美，同时又要解决现在大家在业务上碰到的问题，满足所有人的期望，还要为将来出现的问题做准备。 

当年，麻省理工学院主导设计Multics 这个系统时，请了两家著名公司来帮忙，一家是GE（美国通用电气公司），负责设计全新硬件，另一家是贝尔实验室，负责操作系统设计。

这三家在全球科技界都是声名显赫，而且牛人云集，但它们分布在美国的三个地方，当时的通讯又没有现在这么发达，所以想要要合作打造一个全新的计算机+操作系统，难度可想而知。当时参加项目的一个工程师说，这个项目就像是在“同时爬好多颗树”，或者像我们谚语说的，是“鹰搏二兔”。 

Ken 当时也参加了这个项目，但是正如 Ken 自己的评价，这个项目最后虽然勉强完成了，但“过度设计，过度建造，什么都过度。结果近乎不可用。” 

设计之前想得太多，导致这个项目最后太过复杂，项目投入很大，又让它最后太贵，而两者加在一起，最后导致用户很少。 

Ken 作为这个项目的参与者，最后却说：“它搞出来的东西我自己都不想用”。 

其实这个项目立项的初衷本来很好，有强大的技术支持，研发的资金也有保障，但为什么所有这些有利的条件加在一起，仍然做不出一个好产品呢？

对所有开发人员来说，这都是一个值得思考的问题。我觉得我们想要做出一个好的项目，有一个基本的前提，就是你在做之前，自己先想一想，我们开发的是面向消费者的产品，那如果你现在不是开发者，而是一个消费者，这样的产品，你自己会用么？

这次不太成功的尝试之后，贝尔实验室退出了Multics 项目。这时Ken 还是想写一个好的操作系统，只是管理层被这次失败伤透了心，不想给任何预算了。

换成一般人，缺乏外部条件，领导不支持，可能就此就放弃了。但Ken 没有，他找到了一台已经有些过时闲置的 DEC PDP-7 计算机。你可能想象不到，这台计算机只有 16KB 的内存，16KB是个什么概念，只是现在主流台式机电脑内存的一百万分之一。

Ken觉得，既然领导不给预算，那就将就着先用这个吧。 他先是为这个电脑写了一个太空旅行游戏，让用户可以漫游太阳系，探访各个行星。然后，又写了一个磁盘调度算法来控制这个电脑的古怪的磁盘驱动器。

下一步，怎么来测试这个算法呢？ 需要写一个磁盘 I/O 程序，这样就能往磁盘上读写大量数据。 

到这儿，离实现一个简单的操作系统只差三个模块了：

- 一个是用来创建代码的编辑器
- 一个是把代码编译为 PDP-7 汇编语言的汇编器
- 还有一个能运行命令的环境，用行话叫 “操作系统的外壳” （Shell）

这个时候，Ken的妻子正好带着一岁大的孩子离开了三星期，他就利用这三周的时间，把上面提到的三个模块都写出来了。 

三个模块完成后，一个小型的操作系统就做出来了，这就是 Unix 的最初版本。他们最初起 Unix这个名字，也是对 Multics 的一个玩笑，因为 Multi- 是多的意思， Uni-（Unix）是单独的意思。 

对了，除了这个操作系统，Ken也确实发明了一个 B 语言，这个语言后来演化为 C 语言， 成为现代 IT 产业应用最广泛的语言之一，也是后来很多语言发展的源头。

后来，随着 Unix 的兴旺发展，Unix 社区的成员都有一些共性，比如大家都是都是用命令行，各种参数都记得，喜欢用各种工具的组合等等。在使用这个系统的过程中，大家的共性，就被总结成了一个成文的 Unix 设计哲学。 

例如：简单就是美。这一点，你比较一下 COBOL 和 C 语言的 Hello World 的程序，就能发现不同。 

Unix 的另一个设计哲学就是：只做一件事，把它做好。

这个特点，在Ken 身上体现得十分明显。

Ken曾经说过自己对于计算机为什么这么熟悉，他说自己从小喜欢鼓捣电器，去加州大学伯克利分校读电子工程的时候，因为他已经玩了 10 年的电器，所以很轻松地学完了电子学的课程。
后来，他迷上了电脑（大型机）。就经常在午夜时分进到学校的机房，一待就是一晚上。他非常享受这样的过程，因为在第二天早上 8 点之前，这就一直是他一个人的计算机。那时的他很快乐，他自己说 “我毫无雄心壮志，是一个没有目标的工作狂”。 我认为，把计算机玩的精通，这个也是非常了不起的雄心壮志。 

### 心流时刻
大家一定都听说过“心流”的概念。当我们进入心流时刻，就可以全身心投入工作而忘记了时间的流逝，在这种状态下，人会有一种幸福感，工作的开展就像水流一样自然。
 
并不是所有工作都需要进入心流的状态才能变得高产，但对于设计，开发，写作这样的创造性劳动，心流是必须的。 它的首要的条件就是“不被打扰”。一旦被打扰后，我们需要一个缓慢的过程来再次进入心流，也许今天就再也回不到这样的高效率状态了。 
 
这个心流时刻，未必就是在家上班，在新冠疫情开始之后的两年多来，很多公司尝试着让员工在家上班，但是有员工反映，在家上班效率很低，为什么低呢？一个重要原因是：有家人，特别是小孩打扰。小孩可不管你在上班，他就是要找你。
 
同样的，如果你作为领导，让员工来上班，但是又不断随意打扰他们，不就是和小孩一样了么？这些像小孩子一样的领导，没注意到  ‘大人’ 正在写代码呢，什么小事都要直接问，而且非得马上要结果。
 
注意我们在上面的话中，有意无意把领导和小孩等同起来，因为他们幼稚地认为，跟你讲几句话，有什么大不了的，而且我的需求那么紧急！这种幼稚的打扰对于工程师的劳动生产率是一个巨大的折磨。 
 
有一个公式可以定义员工上班的效率： E = 不被打断的小时数 / 全部工作的小时数
 
例如，你上班 8 小时，如果你不被打断的小时数量只有 1 个小时，那么， 你的 E 值只有 1/8 = 0.125 
 
我们前面讲 Ken Thompson 用三周完成 Unix 雏形的工作的时候，是这么描述他的工作状态的：

“每27-28小时才睡一次，每次睡 6 个小时，每次睡到自然醒。工作状态非常好，比被孩子哭闹吵醒要强多了”
 
这么看来，Ken的E等于多少呢？ 应该是 100% 吧？注意到，他是在家里写程序，没有上班，开组会，也没有被产品经理叫过去询问怎么填一个PPT 的某个数字，或者被同事打扰，等等。 
 
那如果他的小孩也在家里，你觉得他的 E 会是多少呢？ 同样，在大学里，你的学习效率是多少？ 

E = 不被打断的小时数 / 全部学习的小时数

### 总结
你从 Ken Thompson 的故事中获得了什么呢？ 
专注，心流，做自己想做的事情，Playful cleverness？ 


### 注解
这篇文章作者：邹欣
曾发表于 《湛庐书单课：给技术人的职场突围课》


