苹果条约

UPDATE:

有位叫做Lee Brimelow的Adobe雇员,号称Flash传福音者(Evangelist)。我最开始知道他,还是因为那篇提醒你包括成人网站在内的许多站点都会因为iPad不能浏览flash而出问题的blog。此次他在最新的blog之中痛陈苹果的这一行为“扇了开发者的耳光”,并且在文末直截了当地用“Go screw yourself Apple”来结尾。虽然他的个人blog不会代表Adobe官方的反应,但是Adobe显然不会比他高兴到哪里去。

我始终认为,彼此不兼容的虚拟机标准越少越好,如果一定要有,应该是一个开放的、不属于任何人的标准。未来的web不应该被Flash / Silverlight / Java Applet这样的东西占据,如果一个浏览器必须装上七八个不同厂商的插件才能上网,该是多让人悲哀的一件事情。

按照Lee Brimelow的说法,不同意他的都不是真·开发者。好吧,看来我是个伪开发者。


为了使用iPhone OS SDK给iPhone或者iPad开发软件,程序员必须在安装之前接受iPhone Developer Program License Agreement这个协议。此前这一协议的第3.3.1节是:

3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs.

翻译过来就是“应用程式只能按照苹果规定之方式使用官方API,并且不得使用或呼叫任何私有API”。

而刚刚发布的iPhone OS 4 SDK预览版则将这一节扩充为:

3.3.1 — Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs. Applications must be originally written in Objective-C, C, C++, or JavaScript as executed by the iPhone OS WebKit engine, and only code written in C, C++, and Objective-C may compile and directly link against the Documented APIs (e.g., Applications that link to Documented APIs through an intermediary translation or compatibility layer or tool are prohibited).

亦即“应用程式只能按照苹果规定之方式使用官方API,并且不得使用或呼叫任何私有API。应用程式必须原本以Objective-C,C,C++或者在iPhone OS WebKit引擎上执行的JavaScript写成,且仅有以C,C++和Objective-C写就的源代码可以编译并直接链接到官方API上(例如,通过一个转译中间层或者提供兼容性的中间层而链接到官方API上就不行)。”

用正常人(相对于程序员)的话来解释这一修改的意义就是,将来你若想给iPhone、iPad写个程序,就得用苹果规定的编程语言来写。世界上有多少种编程语言?数得出来的有超过五六百种。苹果允许你用几种?四种。而且其中三种的关系大致可以这么理解:C++和Obj-C是C向两个不同方向的变异、进化、升级版本,C是Obj-C和C++的始祖,也是两者的交集。如果你对自然语言学有点概念,这三种语言的关系很像拉丁语(C)、意大利语(Obj-C)和西班牙语(C++),不过这个类比最大的缺点在于拉丁语基本上死了,而C活得好好的。苹果允许你使用的第四种语言JavaScript——虽然名字里带Java这个字,但其实跟Java的联系并不比樱木花道和樱花的联系多——跟前面三种语言的差别相当大,最大的不同就是它只能在WebKit,也就是Safari用来把网页显示出来的组件上面运行。

这个规定非常有趣,因为在我的记忆里似乎还从没有什么人这样做过:用户很少、机能低下的冷门平台根本不必这么做,能有人愿意给它们开发程序就已经很不错了;而比较大众一点的平台都忙不迭地标榜自己的开放性,总结成四个字就是:任君调戏。呃,调试。看看诺基亚的S60就知道了:C++能跑么?能。Java能跑么?能。Flash (ActionScript) 能跑么?能。满足了?等等,你若觉得不够,它还能跑Python呢,而且如果你想写个能让XX语言也在上面跑的编译器,S60绝对欢迎。正常人都会试图提供更多选择以吸引开发者,而不是反其道而行之,将自己平台的开发方式加以严格限制。“我是个Java程序员,平生最讨厌的就是垃圾收集。你只让我用C++开发?那好,此地不留爷,自有留爷处。”——普通人是不希望开发者出现这样的想法的。

但乔先生不是普通人,iPhone也不怕没人开发程序。自iPhone发布伊始就有人哭爹喊娘的要给iPhone开发程序,没有SDK,自己黑一个出来也要做。看到粉丝的这种热情,教主决定让iPhone就此解禁,而一群人利用早先的SDK淘到第一桶金的成人励志故事,更是让诸多人打了鸡血一样投身到闯关App Store的独木桥上去。数量的增加往往会带来问题,其中之一就是质量的下降,这和世界上的很多事情都相通——比如,识字的人多了,书面语就会开始变得通俗,文言渐渐成了白话,后来连现代诗都变得人人会写,最终就产生了手机黄段子。

