2009年6月29日星期一

影评:白夜逃亡

white_nights_ver1.jpg
在我读初中的时候,电视上常常放一只MV,莱昂里奇的《Say You, Say Me》,那个时代的人应该都很熟悉这首歌了。的确是非常好听的歌。而且通过字幕介绍,很多人都知道这是一部叫做《白夜》的电影的主题曲,也知道这首歌得到了那届奥斯卡的最佳歌曲奖。

不过应该很少有中国大陆人看过这部电影吧。这部讲述前苏联的叛逃艺术家的电影,即使在苏联解体20年后的中国大陆,依然是非常的政治不正确。

电影的故事是,一个8年前叛逃离开苏联的芭蕾舞演员在表演旅行途中遭遇飞机事故,迫降在了苏联。苏联文化部官员如获至宝,于是使出了威逼利诱的手段,逼迫这个舞蹈演员重新在苏联演出。当然,苏联文化部并不关心舞蹈艺术,他们只关心这个演出的政治意义。他们安排了一个从美国叛逃来此的美国踢踏舞演员和他一起练习。可是在练习的过程中,美国踢踏舞演员对于自由舞蹈的向往却被逐渐唤醒了。在他发现自己的妻子已经怀孕后,他的希望被彻底点燃,于是他联手芭蕾舞演员一起逃亡。

电影中有不少段落都让人印象非常深刻。例如,这个世界第一的芭蕾舞演员悄悄潜入舞蹈学校的儿童班求助时,那群孩子们虽然熟知苏联现在的芭蕾演员,却对这个曾经在苏联享受盛誉的芭蕾演员一无所知。在苏联的记忆中,他已经被抹去了。

踢踏舞演员在没有人的时候,听着叛逃者从美国带来的舞曲,开始忘我的即兴舞蹈。叛逃者找到自己当年的搭档现在芭蕾舞团的领军者,对她说,我只能自由的跳舞,看着我。然后他高高的跃起。这两段舞蹈都让人心神迷醉,自由的天性是如此的美好。

几乎是与之相对的,文化部官员,虽然大部分时候都面带微笑,然后却让人心里发毛,仿佛面对黑暗中以腐肉为食的某种动物。他们总是威胁、监视、跟踪、嘲笑,然后期盼着上级的赏赐。

在他们的手中只有两种选择,被流亡,或者为他们营造盛世的光景。然而就算留下来作了芭蕾舞团的领袖,当文化部官员把手伸到你的裙子里来时,你也只能别过头去。

所以,你看,这个电影远远不只是政治不正确。他所展示的一切,今天或许已经不存在莫斯科或者列宁格勒,但是这个系统还确确实实地存在着。

白夜,是指前苏联在北极圈内的部分,整个夏天,太阳也不会落下,就算在深夜里,依然被太阳照得犹如白昼。这是一个明显的暗喻,并且暗喻着,白夜无论多长,也有结束的时候。

电影中,最让我心动的一段是,这个芭蕾舞演员独自走上宏伟的大剧院的舞台,面对空无一人的席位,他扬起手,跃起,然后停下。反复几次,也无法继续,只能依着台柱泪流满面。

看着这个满面泪水的人,就不由得想,白夜还是快点结束吧,乘还来得及的时候。

Posted via email from 若昔难得

2009年6月27日星期六

锤子

昨天我妈跟我打电话的时候,通报成都的新闻,说有一公交车下坡的时候,刹车片产生的焦糊味被车上的乘客闻到了,大家一片惊恐,欲夺门而逃,人多门小出不去,大家就抡起锤子来把车窗砸了。

这并不是唯一的误砸车窗的新闻了,最近已经有若干次公交车上的人闻到异味就把车窗砸了的事情了。

讲这些新闻的时候,都要补充一句,这不是笑话。因为在这之前已经有很多拿锤子和车窗说事的段子了。成都人胆小怕事,遇上点事就紧张,摸爬滚打狼狈不堪后,心情平稳了,幽默的天性又上来了,转过脸来就把糗事按隔壁王二麻子头上来开涮,当然这也是自嘲。

有一个段子是,某姑娘的屁股在公交车上遭遇咸湿手,姑娘大叫,“冒火了哈,摸锤子。”车上众人就抡起锤子把车窗砸了。

用锤子说事的段子在外省人听来大概都不会太容易理解。例如上面这一则。姑娘说的“冒火了哈”还容易理解,“摸”是咸湿手的动作,那“锤子”是什么意思呢?

