编程珠玑番外篇-K. Plan 9 的故事(修订版)

Mar 21, 2011

Comments

(本文是对于之前编程珠玑番外篇系列中 Plan 9 的八卦这一篇的彻底修订,本文得到了博文视点的卢鸫翔编辑的很多帮助)
计算机发展史上,创新性产品层出不穷。其中,有些想法和产品在技术上很先进,却很遗憾的没有获得广泛的接纳和商业的成功。不过,只要时机到来,这些创新,往往都会以新的面目再次复兴。</p>

这样的例子在历史中屡见不鲜。Jobs 和 Apple 分手后开创的 NeXT 公司的操作系统和硬件设备,创新点很多,市场反响却不大。而 NeXT 系统在软件和硬件设计上的创新,以及工业设计的思想,最终成为了现在 iOS 系统、Mac 系统软硬件设计的基石。同样是 Apple, 当年出品的 Hypercard 软件,首创了超文本格式和交互式页面。虽然 HyperCard 的这些创新在当时并不显得太出众,最终被苹果终止开发。但到了 Internet 出现之后,Tim Berners-Lee 受到这种“超文本 (hypertext)”格式的启发,将这些思想平移到联网的计算机上,由此出现了万维网。Ward Cunningham 更是受这一张一张的“数字卡片”受到,发展出了世界上第一个 wiki 系统 WikiWikiWeb。所有的这些例子,都说明了一项当时未必得到大多数人认可的创新可能会在意想不到的地方凤凰重生。 本节我们介绍的 Plan 9 操作系统,也是这样的一个例子。

FTPFS 虚拟文件系统

大部分读者应该都用过 FTP 在两台机器之间传送文件。FTP 是一种简单成熟的传输协议。试想现在我们需要修改一个 FTP 服务器上的文件,我们无法直接用本机上的编辑器打开这个远程的文件编辑,而需要先下载这个文件,修改后再上传。这种编辑远程文件的方法显然比编辑本机的文件麻烦多了。 我们退后一步仔细想一下这个不方便,会发现,文件是同样的一个文件,只是因为文件不在本地,我们需要借助于 FTP 协议访问,所以我们就不能直接编辑它了(事实上有些功能强大的编辑器如 VIM 仍然可以编辑,但普通的编辑器则不能)。在一切都是文件的假设下,我们可以不加区别的访问软盘,硬盘和闪存盘上的文件,但这里,因为中间多了一个网络协议,这种“一切都是文件”的方便特性就消失了。 因为这个需求很常见,很多 FTP 客户端,如 Windows 下的 LeapFTP, Mac 下的 Cyberduck,都做了一个贴心的功能,在你想要编辑远程文件的时候,自动将其下载成一个临时文件,等你修改结束后又自动上传。但是这依赖于 FTP 客户端,并不是每个客户端都提供了这类支持。

FTPFS 就是针对上面提出的这种不方便而出现的一种技术。通过利用一个叫做 FUSE (Filesystem in Userspace) 的技术,FTPFS 允许用户将远程的 FTP 文件系统挂载到本地的文件系统上,使得用户可以像操作本地文件一样操作远程文件1,包括查看,编辑,删除和重命名等等。而实际网络传输协议的细节,则对用户隐藏了。实际上,FUSE 技术可以用来实现很多“虚拟”的文件系统,而不仅限于将 FTP 文件系统挂载到本地文件系统上这一种。比如,使用 HTTP 协议的文件系统,SSH 服务器上的文件,Flicker 上的图片,维基百科上的文章,都可以通过 FUSE,抽象成一种虚拟的挂载在本地文件系统上的文件系统。这些虚拟的文件系统,隐藏了协议的细节,将各种不同类型的协议支持下的资源抽象成一个文件系统,也可以挂载到本地的文件系统上。

虚拟文件系统能把资源无差别的抽象成文件系统。这种做法消除了网络协议的不同造成的访问障碍,方便了用户对各种不同资源的访问。这种 “消除协议差异,一切资源都是文件”的思想,实际上来源于 Plan 9。毫不令人惊讶的是,在 Plan 9 中,干脆就没有 FTP 这个命令,所有对 FTP 的操作都是采用挂载 ftpfs 挂载文件系统的方式实现的。

一切都是文件(这次是真的)

