20180106
author: Paul Graham
翻譯:阮一峰(lisp,田春校譯)
《黑客與畫家》這本書名聲在外,且不說作者的聲望,就連譯者的博客,也經常是我攫取知識的寶貴渠道,了解世界的瞭望窗口。而如果能夠早五年遇到這本書的話,也許我真的會被作者洗腦,放下書本就去學Lisp了。
Lisp語言不太了解,只是知道它和傳統的c語言有兩個完全不同的發展方向。有一次聽少華說Lisp中對宏的運用,能夠讓編程更加得心應手。而我所學的java當中并沒有關于宏的知識,所以就將c中對宏的運用代入了解,但是明顯感覺c中的宏和Lisp中的是兩種完全不同的概念。
書中不僅介紹了一些技術方面的知識,也介紹了一些生活中的所思所感。有對書呆子在成長中的困惑來討論社會教育問題的,也有以過來人的身份對創業者提出了若干建議,比如一個創業項目的成敗與否關鍵在于最開始的那五個人,以及在面臨創業用到的技術選擇時,一定要選擇難的技術,這樣才能設置進入壁壘等。當然里面對于創造財富的總結,以及對貧富差距的認識,也刷新了我的一些陳舊觀念。更重要的是讓我明白了“黑客與畫家”其實是一種人,他們都是創作者,精益求精,一絲不茍。
總的來說,收獲不少。
0:前言
創業唯一的門檻就是勇氣。
程序猿的審美決定了你看到的軟件界面。程序猿的愛好決定了你有什么軟件可以使用。
黑客:好玩,高智商,探索精神。
計算機程序只是文本而已。你選擇了什么語言,決定了你能說什么話。編程語言就是程序猿的思維方式。
1:為什么書呆子不受歡迎
阿爾伯蒂:任何一種藝術,不管是否重要,如果你想要在該領域出類拔萃,就必須全身心投入。
書呆子不受歡迎因為他們腦子里想的是別的事情。
11歲之前,孩子的生活由家長主導,其他孩子對他造成的影響有限。11歲之后,會在同伴中開辟一個新世界,并認為那個世界才是重要的。
《蠅王》中描述一群孩子在荒島為了生存,分成兩派,相互殘殺的故事。
在一個人產生良知之前,折磨就是一種娛樂。比如扯掉一條蜘蛛腿。青少年在很大程度上,還沒有擺脫兒童狀態,所以很多人都會殘酷對待他人。
一群孩子成群結伴欺負你,不是因為你做錯了什么,而是這一伙人需要找一件事情做。而這群人往往是中間的焦慮層。
成人世界之所以不欺負書呆子,是因為書呆子在這里產生了足夠的意義。而在學校,所做所想皆無意義,一切問題都來自于在學校的空虛。過去的社會中,青少年扮演找學徒,助手,是一種積極的角色,或者是成人社會的低級成員,人們通過傳遞知識帶來榮譽。如今的社會根本不接受青少年,青少年進入社會,只會給父母造成困擾,影響工作效率,因此關在學校是個不錯的選擇。
對于一段美好時光的逝去。我錯過的絕不僅僅只是幾本書而已。
2:黑客與畫家
程序猿在大公司是技工,職責就是將產品經理的構想翻譯成代碼。
黑客的出發點是原創,最終得到一個優美的結果。科學家的出發點是別人優美的結果,最終得到原創性。
開源運動讓編程更容易。
黑客和畫家這樣的創作者,有些工作需要投入巨大的熱情,另一些工作則是不需要很操心的日常瑣事。在你厭倦的時候再去做哪些比較容易的工作。
換位思考,現實中意味著你要做其他人需要的事情,而不是自己想做的事情。實際上,這并不意味著你要做自我犧牲。比如了解對手正是為了打敗他。
《計算機程序的結構與解釋》:程序寫出來是給人看的,附帶能在機器上運行。
3:不能說的話
流行一時的不僅有衣服,還有道德觀念。任何一個年代的人們,都會對一些荒誕的東西深信不疑。那么如何判斷哪些話是不能說的呢?
- 大庭廣眾之下,有沒有什么觀點不愿意說出口?在思想的過程中,是否會添加上社會需要的因素?
- 對一些存疑的言論,多想一下有沒有可能是真的?
- 貼上時代標簽(性別歧視,制造分裂等),在人們還沒有來得及思考之前,就被抹殺掉的言論。
- 對比古今中外觀念的差異。
- 觀察衛道者到底在捍衛什么。
我們向孩子灌輸圣誕老人的神話,到底是為了孩子,還是為了自己?
流行思想觀念第一批接受者總是帶有很強的抱負心,自覺的精英意識,有意將自己與普通人區分開來。當流行趨勢確定之后,第二批接受者將會更加龐大,而他們是受到恐懼心的驅使來接受流行思想,不是因為想要與眾不同,而是因為他們害怕與眾不同。
不受傳統觀念束縛的人,往往也不會穿流行的衣服。
與笨蛋辯論,也會讓你變成笨蛋。為了能夠讓你可以自由思考下去,最好的方式,是守口如瓶,笑臉相迎。在心里無所不想,但是不一定要說出來。格斗俱樂部的第一條規則,就是不要談論格斗俱樂部。除非和自己真正的好友。當狂熱分子引誘你不得不表態的時候,可以說,既不贊成,也不反對。最好是說我還沒有想好。笑臉相迎的方式有攻擊元標簽,隱喻,和幽默。狂熱分子最缺乏幽默感。
流行(包括一些傳統),本質上就是自己看不見自己的樣子。讓要想看清楚自己的樣子,就要遠離人群。時間就是一種簡單產生距離的方法。新的流行就會讓舊的流行更容易被察覺。
4:良好的壞習慣
不服管教
5:另一條路
部分軟件從桌面消失是不可避免的,它們將會被轉移到服務器上,而電腦上的軟件,一個瀏覽器就足夠了。
你的電腦這個概念正慢慢成為過去,取而代之的是你的數據。終端設備不應該存儲數據,它們應該像電話那樣。
設計一個桌面軟件就像設計一棟大樓,而設計互聯網軟件就像設計一座城市。
閱讀互聯網軟件代碼,非常流暢自如,不會像偵探破案那樣冥思苦想,而是像飛行員那樣,瞄一眼儀表板,就對飛行狀況胸有成竹。
將一個構思束之高閣,不僅意味著延遲它的實現,還意味著延遲所有在實現過程中激發的構思。計劃只是將構思束之高閣的另一種表達方式。只要想到好的構思,我們就立刻著手實現。所以,我們沒有任何計劃。
如果你想把錢藏在安全的地方,是藏在家中床墊下面,還是放在銀行?
銷售員必須面對消費者,程序猿必須面對競爭對手的軟件,但是內部系統管理員就像老年單身漢,能夠激勵他的外部壓力幾乎沒有。
互聯網軟件創業公司相對大公司來說,更具有人員優勢,這一點體現在大公司可以雇傭到平庸的人做艱苦的事,也可以雇傭到能干的人做輕松的事,但是無法雇用非常能干的人做非常艱苦的事情,因為這樣的人只會為自己的公司工作。
關于創業,管理和競爭都是沒有通電的籬笆。
如果你不打算自己動手設計和開發,那就不要創業。
比爾蓋茨害怕你,因為1975年,上一次發布軟件的新方式出現時(個人pc出現,之前是大型機),他也曾跟你一樣白手起家。
6:如何創造財富
創業公司startup這個詞誕生于20世紀60年代,但是它與中世紀集資進行航海冒險活動相差無幾。創業是一個壓縮過程,不再是低強度工作四十年,而是極限強度工作四年。
文稿校對人員每十五分鐘被打斷一次,工作效率也不會有太大的損失,但是黑客每一個小時被打斷一次,就會大大影響效率。
目前存在的最大手工藝人群體就是程序猿。在程序猿眼中,財富就是他們通過一行一行代碼做出來的。當然程序猿之間創造財富的速率存在巨大的差異。我們這個世界,你向下沉淪或者向上奮進都取決于你自己。
公司存在的目的就是滿足人們的某種需要。真正重要的是做出人們需要的東西,而不是加入某個公司。
任何一個通過自身努力而致富的個人,在他們身上都有可測量性和可放大性。沒有危險,就幾乎沒有可放大性。高科技約等于可放大性。創業的成敗取決于最早加入公司的那十個人。
小團隊天生就適合解決技術難題。小團隊和正規軍在市場上較量,小團隊應該進入深山沼澤,這樣利于自由游擊,一旦進入大平原,就會被全殲。因此設置進入壁壘(vc),避免技術被復制就非常重要。一開始就選擇較難的那一個問題,此后的各種決策都選擇較難的那個選項。
用戶數量是判斷公司好壞的指標。不要過早優化,盡快拿出1.0版,然后根據用戶的反映而不是自己的猜測進行軟件優化。premature optimization。
廚師炒糊了一道菜,只會對一個顧客造成影響。軟件做錯了一件事,則對所有用戶造成影響。可放大性。
7:關注貧富分化
孩子們接觸到錢的方式不對,對他們產生了錯誤的財富觀念。他們以為財富是從父母的口袋里流出來的,而不是創造出來的。每個人因為技能不同,導致收入不同,這才是貧富分化的主要原因。
財富通過創造的形式被人們接受,而不是掠奪和貪污,發生在工業革命時代。
貧富分化并不一定就是壞事,關鍵是絕對的貧窮,還是相對的貧窮。相對的貧窮,那么富人在創造財富的過程中,也會提高貧窮的生活水平。
8:防止垃圾郵件的一種方法
貝葉斯過濾
9:設計者的品味
人類的思想就是沒有經過整理的無數雜念的混合。
好設計就是簡單的設計。美依賴于一些精心選擇的結構性元素,而非表面裝飾品的堆砌。當你被迫把東西做得很簡單時,你就被迫直接面對真正的問題。
好設計是用不過時的設計。如果解決方法是丑陋的,那就肯定還有更好的解決方式,只是還沒有發現而已。
好設計是解決主要問題的設計。物理學的主要難題一度是如何詮釋經典著作,后來逐漸變成對可觀測行為進行預測,這一轉變使得物理學發展迅速。
好設計是啟發性設計。軟件開發提供基本模塊,就像樂高積木一樣,隨心所欲的組合。
好設計有時是一種有趣的設計。幽默感是強壯的一種表現,始終保持幽默感代表你對厄運一笑了之。充滿自信的人就像燕子一樣,以一種居高臨下的姿態輕盈的看待周圍一切。
好設計是一種艱苦的設計。人們往往覺得野生動物非常優美,原因就是他們的生活非常艱苦,在外形上不可能有多余的部分。
好設計是看似容易的設計。練習的作用也許就是將刻意為之變成一種自覺,下意識行為。
好設計是一種對稱的設計。對稱分兩種:重復性對稱和遞歸性對稱。
好設計是模仿大自然的設計。
好設計是一種再設計。反復修改,或者推倒重做。
好設計是能夠復制的設計。把事情做對比原創更重要。
好設計常常是奇特的設計。唯一達到奇特的方式,就是追求做出最好的作品,然后再回頭來看。
好設計是成批出現的。推動人才成批涌現的最大因素就是讓有天賦的人聚在一起,共同解決某個難題。互相激勵比天賦更重要。
好設計是大膽的設計。只有在成為某個領域的專家之后,你才會聽到心里有一個細微的聲音在說,“這樣解決太糟糕了!一定有更好的選擇。”
10:編程語言解析
從機器語言到高級語言,再到開放源碼,人們集思廣益讓軟件更加得心應手,讓bug變得更少。而不同的語言之爭,以及對象與過程之爭,讓人們從底層走向了抽象層,走向了編程語言的文藝復興。
11:一百年后的編程語言
找到編程語言進化的主干。 一種語言的內核設計的越小,越干凈,它的生命力就越強。因為一種垃圾會產生更多的垃圾。語言只是一種書寫法,而程序則是一種養嚴格符合規則的描述,以書面形式記錄計算機應該如何解決問題。所以編程語言的進化更像數學符號的進化。
浪費程序猿的時間而不是浪費機器的時間才是真正的無效率。一百年后的程序猿最需要的編程語言就是可以讓你毫不費力寫出程序第一版的編程語言,盡管它可能運行的很慢。
如果你自己做不到,那就去當老師。
一百年后并行計算并不會流行,除了在個別領域。
面向對象編程,對于大公司的面條代碼非常有用。因為它可以讓軟件不斷積累發展壯大。
12:拒絕平庸
埃里克雷蒙德在《How to Become a Hacker》中提到:新手應該從python和java入門;高級一點就應該學習c和perl;對于要以黑客作為人生目標的人,那就學習lisp。
拉丁語無助于找工作,但是能訓練你的思維,更好地運用母語寫作。
選擇使用哪一種技術的時候,你不能考慮別人的想法,只能考慮什么樣的技術能最好地完成工作。
lisp沒有得到廣泛應用的原因,因為編程語言不僅僅是技術,也是一種習慣性思維,非常難于改變。
沒有macro,編程語言如何編程?lisp代碼由lisp數據對象構成。其他語言的源代碼一般由字符組成,字符串是主要數據類型之一。
通過招聘職位描述觀察競爭對手。
13:書呆子的復仇
當你按照java,perl,python,ruby這樣的順序觀察這些語言,你會發現排在越靠后的語言,越像lisp。
1958年麥卡錫提出了lisp。lisp本質上不是一種技術,而是數學。lisp和fortran是編程語言發展的兩個方向。前者基礎是數學,后者是硬件架構。
lisp九種新思想:
- 條件結構
- 函數也是數據類型
- 遞歸
- 變量的動態類型
- 垃圾回收機制
- 程序由表達式組成
- 符號類型
- 代碼使用符號和常量組成的樹形表示法
- 無論什么時候,整個語言都是可用的。
使用一種不常用的語言:可能無法與其他語言程序協同工作,可能找不到一些函數庫,可能不容易雇傭到程序猿。
業界最佳實踐:跟隨大多數的步伐。
模式就是人肉編譯器。
14:夢寐以求的編程語言
一種語言必須是某一個流行的計算機系統的腳本語言才會變得流行。c之于unix,fortran和cobol之于imb大型機,vb之于windows,lisp之于emacs,java和js之于瀏覽器。
只要是計算機能夠自己推斷出來的事情,都應該讓計算機自己去推斷。
優秀程序員會突破設計者提供給用戶的外部語義層,試著控制某些高級抽象語言的內部接口。
黑客語言總是稍微帶一點放縱不羈的個性,整潔而又混亂。整潔表現的是設計的很清楚,內核由為數不多的運算符構成,易于理解。混亂是可以按自己的方式自由使用。
未來的函數庫應該像語言的內核一樣精心設計,優秀的函數庫重要性將超過語言本身。
帕金森定律:工作總是到最后一刻才會完成。
人們真正注意到你的時候,不是第一眼看到你站在那里,而是發現過了這么久你居然還在那里。
你必須對解決問題的能力保持樂觀,對當前解法保持懷疑。
發展用戶就像是一種優化過程,明智的做法是放慢速度。
15:設計與研究
你干什么工作?我正在設計一種lisp語言的新方言。
c/lisp/smalltalk是設計者為了自己使用,java/cobol/ada則是為了給別人使用。
評價一種程序的優劣不能簡單滴看最后的程序是否表達地特別漂亮,而是看程序從無到有的那條完成路徑是否美麗。
軟件設計兩種思想:弱即是強,懂得放棄,及時拿出成品,聽取用戶意見。另一種萬福瑪麗亞,經過漫長的醞釀等待,爆炸式隆重登場。后者多半是自毀前程。
先做出原型,再逐步加工做出成品,這種方式有利于鼓舞士氣,因為它使得你隨時可以看到工作的成效。
畫作永遠沒有完工的一天,你只是不再畫下去而已。
自上而下編程:要求你把編程任務分解成一個個更小的單元。
自下而上編程:先開發最底下的層,然后用底層所定義的語言開發上一層。