锤子在四川话中用来表达一个强烈的负面情绪,类似英语中的Damn或者Hell,只是这个词更加粗鄙。

我小时候品行端良,是标准好儿童。家长教导,锤子是句怪话,不能说。所以在我几乎没有说过这个词。不过年纪稍长的时候,还是会暗自捉摸一下这词的本意是个什么意思,特别是在我的青春发育期,就更容易想到这个问题了。

我高一的时候,托两年前的福,学校安排学生到附近的部队营地参加军训两周。军训嘛,就是大太阳天,大家站在水泥地上,来回走,一二一。旁边一个部队排长做指挥,噼里啪啦的。

班上有热血青年,遇上这种军事化活动,澎湃的荷尔蒙就转化成热血了,跟着排长作指挥,也对其他同学大声呼喝。

一次,热血青年飙了,呼喝中用了大量的粗鄙词汇,例如,“你们锤子走好点嘛”之类的。当然,实际中,他用的粗鄙词汇的频率远远高于我这个例句。排长也被刺激到了,他对我们的热血青年说了一句让我牢记至今的话。他说,“你再说一句锤子,我就让你摸着锤子站到一边去。”

我们的热血青年马上就不说话了,实际上是整个班都没人说话了,顾不上了,每个人都两眼冒光的回味排长的这句话,他在这句话中,把这个带有禁言性质的词汇,从他的修饰意味直接上升到了他的本质。

这印证了我的猜想,锤子的本质,是男性人类身体上,可以用自己的手触摸到的一个器官,并且在大众面前与这个器官相关的行为动作会被视作一种侮辱。这也就解释了为何这会变成了表达强烈感情的词汇,就像“操”和“F”一样。

这个转义是我后面明白的,当时站在那个水泥地操场上,我完全沉醉在满足自己青春发育期的好奇心上了。

另外,军训,是男女分班训练的。所以刚才那个故事中,无论是热血青年还是排长在说锤子的时候,旁边都没有女生在。实际上,我认为现在成都街头的女孩子也很难说出“锤子”这两个字,说笑话的时候除外。

Posted via email from 若昔难得

回忆Black Or White

Michael Jackson突然去世,网络上一片唏嘘。煎蛋网上也转贴了一个MJ经典MV合集。

帖子上放了Black or White说:
前一分钟很有意思。

我还以为那是我没有看过的视频呢,打开一看,还是那个看过无数次的Black or White。这算什么意思,这叫好像在说,星球大战的秘密是他们是父子。

煎蛋不是以新鲜有趣见长吗,怎么也说出了这么火星的话?

然后,我才想起,这其实已经是80后90后的网络了,而成天泡煎蛋的我不过是一个有童心的老家伙而已。

实际上,昨天,我在youtube上看了很长时间的MV,当然也包括这首Black or White。前一分钟并没有让我觉得有意思,我只是在想,这是当年的金童麦考金啊,用Along Home和My Girl引来无数跟风宝贝片的麦考金啊,他后来又如何了呢?

还有最后的大变脸,依然让我赞叹。煎蛋的帖子上完全没有提到这一段。Morph效果现在在自己的PC里装个小软件就能做了。可是当年,他对我们来说是如此的不可思议,就像多年后的孩子们在黑客帝国中见识了子弹时间一样。

在我读初中的时候,市面上就能见到《The Bad》的磁带了,中文翻译为《真棒》。这个翻译在很长时间内一直让我们迷惑,Bad还有棒的意思吗?

可是没有Video的Michael Jackson不算是真正的Michael Jackson,虽然那时候偶尔也能在电视上看到电影版《Moonwalker》的片段,但时间也很短。

后来到了80年代末,终于有了卫星电视,和随之而来的MTV。

我们守在电视机旁,静静等待那些听说过的大牌名字,U2、Guns & Roses还有Michael Jackson。然后第二天在学校里再去和朋友交流,昨天我在MTV里面看到什么了。

而在那个时候,《Dangerous》发布了。我的一个朋友详细地跟我描述这个MV中先后出现了什么,从最初的高速运动到吉他炮到民族舞到最后的变脸。然后我就一直守着MTV,等等那只传说中的MV。

所以,虽然Michael Jackson最成功的专辑是Thriller,最有影响力的作品也是这张专辑中的Billie Jean或Beat It。可是我认为对于我们这一代的中国人来说,最熟悉最喜欢的Michael Jackson专辑多半是The Bad或者Dangerous,这取决于是在什么时候接触到了Michael Jackon。

