1. 程式人生 > >CLI or GUI --- 要高效還是要易用 (該文作者的功底真的很深厚啊)

CLI or GUI --- 要高效還是要易用 (該文作者的功底真的很深厚啊)

               

這篇文章很棒, 轉載過來欣賞!地址: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易用性,大概很多人都能猜到我會選擇這個軟體作為反面教材。圖1:不那麼易用的GUI       很顯然,這種將按鈕隱藏起來的設計是為了使得介面更加美觀和簡潔。但這種設計實際上大大降低了軟體的易用性和效率。我相信沒有什麼人願意通過先找到那個用來顯示按鈕的按鈕,點一下,再找到剪下、複製或貼上按鈕,以此來實現剪貼功能。事實上,大多數人會使用快捷鍵的方式。 
       像Office這類功能非常複雜的軟體,設計一個良好的GUI介面會非常費神,其設計難度不亞於一個整合開發環境(IDE,Intergrated Developing Environment)。但複雜性不應該是介面設計糟糕的藉口。如上例,事實上使用者根本無法選擇哪個按鈕應該隱藏,哪個不該。把剪下、複製、貼上、格式刷這樣常用的按鈕隱藏起來的唯一作用,就是敦促使用者通過快捷鍵而非按鈕去使用這些功能。不過既然如此,又何必把這些功能做成按鈕呢?直接拿掉不是更簡潔麼?      同樣,並非所有的CLI軟體都是高效的。以下是一個著名的CLI軟體的一部分 ffmpeg.exe -"D:\Video\Fearless\Fearless.avi"-target film-dvd -s 720x352 -padtop 64-padbottom 64-maxrate 7350000-3700000-sc_threshold 1000000000-trellis -cgop -12-bf 2-qblur 0.3-qcomp 0.7-me full -dc 10-mbd 2-aspect 16:9-pass 2-passlogfile "D:\Video\ffmpegencode"-an -f mpeg2video "D:\Fearless.m2v"        如果使用者是要使用完全相同的引數進行大量的批量轉換,以上命令也還勉強算得上“高效”。因為事實上,如果是需要經常使用的話,使用者通常並不會選擇每次都輸入這堆引數,而會使用指令碼的方式把以上的命令“包裝”起來,以便於將來的呼叫。但實際情形則常常更為複雜,使用者實際上很少使用完全同樣的選項進行轉換,而進行“微調”則會成為一件很麻煩的事情,於是就會出現把指令碼“包裝”起來以提供更靈活的微調功能的指令碼,如此周而復始,層層包裹。       對於這類軟體來說,由於所提供的功能選項非常豐富,設計引數列表和設計GUI同樣是一件很麻煩的事情。CLI實質上是通過簡化操作步驟和提供批量處理選項,來提高進行重複工作時的操作效率的。如果這個軟體使用的機會並不多,而且每次使用時的選項都不完全一致,那麼不僅不易用,而且也很難“高效”起來。