iPhone的问题是,当开发者变多之后,尽管有令人生厌的审核程序,App Store里还是挤满了垃圾应用。虽然这些应用没有android的market place里垃圾得那么纯粹,但仍旧是垃圾应用。这样的应用是怎么开发出来的呢?很大程度上是对于iPhone OS 的进一步“封装”和“转译”而来。请我的亲爱的忠实读者兼geek们回忆一下上一篇blog之中两个图灵机的视频。乐高图灵机和纸笔图灵机尽管工作原理不同,能完成的工作都是一样的:读0和1,并按照给定的规则写0和1。所以给乐高图灵机写的程序必然能转换给纸笔图灵机执行,反之亦然。这种性质叫做图灵等价,而各种计算机语言其实就是一台台看不见摸不着的图灵机,只是构造不同、理念不同、效率不同、封装点不同而已。所以我们可以做这样的事情:将一种计算机语言翻译成另一种,就像自然语言一样,一切可以说的,用各种语言都可以说。一切不可说的,我们应该保持沉默。不过,一如自然语言中从甲语言翻译到乙语言的过程总是会丢失一些东西,从别的语言转译,乃至用别的技术“自动生成”到iPhone OS上所产生的程序,通常会比较烂,尤其是那些对编程者的要求不高的搭积木式的工具。所以苹果此一限制的目的,实际上就是明确地说,为了保证原生程序的质量,请用原汁原味的苹果认可技术。为了不让其他更加流行但是容易质量低下的技术在iPhone os上出现,java和flash这样的翻译官也都当作汉奸,一律驱逐出境。你想开发Web应用,就用有标准,不受控的HTML 5和JavaScript。

一时间开发者界对此议论纷纷。有些人觉得老乔很过分,摧毁了一些他们喜欢的东西,或者干脆认为他疯了。但是最为中肯的评价,我觉得还是来自这一条文更动的发现者,以及这位文笔犀利的仁兄。如果你没什么编程经验,也不必去看了,只需要知道,这两位都觉得老乔这么做,没什么不对。

5 comments. feel free to add yours.

封装(下)

人类的先进或曰悲剧之处,在于积累知识和制造工具。故而历史上必定有过某一个时刻,一切被记录下来的知识还有被制造出来的工具,从此超越了人类穷尽一生能够掌握的界限。于是世上不再可能有真正的通才,而很久之后,当扔向天空的一根骨头变成了航天梭,我们发现自己面临着怎么向别人解释自己的职业这一难题。尤其是从事的职业缺乏可见成果时,能精确扼要地告诉外人自己的工作内容,几乎可以算是一种才华,正如把自己掌握的知识传授给别人同样是一种才华。

曾经给我买玩具的爸爸如今已经老了,也不再显得那么全知全能,虽然好奇心还是存在的。去年刚找到工作的那会儿,他老人家每次打电话时都会问,你的工作是干什么的?你的工作具体是干什么的?你的工作到底是干什么的?而我支支吾吾的回答永远无法令他满意:

“呃,我的公司是一个市场调研集团下属的…… 数据处理公司…… 我的职业是开发人员…… 嗯,就是写程序的。写…… 呃,结构化查询语言代码…… 和,唔,一种…… 脚本语言的代码。为什么要用两种语言?啊,好问题…… 不,代码不一定是程序…… 或者说代码不等同于程序,取决于你对程序这个词的定义。我用什么软件?和写字板差不多…… 不,不是word…… 我讨厌word,你最好也别用了…… 我做什么软件?这个…… 你听说过甲骨文吧…… 对,那个数据库公司…… 我跟他家的产品打交道。我写的代码在那里面跑。啊?那我为什么不去甲骨文?!呃,这个,我会用Google并不意味着我就具备能去Google工作的资质吧……”

