双元文化主义

作者:周思博(Joel Spolsky)
译:Paul May 梅普华
Sunday, December 14, 2003 属于Joel on Software, http://www.joelonsoftware.com

到目前为止,Windows和Unix在功能上的相似之处比不同的要多。他们都支持同样的主流程式作法(由命令列到图型介面到web伺服器);他们所依循的系统资源基本是完全一样的,比如几乎完全相同的档案系统、记忆体、sockets,还有行程和执行绪等等。两套作业系统的核心服务,还有开发者能写的应用程式类型也没多大的差别。

剩下的就是文化差异。没错,我们全都要吃东西,不过海那边的人是用木筷子吃生鱼片加米饭,而我们在这里则是用手拿着面包夹大块碎牛肉在吃。文化差异并不表示美国人的胃不能消化寿司,或是说日本人不能消化大麦克汉堡;也不表示吃寿司的美国人或吃汉堡的日本人很少;文化差异指的是美国人第一次去东京下飞机时所面对,「这地方真 奇怪 又该死」那种无法承受的感觉。至于什么「 我们其实都是一样的,我们都有爱,也都会工作欢唱及死亡 ,将会克服美国人和日本人永远无法_真正_ 对对方的厕所安排感到自在。」这种空话根本连想都不会想。

Unix和Windows程式师的文化差异是什么呢?细微的地方很多,不过有一项最明显:Unix文化重视对其他程式师有用的程式,而Windows文化重视对非程式师有用的程式。

这当然是主要的简化说法,不过事实上确还是个很重大的差异:我们写程式究竟是为程式师还是为了一般使用者?除了这个问题之外其他的都只是诠释。

ArtOfUnixProgramming.gif The Art of UNIX Programming - book cover

时常大发议论的Eric S. Raymond刚写了一本有关Unix程式设计的巨作_The Art of UNIX Programming_ ,极其深入地探索他自己的文化。你可以去买这本书的纸本来看。如果你觉得Raymond的想法太过激进(anti- idiotarian)而不想付钱给他,还可以在线上免费阅读,保证作者的心血绝对不会收到[一分钱](http://linuxtoday.com/news_story.php3?ltsn=1999-12-10-001-05-NW- LF)。

让我们来看个小例子。Unix的程式文化格外重视可由命令列呼叫的程式,这种程式可以用参数控制各种动作,其输出可以撷取成一般机器可读的纯文字格弋。这种程式之所以会被重视式,是因为可以让其他程式师轻易地整合进别的程式或较大的软体系统中。举个很小的例子,Unix文化中有一个Raymond称之为「沉默是金」的核心价值,是说当程式成功地完成你所交付的事时应该[不要有任何输出](http:// www.faqs.org/docs/artu/ch11s09.html)。不管是在命令列输入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则把制作有助于张阿姨的事视作核心价值。

hudsonBoats.JPG

让我们来看看另一个文化差异。Raymond说「典型的Unix文件会写得简洁而完整]…这种风格假设读者够积极,可以推导未写出的推论,并且有自信信任这些推导。]小心的阅读每一个字,因为一件事很少会讲两遍。]」天啊,我认为他其实是在 教年轻的程式师写出更不 人性_的man说明文件。_

这对一般使用者而言是绝对行不通的。虽然Raymond可能说这是「过于简化的屈就]」,不过Windows文化了解[一般使用者不读文件](/wiki/The_Joel_on_Software_Translation_Project:%E4%BD%BF%E7%94%A8%E4%BB%8B %E9%9D%A2%E8%A8%AD%E8%A8%88%E6%89%8B%E5%86%8A%E7%AC%AC%E5%85%AD%E7%AB%A0 “The Joel on Software Translation Project:使用介面设计手册第六章”),即使不得不看也是愈少愈好,因此你必须不断重复的解释… 事实上在良好的Windows说明档中,必须每个主题都能让一般读者直接看懂,不必先看懂其他任何的说明主题。

怎么会出现不同的核心价值呢?这是Raymond的书另一个出色之处:他深入Unix的历史和演进,让新程式师熟悉回溯至1969年起累积的历史。在Unix被创造出来及其文化价值成形的时候, 一般使用者并不存在 。电脑很贵CPU时间也很贵,学电脑就等于是学写程式。无怪会蕴酿出重视有助于其他程式师的文化。相较之下Windows的创造只有一个目标:尽量卖更多套以获得更多利润,成亿上兆套的卖。「每个家庭每个桌上都有一台电脑」就是创造Windows的明确目标,并且设定了它的议题也决定它的核心价值。让非程式师容易使用,是进驻每个桌面和家庭的唯一方法。因此使用性自然凌驾其他东西而成为文化的基准。对这样的文化而言,程式师是极其次要的对象。