上面我们提到了虚拟文件系统可以把资源无差别地抽象成一个文件系统,而这个思想是来源于 Plan 9 操作系统的。且慢,早在 UNIX Programming Environment 中, Brian W. Kernighan 就提出了 “UNIX 中,一切都是文件” 的设计哲学。事实上,UNIX 中的确很多对象是文件:进程是文件,设备是文件,命名管道也是文件。但是,也有很多不是文件,尤其是由其他非 Bell 实验室加入 UNIX 的组件。举例来说,计算机网络设备和服务不是文件(UNIX 的网络支持部分最先由 UC Berkerly 开发),图形界面中的对象也不是文件(UNIX 的图形界面支持最初由 MIT 的 X 工作组开发)。“一切都是文件” 这个口号因为 UNIX 的发展和新模块的加入而不再贴切。

UNIX 出现的时候,支持的设备都很简单,都可以抽象成文件交由内核统一管理,由内核提供 read/write 等系统调用访问设备。随着硬件的发展,一些新的硬件需要有超越系统调用范围的控制方式(例如我们可以控制光盘驱动器弹出托盘,而这个操作在传统磁盘驱动器上是不存在,也不能简单的抽象为 read/write 甚至 unmount 操作),或者为效率着想,需要用户空间程序直接和设备通信(如网卡,高速硬盘)。因为这些需求,和为未来扩展性考虑,Bell 实验室在 UNIX 第七版中,也不得不引入 ioctl 等具有无穷扩展性的系统调用机制,配合设备驱动程序,支持对设备的控制。这些做法,绕开了原先统一的 read/write 设备访问方式。也就是说,设备再也不能简单地抽象为文件了。

随着 UNIX 发展而失却的“一切都是文件”的纯粹哲学,正是 Plan 9 想要恢复的。在 Plan 9 中,通过实现一个叫做 9P 的文件协议,用户可以自由的把任何资源或服务抽象成本地的一个“虚拟的”文件或者目录,而对这些文件的操作,会通过 9P 协议,自动映射到对原来资源或者服务的操作。 这样,访问资源的各种细节就被隐藏了。在对付那些需要 ioctl 或者其他控制机制的设备或者应用程序时,Plan 9 提倡将程序的控制部分抽象成一个支持 read/write 的 ctl 文件,而非使用专门的 ioctl 系统调用。这样,其他程序就可以通过读写 ctl 文件与被控制的程序通信。从对资源和对控制的抽象不难看出来,Plan 9 把 UNIX 中“一切都是文件”的思想做了进一步的升华。在 Plan 9 里面,真的是一切都是文件了──设备是文件,窗口管理器是文件,Email 程序是文件(实际上所有程序都是文件),网络是文件(实际上所有服务包括 DNS 都是文件),等等。

Plan 9 的创新

要说 Plan 9 的特性,就不能不先介绍一下它的几个创造者。和 UNIX 一样, Plan 9也是从 Bell 实验室计算机科学研究中心开发的。其项目主要负责人是 Rob Pike (现在在 Google 工作,负责 Go 编程语言),当时在 Bell 实验室的很多人,包括 UNIX 的两位创始人,Ken Thompson 和 Dennis Ritchie ,以及 Brain Kernighan、Doug Mcllroy (UNIX 管道的提出者)都参与了这个项目的开发。从某种意义上来说,Plan 9 有点充当 UNIX 继承人的味道。事实上 Rob Pike 最初,也的确是想构建一个更加“现代的 UNIX”。除了坚持 UNIX 中已经成功了的“一切都是文件”,“KISS”等原则外,Plan 9 在原有 UNIX 的设计理念上做了新突破,其中最值得一提的,就是“分布式操作系统” 的理念。

Plan 9 这个分布式操作系统的出现和当时计算机发展的趋势是密不可分的。我们都知道, UNIX 是一种分时操作系统,用户分享机器资源。UNIX 操作系统则负责在各任务(或者说进程)之间调度。因此,UNIX 是一个中心化的操作系统。CPU、内存、IO 以及所有的任务的调度都是集中被 UNIX 管理的。上世纪 80 年代中期,更加便宜的微型计算机开始普及。这些微型计算机各自有着磁盘、CPU、内存和 IO 设备。Plan 9 的指导思想,就是把微机组织起来,方便的实现资源共享。