凡此对话往复若干次,终究让爸爸放弃理解我的工作细节的努力。虽然后来我意识到,这些问题背后,他最好奇的那个元问题其实是:“你回国的话,能找到工作吗?”,而且这个问题的答案,并非我说他就会信,而必须是经由他自行分析我提供的信息得出来的才可以。这种行为背后的逻辑,就是遇到想要了解的东西,能拆开的一定要拆开,能追问的一定要追问。我不能幸免地继承了这个打破砂锅问到底的习惯,这造成了我人生的许多困扰,也导致我在修电脑、做好人的泥潭里越陷越深,只因电脑作为一口砂锅,可以碎成太多块了。

在你面对的这台电脑里面,有一根或者几根内存条,每一根上面都有几十亿个晶体管。在某一刹那,两个彼此相邻的晶体管,一个存放着1,另一个也存放着1。或许这一个里面正在流通的电子总量要少于那一个,但对于内存控制器来说,它们都是1。不过,尽管它们彼此紧邻,值亦相等,却有可能一个属于你正在看的那张美女图的敏感部位的一个像素的绿色分量,另一个则属于你正打算完成的那篇金融学作业的电子文档的脚注。从硅片上的电路到荧幕上的色块之间发生了很多事——因为实体内存有限,而你的贪欲无限,所以计算机被设计得极为复杂,以便让有限的资源满足你又要听歌又要看美女又要写作业的多任务需求。在单独一台计算机上进行所谓“多任务”其实是相当虚妄的东西,因为在某个特定时刻,一颗CPU只能做一件事。所幸欺骗人类大脑很容易,与电影院每秒播放24帧静态图像就能让观众产生“动画”的错觉原理相似,操作系统高速地在不同的程序之间切换,你就产生了它在同时做许多事情的错觉。但是,为了高速地在不同的程序之间切换,内存条必须在逻辑上被分割开来供给不同的任务使用,比如浏览器甲使用二百兆,字处理软件乙使用八十兆,音乐播放器丙使用二十兆。但是浏览器和字处理软件和音乐播放器都不是省油的灯,我的意思是,省内存的软件,以为用户服务的名义,它们都不觉得再多要一点内存有什么错。“操作系统先生,我是chrome,用户打开了一个叫做pornhub点com的网站,请再给我十兆内存,谢谢。”“操作系统先生,我是flash,chrome告诉我说用户要播放一个视频,请再给我二十兆内存,谢谢。”操作系统先生忙得面红耳赤,心神不宁,眼看着实体内存就要用光了,而手下还有一堆嗷嗷待哺的后台进程,只好瞒天过海,把那些之前以用户目前没有在使用的程序所需要的内存内容先放到硬盘上,等用户切换回去的时候再把它们调回来。但是这一切都不能让程序们知道——对于每个程序来说,能使用的内存空间都是从0到某个2的n次方值,可是这只不过是操作系统捏造的假象罢了。数据事实上被存放在内存条的哪里,什么时候被移到硬盘上,什么时候又会被移回来,都是它们不可知的事情。于是内存上的两个小小的可怜的不起眼的晶体管明明彼此相邻,但是命运让它习惯向左走,它习惯向右走,它们始终不曾相遇。

问题是,除了病毒木马之外,普通程序对于实体内存的分配结构也的确毫无兴趣——它们自己有更多需要操心的事情,比如怎么解压那段mp3,怎么给这列单元格求和,怎么发现你输入的那个单词拼错了,还有很头痛的怎么跟别的程序通信。这些东西,经过层层包装和抽象,已经和那两个小小的晶体管没什么关联,就如同写在书上的思想同化身为纸张的那些树木没有什么关联。0和1不一定要用晶体管或者真空管存储,用乐高积木也可以:


乐高积木做成的图灵机

或者干脆就写在纸上:


最为接近原始设计的图灵机,使用纸带和笔

而且计算机并不一定得是二进制的,世界上也有过三进制计算机,如果当初这玩意能幸存并且发展下来,没有什么理由怀疑有什么事情二进制计算机能做到的它却不能做到。因为高层的东西不依赖于底层而存在,底层向高层封装自己实现的细节,这是一切计算机设计的基本理念。作为科学的计算机学和作为工程学的计算机制造业之间的耦合因此其实很松散,Computer science is no more about computers than astronomy is about telescopes,荷兰科学家Edsger W. Dijkstra曾经如是说。

