# 十八、二元文化 到目前为止,Windows和Unix在功能上的相似之处比不同的要多。他们都支持同样的主 流程序作法(由命令行到图型接口到web服务器);他们所依循的系统资源基本是完全一样的, 比如几乎完全相同的文件系统、内存、sockets,还有行程和线程等等。两套操作系统的核 心服务,还有开发者能写的应用程序类型也没多大的差别。 剩下的就是文化差异。没错,我们全都要吃东西,不过海那边的人是用木筷子吃生鱼片 加米饭,而我们在这里则是用手拿着面包夹大块碎牛肉在吃。文化差异并不表示美国人的胃 不能消化寿司,或是说日本人不能消化大麦克汉堡;也不表示吃寿司的美国人或吃汉堡的日 本人很少;文化差异指的是美国人第一次去东京下飞机时所面对,「这地方真奇怪又该死」 那种无法承受的感觉。至于什么「我们其实都是一样的,我们都有爱,也都会工作欢唱及死 亡,将会克服美国人和日本人永远无法真正对对方的厕所安排感到自在。」这种空话根本连 想都不会想。 Unix和Windows程序员的文化差异是什么呢?细微的地方很多,不过有一项最明显:Un ix 文化重视对其他程序员有用的程序,而Windows文化重视对非程序员有用的程序。 这当然是主要的简化说法,不过事实上确还是个很重大的差异:我们写程序究竟是为程 序员还是为了 一般使用者?除了这个问题之外其他的都只是诠释。 时常大发议论的Eric S. Raymond刚写了一本有关Unix程序设计的巨作The Art of UNIX Programming,极其深入地探索他自己的文化。你可以去买这本书的纸本来看。如果你觉得 Raymond的想法太过激进(anti-idiotarian)而不想付钱给他,还可以在在线免费阅读,保证 作者的心血绝对不会收到一分钱。 让我们来看个旋子。Unix的程序文化格外重视可由命令行呼叫的程序,这种程序可以 用参数控制各种动作,其输出可以撷取成一般机器可读的纯文本格弋。这种程序之所以会被 重视式,是因为可以让其他程序员轻易地整合进别的程序或较大的软件系统中。举个很小的 例子,Unix文化中有一个Raymond称之为「沉默是金」的核心价值,是说当程序成功地完成 你所交付的事时应该不要有任何输出。不管是在命令行输入300个字符的命令建立文件系统, 还是建立并安装了一套复杂的软件,或是把载人火箭送到月球,全部都一样。只要成功执行 就不要有任何输出。使用者看到下一个命令行提示就会推论一切正常。 由于你是为其他程序员写程序,所以这才会是Unix文化的重要价值。就如同Raymond所 说的:「喋喋不休的程序不太能和其他程序好好合作。」相较之下在Windows文化中是为张 阿姨而写程序的,而张阿姨搞不清楚程序是因为执行成功而没有任何输出,还是因为出错了 所以无法显示任何讯息,或是因为误解你的要求而没有输出。 同样的状况,Unix文化欣赏保持文字接口的程序。他们不是很喜欢图型接口,不过在纯 文本接口程序上漂亮地涂一层GUI 口红可以例外,另外他们也不喜欢二位文件格式。因为文 字接口比较好用程控,而图型接口除非提供其他机制(如内建脚本语言),否则几乎不可能用 程控。我们在这里又再次看到,Unix文化重视有助于其他程序员的程序,而这一点很少会是 Windows程序设计的目标。 这并不是说所有的Unix程序都只是为了程序员而设计的。这样说太偏颇了。不过这个文 化重视对程序员有用的东西,而这可以解释很多很多的事情。 假设你找了一个Unix程序员和一个Windows程序员来,要他们分别写同一只针对一般用 户的应用程序。Unix程序员会先建立一个由命令行或文字接口驱动的核心,通常事后才写一 个图型接口来呼叫核心。这样子应用程序的主要功能都可以让其他程序员使用,他们可以用 命令行呼叫程序并把结果以文字方式读入。而Windows程序员会倾向先由图型接口开始,通 常事后才加上脚本语言让图型接口的操作自动化。对一个99.999%用户完全不写程序(也不打 算学写)的文化来说,这是很正常的。 在Windows程序员中有个主要针对其他程序员写程序的重要团队,就是微软内部的 Windows团队本身。他们做事的方法通常是建立一个可以由C语言呼叫的API,在API里实作出 功能,然后再撰写图型接口程序来呼叫API。所有用Windows使用接口能做的事,全都可以用 任何合理的程序语言呼叫某个程序接口做到。举例来说,微软的Internet Explorer本身只 不过是一个89 KB的小程序,里面包装了数十个可供程序老手免费使用,功能强大又有弹性 的的组件。问题是程序员无法接触到这些组件的原始码,所以只能完全依照微软内组件开发 者所预见并允许的方式使用,而这种作法并不是每次都行得通。有些问题因为缺乏API原始 码,以致于难以甚至无法追查,这时通常就怪罪到呼叫API的人身上。Unix具有公开原始码 的文化价值,使它成为更容易开发的环境。每个Windows平台的开发者都会告诉你,某一次 花了四天去查一个问题,原因只是他们认为LocalSize传回的内存大小应该和原先呼叫 LocalAlloc时用的值一样,或是其他有链接库原始码就能在十分钟内搞定的问题。Raymond 创作了一个有趣的故事,说明这个曾经用过无原始码链接库都会同意的道理。 所以你看到这些宗教性的论点了。因为可以进入链接库除错所以Unix比较好。因为张阿 姨可以看到提示确认她的电子邮件真的送出去了,所以Windows比较好。事实上没有谁比谁 更好,他们只是拥有的价值不同:Unix的核心价值是制作有助于其他程序员的东西,而 Windows则把制作有助于张阿姨的事视作核心价值。 让我们来看看另一个文化差异。Raymond说「典型的Unix文件会写得简洁而完整]…这 种风格假设读者够积极,可以推导未写出的推论,并且有自信信任这些推导。]小心的阅读 每一个字,因为一件事很少会讲两遍。]」天啊,我认为他其实是在教年轻的程序员写出更 不人性的man说明文件。 这对一般使用者而言是绝对行不通的。虽然Raymond可能说这是「过于简化的屈就]」, 不过Windows文化了解一般使用者不读文件,即使不得不看也是愈少愈好,因此你必须不断 重复的解释…事实上在良好的Windows说明档中,必须每个主题都能让一般读者直接看懂, 不必先看懂其他任何的帮助主题。 怎么会出现不同的核心价值呢?这是Raymond的书另一个出色之处:他深入Unix的历史 和演进,让新程序员熟悉回溯至1969年起累积的历史。在Unix被创造出来及其文化价值成形 的时候,一般使用者并不存在。计算机很贵CPU时间也很贵,学计算机就等于是学写程序。 无怪会蕴酿出重视有助于其他程序员的文化。相较之下Windows的创造只有一个目标:尽量 卖更多套以获得更多利润,成亿上兆套的卖。「每个家庭每个桌上都有一台计算机」就是创 造Windows的明确目标,并且设定了它的议题也决定它的核心价值。让非程序员容易使用, 是进驻每个桌面和家庭的唯一方法。因此使用性自然凌驾其他东西而成为文化的基准。对这 样的文化而言,程序员是极其次要的对象。 文化的裂缝是如此的明确,所以Unix从未真正的进入桌面。张阿姨不会真的去用Unix。 不断有人努力帮Unix制作漂亮的外壳,希望让张阿姨能用Unix,不过全都失败了。因此这些 程序员都深陷在Unix文化中。举例来说,Unix有一个源自于X设计者的价值:策略与机制分 离。这种想法直接导致使用接口的分裂;桌面使用接口运作的细节并没有大家一致同意的做 法,由于这些设计者的文化重视这种差异,所以他们就认为这种作法可以用。不过对张阿姨 来说,在不同程序里剪贴得用不同的使用接口,绝对是行不通的。所以这就是现在的状况, Unix开发者20年前开始尝试在系统表面涂上一层漂亮的使用接口,结果到今天最大Linux厂 商的执行长还告诉大家,家庭用户应该直接用Windows就可以了。我曾经听过有经济学家宣 称,说硅谷永远不可能在其他地方(比如说法国好了)重现,因为法国文化对于失败的惩罚太 重,以致企业家不愿意冒险。或许Linux也有相同的状况:Linux可能永远都不会成为桌面 的操作系统,因为它重视一些会阻碍这件事的价值。OSX就是一个证明:苹果终于创造了给 张阿姨用的Unix,不过原因并不光是因为苹果的工程师和经理坚持针对一般使用者的文化 (我独断地称之为「Windows文化」,虽然这从历史来看是源于苹果),他们还拒绝了Unix文 化中以程序员为中心的基本思想。甚至把核心目录的名字改掉了(多么违反传统!),用常见 的英文单字”applications”和”l ibrary”代替”bin”和”lib”。 Raymond真的尝试比较Unix与其他操作系统并突显之间的差异,不过这却也是这本好书 中最弱的部份,因为他真的不知道自己在讲什么。当他谈论Windows时常会显露他对Windows 程序设计的知识多是由报纸读来,并非来自真正的Windows程序设计经验。这没什么关系: 他并不是Windows程序员,而这一点我们可以体谅。不过他身为对一个文化有深厚了解的典型,知道该文化所重视的价值,却没有注意该文化中针对一般人部份(杀老太太跟当机:一 定是不好的),与针对程序员部份(吃生鱼片和命令行参数:因对象而不同)的差异。 有太多的单文化程序员,他们就像从未离开过家乡的典型美国小孩,说不出来文化价值 和人类核心价值间的差异。我遇过太多嘲笑Windows程序设计的Unix程序员,他们认为 Windows野蛮又愚蠢。Raymond经常落入未考虑原由就轻视其他文化的陷阱。在Windows程序 员中很少会发现这种顽固份子,因为Windows程序员大体上都是以解决方案为准而非意识型 态的。至少Windows程序员会承认他们文化的缺陷,然后很实务地说:「看,如果你想把字 处理程序卖给很多人,就得能在他们的机器上执行。如果得用邪恶的registry代替优雅的 ~/.「c档储存设定才能办到,就这样做吧。」现在Unix世界充满自以为是的文化优越拥护者 和s l ashdot的灌水教派(karma-whor i ng sectar i an i sm),而Wi ndows世界比较实务(我毕竟得 在这里讨生活嘛)。这种现状源于Un i x文化感觉自己被围攻,无法突破服务器和爱好者小众 市场进入主流桌面市场。这种弱势的傲慢正是The Art of UNIX Programming最大的缺点, 不过倒也并不是如此严重,整体而言这本书充满了非常有趣的洞见,内容泛及各种程序设计 主题,以致我愿意闭住呼吸忍受偶而出现的意识型态高论,因为在其他部份可以学到太多一 般性的观念了。事实上我会把这查书推荐给任何平台任何文化和任何目标的开发者,因为里 面有大多价值是普世通用的。Raymond指出CSV格式不如/etc/passwd格式时,他尝试由Unix 而非Windows观点去评价,不过你知道吗?他是对的。/etc/passwd比CSV容易分析,如果你 读了这本书就会知道为什么,而且也会成为更好的程序员。