駭客與畫家

節錄自

駭客(Hacker)良好的壞習慣

對大眾媒體來說,「駭客」指的是某個入侵電腦的傢伙。在程式設計師心中,它卻代表著優秀的程式設計師。但是這兩種意義具有連結。對程式設計師來說,「**駭客」最主要的字面意義就是支配:一個隨心所欲操控電腦的人 **– 不論電腦想不想。

還可以更混亂一點。「駭」這個名詞也有兩種意義。它可以是讚美,也能是羞辱。當你用某種難看的方法來做事時,叫做駭。當你用很聰明的方法、顛覆原有系統時,也叫做駭。這個字通常是以前者的意思出現,而非後者,可能是因為難看的作法總比高明的作法還常見。

不論你相不相信,這兩種概念也一樣相互連結。難看和創意的確有共同點:打破規則。這兩種打破規則的作法之間,具有連續性的漸進過程,從一般的難看(改裝腳踏車)進步到非常有創造力(推翻歐幾里德幾何學)。

所謂的Computer Science

電腦科學,是一個許多不太相關的領域混雜在一起的歷史意外,就像南斯拉夫。

一個極端是真正的數學家,他們必需把工作稱作電腦科學,才能取得DARPA的補助。

中間是鑽研電腦博物學的學者,例如研究某種演算法是如何規畫資料在網路間傳遞的。

在另一個極端則有駭客,想要寫些有趣的軟體,對他們來說電腦只是一種表達的媒介,就像混凝土之於建築師、顏料之於畫家。

駭客是畫家,不是科學家

駭客撰寫很酷的軟體,然後再寫相關的論文,論文成為軟體成果的展示。但是這樣的錯誤結合,常常會產生問題。為了配合比較合適的論文主題,很容易從設計美好的事物轉移到醜陋的事物。不幸的是,美麗的事物不一定是最好的論文的主題。

第一,研究必需是原創的-只要寫過博士論文就知道,確定自己正在研究新領域的唯一方法,就是找出沒人要寫的那一塊。

第二,研究必需豐富-不成熟的系統就等於大量論文內容,因為你可以寫下達到目標前所克服的重重阻礙。錯誤的假設就是產生大量問題的最佳方式。人工智慧就是這規則的好例子;如果你認為知識可以用一連串代表抽象概念的邏輯來表示,光是清楚地表達其運作方式就可以寫出許多論文。

衡量駭客真正想做的事情(設計完美的軟體),會困難得多。你需要有很好的設計感,才能判斷好的設計。

寫程式 = 作畫,程式語言是駭客的畫筆

駭客理解電腦運算理論的必要性,就跟畫家理解顏料化學成分的必要性類似。如果想要撰寫一個解析器,你需要知道如何計算時間與空間的複雜度,或許也要理解狀態機(State Machine)的概念。畫家也必需記得如何調和顏料,而非顏料的化學成分。

不是耐心地寫出完整的程式且確認其正確無誤,反而比較喜歡丟出亂七八糟的程式碼,然後再一步步地進行調整。大學時期教導的程式設計是完全錯誤的。應該在寫程式的同時搞懂自己寫的程式,就像畫家和建築師一樣。 瞭解這些對於軟體設計有很大的影響。首先,這代表程式語言應該具有延展性。程式語言是用來思考程式,而不是用來展現你已經想出來的程式。它應該像是一支鉛筆,而不是一支鋼筆。

還有一個可以借喻自繪畫的例子:繪畫創作是由逐步改進而產生。繪畫通常是由素描開始,然後填入細節。但是它不只是一個填入的過程。有時原始的計畫是一場錯誤。有無數的畫作以X光檢視時,會發現人物的四肢被移動過、臉部特徵也可能被調整過。預期程式規格的完美叫做不切實際。如果承認這種狀況,並且以允許直接改變規格的方式來撰寫程式,會比較好。現在大概每個人都知道過早最佳化(Premature Optimization)的危險。我認為應該也要擔心過早設計(Premature Design)──太早決定程式應該做的事。

Learning by Doing

駭客邊作邊學的方式,也是駭客與科學大不相同的另一個記號。

