<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 2.黑客與畫家   讀完計算機系的研究生,我就去了藝術學校,學習繪畫。許多人很吃驚:一個喜歡計算機的人,居然還喜歡畫畫!他們似乎覺得,擺弄計算機和畫畫是兩件截然不同的事情——計算機是冰冷的、精確的、井然有序的,而畫畫是某種原始欲望熱烈狂放的表達方式。   這種看法是錯的。計算機和畫畫有許多共同之處。事實上,在我知道的所有行業中,黑客與畫家最相像。   黑客與畫家的共同之處,在于他們都是創作者。與作曲家、建筑師、作家一樣,黑客和畫家都是試圖創作出優秀的作品。他們本質上都不是在做研究,雖然在創作過程中,他們可能會發現一些新技術(那樣當然更好)。   我一直不喜歡“計算機科學”(computer science)這個詞。主要原因是根本不存在這種東西。計算機科學就像一個大雜燴,由于某些歷史意外,很多不相干的領域被強行拼裝在一起。這個學科的一端是純粹的數學家,他們自稱“計算機科學家”,只是為了得到國防部研究局(DARPA)的項目資助。中間部分是計算機博物學家,研究各種專門性的題目,比如網絡數據的路由算法。另一端則是黑客,只想寫出有趣的軟件,對于他們來說,計算機只是一種表達的媒介,就像建筑師手里的混凝土,或者畫家手里的顏料。所以,在“計算機科學”的名下,數學家、物理學家、建筑師都不得不待在同一個系里。   有時,黑客做的事情被稱為“軟件工程”(software engineering),但是這個詞也是誤導的。與其說優秀的軟件設計師是工程師,還不如說是建筑師^。建筑學和工程學之間的區別并不是很嚴格的,但就是存在區別。這表現在“做什么”和“怎么做”:建筑師決定做什么,工程師想出怎么做。 ^「在英語中,“建筑師”(architect)和“架構師”(architect)是同一個詞,所以這里用的是雙關語,意思是優秀程序員不僅負責建造,還負責架構。后一句中的“建筑學”(architecture)也是這種雙關用法,同時指“架構學”(architecture)。一譯者注」   當然,“做什么”和“怎么做”不應該分得太開。如果你決定做一件事,卻不知道怎么做,你就是在自找麻煩。但是,只是單純地決定如何實現某種規格,那肯定不是黑客。黑客的最髙境界是創造規格。雖然看起來,做到這一點的最好方法就是先做出一個樣品把規格實現了。   也許有一天,“計算機科學”分裂成幾個獨立的部分。這可能是一件好事,如果我本人的領域——黑客——能夠獨立出來,那就更好了。   把不同類型的工作捆綁在一起,可能是為了行政管理的方便,但是卻容易引起混淆。這是我不喜歡“計算機科學”這個詞的又一個原因。中間部分“計算機科學家”的工作,也許還可以被稱為計算機的實驗科學。但是,兩端的數學家和黑客,并不是在做計算機的科學研究。   數學家看來并不在乎自己搞的是計算機還是數學。他們很高興來到這個新地方,然后就開始埋頭證明新的定理,與數學系的數學家干的事情完全一樣。不一會兒,他們可能就忘了辦公樓外的牌子上寫的是“計算機科學系”。但是對于黑客,“計算機科學”這個標簽是一個麻煩。如果黑客的工作被稱為科學,這會讓他們感到自己應該做得像搞科學一樣。所以,大學和實驗室里的黑客,就不去做那些真正想做的事情(設計優美的軟件),而是覺得自己應該寫一些研究性的論文。   要是黑客寫論文,最好的情況下,寫出來的也只是一些補充性的描述,不會具有太大的實際價值。黑客先開發了一個很酷的軟件,然后就寫一篇論文,介紹這個軟件。論文變成了軟件成果的展示。這種結合是錯誤的,常常會產生問題。為了配合論文研究性的主題,你很容易就把工作重點從開發優美的軟件轉移為開發一些丑陋的東西。   優美的軟件并不總是論文的合適題材。首先,科學研究必須具有原創性。寫過博士論文的人都知道,確保自己正在開墾新領地的方法,就是去找那些沒有人要的土地。其次,科學研究必須是能夠產生大量成果的,而那些不成熟的、障礙重重的領域最容易寫出許多篇論文,因為你可以寫那些為了完成工作、你不得不克服的障礙。沒有什么比一個錯誤的前提更容易產生大量待解決的問題了。人工智能(AI)領域的大部分情況,都符合這條“如何憑空創造出問題”的規律。如果你假定,使用一系列的謂詞邏輯(predicate logic)表達式,再加上代表抽象概念的參數,就能表達人類的知識,那么,你就可以寫出許許多多的論文,解釋如何完成這項工作。這就像電視劇《我愛露西》(I Love Lucy)的男主角Ricky Ricardo的話:“露西,這下夠你好好解釋的了。”   創造優美事物的方式往往不是從頭做起,而是在現有成果的基礎上做一些小小的調整,或者將已有的觀點用比較新的方式組合起來。這種類型的工作很難用研究性的論文表達。   那么,為什么大學和實驗室還把論文數量作為考核黑客工作的指標呢?這種事情其實在日常生活中普遍存在,比如,我們使用簡單的標準化測試考核學生的“學術能力傾向”(scholastic aptitude),再比如,我們使用代碼的行數考核程序員的工作效率。這樣的考核容易實施,而容易實施的考核總是首先被采用。   黑客真正想做的是設計優美的軟件,考核這種工作是非常困難的。你本人需要有良好的設計感,才能去考核別人的設計是否良好。但是,你覺得你有“良好的設計感”,與你實際是否具有,不存在相關關系,甚至可能存在負相關。   唯一有效的外部考核就是時間。經過歲月的洗禮,優美的東西生存發展的機會更大,丑陋的東西往往會被淘汰。不幸的是,這種考核需要的時間可能比一個人的生命還要長。塞繆爾·約翰遜^說過,人們對一個作家的評價,需要100年才能達成一致^^。你必須先等他的那些有影響力的朋友都死了,然后再等他的追隨者都死了,才能對他有一個公正的評價。 ^「塞繆爾·約翰遜(Samuel Johnson,1709-1784),英國詞典學家,編撰了歷史上第一本廣泛使用、影響巨大的英文字典。——譯者注」 ^^「塞繆爾·約翰遜在他編輯的《莎士比亞戲劇集》的前言中寫道:“他(莎士比亞)的影響遠遠超過他的時代,時間就是對他文學成就的檢驗。不管他的作品從那時的暗語、風俗、政治局勢之中,得到過怎樣的優勢,這些優勢都已經消逝多年了。他在毎一幕戲劇中,通過模擬那時的生活所產生的每一個歡樂的主題或悲傷的動機,都已經趨于平淡,而不再是戲劇的亮點。貴族的寵愛和對手的競爭,都不再產生效果,朋友和敵人都走進了墳墓,他的作品再也不是支持一方、打擊另一方的輿論工具;它們既不能產生虛名,也不會帶來惡意的攻擊。人們閱讀這些作品,只有一個理由,那就是欣賞作品本身。因此,只有人們真正欣賞它們,才會發出贊美……”」   我想,名望有很大的隨機性,黑客對此只好聽天由命了。在這一點上,他們與其他創作者并無不同。事實上,相比而言,他們還是幸運的。暫時性的、一窩蜂式的時代風潮對畫家的影響要比對黑客的影響大得多。   人們無法考核你的工作,甚至誤解你的工作,都不是最糟的事。更大的危險是你自己也會誤解自己的工作。因為你總是從相關領域尋找新思想,如果你發現自己讀的是計算機科學系,很自然地,你就會以為“計算機科學”與其他“理論科學”并無不同,你的工作屬于“理論計算機科學”所涉及的那種理論的應用研究。讀研究生期間,我潛意識里一直有一種很不舒服的感覺,覺得自己應該多學一點理論,不應該期末考試結束還不到三個星期,就把所有東西忘得一干二凈,那樣真是不可饒恕。現在,我意識到自己錯了。黑客搞懂“計算理論”(theory of computation)的必要性,與畫家搞懂顏料化學成分的必要性差不多大。一般來說,在理論上,你需要知道如何計算“時間復雜度”和“空間復雜度”(time and space complexity);如果你要寫一個解析器,可能還需要知道狀態機(state machine)的概念;除此以外,并不需要知道特別多的理論。這些可比畫家必須記住的顏料成分少很多。   我發現,黑客新想法的最佳來源,并非那些名字里有“計算機”三個字的理論領域,而是來自于其他創作領域。與其到“計算理論”領域尋找創意,你還不如在繪畫中尋找創意。   舉例來說,我在大學受到的教育是,在上機編程之前,應該先在紙上把程序搞清楚。可我自己一直不是這樣編程的,我喜歡直接坐在計算機前編程,而不是在紙上編程。更糟的是,我不是耐心地一步步寫出整個程序,確保大體上是正確的,而是一股腦不管對錯,先把代碼堆上去,再慢慢修改。書上說,調試(debugging)是最后的步驟,用來糾正打字的錯誤和疏忽。可是我的工作方法看上去卻像編程就是在調試。   很長一段時間內我都為此事沮喪,就像小學里老師教我怎么拿鉛筆,我卻總是學不會的那種感覺。如果我那時看到其他創作領域,比如繪畫或者建筑,我就會想到,自己的方法其實有一個正式的名稱:打草稿。我現在認為,大學里教給我的編程方法都是錯的。你把整個程序想清楚的時間點,應該是在編寫代碼的同時,而不是在編寫代碼之前,這與作家、畫家和建筑師的做法完全一樣。   明白這一點對軟件設計有重大影響。它意味著,編程語言首要的特性應該是允許動態擴展(malleable)。編程語言是用來幫助思考程序的,而不是用來表達你已經想好的程序。它應該是一支鉛筆,而不是一支鋼筆。如果大家都像學校教的那樣編程,那么靜態類型(static typing)^是一個不錯的槪念。但是,我認識的黑客,沒有一個人喜歡用靜態類型語言編程。我們需要的是一種可以隨意涂抹、擦擦改改的語言,我們不想正襟危坐,把一個盛滿各種變量類型的茶杯,小心翼翼放在自己的膝蓋上,為了與一絲不茍的編譯器大嬸交談,努力地挑選詞語,確保變量類型匹配,好讓自己顯得禮貌又周到。 ^「靜態類型是某些計算機語言的一個特性,指編譯時對變量類型進行嚴格檢査,典型代表是C、C++和Java。在這一類語言中,聲明變量的時候,必須指定類型,而且以后不能再改變。這必然意味著,只有在你對整個程序流程和細節思考成熟以后,才能編寫代碼。與之對應的則是動態類型(dynamic typing)語言,變量包含的數據類型可以隨時改變。——譯者注」   創作者不同于科學家,明白這一點有很多好處。除了不用為靜態類型煩惱以外,還可以免去另一個折磨科學家的難題,那就是“對數學家的妒忌”。科學界的每一個人,暗地里都相信數學家比自己聰明。我覺得,數學家自己也相信這一點。最后的結果就是科學家往往會把自己的工作盡可能弄得看上去像數學。對于物理學這樣的領域,這可能不會有太大不良影響。但是,你越往自然科學的方向發展,它就越成為一個嚴重的問題。   一頁寫滿了數學公式的紙真是令人印象深刻啊。(小竅門:用希臘字母表示變量名會令人印象更深刻。)因此,你就受到巨大的誘惑,去解決那些能夠用數學公式處理的問題,而不是去解決真正重要的問題。   如果黑客認識到自己與其他創作者——比如作家和畫家——是一類人,這種誘惑對他就不起作用。作家和畫家沒有“對數學家的妒忌”,他們認為自己在從事與數學完全不相關的事情。我認為,黑客也是如此。   如果大學和實驗室不允許黑客做他們想做的事情,那么適合黑客的地方可能就是企業。不幸的是,大多數企業也不允許黑客做他們想做的事情。大學和實驗室強迫黑客成為科學家,企業強迫黑客成為工程師。   直到最近我才發現這一點。雅虎收購Viaweb^的時候,他們問我想做什么。我對商業活動從來都沒有太大興趣,就回答說我想繼續做黑客。等我來到雅虎以后,發現在他們看來,“黑客”的工作就是用軟件實現某個功能,而不是設計軟件。在那里,程序員被當作技工,職責就是將產品經理的“構想”(如果這個詞是這么用的話)翻譯成代碼。 ^「Viaweb是一個幫助用戶開設網上商店的互聯網應用程序,被認為是第一個互聯網應用程序,由作者和羅伯特·莫里斯在1995年創立。1998年,雅虎以4500萬美元購買了Viaweb,更名為Yahoo! Store。——譯者注」   這似乎是大公司的普遍情況。大公司這樣安排的原因是為了減少結果的標準差。因為實際上只有很少一部分黑客懂得如何正確設計軟件,公司的管理層很難正確識別到底應該把設計軟件的任務交給誰。所以,大部分公司不把設計軟件的職責交給一個優秀的黑客,而是交給一個委員會,黑客的作用僅僅是實現那個委員會的設計。   如果某一天你想要去賺大錢,那么記住上面這一點,因為這是創業公司能夠成功的原因之一。大公司為了避免設計上的災難,選擇了減少設計結果的標準差。但是當你排斥差異的時候,你不僅將失敗的可能性排除在外,也將獲得高利潤的可能性排除在外。這對大公司來說不是問題,因為生產特別優秀的產品不是它們的獲勝手段。大公司只要做到不太爛,就能贏。   所以,如果你的競爭優勢是在軟件設計方面,并且你的對手是一家大公司,它大到由一群產品經理來設計軟件,那么你的對手將永遠無法趕上你。不過說實話,這樣的機會不容易找到。你很難單單依靠軟件設計就與大公司展開競爭。這就好比你很難攻入城堡與對手面對面地徒手搏斗。比如,就算寫一個比微軟的Word更好的文字處理軟件不是難事,但是微軟公司有自己的城堡,它的操作系統是壟斷的,你根本無法對它構成威脅,它甚至都不會注意到你的存在。   真正競爭軟件設計的戰場是新興領域的市場,這里還沒有人建立過防御工事。只要你能做出大膽的設計,由一個人或一批人同時負責設計和實現產品,你就能在這里戰勝大公司。微軟公司自己一開始就是這樣走向成功的,蘋果公司和惠普公司也是如此。我覺得幾乎所有的創業公司都是這樣取得成功的。   所以,開發優秀軟件的方法之一就是自己創業。但是,這樣做會遇到兩個問題。一個是自己開公司的話,必須處理許許多多與開發軟件完全無關的事情。我創立Viaweb的時候,如果有四分之一時間可以用于開發,就感到很幸運了。我在其他四分之三時間所做的事情,從單調乏味到驚悚恐怖,無所不包。我來說一個比較,有一次董事會開到一半,我不得不離開去補牙。我記得坐在牙醫診所的椅子上,等著醫生開動牙鉆的那段時間,與剛才待在公司的時間相比,簡直感覺像是在度假一樣。   創業的另一個問題是賺錢的軟件往往不是好玩的軟件,兩者的重疊度不髙。設計編程語言是很好玩的事情,事實上,微軟的第一個產品就是一種編程語言^。但是,如今沒有人會出錢買編程語言。如果你想賺錢,你可能不得不去干那些很麻煩很討厭的事情,因為這些事情沒人愿意義務來干。 ^「1975年,MITS公司發布了Altair 8800型計算機,比爾·蓋茨意識到為它開發軟件是有利可圖的,他寫了一個BASIC語言解釋器,賣給了MITS。這就是微軟公司的第一個產品,當時比爾·蓋茨還是哈佛大學二年級在校生。——譯者注」   所有創作者都面臨這個問題。價格是由供給和需求共同決定的。好玩的軟件的需求量,比不上解決客戶麻煩問題的軟件的需求量。在小劇場里演出的酬勞,比不上穿著卡通大猩猩服裝、在展覽會上為廠商站臺的酬勞。寫小說的回報比不上寫廣告文案的回報。開發編程語言的收入,比不上把某些公司老掉牙的數據庫連上服務器的收入。   黑客如何才能做自己喜歡的事情?我認為這個問題的解決方法是一個幾乎所有創作者都知道的方法:找一份養家糊口的“白天工作”(day job)。這個詞是從音樂家身上來的,他們晚上表演音樂,所以白天可以找一份其他工作。更一般地說,“白天工作”的意思是,你有一份為了賺錢的工作,還有一份為了愛好的工作。   幾乎所有的創作者在職業生涯的早期都有一份“白天工作”。畫家和作家尤其顯著。如果幸運的話,你能找到一份與你的“真正工作”非常相關的“白天工作”。音樂家似乎常常是在唱片行工作。同樣地,鉆研某種編程語言或操作系統的黑客,很可能會得到一份使用這些工具的“白天工作”。^ ^「攝影技術對繪畫造成的最大傷害,也許就是消滅了畫家最好的“白天工作”。歷史上,大多數偉大畫家都靠畫肖像謀生。攝影術發明不久,畫肖像的工作機會就大大減少,從事攝影的黑客搶走了這些機會。(對于被畫的人來說,坐在鏡頭前也更輕松一些。)肖像畫家一這種要求高度技巧的工作——就這樣或多或少地消失了。畫家為了得到收入,就將肖像技巧用在為商業公司畫品牌商品的廣告圖片。(可是,這樣的工作也是極大地依賴于攝影術,或者更準確地說,極大地依賴于復制在書籍和雜志上的照片。)」   當我說,黑客解決生計問題的方法是找一份“白天工作”,然后在其余時間開發優美的軟件,我并沒有說這是一個新方法。開源軟件界的黑客早就這樣做了。我想說的其實是,幵源軟件的這種工作模式可能就是正確的模式,因為它已經被其他領域的創作者都驗證過了。   令我驚訝的是,雇主都很猶豫,不愿意手下的黑客為開源軟件項目工作。但是,在Viaweb,要是你不愿意這樣干,我們會很猶豫要不要雇用你。我們面試程序員的時候,主要關注的事情就是業余時間他們寫了什么軟件。因為如果你不愛一件事,你不可能把它做得真正優秀,要是你很熱愛編程,你就不可避免地會開發你自己的項目。^ ^「微軟不鼓勵雇員為開源項目做貢獻,甚至業余時間也不行。但是,如此之多的一流黑客都在從事開源項目,所以這個政策主要的效果,可能就是使得微軟公司很難雇到一流的程序員。」   因為黑客更像創作者,而不是科學家,所以要了解黑客,不應該在科學家身上尋找啟示,而是應該觀察其他類型的創作者。那么,從畫家身上,我們還能借鑒到什么對黑客的啟示呢?   有一件事情是可以借鑒的(至少可以確認),那就是應該如何學習編程。畫家學習繪畫的方法主要是動手去畫,黑客學習編程的方法也理應如此。大多數黑客不是通過大學課程學會編程的,他們從實踐中學習,13歲時就自己動手寫程序了。即使上了大學,黑客學習編程依然主要通過自己寫程序。^ ^「大學里學習編程,就像讀書和挑選衣服一樣,你會發現自己髙中時的品味是多么糟糕。」   畫家的作品都會保留下來,你觀察這些作品,就能看出他們是怎么一步步通過實踐學習繪畫的。如果你把一個畫家的作品按照時間順序排列,就會發現每幅畫所用的技巧,都是建立在上一幅作品學到的東西之上。某幅作品如果有特別出色之處,你往往能夠在更早的作品上發現一個小規模的初期版本。   我想大多數創作者都是這樣學習和工作的,作家和建筑師似乎都是如此。也許對于黑客來說,采取像畫家這樣的做法很有好處:應該定期地從頭開始,而不要長年累月地在一個項目上不斷工作,并且試圖把所有的最新想法都以修訂版的形式包括進去。   黑客通過實踐學習編程,這又是一個標志,說明黑客與科學家的區別有多大。科學家就不會通過干活來學習科學,而是通過做實驗和解題來學習。科學家研究的基礎都是現有的很完美的成果,在這個意義上,他們的第一步只是在復制別人已經做過的工作。最后,他們才會從某一個點開始,進行自己的原創性工作。但是,黑客就不一樣,從一幵始做的就是原創性工作,根本沒有他人完美的成果可以依靠。所以,黑客的出發點是原創,最終得到一個優美的結果;而科學家的出發點是別人優美的結果,最終得到原創性。   創作者另一個學習的途徑是通過范例。對畫家來說,博物館就是美術技巧的圖書館。幾百年來,臨蓽大師的作品一直是傳統美術教育的一部分,因為臨摹迫使你仔細觀察一幅畫是如何完成的。   作家也是這樣學習寫作的。富蘭克林(Benjamin Franklin)通過總結和模仿艾迪生和斯梯爾的文章^,學會了寫作。雷蒙·錢德勒(Raymond Chandler)^^也是如此學會了寫作偵探小說。 ^「此處的艾迪生指Joseph Addison(1672—1719),斯梯爾指Richard Steele(1672—1729),兩人都是18世紀初的英國作家,于1711年共同創辦了政論諷刺雜志《旁觀者》》(The Spectator),產生了巨大的影響。——譯者注」 ^^「雷蒙·錢德勒(1888—1959),美國推理小說作家,他的私人偵探菲力普·馬羅(Philip Marlowe)系列小說有很大的讀者群。——譯者注」   同樣地,黑客可以通過觀看優秀的程序學會編程,不是看它們的執行結果,而是看它們的源代碼。開源運動最鮮為人知的優點之一,就是使得學習編程變得更容易了。我學編程的時候,不得不主要依靠教材上的范例。那時可以搞到的源碼,主要來自于Unix,但是就連Unix也不是開源的。大部分閱讀Unix源碼的人都是通過約翰·萊昂斯^那本書的非法影印本。該書雖然是1977年寫的,但是在1996年之前都不被允許公開出版。 ^「John Lions(1937—1998),澳大利亞計算機科學家。1976~1977年為了授課需要,他寫了《UNIX第6版源碼注釋》(Lions' Commentary on UNIX 6th Edition, with Source Code)一書。很長一段時間中,該書是貝爾實驗室之外唯一的UNIX內核源碼文檔。由于UNIX第6版源碼只允許用于教學,所以該書直到1996年才公開出版,此前一直都是私下傳播。人們普遍相信它是計算機科學領域被復印次數最多的書。——譯者注」   還有一個可以借鑒繪畫的地方:一幅畫是逐步完成的。通常一開始是一張草圖,然后再逐步填入細節。但是,它又不單純是一個填入細節的過程。有時,原先的構想看來是錯的,你就必須動手修改。無數古代油畫放在X光下檢視,就能看出修改痕跡,四肢的位置被移動過,或者臉部的表情經過了調整。   繪畫的這個創作過程就值得學習。我認為黑客也應該這樣工作。你不能盼望先有一個完美的規格設計,然后再動手編程,這樣想是不現實的。如果你預先承認規格設計是不完美的,在編程的時候,就可以根據需要當場修改規格,最終會有一個更好的結果。   (大公司的內部結構,使得它們很難這樣做。這是又一個創業公司占優之處。)   眼下想必每個人都知道,過早優化(premature optimization)是一件危險的事情。我認為,我們應該對“過早設計”(premature design)也抱有同樣的擔憂,不要太早決定一個程序應該怎么做。   合適的工具能夠幫助我們避免這種危險。一種好的編程語言,應該像油畫顏料一樣,能夠使得我們很從容地改變想法。動態類型語言在這一點上就是蠃家,因為你不必提前就設置好各種變量的數據類型。不過我認為,編程語言靈活性的關鍵還不在這里,而在于這種語言應該非常抽象。最容易修改的語言就是簡短的語言。   我接下來要說的是,一幅優秀的繪畫作品必須比它應該有的樣子更好,這可能聽起來有點矛盾。舉例來說,圖2-1所示達·芬奇的作品《女性肖像》(Ginevra de' Benci)現在保存在美國國家美術館。你可以看到,達·芬奇在少女的頭后面擺了一片樹枝。他很仔細地畫出了樹枝上的每一片葉子。許多畫家也許會覺得,那不過是放在背景里的襯托物,沒有人會仔細看的,不妨簡單處理一下就可以了。 ![](https://box.kancloud.cn/2016-01-12_5694ae08e24df.jpg) 圖2-1 達·芬奇的《女性肖像》(Ginevra de' Benci),1474年   但是達·芬奇不這樣想。他對作品每一部分的認真程度完全不取決于預料中會不會有人仔細看這個部分。他就像籃球巨星邁克爾·喬丹(Michael Jordan),每一球都一絲不茍,絕不降低對自己的要求。   堅持一絲不茍,就能取得優秀的成果。因為那些看不見的細節累加起來,就變得可見了。當人們從達·芬奇的《女性肖像》前面走過的時候,他們的注意力往往立刻就被它吸引住了,那時他們甚至還沒有看到說明的標簽牌,沒有意識到這是達·芬奇的作品。所有那些看不見的細節合并在一起,就使得這樣東西產生了驚人的效果,仿佛上千個細微的聲音都以同一個音調在歌唱。   同樣地,優秀的軟件也要求對美的狂熱追求。如果你查看優秀軟件的內部,就會發現那些預料中沒有人會看見的部分也是優美的。我對待代碼的認真程度遠遠超過我對待其他事情,如果我以這種態度對待日常生活的每件事,那么我就夠資格找心理醫生開處方藥了。看到代碼前面的縮進亂七八糟,或者看到丑陋的變量名,都會把我逼瘋的。   如果黑客只是一個負責實現領導意志的技術工人,職責就是根據規格說明書寫出代碼,那么他其實與一個挖水溝的工人是一樣的,從這頭挖到那頭,僅此而已。但是,如果黑客是一個創作者,他從事的就不是機械性的工作,他必須具備靈感。   黑客就像畫家,工作起來是有心理周期的。有時候,你有了一個令人興奮的新項目,你會愿意為它一天工作16個小時。等過了這一陣,你又會覺得百無聊賴,對所有事情都提不起興趣。   為了做出優秀的工作,你必須把這種心理周期考慮在內。只有這樣,你才能根據不同的事情找出不同的應對方法。你有一輛手動變速的汽車,你把它開上山,有時不得不松開離合器,防止汽車熄火。同樣,暫時放手有時也能防止熱情熄火。對于畫家和黑客這樣的創作者,有些工作需要投入巨大的熱情,另一些工作則是不需要很操心的日常瑣事。在你厭倦的時候再去做那些比較容易的工作,這是個不錯的主意。   對于編程,這實際上意味著你可以把bug留到以后解決。消滅bug對我來說屬于輕松的工作,只有在這個時候,編程才變得直接和機械,接近社會大眾想象中的編程的樣子。消滅bug的過程就像解一道數學題,已知許許多多的約束條件,你只要根據條件對方程求解就可以了。你的程序應該能產生x結果,但是卻產生了y結果。哪里出錯了?你知道自己最后肯定能解決這個問題,所以做起來就很輕松,就好像刷墻一樣,接近于休閑了。   用繪畫的例子作為參考,不僅能教會我們如何管理自己的工作,還能教會我們如何與他人一起工作。歷史上許多偉大的藝術品都是多人一起合作的結果,盡管最后在博物館展出的時候,墻上可能只會寫出一個人的名字。達·芬奇曾經在韋羅基奧(Verrocchio)的畫室當學徒,后者當時正在畫《基督的洗禮》(Baptism of Christ),達·芬奇的工作是完成整幅畫之中的一個天使。多人一起完成一幅作品是當時的普遍做法,并不罕見。后來,米開朗基羅堅持要一個人畫完羅馬的西斯廷大教堂(Sistine Chapel)天頂壁畫中的所有人物,他還因此被認為特別死心眼。   就我所知,當多個畫家共同創作一幅作品時,每個人畫的部分都是不一樣的。通常來說,大師負責畫主要人物,助手們負責畫次要人物和背景。但是,你肯定找不到某個部分是兩個人一起畫的。   我認為,這也是多人共同開發一個軟件的正確模式。需要合作,但是不要“合”得過頭。如果一個代碼塊由三四個人共同開發,就沒有人真正“擁有”這塊代碼。最終,它就會變得像一個公用雜物間,沒人管理,又臟又亂,到處堆滿了冗余代碼。正確的合作方法是將項目分割成嚴格定義的模塊,每一個模塊由一個人明確負責。模塊與模塊之間的接口經過精心設計,如果可能的話,最好把文檔說明寫得像編程語言規范那樣清晰。   就像繪畫作品一樣,大多數軟件是為人類用戶準備的。所以,黑客必須像畫家一樣,時刻考慮到用戶的人性需要,這樣才能做出偉大的產品。你必須能夠站在用戶的角度思考問題,也就是說你必須學會“換位思考”。   很小的時候,我就被不斷告知,要設身處地為他人著想。現實中,這必然意味著你要做其他人需要的事情,而不是你自己想做的事情。這樣看上去好像對我很不利,所以我暗下決心不讓自己變成這樣的人。   但是,我完全錯了。事實表明,從他人的角度思考問題正是成功的奧秘所在。“換位思考”并不就意味著你要做自我犧牲。實際上,這是完全不同的兩回事。了解別人對于事情的看法,并不代表你為他的利益服務。某些情況下,比如打仗的時候,了解對手正是為了打擊對手。^ ^「下面我舉一個站在用戶角度考慮問題的實例。在Viaweb,每當遇到兩個選項無法決策時,我們就會問自己,我們的競爭對手最恨哪一個選項?有時,對手新開發了一個基本無用的功能,但是因為他們有這個功能,而我們沒有,所以他們就會在業內媒體上大肆宣傳。我們當然可以解釋,告訴大家這個功能是沒用的,但是要是我們也開發了這個功能,就會讓對手感到很惱火,所以當天下午我們就一鼓作氣把自己的版本弄出來了。」   大多數創作者都是為人類用戶而創作。為了吸引用戶,你必須理解用戶需要什么。舉例來說,幾乎所有最偉大的繪畫作品都是畫人的,因為人類總是對自身感興趣的。   普通黑客與優秀黑客的所有區別之中,會不會“換位思考”可能是最重要的單個因素。有些黑客很聰明,但是完全以自我為中心,根本不會設身處地為用戶考慮。這樣的人很難設計出優秀軟件,因為他們不從用戶的角度看待問題。^ ^「文本編輯器和編譯器不在此列。黑客開發這些軟件時,不需要站在別人的立場上考慮問題,因為他自己就是典型用戶。」   判斷一個人是否具備“換位思考”的能力有一個好方法,那就是看他怎樣向沒有技術背景的人解釋技術問題。我們大概都認識這樣一些人,他們在其他方面非常聰明,但是把問題解釋清楚的能力卻驚人低下。如果聚會上,外行人問他們“什么是編程語言”,他們會這樣回答:“哦,高級語言就是編譯器的輸入代碼,用來產生目標碼。”高級語言?編譯器?目標碼?……如果對方不知道什么是編程語言,那么他顯然也不會知道這些概念。   軟件的部分功能就是解釋自身。為了寫出優秀軟件,你必須假定用戶對你的軟件基本上一無所知。你要明白,用戶第一次使用你的軟件的時候,不會預先做好功課,他們沒有任何準備就開始用了,所以軟件的使用方式最好能符合用戶的直覺,別指望用戶去讀使用手冊。在這方面,我見過的最佳系統是1984年原始的Macintosh電腦。它做到了那時別的軟件都做不到的事情:它真的能用。^ ^「好吧,是幾乎真的能用。Macintosh電腦有時會過量使用內存,導致大量對磁盤交換空間的讀寫(disk swapping),但是再買一個磁盤驅動器就能解決交換空間不足的問題。」   源代碼也應該可以自己解釋自己。如果我只能讓別人記住一句關于編程的名言,那么這句名言就是《計算機程序的結構與解釋》^一書的卷首語: > 程序寫出來是給人看的,附帶能在機器上運行。 ^「Harold Abelson與Sussman Gerald合著的Structure and Interpretation of Computer Programs,麻省理工學院出版社1985年出版。」   “換位思考”不僅是為了你的用戶,也是為了你的讀者。這對你是有利的,因為你也會讀自己寫的東西。許多黑客六個月后再讀自己的程序,卻發現根本看不懂它是怎么運行的。我認識好幾個人,因為這種經歷而發誓不再使用Perl語言。^ ^「把代碼寫得便于閱讀,并不是讓你塞進去很多注釋。我想引申一下Abelson和Sussman的那句話:“程序寫出來是為了讓人看懂它的算法,附帶告訴計算機如何執行。”一種好的編程語言應該比英語更容易解釋軟件。只有在那些不太成熟、容易出現問題的地方,你才應該加上注釋,提醒讀者注意那里,就好像公路上只有在急轉彎處才會出現警示標志一樣。」   在某些地方,自行其道、完全不替讀者著想,被看成是高水平、高智商的表現,甚至都發展成了一種風尚。但是,我不覺得“換位思考”與智商之間存在任何聯系。在數學和自然科學領域,你不用學習怎么向別人表達自己,也能取得很好的成就。而那些領域的人普遍很聰明,所以人們很自然地就把“聰明”與“不懂得換位思考”聯系了起來。但是,世界上還有許許多多很笨的人,也同樣不懂得“換位思考”。   最后,如果編程是與繪畫和寫作同一類的工作,黑客是否有機會像偉大藝術家一樣備受推崇、流芳后世呢?畢竟生命只有一次,你可能想用它來做一些偉大的事情。   很遺憾,這個問題很難回答。聲望這個東西,總是經過漫長的時滯以后才會確立,它就像遙遠星系發出的光,經過了許多光年才能被我們看到。那些如今聲名顯赫的繪畫作品,來自于五百年前的畫家的卓越工作。在那些畫家生前,沒人像我們今天那樣看重這些作品。1465年的人們也許會感到非常奇怪,后世的人們提起烏爾比諾城(Urbino)不可一世的費德里科公爵,最主要的原因居然是弗朗切斯卡把他的鼻子畫得非常獨特(見圖2-2)。 ![](https://box.kancloud.cn/2016-01-12_5694ae091ad24.jpg) 圖2-2 皮埃羅·德拉·弗朗切斯卡(Piero della Francesca)的作品《蒙特費特羅家族的費德里科》(Federico da Montefeltro),1465~1466年(局部)   所以,雖然我必須承認,眼下看來藝術家比黑客更酷,但是我們不應忘記,古時候繪畫蓬勃發展的那些黃金年代,畫家也不是像今天這樣酷的。   我們能夠有把握說的就是,現在正是編程的黃金年代。大多數領域的偉大作品都誕生于很早以前。1430年到1500年之間的繪畫杰作,至今仍然是不可超越的。莎士比亞出現的時候,戲劇這種文藝體裁才剛發展起來,專門表演戲劇的場所“戲院”才剛剛誕生。他把戲劇這種藝術形式提升到一個難以觸及的高度,讓后世的每一個劇作家都不得不生活在他的陰影之中。德國雕塑大師丟勒(Albrecht Dürer)、英國小說家簡·奧斯丁(Jane Austen)都是這樣的大師。   我們看到這種模式一再反復出現。一種新的媒介剛剛誕生的時候,人們熱情髙漲、興奮不已,短短幾代人就探索清楚了這種媒介的大部分可能性,把它的能量發揮到極致。編程目前好像就處在這個階段。   在達·芬奇的年代,繪畫并不是一件很酷的事情,達·芬奇用自己的工作推動繪畫成為一種偉大的表達方式。同樣,編程到底能夠有多酷,取決于我們能夠用這種新媒介做出怎樣的工作。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看