美商歐萊禮授權 蔡學鏞 輯
駭客與畫家
Paul Graham/著;
莊友欣、莊惠淳/編譯
歐萊禮出版
售價:300元
Hackers and Painters: Big Ideas from the Computer Age
Paul Graham/著
O'Reilly出版
售價:22.95美元
推薦:Amazon四顆星
駭客與畫家相同的地方,在於他們都是創作者。就像作曲家、建築師、作家一樣,駭客和畫家都試著想要創作美好的事物。他們不是在研究,但是在試著創作美好事物時,他們可能也會發現新的技術。
我從未喜歡過「電腦科學(computer science)」這個詞彙。我不喜歡它的主要原因,是因為它根本不存在。電腦科學,是一個許多不太相關的領域混雜在一起的歷史意外,就像南斯拉夫。一個極端是真正的數學家,他們必需把工作稱作電腦科學,才能取得DARPA的補助。中間是鑽研電腦博物學的學者,例如研究透過網路路由資料的演算法行為。在另一個極端則有駭客,想要寫些有趣的軟體,對他們來說電腦只是一種表達的媒介,就像混凝土之於建築師、顏料之於畫家。這好像必需把數學家、物理學家、建築師都分在同一個科系裡一樣。
有時駭客的所作所為被稱為「軟體工程(Software Engineering)」,但是這個詞彙也有誤解。優秀的軟體設計師不再是工程師,而像是建築師。建築和工程之間的界線並沒有很清楚的定義,但就是有所不同。不同之處在於一邊是要做的事物,另一邊是具體作法:建築師決定該做什麼,工程師想出具體作法。
要做的事物和具體作法這兩件事,不應該分得這麼清楚。如果你要決定什麼該做,卻又不瞭解方法,將是自找麻煩。但是駭入(hacking)不只可以決定如何導入規格。最好的情況下,駭入是規格的建立-然而,最好的規格建立方法就是直接導入。
也許有一天,「電腦科學」就像南斯拉夫一樣會分裂成幾個部分。這可能是件好事,尤其是意味著我的駭客領域獨立自主的話。
把這些不同類型的工作綁在同一個部門裡可能便於管理,但卻會造成混淆。這是另一個我不喜歡「電腦科學」這名稱的原因。你可以說中間的學者是在進行某種科學實驗,但是兩端的人,駭客與數學家,並不是在做科學研究。
數學家似乎不會被此困擾。他們會很高興地安定下來,就像數學系裡的數學家一樣繼續證明數學定理;可能不久之後,他們終於會注意到自己工作的建築物上面標著「電腦科學」。但是對於駭客來說,這個標籤是一個問題。如果他們所做的是科學,會讓他們覺得應該要有符合科學規律的表現。所以相對於做真正想做的事情(設計優秀的軟體),大學和實驗室裡的駭客,認為自己應該寫研究論文。
在最好的例子裡,論文是一種表現形式。駭客撰寫很酷的軟體,然後再寫相關的論文,論文成為軟體成果的展示。但是這樣的錯誤結合,常常會產生問題。為了配合比較合適的論文主題,很容易從設計美好的事物轉移到醜陋的事物。
不幸的是,美麗的事物不一定是最好的論文的主題。第一,研究必需是原創的-只要寫過博士論文就知道,確定自己正在研究新領域的唯一方法,就是找出沒人要寫的那一塊。第二,研究必需豐富-不成熟的系統就等於大量論文內容,因為你可以寫下達到目標前所克服的重重阻礙。錯誤的假設就是產生大量問題的最佳方式。人工智慧就是這規則的好例子;如果你認為知識可以用一連串代表抽象概念的邏輯來表示,光是清楚地表達其運作方式就可以寫出許多論文。
建立美麗事物的方式,常常是針對現有的事物做些微妙的調整,或是用某些新的方式結合現有的多種想法。這種作法很難在研究論文裡表達出來。那麼,為什麼大學和研究室還在用著作數量來衡量駭客呢?其實,跟使用單向思考的標準化測試來衡量「學術天分」,或者用程式碼的數量來衡量程式人員的生產力是一樣的道理。這種測驗很容易使用,容易使用的測驗實在太有魅力了。
衡量駭客真正想做的事情(設計完美的軟體),會困難得多。你需要有很好的設計感,才能判斷好的設計。但是判斷良好設計的能力,以及對判斷的自信之間,並沒有什麼關連性,甚至還可能有負相關。
唯一的外部測試是時間。隨著時間的演進,美好的事物會興盛,醜陋的事物會被摒棄。不幸的是,這段時間的長度可能比人的壽命還長。約翰生(Samuel Johnson,編撰第一本英文字典的英國人)就說,作家的評價得花上一百年的時間才會趨於一致。你必需等到作家的朋友和其支持者都過世才行。
我認為駭客對於名聲的看法,必需隨緣才行。在這方面,他們與其他的創作者沒什麼兩樣。事實上,相比之下他們算幸運的了。流行時尚對於駭客的影響,可不像繪畫那麼嚴重。
其實還有比人們誤解你的工作更糟糕的事情。當你自己也誤解了你的工作才是最糟的危險。我們會到相關領域尋找新點子,如果你認為自己是在電腦科學部門,很自然地,你會認為駭客是電腦科學理論的應用。當我在研究所時,心裡有一種不舒服的感覺,覺得需要多瞭解一些理論,但是我卻非常不小心地在為期三周的期末考裡通通忘記了。
現在,我知道我錯了。駭客理解電腦運算理論的必要性,就跟畫家理解顏料化學成分的必要性類似。如果想要撰寫一個解析器,你需要知道如何計算時間與空間的複雜度,或許也要理解狀態機(State Machine)的概念。畫家也必需記得如何調和顏料,而非顏料的化學成分。
我所找到的最佳構想來源,並非那些名字含有「電腦」的領域,而是來自創作領域。對我來說,繪畫是比電腦理論更棒的創意來源。
舉例來說,我在大學時被要求在使用電腦之前,完全紙上談兵地設計程式。我認為我無法這樣寫程式。我發現自己喜歡坐在電腦前寫程式,不是把程式寫在紙上。更糟的是,我不是耐心地寫出完整的程式且確認其正確無誤,反而比較喜歡丟出亂七八糟的程式碼,然後再一步步地進行調整。老師告訴我,「除錯」應該是最後一個步驟,用來找出錯字和疏漏;但是我寫程式的方法根本就是不停地除錯。
有很長一段時間,我對此感到沮喪,就像念幼稚園時,沒有照老師所講的方式握筆一樣。如果我參考其他的創作者,例如畫家或建築師,我將知道這項方法有一個正式的名稱:打草稿。現在我瞭解,大學時期教導的程式設計是完全錯誤的。應該在寫程式的同時搞懂自己寫的程式,就像畫家和建築師一樣。
瞭解這些對於軟體設計有很大的影響。首先,這代表程式語言應該具有延展性。程式語言是用來思考程式,而不是用來展現你已經想出來的程式。它應該像是一支鉛筆,而不是一支鋼筆。如果大家寫程式的方法跟我大學所學相同,靜態型別(Static Typing)應該會是一個優秀概念。但是它並非任何一個我所認識的駭客用來撰寫程式的方式。我需要一個可以隨意擦寫塗抹的程式語言,並不想讓語言要求我正襟危坐地捧著類型,非常禮貌地與嚴謹過時的編譯器對話。
除了靜態型別這主題之外,與創作者類似的觀念還可以幫助我們解決另一個令科學苦惱的問題:對數學的妒忌。在科學界裡的人都偷偷地相信,數學家比他們來得聰明。我認為數學家也這麼認為。結果,科學家傾向於把研究成果弄得看起來像是數學。在物理這領域裡,這種作法可能不會帶來太大的傷害,但是擷取的科學本質愈多,它本身會將愈來愈成為一個問題。
一頁公式看起來就是令人印象深刻(提示:想要令人印象更深刻,請使用希臘變量)。因此會引誘你處理用普通方式就能解決的問題,而不是去面對重要的問題。(下頁)如果駭客與其他創作者一樣,例如作家和畫家,他們就不會想要這麼做。作家和畫家不會妒羨數學家。他們認為自己在從事完全不相干的事情。我認為,駭客也是如此。
如果大學和實驗室不讓駭客做他們想要做的事,也許企業會是適合他們的地方。不幸的是,大部分的企業也不讓駭客做他們想做的事。大學和研究室強迫駭客成為科學家,企業則是強迫駭客變成工程師。
我直到最近才明白這件事。當Yahoo買下Viaweb,他們詢問我想要做什麼。我一直都不太喜歡做生意,所以回答說我只想繼續當駭客。
當我到Yahoo上班時,我發現駭客對於他們來說,只是導入軟體,而不是設計軟體。程式設計師被視為技工,負責把產品經理的願景(如果是這樣說的話)轉成程式碼。
這似乎是大公司原本的計畫。他們之所以這麼做,是因為可以降低成果的標準差。只有一小部分的駭客可以實際設計軟體,但管理公司的人很難挑選出這些人。因此與其將軟體的未來寄託於一個優秀的駭客,大部分的企業選擇由委員會來負責設計軟體,駭客只是負責導入設計。
如果你想要賺大錢,請記得這點,因為這是新創企業得以勝出的原因之一。大公司想要降低設計成果的標準差,因為他們想要避免災難;但同時也降低了可能一鳴衝天(或一敗塗地)的機會值。這對於大公司來說不是問題,因為他們不是靠生產偉大的產品而成功。大公司是靠著較少的失敗,來勝過其他大公司。
所以,如果你找到涉足軟體設計戰爭的道路,而競爭對手是由大公司的產品經理設計的軟體,他們將無法跟得上你的程度。但是這種機會很難出現。在設計戰爭裡很難面對大公司,這就像闖入敵人的城堡裡要求人空手搏鬥。舉例來說,想要寫一套比微軟的Word還要優秀的文書處理軟體是很容易,但是微軟已經壟斷了作業系統堡壘,他們可能不會注意到你寫了什麼。
軟體設計的戰場在新興市場,還沒有人在這裡建立防禦工事。如果你在這裡採取大膽的設計策略,並讓同樣的一批人負責設計與導入產品,你可以大賺一票。微軟最初就是這樣。蘋果電腦也是。惠普也是。我觀察到幾乎所有成功的新興公司都是如此。
所以,另一個開發偉大軟體的方法,就是自己開一家新公司。然而,有兩個問題。其一,在新公司裡,除了撰寫軟體之外,你必需處理許多其他事情。在Viaweb,如果有四分之一的時間能拿來寫程式,我就會覺得很幸運了。其他四分之三的時間所做的事,從冗長乏味到可怕嚇人都有。讓我提供一個比較基準:有一次,我必需離開董事會議去補蛀牙,我記得當時坐在牙醫診所的椅子上,等待牙醫鑽磨我的牙齒時,那感覺好像在度假一樣。
新公司的另一個問題,賺錢的軟體和為了興趣而開發的軟體之間,沒有太多的重疊。設計程式語言就很有趣,事實上微軟的第一個產品正是如此,但是現在已經沒有人會為了程式語言付錢。如果你想要賺錢,你必需強迫自己去處理那些沒有人想要免費解決的討厭問題。
所有創作者都面對同樣的難題。價格是由供給和需求來決定的,有趣工作的需求量,總是比不上解決個別客戶的世俗問題。在實驗劇場裡演戲,總是比不上在展覽攤位上披著猩猩裝來得有賺頭。寫小說所賺的錢,還比不上垃圾處理器的廣告文案。對程式語言動手動腳的工錢,也比不上協助某公司把老舊資料庫與網站伺服器連結。
我認為這個問題的答案,以軟體來說,是一個幾乎所有創作者都通曉的概念:正職工作(Day Job)。這個名詞是由在晚間表演的音樂家所提出的,大致來講,創作者有一份只是為了賺錢而做的工作,以及另一份為了興趣而做的工作。
幾乎所有創作者的經歷裡,都有一份正職工作;畫家和作家更是如此。如果夠幸運的話,也可以擁有一份與真正工作非常相關的正職。音樂家常常在唱片行工作。鑽研某種程式語言或作業系統的駭客,或許也可經由專長取得一份正職工作。
當我說,答案在於駭客取得正職工作,順便設計美好的軟體,這可不是什麼新想法。這正是開源碼駭客的成就。我要說的是,開源碼可能是正確的模式,因為它已經被其他創作者確認過了。
但是那些不情願讓駭客從事開源碼專案的雇主,卻讓我感到驚訝。在Viaweb,我們不願意雇用任何不想這麼做的人。當我們與程式設計師面談時,我們很關切他們在下班後所寫的軟體。除非你熱愛某件事情,不然無法做得很好。如果你喜歡駭客的行為,你必定會自己進行一些專案。微軟不鼓勵員工參與開源碼專案,即使利用空閒時間也不鼓勵。但有很多最好的駭客都在從事開源碼專案,所以這項政策最大的影響,就是讓微軟更難雇用一流的程式設計師。
因為駭客是創作者而非科學家,所以尋找比喻的正確方向並非在科學面,而是在其他形式的創作者。畫家能教導我們哪些關於駭客的事情呢?
有一件事可以從畫家的例子學到(至少可以確認):如何學習成為駭客。學習繪畫的方式,大部分是藉由動手繪畫。駭客也是如此。大部分的駭客並不是藉由修習大學裡的程式課程而成為駭客,他們是因為在十三歲時就開始寫自己的程式而學會。即使是在大學課程裡,你通常也是經由駭客行為而學會如何當個駭客。
因為畫家會在身後留下作品的軌跡,後人得以觀察他們經由實作來學習的過程。如果按照年代順序觀察一位畫家的作品,你會發現每一幅畫都是建立在之前的學習基礎上。當某一幅畫裡的某個部分表現得特別好時,通常可以在之前的作品中,找到縮小版的類似形式。
我認為多數創作者的學習路程亦如是;作家和建築師似乎也是如此。也許對於駭客來說,跟畫家類似的行為還不錯,定期從新開始,而不是長年持續進行一個專案,試著把所有的後續想法都合併成修訂版。
駭客邊作邊學的方式,也是駭客與科學大不相同的另一個記號。科學家並不能從實作中學到什麼東西,而是從實驗室與問題集裡學習。科學家進行完美的工作,但其實他們只是試著重製某人已經幫他們做好的作品。最後,他們才會回到可以進行原創工作的地方。
而駭客從一開始就是在進行原創工作;是非常粗劣的。駭客從原創開始,做到完美,而科學家從完美開始,回到原創。
創作者的另一種學習方式,是依據範例。對於畫家來說,博物館是技術的圖書館。數百年來,畫家傳統教育的一部份,就是模仿大師們的作品,因為模仿能強迫你仔細檢視一幅畫作的產生方式。
作家也是如此。富蘭克林(Benjamin Franklin)透過摘錄英國作家愛狄生與史提爾的文章要點,試著重寫來學習寫作。錢德勒(Raymond Chandler)也是用這種方式撰寫偵探小說。
同樣地,駭客可以藉由研究好程式來學習-不只知道程式的執行結果,而是研究原始碼。使程式學習更為容易,是開源碼運動的另一個較不為人知的優點。當我學寫程式時,我們必需大量依賴書裡的範例。那時只能取得Unix的程式碼,但並非開源碼。大部分閱讀原始碼的人,都是透過非法影印John Lions的書,他的書雖然寫於1977年,但直到1996年才出版。
還有一個可以借喻自繪畫的例子:繪畫創作是由逐步改進而產生。繪畫通常是由素描開始,然後填入細節。但是它不只是一個填入的過程。有時原始的計畫是一場錯誤。有無數的畫作以X光檢視時,會發現人物的四肢被移動過、臉部特徵也可能被調整過。
這是一個可以從繪畫來學習的例子,我認為駭客也應該這麼做。預期程式規格的完美叫做不切實際。如果承認這種狀況,並且以允許直接改變規格的方式來撰寫程式,會比較好。
現在大概每個人都知道過早最佳化(Premature Optimization)的危險。我認為應該也要擔心過早設計(Premature Design)──太早決定程式應該做的事。(下頁)正確的工具可以幫助我們避免這種危險。一個好的程式語言應該像油畫一樣,使改變心意甚為便利。動態型別(Dynamic Typing)是好的,因為你不需要預先限制特定資料呈現。但我認為,靈活性的關鍵在於讓程式語言更為抽象。最容易改變的程式,是簡短的程式。
這聽起來很弔詭,但是一幅偉大的繪畫,一定比它原本的設想更美好。舉例來說,當達文西(Leonardo Da Vince)在國家藝廊畫Ginevra de’ Benci的肖像時,他在她的頭後方放了一叢柏樹,仔細地描繪每一片葉子。許多畫家可能會想,這只是一個放在背景裡的襯托物,沒有人會仔細地看。
但是達文西不這樣想。他並未預期別人怎麼看待他的作品,再付出相等努力。他就像是麥可喬丹(Michael Jordan)一樣。不屈不撓。
不屈不撓能取得勝利,因為當不可見的細節聚合起來,就變為可見。當人們走過Ginevra de’ Benci的畫像時,他們的目光常常馬上就被吸引住,遠在他們看到標籤、注意到這是達文西的畫作之前。所有無法察覺的細節,結合起來會產生某種令人目眩神移的效果,就像是有上千個微小的聲音和諧地響起。
同樣地,偉大的軟體也需要對於美感的狂熱奉獻。如果仔細檢視優秀的軟體,你會發現一些沒人想瞭解的小地方也都如此美麗。說到程式碼,如果要我每天用寫程式同樣的標準過生活,那會讓我得靠吃藥過日子。如果看到縮排得亂七八糟的程式碼、或是使用很醜的變數名稱,都會讓我抓狂。
如果駭客只是負責導入,把規格轉換為程式碼,那麼他幹起活來就像是挖水溝的工人一樣,從這邊挖到那邊,僅此而已。但是如果駭客是創作者,他必需把靈感計算在內。就像是繪畫一樣,駭客的工作是循環的。有時你對於新專案感到興奮,想要一天工作十六個小時。有時候,你就是覺得了無生趣。
想要產生好的作品,你必需把這些循環計算在內,因為你的反應會影響到它們。當你在山上開手排車時,有時你必需踩離合器以避免熄火。退一步反而海闊天空。在畫家和駭客的工作裡,有些是非常有野心的,有些則僅是日常瑣事。保留一些簡單的工作,等你想要放慢腳步時再處理,會是不錯的辦法。
在駭客的工作裡,這部分是指程式臭蟲。我喜歡除錯:這是駭客工作跟一般人的想像相同的部分。你有一個非常古怪的問題,你必需解決它。你的程式應該要執行某件事,但是它卻做了另一件事。是哪裡出了錯呢?你知道自己最後一定會獲得勝利。這就像油漆牆壁一樣輕鬆。
繪畫的例子不只可以讓我們瞭解如何管理工作,還可以知道如何團隊工作。過去許多偉大的藝術作品,都是多人合力之作,不過博物館裡的名字可能只有一個。達文西曾經在維洛吉歐(Verrocchio)的工作室裡當學徒,《基督受洗》(Baptism of Christ)這幅畫裡的一個天使還是他畫的。這種作法是當時的慣例,而不是例外。米開蘭基羅在堅持獨立完成西斯汀禮拜堂(Sistine Chapel)的天花板畫像之前,曾經經過一番仔細的考慮。
就我所知,當多位畫家共同創作一幅畫時,他們絕對不會畫同一個地方。通常都是由大師畫主要的部分,助手處理其他地方與背景。但是你絕對不能畫到別人的範圍上。
我認為這也是協同軟體開發的正確模式。不要協同過頭。如果有一部份程式碼是由三或四個不同的人來撰寫,結果會導致沒有人真正瞭解它,最後會變成像是一間共用房間,變得無人理會、愈來愈糟。我認為,正確的協同工作,是把專案分為幾個不同的模組,每一個模組都有明確的擁有者,並且在彼此間建立細心設計的介面,最好是以程式語言的方式來銜接。
就像繪畫一樣,大部分軟體是為了人類觀眾而設計的。所以駭客就像畫家一樣,必需有同理心,才能創作偉大的作品。你必需從使用者的觀點來看事情。(下頁)當我還是小孩的時候,我常常被告知要從別人的角度來看事情。實際上,這代表我必需做某人想要做的事,而不是做我想做的事。這當然讓同理心有了不好的名聲,讓我不想保有同理心。
不過,我錯了。實際上,從別人的觀點看事情正是成功的秘訣。同理心不必然代表自我犧牲。這是完全不同的。瞭解某人對於事情的看法,並不代表依照他人的想法來行動;在某些狀況下,例如戰爭,你可能得做完全相反的事情。
我提供一個使用同理心的例子。在Viaweb時,如果我們無法決定該選擇的方案,最好的方法便是自問:競爭者最討厭哪項選擇?有時候競爭對手增加的功能基本上是無用的,但既然那是他們擁有而我們沒有的特色,便成為報導時可以大肆宣揚的重點。我們可以試著解釋該功能的無用,但是,如果我們直接導入該項功能將更有激怒競爭對手的功效;於是,當天下午,我們就把自己的版本弄出來了。
大部分的創作者都是為人類而作。想要吸引觀眾,你必需瞭解他們的需求。舉例來說,幾乎所有最偉大的繪畫作品,都是以人為主題,因為人們總是對人有興趣。
同理心,可能是優秀駭客跟偉大駭客之間最重要的區別。有些駭客很聰明,但是卻非常自我,沒有任何同理心。這種人非常不容易設計出偉大的軟體,因為他們無法從使用者的觀點來看事情。
想要瞭解人們是否具有同理心,可以觀察他們向一個沒有技術背景的人解釋技術問題時的情形。我們可能都認識一些在其他方面很聰明、在技術方面卻很笨拙的人。如果有人在晚宴上問駭客,程式語言是什麼,他們可能會回答說,「嗯……高階語言是用來給編譯器產生機器碼的前端輸入。」高階語言?編譯器?機器碼?一個不瞭解程式語言的傢伙,很明顯地也不會瞭解這些東西。
軟體所必需作的事情之一,是自我介紹。所以為了撰寫優秀的軟體,你必需瞭解使用者的理解有多麼地少。他們在沒有任何準備的情況下就來使用你的軟體,所以軟體最好能產生他們所預期的結果,因為他們不會去讀使用手冊。在這方面,我所見過的最好的系統,是一九八四年的麥金塔電腦(Macintosh)。它做到了軟體從未做到的事:它就是可以運作。
程式碼也是如此,應該要能夠自己解釋自己。如果我只能讓別人記得關於撰寫程式的一句話,那將會是:程式應該是為了讓人們閱讀而編寫,只是剛好能給機器執行而己。
你需要有同理心,不只是為了使用者,也是為了你的讀者;這是為你好,因為你也會是讀者之一。許多駭客寫了程式,結果六個月之後卻發現他自己忘了程式怎麼運作的。我認識一些人在發生這類事件後,發誓要戒用Perl。
在某些地方,有一種流行的看法指出缺乏同理心跟智力有關。但是我不認為這有任何關連。你不需要學習同理心,也可以在數學和自然科學方面表現傑出,這些領域裡的人也都很聰明,所以這兩種特質也許有某種關連。但是有許多笨蛋卻也同樣沒有同理心。
那麼,如果駭客的工作像繪畫與寫作一樣,不是很酷嗎?畢竟,你只有一個人生。你可能想要作一些偉大的事。
不幸的是,這問題很難回答。名聲總是需要很多時間才能實現,就像是遠方的星光一樣。畫家的聲望不錯,那是因為五百年前的人所創作的偉大作品。在當時,沒有人認為這些作品會有現在我們所想的那麼重要。1465年的人,很難想像現在人們之所以會認得烏賓諾公爵蒙泰費爾特羅(Montefeltro),只是因為他是法蘭西斯卡(Piero della Francesca)作品裡的一個鼻子長得很奇怪的人。
所以當我承認現在的駭客不像畫家那麼酷時,我們應該記得在繪畫的光榮時代裡,畫家也不像今日這樣風光。
我們可以有自信地認為,現在正是駭客的光榮時代。在大部分的領域裡,偉大的作品都是在早期完成的。1430年到1500年的繪畫作品,至今仍然無人可超越。莎士比亞(Shakespeare)出現時,專業戲劇院才剛開始。他把戲劇推展到極致,直到現在,每一個劇作家都必需生存在他的陰影下。杜勒(Albrecht Durer)的雕刻、珍奧斯汀(Jane Austen)的小說也有同樣的成就。
我們一再地看到同樣的模式。新媒介出現時,人們對其感到非常地興奮,在初期竭盡所能地探究其可能性。駭客的工作,現在也處在同樣的階段。
在達文西的時代,繪畫不像他後來所成就的那樣酷。駭客會有多酷,端賴於我們可以用這新媒介成就些什麼事。
熱門新聞
2024-11-22
2024-11-24
2024-11-25
2024-11-22
2024-11-24
2024-11-24