Posted via email from 若昔难得

posterous:发布照片

这次通过Gmail发布。

Posted via email from 若昔难得

用email发布

Play slideshow Save all photos Want to save all these photos at once? Learn how
Online pictures are available for 30 days
 
BSP的问题困扰了我一段时间了。最看好的blogger.com和wordpress.com无法从国内访问,而我又懒地在家里上tor,毕竟在公司里没有GFW的问题。我习惯使用的Live Spaces虽然可以在国内访问,但是我的帐号被盾了,而这个Live Spaces还绑定在我最常用的Live帐号上,我不打算更换帐号。
 
之后也尝试了一下用tor来上blogger.com或者wordpress.com,实在太慢了,难以忍受。
 
今天决定试试用email来发布。这才发现posterous.com貌似很不错。
 
除了网站很易用外,还可以发布到常见的SNS网络、BSP和媒体服务。
 
这封信是用Live Mail写的,寄给了blogger.com、wordpress.com、我的Live Space和posterous帐号。
 
而posterous帐号还链接了我的FriendFeed、Twitter、Blogger.com、Wordpress.com、Flickr、PicasaWeb。
 
这里再贴张图片试试,Live Mail的图片功能很强大,不过用来像这样发布blog,大概不是很合适。试试看吧。

Posted via email from 若昔难得

用email发布

Play slideshow Play slideshow Save all photos Save all photos Want to save all these photos at once? Learn how
Online pictures are available for 30 days
 
BSP的问题困扰了我一段时间了。最看好的blogger.com和wordpress.com无法从国内访问,而我又懒地在家里上tor,毕竟在公司里没有GFW的问题。我习惯使用的Live Spaces虽然可以在国内访问,但是我的帐号被盾了,而这个Live Spaces还绑定在我最常用的Live帐号上,我不打算更换帐号。
 
之后也尝试了一下用tor来上blogger.com或者wordpress.com,实在太慢了,难以忍受。
 
今天决定试试用email来发布。这才发现posterous.com貌似很不错。
 
除了网站很易用外,还可以发布到常见的SNS网络、BSP和媒体服务。
 
这封信是用Live Mail写的,寄给了blogger.com、wordpress.com、我的Live Space和posterous帐号。
 
而posterous帐号还链接了我的FriendFeed、Twitter、Blogger.com、Wordpress.com、Flickr、PicasaWeb。
 
这里再贴张图片试试,Live Mail的图片功能很强大,不过用来像这样发布blog,大概不是很合适。试试看吧。

2005年3月4日星期五

《ASD》设计模式:Observer

Observer模式稍稍有点复杂,但是由于他的作用如此强大,所以几乎在所有的带有分层概念的系统中都必须使用。
带有GUI的软件几乎都有分层的概念,界面是一层,逻辑实现是一层。所以他们也就成了最常见的Observer模式的例子。
不过Observer模式的用处要比单纯的GUI要宽广很多。Observer的应用环境是,有上下两层模块,下层模块的数据会自发变化,上层模块必须响应这样的变化,但是上层模块不知道下层模块会在什么时候变化。这种情况下就应该使用Observer模式,上层模块让下层模块知道自己的存在,然后在下层模块在变化的时候通知上层模块。
Observer模式的另一个比较有趣的别名是Hollywood模式,因为这个模式可以被描述为“Don't call me, I'll call you.”。
由于Observer如此的常用,所以在实际的使用过程中,这已经是一个烂熟于心的模式。《ASD》一书在讲述这个模式的时候,也没有多少新意,但是还让我有一些点滴的感想:

- Observer模式是典型的由DIP原则驱动的模式。无论是上层数据的变化还是界面的显示都是具体类。具体类应该是不稳定的,不能被依靠。所以必须抽象出接口,就是下层的Subject接口和上层的Observer接口。Subject接口依赖Observer接口。

- 根据单一职责原则(SRP)和接口分离原则(ISP),Subject应该只是处理register和notify的任务,而和具体逻辑无关。这在使用拉模式时尤其需要注意。

- Observer模式有推模式和拉模式两种方法。推模式中,由Subject把数据直接告诉Observer。在拉模式种,Subject只是告诉Observer有事情在变化,然后由Observer来查询是什么数据变化了。究竟使用何种模式应该视具体应用而定。然而常常是两个模式的混合运用。

