人機界面的對戰(續)
UI的幫派戰爭
如果說不同流派間比較算是內部的矛盾,那么流派間的競爭,可謂是幫派戰爭了。
幫派戰爭中,最激烈當屬Linux為代表的CLI陣營與Windows/Mac為代表GUI陣營之間的對抗。雖然雙方都會將問題描述的花里胡哨,但是這些都是“將答案准備的足夠復雜以讓別人找不到明顯的瑕疵”的做法。撇開表現形式不談,我們看看操作系統最原始、最主要的需求:檢索及管理文件;啟動程序;管理已經啟動的程序(進程)。
為什么Linux和Windows的兩伙人在這個問題上能斗的這么激烈,而且還不分勝負,就是因為這三個功能都足夠簡單,無論是GUI還是CLI都能夠輕松勝任。所以說,單獨在OS Native功能集合上討論UI問題,如同兩小兒辨日,是沒什么意義的。
對於初學者來說,如果只是操作系統的基本功能,學習DOS/Linux和學習Windows也沒有太大的區別。讓用戶在屏幕上打出“app Q”就能搜出所有的名字帶Q的軟件,也並不是什么難事。甚至因為命令更加容易記誦的關系,說不定這樣用起來還更簡單。但是,系統必須要有許許多多的軟件來豐富它的功能。如果只用命令行的話,不僅僅在面對諸多功能時交互不方便,而且記誦的內容會爆炸性增長。只有GUI才能提供大量的上下文信息,用戶可以再記憶盡可能少的情況下下達正確的指令。再加上人都喜歡漂亮直觀的東西,所以GUI幾乎是PC這樣大眾消費品的必然選擇。
實際上對於任何一個經過大腦設計的軟件(包括操作系統),都不會宗教信仰般的選擇只選擇一種交互方式。
Windows提供了Command和PowerShell,Linux有X或者是GNOME和KDE這樣更上層的GUI Support;MSVC有專門的命令行,也可以鍵盤走天下,而且快捷鍵也多得令人發指,與EMACS比也不遑多讓了;AutoCAD更是有這么個說法:只用鼠標的,不如一只手用鍵盤的快;一只手用鍵盤的,不如兩只手用鍵盤的快。甚至程序員寫網頁,往往更喜歡手刃HTML而不是在Dreamweaver里面拖拖拉拉。因為他們選擇“錄入”,比選擇“拖拽和調整”要更加高效。
想想王垠的兩篇釣魚貼。LaTeX為啥能流行?因為程序員擅長錄入,擅長大腦排版,但是對點來點去生拉硬拽的感性東西卻把握的不好。不過還是要感嘆一下,LaTeX的特點也太鮮明了:語法忒差勁,排版賊漂亮。
三爺說的對,白貓黑貓,抓住老鼠才是好貓。
程序間的接合
所有Linux的粉絲們在提到這個系統的優越性的時候,都會無一例外的談到Unix的設計哲學:小工具,長流水。盡管不同的軟件協作模式不一樣,但毫無疑問這個是深受平台文化之影響。軟件在功能上的構件化,以及協作上的Pipeline化的確給功能組合帶來了很多的好處。你可以把很多功能拼接成你需要的內容。這也是很多Linux粉絲最自以為豪的地方。實際上,Photoshop和3DS Max這樣的軟件也借用了這樣的思路。
但是這一模式有它固有的問題:首先,如果交互很多,它的反饋效率很低;其次,如果數據不是線性的變化,而是從像狀態機一樣各個操作彼此呼應,那Pipeline就沒轍了。
反觀Windows上的軟件,大都是各自為戰。能在程序間共享的,就只有檔案文件,剪貼板等幾樣有限的方式。當然,Windows上有COM/OLE來實現更低粒度的復用,也有共享內存,郵槽和管道,甚至是Socket。但是這些開發起來要么復雜,除了MS很少會有;要么大部分Windows程序都不鳥這一點。
所以Windows上的軟件,都是集成式的,得高大全。面對復雜多變的用戶需求,一旦功能稍有不足,就會變得非常麻煩。有問題,就會有人提出解決辦法。插件系統解決了這類系統的擴展問題。可以說這和*nix的工具鏈是殊途同歸,只不過一個是自底向上,一個是自頂向下。
至於誰用起來更方便,我們可以做一個簡單的假設:
總操作成本 = 軟件內的操作成本 + 軟件之間的協作成本
我們可以這樣想:如果所有功能都在一個軟件中無縫完成,那么協作成本就是0。而Linux選擇了一個比較低的協作成本,但是這個成本始終存在;而Windows下的軟件大部分情況下協作成本是0,但是一旦需要協作,可能就會變得很高。不過總的來說,我們可以認為它們的成本期望是差不多的。
這兩種協作模式也是相互借鑒與融合的:插件減少了軟件外協作的幾率;一些GUI Shell(典型的包括TortoiseSVN)和Batch提高了軟件功能的內聚性,減少了軟件協作的次數。
在這一點上,Linux與Windows也是風格迥異,戰無可戰。
IDE與Debugger
不管Linux多么高效,Windows多么普及,Mac多么漂亮,OS之間的戰斗從來都不會在普通用戶間發生。這些看網頁、玩游戲、編輯文檔、看電影的大眾用戶們,要么Windows要么Mac,不會有什么人缺心眼來選Linux。所以OS的爭論從來都是在程序員之間進行。
所以OS之爭的戰火經常也會燒到軟件開發上。最常見的爭斗,大概是在IDE和Editor派的斗爭中進行。甚至連智能提示和代碼補完都經常成為無辜的犧牲品。之前我經常見到的論調就是,智能提示會降低程序員的智商。
拋開價格問題不談,VS毫無疑問是IDE中的翹楚。咱們可以回顧下IDE的作用:
- 就是,有個方框給你打字;
- 打的不對了,或者打到一半,可以給你提示一下;
- 搜索(查找聲明,符號查詢,普通查詢,從項目中翻閱文件);
- 醒目的內容(關鍵字)幫你高亮一下;
- 格式不對,幫你整理一下格式;
- 很方便的把寫好的內容編譯並運行。
這就完了。剩下的Debug什么的,就要看Debugger的了。噴VS的人,你們可以來說一說,以上幾點,VS哪里做的不好?當然,VS把手伸的更遠,將Linux上Conf/Make的工作也包攬了。不過你願意也可以用命令行工具。我以前在公司就用Jam負責編譯,然后VS只管寫代碼和調試。
隨着時間變化,眼見着VS的快捷鍵也有越來越多,甚至還有Emacs的快捷鍵支持和VIM編輯模式的擴展;Editor的功能也越來越強大,從早期的Tag到Sublime Clang,對語言本身的支持和提示也越做越好。但是從完成度上來說,無論是Eclipse+CDT,還是XCode,都和VS有一定的差距。只不過你需不需要那樣功能多樣的IDE,這是另一個問題了。
開發除了碼字,還有一個花費時間的就是Debugger。之前在群里面聊天的時候,一直有人說GDB如何如何好用。不過VS的Debugger也不見得難用。無論是Stack,還是Watch,或者是Register,Breakpoint,VS的Debugger都是合格的。VS的Debugger也可以用命令行操作。此外,在Windows下還有功能更豐富,短命令的WinDbg可用。
如果硬要比較的話,算上GDB的Visualizer,比如DDD,在可視化調試方面GDB不如VS Debugger;功能豐富性上,和WinDbg差不多。不過GCC的符號有時候會有一些問題,GDB有時候也不是那么穩定。並且GDB Attach的效率一直都比較慢。也許以后LLDB可以脫穎而出成為一個不錯的跨平台工具。從VS2003之后,GCC想戰翻VS已經不太可能了,Clang這個有錢的后期之秀倒是潛力大大的。
-
與硬件的溝通
人機界面是操作系統的外功,對硬件資源的管理是操作系統的內功。Windows將整個GUI部分都並入到內核中,多少影響了一些效率。這使得對不用GUI的網絡服務來說,Windows可能還是有一些吃虧的。但是一旦用上GUI后,Windows的優勢就體現出來了。今天的Linux花了不少力氣試圖以C/S模式的提供GUI服務,例如X Windows,但是實際上他們和OpenGL一樣,解決的都是昨天小型機上的古老問題,在現代PC上看不出多少優勢來。
現在我們還使用的富GUI的系統,即便是Linux魔改,也不會遵循X Server/X Client這樣的分離框架,而是直接建立在內核之上的。Mac OS X的Aqua,或者是Android的UI,都是整合與折中后的產物。
當然,對於一些用戶來說,UI是可有可無的累贅。
於是乎,論戰變成了:Windows好用!Linux安全穩定快。Windows應用程序多!Linux安全穩定快。Windows用戶廣!Linux安全穩定快。Windows向前兼容!Linux安全穩定快。Windows貴!Linux安全穩定快。對啊,還便宜!你不說我還忘了!
Linux安全嗎?攻擊他的人少罷了。而且真正薄弱的環節,多不在系統。你看CSDN,用啥系統也解決不了明文密碼的問題。
Linux穩定嗎?當然穩定。但是不知道為什么我的Ubuntu用着用着就崩潰了。不過Linux不同的發行版,素質也各有不同。
Linux快嗎?快。很多場合比Windows有一些性能優勢,比如文件系統。長時間運行下的內存管理和進程管理也要比Windows好一些。
無視Windows的其它特性,讓Linux“安全穩定快便宜”包打天下多少是不妥的。
Windows另一個被人詬病的地方就是補丁多。實際上Linux的補丁也不少,而且也有一些是Bug和安全補丁。不過Linux一般都叫:升級。同樣是升級,Windows的漸增升級顯然比Linux升着升着就得重新編譯內核的辦法要高明一些。特別是硬件驅動,可能內核一升級,驅動就掛了。要么重新編譯,要么重新安裝。這點上Linux對用戶的體恤程度比Windows要差不少。
這點在Android上就要好得多。畢竟是有這VM和Java Library作為隔離,即便是版本升級之后以前的API廢棄了,也不敢輕易去掉。
所以說,單論服務器這種交互少,變更少的應用而言,Linux還算是合適的。但是要是頻繁更新,硬件兼容性和應用兼容性來說,那顯然Windows是甩開Android幾條街的。iOS和Mac OS X是另一條路子,專硬專用。王垠在博客上提到說Photoshop在Mac OS X上的移植難度比Windows大很多並推理成Mac OS X比Windows爛,是不合理的。這不完全是團隊的水平問題。而是從一開始Apple就沒有將可移植性作為重點來抓。畢竟這樣的升級要許多年才會遇到一次。花大工夫在不太需要的特性上顯然是一種過度設計和浪費。
API及其它爭論
對於Windows和Linux,Mac OS X上來說,還有很多類似與API好不好看一類的問題。這么說,UI相關的API是Windows和Mac原生的產物,Linux上需要算上X Windows。Windows和X相比較,前者要更加成功一些;Mac的UI比較固定,所以Cocoa的框架集成度很高(還有一個抽象層次更低一些的Carbon);Windows在界面上需要一定的靈活性,所以比較復雜難用,看起來也經常不雅觀。
有需要就會有功能強大,結構復雜的東西出現。例如Mac的字體渲染就比Windows好;Windows的Open Type也能完成正常的渲染工作,而且uniscribe的排版也很強大;Linux就弱許多。此外,像IME/TSF這樣要應對各種語言,各種區域需求的功能,API很難做的干凈簡單。
除此之外就是文件系統、內存、進線程和網絡API,這實際上是Linux,POSIX與Win API的競爭。整體來說,該有的功能,大家都有。用起來的難度/復雜度也不相上下。你能給我找個在某個系統下寫的順暢的功能換一個系統就狗屎不如的例子嗎?
結語
斷斷續續磨洋工寫了兩天。本文的宗旨就是添油加醋和稀泥,發表一個完全是廢話的觀點:現代系統都差不多。
最后推薦兩首歌:
《Fantastic Chindren》的插入曲和ED:
Voyage:
http://www.xiami.com/song/1769616092
水のまどろみ