少年听雨歌楼上,红烛昏罗帐.壮年听雨客舟中,江阔云低断雁叫西风. 而今听雨僧庐下,鬓已星星也! 悲欢离合总无情,一任阶前点滴到天明。
2007年11月24日星期六
沈文裕现象
这是这个叫沈文裕的年轻中国钢琴家官方网站上的关于他的介绍。Youtube网站上还有关于他的几段视频,当然,还有百度贴吧上有不少他的爱好者的激昂话语。这一切都似乎告诉我们中国又出了一个钢琴大师?
沈文裕得过两个有一定分量的钢琴比赛的大奖,一个是2003年的伊丽莎白女王钢琴比赛二等奖和2005年的拉赫玛尼诺夫钢琴比赛的一等奖。但是,也在一些比赛中早早被淘汰,比如同是2005年的肖邦钢琴大赛第一轮就被淘汰,虽然有一些人把他比作1980年的波多雷里奇。但是,到目前为止,两者还是有很大的差距。
我想说的是,沈文裕注定没法成为钢琴大师,这不仅仅是时间问题。在艺术的领域,有人早早就展露头脚,有人则大器晚成,都有一定的例子,但决不是说任何人都能沿着相同的路走。沈文裕的问题在于他自己、在与他的家人,当然,还有不知深浅的媒体的责任。
沈文裕自己的问题最主要的是把艺术和技术的关系没有搞清楚。沈文裕坚称自己技术比同辈的中国钢琴家朗朗和李云迪都要好。同时,在他的官方网站上,他自豪地列出了自己的保留曲目,从独奏曲到协奏曲,几乎囊括了整个古典音乐曲库。但是遗憾的是,音乐不是谁弹得多,谁弹得快就是谁更好。加拿大钢琴家Marc Andre Hamelin的技术超群,成为少数能够录制Godowsky练习曲的钢琴家之一,但是这么多年以来,他仍然不是当代最主要的钢琴家,甚至不能称作是真正的大师。不少钢琴家的保留曲目都是相当有限的,德国的施奈贝尔,大部分的曲目就是贝多芬和舒伯特,但是仍然是非常重要的钢琴大师。而古尔德的兴趣爱好主要就是巴赫(我知道,古尔德录制过贝多芬和莫扎特,还有布拉姆斯)。所以,沈文裕把自己能弹很多曲子等同于钢琴大师,这是不正确的。钢琴演奏,技术肯定是必不可少的。但是,决不是最重要的。沈文裕的演奏(官方网站上的mp3和youtube上的视频)都证实了他的演奏的确缺少“音乐性”和自我的诠释。从纯技术的角度来说,他很多曲子都完成得不错,但是就像是高年级的音乐学院学生,仅仅是完成了作业。除此以外,听不出什么激动人心的地方。
沈文裕的另外的问题来自于他的家人和他现在的运作团队。他的种种介绍,哄一下不懂音乐的人还可以,真正的古典音乐听众是不会被诸如多少多少岁录制拉赫玛尼诺夫《第三钢琴协奏曲》和多少多少岁能够演奏贝多芬全部32首奏鸣曲这样的事情所迷惑的。事实上,拉赫纳尼诺夫《第三钢琴协奏曲》在发表的那个年代的确可能使很难的曲目,但是今天,可以提供的演奏版本已经非常多了,相当多的钢琴家都能够演奏这首曲子,这根本不是什么特别的试金石。至于演奏贝多芬奏鸣曲,实际上,”能够演奏“和”演奏得能令人信服“是两个概念。但是,即便是这样,贝多芬奏鸣曲全集的录音也不少了。说这些的意思是,这些事实都不是”神童“的依据。
在艺术的殿堂里,神童并不少。但是,大师却不多。当年的Kissin,起点比沈文裕高了不知多少,但是今天却很难说挤进了大师这个行列。还有更早的美国的Van Cliburn,也仅仅红极一时。就算是中国,仅20年来,有多少钢琴家曾经进入过”神童“的范畴,又有多少钢琴家被迅速遗忘?
更何况,从沈文裕的成长经历来说,很难说他有没有其他的生活。没有生活,谈何艺术?
2007年11月18日星期日
我与Brian Kernighan的通信
-----------------------------------------------------------------------------------------------------
Dear Prof. Kernighan:
I am a graduate student in Computer Science & Engineering Department of Lehigh University. I enjoyed your lecture today and gave me a lot of enlightenment.Firstly, I found two significant examples to show that Javascript is powerful also outside the browser. See http://www.mozilla.org/hacking/coding-introduction.html#cppjs .You can find this sentence :" When you start the application, the C/C++ components start first. But in an early stage, a technology called XPConnect gets initialized that enables the use of interpreted JavaScript at runtime. In fact, a Mozilla browser distribution consists of both compiled C++ and uncompiled JS files. " So infact Mozilla Firefox is built on C++ and Javascript!Another technology which is quite new is Adobe Air. They want to use HTML and Javascript to build desktop applications. See http://labs.adobe.com/technologies/air/develop_ajax.html .
Secondly, I have one question:I found that some companies have tried to combine or intergrate desktop programming and web programming together. They want to continue to use the powerful of strong-type programming languages to do web programming. For example, with new Microsoft .NET 3.0, you can create an application that both can run in desktop environment and also in a browser. Later, they launched a product named 'Silverlight' in order to get C# ( a strong-type programming language in some sense) programs run in a browser. How do you comment this trend? Do you think that combing desktop programming and web programming together is a right way?Thank you very much. Looking forward for your reply.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hi, liangjie --
thanks for your note. i think that javascript will increasingly beuseful outside of browsers. i know very vaguely about adobe air, but nomore than that; it's clearly time to dig deeper. google gears isanother effort to do offline web computation. but i think that both ofthem are using javascript in the browser, not as a standalone language.no matter what, that's something i need to know more about.
microsoft has done several things that make it easier to create anapplication standalone and then convert it into something that runs in abrowser. my (limited) undestanding of ASP is that it does somethinglike this. i haven't tried anything like this in the new versions of.net, but i believe that things work as you describe. and certainlysilverlight is trying to things similar to air and gears. (i couldprobably give a talk on weird names for products.) i'm very poor atpredicting the future, but i do think that there will be a lot ofactivity in this area and that in the long run the lines between web anddesktop will be blurred.
brian
-----------------------------------------------------------------------------------------------------
Kernighan还是觉得Desktop和Web的界限会越来越模糊的。我自己对这个领域十分有信心,也感到自己应该做点什么了。
2007年11月16日星期五
Brian Kernighan的Seminar