当计算机告别它那个用户全都是程序员的襁褓时代,程序员们发现自己除了要理解比较低级的封装,还要制造更高级的封装,而最终目的就是如何让非程序员的用户们不必去理会什么内存管理、任务调度和网络通信,而是简单地按下一个按钮就能完成一项工作,从而让克拉克第三定律——any sufficiently advanced technology is indistinguishable from magic——锦上添花。不过,这群程序员“协同”得并不轻松,因为每个程序员对“封装点”或曰“抽象层级”的容忍程度都是不一样的,所以喜欢和电脑打交道的层次也不一样。对于许多人来说,超出其舒适范围的抽象点都是可鄙的,不管更高还是更低。代表性的言论比如:“我亲手写代码,架构师那套都是花架子” vs. “我只负责设计,写代码是民工的事。”,或者“JavaScript 是玩具” vs. “写C的都活在石器时代”。一个比较泛化的版本是,“某某工具吸吮”,这里的工具可以是代码编辑器,或者某种编程语言,或者某种编程范式(programming paradigm)。吸吮的原因一二三四五,必然有跟复杂性隐含太多/暴露太少相关的一条,就好比美女穿衣服,登徒子会觉得穿太多,卫道士会觉得穿太少。

我朝出过很多古人,说过许多经典的话,可惜我最喜欢的一句不知道是出自谁口。这句话是:自己撒泡尿照照镜子。我喜欢这句话的原因是,除了能够用来嘲笑他人之外,这句话尚有很强烈的自省作用,盖因撒尿是很私人的事情,便溺又是龌龊的东西,所以默念这句话,可以提醒我要在私底下看到自己的龌龊。每当我心底涌起一股对超出自己容忍范围的封装点之嫌恶,我就会默念这句话,提醒自己所知甚少,阅历不够,这种情绪对步入中年人生于事无补。

当然,嘲笑他人同样是非常重要的。何况我们多数情况下只是想要吐槽罢了。这世界上有许多事情是我们没有精力和兴趣去弄明白的,如果连笑一下都不行,还不如去革命算了。

there's only one comment. feel free to add yours.

封装(上)

我觉得小孩子对待玩具乃至“器物”的态度,归类来说就是两种:爱惜型和毁坏型。继续细分当然也是可能的,不过作为人类二分法专家,我倾向于认为最基本的就是这两类。有些人五岁买的布娃娃可以保留到三十岁,虽然褪色但是干净而完整,这样的孩子属于爱惜型·珍藏派;另一些人则可以把祖传三代的闹钟拆到不能继续分解为止,也许还能装回去,但是最后会多出几个零件来,这样的孩子属于毁坏型·分解派。毫无疑问,爱惜型的孩子养起来比较省钱,也很可能比较省心。我的父母当初是多么地希望我是爱惜型,我清楚地记得六岁前后的一天,我爸爸指着我的玩具箱——某个巨大无比的日立电视机包装箱——痛心疾首地说:“你看看这里面的玩具,有一个完整的么?”,而我只能羞愧地低下我的头。

我倒并未因此就失去了继续得到新玩具的资格,这一点我必须感谢我的父母。而且有时候我想要的玩具并不是他们的工资能承受的,可最终他们还是给我买了。我知道世界上有很多这样的故事,所以不再赘述这里面蕴藏了多少爱。我想强调的是,让孩子按照其自由意志成长是很重要的事情,如果你的孩子是毁坏型,就不要试着把他强行转化为爱惜型,因为那就和强行要求左撇子用右手写字一样残忍。童年是毁坏型的人长大之后,或许留不住一件可堪传给后代的玩物,不过除非他属于毁坏型·凌虐派,否则他很可能从拆拆装装之中获得了一种能力:解构。

旅游书上说德意志博物馆至少需要一天时间,可我在慕尼黑的时候只有半天时间留给它,所以不得不放弃了很多东西,只是着重看了航空馆和印刷馆。航空馆激动人心的Me262和F104略去不提,在印刷馆里,大致按照编年顺序,有印刷业使用过的工具从古至今一一陈列。古代的工具很好理解,甚至可以用文字记录和解释,比如原始雕版印刷的工序:

  1. 用蜡蒙住一张金属板,用炭灰将蜡层涂黑
  2. 在蜡层上刻以文字或者图像,深及金属板表层
  3. 将金属板浸泡在腐蚀性液体之中,蜡层被剔除的部分即被蚀刻
  4. 融去蜡层
  5. 在金属板上涂墨
  6. 压纸,印刷