- 在使用拉模式的时候,Observer要向下层询问获取数据。然而数据属于具体的业务逻辑,和Observer模式的框架无关。因此这个接口不应该被包含在Subject接口中,而需要设立一个单独的业务接口。也就是说,在这种情况下,下层模块要继承两个接口,Subject接口和自己的业务逻辑相关的接口。(如果不这么作,将会形成依赖环)

- 如果把推模式和拉模式混合使用,即是,Subject告诉Observer一个消息,提示是何种变化。Observer判断是否要查询更具体的数据,或者如何查询。这就是消息驱动系统了。

- 另外一种变化是,Observer在注册的时候,就表明自己对何种消息感兴趣。Subject在事件发生的时候,只是通知感兴趣的Observer。

2005年3月3日星期四

《ASD》设计模式:Composite

我对于Comosite模式有种特殊的感情,因为这是我第一个理解了的模式。之前看《设计模式》一直未能理解模式的意义,直到看到Comopiste,才觉得豁然开朗。之后再看其它模式,也觉得能够理解模式背后的意图了。

Composite模式其实是一种非常特别的模式,因为他所关注的是结构,而较少关注行为。这与大部分的设计模式是有所不同的。
可是,Composite模式的结构是非常精巧的,甚至可以称之为美丽动人。
元素合在一起组成了结构。结构可以和零散的元素或者别的结构再次组合,形成新的结构。这样的组合可以无穷尽地延续下去。
常常,我们需要的是最上层的整体。
Composite模式让我们可以在运行时期,用组合的方式来建造这样的整体。
Composite模式较少被误用。因为她的应用总是在特别的面向数据结构的上下文环境。而且也没有多少别的方法可以顶替Composite的作用。
Composite模式不太关注行为,即如何使用这个巨大组合结构中的元素。她本身只提供了很简单的深度优先的遍历方法。
如果有更高的行为上的要求,就要借助于另外两个模式:iterator和vistor。

迁徙的野鸭

今天早上去上班的时候,有两只类似野鸭的鸟从我头顶飞过。莫非春天来了,又到了候鸟们迁徙的时候了?
突然很想再看一次那部美轮美奂的电影《迁徙的鸟》。可惜身边没有碟片。而且这电影要在大屏幕上看才舒服。
《迁徙的鸟》中有大量的和候鸟们同步飞行的镜头,观看的时候,感觉自己也在和鸟儿们一同飞翔。当镜头跟着鸟群,在挣脱地面束缚的那一刹那,心中有种感动在暗涌。
候鸟的迁徙是非常伟大的。套用电影中的台词,迁徙的鸟是一个关于承诺的故事。
没有电影看,就只能贴张海报了。

See The Future. Make History.

今明两天,在Redmond有微软一年一届的TechFest。微软在全世界的六个研究院(Redmond,湾区,硅谷,剑桥,北京,印度)都会在这个TechFest上,展示自己一年来的成果。See the future. Makes history就是本届TechFest的口号。
TechFest在三个大会议室中,布置了很多摊位,每个摊位上都有一个技术展示。另外还有两个大会议室,用来作一小时一个的报告。
我今天去的稍晚了一点,到场的时候已经快要4:30PM了。没有去听报告,直接去展厅看技术展示。有很多展示都非常让人兴奋,花了一个半小时,只是马马虎虎地看完了一个展厅。剩下的两个展厅就已经关门了。
只能暗下决心,明天一定要早点去。
我拿不准今天看到的东西中,有多少是可以公开谈论的。所以只好不谈具体细节,只说说大致内容。
在今天这个展厅中,展示的技术,主要集中在系统与网络、软件工程、数据库、P2P方面。身为程序员,当然是软件工程方面的技术最有切身关系。有几个项目,和单元测试、源码数据挖掘、编程框架相关的,让我觉得特别的兴奋。真的是非常希望能够快点用上他们的成果。

2005年3月2日星期三

相声瓦舍

我用eMule下载了一些台湾相声瓦舍表演的相声段落。听了之后,觉得非常过瘾。
相声瓦舍中,最重要的两个表演者当属冯翊君和宋少卿二人。感觉上这两人的语言基本功依然不如大陆的一流相声演员,再表演报菜名这样的传统段子的时候,虽然还算精彩,但是就远不如大陆相声演员的神乎其技。
可是谁喜欢看一个人站在台上口沫四溅的念绕口令?