Brian Kernighan,贝尔实验室的研究员,普林斯顿大学计算机系教授,他最早知名是因为他就是撰写最早的C语言标准"K&C"中的"K"。当然,还有他是经典C语言书籍《C Programming Language》的作者。今天他来到我们学校,为我们带来了一个非常精彩的讲座。
Kernighan长期从事程序语言的研究,他也是Unix操作系统的先驱。今天他讲座的内容却与他原有的留在人们心中的形象非常不同。因为他今天讲座的中心是“动态语言”!是Javascript,是Python,是Ruby。这多少有一些出乎意料。
原以为,动态语言这几年因为Web Programming的兴起,特别是05年Ajax兴起之后,在业界掀起了一阵一阵的对动态语言的狂热,并没有太多影响传统学术界。因为传统学术界仍然把C语言,C++当作制胜的法宝。至多再加上Java。很少有学术界关注现在流行的种种动态语言,更别提现在流行的种种开发框架。
Kernighan的关注也让我感到敬仰。按理说,他是上一个潮流的人。像他那个年代,从Unix和纯正的C语言走过来的人,是很难对现在的诸多动态语言产生兴趣的。因为,在他们看来,这些语言太简单,太不过于完美,性能也低,做不了系统开发。不过,Kernighan着重指出了,语言和工具影响着人们思维的方式。如果不接受这些动态语言以及新的开发框架,我们就没办法去接受新的开发思想和开发理念,进而就不可能有更新的产品。
Kernighan举了很多例子,比如Javascript,应用很有限,但是在浏览器中发挥着强大的功效;再例如当前的一些mashup的应用,如何做到API和多种应用的整合。
应该说,Kernighan的讲座还是很前卫的,居然还包括了一两周前Google才发布的OpenSocial。
下面来谈谈我的看法。
我还是持一贯的主张,其实,桌面应用和Web应用开发模型肯定也必须统一。如果这个鸿沟长期得不到解决,Web应用也仅仅是带着脚镣跳舞。微软、Adobe都在尝试着这方面的努力,比如WPF、Silverlight,比如Adobe Air、Flex。但是,现在还远远在雏形期。一旦桌面和Web应用统一之后,那么我们就可以把桌面强大的优势和Web的“万金油”精神整合起来,从而形成强大的应用。
不管是Ajax,还是mashup,终究不是长久之策。
Kernighan的讲座有一个小小的错误。Javascript不仅仅在浏览器中有应用。事实上,Mozilla Firefox有很大一部分的代码就是Javascript写的!浏览器本身就是Javascript强大的一个证明。再有,很多软件的脚本系统或者是插件系统都利用了Javascript,如Adobe。
不管怎么说,能够听到计算机界响当当人物的讲座,心中还是很高兴。只是遗憾没有能够找他签名。
2007年11月5日星期一
Lust Caution
周末的时候去费城看了《色戒》。看完以后有很多的感慨。这的确是一部不错的影片。影片中有很多元素值得回味,男人和女人、爱情、友情、国家和个人。我自己觉得,王佳芝和易先生并不相爱,甚至也不是普遍人们觉得的“性”。他们两人完全在一种猎人和猎物的关系之中。一种宿命的感觉。所以,易先生是痛苦的,王佳芝也是痛苦的。两个人都要在生活中扮演很多角色。而最终王佳芝说出那句,“快走”也仅仅是其角色错乱后的崩溃表现。这并不是王佳芝爱上了易先生的证据。很多人也以为易先生为王佳芝动了真情,原因在于那个六克拉的钻戒。其实,这是很错误的。易先生身居要职,买一个六克拉的钻戒算不了什么,或者说是给一个情人买一个六克拉的钻戒算不了什么。这根本不能解释其内心世界的变化。易先生真正需要王佳芝的是她的肉体。所以,易先生不可能动真情,也没有必要动真情。因为动真情对于这种特务头子来说,是很危险的。后来的表现,也证明了易先生其实很无情。那么最后易先生为什么哭呢?很难说。他即便是想念王佳芝,也并非出于爱。王佳芝带给他的仅仅是一种能够找到一丝自我的机会。也许,他只是伤心自己丧失了这种机会,哪怕这种机会本身就已非常扭曲的姿态出现。
当然,这是情节。
而我跟想探讨的是这个故事背后的两个东西。第一个东西就是,在“爱国”的背景下,是什么驱使人去像这帮年轻人那样去做出这样的抉择呢? 貌似很简单,在一片热血沸腾的人高喊“中国不能亡”之后,似乎一切行为都能找到归宿。然而,杀特务头子这种事情本身就值得商榷。其实,这是一件争论了很久的事情。暗杀大多数时候根本不可能解决问题,还只能更多地带来灾难。看看第一次世界大战,看看以色列总统拉宾的死。当然,这几个学生不可能想那么多。不过,他们其实有很多机会。但是,最终却选择了利用王佳芝的色相。这就有一点混乱了。爱国就意味着要丧失人格。爱国就意味着要把一个年轻女子的身体作为筹码,来达到本来就不那么站得住脚的目的。而周围的年轻人,坚信只有王佳芝牺牲了自我,才能够换来所谓的正义。很荒诞,但是的确真实地反映了那个年代人们心中的想法,特别是一些所谓的爱国青年的想法。
第二个我要探讨的是易先生。没错,易先生是一个特务,易先生是在伪政府工作。但是,我觉得事情并不是黑白分明。你很难看出,是易先生更坏,还是准备暗杀他的这些人更加恶毒。从本质来说,这不过就是以暴治暴的故事。另一方面,我也开始去揣摩易先生的内心。你说他是真心诚意为日本伪政府卖命吗?未必。你说他就没有一种无奈吗?是的。他也仅仅是日本人手下的筹码。他的凶残都是日本人吓出来的。这恐怕也是更多在伪政府里工作的人的内心。你恐怕要谴责在伪政府里工作的人。但是,人需要生存。日本掌握了大片领土以后,就需要干活的人。我们不能很不现实的说,要求每一个人都为抗战作出牺牲。因为国家是一个集体概念,在个人都无法生存的前提下,怎么去保证所谓的国家概念?所以,伪政府肯定是有人要去工作的。日本占领区也不可能成为无人居住的无人区,更不可能成为人人皆兵的游击队区,这不是现实。任何一个时代的伪政府,都有一大批人。简单地说这些人,叛国或者说是不爱国,很幼稚。
在一个美好的词汇”爱国“下,上演了的却是一部剥开人性深处的丑剧,上演的却是一部与爱与情无关的男女悲剧,这不能不让人回味。
2007年10月22日星期一
我为什么选用Vista
之前看了不少关于Vista的报道,也听说了很多关于Vista的传闻。首先,Vista的兼容性不好,很多软件都在Vista上不能正确运行。其次,用户使用非常不方便,界面也很让人厌倦。UAC十分不友好等等。
安装之后,我终于明白了。其实,传闻......
我要说,我基本没有遇到软件的兼容性问题。有这么几个软件有兼容性的隐患,Visual Studio 2005、DAEMON Tools和VMWare Station。但是,使用均有解决方法。其他所有软件还没有发现有兼容性问题。而且,系统会在遇到有兼容性问题的软件时提醒用户,并且提供解决方案。
用户体验方面,使用一开始的确有一些地方不习惯。但是很快你就会发现,微软在用户体验方面还是下了很大的功夫。帮助系统非常详尽,而且查询也很方便。帮助的详细一直是微软所有软件的巨大优点。基本上大量的问题,不需要用户在网上到处搜寻解决方案。音量控制居然能够对不同的应用程序进行不同的设置。无线网络的设置也方便不少。以往在学校上网要设置很多选项,现在仅仅需要输入用户名和密码就可以了。至于说很多人厌恶的UAC,其实可以很方便地在控制面板里面关掉。而且有详细的指导,使得用户也可以进行高级配置。
我不明白那么多怨言时从哪里来的。很明显,有些人并没有真正使用过这个系统。
还有一个细节,我的电脑在Vista安装以后,所有的硬件的驱动程序都已经安装好了。无线网络已经配置完成。
我前两天下载安装了Ubuntu 7.10。很遗憾,系统没有认识我的网卡和声卡。而网上普遍的解决方案,均需要下载第三方的驱动程序,甚至编译内核。Unbutu 7.4完全没法在我的电脑上启动。
2007年10月9日星期二
我又要说中国的所谓开源人士了!
我不止一次讽刺和挖苦过国内叫嚣开源的人,包括倪光南。当然,这显得有一点不合适。但有一点我可以非常肯定的说,那就是所谓的“开源运动”救不了中国。中国的软件人就像清朝末期那样,老想找到一种制度或者方法能够拯救中国的软件。于是这些人到世界上一看,哇,“开源”,多么时髦一个词语,而且大家都讨论得很热烈。那么,这些人就毫不思考就把“开源”和所谓“自由软件”的理论搬到中国,试图把中国软件的振兴寄托到了这个运动上。
我感到十分可笑。
老实说,我使用了不少开源软件,但是这些软件有一个特点,那就是它们肯定首先是“软件”。说这话的意思是什么呢?就是说,软件是否开源不重要,重要的是软件的质量,重要的是软件能否帮助人解决问题。我的理论很简单,中国现在根本就不是软件开不开源的问题,而是开发软件就不行。商业软件不行,开源软件还是不行。开源又不是灵丹妙药,哪儿有什么软件本身不开源且质量很差,一开源就能够质量变好?这种思维就有问题。
第二个非常搞笑的是,中国提倡开源的人最喜欢套用的话就是开源能够节约成本。他们抵制微软的原因是因为微软的软件价格太贵。买不起正版,就叫嚣正版不好。我不知道这样说好不好,如果Office 和Open Office都是免费,我看谁会用Open Office。可是问题关键是,开源软件和免费软件是两回事情!RedHat的企业套件虽然基于Linux,可是那是要付费的!而且价格不菲,否则RedHat拿什么吃饭?Eclipse是免费的,但是IBM的诸多商业软件(均基于Eclipse)都是要付费的,价格不但贵,而且都是不开源的!价格是一个因素,但是因为价格而支持开源,简直就是牛头不对马嘴。
第三个问题是我反复说过的。对于广大中国的用户来说,其实对世界用户一样。那就是一个软件开源与否没有意义。我使用一个Word,我就要功能强大,能够处理我日常的要求,界面漂亮,使用顺手。我才不管我是否能够查看软件的源代码。我估计80%的普通用户一辈子也不需要或者不可能去接触到源代码。软件开源根本就没有意义,对普通用户而言。前面我已经说过了,开源不是免费。我买一个软件,我只看质量如何,我只看是不是值那么多钱。源代码给一个不懂编程的人来说,如同废物。
退一步说,对于程序员来说,所有软件都开源了,也未必就是一个很诱人的因素。除了心里的满足以外,没有带来在使用中的任何便利。我说这个毫不夸张。假如Windows和Office开源了,并且安装以后随时都能调试和看源代码。这对我有意义吗?首先,两个软件的源代码都是千万行级的。我可能为了找一个常量的定义就要花一个小时,或者把几个函数的调用搞明白都要花好几天时间。我日常工作根本不可能接触源代码。
就像Linux一样,很多发行版本的Linux都附带了源代码。但是客观地说,有多少用户能够去接触Linux的源代码?包括一般的程序员都不可能很多。稍微高级一点的用户能够修改配置文件,写一些脚本就已经很不错了。你指望用户隔三五岔地就去重新编译内核?谁疯了去这么干。
所以,对于普通用户和60%-70%的程序员来说,开源并不是什么必须的事情。更不是选择软件的标准。这个不是酷不酷的问题,而是智商问题。
好了,再说说开源和中国软件业。毫不客气地说,不管是使用开源软件还是开发开源软件,中国都未入流。原因就是,有一些所谓关心中国软件业的和提倡开源的人士把开源和免费软件等同起来。在国内大环境不好的情况下,谁还支持开源?开源就意味免费,你还要不要软件商活命了?好了,即便是不免费。那么,国内哪个开发商敢把自己的软件开源?
微软开源其实是一步很重要的举措。有人说“只让看,不让摸”。我还不客气的说,有多少人能够“摸得动”?我们不谈自己的水平,老是盯住别人看,觉得别人不让我们“摸”,就是歧视大家,就是不理解开源。好了,你先看懂了再说,特别是中国人。别人说“不让摸”没准别人有人有能力去修改,有人有能力去再创造。我还是提醒中国的开发者,你先全部看懂了再说。
再说微软有没有不可告人的目的。那我就想问问了,IBM有没有不可告人的目的?Sun又有哪些不可告人的目的?
奇怪了,Apple公司的大多数产品都不是开源的,Adobe公司的产品也都不是开源的,怎么大家不闹呢?没听说谁强烈要求Adobe 把Photoshop开源?
这是态度问题。所谓支持开源,其实很虚伪。
2007年10月4日星期四
Emacs VS Visual Studio
我们这学期有一门课是Advanced Programming Techniques。说是Advaced,其实就是基本的编程能力的训练,主要是在Unix下进行C++开发。一开始,我自己觉得已经有多年的开发经验,特别是C++还算是比较熟练,这门课应该是轻车熟路。结果是每次作业都有很多问题,而且进行开发也很费劲。
原因之一是,我们做作业都是用SSH登录到学校的Sun Solaris主机上,完全使用Emacs进行开发。这就带来了一系列问题。首先,编译和链接必须使用g++和make工具。编写Makefile有时候是一件很不容易做好的工作。你必须要分清楚各个文件之间的依赖关系。这些还不是问题的关键。问题关键是使用Emacs进行多文件操作简直就是噩梦。相比Visual Studio等先进的Project管理,多个文件之间进行跳转,并且进行编辑操作,除非是非常熟练的Emacs开发人员,否则很容易就弄得晕头转向。而且,在大型程序开发的时候,开发者总是希望能够以不同颜色对程序的词法进行区分。而Emacs很明显没有这项功能。当然就跟不用提智能感知等等能够对开发效率进行极大提高的功能。
原因之二是调试。Emacs没有集成的调试环境,这让人非常难受。我不得不在程序中间加入大量的输出语句来检查程序内部的状态。同时,我也只能凭想象对程序的运行结果进行猜测。
有时候还是很不理解为什么要使用Emacs,难道Unix下面就没有好用的IDE吗?
当然,使用Emacs还是不少的好处。第一就是能够让你对整个程序有一个清晰的把握以后才开始进行代码的编写。一步一步来。而且是不要依赖调试。尽管调试是一个相当有用的手段。但是未必是灵丹妙药。如果对程序本身就没有一个整体的把握,调试的结果可能还是无法使得程序正常运行。
Emacs还有的好处就是如果逐渐熟练以后,纯键盘操作就能带来比较高的输入速度。当然,这显然还是没法和有智能感知和智能补全功能的IDE相比。
网上有文章介绍如何把Emacs作为插件安装到Visual Studio里面。真是疯了。
2007年9月19日星期三
恐怖的周二
这里要说一下的就是,很多人以为美国学生不用功,只知道玩儿。但是我很多次11点左右离开图书馆的时候,图书馆里面仍然人山人海。但有一点和国内不同的是,你很少看见学生在图书馆里又吃又喝。大多数人都在认真看书。有一些人在讨论问题(从语气和神态就看出不是在说课余的事情)。今天更加夸张的是,接近十二点的时候,图书馆还有人往里面走(因为我们学校图书馆夜里两点才关)。回家的路上,很多系的楼都还是灯火通明。学校的停车场至少还有四分之一的汽车没有开走。刚才(凌晨两点),我还收到了一个教授的邮件,并且告诉我他明天早上5:30就起床,之后随时可以给他打电话。
这就是美国的大学。很片面的一个景象,但是深深地鼓舞了我。
今天去参加西藏系列演讲活动的启动仪式也是让我感慨颇多。首先,西藏对于我而言是十分神秘的,尽管西藏是中国的领土。在国内,并没有接触到很多西藏的东西。但是这里,似乎很多人都对西藏有浓厚的兴趣。之前的一两周,一个刚入学的美国本科生在学校餐厅碰到我,和我聊了很多关于达赖喇嘛和西藏的问题。深度和广度都让我相当吃惊。后来,学校还专门举行了本科一年级新生针对西藏问题的研讨会。这让我心中很不能平静。今天,启动仪式的演讲里,只有一两个中国人的身影。很难说是这里的中国学生和学者不知道这项活动。因为所有学生都应该接到了学校的邮件。然而,在激烈讨论中国的某个问题的时候,在别人对我们的领土发生浓厚兴趣的时候,我们却缺失了。
其实,在演讲中,尽管我只在那里待了半个小时,但是我没有听到"China"。我听到的是"Tibet",不管是介绍地理位置,还是介绍风景,均和“中国”没有关系。难道这就是外国人眼中真正的西藏?是的,也许根本就没有把西藏当作中国的领土。
遗憾的是,这里的中国人并不知晓。其实,很多时候,我们可以很容易就了解外国人究竟怎么看待中国。可是我们往往自己放弃了机会。如果不听听类似的演讲,我觉得我们可能很难理解外国人对西藏,外国人对台湾,外国人对香港的认识。一旦我们难以理解,就可能有误会产生。其实误会一直就存在着。
关于西藏,我不想多说了。
2007年8月8日星期三
IM杂谈
老实说,很不喜欢QQ。功能太过于复杂,而对于通讯必须的一些功能做得并不是特别好。这几年,QQ软件规模越来越大,集成了太多不必要的功能。广告也很烦人。头像、签名、QQ秀等等一大堆东西,很混乱。不过,又丢不下。原因是很多同学都使用QQ,有时候联系人也需要。
MSN传说中白领使用比较多。这让我很是厌恶。其实就是一个软件而已,有没有必要区分谁去使用谁不去使用。于是,我虽然很早就使用了MSN,但是到现在大家都使用以后,我反而对MSN没有太多兴趣了。有一些人听别人说QQ,感觉土,似乎非要说有MSN才觉得有品位。其实,这几年,MSN的广告和花样也是越来越多。只是乱七八糟的步伐没有QQ快。使用的原因还是因为朋友家人使用,否则,MSN很有可能成为我最讨厌的微软的软件。
GTalk是最近才使用不久的。感觉不错。清新,自然。功能不多,但是比较实用。和GMail结合比较紧密。软件大小比较合适。我个人比较喜欢使用。不过,现在使用的人不多。
Skype打电话不错。其实最近这个软件逐步增加了其他聊天和视频功能。也是一个功能不多,但是都非常实用的软件。没有广告,没有花花绿绿的东西。
当然,说了那么多。其实我个人是并不喜欢IM软件的。快速的聊天,胡说八道。重要的事情,特别是非常需要理性思考的问题,IM很耽误时间。而且,往往大家就那么挂在IM软件上,没有效率的概念。这也就是有一些大公司强行要求大家使用E-mail的原因了。
E-mail虽然显得麻烦一些。但正因为比较麻烦,里面的话好歹还是经过了一些思考。IM上有一句每一句的谈话,大多数随便得让人感觉是废话。再加上这些年,IM都开发了“隐身”的功能,实在想不出来,大家都隐身在网上究竟有什么好处。
IM还是要用。尽管我不喜欢。
2007年7月26日星期四
Qt初步开发
使用了一段时间以后,Qt的开发还是很有效率的,几个界面也有了雏形。但是,Qt的优缺点还是非常明显,让人很矛盾。
首先,Qt的开发库屏蔽了所有操作系统的东西。也就是说,使用Qt进行Windows GUI开发,你不需要知道任何的Windows API知识。当然,这么说似乎绝对了一点。但有一点是肯定的,那就是使用Qt开发对于学习操作系统本身的编程没有太大帮助。对于那些喜欢刨根问底的人来说,这就像隔了一层玻璃,总让人感觉不是特别舒服。
第二个问题就是IDE的支持还是有一些问题。当然,Qt和Visual Studio的整合已经是相当不错的了。但是在设计界面的时候常常有很多不能够确定的情况。有时候属性设置后,没有预览效果。或者是预览效果和实际运行效果无法一致。同时,Qt会为IDE生成大量的代码。这一方面减轻了开发人员的负担,但同时也给整个项目带来了很多隐患。事实上,有几次,我都是删掉了一些自动生成的代码后,才得到了我想要的结果。但是自动生成的代码会每次都出现,因此有时候代码的控制就成了问题。
第三个问题是Qt的帮助支持不够好。当然,对于Qt来说已经很不容易了。即使是我这样用惯了MSDN的人来说,Qt的API支持也已经比较到位了。但是对于一个成熟的库来说,光有API的介绍还是不够的,最好能有一些简单的配套的例程。否则,我经常要把好几个类的所有属性和方法都翻个遍,才找得到想要的东西。
当然,Qt仍然是非常让人激动人心的。起码对于普通的C++开发来说,Qt完全让你的开发工作效率上了一个大台阶。同时,卓越的跨平台性能,使人不得不选择它作为C++开发的重要工具。
2007年7月18日星期三
Ubuntu Linux
这一段时间开始使用Linux。主要是学习基本的使用方法,重点在于学习Linux下的开发。
以前安装的是Red Hat Linux 9.0,应该是一个经典的版本了。不过太多的功能没有自带,让我这种初学者很是抓狂。比较严重的是不能识别NTFS分区,KDE桌面和GNOME桌面居然还有不同步的现象。默认浏览器还是该死的Mozilla,等等。最终让我下了决心,换一个,尽管我才买了一本关于Red Hat Linux 9.0的书。
选用了流行的Ubuntu。安装的确非常方便。好处很多,我就不总结了。说一下不足的地方。
第一,表面上是一张CD的安装盘,但是要想开始工作,更新软件和下载其他软件包是肯定的。实际上,一张CD内居然没有包括所有的语言支持,驱动支持也非常有限。想想Windows XP一张光盘的内容,还是有一点敬佩微软。
第二,默认的中文支持还很不足。
第三,默认情况下居然没有开发环境,这让我非常吃惊,还要安装build-essential包,这简直不像Linux啊。
目前,打算跟着《Advanced Programming in the Unix Environment》走。然后再看看Qt4在Ubuntu下的开发。
2007年5月22日星期二
试用了Orcas
因为MFC最终还是没有时间和精力去学习和研究了,所以总觉得还是应该掌握一个Windows下的开发平台环境,目前还算比较熟悉的是.NET下的Win Forms开发。然而,Vista下,更加华丽和优雅的WPF开发又让我觉得那才是未来的趋势。所以,我很想早点进入WPF的世界。
另一方面,从种种渠道了解到的C# 3.0的特性也是十分兴奋的。还有早已经盛传了的Linq。从我初步试用的情况看,真的是很神奇。把SQL语句的感觉直接用在了编程语言里。看来我们还是需要多适应新的环境。
当然,因为是Beta版本,所以并不打算把开发环境转移到这个底下。但是有了Orcas之后,WPF的开发就有了门路。
2007年4月27日星期五
GUI库
关于界面,因为最近开发的需要,所以还是有不少的体会,这里分享一下。
我觉得从本质上来说,界面是软件不可或缺的一部分。很多人对此不以为然。可现代计算机的发展已经告诉我们,显示器和显示卡已经成为了大多数不可或缺的部分。用户都希望能够操作系统和应用程序能够提供易用漂亮的界面。有一些人用命令行和图形界面来区分高级用户和低级用户,这在我看来简直有一点逻辑混乱。
事实上却是,使用命令行有时候并不是宗教信仰问题,也不是高级低级的问题,而是被逼无奈。如果任何一个系统之下都有类似Visual Studio这样的开发工具,我不相信还有很多人去写生硬难懂的make文件 。
被逼迫的原因之一可能就是像Crend一样没有找到一个成熟好用的GUI库来构建应用程序,不得以只能使用命令行形式。那么我就来说说GUI库,拿Windows下的图形库举例。
Windows 有原生的API支持图形界面,包括窗体的创建、按钮的创建等等。这一点毫无疑问。问题就是拿这套东西去构建一个比较完整的图形界面,相信复杂度与你正要开发的应用程序相当,甚至还要更高。也就是说,如果Crend使用原生Windows API去构建图形界面,他还需要在他已有的程序基础上,多写5000-10000行代码。而我相信现在的BT++也未必能有这么多代码。
微软的MFC库倒是一个不错的选择。有各种类型图形元素的封装,从按钮到对话框。其实,大多数Windows下的应用程序都是选择MFC作为界面框架的。可是仔细考察以后就会发现,要使用MFC来构建一个类似uTorrent的界面(Crend鼎立推崇的一款BT软件)还是需要颇费一番功夫的。
首先,整个界面外观就需要布局。其次,界面中的布局可以根据鼠标拖动更改大小,并且做到大小自适应。这一点不太容易。然后就是下面的多标签(Tab)显示。每一个标签里面都是完全不同的控件布局。其中还有一个标签里面是下载和上传速度的动态显示。这在MFC里是不能够直接支持的,需要代码绘制。
当然,类似菜单Preference里面的左右分栏的效果也不是直接支持的。
我想说的是,uTorrent的界面元素看上去并不是太复杂,甚至是很基本的。然而,要想使用MFC构建这样的界面,需要的是对MFC比较熟悉,并且还可能需要写500-1000行代码左右。
如果是类似Office那样的界面呢?还增加一些透明效果,光影效果?
我最近使用.NET Framework来开发C#应用程序,用Windows.Forms来构建界面。应该说,比MFC要方便了不少,起码类似uTorrent这样的界面并不需要太多的编码就可以完成。可问题就是,当我还想更深走一步的时候,就遇到重重困难。比方说,我想自己做一个Textbox控件,来支持更多的功能,然而,要想在现有的一些界面控件上重新安排绘制过程,或者增加绘制代码,就显得很困难。然后还需要自己处理消息循环,而这些又都是在.NET Framework中去处理原生API,就更显得隔了一层。
好了,我的例子就说到这里。我的意思已经很明确了,就是说,一个所谓成熟的GUI库要具备哪些要素呢?
首先,提供基础的界面元素控件,比方说按钮,菜单,工具条。不能让开发者使用代码去构建这些基础的东西。
其次,要提供方便的布局方案。在开发系统的设计器中布局固然重要,但是很多情况下,软件在运行一开始,并不知道布局情况,或是在运行中,希望能够方便改变布局。因此,界面的布局方案是很重要的。MFC没有布局方案。Windows.Forms有专门的布局控件,但是这还不够。
第三点,处理消息或者叫事件要简单。要能够很容易去处理一些消息或者事件。MFC可能都需要使用一大堆生硬的宏。而Windows.Forms不需要这些,但也没有给开发者提供更多的处理事件的机会。除了标准的控件事件,Windows.Forms里面的不少控件都不能处理其他非标准的控件事件,需要挂接原生API。
第四,能够容易扩展。界面元素的绘制过程和方案能够进行重构。比方说,我可以通过继承或者其他的方式,改变标准按钮的绘制过程,从而得到新的按钮控件。而且,这种扩展应该是容易的。我仅仅希望改变按钮的外轮廓,我就处理外轮廓就行了,我不想管按钮内部的情况。你不能让我扩展轮廓还要从头画,这不行。
第五,界面和代码逻辑的集成性。这一点不太好理解。传统上,界面元素是没有语义的,按钮就是按钮,菜单就是菜单。和代码逻辑的集成,都是通过我们程序员来实现的。什么叫代码逻辑的集成?举例说,一个按钮代表了提取银行帐户里的前。那么,余额充足的时候,这个按钮应该是可用的;不足的时候就不可用。问题在于,这样的功能,只能通过我们用程序去判断余额,然后更改按钮的状态。一个小小的按钮没有问题,可是有时候,在一个系统中,某一个操作可能带来很多界面元素状态的改变,而且这种改变不是每一个元素都一样。通过程序,我们可能很难去收集现在这些元素的状态。更不要说如果是一个有插件的系统,我们也许都不知道有哪些元素需要去改变。所以,界面框架应该解决这样的问题,我只需要指明某个控件的什么状态与我的哪个逻辑是关联的,界面框架就自动去处理状态问题。
第六点,跨平台性。界面框架应该可以跨平台。这里指的平台不单单是操作系统,还有编程模型,比如Java、.NET、原生C/C++。不过这一点不太容易。
这是我归纳的六点关于GUI库的要求。现阶段普通的GUI库大多数都停留在第一个层次(如wxWidget,QT,GTK),仅仅是提供控件。当然,也有一些库提供了其他的功能。比方说Mozilla的XUL,提供了界面布局(XML),扩展性(使用类似HTML的方式,把界面元素和样式分离开,这样就可以通过样式来扩展元素的外观)。不过遗憾的是Mozilla只能使用C++开发,而且其依赖于Mozilla并不通用的框架模型XPCOM(类似微软的COM)。这多少有一点讨厌。
微软的Windows Presentation Foundation不错。基本控件、布局、扩展性都解决了不少,事件不知道如何。还增加了多媒体功能。不过跨平台性几乎没有。
Java的JFace也是使用XML进行布局。只是界面效果差强人意。Java在桌面应用程序上要走更远的话,界面的问题必须解决。
说了那么多,对Crend没有太多帮助:) 他还是只能暂时开发控制台程序,至少现在是这样的。
2007年4月17日星期二
微软的产品线
应该说,微软做得还是相当不错。很多人以为Google就是微软潜在的对手。应该说,从某个方面是这样的。但是,Google目前的产品线还非常有限,仅仅局限在互联网领域。不管是桌面还是企业级应用,Google都没有完整的产品线。微软的对手其实是像IBM,SUN,Oracle这样的平台厂商,他们都有这丰富的产品线,能够提供从开发到应用的完整链条。
几年前,我对微软的印象还是Windows和Office,外加开发所用的Visual Stuido。今天,仔细浏览微软的网站,我们会发现,微软已经为IT人员,商务人员,开发者提供了不同的产品链条。在每一个链条中,微软还提供了不同层次的产品,比如对于商务应用,微软针对不同规模的企业有着完全不同的解决方案。这使得用户在选择的时候,能够有的放矢。
再加上操作系统这一个先天的优势,微软目前已经迈入了一个新的,高速发展的时期。我们常常定住一些传统的产品,却忽视了整个产品线的认知。
相比起来,国内很难找到一个软件商,能够谈得上有产品线。没有产品的链条,就很难把客户捆绑在自己的某个产品上,进而也就很难做到真正能够循环发展。
2007年4月3日星期二
Google拼音
就目前而言,这款输入法让我感觉还不错。至少我的名字能够很轻松打出来,并且能够记住,这是不容易的。最新的微软输入法虽然能够输入我的名字,但是不能记忆,显得并不是很智能。
当然,这只是一个实验阶段的产品,仍然需要更进一步的试用才能发现问题。但是Google已经逐渐扩展自己的产品线,开始往传统的桌面发展,并且和自己的优势结合起来。这款Google拼音就能够使用Google账户同步词库信息,这是一个很酷的功能。
另外,我又重新使用了Google Desktop的本地搜索功能。虽然默认状况下不能更改索引的地址,但是网上有文章指导如何使用注册表来修改索引的地址。
我更改了索引的地址,又指定了一些目录排除在索引外。目前,我的索引有500多兆。但是查找文件信息十分方便。这还是我很中意的。
Google的脚步越来越快,不知道微软如何面对。:)
重新搭建工作环境
这次安系统倒没有遇到太多的困难。Linux也成功安装上了。唯一碰到的小麻烦事情就是Linux的分区。我在Windows下使用PQ Magic把最后一个磁盘的大约30G化为了自由空间。按照某篇网上的介绍的方法,我又把这个自由空间完全从Windows的扩展分区中给划了出去。
结果,Linux的安装过程中就没法分区。后来发现,不应该把那块空间从Windows的扩展分区中给拿出去,于是又重新把空间调整了。这下Linux分区成功了。
Linux安装费了大约一个小时,启动速度很慢。进去逛了一圈,不会用,还需要好好学习。
今天还差点把资料给弄丢了,幸好只是简单格式化了,用Easy Recovery就很容易恢复了。天啊,要不然我要重新写那么多代码,疯了!
2007年4月1日星期日
高级“单件”(Advanced Singleton Pattern)
高级“单件”(Advanced Singleton Pattern)
单件模式应该是设计模式中应用非常广泛的一种模式。单件模式可以确保某些类仅拥有一个实例化的对象。在实际的应用程序中,诸如打印机,内核,窗体控制类都常常应用为单件模式。然而,我们又常常遇到这样的问题,一个应用程序中有很多类都是单件类,该如何管理这些单件类呢?
单件的实现方法不尽相同,在一个应用程序中,我们可能很难知道哪些类是单件模式,哪些类不是。如果能够给所有的单件类提供一个统一的入口,能够十分快捷地得到一个单件类的实例,对于一个大型的应用程序来说,无疑是十分必要的。
这里我们实现了一个单件管理类,用于管理整个程序的所有单件。部分内容参考了《设计模式》一书。
我们的设计目标有两个:
1.每个单件类都不能够显示地实例化。
2.每个单件类都仅能够通过单件管理类来访问,换句话说,直接访问单件类的实例也是不行的。
这样做的目的就是想整个程序仅有一个单件的入口。下面展示的就是事例代码,由C# 2.0写成,用到了.NET的泛型。
public interface ISingleton
{
}
public class SingletonManager
{
Dictionary
public static readonly SingletonManager
private SingletonManager ( )
{
_singletons = new Dictionary
}
public bool CheckInstance ( string name )
{
return _singletons.ContainsKey(name);
}
public void Add ( string name, ISingleton single )
{
if (_singletons.ContainsKey(name) == false)
_singletons.Add(name, single);
}
public T GetInstance ( string name )
{
if (_singletons.ContainsKey(name) == true)
return (T)_singletons[name];
return default(T);
}
}
这就是单件管理类的代码和单件的接口。值得注意的是,单件的接口是一个空的接口。下面我们看看一个单件类是如何实现的:
public class ABC:ISingleton
{
private static ABC _instance;
pviate ABC() { }
public static void Register()
{
if (_instance == null)
_instance = new ABC();
SingletonManager
}
public void Print()
{
Console.WriteLine("Hello");
}
}
我们注意到ABC类实现了ISingleton接口。其实,ISingleton接口仅仅是想让单件类有一个统一的原型。同样可以使用一个abstract 类。我们注意到,ABC不能直接实例化,也不能通过直接访问ABC来得到ABC的实例。唯一可以直接访问ABC的是一个静态方法,即向单件管理类中注册当前ABC的实例。而ABC的实例化就是在注册的时候完成的。
要想得到ABC的实例必须通过访问单件管理类:
ABC a = SingletonManager
注意,我们这里使用泛型完全是为了客户端代码的类型安全而考虑的。SingletonManager中存放的是ISingleton的集合,但实际上我们想得到ABC的实例。于是通过泛型通知SingletonManager我们想得到的类型,从而免去了类型的强制转换。
这样我们可以很容易知道一个类究竟是不是单件类,也很容易去控制单件类的行为。
2007年3月28日星期三
这段时间喜欢上了Google的软件。
这段时间喜欢上了Google的软件。应该说,我之前使用过Google的一些软件,给我的感觉各不相同。比如Google Earth的确非常不错,但是Google Desktop就不那么好。最近使用了最新的Google Desktop,体会到了很大的进步,同时我还使用了Google Talk和Picasa,觉得很不错。下面就说说我具体的感受。
- Google Desktop
这个软件应该是Google 的一个核心软件。其设计理念很明显,就是要把传统的桌面程序和网络给同一起来。也就是把Google的服务从互联网上转移到桌面上来。Desktop的核心就是搜索。搜索的效能应该说毋容置疑,但就是有一些看似很简单的地方让人很反感。比方说,在没有任何提示的情况下就安装到了系统盘(也就是C盘中),这十分讨厌,因为很多用户希望应用程序安装到其他的驱动盘上。而且,搜索的索引也放在了C盘中。索引会根据使用的时间增长而变得很大,同时反复长期对索引文件的读写使用,也会给C盘带来大量的磁盘碎片。事实上,正是因为这个看似不起眼的功能,我彻底关闭了Google Desktop的索引功能,放弃了本地搜索。类似的MSN Search却可以选择索引的文件夹。
Google Desktop另一个我不是特别接受的地方就是,设置和查找都要放在浏览器中。也许Google的想法是要让用户感觉到和在网上搜索一样的体验。但是,我自己还是觉得完全可以做成一般的应用程序,因为打开浏览器浏览总会出现一些问题,比如禁止了JavaScript就可能出现一些错误。
说说好的方面,那就是Gadget引起了我极大的兴趣。实际上,Gadget如果有足够多的插件的话,完全可以成为个人的信息中心。我现在添加了一个常用的组件,可以很方便的查看当天的天气,新闻和我感兴趣的博客信息,同时还有记事和任务的记载,十分方便。而且还有一些漂亮的小功能,比如时钟,能够给桌面一种清新的感觉。似乎Vista中也有类似的功能。我下载了Gadget SDK,发现Gadget开发依靠的是JavaScript和CSS,其实也就是和一般的网页开发所需要的技能。这一点,Google和Mozilla似乎不谋而合。然而,适用JavaScript也有一个问题,就是Google Desktop的内存占用常常很高,特别是对一些高质量的图形进行操作。 - Google Talk
我是看了“云风”的介绍后下载使用的。我的感受非常好,简单,实用,没有任何多余的功能。实际上,现在很多即时通讯工具都走入了歧途,比如QQ,功能太多,太杂,而且占用资源非常大。Google Talk的只有聊天,音频聊天,传文件几个基本功能,但是足够适用。同时,和Gmail完美集成,还可以把聊天记录保存在Gmail信箱中,十分方便。而且,Google Desktop也把Google Talk做成一个Gadget,因此就更容易检查信件。
目前的缺点就是,好友不多。 - Picasa
应该说这款软件也是非常实用。把网络相册和本地相册结合起来。同时对本地的图像的管理也十分到位,基础的功能都有,而且体现出了Google管理信息的长处,本地的图像不管存放在哪里都能够很好的索引起来。而上传照片则更是一个很不错的功能,不仅照片质量没有太大的影响,更是能够达到数量不小的照片能够在很短的时间内上传成功。
网络相册的免费用户有1G的空间。理论上来说,应该是够了。
Google的软件都有一些共同的特点,那就是简单,实用,同时界面美观。然而和网络集成过密也成为了Google软件一个问题。比如,在没有互联网的情况下,上述软件的很多功能都要丧失甚至无法适用。同时,在线的Docs & Sheets功能也远没有达到Word和Excel的程度,仅仅做简单的查看还可以。
Google的软件梦,还需要更多的努力。
2007年3月23日星期五
Computer Science和Computer Technology的区别
Computer Science和Computer Technology的联系我就不想说了。两者肯定有很密切的联系。我主要想说说两者的区别。为什么要谈区别呢,原因就在于,对待两者的态度可以决定了一个人究竟在计算机行业中处于什么位置。
举一个例子,如果一个人在谈论编程语言,那么下面的情况就可以断定这个人在谈论Computer Technology层面的东西。比如,这个人谈论Java的Spring框架,谈论GUI设计库的好坏,谈论C#如何实现编辑软件。总之,就是谈论语言如何去做软件。
而Computer Science谈论到编程语言,就要谈论,这种语言是什么类型的语言。编译器如何实现。如何扩展这种语言。语言中的某个特性如何影响语言的整体效用。很多时候,这种讨论完全不用具体到一个实际存在的语言上。
还有例子。比如谈论对库的应用,Computer Technology谈论的是如何高效使用库,库与库之间的优劣。而Computer Science谈论的绝对是库如何设计,其中的哪些算法可以改进到线性级别。
再比如,Computer Technology知道有链表,知道有排序,但是只要知道他们在标准库里在什么位置,如何使用就行了。但是Computer Science却要理解,链表是如何实现的,插入算法是什么,排序有哪些,时间复杂度是什么。
还可以举例子。谈论到操作系统,Computer Technology喜欢比较不同操作系统的优劣。喜欢谈论哪个操作系统的界面更加华丽。而Computer Science则注重系统是如何实现的。系统的内存管理算法是否改进,系统是否支持多核,如何支持,调度算法是什么。
总而言之,Computer Science注重的是理念和算法,不太在意具体的工具或者环境。实际上,著名的《The art of programming》就完全和平台无关,甚至里面的代码都建立在一个完全虚构的计算机和开发语言上。而Computer Technology则注重自身的环境,什么系统,什么中间件,什么语言,并因此来划分各自所属的阵营。
当然,上面说的都是一些感性的认识。实际上,Computer Science和Computer Technology是互相渗透的。
2006年1月17日星期二
感觉差了很多
今天从书店买回来了一本叫《游戏之旅——我的编程感悟》的书,一方面因为作者是国内知名的网络游戏“梦幻西游”的作者,一方面也因为作者年纪轻轻却已经背负上了“大师”的称号,让我很想知道他的成长经历。
整个晚上都在翻看这本书,没有仔细抠每一个细节,不过在翻完了整本书以后还是很有感触,也很兴奋。作者基本上是自己的同龄人,诉说的故事和经历也是我很熟悉的。虽然从作者谈论的很多东西看出,作者的确还不是能够完美解释编程领域的很多东西,而且关于开发流程和开发经验的东西也略显单薄,但是正本书给我的感觉仍然是流畅和诚实的,说自己知道的东西,而不说自己不擅长的东西。
作者的经历勾起了我很多的回忆。和作者一样,我也是从苹果的电脑起步的,甚至作者介绍的“中华学习机”,我也曾经用过了很久。只不过,作者的QBASIC,换成了我的LOGO。
而我和作者也是同样在中学加入了信息学奥林匹克竞赛的队伍。和作者不一样的是,我最终也没有得到一个理想的名次。当然,我也和作者一样,受益不少。
说起来,很多方面我都比作者差远了,因为种种原因,我没有能够像作者那样狂热地去编程。所以,至今都没有太大的长进。而且我也没有那种精神。这也造成了我最近一两年,本该快速提高的两年,耽误了不少。
我最近也想写一些东西,然而我现在发现,还是缺少积累。慢慢写吧。
