## 开源软件开发导论 - 资料 ### 黑客文化和黑客的介绍 我们提到了黑客(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? ### 注解 这篇文章作者:邹欣 曾发表于 《湛庐书单课:给技术人的职场突围课》