相声瓦舍最让人觉得过瘾的是他们的讽刺态度。讽刺时政,也讽刺不良的国民性。例如《相声说跨鬼子》系列,听来实在过瘾。
然而有些段子,虽然没有太强烈的讽刺意味,例如《战国厕》,但是想像之丰富,也是大陆的相声中所见不到的。
在创作的时候,束手束脚,这也不能,那也不能,久而久之,连正常的想像力也都没有了。大陆的相声创作大概就是如此。

之前,听过一个一米线的理论。
大意是说,有一个限制在那里,谁都知道不能跨过那根线,否则就很糟糕了。
可是这样是不够的。编辑还很担心,自己会失手放过什么过界的东西吗。所以编辑会在那个限制之前,退出一米再划根线。
然后是作者。他们会在编辑的那根线之前,再退出一米,再划一根线。
可实际上,并不只有这三根线。
因为所有的人都不确定自己的那根线是否划对了。看到别人的线好像更远一点,自己也就再退一点。
于是你退一米,我退一米。那根线就越退越远了。
真正的问题不是在于那根线在哪里,而是在于有那么一根线,人就失去了一种自由的能力。
这就是所谓的精神阉割。

所以,听听相声瓦舍,听听没有被阉割过的声音,真的很过瘾啊。

2005年2月28日星期一

Hike of Rattlesnake Mountain

今天和几个中国同事去爬Rattlesnkae Mountain。似乎这是我去年冬天以来的第一次hiking。

Seatllte附近多山,因此也有颇多的登山爱好者。连带着,也就有了很多供hiking用的trail。随便一个小山丘或者湖边,都有一两条trail。

在国内,北京附近爬山,常常是要么没有路,要么路边全是卖东西的。

而在这里,风格却很不同。到处有专门供人远足用的小路,但是没有什么人卖东西。似乎也没有什么人来维护。小路两边没有垃圾桶,也不会有人把垃圾扔在路边。感觉这里的大部分地方都已经被开发过了,但是又保持着一种很自然的面貌。

对于爱好爬山的人来说,这里确实是一个非常惬意的所在。

Rattlesnkae Mountain应该算是比较有名的爬山去处。今天爬上的一路上,见到了不少人。(相对于这里别的地方而言,和北京香山的人海是完全不能比的了)。很多人都带着狗。也有几个人背着小孩。

这次hiking的路程很短,只有2 miles,合3.2公里。不过等上山峰以后,视野到也是非常开阔。

最遗憾的是,我虽然带了DC上山,但是居然忘了带存储卡。所以今天这里附带的照片都是我的朋友Jun拍的。Jun的照片拍得非常漂亮,大家可以去他的blog看看。



照片链接:Rattlesnake Mountain

2005年2月27日星期日

出游(玩具商店,华盛顿大学)

春暖花开的周末,照例出去兜风。


中午先去了Bellevue Square,看了看朋友推荐的几个特色商店,Sharper Image和Discovery Chanel Shop。这几个商店都是卖一些特别的“玩具”,例如把时间显示投影到墙上的钟,电动的DVD架,在地毯上自动游弋的吸尘器。Discovery卖的东西相对要低龄化一些,比如用来侍养蚂蚁的模拟生态环境,能显示当前天空星座的灯。
与其说是卖“玩具”,不如说是卖idea的商店。很多东西都非常对我的口味。可是论到价格,于国人而言,却已经不能当作玩具来看待了。


这些天不少地方的樱花都开了。所以我们下午去了华盛顿大学,希望能看到盛开的樱花。不过可惜的,华大里的大部分樱花树还只是含苞待放的状态,算是有点遗憾了。



对于华大,我没有什么好说的。梅贻琦先生说,大学者,乃有大师之谓也,非大楼之谓也。
我只是看了看华大的大楼,当然是什么也说不出来了。

2005年2月26日星期六

《ASD》设计模式:Factory - 兼谈模式的滥用

operator new是个很特别的命令,只要一出现,就会破坏DIP(依赖倒置原则)和OCP(开放封闭原则),然而她又是不能避免的命令。
解决办法就是使用Factory模式,把new命令与使用者隔离开来。
然而依然需要一个地方来创建Facotry类的具体实例,不过这个工作可以放在应用程序的初始化部分来作,与其它应用还是隔离开来的。
关于Factory应该不用多写什么了。对于一个面向对象程序员来说,这可能是最常见的模式了。
不过可以谈谈什么时候该用Factory模式。