现场有一个微缩模型来展示这个过程,但其实仅凭这段文字记录,也已经足够将整个流程复原。不过,接下来的几件展品,包括活体字模和一台有着若干曲柄、平板、橡皮滚筒、皮带轮,顶端还有一个圆盘的机器,就不太能直观地看出来运作原理。所幸我之前看过这样的一个视频,所以大概能明白各个部件的作用:


KLUGE from Northern Lights on Vimeo.

此时的工具已经相当复杂,但还是可以被我理解。与其并列的若干机器,尽管复杂性逐渐增加,也仍旧只需要阅读一下说明,仔细观察一下它的结构,理想情况下如果能让我拆开来,就可以大致明白它的运转状况。比如这台排字机器:

Monotype Typesetting Machine
Monotype Typesetting Machine
The Monotype Corporation Limited
Salfords, Surrey, England, 1965.
德意志博物馆

Update:碰巧在youtube上看到了它的工作状况:

问题是,当这样一台机器摆在面前的时候,我就很难明白它是如何运作的了:

Photo Typesetting Machine Digiset 400T2

主要的困难在于,这台机器被一个方盒子装了起来。功能性的部件被包裹,从外部可以看到的就是这么一个硕大的方盒子,以及那一小块控制面板。与它裸露着金属骨骼的前辈相比,这个东西看起来很神秘,而复杂的感觉,倒是大大降低了。虽然这是一个假象:盒子里面的东西其实非常复杂。这个玩意很显然是用电的,所以里面会有布线。这是一台光学排版仪器,就还可以推定里面有磨制好的透镜和相应的机械部件。简而言之,方壳子下面是一套高度复杂的机电设备,制造这样一个东西的难度,会比那台Monotype排字机器高很多。但是因为这个盒子的存在,这一切被隐藏了起来,留给用户的只是那个控制面板,当然还有相应的输出口。操作这台机器的难度和它的前辈相比已经降低了——比较古老的机械设备需要手脚并用,并且很显然需要花一些力气,精神也需要集中。而到了这台机器的时代,这个过程只需要按几个按钮。不过,这台机器的使用难度的降低,也同样就意味着其维护难度的增高:在电影《Seven Pounds》里,威尔·史密斯花一整夜的时间修好了一台机械式印刷机。试想如果那台机器是这样一个东西,恐怕这样的情节就不太符合常理。

也难怪这台机器之后的展品只有一件:一台苹果计算机。印刷业与电子计算机的结合,乃至许许多多其他传统工艺与电子计算机的结合,都多多少少造成了这样的一个尴尬境地:对细节和复杂性的封装到了如此高度,以至于没有什么可以展示的了。乐器博物馆里能够展出竖琴提琴羽键琴,人们会仔细观赏它们的美。模拟电子合成器也值得一看,毕竟它还有那么多旋钮和发光二极管。但是到了电子键盘和电子计算机的组合之后,又还能展示什么呢?虽然音乐技术显然没有就此停滞不前,但是它发展的方向和技术进步的程度,已经超越了普通人的认知范围。

电子计算机本身的发展同样如此,只不过,和六十年前的印刷机相比,六十年前的电子计算机已经属于常人不能通过观察、依靠简单常识而理解的东西。虽然从本质上来说,电子计算机的工作“概念”和用手指计算数字并无区别,就如同印刷机的工作“概念”和用手在纸上按一个指纹并无区别,但是“计算”这件事是个抽象的过程,“数字”也是抽象的概念,认知抽象概念的能力,乃至认知抽象概念之变形的能力,都需要知识的积累和一定的智力,故而理解什么是二进制,比理解什么是凸版印刷要困难一点。有些人,比如我,可能一辈子都没办法弄明白“虚数”或者“自然对数的底”这种东西的意义,即便其定义看起来是清晰的。除去教育的原因,智力也是个问题。

