|
當(dāng)我提到一個(gè)工具“對(duì)用戶不友好”(user-unfriendly)的時(shí)候,我總是被人“鄙視”。難道這就叫“以其人之道還治其人之身”?想當(dāng)年有人對(duì)我抱怨 Linux 或者 TeX 對(duì)用戶不友好的時(shí)候,我貌似也差不多的態(tài)度吧。現(xiàn)在當(dāng)我指出 TeX 的各種缺點(diǎn),提出新的解決方案的時(shí)候,往往會(huì)有美國(guó)同學(xué)眼角一抬,說(shuō):“菜鳥(niǎo)們抱怨工具不好用,那是因?yàn)樗麄儾粫?huì)用。LaTeX 是‘所想即所得’,所以不像 Word 之類(lèi)的上手。”
殊不知他面前這個(gè)“菜鳥(niǎo)”,其實(shí) TeX 功底比他高好幾倍。他早已把 TeX 的配置搞得滾瓜爛熟,把 TeXbook 翻來(lái)覆去看了兩遍,"double bend" 的習(xí)題都全部完成,可以用 TeX 的語(yǔ)言來(lái)寫(xiě)宏包,而且看透了 TeX 語(yǔ)言設(shè)計(jì)上的缺陷。而他被叫做“菜鳥(niǎo)”,這是一個(gè)非常有趣的問(wèn)題。所以現(xiàn)在拋開(kāi)個(gè)人感情不談,我們來(lái)探討一下這種“鄙視”現(xiàn)象產(chǎn)生的原因,以及什么叫做“對(duì)用戶友好”。
首先我們從心理的角度來(lái)分析一下為什么有人對(duì)這種“對(duì)用戶不友好”的事實(shí)視而不見(jiàn),而稱(chēng)抱怨的用戶為“菜鳥(niǎo)”。這個(gè)似乎很明顯,答案是“優(yōu)越感”。如果每個(gè)人都會(huì)做一件事情,如何能體現(xiàn)出我的超群智力?所以我就是要專(zhuān)門(mén)選擇那種最難用,最晦澀,最顯得高深的東西,把它折騰會(huì)。這樣我就可以被稱(chēng)為“高手”,就可以傲視群雄。我不得不承認(rèn),我以前也有類(lèi)似的思想。從上本科以來(lái)我就一直在想,同樣都會(huì)寫(xiě)程序,是什么讓計(jì)算機(jī)系的學(xué)生與非計(jì)算機(jī)系的學(xué)生有所不同?經(jīng)過(guò)多年之后的今天,我終于得到了答案(以后再告訴你)。可是在多年以前,我犯了跟很多人一樣的錯(cuò)誤:把“難度”與“智力”或者“專(zhuān)業(yè)程度”相等同。但是其實(shí),一個(gè)人會(huì)用難用的工具,并不等于他智力超群或者更加專(zhuān)業(yè)。
可惜的是,我發(fā)現(xiàn)世界上有非常少的人明白這個(gè)道理。在美國(guó)的大學(xué)里,公司里,彰顯自己對(duì)難用的工具的掌握程度的人比比皆是。這不只是對(duì)于計(jì)算機(jī)系統(tǒng),這也針對(duì)數(shù)學(xué)以及邏輯等抽象的學(xué)科。經(jīng)常聽(tīng)人很自豪的說(shuō):“我準(zhǔn)備用XX邏輯設(shè)計(jì)一個(gè)公理化的系統(tǒng)……”可是這些人其實(shí)只知道這個(gè)邏輯的皮毛,他們會(huì)用這個(gè)邏輯,卻不知道它里面所有含混晦澀的規(guī)則都可以用更簡(jiǎn)單更直觀的方法推導(dǎo)出來(lái)。
愛(ài)因斯坦說(shuō):“Any intelligent fool can make things bigger and more complex... It takes a touch of genius - and a lot of courage to move in the opposite direction.”我現(xiàn)在深深的體會(huì)到這句話的道理。想要簡(jiǎn)化一個(gè)東西,讓它更“好用”,你確實(shí)需要很大的勇氣。而且你必須故意的忽略這個(gè)東西的一些細(xì)節(jié)。但是由于你的身邊都是不理解這個(gè)道理的人,他們會(huì)把你當(dāng)成菜鳥(niǎo)或者白癡。即使你成功了,可能也很難說(shuō)服他們?nèi)L試這個(gè)簡(jiǎn)化后的東西。
那么現(xiàn)在我們來(lái)談一下什么是“對(duì)用戶友好”。如何定義“對(duì)用戶友好”?如何精確的判斷一個(gè)東西是否對(duì)用戶友好?我覺(jué)得這是一個(gè)現(xiàn)在仍然非常模糊的概念,但是程序語(yǔ)言的設(shè)計(jì)思想,特別是其中的類(lèi)型理論(type theory)可以比較好的解釋它。我們可以把機(jī)器和人看作同一個(gè)系統(tǒng):
- 這個(gè)系統(tǒng)有多個(gè)模塊,包括機(jī)器模塊和人類(lèi)模塊。
- 機(jī)器模塊之間的界面使用通常的程序接口。
- 人機(jī)交互的界面就是機(jī)器模塊和人類(lèi)模塊之間的接口。
- 每個(gè)界面必須提供一定的抽象,用于防止使用者得到它不該知道的細(xì)節(jié)。這個(gè)使用者可能是機(jī)器模塊,也可能是人類(lèi)模塊。
- 抽象使得系統(tǒng)具有可擴(kuò)展性。因?yàn)橹灰缑娌蛔儯K改動(dòng)之后,它的使用者完全不用修改。
在機(jī)器的各個(gè)模塊間,抽象表現(xiàn)為函數(shù)或者方法的類(lèi)型(type),程序的模塊(module)定義,操作系統(tǒng)的系統(tǒng)調(diào)用(system call),等等。但是它們的本質(zhì)都是一樣的:他們告訴使用者“你能用我來(lái)干什么”。很多程序員都會(huì)注意到這些機(jī)器界面的抽象,讓使用者盡量少的接觸到實(shí)現(xiàn)細(xì)節(jié)。可是他們卻往往忽視了人和機(jī)器之間的界面。也許他們沒(méi)有忽視它,但是他們卻用非常不一樣的設(shè)計(jì)思想來(lái)考慮這個(gè)問(wèn)題。他們沒(méi)有真正把人當(dāng)成這個(gè)系統(tǒng)的一部分,沒(méi)有像對(duì)待其它機(jī)器模塊一樣,提供具有良好抽象的界面給人。他們貌似覺(jué)得人應(yīng)該可以多做一些事情,所以把紛繁復(fù)雜的程序內(nèi)部結(jié)構(gòu)暴露給人(包括他們自己)。所以人對(duì)“我能用這個(gè)程序干什么”這個(gè)問(wèn)題總是很糊涂。當(dāng)程序被修改之后,還經(jīng)常需要讓人的操作發(fā)生改變,所以這個(gè)系統(tǒng)對(duì)于人的可擴(kuò)展性就差。通常程序員都考慮到機(jī)器各界面之間的擴(kuò)展性,卻沒(méi)有考慮到機(jī)器與人之間界面的可擴(kuò)展性。
舉個(gè)例子。很多Unix程序都有配置文件,它們也設(shè)置環(huán)境變量,它們還有命令行參數(shù)。這樣每個(gè)用戶都得知道配置文件的名字,位置和格式,環(huán)境變量的名字以及意義,命令行參數(shù)的意義。一個(gè)程序還好,如果有很多程序,每個(gè)程序都在不同的位置放置不同名字的配置文件,每個(gè)配置文件的格式都不一樣,這些配置會(huì)把人給搞糊涂。經(jīng)常出現(xiàn)程序說(shuō)找不到配置文件,看手冊(cè)吧,手冊(cè)說(shuō)配置文件的位置是某某環(huán)境變量FOO決定的。改了環(huán)境變量卻發(fā)現(xiàn)沒(méi)有解決問(wèn)題。沒(méi)辦法,只好上論壇問(wèn),終于發(fā)現(xiàn)配置文件起作用當(dāng)且僅當(dāng)在同一個(gè)目錄里沒(méi)有一個(gè)叫 ".bar" 的文件。好不容易記住了這條規(guī)則,這個(gè)程序升級(jí)之后,又把規(guī)則給改了,所以這個(gè)用戶又繼續(xù)琢磨,繼續(xù)上論壇,如此反復(fù)。也許這就叫做“折騰”?他何時(shí)才能干自己的事情?
TeX 系統(tǒng)的配置就更為麻煩。成千上萬(wàn)個(gè)小文件,很少有人理解kpathsea的結(jié)構(gòu)和用法,折騰好久才會(huì)明白。但是其實(shí)它只是解決一個(gè)非常微不足道的問(wèn)題。TeX 的語(yǔ)言也有很大問(wèn)題,使得擴(kuò)展起來(lái)非常困難。這個(gè)以后再講。
一個(gè)良好的界面不應(yīng)該是這樣的。它給予用戶的界面,應(yīng)該只有一些簡(jiǎn)單的設(shè)定。用戶應(yīng)該用同樣的方法來(lái)設(shè)置所有程序的所有參數(shù),因?yàn)樗鼈冎徊贿^(guò)是一個(gè)從變量到值的映射表(就像一個(gè)哈希表,或者數(shù)據(jù)庫(kù))。至于系統(tǒng)要在什么地方存儲(chǔ)這些設(shè)定,如何找到它們,具體的格式,用戶根本不應(yīng)該知道。這跟高級(jí)語(yǔ)言的運(yùn)行時(shí)系統(tǒng)(runtime system)的內(nèi)存管理是一個(gè)道理。程序請(qǐng)求建立一個(gè)對(duì)象,系統(tǒng)收到指令后分配一塊內(nèi)存,進(jìn)行初始化,然后把對(duì)象的引用(reference)返回給程序。程序并不知道對(duì)象存在于內(nèi)存的哪個(gè)位置,而且不應(yīng)該知道。程序不應(yīng)該用對(duì)象的地址來(lái)進(jìn)行運(yùn)算。
所以我們看到,“對(duì)用戶不友好”的背后,其實(shí)是程序設(shè)計(jì)的不合理使得它們?nèi)鄙俪橄螅皇怯脩舻膯?wèn)題。這種對(duì)用戶不友好的現(xiàn)象在 Windows,Mac,iPhone, Android 里也普遍存在。比如很顯然而幾乎所有 iPhone 用戶都被洗腦的一個(gè)錯(cuò)誤是“iPhone 只需要一個(gè)按鈕”。一個(gè)按鈕其實(shí)是不夠的。還有就是像 Photoshop, Illustrator, Flash 之類(lèi)的軟件的菜單界面,其實(shí)把用戶需要的功能(function)和設(shè)置(settings)給掩藏了起來(lái),分類(lèi)也經(jīng)常出現(xiàn)不合理現(xiàn)象,讓他們很難找到這些功能。
如何對(duì)用戶更加友好,是一兩句話說(shuō)不清楚的事情。所以這里只粗略說(shuō)一下我想到過(guò)的要點(diǎn):
- 統(tǒng)一:隨時(shí)注意,人是一個(gè)統(tǒng)一的系統(tǒng)的一部分,而不是什么古怪的神物。基本上可以把人想象成一個(gè)程序模塊。
- 抽象:最大限度的掩蓋程序內(nèi)部的實(shí)現(xiàn),盡量不讓人知道他不必要知道的東西。不愿意暴露給其它程序模塊的細(xì)節(jié),也不要暴露給人。“機(jī)所不欲,勿施于人”。
- 充要:提供給人充分而必要(不多于)的機(jī)制來(lái)完成人想完成的任務(wù)。
- 正交:機(jī)制之間應(yīng)該盡量減少冗余和重疊,保持正交(orthogonal)。
- 組合:機(jī)制之間應(yīng)該可以組合(compose),盡量使得干同一件事情只有一種組合。
- 理性:并不是所有人想要的功能都是應(yīng)該有的,他們經(jīng)常欺騙自己,要搞清楚那些是他們真正需要的功能。
- 信道:人的輸入輸出包括5種感官,雖然通常電腦只與人通過(guò)視覺(jué)和聽(tīng)覺(jué)交互。
- 直覺(jué):人是靠直覺(jué)和模型(model)思考的,給人的信息不管是符號(hào)還是圖形,應(yīng)該容易在人腦中建立起直觀的模型,這樣人才能高效的操作它們。
- 上下文:人腦的“高速緩存”的容量是很小的。試試你能同時(shí)想起7個(gè)人的名字嗎?所以在任一特定時(shí)刻,應(yīng)該只提供與當(dāng)前被關(guān)注對(duì)象相關(guān)的操作,而不是提供所有情況下的所有操作供人選擇。上下文菜單和依據(jù)上下文的鍵盤(pán)操作提示,貌似不錯(cuò)的主意。
it知識(shí)庫(kù):什么是“對(duì)用戶友好”,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。