對(duì)于把編程當(dāng)作興趣的人來說,編程越久越會(huì)覺得『編程是一種藝術(shù)創(chuàng)作』。很多人認(rèn)為程序員一定愛編程,但真相并非如此,從我周圍的統(tǒng)計(jì)數(shù)據(jù)來看,真正愛編程的程序員不足10%,大部分人都是把編程當(dāng)做營生的手段。
從付出回報(bào)比來看,編程是近幾年收益最高的職業(yè)。即使是零基礎(chǔ),到培訓(xùn)班魔鬼訓(xùn)練三個(gè)月后也能找一份薪資待遇不錯(cuò)的工作。為了追求更好的生活,很多不適合當(dāng)程序員的人也干起了寫代碼的活。在當(dāng)前大環(huán)境下,大部分程序毫無設(shè)計(jì)可言,在市場推崇的『敏捷』開發(fā)模式下難見好的設(shè)計(jì),只是培養(yǎng)了無數(shù)CRUD Boy與SQL Boy。
設(shè)計(jì)的好的程序像一件藝術(shù)品,對(duì)使用它的人來說思想上能得到升華。每次遇見時(shí),都會(huì)嘴上贊不絕口,心里意猶未盡。同樣一件藝術(shù)品,一千個(gè)人看就有一千個(gè)哈姆雷特,程序也是這樣,你覺得完美無暇,其他人可能并不認(rèn)同。但是別放棄,總有規(guī)律可尋。
在看完『設(shè)計(jì)心理學(xué)』之后覺得收獲很多,結(jié)合程序設(shè)計(jì)談?wù)勛约旱睦斫狻?/p>
Affordance
示能:指一個(gè)物理現(xiàn)象與人之間的關(guān)系,也就是物品的特性與決定物品預(yù)設(shè)用途的主體之間的關(guān)系。簡單概述為,有形的物品如何傳達(dá)出人們與它們互動(dòng)的重要信息。
用直白的話說就是事物通過自己的外在形態(tài),向人們展示自己具有的功能。比如,你看到一張桌子,你就知道它可以放東西;看到一只鉛筆,就知道它可以寫字;看到一頂帽子,就知道它可以佩戴;
你會(huì)通過自己過去所擁有的生活經(jīng)驗(yàn)去預(yù)設(shè)你與某個(gè)事物之間的關(guān)系,就像你會(huì)不自覺的給周圍的人打標(biāo)簽。你的一個(gè)朋友是牙醫(yī),之后任何和牙齒有關(guān)的事情你都會(huì)想到這個(gè)朋友。你的一個(gè)朋友是律師,之后你有法律相關(guān)的問題肯定會(huì)想到這個(gè)朋友。這就很奇怪,為什么人會(huì)不自覺的給周圍的朋友打標(biāo)簽,并且為標(biāo)簽賦能?其實(shí)不是我們主動(dòng)為他人打標(biāo)簽,而是每個(gè)人都有Affordance。
你的Affordance是什么?這個(gè)問題值得每個(gè)人去思考。每一段程序也都有自己的Affordance,程序擁有什么樣的Affordance由程序員決定。比如PHP的Affordance就是快速開發(fā),性能糟糕,世界上最好的語言(貶義)……
Signifiers
意符:以前產(chǎn)品都比較簡單,比如勺子、鏡子,他們的功能一目了然,但是隨著科技的發(fā)展,產(chǎn)品也越來越復(fù)雜,很多時(shí)候單純靠外觀根本分辨不出這些東西到底具備什么功能,如何使用。比如企鵝,很可能會(huì)被認(rèn)為是QQ(聊天軟件)。這個(gè)時(shí)候,就需要借助設(shè)計(jì)的智慧將產(chǎn)品本身具有的功能通過一些方式展現(xiàn)的更加明顯,讓人一眼就可以知道,它能用來做什么,怎么用。
比如,看到門上的把手就知道門后有房間,順時(shí)針轉(zhuǎn)動(dòng)就是開門;看到墻上的開關(guān)就知道能控制電源,接通或者斷開。意符不只包含物品自身所表達(dá)的含義,而是通過場景化的方式讓人產(chǎn)生聯(lián)想,從知道物品有什么用,到怎么用。比如你有個(gè)朋友是牙醫(yī),你總是看到他肩上有厚厚的頭屑,你會(huì)懷疑他是個(gè)不講衛(wèi)生的牙醫(yī),以后看牙肯定不會(huì)將他作為第一選擇。再比如你發(fā)現(xiàn)你的律師朋友喜歡背后說人壞話,也會(huì)讓你對(duì)他的專業(yè)性產(chǎn)生質(zhì)疑,你有一套理論支撐自己快速的完成從A到B的演算,這就是Signifiers。
你的Affordance是什么?比如我是程序員,很多人會(huì)為我打上木訥的標(biāo)簽。但是看了我的文章之后,覺得我愛瞎扯,程序一定也寫的差。那么我的Signifiers就是程序?qū)懙牟畹某绦騿T。意符,就是讓人看到后產(chǎn)生聯(lián)想,從而得出正確的結(jié)論。比如大家都知道Node.js速度很快,但是試了下回調(diào)和同步編程后覺得很不適應(yīng),于是得出Node.js不適合寫后端項(xiàng)目的結(jié)論。
Mapping
映射:映射源于數(shù)學(xué)概念,它指在使用產(chǎn)品時(shí)人們對(duì)產(chǎn)品進(jìn)行操作、控制等行為與其進(jìn)行這些行為之后產(chǎn)生的結(jié)果之間的關(guān)系,這種關(guān)系叫做映射。
比如,你想使用遙控器轉(zhuǎn)換電視節(jié)目,按向下的按鈕,電視頻道進(jìn)入下一個(gè)節(jié)目,這個(gè)向下的按鈕就是電視頻道跳轉(zhuǎn)下一個(gè)的映射。這種映射已經(jīng)記錄在人們的大腦中,這種映射還能正反轉(zhuǎn)換,比如你想看下一頻道,肯定會(huì)去按向下的按鈕,這是正向映射。你不小心多按了一次向下的按鈕,你心里很清楚頻道會(huì)切換兩次,這就是反向映射。
映射在編程中用到的極為廣泛,比如hashTable,編碼解碼,內(nèi)存映射等等。
Feedback
反饋:指在進(jìn)行一次溝通行為之后的結(jié)果,結(jié)果必須是即時(shí)的并且能提供有用的信息,還要以一種不顯著的方式展示出來。
最常見的就是按鈕,例如電視的開關(guān)按鈕,在按壓之后會(huì)有彈起和很小的機(jī)械聲,彈起的反饋能讓你的觸覺接收到,聲音能讓你的聽覺接收到,在接收到信息之后就知道這次按壓的溝通行為成功了。再比如空調(diào),按一下遙控空調(diào)會(huì)發(fā)出『滴』聲,你聽到聲音后就知道這次溝通成功了。反饋要以一種不顯著的方式展示出來,如果按一下空調(diào)遙控板,空調(diào)『滴』了一分鐘,這就是太顯著的反饋,會(huì)適得其反。
反饋在UI設(shè)計(jì)上用的非常多,這里不展開講。我們說說TCP三次握手的問題,為什么要三次握手(那么多)?為什么要三次握手(那么少)?這個(gè)問題要分成兩部分來回答。
A和B的微信聊天記錄:
A:做我女朋友吧?
B:好的
到這里A和B溝通了兩次,但是B并不知道A收到他的消息沒有,心臟都要跳出來了。所以A這個(gè)時(shí)候應(yīng)該馬上回一句話(反饋),表示自己收到了。所以3次聊天才是兩個(gè)人確定關(guān)系的最少次數(shù)。當(dāng)然你可以聊幾萬句使得關(guān)系更穩(wěn)固,對(duì)談戀愛的人說很重要,但對(duì)程序來說沒那個(gè)必要。做任何事情,及時(shí)且不打擾的反饋都很重要。
Conceptual Mod
概念模型:通過抽象得到高度簡化的流程,用來展示事物如何工作。比如電腦中的文件夾、文件,就是在幫助人們建立一些概念模型。其實(shí)電腦根本不是按照文件夾這種方式存儲(chǔ)文件。
通過概念模型可以使用戶能夠預(yù)測(cè)自己行為的結(jié)果,比如你將A文件拖動(dòng)到B文件夾下,即使不打開B文件夾你也能預(yù)測(cè)到A文件肯定在B文件夾中。好的概念模型就是產(chǎn)品的呈現(xiàn)模型接近用戶心理模型,這一點(diǎn)iPhone和微信都做的很好。比如在iPhone上刪除軟件,長按軟件圖標(biāo)之后圖標(biāo)會(huì)一直抖動(dòng)(一些無法刪除的軟件不會(huì)抖動(dòng)),然后點(diǎn)擊刪除軟件就被刪了,非常符合預(yù)期。而Windows和Android只是刪了個(gè)圖標(biāo),真正的軟件并沒有刪除,并不符合人們腦中的概念模型,這就是糟糕的設(shè)計(jì)。
編程本身就是一種概念模型,計(jì)算機(jī)并不能執(zhí)行我們寫的代碼。代碼需要通過編譯器編譯成二進(jìn)制機(jī)器碼后計(jì)算機(jī)才能執(zhí)行。利用概念模型,人們可以將編程語言設(shè)計(jì)的更符合人類的思維模型。
寫了很多,希望大家能將這些設(shè)計(jì)方式用于日常生活與工作中。如果想看源代碼,我推薦PHP的Symfony,一個(gè)非常符合設(shè)計(jì)美學(xué)的項(xiàng)目。