原则上说,当创建一个可能会变化的具体对象时,就应该(必须)要使用Factory模式。
然而,什么对象是会变化呢?
传统的设计方法是在最初的设计时就考虑这个问题。
可是极限编程的思想略有不同。

极限编程则认为,第一,在项目之初是很难预料哪些类是会变化的,所以不应该预先考虑这些变化。
说实话,对于设计工程师来说,要接受这个观点还真的有点痛苦。虽然我知道她说的是真的。
如果,软件不需要变化,那么面向对象的思想就失去了大半的意义。因此工程师们一定要让自己的作品能够灵活地响应变化,这也就是OCP的原则。
然而,当运用了大堆的strategy、template、factory等等模式,建造出一个叹为观止的系统后,只等着需求改变,这个系统就能体现出OCP的好处。这时就象是搭了一个完美的陷阱,只等着猎物经过。
可惜的是,猎物却常常并不从设置陷阱的地方出现。需求的改变总是出乎设计者的预想。那个陷阱成了一个完美的装饰品。
我写过很多这样的装饰品。他们唯一的用处就是给后来者作为学习的例子。

那么该在何时使用这些模式来让程序变得坚固而灵活可以承受需求的改变呢?
极限编程认为,第二,发生过变化的地方趋向于再次变化。套用一句老话,“可以跌倒,但是不可以在同一个地方跌倒”
就软件设计而言,在最初,并不去考虑应该应对什么样的变化。只有当第一次变化出现的时候,才去更改设计,让程序对这种变化能够遵守OCP的原则。并且,这种改动后的设计,应该能够应对今后出现的所有同类变化。
我想,对于设计工程师,这种观念应该是可以接受的。

设计模式的初学者,就好像拾到了一本秘籍的孩子。艺成下山,不管遇到什么都想施展一下拳脚。这就是模式的滥用。
如何避免模式的滥用,应该多考虑一下上面所说的两条原则。

2005年2月24日星期四

《ASD》包的设计原则-兼谈极限编程

我在之前谈ASD的时候,都有意回避了开发流程的问题。然而实际上敏捷开发就是极限编程的另一个名字。
对于一个了解传统软件工程的人来说,甚至对于一个有传统项目开发经验的人来说,极限编程的观念都有点难于接受。正因为如此,我闭口不谈极限编程,只谈论设计模式。无论如何设计模式是好东西。
到了“包”的部分,极限编程的话题再也绕不开了。
极限编程中最惊世骇俗的部分大概是,反对建模,直接实现功能,然后在软件具备一定规模之后,才由下向上的设计“包”。
如果过去有人向我提出这样的观念,一定会被我B4的,但是我现在到觉得,极限编程有一定道理。至少她在规模较小的项目中是有道理的。
该如何衡量项目大小呢?这又是一个很难的问题。但是可以确定的是,大部分的项目都是小项目。

极限编程认为,在实现功能之前,先建建立全局的模型是没有意义的,这样的模型只会限制软件的开发,然后模型和实现双方互相妥协,结果模型被改得面目全非,还是离理想结果相距甚远。

反对极限编程的人认为,没有总体模型的指导,实现会缺乏大局观,变得混乱重复,难于维护。

极限编程提高维护性的主要作法就是依赖“包”。“包”并不是传统的模块的概念,而只是一个软件结构的映射,用于管理依赖和重用。
而由于测试驱动开发,软件结构是非常容易变动的,所以可以在混乱刚出现的时候,调整“包”,来恢复整个软件结构的有序。
但是如果没有总体的模型,开发人员在实现功能的时候,如何才能知道有没有可以重用的包呢?在调整软件的时候,又如何知道该调整到哪个包里去呢?
这就是说,需要有人(很多人,最好是全部开发人员)了解整个系统的情况,知道包的结构。
这也是极限编程强调结对开发(pair development)的原因之一。结对开发的要义不仅是两个人一块干活,而且还是要经常变更自己的开发伴侣,开发系统中的不同模块。这样让知识在团队中广泛传播。团队中的每个人,都对系统中的各个部分都有所认识,然后软件的灵活调整才能得以实现。