Plan 9 里,能共享的资源包括文件系统、图形界面、IO 设备、以及 CPU 和内存等计算资源。这些资源之间千差万别,我们固然可以针对每种资源设计一个协议,如文件分享用 NFS,图形界面用 X 协议,打印机用 CUPS 协议等等,不过这种做法在 Plan 9 的设计者看来是不够优雅的。他们采用的,是在上文我们已经提到过的“一切都是文件”的方法[cite:Plan 9, a distributed system]。我们可以用两个很有启发性的例子来说明。

例一、替换 CPU

假想一下我们有一台日常使用但性能不佳的笔记本,和一台不在本地但性能强劲的服务器。 我们当然能够使用远程计算机的强劲的 CPU 运行一些计算量特大的程序。这不是什么难事,因为几乎所有操作系统都支持登陆到远程的机器。然而,麻烦的是,如果在远程运行程序需要读写本地的文件,或者访问挂载在本地笔记本上的打印机,扬声器麦克风之类设备,我们除了在本地和远程之间把文件传来传去之外,并没有什么好方法。特别的,如果我们想借用另一台计算机上强劲的 CPU 做音频和视频解码,来播放一个放在本机光盘驱动器里的电影文件的话,我们是不可能指望远程计算机既能读本地的光驱,又能把音频投递到本机的扬声器上的。

Plan 9 中,有一个简单的 cpu 命令,能够让用户自然地使用一个其他机器上的 CPU 运行程序,且仍然能够访问本地的所有文件和设备。也就是说,我们可以用远程计算机上强劲的 CPU 做图像处理,媒体解码等任务,并且可以直接把声音播放到本地的扬声器。cpu 命令给人的感觉,是除了给机器换个了 cpu 外,其他一切都和原来一样。这个看似 “神奇” 的功能,其实在 Plan 9 里实现起来一点都不复杂: cpu 指令首先连接服务器上,然后将本地的所有资源和文件系统,包括窗口管理器,光盘驱动器,扬声器等设备(别忘了他们都是文件),一股脑儿挂载到服务器上,成为服务器上的资源。这样,在服务器上运行的程序,就可以“自然地”使用本地的键盘鼠标和显示器完成交互,还可以访问你本地的显示器扬声器等设备。

cpu 命令真的就是名副其实的换掉了本地计算机的 cpu (其实还有内存)而保留其他一切设备。Plan 9 的这个 cpu 命令,带有强烈的分布式操作系统的特征,而我们平时接触的操作系统都不是分布式操作系统,因此 cpu 这个命令至今在现代主流操作系统上没有完全等价物。

例二、进程间控制和通信

进程间通信可以提高使用计算机的效率(详细请参见 Page XX:开发人员为何应该使用 Mac OS X)。UNIX 下的管道就是一个经典的进程间通信的例子。在图形界面程序和集成化的程序出现后, 应用程序不断的把多种功能集成到一起,进程间通信反而变得相对困难了。比如说,即使有个给汉字加拼音的程序,除了来回复制粘贴,我们还是不能方便地从文字编辑程序中选取一段自动加上拼音。而 UNIX 下的编辑器可以借助管道很简单完成这样的操作。这个问题的本质困难,用操作系统的眼光来看,在于进程这个对象,没有在运行时暴露出应有的通信和控制接口。

Plan 9 的一切都是文件的思想从一个新的角度,解决了程序间的数据共享问题。Plan 9 倡导应用程序在运行时都把自己的内部状态抽象成一个文件系统。举例来说,一个邮件客户端程序不光支持图形界面下查看邮件,用户还能够直接通过

cat /mail/fs/inbox/1/subject
cat /mail/fs/inbox/1/body

来查看收件箱(inbox)中第一封邮件的主题和内容。这种设计,使得应用程序不再成为进程间通信的障碍,从而拷贝粘贴也变得没有必要。比如说,我们可以直接把草稿箱里邮件的内容通过管道送给其他拼写检查器。邮件客户端提供的拼写检查器再差也没关系了。这种把应用程序中的对象暴露出来的想法,和 Mac OS X 中的应用程序暴露一个Applescript 字典的设计思想异曲同工。

同样的道理,Plan 9 也从一切都是文件的思想出发,解决了了程序控制问题。 Plan 9 鼓励每个应用程序和设备在抽象成文件的时候,都暴露出一个抽象的 ctl 文件。这样,其他应用程序可以通过向 ctl 文件写命令的方式,运行时控制应用程序。举例来说,Plan 9 的窗口管理器 Rio,提供了 ctl 文件,我们可以通过读取和写入 ctl 文件,实现一些 Rio 本身不支持的如平铺所有窗口的操作。同样,通过对邮件程序的 ctl 操作,我们可以实现邮件的发送和接受的控制等等。Mac OS X 下的 Applescript 也可以完成类似的功能。遗憾的是,除了 Plan 9 和 Mac OS X,其他操作系统对这类进程间控制和通信的支持都不够完整。