文化的裂缝是如此的明确,所以Unix从未真正的进入桌面。张阿姨不会真的去用Unix。不断有人努力帮Unix制作漂亮的外壳,希望让张阿姨_能_ 用Unix,不过全都失败了。因此这些程式师都深陷在Unix文化中。举例来说,Unix有一个源自于X设计者的价值:[策略与机制分离](http://www.faqs.org/docs/artu /ch01s06.html#id2877777)。这种想法直接导致使用介面的分裂;桌面使用介面运作的细节并没有大家一致同意的做法,由于这些设计者的文化重视这种差异,所以 他们就认为这种作法可以用 。不过对张阿姨来说,在不同程式里剪贴得用不同的使用介面,绝对是行_不_ 通的。所以这就是现在的状况,Unix开发者20年前开始尝试在系统表面涂上一层漂亮的使用介面,结果到今天最大Linux厂商的执行长还[告诉大家,家庭用户应该直接用Windows就可以了] (http://news.zdnet.co.uk/software/linuxunix/0,39020390,39117575,00.htm)。我曾经听过有经济学家宣称,说矽谷永远不可能在其他地方(比如说法国好了)重现,因为法国文化对于失败的惩罚太重,以致企业家不愿意冒险。或许Linux也有相同的状况:Linux可能永远都不会成为桌面的作业系统,因为它重视一些会阻碍这件事的价值。OS X就是一个证明:苹果终于创造了给张阿姨用的Unix,不过原因并不光是因为苹果的工程师和经理坚持针对一般使用者的文化(我独断地称之为「Windows文化」,虽然这从历史来看是源于苹果),他们还拒绝了Unix文化中以程式师为中心的基本思想。甚至把核心目录的名字改掉了(多么违反传统!),用常见的英文单字"applications"和"library"代替"bin"和"lib”。

Raymond真的尝试比较Unix与其他作业系统并突显之间的差异,不过这却也是这本好书中最弱的部份,因为他真的不知道自己在讲什么。当他谈论Windows时常会显露他对Windows程式设计的知识多是由报纸读来,并非来自真正的Windows程式设计经验。这没什么关系:他并不是Windows程式师,而这一点我们可以体谅。不过他身为对一个文化有深厚了解的典型,知道该文化所重视的价值,却没有注意该文化中针对一般人部份(杀老太太跟当机: 一定是不好的 ),与针对程式师部份(吃生鱼片和命令列参数: 因对象而不同 )的差异。

有太多的单文化程式师,他们就像从未离开过家乡的典型美国小孩,说不出来文化价值和人类核心价值间的差异。我遇过太多嘲笑Windows程式设计的Unix程式师,他们认为Windows野蛮又愚蠢。Raymond经常落入未考虑原由就轻视其他文化的陷阱。在Windows程式师中很少会发现这种顽固份子,因为Windows程式师大体上都是以解决方案为准而非意识型态的。至少Windows程式师会承认他们文化的缺陷,然后很实务地说:「看,如果你想把文书处理程式卖给很多人,就得能在他们的机器上执行。如果得用邪恶的registry代替优雅的~/.rc档储存设定才能办到,就这样做吧。」现在Unix世界充满自以为是的文化优越拥护者和slashdot的灌水教派(karma- whoring sectarianism),而Windows世界比较实务(我毕竟得在这里讨生活嘛)。这种现状源于Unix文化感觉自己被围攻,无法突破伺服器和爱好者小众市场进入主流桌面市场。这种弱势的傲慢正是 The Art of UNIX Programming 最大的缺点,不过倒也并不是如此严重,整体而言这本书充满了非常有趣的洞见,内容泛及各种程式设计主题,以致我愿意闭住呼吸忍受偶而出现的意识型态高论,因为在其他部份可以学到太多一般性的观念了。事实上我会把这查书推荐给任何平台任何文化和任何目标的开发者,因为里面有大多价值是普世通用的。Raymond指出CSV格式不如/etc/passwd格式时,他尝试由Unix而非Windows观点去评价,不过你知道吗?他是对的。/etc/passwd CSV容易分析,如果你读了这本书就会知道为什么,而且也会成为更好的程式师。

这些网页的内容为表达个人意见。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.