我基本上同意上诉观点。还有两个推论:
第一个推论,项目的大小取决于开发人员的能力。由上面的讨论可以看出,要实施极限编程,需要每个开发人员都了解系统的结构。但是,事实上,个人的能力有限,在有限的时间中,能够理解的系统结构也是有限的。超出了这个限制之后,极限编程大概就会暴露出越来越多的问题。所以,极限编程确实在较小的项目中比较有效,这个大小的限制即是开发人员能够理解的系统的大小。团队中开发人员平均水平越强,极限编程能够支持的系统也就越大。
推论的推论,如果是作一个个人作品,毫无疑问的应该使用极限编程。
顺便一提的是,与极限编程对应的另一种方法是软件工厂,即是由少量的精英的制定模型,大量的软件蓝领实现极细小的模块。虽然我由衷的不喜欢这个点子,但是也许这种方法更适合中国的国庆。
第二个推论,极限编程的各个部分有着密切的关系,分开来应用其中的一条两条,并非极限编程。

好了,下面来谈论包的设计原则。前面已经提到,包的主要目的是管理软件模块的依赖关系和重用。包的设计原则就是为了使这样的管理尽可能的最优化。
下面来看看这些原则。这些原则的前提是,这是一个应用极限编程的项目。即是说,项目的规模有限,并且已经有了一定规模的类,现在要用包来管理这些类。

内聚性原则:包括REP,CRP,SRP。这里主要解决的是包的粒度问题,多少类该被放进同一个包中。然而,包其实并不等于软件模块,所以包的大小在通常情况下,是远小于软件模块的,就是说,同一个模块可能被放在多个包中。
REP是重用发布等价原则,重用的粒度就是发布的粒度。即是说,一个包中的软件要么都是可重用的,要么都是不可重用的。我的理解是,实现feature时要想想,那些部分是这个feature独有的,那些部分是其它feature也可以用的。这两个部分要分入不同的包中。
CRP,共同重用原则,一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。我的理解是,即使一个feature中有很多部分都是可以重用的。但如果这些部分可以单独重用,那么也要分入不同的包。
CCP,共同封闭原则,包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其它的包不造成任何影响。我的理解是,应该把对于同一个变化敏感的类尽量放入同一个包中。
用不太准确的说法来说,前两个原则的动力来自包的client,趋向于拆分包;后一个原则的动力来自包的server,趋向于聚合包。包的粒度就是在这两种力量之间的动态平衡。需要注意的是,所谓包的client和server可能和你的想像有所不同。

耦合性原则,包括无环依赖原则,稳定依赖原则,稳定抽象原则。这些原则主要用于解决包之间的依赖关系。
无环依赖原则,在包的依赖关系图中,不允许存在环。所谓包的依赖是指,如果A包中的文件依赖B包中的文件时,就是A包依赖B包。(之前在DIP原则(类的设计原则)中,已经提到了实现应该依赖于接口。)这是一个应该严格遵守的原则,只有遵守了这个原则,才能谈后两个耦合性原则。依赖关系中如果出现了环,就要解决掉环。解决环的方法有两个,第一个方法的提示是DIP原则。第二个方法是,把两个包都依赖的部分提取出来作成第三个包,让两个包都依赖于这个包。这个方法的提示是,包在开发过程中是动态变化的。
稳定依赖原则,朝着稳定的方向进行依赖。所谓稳定性,即是包的依赖关系。若是包A依赖一大堆其它的包,那么任何一个包的变化,都会引起包A的变化,包A即是不稳定的。相反,若一大堆的包依赖包B,那么包B若要变化就会引起很多其它包的变化,这么说包B很难改变,包B即是稳定的。《ASD》中描述了一个计算不稳定性的方法,称为不稳定性度量I,主要取决于依赖于包的类的数量和包中依赖于包外的类的数量,具体算法很简单,略。I是一个比值,范围是[0,1]。0时最稳定,1时最不稳定。这个I值对于类的划分有点意义,要把不变的类放入I值较小的包,把要变的类放入I值较大的包。但是I的主要意义是表现在稳定抽象原则中。
稳定抽象原则,包的抽象程度应该和其稳定程度一致。理论上,抽象类即是接口,趋向于不变,具体类即是实现,趋向于变化。《ASD》再次给出一个描述包的抽象性度量A,即是用包中抽象类的总数除以保重类的总数得到的比值。这个抽象性A的取值范围是从0到1,数值越大,抽象性越大。因此,在理想的系统中,I越大,A就应该越小;A越大,I就应该越小。若是把A和I作成二维的坐标体系,那么(0,1)到(1,0)的连线就是一根理想连线,若是一个包远离这个连线,那么这个包的设计就是有问题的。
这个让我想到,也许应该设计一个软件来自动管理包的A值和I值,自动给出统计数据。那么对于系统的设计应该会有很大的好处。也许,过一段时间,等我手上的项目不太多的时候,我也许可以写一个这样的东西出来。