实践者指南

上面介绍的 Plan 9 特性,可以说仅仅是冰山一角 Plan 9 里还有很多其他创新,如 Rio 窗口管理器简化了窗口管理,fossil 文件系统使增量备份毫不费力,/proc 文件系统方便对系统的控制和支持远程 debug 等等。我们可以在桌面通信的 DBus 标准,Mac OS X 的 Time Machine, Linux 的 /proc 文件系统里找到这些技术的影子。因为 Plan 9 从来就没有大众化,有不少创新不为外人所知。</p>

对 Plan 9 感兴趣,想要更多了解 Plan 9 的读者,可以到 http://plan9.bell-labs.com/plan9/ 下载 Live CD, 并在多台联网的机器或虚拟机中安装该系统。喜欢 Plan 9 里的一些命令,而不想折腾系统的读者,可以到 http://swtch.com/plan9port/ 下载可以在 Linux,Mac OS X 等主流操作系统上运行的 Plan 9 的移植程序。Rob Pike 的网站 cat-v.org 有最完整的 Plan 9 的资料,以及对 UNIX 设计哲学的反思。

Plan 9 中的很多思想,如/proc sysfs,还有 userspace 的虚拟文件系统,对 IPC 的重新处理如 DBus ,轻量级别的窗口管理器,UTF-8 等等,实际上都融入了 Linux 等现代操作系统。对于 Plan 9 这样含有众多优秀设计思想的操作系统,为什么最终没有流行开来,自然是很多人关心的。 ESR 曾经说,可能是因为当时 UNIX 已经足够好了。这样的解释很容易让人想起那句著名的 Worse is better。具体是什么原因呢,就交给各位读者思考了。

朦胧的七种类型

Mar 10, 2011

Comments

