Archive for 2011年5月

集成污染

2011/05/27

写过《高级动态语言与软件业》之后,Alex 回复说 Lua 语言应该符合我的期望。其实我应该早就意识到 Lua 的存在,因为 Lightroom 就是用它作为 policy 部分的编程语言。只是 Lua 的库不如 Python 等语言强大,作为编写应用程序的主力语言还显单薄。但正是因此使用轻量级的 Lua 的开发者很少受到诱惑用它来开发复杂算法和 policy 之外的东西(比如 UI ),那正是我在《高级动态语言与软件业》里所反对的。

另一方面,作为描述算法和 policy 的动态语言的另一个重要条件在《高级动态语言与软件业》里讨论不多,却正是 Lua 的优势 —— Lua 是我所知的造成『集成污染』最少的库。

什么叫做『集成污染』?简单地说,如果系统的构建( build )在加入某个模块之前一直好好的,加入这个摸块之后就开始出现问题,这就叫集成污染。这种症状在编译、链接和运行阶段都可能发生。例如,编译阶段的集成污染的可以来自 C 的 macro ,typedef ,条件编译,C++ 的 template 。运行时的集成污染可能来自不同的多线程模型混用。

一个模块能否被顺利地集成到更大的系统中,取决于它希望别的模块如何对待它。一个模块对其它模块的要求越多,越不明确,集成的困难就越大。当这些要求被错误地理解或者无法满足的时候,就变成了集成污染。如果一个模块只是对数据的类型有所要求,那么任何一个可以定义抽象数据结构的静态语言都能很容易的描述这种要求,而且也很容易得到满足。但是,即使是如此简单的需求,也会遇到命名冲突之类的问题。通常这就是 macro 和 typedef 造成集成污染的原因。

接下来,有些模块的要求在『理论上』能够被满足,但是这种要求超出了现有技术的表达能力。C++ template 和多线程就是这样的例子。一个使用了 template 的模块很难用 C++ 语言本身的结构来说明自己的需求。对多线程来说情况就更严重,因为不仅编程语言不能描述线程模型,连数学语言和自然语言也很难清晰描述一个模型对线程使用的期望。所以,基本上集成涉及多线程的模块是一种盲目试错的过程。

更进一步,有些模块的要求是否能被清晰地描述已经不重要,因为这些要求常常是难以满足的。这些模块要求独占 system-wide 稀缺资源。比如,Cocoa 框架把整个应用的很多初始化工作和主消息循环封装到一个黑箱函数 NSApplicationMain() 中,古老的 C++ Framework 如 MFC 也会隐藏 main() 函数。这些库用自己的方式任意使用消息循环和主函数。如此霸道的模块,在系统中是一山不容二虎。《高级动态语言与软件业》提到很多高级动态语言和静态语言的互操作方式仅限于单向发起 —— 能调用静态语言编写的动态链接库,但是不能作为库被其它(静态)语言调用,这就等同于对主函数(有时连同消息循环)的独占。

解决集成污染的方法是各种边界分离。像 macro 、typedef 之类的命名污染可以通过文件分离来解决。终极方法是进程分离加 IPC 。不论如何难缠的集成污染也会在进程边界止步。另一种解决之道是参与集成的模块低调、收敛、谦虚一些。这就是 Lua 的方式。采用 ANSI C 中最成熟的跨平台部分,避免了编译时的错误。放弃对线程和 I/O 的支持,避免了运行时污染。Lua 能做这样的取舍,原因在于有合理的目标,把自己定位为描述算法的符号操作语言,和 hosting 应用的交互限于严格而且有序的符号集合。这让 Lua 成为扩展 C 语言和的方案中最简洁和最可靠的形式。

美国归来

2011/05/22

在美国参加了一周的公司 Tech Summit ,之后几天做了一些项目上的交流。这是工作以来到国外出差最愉快的一次。其中的原因是因为所在的公司不同,所工作的产品不同,交往的人不同,也因为我自己和以前不同。美国的工程师和经理都非常友好而且优秀。其中两位华人更是在工作中充满活力和激情,而且为人豪爽。

除了大基调比较愉快之外,还有一些小细节准备得比较成功。

首先是一定要带自己的 laptop 。每天不能睡自己的床,不能盖自己的被子,不能待在自己的书房,不能用自己的专用浴袍,这些本来就是很不爽的事情。如果再加上不能在熟悉的 laptop 上阅读和娱乐,那整个行程中几乎就没有任何放松的机会可言。所以,即便回了酒店只是用 Safari 上上网,也必须打开自己的 laptop 才能算真正的放松。更何况在这边买了《 StarCraft II 》,如果不在自己的 laptop 上也有诸多不便。所以,千万不能偷懒只带公司的 laptop ,我曾经有三次出差不带自己的 laptop 的经历,都不太愉快(当然也不是带了就一定愉快,还有很多其它因素)。我还曾经把公司的和自己的两台 laptop 都作为随身行李,结果旅途中和安检的时候都非常累。这次把公司的 laptop 随托运行李,所以很轻松。

其次是一定要早睡早起。这样白天精神好,应付工作不会觉得压力大。特别是从开会到中午吃饭聊天开玩笑都必须全程英文的时候,这种压力甚至稍稍超出了工作的范畴。早起争取的时间很珍贵。如果不是单独出差,那么同行的同事计划安排之间的一些冲突和摩擦是一种额外的无形压力,每天从别的同事起来的那一刻就扑面而来 —— 打到你房间的电话、在 lobby 商讨出行和会议的安排等等。比其他人都早起几个小时是一种非常大的优势,可以不受打扰的观察和思考全天的安排或者决定打扰别人(而比其他人都晚睡几个小时是得不偿失的,甚至是不可能的)。

最后,从睡眠的另一方面来说,越早消除 jet lag 的影响,也就拥有越大的优势。所以从踏上启程航班开始,就要严格按照目的地时间安排睡眠。

18 日清晨,步行去公司的路上。准备喝杯咖啡然后把停在公司停车场的车开到酒店。离回国的航班起飞还有 6 个小时。

准备启程

2011/05/06

度过了异常忙碌的一周。后天就要去美国参加公司的 Tech Summit 了。晚上把包收拾一下。这个是我自己的 MacBook Pro 。明天还要用内胆包带一个公司的 MBP 。如果只拿公司的本子,就会觉得晚上过的很没意思。