黑客与画家
本文是?Paul Graham?寫的一篇關(guān)于黑客與畫家共同之處的文章,深入探討了黑客工作的藝術(shù)性與創(chuàng)造性。雖然大部分的程序員都覺得藝術(shù)是一件很遙遠(yuǎn)的事情,但對(duì)于那些愿意仔細(xì)打磨代碼追求精益求精的優(yōu)秀黑客來說,在創(chuàng)造的過程中總是能感受到藝術(shù)的真實(shí)存在(盡管可能只是隱約感受到,而且羞于把自己和藝術(shù)聯(lián)系起來)。藝術(shù)之所以會(huì)讓人覺得高高在上遠(yuǎn)離生活,是因?yàn)榇蟛糠秩硕际窃谝轮怩r地談?wù)撝囆g(shù),而不知道什么是創(chuàng)造。要成為一個(gè)創(chuàng)造者,你所要做的不是夸夸其談,而是投入全部熱情去不斷實(shí)踐。Dirty Your Hands
英文原文?|?譯文地址
黑客與畫家
我讀完計(jì)算機(jī)本科以后,去藝術(shù)學(xué)校學(xué)習(xí)繪畫。許多人感到奇怪,喜歡計(jì)算機(jī)的人也會(huì)喜歡美術(shù)嗎?他們大概認(rèn)為編程序和畫畫是兩種完全不同的工作,編程需要冷靜,精密,和正確的方法,而畫畫是表達(dá)某種狂熱的情感。
這種印象是不對(duì)的,編程和畫畫有很多共同之處,實(shí)際上,在我認(rèn)識(shí)的不同類型的人中間,畫家和黑客是最相似的。
畫家和黑客的相似之處在于:他們都是創(chuàng)造者,就好像作曲家,建筑師,以及作家一樣。黑客和畫家類似,他們的目的是創(chuàng)造某種美好的事物。盡管在創(chuàng)造的過程中,也許會(huì)發(fā)現(xiàn)新技術(shù),但他們的根本目的并不是研究技術(shù)。
我從來都不喜歡”計(jì)算機(jī)科學(xué)”這個(gè)詞,因?yàn)檫@種東西根本就不存在。這門學(xué)科的內(nèi)容,不過是由于歷史原因偶然湊合到一起的大雜燴,就好像南斯拉夫國的形成一樣。一頭是數(shù)學(xué)家們,他們擺弄計(jì)算機(jī)是為了得到國防部的資金贊助,中間部分,一伙人在研究仿佛是計(jì)算機(jī)自然史之類的東西--比如網(wǎng)絡(luò)上數(shù)據(jù)流算法的行為特征等等。在另一個(gè)極端上,是黑客們,他們編寫有趣的軟件。對(duì)他們來說,計(jì)算機(jī)是表達(dá)的工具,如同水泥之于建筑師,顏料之于畫家。這三種人湊在一塊的群體,就好像是數(shù)學(xué)家,物理學(xué)家和建筑師被分到一個(gè)專業(yè)里。
有時(shí)候黑客們干的事被稱為”軟件工程”,這個(gè)詞也是一種誤會(huì)。比起建筑師來,軟件設(shè)計(jì)師離工程師的距離更遠(yuǎn)。建筑師和工程師的分界并不十分精確,但卻是實(shí)實(shí)在在存在的。其分界在于做什么和如何做:建筑師決定做什么,工程師考慮如何做出來。
這兩件事情也不能分得太開,如果你不懂得如何做,那么你設(shè)計(jì)的時(shí)候就會(huì)陷入難局。但是編程當(dāng)然不是僅僅決定如何實(shí)現(xiàn)某種特性那么簡單,在最好的情況下,編程實(shí)際上就是設(shè)計(jì)軟件的特性--往往最好的設(shè)計(jì)方式就是實(shí)現(xiàn)它。
說不定哪一天,”計(jì)算機(jī)科學(xué)”會(huì)分裂成幾個(gè)專業(yè),就好像南斯拉夫最終分裂成幾個(gè)國家那樣。這也許是件好事。尤其是這意味著我所擅長的編程,會(huì)變成獨(dú)立的專業(yè)。
這些不同類型的工作綁到一個(gè)專業(yè)里,當(dāng)然有利于行政管理,但是卻會(huì)引起智力上的困惑。這也是我不喜歡這個(gè)名詞的另一個(gè)原因。處于中間部分的那伙人所干的,和經(jīng)驗(yàn)科學(xué)差不多,但是另外兩頭的人,數(shù)學(xué)家和黑客,可不太象是在干真正的科學(xué)。
數(shù)學(xué)家好像并不為這個(gè)問題發(fā)愁,他們就象數(shù)學(xué)系的同行一樣,很高興地做著理論研究,不久就忘了辦公大樓的牌子寫的是”計(jì)算機(jī)科學(xué)系”。但是對(duì)黑客們來說,這個(gè)牌子就很成問題。既然他們干的事被稱作科學(xué),他們就會(huì)感到好歹要象那么回事,于是大學(xué)和研究所的黑客們覺得應(yīng)該寫論文,而不是寫優(yōu)美的程序。但是不幸得很, 后者才是他們真正應(yīng)該干的。
論文充其量不過是一個(gè)手續(xù)。黑客寫出很棒的程序,然后再做一篇論文,論文表示軟件上的成績。但是兩者之間的不協(xié)調(diào)引起了問題:好的軟件比起糟糕的軟件來,更加不適合做論文的題材。
好的軟件不適合作論文的題材。首先,論文要有獨(dú)創(chuàng)性的,寫過博士論文的都知道,要想保證你開墾的那片地是***地,就等于說是你劃出一片別人都不想要的地來。第二,論文必須言之有物。糟糕的軟件使論文材料充足,你有很多事實(shí)可以描述你是如何克服那些困難的。糟糕的假設(shè)總是會(huì)產(chǎn)生大量問題。大部分AI 研究就是好例子。比如,你假定,以抽象概念為參量的邏輯表達(dá)式列表可以用來表示知識(shí),那你要論證的內(nèi)容可就多了。就像Ricky Ricardo說的,Lucy,這下可夠你解釋了。
創(chuàng)造美好事物的過程,常常是對(duì)已有事物的細(xì)微調(diào)整,或者是把已有概念用新方式組合起來。這種事情,恐怕不太好做研究論文吧。
那么為什么大學(xué)和研究所還要用論文來衡量黑客呢? 同樣的, 為什么要用標(biāo)準(zhǔn)化考試來衡量學(xué)術(shù)才能呢?為什么要用代碼行數(shù)來衡量程序員的工作量呢?這些考試的好處是容易實(shí)施,而且有一點(diǎn)效果, 因此才會(huì)引誘我們繼續(xù)采用這些措施。
真正的黑客能夠?qū)懗鰞?yōu)雅的代碼, 但是識(shí)別這種黑客的方法,真的很不容易找到。要有好的嗅覺才可能識(shí)別出真正優(yōu)秀的設(shè)計(jì)。是否真的有這種嗅覺,和是否自信有這種嗅覺,這兩者之間沒什么關(guān)聯(lián),即使有,也是負(fù)面的。
真正的考驗(yàn)是時(shí)間。經(jīng)過時(shí)間的考驗(yàn),好的東西會(huì)發(fā)展壯大,壞的東西會(huì)丟棄。不幸的是,需要的時(shí)間往往太長, 以至超過人的壽命。Samuel Johnson說,需要一百年的時(shí)間,才能形成一個(gè)作家的真正聲譽(yù)。你得等到這個(gè)作家有影響的朋友都死了,他的追隨者也都死了才行。
我想黑客不得不接受名聲上的不確定性,這一點(diǎn)上, 他們和其他創(chuàng)造者沒什么不同。實(shí)際上比較起來還要幸運(yùn)一些。在編程領(lǐng)域,一時(shí)的流行風(fēng)氣雖然也有影響,但沒有繪畫領(lǐng)域那么大。
還有比別人的誤解更糟的事情。更糟的危險(xiǎn)是你可能自己誤解自己。你通常在相關(guān)領(lǐng)域?qū)ふ异`感。如果你在計(jì)算機(jī)系,很自然地會(huì)以為,編程的本質(zhì)就是實(shí)現(xiàn)計(jì)算機(jī)理論。我讀本科的時(shí)候有一種令我很不舒服的感覺,我覺得自己應(yīng)當(dāng)多學(xué)一點(diǎn)計(jì)算機(jī)理論,可是期末考試完了不到三個(gè)禮拜,我就把那些東西全忘光了。這讓我覺得自己不夠盡責(zé)。
現(xiàn)在我認(rèn)識(shí)到我那時(shí)的想法都是錯(cuò)誤的。黑客對(duì)計(jì)算機(jī)理論的了解程度,只要達(dá)到畫家對(duì)顏料化學(xué)所了解的程度就夠了。你應(yīng)當(dāng)知道怎樣計(jì)算時(shí)間和空間復(fù)雜度,知道圖靈機(jī)模型。也許應(yīng)當(dāng)知道狀態(tài)機(jī),至少知道這個(gè)概念,如果要寫語法解析或者正則表達(dá)式庫的時(shí)候會(huì)用得到。畫家對(duì)顏料的學(xué)問上,要記的東西比這還要多一些呢。
對(duì)我來說,靈感的源泉不是來自于那些掛著計(jì)算機(jī)招牌的地方,而是那些聚集著創(chuàng)造者的地方。我從繪畫方面得到的靈感比我從計(jì)算機(jī)理論上得到的,要多得多。
打個(gè)比方。我上學(xué)的時(shí)候,學(xué)生在上機(jī)之前,要把整個(gè)程序先用紙筆寫出來。可是我覺得這不是我寫程序的方式。我喜歡坐在計(jì)算機(jī)前面寫程序,根本不用紙筆。我并不先在紙上寫出程序并檢驗(yàn)其正確性,我喜歡先敲一段代碼,當(dāng)然好多毛病,然后慢慢敲打成型。我受到的教育告訴我,調(diào)試應(yīng)當(dāng)是檢查輸入錯(cuò)誤的最后一關(guān),而按照我的方式,程序基本上就是調(diào)試出來的。
好長一段時(shí)間我都感到很沮喪,念小學(xué)的時(shí)候,我捉鉛筆的方式和老師教的不一樣,那時(shí)我也感到同此刻一樣的沮喪。如果我那會(huì)知道別的創(chuàng)造者-比如畫家和建筑師-的做法的話,我就早該知道這種方法的名字,那就是:打草稿。我可以告訴你,他們?cè)诖髮W(xué)時(shí)教我的方法是錯(cuò)的。你應(yīng)當(dāng)是一邊寫程序一邊來確定程序的走向, 這和畫家, 作家以及建筑師的做法完全一樣。
這里蘊(yùn)涵著軟件設(shè)計(jì)的真義, 認(rèn)識(shí)到這一點(diǎn), 就意味著程序語言應(yīng)當(dāng)首先要具有延展性。語言要有助于在編程中思考, 而不是僅僅表達(dá)思考的結(jié)果。它應(yīng)該象鉛筆, 而不是象鋼筆。如果程序員真的象大學(xué)里教的那樣寫程序, 那么靜態(tài)類型語言就是不錯(cuò)的選擇。但是我所知道的黑客都不是那樣子編程序的。我們需要這樣一種語言, 我們用它來隨意涂抹。而使用靜態(tài)類型語言編程序的感覺, 就好象手放在膝蓋上, 小心翼翼握著茶杯, 正襟危坐著和一個(gè)嚴(yán)肅的老太太談話。
談?wù)撿o態(tài)類型, 以及創(chuàng)造者這種話題, 我們除去了另外一個(gè)困擾的科學(xué)的問題: 數(shù)學(xué)嫉妒??茖W(xué)界的每個(gè)人暗地里都認(rèn)為數(shù)學(xué)家比自己聰明。我想數(shù)學(xué)家們自己大概也這么認(rèn)為。反正科學(xué)家們總是把自己的作品弄得象數(shù)學(xué)論文一樣。這對(duì)物理學(xué)倒還沒什么大害, 但是你要是在自然科學(xué)上走得越遠(yuǎn), 就越發(fā)現(xiàn)這個(gè)問題的嚴(yán)重性。
印上一整頁的公式, 看上去很讓人敬畏的樣子, 用上希臘字母就更加不得了。這種傾向可能誘惑你去研究那些可以公式化的問題, 結(jié)果是忽略了真正重要的東西。
如果黑客認(rèn)同創(chuàng)作者的身份, 像是畫家和作家一樣, 他們就不會(huì)受此誘惑。作家和畫家才不理會(huì)數(shù)學(xué)呢, 根本就是不相干的事情。我認(rèn)為,?黑客也應(yīng)當(dāng)這樣看。
如果大學(xué)和研究所不讓黑客做自己想做的事情, 他們還可以去公司, 可惜, 公司和大學(xué)的做法是一丘之貉。大學(xué)和研究所要求黑客當(dāng)科學(xué)家, 而公司要求黑客當(dāng)工程師。
我也是最近才發(fā)現(xiàn)這問題的。Yahoo買了Viaweb之后, 他們問我的意向, 我一向就不喜歡商業(yè)公司, 我就說我還是想編程序。進(jìn)了Yahoo以后, 我發(fā)現(xiàn)在他們那里, 編程序的意思就是代碼實(shí)現(xiàn), 和設(shè)計(jì)沒關(guān)系。程序員就是代碼工人, 他們把產(chǎn)品經(jīng)理的愿望, 以代碼形式記錄下來。
看起來這是大公司的一貫的做法。這樣做的目的是減低工作的偏差。只有少數(shù)程序員真正懂得設(shè)計(jì)軟件, 而且這些有才能的人很不容易一下子識(shí)別出來。所以與其把軟件的未來寄托在少數(shù)聰明人身上, 不如把軟件設(shè)計(jì)讓一個(gè)委員會(huì)來作, 程序員只管編碼實(shí)現(xiàn)。
如果你想賺錢, 那么記住我的話, 因?yàn)槲抑v的, 正是小公司取勝的機(jī)會(huì)。大公司采取保險(xiǎn)的做法, 意圖規(guī)避風(fēng)險(xiǎn)。但是試圖限制這種工作效果上的震蕩的時(shí)候, 固然避免了最壞的可能,但也失去了最好的。這對(duì)大公司當(dāng)然不是問題, 大公司取勝的原因不是因?yàn)榘l(fā)明了偉大的產(chǎn)品, 而是因?yàn)榉傅腻e(cuò)誤比其他大公司少而已。
如果你有辦法和一個(gè)大公司競爭某種產(chǎn)品, 這個(gè)公司的產(chǎn)品是產(chǎn)品經(jīng)理們?cè)O(shè)計(jì)的, 那么, 他們永遠(yuǎn)趕不上你。不過這樣的機(jī)會(huì)很不容易找到。你很難和大公司卷入軟件競爭, 就好比你很難和對(duì)手在城堡里徒手搏斗一樣。寫一個(gè)比微軟的word還要好的字處理器是可能的, 但是在操作系統(tǒng)這個(gè)微軟獨(dú)占的堡壘里, 他們對(duì)你根本就不屑一顧。
軟件競爭只能在全新的市場中展開, 因?yàn)樵谀抢镞€沒有誰建立起防御工事。你有可能采取大膽的策略, 集合那些既做設(shè)計(jì)又做編碼的人, 來贏得競爭。微軟最初就是這樣做的, 蘋果,HP也莫不如此。我想任何成功的創(chuàng)業(yè)公司都是走的這條路。
所以, 創(chuàng)造偉大軟件的一個(gè)辦法就是創(chuàng)業(yè)開公司。不過這里面還有兩個(gè)問題。第一, 開公司以后, 除了編程序, 你需要做好多其他事情。在Viaweb的時(shí)候, 我真的希望自己能擠出四分之一的時(shí)間編程就好了。實(shí)際上我四分之三的時(shí)間都是在做很討厭甚至很麻煩的事情。對(duì)此我深有體會(huì), 有一次當(dāng)我開完董事會(huì)去補(bǔ)牙, 坐在診所的椅子上, 我覺得簡直抵得上度假了。
還有另一個(gè)問題。寫有趣的軟件, 和寫賺錢的軟件, 經(jīng)常是沒多少共同之處。設(shè)計(jì)語言是很有趣的工作, 微軟的第一個(gè)產(chǎn)品就是。但是現(xiàn)在沒人會(huì)花錢買語言。要想賺錢就得寫那種很麻煩的, 沒人會(huì)免費(fèi)干的軟件。
所有的創(chuàng)造者都會(huì)面臨這個(gè)問題。價(jià)格是供求關(guān)系決定的, 對(duì)有趣軟件的需求總是比較少,而解決一般用戶的平凡問題的需求, 總是多一些。在高速公路邊上演出, 觀眾一定少, 在廟會(huì)搭個(gè)臺(tái)子演出, 觀眾一定多。寫長篇小說的收入, 比不上寫廣告詞的收入, 雖然那些廣告最后的歸宿是垃圾箱。設(shè)計(jì)一種語言的回報(bào)一定不多, 而搞定某些公司的老掉牙的數(shù)據(jù)庫和web server的連接問題, 回報(bào)會(huì)豐厚得多。
我認(rèn)為這個(gè)難題的答案, 是創(chuàng)造者們應(yīng)當(dāng)找一個(gè)養(yǎng)家糊口的”日常工作”。這個(gè)名詞最初是慣于晚上演出的音樂家們使用的。它的意思是: 你做一個(gè)工作是為了賺錢, 另一個(gè)工作是因?yàn)槟阆矚g。
幾乎所有的創(chuàng)造者在他們職業(yè)生涯的早期, 都有日常工作。其中最為人所知的就是畫家和作家。如果能賺錢的日常工作剛好是你所喜愛的工作, 那你就太幸運(yùn)了。音樂家就經(jīng)常在唱片店工作。正在用某種語言或者操作系統(tǒng)的黑客, 也應(yīng)當(dāng)找個(gè)相近的系統(tǒng)管理或維護(hù)的工作。[1]
黑客應(yīng)當(dāng)找個(gè)日常工作糊口, 業(yè)余時(shí)間做自己喜愛的程序。我的這個(gè)說法并不是獨(dú)出心裁。所有的開源社區(qū)的黑客都是這樣做的。我要說的是, 開源社區(qū)的模型也許是正確的模型, 因?yàn)檫@種模型被其他創(chuàng)造者分別獨(dú)立地驗(yàn)證過。
一般的雇主都不太愿意雇員參與開源項(xiàng)目, 這讓我有一點(diǎn)驚奇。在Viaweb則相反, 我們不愿意雇傭沒有做過開源項(xiàng)目的人。面試程序員的時(shí)候, 我們考慮的一個(gè)首要問題就是, 他們業(yè)余時(shí)間寫什么軟件。你要不是真的熱愛這個(gè)工作, 就不可能干的出色。如果你熱愛編程, 就必然會(huì)有自己熱愛的業(yè)余項(xiàng)目。[2]
黑客是創(chuàng)造者, 不太象是科學(xué)家。黑客尋找靈感的地方, 不應(yīng)當(dāng)是科學(xué)領(lǐng)域, 而是其他創(chuàng)造者工作的領(lǐng)域。那么, 我們從繪畫上, 能夠得到什么啟示呢?
第一件可以從繪畫領(lǐng)域?qū)W習(xí)的, 或者說可以驗(yàn)證的, 就是怎樣學(xué)習(xí)編程。繪畫都是在實(shí)踐中學(xué)會(huì)的, 編程亦然。大部分黑客都不是因?yàn)槟畲髮W(xué)計(jì)算機(jī)課才走上編程之路的。他們13歲年紀(jì)就開始學(xué)著寫程序。即使是上了大學(xué)計(jì)算機(jī)課, 你真正學(xué)會(huì)編程, 大多也是通過自己實(shí)際寫程序。[3]
畫家通常會(huì)留下一系列作品, 你可以從中觀察到他們?cè)趯?shí)踐中學(xué)習(xí)的過程。如果你按年代順序觀察一個(gè)畫家的作品, 你會(huì)發(fā)現(xiàn)后一個(gè)作品在前一個(gè)作品基礎(chǔ)上的提高。如果一幅畫中的某樣?xùn)|西特別出色, 你多半會(huì)在更早的作品中發(fā)現(xiàn)其發(fā)展成熟的軌跡。
我認(rèn)為大多數(shù)創(chuàng)造者都是這樣工作的。作家和建筑設(shè)計(jì)師也不例外。對(duì)于黑客而言, 我覺得這樣的做法大概比較好:?從一個(gè)大概的草稿開始起步, 不斷嘗試采納新的想法, 做修訂版,而不是連續(xù)幾年埋頭做一個(gè)題目。
這種工作模式是區(qū)別黑客和科學(xué)家的另一個(gè)顯著標(biāo)志。科學(xué)家并不通過干活來學(xué)習(xí)科學(xué), 他們通過做實(shí)驗(yàn)和解題來學(xué)習(xí)科學(xué)。科學(xué)家總是從完美的東西開始, 也就是說他們重復(fù)前人已經(jīng)做過的工作, 最后達(dá)到某種高度, 才開始做自己創(chuàng)造性的工作。而黑客呢, 一開始就是做創(chuàng)造性的工作–當(dāng)然這時(shí)候作品還不成樣子。黑客從創(chuàng)造開始, 最終達(dá)到完美。而科學(xué)家從完美開始, 最終達(dá)到創(chuàng)造。
創(chuàng)造者學(xué)習(xí)的另一種方法是觀摩杰作。對(duì)畫家來說, 美術(shù)館是技巧的寶庫。幾百年來, 美術(shù)館都是畫家學(xué)習(xí)和借鑒大師作品的地方, 它成為傳統(tǒng)教育方式的一個(gè)部分。觀摩杰作強(qiáng)迫畫家仔細(xì)觀察那幅畫是如何畫成的。
作家也是如此。本杰明-富蘭克林曾經(jīng)總結(jié)Addison和Steel的散文的特點(diǎn), 并加以模仿。Raymond Chandler也是這樣學(xué)寫偵探小說的。
同樣,?黑客也是通過看優(yōu)秀的程序來學(xué)習(xí)編程–不僅看它的外在表現(xiàn), 而且要看源碼。開源軟件有一個(gè)少人提及的優(yōu)點(diǎn)就是: 你很容易從中學(xué)習(xí)編程。我學(xué)編程的時(shí)候, 不得不依賴書里的例子。其中有一大堆代碼是屬于Unix的, 但Unix也不開源。大部分人是讀John Lions的書里的源代碼, 而這些內(nèi)容是不合法的。這本寫于1977年的書, 直到1996年都還被禁止出版。
繪畫的過程就是不斷改進(jìn)的過程, 這是值得我們學(xué)習(xí)的另一個(gè)地方。繪畫通常從草圖開始,逐漸地添上細(xì)節(jié), 但又不僅僅是添上細(xì)節(jié)那么簡單。有時(shí)候會(huì)發(fā)現(xiàn)最初的想法是錯(cuò)的。無數(shù)的人像作品, 在x光照射之下, 會(huì)發(fā)現(xiàn)面部輪廓修改過, 嘴的位置也移動(dòng)過, 諸如此類。
這就是我們應(yīng)當(dāng)學(xué)習(xí)的榜樣,?編程也應(yīng)當(dāng)遵循同樣的做法。想要假設(shè)軟件的規(guī)格設(shè)計(jì)完美無缺, 這顯然是不切實(shí)際的。預(yù)先接受這種現(xiàn)實(shí)對(duì)你有好處, 寫程序的時(shí)候就會(huì)有所準(zhǔn)備,隨時(shí)應(yīng)對(duì)可能發(fā)生的設(shè)計(jì)規(guī)格上的改變。
(大公司很難做到這一點(diǎn), 這又是一個(gè)小公司可以發(fā)揮優(yōu)勢的地方。)
現(xiàn)在差不多每個(gè)人都知道過早優(yōu)化的危險(xiǎn)。我認(rèn)為我們也同樣應(yīng)當(dāng)顧慮另外一個(gè)問題, 就是過遲確定軟件的設(shè)計(jì)規(guī)格。
好的工具可以幫助我們避免這個(gè)危險(xiǎn)。好的語言也可以幫助你較容易地改變主意。動(dòng)態(tài)類型語言就有這個(gè)優(yōu)點(diǎn), 你用不著預(yù)先就指定數(shù)據(jù)的表現(xiàn)形式。不過, 我認(rèn)為彈性的關(guān)鍵之處在于, 它使語言具有較高的抽象度, 如果一個(gè)程序比較短, 那它就比較容易修改。
這似乎聽起來讓人迷惑。但是偉大的作品總是精益求精。例如, 達(dá)芬奇在國家美術(shù)館畫Genevra de Benci像的時(shí)候, 頭像后面是檜柏樹叢, 他仔細(xì)地描繪每一片葉子。許多畫家也許認(rèn)為,這些東西是襯托頭像的, 沒人會(huì)仔細(xì)看。
達(dá)芬奇并不這樣認(rèn)為。他繪畫的認(rèn)真程度, 并不取決于看畫的人的認(rèn)真程度如何。達(dá)芬奇和米開朗琪羅一樣, 都是一絲不茍。從總體看去, 那些似乎看不見的細(xì)節(jié)也會(huì)變得顯著。這是一絲不茍的重要之處。觀眾經(jīng)過這幅畫的時(shí)候, 注意力一下子就被吸引過去, 那些原本不易覺察的細(xì)節(jié), 綜合在一起產(chǎn)生了驚人的效果, 就好像一千個(gè)細(xì)微的聲音唱出的和聲一樣。
偉大的軟件對(duì)于美的追求, 也需要超人的投入。當(dāng)你仔細(xì)查看好軟件的時(shí)候, 會(huì)發(fā)現(xiàn)那些不為人注意的部分同樣優(yōu)美。我不是說我自己寫的軟件是偉大的, 但我知道,?寫代碼的時(shí)候,要盡量寫得清晰易讀。有的程序變量名取得丑陋極了, 有的程序行縮進(jìn)亂七八糟, 讀這樣的代碼真能讓我發(fā)瘋。
如果把黑客僅僅當(dāng)作代碼工人的話, 那他會(huì)像工人挖水溝一樣從一頭干到另一頭。但是如果把黑客當(dāng)作創(chuàng)造者的話, 我們就必須考慮靈感的因素。
編程序的過程和繪畫的過程類似, 也會(huì)有起有落。上新項(xiàng)目的時(shí)候, 一天干16個(gè)小時(shí)不知道累, 也有時(shí)候, 無論如何都提不起興致。
這種狀況也必須考慮在內(nèi), 你應(yīng)對(duì)的方法不同, 效果也會(huì)不一樣。當(dāng)你開著手動(dòng)檔汽車過山的時(shí)候, 有時(shí)候?yàn)榱朔乐箳佸^, 不得不松開離合器。松開離合器可以防止拋錨。在繪畫和編程之中, 有一些是關(guān)鍵的東西, 另外一些是常規(guī)的工作, 留下一些容易作的工作, 等你厭倦的時(shí)候, 就做這些較輕松的工作。
比如說, 在編程時(shí)可以故意留一些bug, 我比較喜歡找bug。這時(shí)候, 黑客這個(gè)詞的含義可以說恰當(dāng)極了。你面臨的問題總體上是有限制的, 你要做的就是解決掉它。假定你的程序應(yīng)該做x, 結(jié)果卻做了y, 哪里出了問題? 你可以斷定最終一定是可以解決的。這個(gè)活跟刷墻一樣, 是不錯(cuò)的調(diào)劑。
繪畫不僅可以教我們?nèi)绾翁幚碜约旱墓ぷ? 還教我們?nèi)绾螀f(xié)同工作。過去很多偉大的作品都是由一群人共同完成的, 盡管在美術(shù)館的標(biāo)簽上可能只寫著一個(gè)人的名字。達(dá)芬奇在Verrocchio 的工作室當(dāng)學(xué)徒時(shí), 就參與繪制<<基督受洗>>中的天使。這樣的事情當(dāng)時(shí)很常見。當(dāng)米開朗其羅堅(jiān)持要自己一人繪制西斯廷教堂屋頂?shù)娜讼駮r(shí), 就被認(rèn)為是很不得體的事情。
就我所知, 畫家們一起作畫時(shí), 他們并不是一起畫一個(gè)共同的部分, 而是一個(gè)主要畫家畫主題人物, 他的副手畫背景和其他部分, 絕對(duì)不會(huì)有人摻和別人正在畫的東西。
我認(rèn)為這種模式也適用于軟件開發(fā), 不過別走得太遠(yuǎn)。如果一段代碼有三四個(gè)程序員分別寫過, 那么沒人真正對(duì)它負(fù)責(zé)。結(jié)果就會(huì)變成公用房間一樣沒人收拾, 又冷清又灰暗。正確的做法是把程序分成嚴(yán)格定義的模塊, 每個(gè)模塊有專人負(fù)責(zé), 仔細(xì)設(shè)計(jì)模塊之間的接口, 使之盡可能像程序語言本身那樣, 精確地表達(dá)出來。
軟件和繪畫一樣, 都是為人而做的。黑客也應(yīng)當(dāng)像畫家一樣, 努力創(chuàng)作出偉大的作品。你必須為用戶的立場著想。
我小時(shí)候, 就聽人講要學(xué)會(huì)從別人的立場來設(shè)想。意思就是做別人想要你做的事情, 而不是做你自己想做的事情。這當(dāng)然給” 換位思考”這個(gè)詞帶來了壞名聲。因此我一直不愿意這樣做。
可是, 我錯(cuò)了。換位思考確實(shí)是成功的秘密, 這并不意味著放棄自我。理解別人的觀點(diǎn), 并不是說你要按別人的興趣辦事。在某種情況下剛好相反, 舉個(gè)例子, 打仗的時(shí)候, 理解敵人觀點(diǎn), 其目的恰好是要反其道而行之。[4]
大多數(shù)創(chuàng)作是為人的, 你得理解人的需要。差不多所有偉大的作品主題都是人, 因?yàn)槿俗罡信d趣的, 就是人類自身。
好程序員和偉大的程序員之間的唯一的差別, 就是體察別人的能力。有些程序員很聰明, 但論到”換位思考”, 則是完全的自我主義者。這樣的人不可能設(shè)計(jì)出偉大的軟件[5], 他們從來不懂得理解別人的觀點(diǎn)。
判斷一個(gè)人換位思考的能力如何, 最好的辦法是看他怎樣向那些不懂技術(shù)的人講解技術(shù)問題。我們大概都見過那樣一些人, 不管多么聰明, 這件事情上卻是糟得很。如果有人問, 什么是編程語言, 他們會(huì)說, 呃, 就是一種高級(jí)語言, 能經(jīng)過編譯器處理產(chǎn)生目標(biāo)碼。高級(jí)語言?編譯器? 目標(biāo)碼? 不知道編程語言的人, 難道會(huì)知道這些東西?
軟件的目標(biāo)之一, 就是解釋自己。你要寫出好程序, 就應(yīng)當(dāng)知道用戶對(duì)軟件了解甚少。他們用軟件時(shí), 全無思想準(zhǔn)備。如果軟件的行為剛好合乎他們的設(shè)想, 那就最好了。別指望用戶會(huì)去讀操作手冊(cè)。這方面, 我見過的最好系統(tǒng)是早期的蘋果, 那時(shí)候還是1985年。蘋果干了所有軟件都做不了的事情, 那就是能正常運(yùn)行。[6]
源碼同樣也應(yīng)當(dāng)解釋自己。如果讓人回憶關(guān)于編程的名言, 經(jīng)常提到的是結(jié)構(gòu)化和解釋語言初期的一句話:
程序?qū)懗鰜硎墙o人看的, 碰巧機(jī)器也能運(yùn)行。
你不但要為用戶設(shè)身處地地著想, 對(duì)讀者也是一樣, 因?yàn)樽x者可能就是你自己。好多程序員寫了程序, 過半年再看, 簡直看不懂究竟是怎么回事。我就見過有幾個(gè)人因?yàn)檫@原因放棄了perl。[7]
缺乏換位思考的能力仿佛是高智商的特征, 尤其在某些地方, 這都成了一種風(fēng)尚。但我不覺得真的有什么關(guān)聯(lián)。數(shù)學(xué)和自然科學(xué)和人類感情無關(guān), 這些領(lǐng)域的人顯然都很聰明, 于是乎高智商就和”不通世故人情”掛起構(gòu)來。事實(shí)上好多平常智商的人在這方面也不行。看看脫口秀節(jié)目里那些站起來發(fā)問的人, 那些問題問的, 真叫拐彎抹角, 主持人得重新梳理一遍, 才能搞得清是啥意思。
如果編程和繪畫寫作一樣的話, 它也一樣酷嗎? 畢竟, 人只有一次生命, 最好是做有意義的事情。
這問題真難回答。在贏得名氣上總是有很大的滯后。這就好像遙遠(yuǎn)的星星發(fā)出的亮光, 要經(jīng)過好多年才能到達(dá)我們眼里。繪畫行業(yè)光芒四射是因?yàn)?00年前就產(chǎn)生的杰作。那時(shí)候,沒人會(huì)象我們現(xiàn)在這樣看重這些作品。我們現(xiàn)在所知的Urbino公爵Federico daMontafeltro先生的形象, 是從Piero della Francesca的作品里的高鼻子男人哪里得來的。這在當(dāng)時(shí)的人眼里看來, 一定是非常奇特的。
所以當(dāng)我說編程沒有繪畫那么酷的時(shí)候, 我們應(yīng)當(dāng)記住繪畫在它古老的光輝年代, 同樣也不見得那么酷。
我們可以自信地說,?現(xiàn)在正是黑客事業(yè)的光輝年代,?在大部分領(lǐng)域, 偉大的作品誕生很早。1430-1500年代的繪畫現(xiàn)在仍難以超越, 莎士比亞彷佛生來就是戲劇家, 把這門藝術(shù)推進(jìn)到如此之高的程度, 以致于后來的劇作家都生活在他的陰影里。Albrecht Durer之于雕刻, 奧斯丁之于小說, 也是如此。
一次又一次, 我們看到同樣的模式。新的媒體誕生了, 人們熱情高漲, 短短幾代人就把它的能量發(fā)揮到極至。黑客事業(yè)似乎也正處于這樣的時(shí)期。
達(dá)芬奇時(shí)代的繪畫行業(yè)并不酷, 是他的杰作造就了繪畫行業(yè)的酷。黑客事業(yè)之未來, 全依賴我們今日之創(chuàng)造。
作者注:
[1] 照相術(shù)的出現(xiàn), 毀掉了畫家的日常工作。歷史上很多畫家靠替人畫像維持生計(jì)。
[2] 我聽說微軟不鼓勵(lì)員工從事開源項(xiàng)目, 業(yè)余搞也不行。不過現(xiàn)在有那么多黑客都在做開源項(xiàng)目, 這種政策也許會(huì)令他們難以招募到很多一流程序員。
[3] 大學(xué)所能學(xué)到的編程技術(shù), 其狀況相當(dāng)于你學(xué)到的關(guān)于讀書, 打扮或者約會(huì)的知識(shí): 你上高中那時(shí)候的品味多差啊。
[4] 這里有一個(gè)”換位思考”的例子。在Viaweb的時(shí)候, 如果在兩個(gè)選擇之間下不了決心, 我們就會(huì)問: 我們的對(duì)手最恨什么? 當(dāng)一個(gè)對(duì)手在軟件里加了個(gè)沒用的特性, 這個(gè)特性我們沒有, 他們就在媒體上大作文章。我們當(dāng)然也可以解釋說這個(gè)特性根本是廢物, 但是我們還是決定也實(shí)現(xiàn)它, 因?yàn)檫@樣的話, 對(duì)手會(huì)更生氣。于是當(dāng)天下午我們就加上了這個(gè)特性。
[5] 不包括文本編輯器和編譯器。因?yàn)檫@兩樣?xùn)|西黑客自己也天天用, 自己就是典型用戶,所以用不著了解別人的觀點(diǎn)。
[6] 差不多如此。他們?cè)趦?nèi)存使用上弄巧成拙, 產(chǎn)生好多很麻煩的磁盤交換。幾個(gè)月后, 我買了個(gè)新驅(qū)動(dòng)器加上, 這問題就解決了。
[7] 給程序加注釋, 并不是增加易讀性的好辦法。我把Abelson和Sussman的話再發(fā)揮一下:程序語言是用來表達(dá)算法的, 碰巧也能在機(jī)器上運(yùn)行。好的編程語言, 表達(dá)軟件的能力比英語更好。只有在代碼含義復(fù)雜難解的地方, 才有必要加注釋, 就好像高速公路上急轉(zhuǎn)彎的地方才會(huì)有警告標(biāo)志。
總結(jié)