科學家並不能從實作中學到什麼東西,而是從實驗室與問題集裡學習。科學家進行完美的工作,但其實他們只是試著重製某人已經幫他們做好的作品。最後,他們才會回到可以進行原創工作的地方。

而駭客從一開始就是在進行原創工作;是非常粗劣的。駭客從原創開始,做到完美,而科學家從完美開始,回到原創。

創作者的另一種學習方式,是依據範例。對於畫家來說,博物館是技術的圖書館。數百年來,畫家傳統教育的一部份,就是模仿大師們的作品,因為**模仿能強迫你仔細檢視一幅畫作的產生方式。 **同樣地,駭客可以藉由研究好程式來學習-不只知道程式的執行結果,而是研究原始碼。使程式學習更為容易,是開源碼運動的另一個較不為人知的優點。

所以駭客適合怎麼樣的工作?

如果駭客與其他創作者一樣,例如作家和畫家,他們就不會想要這麼做。**作家和畫家不會妒羨數學家。他們認為自己在從事完全不相干的事情。**我認為,駭客也是如此。 如果大學和實驗室不讓駭客做他們想要做的事,也許企業會是適合他們的地方。不幸的是,大部分的企業也不讓駭客做他們想做的事。**大學和研究室強迫駭客成為科學家,企業則是強迫駭客變成工程師。駭客對於他們來說,只是導入軟體,而不是設計軟體。**程式設計師被視為技工,負責把產品經理的願景(如果是這樣說的話)轉成程式碼。他們之所以這麼做,是因為可以降低成果的標準差。只有一小部分的駭客可以實際設計軟體,但管理公司的人很難挑選出這些人。因此與其將軟體的未來寄託於一個優秀的駭客,大部分的企業選擇由委員會來負責設計軟體,駭客只是負責導入設計。

如果你想要賺大錢,請記得這點,因為這是新創企業得以勝出的原因之一。大公司想要降低設計成果的標準差,因為他們想要避免災難;但同時也降低了可能一鳴衝天(或一敗塗地)的機會值。這對於大公司來說不是問題,因為他們不是靠生產偉大的產品而成功。大公司是靠著較少的失敗,來勝過其他大公司。

軟體設計的戰場在新興市場,還沒有人在這裡建立防禦工事。如果你在這裡採取大膽的設計策略,並讓同樣的一批人負責設計與導入產品,你可以大賺一票。微軟最初就是這樣。蘋果電腦也是。惠普也是。我觀察到幾乎所有成功的新興公司都是如此。 另一個開發偉大軟體的方法,就是自己開一家新公司。然而,有兩個問題:

一、在新公司裡,除了撰寫軟體之外,你必需處理許多其他事情。在Viaweb,如果有四分之一的時間能拿來寫程式,我就會覺得很幸運了。其他四分之三的時間所做的事,從冗長乏味到可怕嚇人都有。讓我提供一個比較基準:有一次,我必需離開董事會議去補蛀牙,我記得當時坐在牙醫診所的椅子上,等待牙醫鑽磨我的牙齒時,那感覺好像在度假一樣。

二、賺錢的軟體和為了興趣而開發的軟體之間,沒有太多的重疊。設計程式語言就很有趣,事實上微軟的第一個產品正是如此,但是現在已經沒有人會為了程式語言付錢。如果你想要賺錢,你必需強迫自己去處理那些沒有人想要免費解決的討厭問題。

所有創作者都面對同樣的難題。價格是由供給和需求來決定的,有趣工作的需求量,總是比不上解決個別客戶的世俗問題。在實驗劇場裡演戲,總是比不上在展覽攤位上披著猩猩裝來得有賺頭。寫小說所賺的錢,還比不上垃圾處理器的廣告文案。對程式語言動手動腳的工錢,也比不上協助某公司把老舊資料庫與網站伺服器連結。 我認為這個問題的答案,以軟體來說,是一個幾乎所有創作者都通曉的概念:正職工作(Day Job)。這個名詞是由在晚間表演的音樂家所提出的,大致來講,創作者有一份只是為了賺錢而做的工作,以及另一份為了興趣而做的工作。這也就是為什麼駭客通常會參與開放原始碼的專案。