童年终结之后(虽然有些人认为男性的童年永远不会终结),拆东西的习惯被我保持了下来。经验告诉我,把尚能正常运作的东西拆开会遭到人类社会的惩罚,我必须忍耐着直到它们坏掉,才能去拆一拆以探究竟。但并不是每天都有东西会坏掉,我故而不得不通过组装东西来转移自己的注意力,由此开始喜欢做模型。直到后来我有了一台PC——也许可以算是父母给我买的最后一件玩具。和我此前拆过的那台山寨Apple II的中华学习机不同,这个玩意拆起来很容易,装起来也很容易,但是,过来人都知道,拆拆装装过几次,你就会觉得厌烦,因为没有什么挑战性可言,而且通常需要拆的电脑里面都很脏。拆电脑遂变成了一件体力劳动,甚至不及拆一只walkman更有成就感。当然,以拆电脑为借口去女生宿舍参观另当别论。

电脑修得好 好人当到老

拆计算机很容易,是因为计算的各个组成部分都被做成了独立模块,彼此通过各式各样的接口连接在一起,而这些模块本身又是由更小的模块构成。换言之,计算机的每个组件都试图将自己的实现细节对其他组件隐藏起来,两个相关组件只需要通过预先约定好的方式互动,或者说,每个组件都被“封装”了起来。这并不是什么特别的事情,许多东西都是如此,但是电子计算机是非常极端的一个例子。不妨数一数,这样的封装有多少层:

  1. 电子在半导体(硅)上的晶体管中流动,晶体管构成的逻辑门将其封装为两个离散的状态:高电压和低电压,分别代表0和1。
  2. 若干逻辑门构成一个逻辑电路单元,比如可以做二进制加法的加法器,或者可以保存状态的存储单元。
  3. 包含若干逻辑电路单元的硅片与金属引脚相连,包上一层塑料或者陶瓷,成为一块芯片。
  4. 芯片和芯片彼此通过印刷电路板相连,形成最基本的硬件核心。
  5. 依据芯片所提供的可以接受的指令集,在硬件核心上存入一些预先编好的简单程序。
  6. 用这些比较简单的程序生成其他的更加复杂的程序。
  7. 某个程序可以检测到你的手移动鼠标。某个程序可以在屏幕上画图。另一个程序可以从网上抓一段数据下来。

这些封装使得你能够点几下鼠标,然后在youtube看一段笨猫钻箱子的视频。对于最终用户来说,电脑呈现在面前的,只有鼠标、键盘、显示器、音箱而已,一切不需要你关心的细节,都被隐藏到了用户界面的后面。甚至可以说,当细节不得不被暴露出来的时候,往往也就是普通用户最痛苦的时候——

Windows Error Message

不过,对于喜欢拆东西的人来说,知道哪些东西被封装了起来,乃至知道封装的方式与思路,是很有趣的一件事情。

(未完待续)

3 comments. feel free to add yours.

慕尼黑

由于阿尔卑斯山北侧吹下的燥热焚风(Föhnwind),阴雨天气很难在巴伐利亚州落脚,晴朗通透的蓝天白云,总是主导着这个德国面积最大也最为富庶的联邦州。正因如此,巴伐利亚州的旗帜才是蓝白相间,巴伐利亚马达制造厂,也就是宝马公司,才会有那样的logo。

Munich & Alps HDR
阿尔卑斯山的焚风吹散天际的乌云 / 摄于慕尼黑新市政厅塔楼

巴伐利亚人的性格或许也是受到这样的天气影响,不似德国其他地方的人那样保守而阴郁,而是多了几分爽朗和自由——须知曾经普鲁士治下的北德意志联邦旗帜颜色是黑与红,铁与血。只可惜一百四十年前,那个曾经的巴伐利亚国王路德维希二世,在普法战争之后拱手将普鲁士威廉一世推上德意志帝国的王座,巴伐利亚才成为了德国的一个邦,直到今日。除了这桩赔本生意,路德维希二世得以留名于世,更主要是因为他修的一座城堡。


Neuschwanstein
新天鹅堡 / 作者:jeffwilcox

在迪斯尼之前,完全从审美而非实用性角度出发所设计的城堡,也许并不只有新天鹅堡一座,但新天鹅堡想必是最为著名的一座。不过德国人自己似乎并不怎么热衷于这座城堡,我出发前向同事提起行程,做了十几年神谕开发的老头呵呵一笑,说:那地方是日本人的。我去时也许是因为时间太早,尚不觉得,进去之后参观完出来,才看到果不其然,停车场里一辆又一辆巴士驶来,成群结队下车拜山头的,都是衣着光鲜,表情呆板的东洋人。新天鹅堡在早逝的国王心目中从来不应该对公众开放,而是他臆想中自己作为一个中世纪国王之禁脔。可惜他到死都没有看到城堡的所有房间完成装修,而这个金玉其外的半拉子工程在他死后不久就对公众开放,一直延续到了今天。讲解员MM和蔼可亲,德语略带着有趣的巴伐利亚口音。城堡内部说实话其实没什么可看的,仅以奢华而论,也就是我朝穷困县的一座政府大楼水平。看来在挥霍民脂民膏这方面,德国人从古至今都很逊。