自小我就被唐诗宋词的美深深吸引,像“大江东去,浪淘尽,千古风流人物” 这样的意境,可以说只能体会,不能言传。加上语言功底不够,写不出来这样的句子,只能欣赏。好在我家书橱里面有《唐诗鉴赏词典》和《宋词鉴赏词典》这两本厚书,我囫囵吞枣读过。
我第一次读到了王国维的《人间词话》的时候惊为天人。王在人间词话中最打动我的一句话是“太白纯以气象胜。 ‘西风残照,汉家陵阙’ ,寥寥八字,遂关千古登临之口。” 虽然这句话是讲李白的词,实际上可以涵盖李白的诗。想“天生我材必有用,千金散尽还复来”的气象,也可以说遂关千古“败家子”之口了。
初中学了英语之后,我最先开始读的两本英文小说是《双城记》和《名利场》,但说实话那时候词汇量太少,时间都花在背单词而不是文学欣赏上。高中时候有个室友癖好翻译过来的名著,我也蹭着看书,读了老人与海,百年孤独,了不起的盖茨比等等。中文文学也读了一些,印象最深的是白鹿原,尘埃落定和平凡的世界。但说实话,除了尘埃落定和百年孤独外,我在翻译过来的书中,以及中文的小说中,找不到那种唐诗宋词中的“气象”了,这一度让我很困惑:唐诗宋词中的气象去哪儿了?为什么就看不到那种“大漠孤烟直,长河落日圆” 的普通但非常有意境的句子了呢?这种气象其实不限于自然景观,像“人间自是有情痴,此恨不关风与月” 这种普通的句子,具有深刻的感染里,我也没在其他地方看到过。
这个问题困惑了我很多年。有一次,在对着剧本看 Hamlet 的时候,听到 Hamlet 回答他杀兄篡位的叔叔说 “But now, my cousin Hamlet, and my son— ” 的时候,自言自语说:“A little more than kin and less than kind”,我立即被这句话的优美打动了。这句话太美了,不仅在形式上媲美唐诗宋词的韵律感,而且从王子嘴里说出来无比精当,构建了一个非常贴切的心理意境。我以前不怎么喜欢莎士比亚,因为这句话,我彻底向莎士比亚投降。再后来读莎士比亚的时候,我就留意看一些文学批评家的说法,因为此,一个偶然的机会,我碰到了一本叫做《朦胧的七种形式》的书。
这本书是英国文学评论家  William Empson (Empson 对中国文化也有研究,曾在西南联大教过书)的成名作。 他在书中破解的,是“诗文常常朦胧,为什么读者还能够获得共鸣?”这个谜题。这里,朦胧的含义是可招致歧义却不造成误读的文本。在这本书里,他将朦胧分为七种形式,分别解读了这七种形式的朦胧可以造成读者怎样的反应。他提到第一种,也是最重要的一种朦胧是暗喻(metaphor),像大江东去,一个去字,其实本来是人的行动,套在江上,前面加一个大字,就像大汉东去一样,气势就造出来了。Empson 的例子是陶潜的 “迈迈时运,穆穆良朝”。迈迈是大步行走,穆穆是端庄肃静,这两句话因为把描述人的词暗喻到时间上,就形成了“外界的时间飞快流逝,但美好的时光总是静悄悄”的意向。当然 Empson 对这句话的解读更加有爱因斯坦风趣解读相对论的意味,有兴趣的可以去读原书了。神奇的是,《代码大全》一开始对于 metaphor 的讲解,居然和 Empson 的观点有异曲同工之处:暗喻可以让读者自己去补充一些意向,且将补充后的更加丰满的意向牢牢记住。其他的几种朦胧包括二意合一(文字本身的歧义,如“此情可待成追忆,只是当时已惘然”,至今在断句上有争议),双关(春蚕到死丝方尽,蜡炬成灰泪始干)等等,还有大部分只有英文例子,我就不制造中文例子解释了。还是看原著更加好。七种朦胧让我对以前思考的唐诗宋词的意境美有了新的认识:唐诗宋词都应该是巧妙利用朦胧构建意向的范本。汉语言白话后,这样的意向就消失了。元曲瑰丽,但也不比唐宋时期的那种普遍气象了,到了四大名著,就完全是另一种风格了。
作为一个强调语言精确性的人,我不反对朦胧,以及在技术文章中采用隐喻。能够利用朦胧向读者传达意向的作者是伟大的作者,如尘埃落定的作者阿来。虽然语言意境要朦胧,实际上选词最需要讲究,才能表达出那种贴切的朦胧,传达精当的涵义。因为唐诗简练,因此选词更加讲究,可谓“吟安一个字,捻断数茎须”。当年选词,有说文等书为范本。汉语白话后,处于一种未安定的状态,特别是缺少良好的辞书规范和比较词的含义,因为炼字的本质就是词义辨析,而英语的中各种类型的字典数不胜数。这20年来,汉语新词和新句式都增加了很多,白话文要跟上语言发展的步伐才是。
以上说的所有的,都不是在贬低汉字或白话文。如果有人要这么理解,我也没办法。

完全用命令行工作 — 一年后的思考

Jan 24, 2011

Comments

一年前, 我在博客上陆续写了好几篇”完全用命令行工作“的文章. 这些文章介绍了一些我平时用的的基于命令行或纯键盘的工具和命令. 而之所以强调纯键盘(不用鼠标), 是因为我发现拔掉鼠标纯用键盘, 能大幅度的提高工作效率. 这也是我写这个系列的初衷.

其实, 命令行的, 或者支持键盘工作的程序层出不穷,如果做个有心人, 每周几乎都能发现新的甩掉鼠标提高效率的工具。比如说,这一年中我就发现了如 keynav 这样使用纯键盘和二分法定位屏幕的程序,更多的支持 vim 键位的各种浏览器, 编辑器插件. 所有的这些工具, 用起来都非常酷(事实上不用鼠标本身就很酷). 因此,单从好用的工具来讲,”完全用命令行工作” 这个系列每月都可以写一篇. 一年过去了, 随着我更多的使用纯键盘工作, 我发现, 其实和用什么工具没多大关系, 掌握了一个基本原则之后, 那些工具顺手就可以找到.

什么是我想说的基本原则呢? 时隔一年, 我觉得可以总结成一句话: 鼠标更加容易分散注意力, 且输入带宽没有键盘大.

