• 2005-12-18

    为什么计算机系的学生应该主要使用国外的教材

    Views: 7028 | No Comments

    To be or not to be? That is a question!

    为什么计算机系的学生应该主要使用国外的教材?因为计算机的核心技术掌握在外国人(美国,日本等少数几个国家)手里。是的,这就是最好的理由。

    但是,我的说法看起来是不正常的,因为现在国内的大学使用的计算机教材几乎全是国人自己编的。我不是说我们自己写的教材一无是处。谭浩强写的《C语言程序设计》也很不错。但是,即使是这样好的一本国人自己写的教材,也不是大部分学校都作为教材。不少大学的非计算机系几乎不用这本教材,而是使用他们学校某几个老师编的小册子,水平差得不用说。他们是有理由的---谁都有理由---非计算机系的学生学习这本教材太难了!

    学习过这本教材的人都知道,谭浩强的《C语言程序设计》是一本非学易学的教材。这本教材的目的就是让从未写过程序甚至是从未接触电脑的人学习程序设计。所以,某些人编的小册子不一定比它简单。

    国外的教材,特别是一些名家写的基础教材,是经过十几年甚至几十年的时间考验的。不过,同意使用国外教材的人又过分强调英文原版的作用,认为:

    1. 最新的技术都是先用英文发表的。
    2. 翻译的书不能很好保留原作的意思,即使译者水平极高,那往往是初版发表半年或者一年甚至更久。

    这两个观点我是绝对赞成的。不过,对于一些基础的教材,特别是那些经久不衰的名家手笔,使用中译本更好。因为中译本也经过了时间的验证。

    反对使用国外教材的人认为:

    1. 外国人的思维习惯和中国人不同,中国的学生很难看懂和理解他们的书。
    2. 既然我们写出了教材,为什么不使用我们的。应该支持民族的东西。

    我认为是极为可笑的。首先,他们过分地强调西方人和中国人思维习惯的差异性。我只发现美国人食物的烹饪方法和我们极不相同,并没有发现美国人的思维和我们有多大的差异,特别是对科学的描述方面的差异(或者说他们的“怪异”之处)。而且,没有一个正常的译者是采用直译的方法。

    对于第二点,我们都知道,国人写的计算机方面的好教材是屈指可数。

    不过有一点我们必须注意到,当前有不少出版社(包括知名的)因为引进的国外教材的热销,而有意地引进了不少外国人写的没有多少水平的书。这需要我们聪明地选择了。

    好吧,既然这样,我们为什么不主要使用国外的教材呢?对于学生来说,开始是不了解哪本教材好,主要是老师介绍(或者统一购买---当然大部分是自愿的,并没有强迫)。所以使用什么教材是老师(不是某个人,而是一个群体,或者他们的领导)说的算。

    既然我们学生拥有自由,有什么理由不选择真正的知识来学习呢?

    我们是要像十六世纪西方宗教改革前的农民向宗教势力购买赎罪券一样购买那些以次充好的教材,还是花两倍或者更多的价钱从美国人手里买来我们想要的教材?这是个问题!

    2005年12月18日

    Posted by ideawu at 2005-12-18 13:46:35
  • 2005-12-09

    Linux不是Windows

    Views: 6422 | No Comments

    Linux不是Windows

    上次修改时间: 2005-12-04 13:51

    贡献人: 来源:http://linux.oneandoneis2.org/LNW.htm, 中文:http://www.ubuntu.org.cn/lnw, 翻译:laborer

    !=

    以下的文章中,当我提到GNU/Linux操作系统和种种的FOSS(译者:自由和开源软件)项目时我都会用一个统一的名称Linux来代替,这样看起来好些。

    如果你像我一样花些时间在Linux论坛上,那你就会像我一样因为有太多这样的帖子而恼怒:

    "嗨!我用了几天Linux,总体还行。但某某功能不能像Windows那样,真糟糕。为什么开发人员不能重写一下让它更像Windows一点?我相信这样做的话Linux的用户会更多!"

    你也许尝试过回应这些问题,结果那个Linux新手却和你吵得面红耳赤,他根据自己几年来在另外一个操作系统上和区区几小时在Linux上的经验,得出结论:他的想法是无比睿智的,而你不同意他的观点是因为你是一个从“古董学校”出来的Linux用户,认为GUI是恶魔的产物,所有人都应该强迫去用CLI (译者:命令行界面)。

    本文的目的就是向这样的新手解释为什么他们的观点会引发争论而不是受到欢迎。

    首先就是这个最常被提起的论断: "如果Linux能这样,那就会有更多的人从Windows转过来!"

    这样,让我先解释一下为理解Linux所需的基本常识:Linux社区不会试图去为一般的Windows用户提供一个替代的操作系统。Linux的目标不是“每台机器都装Linux”。

    千真万确,真的不是。. 的确,它们都是操作系统,的确,它们都能做相同的事情,但是这让Linux成为一种选择,而不是替代品。这看上去也许算不上什么区别,但实际上却是最最重要的一点。

    Linux和Windows就如同摩托车和小汽车:都是车,能通过公路吧你从甲地送到乙地,但它们有不同的形状、不同的尺寸、不同的操作装置,其基本工作方式也不同。它们是不可以随意互换的。它们有不同的用途、不同的长处和短处,你要挑选一种适合自己的,而不要指望一种可以完全替代另一种。

    一个开车的人遇到塞车时,看到摩托车自如在车堆中来回穿梭,他也许会羡慕摩托车所具备的这种能力。如果这个司机接着又说:“我对汽车了如指掌,所以我也一定同样了解摩托车!”,那么他就错了。

    * 如果那个司机买了一辆摩托,然后发现很难适应用手旋转握把来控制加速,而不是脚踏板,他可能会报怨摩托也应该装油门踏板。

    * 如果那个司机有一个老婆两个孩子,他也许觉得摩托车只能载一个乘客是个缺点。他会建议重新设计摩托车,使其可以两两肩并肩的坐四个人。

    * 如果那个司机想骑摩托车,却发现无法控制平衡,总是摔倒,他也许会建议让摩托车也安上四个轮子。

    * 如果这个司机发现转弯时自己身体总会倾斜,那他会建议在摩托上装稳定器使其可以在转弯时总保持正直。

    * 如果这个司机怕摩托车被偷,他也许会报怨摩托没有门,让小偷容易得手。

    * 如果这个司机觉得头盔碍事,他也许会建议在手把上装一个安全气囊以替代烦人的头盔。

    这些情况下他都错了,因为他想用摩托车替代汽车,他想让摩托做所有汽车能做的,他以为摩托的工作方式与汽车相同,比汽车缺少的功能只要嫁接上就行了。

    同样,一些好心的Linux新手也建议把Linux变成他们所熟悉的样子,结果也因为相同的原因没有任何所获。也许Linux和Windows都可以被用于完成相同的任务,但汽车和摩托也是。这并不意味这你可以直接从一个换到另外一个,也不意味着它们的特性可以相互替换。

    太多的人以为从Windows转移到Linux就如同宝马换奔驰一样,认为其控制方式应该相同,他们的经验直接可以派上用场,而两者之间所有的差别也仅仅是表层的。他们想:“在公路上行驶时,我需要汽车,在使用电脑时,我需要操作系统。汽车的工作方式都相同,因此操作系统的工作方式也应该都相同。”但这并不准确。“在公路上行驶时,我需要车,在使用电脑时,我需要操作系统。我知道如何开汽车,但我不懂摩托车。我知道如何使用Windows,但我不懂 Linux。”----这才是准确的。

    Windows用户必须意识到他只是一个有经验的Windows用户,而不是有经验的电脑用户,就像汽车司机仅仅是汽车司机,而不是所有种类车辆的司机。Windows用户必须意识到当他在尝试Linux时,他又成为了一个新手,就像汽车司机去尝试开摩托。 Windows必须要愿意去学习完成相同任务所需的不相同的手段,就像汽车司机必须要去适应替代方向盘的手把和他从没戴过的头盔。并且他们要作好心理准备:这些“不同”并不意味着“劣等”。

    这个简单的事实给有基础的Windows用户造成了更大的麻烦。他们来用Linux时带着根深蒂固的Windows操作习惯和一种态度:“谢谢,我知道怎么用电脑!”问题是,他们并不知道,他们只知道怎么用Windows。当面对另一种操作系统时,这些高级用户可能会遇到最糟的问题:他们有太多的经验需要遗忘掉。

    当一个新手说“我不知道”,接着就开始在论坛上探索、提问时,一个Windows高级用户可能会说:“我知道怎么做,我就这么、这么、这么做,然后……居然不行!愚蠢的系统!”接着他们又说:“如果我这么有知识的都搞不定,那新手就更不要想了,Linux离桌面应用还有十万八千里呢!”他们恐怕没有意识到他们的知识帮了倒忙,使他们比经验少的用户遇到更多的问题。他们错误的以为Linux是一种可以和Windows做相同事情的软件,而事实上是它是一种不同于Windows的软件,做的事也不同。不是Linux做与Windows相同的任务做得不好,而是它很好的完成了一个替代的任务。

    Linux是一种可供选择的操作系统,而不是Windows的替代品。它也永远不会取代Windows,因为它们有完全不相容的目标。微软的目标是让他们的软件装到更多的电脑中,赚更多钞票。而Linux不是这样,它是免费的,它的着眼点不同。

    要理解这一点就要先理解FOSS 。并不奇怪很多Linux新手现在还不能很好的理解它,他们是新手嘛,他们还是习惯于从私有软件的角度思考。所以让我解释一下:

    典型的FOSS软件的作者往往因为对现存软件的不满,于是想到自己来写一个。而他又是个大好人,他把软件源码公之于众之后对大家说:“你们自己折腾吧!”。他可以这样做,因为复制软件没有任何成本,所以把软件贡献给世界也不会比自己留着用多花一分钱。他不会因为把软件送人而感到痛苦。

    然而,很重要的一点需要记住的是:他也不会因为送出软件而获利。不论是一人用还是一亿人用,对开发者来说毫无区别。哦,当然,他一定乐意看到自己的产品广受欢迎:用户数是个自我吹嘘的好题材,还能创造记录。但这不会为他带来任何金钱:因为这是FOSS。

    如果这个软件有所成功,别人就会对此感兴趣,也愿意帮助改善它。这是FOSS最大的优势:每一个用户都可能是潜在的开发者,每一个人都能参与使软件工作得更好,功能更多,bug更少。如果一个软件能吸引到一大帮开发者那将是非常好的事情。但这仅是对软件本身而言的,它会使软件变得更好,而开发者不会因此致富,只会让他们为此投入更多的时间。

    FOSS与如Windows一类的私有软件截然相反:FOSS完全关注于软件本身,而不在意最终用户的数量。软件运行很好,但用户寥寥,这从商业软件的标准来看是失败的,但从FOSS的标准来看却是成功的。

    FOSS关注于编写高质量的软件,真正能做事的软件。如果你想使用它,那你就需要投入时间来学习如何使用。FOSS软件是免费供你使用的,为编写它许多人不去计较个人利益,投入了大量的时间 。因此,在你报怨它不能像Windows中相对应软件一样工作之前,至少也应该投入一点时间,算是对软件作者贡献的一种尊敬吧。

    “哈哈,现在我抓到你的破绽了,”一个新手自鸣得意的说:“有一些Linux项目的目的就是替代Windows,而不仅是提供一种选择。”

    不难看出这种想法从何而来。例如,KDE和Gnome提供了一种不同于Linux传统的窗口管理器和CLI的桌面环境,它们更加类似于Windows。Linspire更一种要把Linux做的完全和Windows一样的Linux发行版。

    然而,这些论据更能支持我的观点,而不是那个新手的。

    为什么?因为这些都是标准的FOSS项目,都是以把软件做得更好为目的的。唯一的区别就是,在这些项目中品质的定义是“如何让Windows用户使用起来更方便?”

    你一旦考虑了这个因素,你就不得不同意这些项目的目标都是改进软件本身,它们都是100%的典型Linux软件。这些项目由那些更加无私的开发人员编写:他们这样做不是为满足自己的需要,因为他们已经太熟悉Linux了。相反,他们是为了使其它人从Windows过渡到Linux更加容易。

    这些开发人员知道有一些Windows用户希望转投Linux阵营,于是他们花力气建造一个能让Windows用户感到舒服、熟悉的Linux环境。他们无意去替代Windows,尽管最终的结果给人留下了这样的印象,但他们的最终目的是不一样的:不是制造一个Windows替代品,而是帮助 Windows用户过渡到Linux上。

    社区里反对这些项目的声音并不罕见。有些人理由也是合理的(“KDE太吃资源,还是用Fluxbox好”),有些人则抱着一种不够理性的“像Windows样的软件都不好”的态度。事实上这不是反微软或反Windows的态度,而是蛮不讲理的憎恨自己不了解的东西。

    典型的Linux用户是一个电脑爱好者:他用电脑因为电脑好玩,编程好玩,hacking(译者:这个词非常难译,没有一个简单的词能够代替,这里主要是指修改软件使之满足自己需求)也好玩。而Linux是hacking爱好者的最爱,他可以把Linux分解到最基本的部分,然后再根据自己需要重新组装起来。

    然而,新来的Linux用户很大部分不是电脑爱好着,也不是hacker(译者:修改软件使之满足自己需求的人)。他们只要求电脑能工作,就像Windows那样工作。他们没兴趣去花时间设置Linux,他们希望拿来就能用。

    这很好,但在典型的Linux用户看来,这就如同有人想要一辆已经组装好并用胶水粘牢的乐高玩具汽车。这对他们来说实在无法想象:“怎么会有人要这个?”

    这的确难以理解。如果你想要一辆做好的汽车模型,那去买一辆玩具车。如果你想要一辆可以自己组装的车,那就买乐高。怎么会有人想要一辆只能当玩具车玩的乐高车呢?乐高的乐趣就在于自己组装啊!

    典型的Linux用户也会如此回答那帮问“为什么它就是不能工作呢?”的人:“如果你仅想让电脑工作,用Windows好了,如果你想自己能动手修改,那就用Linux。如果你对开源软件的这些好处毫无兴趣,那你干什么还要转去用Linux呢?”

    答案通常是他们根本就不是真心想去用Linux,他们仅仅是想远离Windows:他们希望远离病毒,远离恶意软件,他们希望免除收费软件的限制,不被E.U.L.A.所束缚。他们不是在尝试投入Linux的怀抱,他们只想摆脱Windows。而Linux只是最广为人知的一种选择罢了。

    稍后再进一步论述. . .

    你可能想:“好吧,这样可以解释为什么开发者不去尽力让他们的软件更像Windows,但是Linux软件也可以在不违反FOSS的原则的前提下拥有有像Windows那样友好的GUI呀。”

    有一些理由可以说明为什么不是这样。

    首先: 你真的认为写软件的人会故意去弄个很烂的用户界面?

    当一个人投入大量个人时间去编写软件时,他总会努力使软件的用户界面(UI)尽可能的好。UI对软件来说太重要了:如果某个功能不能通过UI来访问,那它就根本毫无意义。你也许不知道,但UI成为现在这样不是没有道理的,其原因是那就是软件创造者能做出的最好的UI了。

    如果你仍坚持类似Windows的UI使软件更好,请不要忘了这样一个事实:这些软件的作者并不同意你的意见。他们对这些软件的理解肯定比你要深刻得多,也许他们错了,但可能性很小。

    第二: 现在已经有很多漂亮的、易于被Windows用户接受的GUI前端。我想不出有什么功能不能通过GUI来控制,不管是多么高级的。你可以编译内核(make xconfig),设置放火墙(fwbuilder),硬盘分区(qtparted)……这些都可以由好看的、交互的、符合直觉的并且用户友好的程序完成。

    但是Linux的发布周期与Windows不同,不可能从一开始就有一个精良的GUI界面。GUI只会增加软件的复杂度,而不会给功能带来什么改进。开发者的本意可不是弄个花哨却什么也做不了的GUI,他们创作的是自己需要的软件。

    一个软件最先能做的便是在命令行(CLI)方式下使用,它可能包含各式各样的调用选项和长长的配置文件。因为这是实现软件功能所需要的最基本的东西,其它的都可以慢慢完善,即使日后有了漂亮的GUI,但我们仍应当看到:通常它还是完全可以用CLI和配置文件来控制的。

    * 这是因为CLI有很多优势:CLI通用;每个Linux系统都有CLI;所有程序都能从CLI执行;远程访问CLI也特别方便。而GUI则不然:有些Linux机器没装X11窗口系统;有些软件不能通过GUI菜单访问;通常远程使用GUI工具也不容易。

    最后,可能会有不同GUI前端能做相同事情,别人无法知道你到底装了哪一种。

    所以请记住,当你问“我该怎么弄……?”的时候,大部分情况下别人都会告诉你怎么通过CLI解决。这并不意味着问题只能从CLI解决,而是恰恰反映了在软件发展过程中CLI相对于GUI的重要性。

    * Windows是完全以GUI为中心的,它是一种基于GUI的操作系统,其CLI是烂得可以(但很快就要改善了)。几乎没有什么Windows软件是没有GUI的。这也使人们认为GUI是一个软件必不可少的重要元素。但对于Linux来说,软件一旦能工作就可以发布了,只有等它足够稳定、没什么bug、功能也很丰富时才有必要增加GUI。

    请试着把一个没有很好GUI界面的软件理解为内部测试版,而不是一个已经完成的产品。FOSS还远远没有“完成”,它还在不断的改进中。只要时机成熟,它完全可以变得用户友好。但在大部分情况下,使它工作的更好要比使它看上去感觉更好重要得多。你应该高兴今天就有机会能用上未来软件的功能,而那些只喜欢漂亮GUI的人就享受不到了。FOSS并没有到达它旅途的终点,它才刚刚上路呢。

    最后你还需要记住的是:软件的GUI部分经常是分开提供的,甚至有可能是完全不同的开发人员独立开发出来的。所以如果想要GUI,那一点也不奇怪你必须分开安装,而不是一次性装好。

    诚然,为了获得Windows式的GUI,分开安装确实增加了额外的步骤,但这不影响这样一个事实:你现在就可以通过“像Windows一样”的GUI做几乎所有事情。请不要忘记GUI通常只是最后一步,Linux绝不会只图外表而不重内涵的。

    第三: Linux是特别设计给知识丰富的老手使用的,而不是无知的新手。有两个原因:

    * 无知乃与生俱来,但它很短暂,知识才是永恒的。也许要几天、几周、几个月才能让你从“Linux新手”成为“中等的Linux用户”。但你一旦达到这个水平,你就可以一直用下去了。

    为了使软件对新手来说比较易用而放进一大堆代码就如同给所有自行车焊上永久的平衡轮。也许这会让起步变得比较容易,但之后呢?我相信你现在肯定不会想买一辆带平衡轮的车。不是因为你是一个反对用户友好的怪人,而是平衡轮对你来说毫无用处了,除了新手谁都用不上,放在那里反而碍事。

    * 不管软件多好,用户要能用得好才行。就算有世界上最安全的门,如果你不关窗、不锁门或者忘拔钥匙,小偷一样畅通无阻;就算有世界上最好的引擎,如果你加错了燃料,一样跑不了。Linux把所有的能力都交到了用户手里,这也包括破坏它的能力,当然没人想这样。想要保持Linux正常的运作,多学点让自己知道自己在做什么是唯一的办法。如果用户可以很容易的操作那些他根本不了解的功能,那么他也很有可能会造成破坏。

    第四: 从上面的文字中,你觉得FOSS有可能通过吸引典型的Windows用户而获得任何好处吗?

    不急,你可以重新看一遍,我等着。

    Linux和FOSS的指导原则是“做好的软件”,并非“做Windows的替代品”。一群典型的Windows用户对Linux的唯一贡献就是报怨。他们报怨什么?“它工作得不像是在Windows上那样。”

    不,它不像。如果Linux工作得就和Windows一样,那就太烂了,它将会是一个没人要的劣质品。人们如此热烈的喜爱Linux正是因为它不像Windows,它不会替你做每件事,它不会假设你永远是个无知的新手,它不会所有把内部的工作都隐藏起来。

    Windows是载着你四处跑的司机;Linux则给了你钥匙并让你坐上驾驶座。如果你不会开车,那是你的问题、你自己的错。只要你肯问,很多人都会帮助你。如果你提建议类似于装备定速巡航系统,你定是有所领悟:汽车还是自己控制在自己手上,只不过可以省不少力气。但是如果你尝试去劝说别人Linux真的真的需要一个司机,那你真该忏悔一下。

    “但这将使Linux更加主流啊!”,新手叫到。

    也许是这样。但是Linux成为主流,开发者们又能从中得到什么好处呢?Linux是免费的,就算Linux获得了更大的用户群,Linux的创造者们不会因此多赚钱,Linux论坛上的人们也不会由此获利。Linux的目标不是“获得更大用户群”──那是私有软件的目标。

    Linux的目标是创造真正好用的操作系统。开发者们一直都在忙于增加功能、减少bug和改进现有的代码,他们可没有闲功夫去举着广告牌宣传他们的东西有多好。你不难发现在他们眼中什么才是最重要的。

    有意思的是这样的模式使Linux的用户群不断增长,Linux开始很渺小,后来却非常巨大。什么原因使Linux得到如此广泛的认同?原因是它一直将质量视为焦点。用户被Linux自由和质量所吸引,而这只有FOSS能够提供。Linux能够发展壮大正是因为它并不在乎自己有多大。开发者们仅仅关注如何使它工作得更好,于是他们吸引了那些想要一个能工作得更好的操作系统的用户。

    如果突然把这一切都抛弃,相反让Linux去关注如何替代Windows,那就等于抹杀了Linux赖以成功的要素。有些公司已经看到了Linux成长潜力,希望从中掘出宝藏。但GPL成为了他们的障碍,他们无法把Linux买出Microsoft的价。“Linux如果还坚持开源的话那肯定长不了,”他们说,“因为没人能这样赚钱的。”

    他们没有意识到把Linux变为私有软件是杀鸡取卵的短视行为。正因为Linux是FOSS,也没有人想用它去替代Windows,Linux才能发展到今天的规模。Linux繁荣的原因恰恰在于它在与Windows的竞争中选择了一条Microsoft永远无法对抗的阵线:开放和质量。

    对于大多数Windows来说,Linux只是一个劣质的Windows摹仿品,它看上去功能不够丰富、集成度差还特别复杂。对于这些用户来说, Linux是个很差的操作系统。的确是这样:Linux没有满足他们的需求。他们需要的是一个简单易用的操作系统,不用任何学习就能上手。

    Windows是设计给非技术人员使用的,他们普遍感到Linux很难用。尽管情况不是这样,但这种误解还是可以理解的。

    事实上Linux很容易使用,真的非常非常易用。那为什么他们都不这么看呢?因为“易用”一词含义被严重的扭曲了,“易用”现在被理解为“在没有预先学习的情况下用起来也很容易”。但那真的不是“易用”的含义,而是“易懂”。其区别就如同:

    * 一个保险箱,上面有一张纸条写道:“如需开此保险箱,请先把播盘播到32,然后到64,然后到18,然后到9,最后拧动钥匙,同时向上提起把手即可。”

    * 一辆小汽车,只要按动摇控器上的“开锁”按钮就能打开车门。

    开车锁相比要容易得多,对吧?只要靠近汽车,一个按钮就能搞定,不像保险箱还得精确的来回转动播盘。然而,对于两种锁都不会开的人来说开保险箱锁要比开车锁容易:保险箱上写有清楚的打开方法,而开车门的按钮甚至都没有装在车上。

    会者不难。Linux也是这样,它很易用,但是学起来辛苦,只有当你愿意投入时间去学习Linux时你才能发现它为什么简单。不可避免,你越是把任务分解为简单的步骤,完成这个任务所需的步骤就越多。

    让我随便来举一个简单的例子:把文本中的五行(段)从中间移到尾部。

    如果用微软的Word、写字板、记事本等等“用户友好”的Windows文本编辑器,最快的办法是:

    - Ctrl-Shift-Down
    - Ctrl-Shift-Down
    - Ctrl-Shift-Down
    - Ctrl-Shift-Down
    - Ctrl-Shift-Down
    - Ctrl-X
    - Ctrl-End
    - Ctrl-V
    

    (这里假设你使用键盘操作。不然,你需要好几步鼠标托拽操作和可靠的自动滚屏。)

    在vi里只需如此:

    - d5d
    - Shift-g
    - p
    

    论“用户友好”性,vi可谓要多差有多差,但它完成同一操作所需的击键次数却比微软的软件少。为什么?因为Vi注重于功能,而微软更注重“用户友好”。微软把所有事情都分解为简单步骤,所以完成同样的任务要花多得多的步骤。

    这使得不论是什么样的文本编辑任务,一旦你学会使用,相比之下vi都更加高效、易用。如果你不知道“d5d”的意思是“将五行文本放入缓冲,然后将其从文档中删除”,那么可能你用起vi来就会感到很痛苦。但如果你已经知道了,那用它起来就是随心所欲了。

    所以当一个新手看到有经验的vi用户可以如此快速、方便的做事时,他自然会很容易得出结论:编辑文本,vi要比Word强。然后他自己去尝试,运行vi,看到的是满屏的~s,打字,什么反应也没有。

    后来他弄明白了文字录入和命令模式,接着就想用vi做事。然而对vi过于有限的知识依旧使他步履维艰,在他能真正掌握vi之前还有太多的东西要去学习。然后他开始报怨:“vi如果能像Word那样易用就好了。”

    但实际的问题是:“我不知道怎么用vi,学起来太麻烦了。”这是他自己的问题,他在指责自己的问题而不是软件的。 有成千上万的人乐意于使用vi,他们从没报怨过说:它太难用了,必须改!

    请相信我,如果他能写出一个软件既像Word那样“用户友好”又像vi那样功能强大,那他一定能赢得无数掌声。事实上,他应该还能赢得诺贝尔极度智慧奖,因为目前还根本没有其它人能做到这一点。但他如果仅仅是诉苦vi太难用,那只会遭到嘲笑,因为vi没问题,问题在他自己。

    转至 UserFriendly.org 版权所有 ? 2004 J.D. "Illiad" Frazer.

    (译者:

    图1,左:你有没有给Niffle先生打电话,关于他的连接问题?右:有。

    图2,左:那分析结果是?右:经典PEBKAC问题。

    图3,左:PEBKAC?右:键盘和椅子之间存在的问题。)

    这就像买了达芬奇的画笔然后报怨自己还是不会画画。画家的技巧才是成就名作的关键,画笔本身创作不了蒙娜丽莎,它只是一个依赖使用者技巧的工具。而这种技巧必须通过练习才能获得。

    vi正是如此,很多Linux软件也一样。一些新手总是报怨这些文本编辑器、包管理器或者命令行本身太复杂、太不够直观。

    在你坚持Linux某些东西必须修改之前,请问自己这样一个问题:“那些老手们是不是也有同样的意见呢?”

    如果答案是“不”,那问题在你自己这一边。如果其它人都能很好的使用,你为什么就不行呢?你有没有花时间去学呢?或者你是否打心底里就没有想去尝试呢?

    “用户友好”和“底层的功能性”常常是矛盾的。那些小按钮和下拉菜单确实能使软件变得易于使用,但对有经验的用户来说它们却可能是麻烦。这就如同拿着地图和指南针从A走到B,与看着路标走的区别一样:谁都会跟者路标走,但这会比知道如何直接过去的人多走一倍的距离。

    (译者:蓝色线条:“简单”路径;红色线条:直接路径)


    粘贴数值。我不想在这些“友好”的菜单、子菜单和对话框中选来选去,我就想直接完成。老实说,如果重设快捷键,再记录一些宏,我完全可以通过键盘来指挥Excel和Word做绝大部分的事。

    但这就不是用户友好了,对不对?它还是需要用户投入大量时间来研究这个软件。Linux要求你花时间学习如何使用现成的功能,而“用户友好”的软件却要你花时间自己创造功能。

    如果你喜欢这样,没问题,你就这样做好了。只是你应当看到:问题出在你自己的知识水平上,而不是软件本身。一旦知道如何使用,所有的Linux软件都超级好用。但如果你不知道,那它就显得很难使,这并不是软件的错。

    现在也许你开始觉得Linux有点态度问题。它不想要用户,它不想让自己的用户感到方便……它只是给那些自命不凡的l33t h4xx0r5用的!(译者:l33t h4xx0r5又可写作leet haxxors,指不受电脑系统权限所约束、对自己的电脑技巧极有自信的人,通常指黑客)

    这完全脱离事实。Linux当然想要用户,它当然不想让事情变得困难。正相反:按照Linux的定义,难用的软件就是垃圾软件。

    但是你要知道,它的定义可能和你的不同,也和“传统”的私有软件的定义不同。

    Linux想要那些真正需要Linux的用户。这不仅是说需要一个名头,而是所有的东西:自由、开源的软件;自己修补软件的能力;坐上驾驶座的感觉,一切尽在掌握。

    这才是Linux,这才是Linux关注的。人们因为讨厌病毒、讨厌蓝屏、讨厌间谍软件而转去用Linux也是可以理解的。但这些人并不需要Linux,他们只想要一个没有那么多毛病的Windows。他们不要Linux,那Linux凭什么一定要他们呢?

    但如果他们因为病毒和间谍软件而去尝试Linux,然后慢慢接受了Linux的理念并开始被Linux自身的特点所吸引,继而想要使用它,此时Linux也想要他们。

    在你决定转而使用Linux之前,问问自己“我为什么要转?”

    如果答案是“我想要一个能赋予用户所有的权力操作系统,我明白它要求用户必须学习使用。”:那就选Linux。也许你要付出很多时间和努力才能达到你想要的高度,但最终你能得到一台完全按照你的想法工作的电脑。

    但是. . .

    如果答案是“我想要个没那些毛病的Windows”:那么安装一套干净的Windows XP SP2;设好防火墙;安好杀毒软件;永远不要用IE浏览网页;经常更新;每次装完软件都重启;还要多了解安全方面的知识。我自己从Windows 3.1用到95、98、NT和XP,从来没有中过病毒和间谍软件,也没被黑过。Windows可以很安全、很稳定,但是只有你花力气维护它才行。

    如果答案是“我想要个没毛病的Windows替代品”:那买一台苹果Mac。我听说OS X的Tiger版很棒,苹果机器的外观也很漂亮。也许你为此要花钱买一台新的机器,但你能获得你想要的东西。

    这两种情况下,都不要去尝试使用Linux。你会对Linux的软件和社区感到失望的。Linux不是Windows。

    Posted by ideawu at 2005-12-09 16:51:27
  • 2005-12-03

    Keep it simple, stupid!

    Views: 6497 | No Comments

    The Dalai Lama once said that simplicity is the key to happiness in
    the modern world. This philosophy can be adapted into the realm of web
    design and digital interface design.
    The expressions "Keep it simple, stupid", "Kill your darlings" and
    "Less is more" all pinpoint the fact that simplicity is important.
    Simplicity lasts. Simplicity is necessary in order to properly convey any idea.

    Content is King, Consistency is Queen

    When performing an oral presentation, it is said that the message is
    composed of 60% body language, 10% speech and 30% tone of voice.
    If this were to be at least partially true for web design, we could
    say that on the web, a message is composed of 60% design, 10% actual
    content and 30% writing style.
    I believe that content is king. It always will be. But?evidently?an
    excellently written text easily disappears if placed in an improperly
    designed environment, and excels when appearing in a well-designed
    context.
    Consistency helps to create simplicity. In an environment where
    nothing is constant, interface consistency is of the essence. I'm all
    for innovative interfaces. But when pressing an arrow that points
    downwards, most people expect an element (e.g. a text block) to move
    down, not up.
    The best designs are simple, because they contain no unnecessary
    elements... and contain the necessary elements in a way that seems
    logical.

    The Three Elements of Design

    The three fundamental elements of graphic design are balance, contrast and invisible lines.
    Balance refers to the overall composition of images, graphical
    elements and typography within a design. Contrast refers to the
    interaction between design elements. Invisible lines are the areas
    created between the different parts of a design (for example, the
    palpable but invisible lines that run vertically and horizontally
    between the crop marks on a printed page).
    Good design, regardless of target medium or audience, takes these
    elements into account. If one element is neglected, the design will be
    unbalanced. For instance, a design could be extremely visually balanced
    and quite graphically sophisticated, but still incomplete because of a
    dull choice of color. All elements are equally important.
    Being aware of the three elements of design is a key to obtaining simplicity.
    When a design doesn't feel quite right, many designers are inclined
    to add elements instead of removing unnecessary ones, resulting in
    overloaded designs. Sometimes, it's better to start over instead of
    trying to fix or change the design. To quote hell.com; "trying to fix
    or change something, only guarantees and perpetuates its existence."
    Learning the skill of asking oneself "does this really need to be
    here?" is the first step towards creating simplicity. The next is
    understanding the motivations of your audience.

    How do People Work?

    If I truly understood how people work, I wouldn't be writing this
    article, but rather sipping a perfectly mixed daquiri underneath the
    palm trees on a beach somewhere quite far away from Sweden.
    However, I do understand a little, just by examining my own
    behavior. Over the years, I've found that in order to design well, it's
    important to take into consideration how people generally work.
    1. People want to be entertained: This explains why games and
    pornography are so popular on the web. It also explains why so many
    people are TV slaves, because television is an excellent way to create
    a constant flow of varied visual and audio stimuli. This suits our
    brains perfectly, since the brain easily loses interest in things that
    don't provide stimulus.
    To entertain means to capture attention. The classic quote, "Tell me
    and I forget, show me and I remember, involve me and I'm yours"
    underscores the fact that emotionally engaging communication is the
    most efficient form of getting a message across.
    For instance, two speakers at a conference could deliver the same
    speech with two very differing results, leaving behind one satisfied
    and one dissatisfied audience. The difference? 60% body language, 30%
    tone of voice. (The 10% message is the same.) It's not until all
    elements of communication fully interact that efficient and emotionally
    engaging communication can be achieved.
    2. People want to feel smart and discover things: That's why the expression "show, don't tell" was invented (and that's also why we all despise toothpaste commercials).
    Form a circle with your thumb and index finger. Let the circle
    symbolize communication. Now open the circle by moving the fingers away
    from each other.
    The gap between the fingers symbolizes a communication gap. If the
    communication gap is too wide, the message is too obscure for people to
    understand. If the circle is too narrow, the message is too obvious
    (toothpaste) and therefore uninteresting.
    3. People don't have time to learn things that are too complicated:
    Thousands of people have never programmed their VCR. WAP (wireless
    application protocol) has not become truly successful because it's
    complicated and the obvious benefits are obscured. Many people are
    hesitant to book flights online, because the actual booking process is
    complicated and it's much easier to just call a travel agent. Hundreds
    of dot-coms have gone bankrupt because they didn't have a business
    concept that people could understand.
    Whether you're designing a website, developing a new product, or
    trying to get your point across in a discussion, it's good to remember
    that most people do have limited patience.
    That's why simplicity is important.

    A Definition of Simplicity

    What is simplicity? It could be defined as "the absence of unnecessary elements," or even shorter "the essence."
    Simplicity doesn't equal boring. Simplicity doesn't equal shallow.
    Simplicity is especially important when designing information- and
    media-rich interfaces.
    Simplicity isn't a design style, it's a perspective on design, an
    approach which often creates the most beautiful and the most usable
    results.
    A common mistake is to think that obtaining simplicity is a matter
    of reduction, of reducing something which is more complete than the
    "simple" end result. On the contrary, simplicity requires serious
    thought and effort.
    As I wrote in my article Fragments of time; "A modern paradox is that it's simpler to create complex interfaces because it's so complex to simplify them."

    How to Obtain Simplicity

    Simplicity isn't easy to obtain. I have, however, roughly devised a formula that lays the foundation for simplicity.
    Albert Einstein said; "If A is to succeed in life, then A = x + y + z. Work is x, y is play and z is to listen."
    A functioning formula for simplicity (where A equals simplicity)
    could be A = x + y + z. x is good research and prototyping, y is play
    and z is the reduction of unnecessary elements.
    By genuinely knowing your audience and your objectives, and building for them, you've won the first battle.


    By creating a design that engages the visitor on a sensory (or perhaps sensual) level, you've won the second battle.
    If you hold onto these gains and let go of the things that are unneeded, you win the war that earns a satisfied visitor.


    Written under the influence of: Flesh Quartet, Cibo Matto, Laika, Weekenders and Beatnuts.


    Bulgarian translation

    By P?r Almqvist

    Copyright ? 1994-2005 Digital Web Magazine. All Rights Reserved.

    Posted by ideawu at 2005-12-03 21:02:57
  • 2005-12-03

    Keep it Simple

    Views: 6875 | No Comments

    The first site I made as a professional web developer used 17 frames.
    My first professional assignment was coding the World Press Photo
    site. In those days sites had to be compatible with Netscape and
    Explorer 3 and 4. That wasn't a problem - that's what I'd been hired
    for.
    The site needed three content areas inside a static design of
    navigation and decoration. Nowadays we might use iframes for the
    content areas, but back then only one of the four popular browsers
    supported them. So I coded the site in frames and found that... I
    needed more than expected.
    The cause was Netscape. It was impossible to be certain that in
    Netscape a frame had the exact width and height you defined, so I
    devised a workaround to make sure all frames fit snugly, whatever their
    actual width and height might be. I ended up with 17 frames.
    Nothing wrong with that, I thought, and proceeded to add
    boatloads of JavaScripts to make sure the frames cooperated properly
    (and without which, incidentally, the site wouldn't work).
    When the site went online, I felt proud. I'd proven to myself and to the world that I was a web developer.

    Complexity

    One year later all of the photos on the site had to be republished.
    I'd gained a lot of experience meanwhile, was promoted to head of
    Client Side Programming at my company and consequently made responsible
    for the cleanliness of our code.
    I looked at the site anew and had a vague feeling of unease.
    Mightn't it contain slightly too many frames and scripts? Unfortunately
    the budget didn't call for a redesign, merely for new content. I
    nonetheless spent an entire day in study and judiciously merged two
    frames, making for a total of 16. I couldn't remove more frames without
    destroying the cross-browser compatibility of the design.
    It took me another six months to realize that the whole thing was
    too complex. Since I was paid to worry about such matters, I thought
    long and hard. What had gone wrong? Could we avoid making the same mistakes again?
    At first I blamed the design. In a literal sense this was correct:
    if the design hadn't called for three content frames and one very
    problematical line, the coding could have been much cleaner. But this
    only meant shifting the blame from myself to the designer, so it wasn't
    a real answer. Why had the design been so complicated? Why didn't we
    keep it simple?
    The answer I found is that for most people simple =
    dull
    . A site made by a creative web development company
    must never be dull, ergo it should be complicated.

    KISS

    People were already protesting against this point of view. "Keep It
    Simple, Stupid!", they said. Of course other people disagreed. One mail
    succinctly stated: "KISS leads to LOVE (Leave Out Virtually
    Everything)".
    This reaction accurately mirrored my fears. If we'd leave out the
    newest technologies, the well-designed Flash movie, the nifty DHTML
    script, what kind of site would remain? Just text and the tiniest bit
    of HTML? Booooring.
    But then I discovered two things.
    First of all sites should be exciting only when their purpose is to
    be exciting. An entertainment site should be exciting, sure. But what
    about an e-commerce site? A corporate site? A government site should be a bit dull, I'd think, to underline the importance of the information it provides.
    Secondly, the whole idea of exciting vs. simple is a beginner's
    mistake, and in 1999 I was very much a beginner. Clients make this
    mistake all the time because they are beginners by definition. They
    (and many developers) are misled by the magic words "interactive
    multimedia". A site should be interactive! It should be multimedial!
    (whatever that may mean) The site should move, dance, prance, and who
    cares whether the subject calls for it? We're creative, right?

    Simplicity

    The old World Press Photo site was a typical example of this school
    of thought. It didn't contain any moving stuff, but to make up for that
    we used a tiny Java applet to mimic a dropdown box navigation - why keep it dull if we can make it complex? I replaced it with JavaScript during the review a year later. It can be argued that the site is still too complicated.
    The good news is that in 2001 I got the chance to completely
    recreate the site, this time on better principles. We stopped using
    frames, and we changed the complex navigation scripts to slightly less
    complex DHTML scripts that enhanced the site but didn't contain vital
    functions. The result is a site that fulfills its purpose: showing the World Press Photos of the Year.
    This made me rethink the whole complex-but-exciting approach and at
    the moment I'm on the move toward simplicity. I keep the purpose of the
    site firmly in mind and don't add unnecessary stuff just because it's
    possible. The newest browsers help a lot: CSS goes a long way towards
    creating appealing but simple sites.
    In the next months I'll share my thoughts on simplicity in this
    column on Digital Web Magazine. Why do people make complex sites? When
    does a site become too complex? How should you judge whether a site
    needs to be complex? What techniques should you use to avoid complexity?
    To make it absolutely clear, at the moment I write this I don't
    have the faintest idea what the answers will be. Let's hope they'll be
    simple...

    By Peter-Paul Koch
    Published on August 26, 2002

    Copyright ? 1994-2005 Digital Web Magazine. All Rights Reserved.

    Posted by ideawu at 20:58:51
  • 2005-12-01

    Java中文问题及最优解决方法

    Views: 6936 | No Comments

    Java中文问题及最优解决方法

    由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于 Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清晰地说明问题及解决问题,尤其是跨平台时的中文问题。于是我给出此篇文章,内容包括对控制台运行的class、Servelets、JSP及EJB类中的中文问题我剖析和建议解决办法。希望大家指教。

    Abstract:本文深入分析了Java程序设计中Java编译器对java源文件和JVM对class类文件的编码/解码过程,通过此过程的解析透视出了Java编程中中文问题产生的根本原因,最后给出了建议的最优化的解决Java中文问题的方法。

    1、中文问题的来源

    计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码,在软件运行时,它获得本地支持系统(多数时间是操作系统)默认支持的编码格式,然后再将软件内部的 UNICODE转化为本地系统默认支持的格式显示出来。Java的JDK和JVM即是如此,我这里说的JDK是指国际版的JDK,我们大多数程序员使用的是国际化的JDK版本,以下所有的JDK均指国际化的JDK版本。我们的汉字是双字节编码语言,为了能让计算机处理中文,我们自己制定的gb2312、 GBK、GBK2K等标准以适应计算机处理的需求。所以,大部分的操作系统为了适应我们处理中文的需求,均定制有中文操作系统,它们采用的是GBK, GB2312编码格式以正确显示我们的汉字。如:中文Win2K默认采用的是GBK编码显示,在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的,即,所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码,注意:GBK是在GB2312基础上扩充来的。

    由于Java语言内部采用UNICODE编码,所以在JAVA程序运行时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的JAVA中文问题。

    同时,Java是一个跨平台的编程语言,也即我们编写的程序不仅能在中文windows上运行,也能在中文Linux等系统上运行,同时也要求能在英文等系统上运行(我们经常看到有人把在中文win2k上编写的JAVA程序,移植到英文Linux上运行)。这种移植操作也会带来中文问题。

    还有,有人使用英文的操作系统和英文的ie等浏览器,来运行带中文字符的程序和浏览中文网页,它们本身就不支持中文,也会带来中文问题。

    几乎所有的浏览器默认在传递参数时都是以utf-8编码格式来传递,而不是按中文编码传递,所以,传递中文参数时也会有问题,从而带来乱码现象。

    总之,以上几个方面是java中的中文问题的主要来源,我们把以上原因造成的程序不能正确运行而产生的问题称作:java中文问题。

    2、java编码转换的详细过程

    我们常见的java程序包括以下类别:

    *直接在console上运行的类(包括可视化界面的类)

    *jsp代码类(注:jsp是servlets类的变型)

    *servelets类

    *ejb类

    *其它不可以直接运行的支持类

    这些类文件中,都有可能含有中文字符串,并且我们常用前三类java程序和用户直接交互,用于输出和输入字符,如:我们在jsp和servlet中得到客户端送来的字符,这些字符也包括中文字符。无论这些java类的作用如何,这些java程序的生命周期都是这样的:

    *编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java扩展名保存在操作系统中,例如我们在中文win2k中用记事本编辑一个java源程序;

    *编程人员用jdk中的javac.exe来编译这些源代码,形成.class类(jsp文件是由容器调用jdk来编译的);

    *直接运行这些类或将这些类布署到web容器中去运行,并输出结果。

    那么,在这些过程中,jdk和jvm是如何将这些文件如何编码和解码并运行的呢?

    这里,我们以中文win2k操作系统为例说明java类是如何来编码和被解码的。

    第一步,我们在中文win2k中用编辑软件如记事本编写一个java源程序文件(包括以上五类java程序),程序文件在保存时默认采用了操作系统默认支持 gbk编码格式(操作系统默认支持的格式为file.encoding格式)形成了一个.java文件,也即,java程序在被编译前,我们的java 源程序文件是采用操作系统默认支持的file.encoding编码格式保存的,java源程序中含有中文信息字符和英文程序代码;要查看系统的 file.encoding参数,可以用以下代码:

    public class showsystemdefaultencoding {
    	public static void main(string[] args) {
    		string encoding = system.getproperty("file.encoding");
    		system.out.println(encoding);
    	} 
    }
    

    第二步,我们用jdk的javac.exe文件编译我们的java源程序,由于jdk是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的java源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,jdk首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如win2k,它的值为gbk),然后jdk 就把我们的java源程序从file.encoding编码格式转化为java内部默认的unicode格式放入内存中。然后,javac把转换后的 unicode格式的文件进行编译成.class类文件,此时.class文件是unicode编码的,它暂放在内存中,紧接着,jdk将此以 unicode编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。对我们来说,我们最终获得的.class文件是内容以unicode编码格式保存的类文件,它内部包含我们源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为unicode格式了。

    这一步中,对于jsp源程序文件是不同的,对于jsp,这个过程是这样的:即web容器调用jsp编译器,jsp编译器先查看 jsp文件中是否设置有文件编码格式,如果jsp文件中没有设置jsp文件的编码格式,则jsp编译器调用jdk先把jsp文件用jvm默认的字符编码格式(也即web容器所在的操作系统的默认的file.encoding)转化为临时的servlet类,然后再把它编译成unicode格式的class 类,并保存在临时文件夹中。如:在中文win2k上,web容器就把jsp文件从gbk编码格式转化为unicode格式,然后编译成临时保存的 servlet类,以响应用户的请求。

    第三步,运行第二步编译出来的类,分为三种情况:

    A、 直接在console上运行的类

    B、 EJB类和不可以直接运行的支持类(如JavaBean类)

    C、 JSP代码和Servlet类

    D、 JAVA程序和数据库之间

    下面我们分这四种情况来看。

    A、直接在console上运行的类

    这种情况,运行该类首先需要JVM支持,即操作系统中必须安装有JRE。运行过程是这样的:首先java启动JVM,此时JVM读出操作系统中保存的 class文件并把内容读入内存中,此时内存中为UNICODE格式的class类,然后JVM运行它,如果此时此类需要接收用户输入,则类会默认用 file.encoding编码格式对用户输入的串进行编码并转化为unicode保存入内存(用户可以设置输入流的编码格式)。程序运行后,产生的字符串(UNICODE编码的)再回交给JVM,最后JRE把此字符串再转化为file.encoding格式(用户可以设置输出流的编码格式)传递给操作系统显示接口并输出到界面上。

    对于这种直接在console上运行的类,它的转化过程可用图1更加明确的表示出来:

    (不好意思,图传不上来,只好让大家自己去想像图的样子了,我想看了上文是可以想来图来的。)

    以上每一步的转化都需要正确的编码格式转化,才能最终不出现乱码现象。

    B、EJB类和不可以直接运行的支持类(如JavaBean类)

    由于EJB类和不可以直接运行的支持类,它们一般不与用户直接交互输入和输出,它们常常与其它的类进行交互输入和输出,所以它们在第二步被编译后,就形成了内容是UNICODE编码的类保存在操作系统中了,以后只要它与其它的类之间的交互在参数传递过程中没有丢失,则它就会正确的运行。

    这种EJB类和不可以直接运行的支持类, 它的转化过程可用图2更加明确的表示出来:

    图2

    (不好意思,图传不上来,只好让大家自己去想像图的样子了,我想看了上文是可以想来图来的。)

    C、JSP代码和Servlet类

    经过第二步后,JSP文件也被转化为Servlets类文件,只不过它不像标准的Servlets一校存在于classes目录中,它存在于WEB容器的临时目录中,故这一步中我们也把它做为Servlets来看。

    对于Servlets,客户端请求它时,WEB容器调用它的JVM来运行Servlet,首先,JVM把Servlet的class类从系统中读出并装入内存中,内存中是以UNICODE编码的Servlet类的代码,然后JVM在内存中运行该Servlet类,如果Servlet在运行的过程中,需要接受从客户端传来的字符如:表单输入的值和URL中传入的值,此时如果程序中没有设定接受参数时采用的编码格式,则WEB容器会默认采用ISO-8859- 1编码格式来接受传入的值并在JVM中转化为UNICODE格式的保存在WEB容器的内存中。Servlet运行后生成输出,输出的字符串是 UNICODE格式的,紧接着,容器将Servlet运行产生的UNICODE格式的串(如html语法,用户输出的串等)直接发送到客户端浏览器上并输出给用户,如果此时指定了发送时输出的编码格式,则按指定的编码格式输出到浏览器上,如果没有指定,则默认按ISO-8859-1编码发送到客户的浏览器上。这种JSP代码和Servlet类,它的转化过程可用图3更加明确地表示出来:

    (不好意思,图传不上来,只好让大家自己去想像图的样子了,我想看了上文是可以想来图来的。)

    D、Java程序和数据库之间

    对于几乎所有数据库的JDBC驱动程序,默认的在JAVA程序和数据库之间传递数据都是以ISO-8859-1为默认编码格式的,所以,我们的程序在向数据库内存储包含中文的数据时,JDBC首先是把程序内部的UNICODE编码格式的数据转化为ISO-8859-1的格式,然后传递到数据库中,在数据库保存数据时,它默认即以ISO-8859-1保存,所以,这是为什么我们常常在数据库中读出的中文数据是乱码。

    对于JAVA程序和数据库之间的数据传递,我们可以用图4清晰地表示出来

    图4(不好意思,图传不上来,只好让大家自己去想像图的样子了,我想看了上文是可以想来图来的。)

    3、分析常见的JAVA中文问题几个必须清楚的原则

    首先,经过上面的详细分析,我们可以清晰地看到,任何JAVA程序的生命期中,其编码转换的关键过程是在于:最初编译成class文件的转码和最终向用户输出的转码过程。

    其次,我们必须了解JAVA在编译时支持的、常用的编码格式有以下几种:

    *ISO-8859-1,8-bit, 同8859_1,ISO-8859-1,ISO_8859_1等编码

    *Cp1252,美国英语编码,同ANSI标准编码

    *UTF-8,同unicode编码

    *GB2312,同gb2312-80,gb2312-1980等编码

    *GBK , 同MS936,它是gb2312的扩充

    及其它的编码,如韩文、日文、繁体中文等。同时,我们要注意这些编码间的兼容关体系如下:

    unicode和UTF-8编码是一一对应的关系。GB2312可以认为是GBK的子集,即GBK编码是在gb2312上扩展来的。同时,GBK编码包含了20902个汉字,编码范围为:0x8140-0xfefe,所有的字符可以一一对应到UNICODE2.0中来。

    再次,对于放在操作系统中的.java源程序文件,在编译时,我们可以指定它内容的编码格式,具体来说用-encoding来指定。注意:如果源程序中含有中文字符,而你用-encoding指定为其它的编码字符,显然是要出错的。用-encoding指定源文件的编码方式为GBK或gb2312,无论我们在什么系统上编译含有中文字符的JAVA源程序都不会有问题,它都会正确地将中文转化为UNICODE存储在class文件中。

    然后,我们必须清楚,几乎所有的WEB容器在其内部默认的字符编码格式都是以ISO-8859-1为默认值的,同时,几乎所有的浏览器在传递参数时都是默认以 UTF-8的方式来传递参数的。所以,虽然我们的Java源文件在出入口的地方指定了正确的编码方式,但其在容器内部运行时还是以ISO-8859- 1来处理的。

    4、中文问题的分类及其建议最优解决办法

    了解以上JAVA处理文件的原理之后,我们就可以提出了一套建议最优的解决汉字问题的办法。

    我们的目标是:我们在中文系统中编辑的含有中文字符串或进行中文处理的JAVA源程序经编译后可以移值到任何其它的操作系统中正确运行,或拿到其它操作系统中编译后能正确运行,能正确地传递中文和英文参数,能正确地和数据库交流中英文字符串。

    我们的具体思路是:在JAVA程序转码的入口和出口及JAVA程序同用户有输入输出转换的地方限制编码方法使之正确即可。

    具体解决办法如下:

    1、 针对直接在console上运行的类

    对于这种情况,我们建议在程序编写时,如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出,程序中应该采用字符流来处理输入和输出,具体来说,应用以下面向字符型节点流类型:

    对文件:FileReader,FileWrieter

    其字节型节点流类型为:FileInputStream,FileOutputStream

    对内存(数组):CharArrayReader,CharArrayWriter

    其字节型节点流类型为:ByteArrayInputStream,ByteArrayOutputStream

    对内存(字符串):StringReader,StringWriter

    对管道:PipedReader,PipedWriter

    其字节型节点流类型为:PipedInputStream,PipedOutputStream

    同时,应该用以下面向字符型处理流来处理输入和输出:

    BufferedWriter,BufferedReader

    其字节型的处理流为:BufferedInputeStream,BufferedOutputStream

    InputStreamReader,OutputStreamWriter

    其字节型的处理流为:DataInputStream,DataOutputStream

    其中InputStreamReader和InputStreamWriter用于将字节流按照指定的字符编码集转换到字符流,如:

    InputStreamReader in = new InputStreamReader(System.in,"GB2312");

    OutputStreamWriter out = new OutputStreamWriter (System.out,"GB2312");

    例如:采用如下的示例JAVA编码就达到了要求:

    //Read.java
    import java.io.*;
    public class Read {
    	public static void main(String[] args) throws IOException {
    		String str = "\n中文测试,这是内部硬编码的串"+"\ntest english character";
    		String strin= "";
    		BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312")); //设置输入接口按中文编码
    		BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312")); //设置输出接口按中文编码
    		stdout.write("请输入:");
    		stdout.flush();
    		strin = stdin.readLine();
    		stdout.write("这是从用户输入的串:"+strin);
    		stdout.write(str);
    		stdout.flush();
    	} 
    }
    

    同时,在编译程序时,我们用以下方式来进行:

    javac -encoding gb2312 Read.java

    其运行结果如图5所示:

    图5(不好意思,图传不上来,只好让大家自己去想像图的样子了,我想看了上文是可以想来图来的。)

    2、 针对EJB类和不可以直接运行的支持类(如JavaBean类)

    由于这种类它们本身被其它的类调用,不直接与用户交互,故对这种类来说,我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串(具体如上面一节中一样),同时,在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可。

    3、 针对Servlet类

    针对Servlet,我们建议用以下方法:

    在编译Servlet类的源程序时,用-encoding指定编码为GBK或GB2312,且在向用户输出时的编码部分用response对象的 setContentType("text/html;charset=GBK");或gb2312来设置输出编码格式,同样在接收用户输入时,我们用 request.setCharacterEncoding("GB2312");这样无论我们的servlet类移植到什么操作系统中,只有客户端的浏览器支持中文显示,就可以正确显示。如下是一个正确的示例:

    //HelloWorld.java
    package hello;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    public class HelloWorld extends HttpServlet
    {
    	public void init() throws ServletException { }
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    	{
    		request.setCharacterEncoding("GB2312"); //设置输入编码格式
    		response.setContentType("text/html;charset=GB2312"); //设置输出编码格式
    		PrintWriter out = response.getWriter(); //建议使用PrintWriter输出
    		out.println("<hr>");
    		out.println("Hello World! This is created by Servlet!测试中文!");
    		out.println("<hr>");
    	}
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    	{
    		request.setCharacterEncoding("GB2312"); //设置输入编码格式
    		response.setContentType("text/html;charset=GB2312"); //设置输出编码格式
    		String name = request.getParameter("name");
    		String id = request.getParameter("id");
    		if(name==null) name="";
    		if(id==null) id="";
    		PrintWriter out = response.getWriter(); //建议使用PrintWriter输出
    		out.println("<hr>");
    		out.println("你传入的中文字串是:" + name);
    		out.println("<hr>你输入的id是:" + id);
    		out.println("<hr>");
    	}
    	public void destroy() { }
    }
    

    请用javac -encoding gb2312 HelloWorld.java来编译此程序。

    测试此Servlet的程序如下所示:

    <%@page contentType="text/html; charset=gb2312"%>
    <%request.setCharacterEncoding("GB2312");%>
    <html><head><title></title>
    <Script language="JavaScript">
    function Submit() {
    	//通过URL传递中文字符串值给Servlet
    	document.base.action = "./HelloWorld?name=中文";
    	document.base.method = "POST";
    	document.base.submit();
    }
    </Script>
    </head>
    
    <body bgcolor="#FFFFFF" text="#000000" topmargin="5">
    <form name="base" method = "POST" target="_self">
    <input name="id" type="text" value="" size="30">
    <ahref = "JavaScript:Submit()">传给Servlet</a>
    </form></body></html>
    

    其运行结果如图6所示:

    图6(不好意思,图传不上来,只好让大家自己去想像图的样子了,我想看了上文是可以想来图来的。)

    4、 JAVA程序和数据库之间

    为避免JAVA程序和数据库之间数据传递出现乱码现象,我们建议采用以下最优方法来处理:

    1、 对于JAVA程序的处理方法按我们指定的方法处理。

    2、 把数据库默认支持的编码格式改为GBK或GB2312的。

    如:在mysql中,我们可以在配置文件my.ini中加入以下语句实现:

    区增加:

    default-character-set=gbk

    并增加:

    default-character-set=gbk

    在SQL Server2K中,我们可以将数据库默认的语言设置为Simplified Chinese来达到目的。

    5、 针对JSP代码

    由于JSP是在运行时,由WEB容器进行动态编译的,如果我们没有指定JSP源文件的编码格式,则JSP编译器会获得服务器操作系统的 file.encoding值来对JSP文件编译的,它在移植时最容易出问题,如在中文win2k中可以很好运行的jsp文件拿到英文linux中就不行,尽管客户端都是一样的,那是因为容器在编译JSP文件时获取的操作系统的编码不同造成的(在中文wink中的file.encoding和在英文 Linux中file.encoding是不同的,且英文Linux的file.encoding对中文不支持,所以编译出来的JSP类就会有问题)。网络上讨论的大多数是此类问题,多是因为JSP文件移植平台时不能正确显示的问题,对于这类问题,我们了解了JAVA中程序编码转换的原理,解决起来就容易多了。我们建议的解决办法如下:

    1、我们要保证JSP向客户端输出时是采用中文编码方式输出的,即无论如何我们首先在我们的JSP源代编中加入以下一行:

    <%@page contentType="text/html; charset=gb2312"%>

    2、为了让JSP能正确获得传入的参数,我们在JSP源文件头加入下面一句:

    <%request.setCharacterEncoding("GB2312");%>

    3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件,我们需要在JSP源文件中指定我们的JSP源文件的编码格式,具体来说,我们在JSP源文件头上加入下面的一句即可:

    <%@page pageEncoding="GB2312"%>或<%@page pageEncoding="GBK"%>

    这是JSP规范2.0新增加的指令。

    我们建议使用此方法来解JSP文件中的中文问题,下面的代码是一个正确做法的JSP文件的测试程序:

    //testchinese.jsp
    <%@page pageEncoding="GB2312"%>
    <%@page contentType="text/html; charset=gb2312"%>
    <%request.setCharacterEncoding("GB2312");%>
    <%
    	String action = request.getParameter("ACTION");
    	String name = "";
    	String str = "";
    	if(action!=null && action.equals("SENT"))
    	{
    		name = request.getParameter("name");
    		str = request.getParameter("str");
    	}
    %>
    <html>
    <head>
    <title></title>
    <Script language="JavaScript">
    function Submit()
    {
    	document.base.action = "?ACTION=SENT&str=传入的中文";
    	document.base.method = "POST";
    	document.base.submit();
    }
    </Script>
    </head>
    <body bgcolor="#FFFFFF" text="#000000" topmargin="5">
    <form name="base" method = "POST" target="_self">
    <input type="text" name="name" value="" size="30">
    <a href = "JavaScript:Submit()">提交</a>
    </form>
    <%
    if(action!=null && action.equals("SENT"))
    {
    	out.println("<br>你输入的字符为:"+name);
    	out.println("<br>你通过URL传入的字符为:"+str);
    }
    %>
    </body>
    </html>
    

    如图7是此程序运行的结果示意图:

    图7(不好意思,图传不上来,只好让大家自己去想像图的样子了,我想看了上文是可以想来图来的。)

    5、总结

    在上面的详细分析中,我们清晰地给出了JAVA在处理源程序过程中的详细转换过程,为我们正确解决JAVA编程中的中文问题提供了基础。同时,我们给出了认为是最优的解决JAVA中文问题的办法。

    作 者: javabin

    http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=8&thread=13425

    Posted by ideawu at 2005-12-01 13:24:52
  • 2005-12-01

    从微软一道面试题议中国的说“不”

    Views: 6042 | No Comments

    先将近期我国外交上的重要事件列举如下:

    5月16日,国务院总理温家宝在会见美国商会代表团时,表示“人民币汇率改革属中国主权,不屈从外界压力”。

    5月23日,国务院副总理吴仪紧急取消了原定与日本首相小泉的会谈。

    5月30日,国家商务部部长薄熙来宣布我国从6月1日起对81项纺织品取消征收出口关税。

    6月1日,中国常驻联合国代表王光亚明确表示,由“四国联盟”提出的要求增加安理会常任理事国的决议草案危害联合国改革进程,如四国执意将这一决议草案付诸表决,中国将投票反对。

    6月21日,中国常驻联合国代表王光亚在第59届联合国大会发言时重申,中国反对人为的为安理会改革设定时限,如果强行表决尚有重大分歧的安理会改革方案,中国将坚定地投反对票。

    在短短的一个多月时间内,中国对美国说不,对日本说不,对欧盟说不,对德日巴印四国联盟说不。一时间,国际媒体一片愕然,国内媒体以及网络社区则是一致热评,有网友甚至惊呼“中国人民已经从站起来、富起来进入到了硬起来的时代”!笔者也同大多数网友一样,对今日中国外交方面的强硬举措欢欣鼓舞,扬眉吐气。

    在激动之余,不禁想起了网上流传的一道著名的微软面试题??海盗分金币。题目的大意是:

    5个海盗抢得100枚金币后,讨论如何进行公正分配。他们商定的分配原则是:

    (1)抽签确定各人的分配顺序号码(1,2,3,4,5);

    (2)由抽到1号签的海盗提出分配方案,然后5人进行表决,如果方案得到超过半数的人同意,就按照他的方案进行分配,否则就将1号扔进大海喂鲨鱼;

    (3)如果1号被扔进大海,则由2号提出分配方案,然后由剩余的4人进行表决,当且仅当超过半数的人同意时,才会按照他的提案进行分配,否则也将被扔入大海;

    (4)依此类推。

    这里假设每一个海盗都是绝顶聪明而理性,他们都能够进行严密的逻辑推理,并能很理智的判断自身的得失,即能够在保住性命的前提下得到最多的金币。同时还假设每一轮表决后的结果都能顺利得到执行,那么抽到1号的海盗应该提出怎样的分配方案才能使自己既不被扔进海里,又可以得到更多的金币呢?

    此题公认的标准答案是:1号海盗分给3号1枚金币,4号或5号2枚金币,自己则独得97枚金币,即分配方案为(97,0,1,2,0)或(97,0,1,0,2)。现来看如下各人的理性分析:

    首先从5号海盗开始,因为他是最安全的,没有被扔下大海的风险,因此他的策略也最为简单,即最好前面的人全都死光光,那么他就可以独得这100枚金币了。

    接下来看4号,他的生存机会完全取决于前面还有人存活着,因为如果1号到3号的海盗全都喂了鲨鱼,那么在只剩4号与5号的情况下,不管4号提出怎样的分配方案,5号一定都会投反对票来让4号去喂鲨鱼,以独吞全部的金币。哪怕4号为了保命而讨好5号,提出(0,100)这样的方案让5号独占金币,但是5号还有可能觉得留着4号有危险,而投票反对以让其喂鲨鱼。因此理性的4号是不应该冒这样的风险,把存活的希望寄托在5号的随机选择上的,他惟有支持3号才能绝对保证自身的性命。

    再来看3号,他经过上述的逻辑推理之后,就会提出(100,0,0)这样的分配方案,因为他知道4号哪怕一无所获,也还是会无条件的支持他而投赞成票的,那么再加上自己的1票就可以使他稳获这100金币了。

    但是,2号也经过推理得知了3号的分配方案,那么他就会提出(98,0,1,1)的方案。因为这个方案相对于3号的分配方案,4号和5号至少可以获得1 枚金币,理性的4号和5号自然会觉得此方案对他们来说更有利而支持2号,不希望2号出局而由3号来进行分配。这样,2号就可以屁颠屁颠的拿走98枚金币了。

    不幸的是,1号海盗更不是省油的灯,经过一番推理之后也洞悉了2号的分配方案。他将采取的策略是放弃2号,而给3号1枚金币,同时给4号或5号2枚金币,即提出(97,0,1,2,0)或(97,0,1,0,2)的分配方案。由于1号的分配方案对于3号与4号或5号来说,相比2号的方案可以获得更多的利益,那么他们将会投票支持1号,再加上1号自身的1票,97枚金币就可轻松落入1号的腰包了。

    看到这里,读者一定会问,这个海盗分金币的题目与中国说“不”有何关联呢?好,下面就切入正题。

    海盗分金币模型的最终答案可能会出乎很多人的意料,因为从直觉来看,此模型中如此严酷的规定,若谁抽到1号真是天底下最不幸的人了。因为作为第一个提出方案的人,其存活的机会真是微乎其微,即使他一个金币也不要,都无私的分给其他4个人,那4个人也很可能因为觉得他的分配不公而反对他的方案,那他也就只有死路一条了。可是看起来处境最凶险的1号,却凭借着其超强的智慧和先发的优势,不但消除了喂鲨鱼的危险,而且最终还使自己的收益最大化,这不正像是当今国际社会国与国之间在政治、经济等领域相互博弈过程中,先发制人的智慧和优势的凸现吗?而5号表面上看起来是最安全的,可以坐山观虎斗,先让前面的海盗拼个你死我活而坐收渔翁之利,可实际上最后却不得不看别人的脸色行事,勉强分得一杯小羹,这不正是本想以静制动,后发制人而反得劣势的写照吗?看到这里,大家应当已经明白笔者所要表达的意思了,而很多事实也已证明,如果中国人总是处于5号位置,总是坐等着别人制定规则,那么就无法避免陷入“看人脸色”行事的不利处境。

    1989年前后,面对当时特殊的国际环境,邓小平先生提出了“冷静观察,稳住阵脚,沉着应付,韬光养晦,有所作为” 的方针,强调“决不当头”,之后中国就以一种中庸的姿态出现在国际舞台上。1989年9月16日,邓小平在会见李政道时说:“别国的事情,我们管不了”,从而道破其“韬光养晦”对国际事务做壁上观的玄机。笔者认为,“韬光养晦”的目的是着眼于国际竞争中的最后胜利,主张国家在经济和军事力量处于相对弱势时,收敛锋芒,保持克制,积累实力,不意气行事,甚至不惜以局部让步来谋求整体利益的最大化。其本质是为图强而忍辱,为进攻而防御,一旦功成,实力达就,破关而出,便可变退为进、转守反攻而致全胜。“韬光养晦”可以说是中国特定时期的特定外交策略。

    在这一策略的引导下,中国以经济建设为中心,埋头发展自身经济,对外则近睦远和,努力营造有利于经济建设的外部环境,避免与别国发生直接正面的冲突与对抗。在过去的二十多年里,中国人小心翼翼地为自己成功营造了相对和平稳定的发展空间,并使中国成为全球发展最快的大型经济体,其GDP以年均超过8%的速度增长,成为世界第六大经济体和第二大外汇储备国。“韬光养晦”策略确保了中国经济的腾飞,大幅提升了国家在世界经济中的影响力。

    但是,在另一方面,中国人有时却不得不承受将愤怒埋藏于心中的痛苦。1993年美国一手制造了“银河号”事件,1999年美国轰炸中国驻南大使馆,2001年美国侦察机冲撞中国军机;而另一个邻国则以参拜靖国神社、美化侵略史、宣称对钓鱼岛拥有主权等恶行一而再、再而三的挑战中国的忍耐极限。而通常情况下,中国虽然“很生气”,但所作反应的后果却不会“很严重”,最愤慨的也不过是表示“最强烈的抗议”。世人也已经习惯了作为五大常任理事国之一的中国,在面对国际重大突发事件上,总是以投弃权票而圆滑的平衡利益各方。

    我们大家都明白“小洞不补,大洞尺五”的道理,在一些局部利益上暂时的退让与妥协是理智的,可若长此以往,谁又能保证这样的退让不会更加助长对方的气焰,而最终导致自己权利的丧失呢?在中国蓄练健韧之后,该是到了转换博弈策略的时侯了。这次,吴仪副总理因不满日本首相小泉决意参拜靖国神社的言论拂袖而去;中国政府面对美国强逼人民币升值的巨大压力,面临欧美对中国纺织品设限的威胁,没有一味退让妥协,而是依托现有国际规范,据理力争,尽最大努力维护国家利益;特别是针对日本“入常”问题上明确说“不”,一扫中国政府以往在联合国中动辄“弃权”的模糊形象,向世界明示了中国的态度,向国际社会展示出中国的外交魄力,也使得日本不得不被迫接受由中国人参与制定的“游戏规则”。此后日本等四国联盟成员表示新常任理事国的否决权问题,可以等到安理会扩大完成的15年后再予以解决便是明证。在国际格局向多极化趋势发展,世界政治和经济新秩序亟待重塑的大背景下,中国必须直面外交挑战,并积极的有所作为。正如我国外交部长李肇星在与日本外相会谈时所指出的,在历史问题、台湾问题和钓鱼岛问题上挑战中国的核心利益,是非常危险的。道理很简单,中国的综合国力早已今非昔比,任何势力来挑战中国的核心国家利益,都会付出代价。这也就难怪有网友会惊呼中国“硬起来” 了,而这一切在让国人感觉痛快淋漓的同时,也表明了中国新一代领导人正力图以更积极的态度介入国际事务,把握外交主动权,发挥先发优势。这也预示着中国正在告别多年来“太极推手”式模棱两可、谦逊忍让的时代,而逐步进入了作风强硬,棱角分明,态度明朗,昂扬务实的后“韬光养晦”时代。

    也许有人会担心,这样说不正是给某些不怀好意的国家散布“中国威胁论”找到借口吗?这让笔者又想起了一则笑话。说的是狼和狐狸遇见了一只山羊,就立刻指责其对自身安全构成了威胁,因为山羊长了角。后狼和狐狸又遇见了一只老虎,狼立刻提出双方建立“合作伙伴”乃至“战略伙伴”关系,而狐狸则声称要和老虎“世世代代友好下去”。中国必须习惯于与“中国威胁论”共生存,加大对地区事务和国际事务的参与力度,坚定地发出自己的声音,一个政治稳定、经济繁荣、社会和谐、军事强大的中国,将会是国际上许许多多国家愿意与之“世世代代友好”交往的国度。正如晨枫在《西线观察》里所谈到的,“中国的理想还不应仅仅是强国,而且应该更为远大。中国应该按照自己的世界观来示范和推动一个‘世界新秩序’??按照中国文化传统中的‘和而不同’的理想来对世界做出中国的贡献。”

    让我们把话题再次回到海盗分金币模型上来。显然,海盗分金币的模型相对于现实来说,实在是太粗糙了,现实中的情况远要比它复杂千万倍。

    首先,现实中肯定不可能人人都绝顶聪明并富有理性,海盗中只要3号、4号或5号中任何一人偏离此假设,1号就极有可能被抛入大海。因此,现实中的1号必须首先考虑他的兄弟们是否足够的聪明与理性,而断然不能顾自取走那97枚金币。

    其次,在这一涉及个人重大利益的分配过程中,阴谋会像杂草一般疯长,而谎言与虚假承诺也就有了用武之地。假如,2号事先对3、4、5号海盗大放烟雾弹,称基于1号所提出的任何分配方案,他都会再多加1个金币给他们,那结果可能又会是另一番景象了。

    再次,正如吴思先生在其所著的《血酬定律》一书中提到的,“所有规则的设立,说到底,都遵循一条根本规则:暴力最强者说了算。这是一条元规则,决定规则的规则”。在发生争执时,如果在肉体上消灭对方是最合算的,付出成本也是最低的话,那么当5个海盗中最强悍的那个将刀架在其余海盗脖子上,并大喝道“要命还是要金币”的时候,那么任何的争执都不难解决,任何的意见也就不难统一了。

    当然,即使1号是那最强悍的海盗,其余4人也还是有可能组成一个反1号大联盟,并经过精心策划和充分准备而起来“造反”,合力将1号制服并扔进大海,再由这4人重新商定分配规则。

    已经无需讨论更多的情况,相信大家已同意现实实在是太复杂的看法了。但是,海盗分金币的模型还是不乏有启示意义,即任何“分配者”想让自己的方案获得通过,其关键是在于事先要考虑清楚“挑战者”所可能会提出的分配方案,然后尽力拉拢“挑战者”分配方案中最不得意的人,用最小的代价使自己的利益最大化,总之是离不开过人的智慧和高超的策略。

    毋庸讳言,随着中国国力的不断增强,我们在发展过程中所遇到的阻力和挑战也将会不断升级,中国与某些国家在政治、经济等领域的摩擦也将进入短兵相接的“巷战”时代。因此,中国不仅要适时的说“不”,更需要以超强的智慧、更娴熟的外交手腕去处理各种纷繁复杂的国际事务。但不管怎么说,这次对日本的当头棒喝,至少要比以往多次“强烈抗议”参拜靖国神社更能让日本当局正视他们的历史和现状。中国近期在经济、外交上的一系列强硬政策所体现出的“软的更软,硬的更硬”的新策略,可以说既有日益强盛的国力作实质支撑,又有国际竞争的实际需要,并且符合当今中国的民意潮流。愿我们祖国更加强盛,让妥善解决领土争端、能出游钓鱼岛看日出的日子早点到来!

    转自:http://publishblog.blogchina.com/blog/tb.b?diaryID=3486297

    Posted by ideawu at 13:23:49
|<<<116117118119120121122123124>>>| 122/124 Pages, 743 Results.