Archive for 2009年8月

冰啤

2009/08/27

深夜想看会儿书。从冰箱里拿瓶冰啤酒。

如果乔布斯会编程

2009/08/27

Forklore.org 是一个相当不错的网站,专门收录第一代 Macintosh 设计期间的珍闻轶事。今天有件事情让我想到了里面的一篇:PC Board Esthetics

事情开始是吴雨鸿为修改一个 bug 写了一些代码并由整个 team 来 review。代码的算法很复杂。凭经验我感觉应该有更容易理解的方法。经过长时间的讨论,证明雨鸿的方法的复杂度也不是全无理由,因为原来程序的数据结构中有一个单向关联(unidirectional association)。如果用比较清晰的算法来写,需要蛮力遍历比较多的数据。(再次说明《Art of UNIX Programming》里面指出的数据结构清晰的重要性。)不过我认为在复杂算法和蛮力算法之间进行选择并不困难。When in doubt, use brutal force 应该是永恒的真理。

讨论 UNIX 原则和文化并非此文的主旨。问题在于,我突然遐想 Apple 的软件工程师在这种事情上会如何收场——特别是在 Steve Jobs 过问的情况下?在 PC Board Esthetics 里,Steve Jobs 激动地驳斥了一位工程师以用户不可见 PC 板为理由而放弃美学追求的意见——『高超的木匠不用糟木头做柜子背面!』 即使面对更为实际的电气方面的反对意见,Jobs 仍然坚持先按美观的方式做出来试试。结果 Macintosh 设计团队无怨无悔地多花了 5000 美元来证明美观的设计确实在电气方面存在难以克服的缺点。『退而』采用了朴素的设计。

硬件如此,软件又当如何?正如《In the Beginning It was the Command Line》里面说的,Bill Gates 自叹在品味上不如 Jobs,但是也有资本嘲笑 Jobs 不会编程。看来似乎 Apple 的软件工程师们可以大大地松一口气。可能也不尽然,Jeff Johnson 这位大牛在他的 blog 里介绍了脱离 XIB(以前叫 NIB)文件使用 Cocoa 开发的系列文章,在最后一篇里说 Jobs 来信说所有文章他都看过,明确承认大多数 Apple 的应用程序其实都是没有 NIB 的,还指出了哪些技术是 Apple 正在使用的。是个玩笑还是 Jobs 过人的精力再次给我们惊讶,谁知道呢?

如果 Jobs 会编程,Apple 的软件工程师会遭受什么样的折磨呢?就拿今天的例子来说。也许 Jobs 会笃信 UNIX 的格言,毫不犹豫的让手下把程序改成简洁的蛮力算法。也许 Jobs 凭借一贯的独特美学品位不会轻易接受蛮力算法,但是也绝对不会为了省去两个循环就允许工程师们用各种匪夷所思的手段去摆弄数据结构。他一定会要求一个可以理解的算法,并且用最生动的注释来说明。虽然是注释,排版也必需讲究,最好是能够形式地严格证明这个精巧的算法和蛮力算法在逻辑上等价。所以最后的结果可能正如那块折磨硬件工程师的 PC 板,软件工程师们在无怨无悔地多花了几天时间研究优美的算法是否可行之后重新采用蛮力算法。

一周杂记:显示、形式证明和Git

2009/08/19

这周一直在看 OpenGL 的材料,没时间思考什么大块的东西(正在惶恐是不是以后会越来越多地写下这句话)。零零碎碎的有些可以记的东西。首先说个题目里没有的东西,国内访问不到的网站越来越多了。昨天居然连 arstechnica.com 都被墙了几个小时(也许是地震?)。Wordpress-china.com 回光返照了一天,还没来得及迎接我的一篇文章,就再次倒下了。