为什么说鼠标分散注意力呢?  我在“拔掉你的鼠标” 这篇文章中有过说明: 鼠标在屏幕上不受我们注意力的边界约束, 很容易使我们的注意力分散到各种地方, 成为工作效率的敌人。如果用时间管理眼光来看, 鼠标甚至可以说是时间管理的敌人 — 鼠标可以让你随时用一个窗口跳到另一个窗口, 一个关注点跳到另一个关注点, 使得你的时间规划失去效果.  我发现拔掉鼠标之后,上网不会乱点,无聊的时候不会点着好友的头像开始聊天,或者没事整磁盘碎片等等。拔掉鼠标的目的, 是为了提升工作效率. 当然我也知道, 拔掉鼠标是属于治标不治本的一种办法, 好在大部分浪费时间的应用都依赖于鼠标, 拔掉鼠标后想浪费时间也无从下手了. 所以在短时间之内的确算是一个提高效率的有效方法.

当然, 真正会把握自己时间的人, 是不会像上面提到的那样因为鼠标而分散注意力的. 即便这样, 鼠标也不见得有键盘好用. 用理论上来说, 鼠标这个“信息通道” 的带宽太小了,相比较于键盘, 鼠标向计算机传输同样的信息可能要花费更多的时间. 一个最简单的例子就是快捷键. 键盘快捷键不光比用鼠标在多级菜单中点来点去快, 甚至也比移动鼠标单击一个图标快. 究其原因, 还是因为鼠标操作图形界面是一种间接的给计算机发指令, 而用键盘快捷键相对直接一点. 只有在移动焦点和点击选择定位位置的时候, 鼠标才比键盘高效.

这一年, 我发现虽然还不能 100% 的抛弃鼠标, 但可以说 95% 的情况下, 鼠标的使用都是可以避免的. 具体来说, 包括以下几处.

第一, 消除浏览和寻找文件时对鼠标的使用, 用搜索来定位文件. 用鼠标定位文件的时候, 一般人会一层一层的打开文件夹直到找到所需的文件. 实际上, 应该使用桌面搜索(苹果自带) 去管理这些文件, 从而不需要用鼠标去点击文件夹. 除了桌面搜索, Quicksilver/Alfred 这样的启动器, 和命令行等等, 都可以节省在浏览文件上所耗费的鼠标点击和时间. 命令行也是一个大宝库, 很多时候, cp/mv 比拖放文件夹快多了.

第二, 消除窗口管理中对鼠标的使用, 用键盘快捷键代替鼠标点击按钮. 在多任务图形界面操作系统里, 我们常常需要移动, 最大最小化, 或者切换窗口. 如果有兴趣, 还可以尝试一下 Awesome 这样的平铺窗口管理器.

第三, 消除应用程序对鼠标的依赖, 使用快捷键. 几乎任何一个复杂一点的应用程序, 如 Firefox, Photoshop 或 Office , 都会提供一整套的快捷键方案. 相比较于用鼠标反复选择点击菜单项, 熟悉快捷键的人完全可以运指如飞, 手不离开键盘完成所有操作. 这也包括 vimperator 等让 Firefox 焕发第二春的杀手级插件.

当然, 我们用了好多年养成了用鼠标代替键盘的习惯,是不可能在一夜之间改回头的。如果你是一个用习惯了鼠标的人, 现在想要从鼠标转移到全键盘, 不要期望一会儿就能扔掉鼠标. 这个过程可能会持续几个月. 如果你上面的每一条都做到了, 就正儿八经拔掉鼠标, 工作个一星期. 几星期之后, 你会发现更多的快捷键, 更多的命令行工具, 写更多的脚本完成原来需要鼠标完成的事情. 到时候, 那就真的是 the world is your oyster 了. 你会发现, 原来计算机用起来是这么的爽, 而且再也不要担心腕关节受损了.


请给番外篇系列文章提意见

Jan 6, 2011

Comments

各位读者新年好.  今年, 博文准备将我博客上现有的的编程珠玑番外篇系列, 以及我将要写的该系列的一些文章结册出版. 这个系列能写到现在, 都要感谢各位读者的捧场和传播, 以及在留言中给出的那些意见和建议. 当然, 我继续需要各位读者更多的意见和建议.

在写作该系列的时候, 我心里大致有个写作的框架和轮廓. 在和博文沟通中, 郑晖老师, 博文视点的周老师和卢编辑, 还有其他业内高手等也都给过我不少的建议, 对我帮助非常大. 目前, 我依然在两个方面需要各位读者的意见. 具体来说:

第一, 我希望知道读者的背景和对文章深度的期待. 在写这个系列的一开始, 我是以有趣的八卦的角度来写的, 文章的篇幅也不长, 用邓晖老师的话说, “致使有些问题无法充分展开”. 加上本人学识也有限, 写太深了我自己也驾驭不了, 写太浅了又会让人觉得是浮光掠影骗人钱财, 因此我想听听读者对这个系列的文章的深度和广度的期待. 同时,  我对读者的定位是: 觉得看完了一些编程的书还意犹未尽, 很好奇并觉得计算机科学和编程有趣的人 [按 Dreyfus 分类 , 读者的水平应该是在新手(Novice)  之上, 高手(Expert) 之下的 Advanced Beginner 和 Competent 层次]. 因此, 我还想了解下读者的技术背景.  我把自己想象为一个看完了”编程珠玑”之后手不释卷, 感觉意犹未尽因此狗尾续貂的人, 因此定位是”以计算机科学和编程教科书之外的有趣, 有用的知识为主题的系列文章”。 您的意见将帮助我和出版社的编辑们处理书稿的时候, 在内容的深度和广度, 主线和八卦之间达到一种较好的平衡.

第二, 我希望有技术上的高手对我文章中无论大小的瑕疵提出猛烈的批评. 博客上的技术文章一旦要成书, 标准完全不可同日而语. 我也深切的感觉到自己在有些技术问题上的理解的不深刻. 质量达到 Knuth 大牛那样出书后给找到 Bug 的人发支票是不可能的, 但事先尽可能的找到 Bug 让书稿质量更加好还是值得追求的. 同时, 我会在书中致谢所有在成书过程中给与我帮助的人.

你可以在这里留言, 也可以在推特上 @mathena.

蒙博文的卢编辑推荐, 本文在写作时参考了 vgod 的写书计划.


美国下一代空间计划

Sep 30, 2010

Comments

对航空感兴趣的人都知道,美国自取消阿波罗登月计划之后,其空间探索的主要精力,都放在了航天飞机主导的太空任务和国际空间站上。 和中国,俄罗斯的宇宙飞船不一样的地方在于,航天飞机是一种可以重复飞行的飞行器。

美国和前苏联都设计过航天飞机。他们设计的初衷都是一样: 航天器重复飞行能够降低制造和设计成本。 美国成功的做出了7艘航天飞机,而前苏联的航天飞机计划从来没成功的进入空间轨道过。 NASA 虽然成功的做出了航天飞机,限于当时的科学技术和认识的缺陷,还是没有避免一些致命的设计缺陷。 挑战者号和哥伦比亚号的事故都集中体现了这些设计缺陷。

Space shuttle Endeavor (Source: NASA)

航天飞机在发射时候,是将一个飞机状的东西(最后进入轨道并返回的飞行器,也叫轨道飞行器)挂载在一个巨大的土黄色的液氢/液氧燃料仓上。这个燃料仓旁边,又绑上了两个固体火箭增加推力。 发射后,固体火箭会掉入海中被回收,而巨大的土黄色燃料仓会坠入大气层烧毁。 不需要懂太多火箭知识就知道, 这等于是把航天飞机挂在一个火药桶上起飞,而且发射一旦出现什么问题,载有宇航员的轨道飞行器不能与燃料仓分离,固态火箭的使用更加使得火箭变得不可控(液态燃料可以随时关闭,固态燃料一点燃就没法熄灭) 。 这样,一旦火箭有了问题,爆炸和机毁人亡全都无法避免。挑战者号的事故就正好反映了这些设计缺陷。

同时,航天飞机使用表面瓷砖隔热,这些瓷砖在飞出和重返大气层的时候会被烧灼,可能会被损坏,所以航天飞机每次起飞都要重新装修一次,而且一旦在起飞的时候损坏,重返的时候就是听天由命了。哥伦比亚号航天飞机就是这样的事故。 航天飞机从设计到现在已经近30年了,因为当年使用的技术老旧,NASA 不得不养着一帮工程师来支撑航天飞机的飞行和维护。这些团队,不管航天飞机在天上还是在地下,都是要拿工资的。 于是,算下来,航天飞机的发射总成本,居然比发射一枚不回收的火箭还要高。

