KenThompson.md 9.4 KB
Newer Older
SoftwareTeacher's avatar
SoftwareTeacher 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
## 开源软件开发导论 - 资料

### 黑客文化和黑客的介绍
我们提到了黑客(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 程序,这样就能往磁盘上读写大量数据。 

到这儿,离实现一个简单的操作系统只差三个模块了:
SoftwareTeacher's avatar
SoftwareTeacher 已提交
47 48 49 50

- 一个是用来创建代码的编辑器
- 一个是把代码编译为 PDP-7 汇编语言的汇编器
- 还有一个能运行命令的环境,用行话叫 “操作系统的外壳” (Shell)
SoftwareTeacher's avatar
SoftwareTeacher 已提交
51 52 53

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

SoftwareTeacher's avatar
SoftwareTeacher 已提交
54
三个模块完成后,一个小型的操作系统就做出来了,这就是 Unix 的最初版本。他们最初起 Unix这个名字,也是对 Multics 的一个玩笑,因为 Multi- 是多的意思, Uni-(Unix)是单独的意思。 
SoftwareTeacher's avatar
SoftwareTeacher 已提交
55 56 57

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

SoftwareTeacher's avatar
SoftwareTeacher 已提交
58
后来,随着 Unix 的兴旺发展,Unix 社区的成员都有一些共性,比如大家都是都是用命令行,各种参数都记得,喜欢用各种工具的组合等等。在使用这个系统的过程中,大家的共性,就被总结成了一个成文的 Unix 设计哲学。 
SoftwareTeacher's avatar
SoftwareTeacher 已提交
59 60 61 62 63 64 65 66 67 68

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

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

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

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

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

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

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

SoftwareTeacher's avatar
SoftwareTeacher 已提交
94 95
### 总结
你从 Ken Thompson 的故事中获得了什么呢? 
SoftwareTeacher's avatar
SoftwareTeacher 已提交
96
专注,心流,做自己想做的事情,Playful cleverness? 
SoftwareTeacher's avatar
SoftwareTeacher 已提交
97 98 99 100 101 102 103


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