大多数时间在看《 Interactive Computer Graphics: A Top-Down Approach Using OpenGL, Fifth Edition 》。同时看 Apple 的 OpenGL Programming Guide 。前者的第一章根本没谈 OpenGL,海侃了一番计算机图形的发展,本打算略过,最后还是坚持读了。不算白费功夫,确实搞清了很多一直以来疑问。比如 LCD、LED 和等离子三种显示方式有什么不同——前者每个像素是一个液晶极化挡板,依靠遮挡背光来变换颜色,后两者每个像素都是一个独立光源,但是发光原理不同。还有为什么 GPU 比 CPU 处理图像更快,这也是 MMX 指令集的原理——多步骤流水线,同一组指令(对于软件呈现为单一条指令)处理大量数据,代价是处理分支的能力很弱或者没有。

这周在网上看到的最激动人心的新闻是 L4 微内核的安全性得到了形式证明。这些年来一直在学习如果把软件做的更优秀和健壮。虽然感受颇多,但是都是一些近乎于无形的东西。L4 的形式证明说明业界已经开始得到一些有形的突破性成果。也许明天会达到形式证明一个系统的功能性正确,或者证伪一个系统的功能性正确并且指出错误。

这周学到的最有用的知识的途径是通过一个愚蠢的错误。昨天我对甫鸼说打算在家里建一个 Git server。甫鸼当下大不解:为什么是 server ?」没说两句我开始意识到自己一定是犯了一个愚蠢的错误。立刻打开 Wiki 的 Git 词条。果然第二段就赫然写着:『 Every Git working directory is a full-fledged repository with complete history and full revision tracking capabilities, not dependent on network access or a central server. 』

希望在自己的笔记本上建立单机的代码库已经很久了。两年多以前就在思考为什么没有人写一个不依赖 server 的 version control 系统。现在才明白,这就是分布式 version control 系统的基本功能。这个名称很早就听说了,如果自己能看一下大致的介绍,也就不会困惑许久甚至打算自己写一个。都说不了解 UNIX 的用更差的方式发明 UNIX,我也是在自己的头脑里用更差的方式发明了分布式 version control 这个概念——其实还不到那一步,只是想到了本地版本管理而已,也就是 Git 最初实现的第一步。虽然把 version control 视为人类文明发展的奠基石,居然连分布式系统的概念都不清楚。学习了 Git 也连带看了 Linus 对 CVS 一类系统的批判。今天试用了 Git ,很好用也很强大。Linus 不愧是大师。Linus 和 Steve Jobs 的共同点就是他们设计的第一个产品就改变了世界,但是他们还能继续创造第二个。

WordPress-china.com 回来了

2009/08/12

今天抱着不死的贼心又一次键入「sipoint.wordpress-china.com」。然后打开其它 Tab 浏览,心里早就预备好被劫持到昨天那个垃圾网页。过了一会儿发现这个 Tab 赫然标着「技术奇异点」。奇哉,妙哉!

对 HTML 5 的再思考

2009/08/11

六月份写《从HTML 5想到的》的时候,对 HTML 5 主导感觉是其对技术收敛的积极作用。不过最近 Khronos 组织又开始推动 WebGL ,让我感到事情渐渐过了头。似乎 Mozilla 和 Khronos 组织正在以错误的角色,用错误的方式来解决一个假设的(似乎也是错误的)未来问题。

正如《从HTML 5想到的》最后谈到的,浏览器 plug-in 并非如同 OS native 技术一样发散而不可收敛。寻求公有开放的视频标准的动机来源于对 plug-in 未来走向不确定性的恐惧。虽然未雨绸缪是好事,但是 plug-in 的竞争并未结束,从 Adobe 以往的经历来看,ActionScript 自发地进入开放领域也并非不可能。早早的冠以一个 HTML 标准来定型两个最主要的 plug-in 应用领域(视频和 3D),很有可能扼杀本来应该发生的竞争,或者走向反方,凡是客观上会扼杀这种竞争的行为,本身都会遭受失败。所以,Mozilla 和 Khronos 组织这种过分的警觉近乎于 FUD 驱动的行为模式,要么有可能扼杀本来通过竞争或者厂商自主开放的更优秀的技术,要么会因为这种扼杀的企图导致本身被市场抛弃。