路德维希2的阳台
新天鹅堡中王座厅窗外的景色

后来我就去了慕尼黑,一路上白雪覆盖的丘陵与丛林,映衬着远处的山岩,美不胜收。

副驾驶最好看风景

慕尼黑是个有活力的城市。青年旅馆的前台mm会说日语。宝马博物馆的售票处中文告示缺几个字。入夜之后在Hofbräuhaus里喝到酩酊。夕阳西下中在奥林匹克公园里走到腿断。被冠以“德意志”这个头衔的博物馆居然只有自然科学和工程方面的展品——这是一个怎样的工程师民族啊!

不过我还是觉得科隆更好。也许是因为去科隆时是个夏天。也许是因为科隆与这座百万人的村庄相比更像个城市。更有可能的是,虽然这是Priscilla来过的城市,而我仍旧在因为未能与她同来而感到遗憾。

2 comments. feel free to add yours.

琐事16

小时候我家住在兰州,而且因为父母都是化工厂的工人,实际上是住在兰州的郊区。我爸爸还小的时候,奶奶就已去世,而我出生之后未满一岁时,爷爷也去世了。所以大周末的时候我们三人常常会去姥姥家住一晚,春节的时候,也肯定都会去姥姥家过年。姥姥家离市区比较近,我们总要坐大概两个小时的公共汽车才能到。大部分时候是我和妈妈周六去,然后周日再回家。

那时候老人们的身体还不错,姥爷是个钓鱼爱好者,经常骑车几十公里往返,带回来几条跟我差不多高的鲶鱼。姥姥腿脚也还利索,会给我做很多好吃的,还会带我去楼下的公园玩。姥爷和姥姥非常重男轻女,有三个儿子,一个女儿。因为儿子多,对女儿就不太在乎。我妈妈总是回忆说,小时候哥哥弟弟们都吃完了饭,才能让她去看看锅里还有没有剩的。自然也没有新衣服这种概念,都是穿兄弟们打了补丁的旧衣服。被教训起来也是毫不留情面。后来连爸爸妈妈的婚事,姥爷也是很反对,因为他是根正苗红的贫农出身之解放军师长,我娘好歹也算个高干子女,而我爷爷却是个地主,我爸爸还没有娘,看起来家教不良。爸妈结婚之后,老丈人家和女婿的关系也很紧张。不过事情的发展总是很戏剧性的:后来长子生了个孙女,次子也生了个孙女。我妈排行老三,生了个儿子。于是我父母回姥姥家的时候,待遇就略微提高了一点;而最终我的小舅舅也给二老生了个孙女。我爸爸说,我表妹降生的那个周末,他带着我去姥姥家,一进门就感觉到气氛有微妙的变化。他们两人在姥姥家的地位,从此得到了彻底的改善。后来我渐渐长大,也感受到了姥姥重男轻女,我和姐姐吵架,姥姥总是向着我。我不高兴,就会得到软语相劝,我承认错误,就会被欣然原谅,而我姐姐就会被冷落和痛批一顿,respectively。我年幼的ego被严重地膨胀了,现在想起来,愧对我姐。

我姐总是带着我去吃好东西,打游戏机,逛街。我妈说那还不是你姥姥给你十块钱,你姐就赶紧想办法沾你的光一起花掉。我说这也是不错的事情啊,至少我也吃到了好吃的,玩得很开心,而且最重要的是我一个人想出门是不可能的,必须我姐带着。第一次打电动就是我姐带我。还有第一次去有迪斯科的溜冰场也是。过年自然更要一起出去放炮。小时候我怎么那么喜欢放炮呢,两口袋里揣满拆散的大地红,炸翻一切路上能见到的空罐头和啤酒瓶。用彩明珠当机关炮,表现出严重的攻击性。如果不是我姐劝着我,也许早就把自己的眼睛炸瞎了。

