原文地址:http://www.cnitblog.com/addone/archive/2008/01/08/38581.html
前言
自Linux渐渐风行起来,有关图形界面(GUI,Graphical User Interface)和命令行界面(CLI,Command Line Interface)之争就一直闹个不停。看了众多评论之后,总有些郁闷之意想要发泄一下,虽然觉得有混水摸鱼的嫌疑,却还是不吐不快。首先先声明一下本人的立场。我个人希望自己是站在一个比较中立的角度上看的。但实际应用上,我用图形界面的时间远远超过命令行界面,所以看问题难免会有一些偏颇,请读者见谅。其次,本文的目的,不是对GUI和CLI进行比较从而得出何者更佳的结论,而是希望探讨一下为何关于两者的讨论会演变成一种对立的状况,以及试图触及一下两种界面方式所代表的截然不同的哲学观。本文热烈欢迎全文转载,恳请注明出处。定义
所谓GUI,我的定义是以图形作为工作元素并以鼠标、键盘协同作为主要输入工具的工作方式。GUI通常使用大量的图标来标识命令,并且通过组织按钮、工具栏、对话框等元素的方式来试图提高界面的直观性和易用性。通常来说,GUI由于使用了大量的图形元素,看起来会比较美观。而CLI则自然是指主要以文本方式作为工作元素,并主要以键盘作为输入工具的工作方式。CLI采用直接输入命令和参数的方式直接向计算机发送各种指令,通过组织参数和命令的输入方法来试图提高工作效率。CLI中同样可以采用图形组件以使得界面更为美观,但这些图形组件并不像GUI中的那样具备实际的命令功能(否则就不该称为CLI了)。谈一些奇怪的论点
一直很奇怪,为何很多人把GUI和“易用性”划上等号,而把CLI和“高效”划上等号。尽管从两者的出发点来说是没有错的,但如果说所有应用这些界面的软件都达到了其期望目标,那无异于一个泡沫般的梦想。让我们来看看这个软件。这是一个著名的GUI软件的默认界面。说起GUI易用性,大概很多人都能猜到我会选择这个软件作为反面教材。
如果用户是要使用完全相同的参数进行大量的批量转换,以上命令也还勉强算得上“高效”。因为事实上,如果是需要经常使用的话,用户通常并不会选择每次都输入这堆参数,而会使用脚本的方式把以上的命令“包装”起来,以便于将来的调用。但实际情形则常常更为复杂,用户实际上很少使用完全同样的选项进行转换,而进行“微调”则会成为一件很麻烦的事情,于是就会出现把脚本“包装”起来以提供更灵活的微调功能的脚本,如此周而复始,层层包裹。对于这类软件来说,由于所提供的功能选项非常丰富,设计参数列表和设计GUI同样是一件很麻烦的事情。CLI实质上是通过简化操作步骤和提供批量处理选项,来提高进行重复工作时的操作效率的。如果这个软件使用的机会并不多,而且每次使用时的选项都不完全一致,那么不仅不易用,而且也很难“高效”起来。两者的特点
尽管如此,在大多数情况下,GUI确实比CLI更易于使用,而CLI确实要比GUI更高效,因为两者的设计目标就是如此。GUI由于采用了大量的图形元素,界面会更显得具有艺术性,富有人性化。相较于枯燥的文本来说,精致且合理的图形大大增强了界面的易用性。
这种精确的指令可以保证得到严格执行,不会像采用GUI方式一样,说不定一个不小心会漏掉了一两个文件。由于使用了文本方式直接输入命令,描述起来也比GUI方式轻松得多。例如前面所示命令行的操作,如果需要以GUI方式描述出来的话,少不了一大堆截图,否则很难让广大的菜鸟从浩如烟海的选项中找到自己真正所需要的东西。最后要提一下快捷键。快捷键取材于CLI,实质上是一种直接向系统发送指令的操作方式,但由于依赖于GUI,我把它归为GUI的工作元素,并视为GUI为提高工作效率而向CLI所作的折衷,下文会详细说明这一点。CLI的哲学
CLI可以说是人机界面的远祖,哪怕是远古时期的纸带式计算机,也同样需要使用“命令行”方式工作(当然载体不同)。可以说命令行是最符合计算机工作方式的操作方式。CLI的身上,带有编程的“影子”。各种选项以命令参数的方式传递给系统,我们所需要做的唯一事情就是查阅手册并选择适当的参数,然后用键盘一股脑儿敲进去,然后就是回车并等待执行结果。如前所述,这种操作方式具有很便利的可重复性,我们可以把这条命令保存为一个脚本以供将来直接调用,也可以粘贴到网络上,任何人都能直接复制并粘贴到自己的电脑上执行并得到同样的结果。由于主要使用文本作为界面,CLI软件对计算机的要求也低得多,在同等配置的机器上也要比GUI软件的性能好得多。也正因此,CLI软件得以在广大的服务器系统上大行其道,在这些系统上,性能是最重要的。同时,由于具备了比GUI软件好得多的可伸缩性,CLI的适用范围也远比GUI广泛,在很多嵌入式平台上,我们甚至只能看到CLI的身影。但毕竟人不是计算机,符合计算机的工作方式的同时也就意味着不那么人性化。为了用好一个CLI软件,用户不得不反反复复地查阅参数手册,有时还需要做各种参数组合的测试。而且如前所述,对于一些参数复杂的CLI软件,用起来是颇为令人头痛的,甚至有时根本就无法发挥CLI本身应有的“高效”。另外,对于CLI软件来说,执行结果往往并不是那么清晰的。用户常常不得不面对满屏滚动的反馈信息体验黑客帝国一般的快感,或者是仿效真正的黑客一般从浩瀚的log海洋中寻觅那条丝毫不起眼的提示信息。有人把CLI软件的工作方式称为“WYTIWYG”(What You Think Is What You Get,所想即所得)。这种方式的特点在于,虽然没有直观地反应出执行结果,但却能保证执行结果可以和你的意图一致。从某种程度上来说,这种说法是正确的,因为用户的意图总是以命令+参数的方式精确地传递给系统,最后虽然不能直观地看到执行结果,却总能发现系统已经出色并严格地完成了工作。但从某种意义上来说,这种说法是不准确的,因为当面对着长长的参数手册时,用户往往已经搞不清自己的意图到底是什么了。GUI的哲学
GUI是为了使操作直观而生,最初被苹果公司应用在其操作系统上。后来苹果公司更是大胆率先采用鼠标作为输入设备,从而进一步使得电脑操作更为直观和易用。不过在那个年代受限于硬件的机能,更由于苹果一贯的高价策略,GUI长期被视为一种不必要的“奢侈品”,直到微软的“平民系统”Windows出现,在大量抄袭了苹果系统的图形元素后,Windows成功地在低端市场蔓延开来,GUI才终于得以大行其道。从这点上来说,微软公司还是起到了很积极的作用,对计算机的平民化和易用化作出了不小的贡献。GUI的设计目标就是为了摆脱CLI的弊病,把软件的输入和输出都以更为人性化的形式来展现,从而使得软件更为易用和直观。从这种意义上来说,GUI的出现,可以看作是一种“进步”。通过提供一组图形“控件”,用户得以以更为自然的方式与计算机进行互动。通过简洁明了的图标,用户可以对软件的功能一目了然。通过使用新的输入设备——鼠标,用户可以以更符合人类习惯的方式“Point & Click”,舒服地向计算机传递各种指令。不难想象,GUI的出现对于计算机的发展来说,不啻于一场伟大的革命。GUI软件可以通过使用大量的图形元素和图形特效,从根本上改变软件的表现形式,“美观”和“人性化”渐渐成为软件界面设计的讨论主题。随着计算机处理能力的发展,我们甚至能够以3D的形式来呈现和操作软件。大量GUI软件的出现大大降低了学习和使用计算机的门槛,赏心悦目的操作界面吸引了各行各业的人投入其中。如果说CLI适应了各种各样的计算机,GUI则适应了各种各样的人。可以说,要是没有GUI,也就没有今天如此繁盛的计算机产业。GUI的出现顺应了人们的需求,也是历史的必然。然而无论多么精美的界面,电脑程序就是电脑程序,其本质上却还是需要通过“命令”传递给计算机才能发挥作用的。由于中间需要进行“人的习惯”到“计算机的习惯”的转换,GUI软件不可能做到如CLI软件一般的高效和精确。可以说,GUI避免了CLI的弊端,但CLI的优点却恰恰成为了GUI的缺点。由于大量图形元素的使用,GUI软件带动了计算机硬件的发展,人们对良好界面的追求推动了计算机处理能力的飞速发展。但这同时也说明GUI软件对计算机硬件的依赖性很强,在需要将GUI软件移植到其他平台时,这种依赖性的弊端就会凸现出来。而且即使是在同一平台上,GUI软件所耗费的资源要比相同功能的CLI软件高得多,但所能达到的性能则要低得多。尽管GUI提供了良好的易用性,极大地填补了人机对话的鸿沟,但在另一方面看来,实际上增加了软件开发的成本,缩小了软件的适用范围,同时降低了软件的工作性能。由于能够以非常灵活的方式进行设计,GUI软件的表现形式也是千差万别。这本来是件好事情,但由于存在太多的GUI设计方式,开发人员在设计复杂的GUI软件时往往会陷入一种无所适从的困境。为了设计出真正易用好用的GUI软件,开发商往往不得不求助于艺术家和心理学家,甚至不惜采用“仿真”的方式来设计软件界面,这大大增加了软件开发的成本。尽管因此带动了计算机图形学和人机界面设计学的发展,但更多的“无良”开发商基于成本的考虑,选择了滥竽充数得过且过,无视用户的操作习惯和软件的易用性,甚至创造出一些难以使用的“GUI”,企图用更符合自身利益的界面设计来“改善”用户本身自然的“习惯”和“体验”,如上面所提到的那个著名的GUI软件。以操作系统开发商为例,可以说,如今最能坚守易用性阵地的当属苹果公司。尽管其产品同样存在一些瑕疵,但直到今天,苹果公司仍然坚持发展人机界面设计学,其创造的GUI软件大都是艺术性和易用性结合的典范。而在微软Windows系统横行的国内,在其所推行的“廉价GUI”的理念影响下,能以谨慎的态度学习和应用哪怕是“图标设计学”的人都已经几乎绝迹了。这在实际上导致了部分用户对GUI的反感和抵触。QCD Player
Xine Player
图6:“仿真”式的GUI软件Windows
Linux (KDE)
Mac OS X
图7:不同操作系统对“图标一致性”的不同理解(注:复合式图标设计的一个基本原则是,图标的基本部分能够清楚地表明项目的大类。图中所列出的图标均为文档项目,但Windows的图标基本上没有遵循这个原则。KDE的图标基本遵循,但使用的不同色彩容易引起混淆。而Mac本身的图标系统就直接支持复合图标,因此这些图标的叠加工作实际上是直接由系统完成的。) 和CLI相对的,GUI的哲学是“WYSIWYG”(What You See Is What You Get,所见即所得),用户以自己所习惯的方式向系统传递指令,并可以立刻在屏幕上以最自然的方式看到执行结果,系统可以保证展示出来的东西和实际处理(如打印、渲染)后的结果基本保持一致。不过这事实上仅仅是GUI的一个设计目标,很多软件是根本达不到令人满意的效果的。而且对于用户来说,如何能把心目中的蓝图展现在计算机上,即使是在GUI高度发达的今天,也还同样是个问题。协同工作
如今我们可以看到广大的GUI拥趸在Windows下使用“Win+R”来输入命令以快速调用程序,也可以看到坚定的CLI信徒在Linux下使用FB(Frame Buffer)来为自己的终端界面增光添彩。GUI和CLI不是敌对的,灵活运用两者的特点才能开发出更符合用户需求的人机界面。所以,我真的很不明白,为何有这么多人陷入在“GUI还是CLI”这样的争论中无法自拔,甚至还出现了很多宣称“自己喜欢哪个就选哪个好了,吵什么吵”的和事佬。其实,对于用户来说,直观、易用且高效的操作方式才是受欢迎的,开发者又何必拘泥于一种固定的操作方式呢?而且,正如很多人所指出的一样,高效、直观,其实有时仅仅取决于用户的习惯而已。如其争论“GUI好还是CLI好”这样的话题,倒还不如多花点时间来研究个更好用的操作界面吧。