目前的 plug-in 主要是私有实现,这确是事实。但是 plug-in 架构本身有什么不可解决的问题吗?我并不这么想。事实上,足够复杂的软件系统,尤其是开源系统,应该保持核心部分的精简,同时为外围开发者提供灵活的 plug-in 框架。现在的局面是一部分 Web 需要视频和 3D 应用。但是为此就抛弃 plug-in 的扩展机制,把 3D 和视频的处理并入 HTML 标准,HTML 和 JavaScript 就变成了一个什么都装的垃圾堆。 如果要改变目前主流视频应用(和未来可能的 3D 应用)的不开放局面,开源社区的当务之急应该是推动开源的 plug-in 实现和开源 plug-in 架构的标准化。这样的做法,比把与 HTML 风格迥异的功能硬塞进 HTML 标准,会遭遇更少的阻力,取得的开放效果也丝毫不差。

把视频和 3D 并入 HTML 体现的是一种反 UNIX 的文化。UNIX 从来都不指望让一个语言完成两个任务,也避免让过多的应该由库来承担的任务进入语言核心。HTML 5 和 WebGL 无疑是希望让一个语言来完成过多的功能,或者是把特殊用途的库并入语言核心,从而剥夺了开发者自由选择的权力。Mozilla和 Khronos 组织原本完全可以着手开发自己的开源 plug-in 和 Adobe Flash 等 plug-in 在视频和 3D 领域公平竞争。强行扩充标准是一种没有自信的行为。打着开放和统一的旗号剥夺开发者和用户的权力,这样的做法更像微软捆绑产品的行为模式。现在微软也要半途加入 HTML 标准的讨论,不知道是不是因为在 Mozilla和 Khronos 组织身上嗅到了同类的气味,所以也赶来分一杯羹。

扩充 HTML 标准的另一个负面影响是导致事实上的标准分裂。计算机工业的历史证明,任何基于文字描述的标准只要足够复杂,都会事实上分裂。CORBA 是最为臭名昭著的例子。C++ 98 也是一个不怎么正面的例子。健康的开放标准通过两种路径来避免分裂。一是尽量保持标准的简单和功能单一;二是通过一个开放的 code base 而非文字描述来形成事实上的标准。前一种的典型例子就是 RFC,后一种的例子有 Perl,Python 等语言的实现。两种途径可以很好的结合,比如 TCP/IP 的 RFC 通过 BSD 的 code base 更加巩固。但是总的说来,对于私有的,或者 multi-vendor 的代码实现,还是只能适用第一种方式,就是保持标准的尽量简单。HTML 原本设计为 presentation 语言,加上 JavaScript,CSS 和 AJAX 的应用,已经是一个混沌而且脆弱的集合了。如果再为所欲为的塞进关联不甚紧密的功能,那么这个标准的分裂就指日可待了。统一 Web 视频和 3D 应用不能再走那种强制标准的老路。正确的做法是保持 HTML 标准的简洁,推动统一的 plug-in 接口,同时开发具有竞争力的开源 plug-in 实现来吸引用户以及迫使 Adobe 等公司尽快开放自己的私有 plug-in。这样才是保持整个系统健康开放的正确途径。

总之,对于 HTML 5 的发展到 WebGL 的出现,初始的欣赏已经变成对 HTML 标准的畸形膨胀的担心。这条路继续下去,所谓的公开标准无法从 Flash 等私有 plug-in 中夺取市场和用户,开源社区和用户得不到真正的开放,反而会失去一个原本统一简洁的标准。

纪念 WordPress-china.com

2009/08/11

WordPress-china.com 已经玩完了。幸亏所有的文章这里都有备份。既然翻墙已经成为中国网民的常态,也许墙内的 host 也就没有什么值得留恋的了。

升级之前

2009/08/04

再过不到两个月,Mac OS X 和 Windows 就要各自推出下一个升级版本了。志岩一直和我说要做一些预测——不是因为他相信我的预测,而是想用这个来作为评判我今后的意见是否可信的参考。