后来到了九三年,我十岁。姥爷身体不如以前了,姥姥也渐渐地足不出户。爸爸妈妈申请了去天津建设新化工厂的名额,直到批下来才告诉姥姥和姥爷。好像也是被阻挠了一阵子,不过父母还是毅然决然地决定要搬家。我停了学,被放在姥姥家一个礼拜。他们包了一个集装箱,所有的家当都装进去运走,于是当我再回到家时,家里已经什么都没有了。然后三个人和其他十几个一起调动去天津的人坐在火车上,花两天三夜坐到天津。天津大港那时候还是个很荒凉的地方,我们在一个小宾馆里住了几周,等集装箱到了,才搬进公司分的新房子里去。那是个新建的家属区,周围什么都没有,站在阳台上向东望去,只能看到无边无际的鱼池和芦苇荡。九四年第一次没有在姥姥家过年,觉得很新鲜。从兰州来的五六家人都是在天津举目无亲的状态,所以就凑在一起,包饺子,看春晚。那时候我是多么地爱看春晚。

然后我独自回了一次兰州,大概是九五年。还是住在姥姥家,除此之外似乎也没什么别的地方可以住。姥爷的身体已经差得不成样子,瘦得皮包骨。姥姥也只能拖着一条不灵便的腿,在三个屋子和厨房之间慢慢地走来走去,照顾姥爷,张罗家务。去以前的家门口晃了晃,铁门紧锁着,我也没敢敲。然后回到天津,别人问我天津和兰州哪边好,我还是坚定地说,兰州。

后来又和妈妈一起回了一次,哪一年也记不得了,只记得是个冬天,发生了非常严重的不愉快的事情。妈妈哭着回了天津,那也是我最后一次见到姥爷。我高中的时候,姥爷去世了,好像是个冬天,妈妈自己飞回兰州去参加葬礼。后来我考上了大学,去长沙念书。大学二年级的时候,已经瘫痪在床的姥姥被接到天津,在我家住了一段时间。我从学校回来,看到躺在床上、一目失明、四肢枯萎的姥姥,抱着她痛哭了一场。后来姥姥被送回兰州,几年后在那里去世。妈妈就又回去了一次。而我再也没有回去过,而且似乎连回去的理由也就此断绝了五成。那时候姐姐在北京上学,还来过我家两次。后来她又去了广州。最后,大舅去世了,她就回了兰州,陪着我舅妈。那些年的春节都是三个人过的,仍旧去邻居家吃饭,不过散了席,终究是一家人过。零四年我离开家去学校,再回家时,自己住了两年的小房子已经被卖掉。零五年,我家搬到了另外一个小区,过去春节会在一起的人,也都分散了。全家团聚这个词汇曾经代表的盛景不复,我也早已不再觉得春节有什么意思。从家里有了一只56k的调制解调器开始,我似乎就宁可在大年夜等待网页的缓慢刷新,也不想去放炮或者看春晚。

零六年九月,我来了德国,到今天为止的四次春节,我都没有和父母在一起过。我甚至不太记得前三个春节我都在哪里,做什么。哦,零九年一月二十六日,正月初一,我上午监考,下午跑去海德堡面试。我记得这件事并不是因为它有多令人难忘——虽然它的确比任何一场春晚或者任何一顿饺子更令人难忘——而是因为我写了blog来记录这件事。你看blog是多好的东西,有助于我在这永远没办法理清头绪的人生里刻舟求剑。遗失的春节是没办法找回来的,虽然主观上我没有什么找回来的愿望,我仍旧希望明年可以不必再遗失。

这个二月,德国一直在下雪,从早到晚,硕大的雪片纷纷而落,无休无止。大年初一那天,我出于无聊,决定去附近的一个水库转转。水库在黑森林腹地,联邦大道500号转州道83号,30分钟车程。天气阴霾,一路上在山间旋绕。路过热闹的滑雪场,满是兴高采烈的大人带着一群孩子。你说我要是也有个兄弟姐妹多好呢,不至于独自在外冷冷清清,父母在家也是冷冷清清。

let it snow

回家的路上终于出了太阳,银装素裹的林木,和掩映在山间的村庄屋顶,都罩上一层金色光辉。可惜美景只有一瞬,五分钟之后,那个铅灰色的德国天空又回来了。

大家春节好。

10 comments. feel free to add yours.