對於美感的狂熱奉獻

當達文西(Leonardo Da Vince)在國家藝廊畫Ginevra de’ Benci的肖像時,他在她的頭後方放了一叢柏樹,仔細地描繪每一片葉子。許多畫家可能會想,這只是一個放在背景裡的襯托物,沒有人會仔細地看。但是達文西不這樣想。他並未預期別人怎麼看待他的作品,再付出相等努力。不屈不撓能取得勝利,因為當不可見的細節聚合起來,就變為可見。當人們走過Ginevra de’ Benci的畫像時,他們的目光常常馬上就被吸引住,遠在他們看到標籤、注意到這是達文西的畫作之前。所有無法察覺的細節,結合起來會產生某種令人目眩神移的效果,就像是有上千個微小的聲音和諧地響起。同樣地,偉大的軟體也需要對於美感的狂熱奉獻。如果仔細檢視優秀的軟體,你會發現一些沒人想瞭解的小地方也都如此美麗。

創作者的工作循環

如果駭客只是負責導入,把規格轉換為程式碼,那麼他幹起活來就像是挖水溝的工人一樣,從這邊挖到那邊,僅此而已。但是如果駭客是創作者,他必需把靈感計算在內。就像是繪畫一樣,駭客的工作是循環的。有時你對於新專案感到興奮,想要一天工作十六個小時。有時候,你就是覺得了無生趣。 想要產生好的作品,你必需把這些循環計算在內,因為你的反應會影響到它們。當你在山上開手排車時,有時你必需踩離合器以避免熄火。退一步反而海闊天空。在畫家和駭客的工作裡,有些是非常有野心的,有些則僅是日常瑣事。保留一些簡單的工作,等你想要放慢腳步時再處理,會是不錯的辦法

軟體的協同工作

繪畫的例子不只可以讓我們瞭解如何管理工作,還可以知道如何團隊工作。過去許多偉大的藝術作品,都是多人合力之作,不過博物館裡的名字可能只有一個。

達文西曾經在維洛吉歐(Verrocchio)的工作室裡當學徒,《基督受洗》(Baptism of Christ)這幅畫裡的一個天使還是他畫的。這種作法是當時的慣例,而不是例外。米開蘭基羅在堅持獨立完成西斯汀禮拜堂(Sistine Chapel)的天花板畫像之前,曾經經過一番仔細的考慮。就我所知,當多位畫家共同創作一幅畫時,他們絕對不會畫同一個地方。通常都是由大師畫主要的部分,助手處理其他地方與背景。但是你絕對不能畫到別人的範圍上。

我認為這也是協同軟體開發的正確模式。不要協同過頭。**如果有一部份程式碼是由三或四個不同的人來撰寫,結果會導致沒有人真正瞭解它,最後會變成像是一間共用房間,變得無人理會、愈來愈糟。**我認為,正確的協同工作,是把專案分為幾個不同的模組,每一個模組都有明確的擁有者,並且在彼此間建立細心設計的介面,最好是以程式語言的方式來銜接。

以人為本

就像繪畫一樣,大部分軟體是為了人類觀眾而設計的。所以駭客就像畫家一樣,必需有同理心,才能創作偉大的作品。你必需從使用者的觀點來看事情。大部分的創作者都是為人類而作。想要吸引觀眾,你必需瞭解他們的需求。舉例來說,幾乎所有最偉大的繪畫作品,都是以人為主題,因為人們總是對人有興趣。

同理心,可能是優秀駭客跟偉大駭客之間最重要的區別。有些駭客很聰明,但是卻非常自我,沒有任何同理心。這種人非常不容易設計出偉大的軟體,因為他們無法從使用者的觀點來看事情。

程式碼也是如此,應該要能夠自己解釋自己。如果我只能讓別人記得關於撰寫程式的一句話,那將會是:**程式應該是為了讓人們閱讀而編寫,只是剛好能給機器執行而己。 **

在達文西的時代,繪畫不像他後來所成就的那樣酷。駭客會有多酷,端賴於我們可以用這新媒介成就些什麼事。