兩者的特點

      儘管如此,在大多數情況下,GUI確實比CLI更易於使用,而CLI確實要比GUI更高效,因為兩者的設計目標就是如此。      GUI由於採用了大量的圖形元素,介面會更顯得具有藝術性,富有人性化。相較於枯燥的文字來說,精緻且合理的圖形大大增強了介面的易用性。圖2: 漂亮的GUI       GUI所提供的像單選框、多選框這樣的簡潔明瞭的圖形控制元件使得軟體操作起來更為直觀。圖3: 偉大的設計——GUI控制元件      相較於GUI而言,CLI通常就不具備什麼美觀程度了。為了提高效能,CLI通常採用純文字方式工作。圖4: 一片漆黑的經典CLI介面      當然,也有例外的。圖5: 現代Linux上的常見CLI介面      為了提高工作效率,CLI通常都能夠以很自然的方式支援批量操作。例如刪除當前目錄下的所有obj檔案:rm *.obj      這種精確的指令可以保證得到嚴格執行,不會像採用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並沒有所期望的那麼“易用”,而純CLI系統也沒有所想象的那麼“高效”。作為一名程式設計師,我在從Windows平臺向Linux平臺轉換的過程中,發現了一個很有趣的現象。     Linux在繼承了Unix的血統的同時,也繼承了其龐大的CLI軟體基礎(這種說法很不準確,姑且這麼說吧),這跟早期Linux主要應用在伺服器市場上有關。隨著Linux系統被越來越多地應用到桌面市場上,對Linux下GUI軟體的呼聲也越來越高,也由此而引發了一系列關於Linux系統的爭議,例如“Linux不是Windows”、“Linux根本不適合用作桌面系統”、“現在的Linux已經不再是Linux了”、“Linux就應該做自己的伺服器,不該到桌面市場瞎摻和”。很多人都忘記了Linux僅僅是一個系統核心而已,這不僅能說明為何Linux核心會如此優秀,也能說明為何Linux會具有驚人的伸縮性。Linux核心既能夠和Unix移植過來的大量CLI軟體一起組成一個穩固的伺服器系統,自然也能夠搭載各種GUI軟體從而組成一個漂亮的桌面系統,這兩者並不矛盾。       有些跑題了,但從上面的描述可以看出,Linux進入桌面領域的時間不長,其基礎則主要是建立在過去的大量CLI軟體上的。為了在增強Linux的易用性的同時保留原先的CLI優勢,Linux下的許多GUI軟體採用了GUI前端+CLI後端的方式,也就是編寫一個用於與原CLI軟體進行互動的GUI軟體,兩者協同工作。這種工作方式和我們平常所說的“前臺+後臺”方式並不相同,其CLI部分是一個獨立的軟體,而GUI部分則僅僅是該軟體的一個“Shell”(外殼)而已。GUI部分無法獨立工作,而且開發目的僅僅是為了使該軟體更易用,而並沒有增加任何功能。      這種引人注目的方式具有很多優點,並且在最近得到了越來越廣泛的利用。這種方式結合了GUI和CLI的優點,在使得軟體的易用性得到大大增強的同時,其跨平臺能力以及效能和效率並沒有受到顯著削弱。由於同一個後端程式可以搭配不同的各種前端,從而能夠以較低的開發成本實現較好的跨平臺效果。由於前後端的分開,核心開發人員可以專注於系統性能,而無需受軟體表現形式和輸入方式的影響;而介面開發人員也可以無需關注核心的實現,只需著力於改善介面的易用性和美觀程度即可。這類系統的耦合度通常較低,使用者甚至可以選擇完全使用CLI來工作而無需理會GUI,這也大大降低了系統的維護成本。圖8: 漂亮的前端和強大的後端:Texshop+Texlive       這是GUI和CLI協同工作的一個好例子,但它也同樣存在缺陷。最顯而易見的問題在於,對於很多對跨平臺沒有特別要求的純GUI軟體,為了提高效率而分離並開發一個獨立後端顯得完全沒有必要。於是,一些開發商把CLI的一些理念“借”到了GUI軟體中,最常見且有效的莫過於快捷鍵了。快捷鍵本身實際上是一種直接使用鍵盤向系統傳送命令的方式,只不過採用按鍵組合的方式來代替了傳統的字串命令,使用者只需記憶各種按鍵組合即可輕鬆呼叫。這種方式既符合GUI的哲學,又引入了CLI的高效,實在是一大創舉,自誕生伊始就被廣泛採用。如今,一個成熟完善的GUI軟體已經根本離不開設計合理的快捷鍵了。圖9:無孔不入的快捷鍵     儘管快捷鍵在一定程度上提高了GUI的效率,但對於複雜的應用來說還是很不足夠,一種“類CLI”方式呼之欲出。微軟Office中Word的域命令方式雖然為Word的易用性蒙上了陰影,卻也為Word帶來了更靈活的工作方式和更強大的功能,我把這種方式稱之為“嵌入GUI中的CLI”。Autodesk公司的AutoCAD則走得更遠,索性大膽地應用了GUI和CLI聯合構建的“複合介面”,使用者需要聯合使用選單、按鈕、命令工作,以學習難度的增大為代價,帶來的是軟體功能的強大和Autodesk公司的富有。圖10:無所不能的複合介面

總結

      如今我們可以看到廣大的GUI擁躉在Windows下使用“Win+R”來輸入命令以快速呼叫程式,也可以看到堅定的CLI信徒在Linux下使用FB(Frame Buffer)來為自己的終端介面增光添彩。GUI和CLI不是敵對的,靈活運用兩者的特點才能開發出更符合使用者需求的人機介面。所以,我真的很不明白,為何有這麼多人陷入在“GUI還是CLI”這樣的爭論中無法自拔,甚至還出現了很多宣稱“自己喜歡哪個就選哪個好了,吵什麼吵”的和事佬。

      其實,對於使用者來說,直觀、易用且高效的操作方式才是受歡迎的,開發者又何必拘泥於一種固定的操作方式呢?而且,正如很多人所指出的一樣,高效、直觀,其實有時僅僅取決於使用者的習慣而已。如其爭論“GUI好還是CLI好”這樣的話題,倒還不如多花點時間來研究個更好用的操作介面吧。