航天飞机有这么多的问题,是必然要退役的。这一点在哥伦比亚号事故后就变得尤其清晰。但是迄今为止,除了航天飞机和俄罗斯的大火箭,人类还没有其他方法把超过20顿的有效载荷送上 LEO (地球低轨轨道)的能力。而俄罗斯的火箭的载荷还是太小,送人没问题,送哈勃天文望远镜这样的大东西就要靠N次输送,对接和太空行走装配才能完成。之所以要巨大的火箭,因为克服地球重力井所需要的推力是如此之大。所以不管是登月也好,维护国际空间站也好,未来去火星探索也好,只要想让足够的东西逃离地球的引力,都离不开一个东西: 大推力火箭。 而美国除了航天飞机,居然就没有大推力火箭(送阿波罗登月的土星五号早就退役几十年了,当年的那些工程师都找不着了)。

小布什做总统的时候,带着和其他国家太空竞赛的意思,提出了 2020 年重返月球的计划。航天飞机自然不是送人和设备去月球的选择,于是,NASA 顺着登月的思路,提出了星座 (Constellation) 计划。 整个星座计划的总思路,是研发两枚大推力火箭,分开执行送人和送设备上天的任务,再将人和设备在月球轨道上对接。总所周知,在美国,人的生命是最重要的,因此载人的那枚火箭侧重于安全性,而载物的那枚火箭则侧重于大推力,和土星5号一样,有粗大的身材(见下图,胖的火箭旁边绑了两个固体的推进器,而瘦的火箭则完全是安全的液体推进,且有逃逸装置)。

Constellation Project (Source: NASA)

在我看来,星座计划是一个先天不足,又完全没什么创新的计划。首先,NASA 根本没有那么多钱来烧两枚火箭的研发。何况,月球美国已经去过好几次了,再去也是挖土。 最为关键的是,Bush 的星座计划里,居然要求 NASA 最大程度的重用原来阿波罗计划和航天飞机的技术和知识。 这就把一个本来可以做出革命性技术的项目,变成了重复一次阿波罗计划的项目,这样就完全失去了技术转化和民用化的巨大前景。 本来美国政府就已经是赤字累累了,再烧这个钱,完全没理由没价值。事实也的确如此,在布什任期,NASA 并没有在星座计划上按照时间表研发出对应的火箭技术,也没有看到什么革新的技术用在星座计划上。

Obama 总统上台后,委托一个由航空专家组成的小组对美国下一代空间探测计划做了一个总的评测。这个委员会对星座计划的意见是:工期拖沓,超过预算,没什么创新。于是,Obama 政府顺着这个,在2010年一月份的时候起草了一个提案,主要的思路是放弃重返月球的计划,跳过月球直接研究火星和小行星的机器人和载人探测计划,航天飞机退役,把往国际空间站等低轨轨道送人和设备的任务交给商业化的航空公司托管,不依赖于航天飞机技术发展下一代大推力火箭。平心而论,这个计划是完全可行也有创新意识的,而且可以降低不少成本。特别是现在私人航空公司送一个人上地球低轨轨道完全不费力气,况且美国作为月球俱乐部的唯一一个成员,和中印俄日这几个国家比谁在21世纪先登月一点意思没有,不如探索太阳系内其他星球。 这一点完全秉承了二战时候美国海军攻占西太平洋时使用的蛙跳跨岛战术,跳过月球,宇宙还很广阔。

当然,一个提案要想通过,还得参众两院投票通过才行。NASA 在航天飞机和火箭研发上已经雇佣了很多人,如果将 NASA 的一些项目外包,或者不依赖于NASA 现有技术,就意味着 NASA 雇员的失业。 在美国,失业和地方经济和选票都是直接关联的。因此,这个法案自然会得到 NASA 基地所在的那些州的议员的反对。加上普通人对放弃登月,感情上完全接受不了(想想中国还计划2025年登月呢),觉得是放弃了美国在太空探索上的领头羊地位,所以这个提案直接被枪毙了。

于是,参院的部分议员修改了原来的提案,这就是昨天参院刚刚通过的提案。其中,Obama 政府做了不少的妥协,原来计划的投资给私人航天的三十多亿美元砍成了16亿,国际空间站延长服役几年,航天飞机延长服役一次(这样NASA的配套工程师不至于瞬间失业),登月计划取消,大推力火箭换个名字继续开发,准备火星和小行星的机器人和载人探测。在上篇文章里我说了,载人火星探测要想成功,没有新一代的推进技术是痴人说梦。NASA 现在没有了登月的压力,应该可以潜心开发下一代的可以让人在太阳系自由穿梭的推进技术。 到时候,人类就真的摆脱了地球的重力的限制了。

跨过月球,2030年登上火星,这就是美国下一代空间计划的大体意思。