一个问题,在C++中,如何表现“包”呢?不明白,要想办法查查看。

Subscribe with Bloglines



2005年2月22日星期二

周末郊游

兜风一整天,拍了几张照片。

照片链接:Outing

2005年2月19日星期六

Everything About Everything

前天我工作所用的Windows忽然不能启动,重装系统也告失败,所以就只好向IT部门求助了。
IT部门的兄弟说,尽快给我送个哥们来帮忙。
于是我就一直待在办公室里等待。可是,这两天,恰好,IT兄弟们赶上了农忙季节。竟然把我凉拌了一天也没有人来理我。
于是,我只好在办公室里看文档。把之前想看而没有时间看的文档全读完了。
之后开始读书,一口气读完了五章《ASD》,连读书笔记都写了三篇。

晚上回家的时候,在路上听iPod,听到了《the Big Blue》配乐二。一开始穿插了很多电影中的台词。
Enzo声音低沉,磁力无限地说:“welcome to blue”。

这几天来,每日的天空都干净得耀眼,晚上星空灿烂。
我已经熟悉了北斗星和猎户星座。昨夜,在回家的时候,又凭着中学时代的记忆,顺着北斗七星,在北方天空中找出了北极星。
发现每日上班走的148路,几乎是完完全全的正南正北指向。

iPod中,传出了Enzo和Jacque的对话。
What do you want to know?
Everything.
Everything about what?
Everything about everything.

〖转贴〗中国人的种族观念

【若昔难得 按:】写这文章的人是个爱尔兰老外。于国人而言,对于他的指针,可能有很多都会断然否决,或曰以偏概全。
也许是以偏概全,也有可能是旁观者清。
中国正在迅速地走向世界。之前,中国较少接触外面的世界,所以种族观念并未彰显。
而现在,与外界的联系日益加强,中国之国力也与日渐进,种族问题确实是值得国人注意。

就该文所讲的具体实例,在我自己的身上,也有那么一点痕迹。
比如,一般情况下,我管外国人为老外,但是,对于黑人兄弟,我却常常会称之为黑人。
我可以用这个理由来辩解,在我们常见到的老外中,黑人兄弟比较少,所以称黑人,有更准确的指向性。而且,我确定,自己对于黑人没有任何偏见。
但是,如今仔细想来,黑人兄弟发现自己在中国,竟然连“老外”的称呼也不能享用,应该是有点不爽的。
所以,我今后,一定会注意对于非白人老外的称呼问题。
称呼事小,然种族观念问题事大。而且这种观念,就是在这么一点一滴中慢慢积累起来的。

原文链接:中国人的种族观念

〖转贴〗1905:三种力量角力中国

【若昔难得 按:】一百年以前,“山雨欲来”。保皇派、立宪派、革命派,只是这百年风云的开始。之后的风起云涌,到有点不知如何说起的意味。
转念间就想到一句话,百年如一梦。
不过立刻就明白,所谓“梦”的说法,是不折不扣的bullshit。
凡走过必留下痕迹。
百年之后,再回头来看,2005又留下了什么痕迹。

原文链接:1905:三种力量角力中国

〖转贴〗让我们接近星星

【若昔难得 按:】先哲康德有句名言,头顶的星空与心底的良知。这话听起来很cool,有种让人感动的意思。
然而,我以外,越是让人感动的口号,我们越要加以提防。仔细分析,他究竟是在说什么,有何依据。理性是人类的最强武器,一定要善加利用。以上所说的,并非针对康德的这句名言。
在下对哲学家们先是敬而远之,后来又是敬谢不敏,所以对哲学家们实在是有点距离感。
单就康德而言,我倒是零星地读过他的一些言论。他的理性和反宗教的一面,很为我欣赏。大概算是哲学家中,最对我胃口的那一支了。
什么是头顶的星空呢?康德似乎是指无法穷究的自然运行规律。
是的,在人类有限的时间中,我们是无法穷尽这世界背后的规律的。然而,我们可以知道的,可以作到的,却远比大多数人心目中的那个界限更大。
实际上,这个世界上没有神,(相信神的诸位请原谅在下身为骄傲的无神论者的狂妄)更没有神定下的界限。
科学是没有边界的。

原文链接:让我们接近星星