先说说 Windows 。很多人认为 Windows 7 会修正 Vista 的大多数问题,并且有可能把 Windows 家族重新带入正轨。我对此的看法是,不!和3年前一样,我仍然认为 Windows 问题的最主要根源在于它是 Windows。换句话说,因为它不是 UNIX。所有非 UNIX 的操作系统都会慢慢凋零。志岩说参次多态既为美。但是以此来认定 Windows 、或者其它非 UNIX 操作系统值得存在或者能够存在下去就未必正确。UNIX 文化本身就是一个参次多态的过程,其中从来不乏对自身的否定,所以才能沉淀出无可替代的最佳实践。这个特性可以用先哲的两句话来形容。

Robert Metcalf(以太网的发明者)说过如果有技术最终替代了以太网,那么它还是会被叫做 “以太网” ,所以以太网永远不会消亡。UNIX 也经历了同样的变换。

—— Ken Thompson

不了解 UNIX 的人会把它重造一遍,用更差的方式。

—— Henry Spencer

Windows 的创造者们正是这样一批可敬的重新打造自己的 UNIX 的人。和其它操作系统的设计者相比,他们有两点不同,第一是取得了非 UNIX 操作系统的最大成功;第二是有意无意的竭力避免和 UNIX 扯上关系。和一个产品或者一个特定的技术保持距离,并且健康竞争,共生共荣是可能的。和一个涵盖广泛,善于自醒的文化保持距离就难免走向完全反对这个文化的极端。一个特例独行年轻有为的人,到了中年发现自己曾经引以为豪的反叛其实只是传统文化未曾关注但是已经逐渐融合的领域,但是自己已经养成了处处叛逆的习惯。这样的中年人只能在痛苦中重新融入社会的主流,或者被淘汰。不管微软能否幸免,都不再是10年前那个凭借 Windows 藐视其它操作系统的操作系统领先者了。

苹果原本也会可能走上微软的道路。戏剧性的是它的成功正是因为曾经太失败。惨痛的失败才让苹果全面的融合了 UNIX。苹果的优势还在于它不是一家纯粹的软件公司。所以即便苹果想要,而且确实保持一定程度的叛逆,它也可以把这份能量释放到 UNIX 文化不曾影响的领域,而不至于走上反 UNIX 文化的极端。在真心希望融入 UNIX 文化的过程中,苹果也学会了应对文化差异的宝贵经验,否则苹果的 MacOS 9 之前的技术优势不可能和 Mach 的内核、bash 共处一道。这种宝贵的经验连一些悠久的 UNIX 团体都尚且缺乏。但是作为一家有个性的公司,苹果仍然有一朝之内背离 UNIX 主流的可能。我的感觉是,苹果正在正确的轨道上行驶,但是强大的能量仍然有出轨的可能。

苹果的成功给微软的教训就在于,可以反对一项技术(比如苹果并不看好 X Windows),可以反对历史的遗留,但是不要反对一种成功的文化的精神。不限于计算机软件行业,人类的历史说明,可以用来指导人们前进的精神并不多,不要指望自己可以驾驭一种和传统背离的精神。比如上世纪 30 年代开始,一批国家开始认为可以用一套全新的理念来打造社会。这个应了那句老话,“重新发明轮子不仅费时,而且得到的轮子还通常是方的。”

Linux 和 BSD 仍然是 UNIX 文化最稳定的传承者。它们的能量不如苹果那么充沛,但是根基更为稳固。商业软件总是被各种不健康的动机吸引着。只有当开发者真正掌握软件命运的时候,软件的生命力才能长久。

快速切换 Proxy

2009/08/01

最近常用 proxy。不过 proxy 的速度比较慢,所以经常要在用和不用之间切换。FireFox 有些组件能做到快速切换,不过用起来也不太方便。而且我发现有些网站用 FireFox 显示的不如 Safari 效果好,比如《华尔街日报中文》和《牛博》。

好在 OS X 秉承了 UNIX 的优良传统,事事都有命令行操作:

设置 proxy:
networksetup -setsocksfirewallproxy <service> <proxy> <proxy_port>

取消 proxy:
networksetup -setsocksfirewallproxystate off

开一个 terminal 在旁边,切换速度比 FireFox 插件还快。